Emit symbol type information for ELF/COFF targets
[oota-llvm.git] / lib / Target / X86 / X86InstrInfo.cpp
1 //===- X86InstrInfo.cpp - X86 Instruction Information -----------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains the X86 implementation of the TargetInstrInfo class.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "X86InstrInfo.h"
15 #include "X86.h"
16 #include "X86GenInstrInfo.inc"
17 #include "X86InstrBuilder.h"
18 #include "X86Subtarget.h"
19 #include "X86TargetMachine.h"
20 #include "llvm/CodeGen/MachineInstrBuilder.h"
21 #include "llvm/CodeGen/LiveVariables.h"
22 using namespace llvm;
23
24 X86InstrInfo::X86InstrInfo(X86TargetMachine &tm)
25   : TargetInstrInfo(X86Insts, sizeof(X86Insts)/sizeof(X86Insts[0])),
26     TM(tm), RI(tm, *this) {
27 }
28
29 /// getDWARF_LABELOpcode - Return the opcode of the target's DWARF_LABEL
30 /// instruction if it has one.  This is used by codegen passes that update
31 /// DWARF line number info as they modify the code.
32 unsigned X86InstrInfo::getDWARF_LABELOpcode() const {
33   return X86::DWARF_LABEL;
34 }
35
36
37 bool X86InstrInfo::isMoveInstr(const MachineInstr& MI,
38                                unsigned& sourceReg,
39                                unsigned& destReg) const {
40   MachineOpCode oc = MI.getOpcode();
41   if (oc == X86::MOV8rr || oc == X86::MOV16rr ||
42       oc == X86::MOV32rr || oc == X86::MOV64rr ||
43       oc == X86::MOV16to16_ || oc == X86::MOV32to32_ ||
44       oc == X86::FpMOV  || oc == X86::MOVSSrr || oc == X86::MOVSDrr ||
45       oc == X86::FsMOVAPSrr || oc == X86::FsMOVAPDrr ||
46       oc == X86::MOVAPSrr || oc == X86::MOVAPDrr ||
47       oc == X86::MOVSS2PSrr || oc == X86::MOVSD2PDrr ||
48       oc == X86::MOVPS2SSrr || oc == X86::MOVPD2SDrr) {
49       assert(MI.getNumOperands() == 2 &&
50              MI.getOperand(0).isRegister() &&
51              MI.getOperand(1).isRegister() &&
52              "invalid register-register move instruction");
53       sourceReg = MI.getOperand(1).getReg();
54       destReg = MI.getOperand(0).getReg();
55       return true;
56   }
57   return false;
58 }
59
60 unsigned X86InstrInfo::isLoadFromStackSlot(MachineInstr *MI, 
61                                            int &FrameIndex) const {
62   switch (MI->getOpcode()) {
63   default: break;
64   case X86::MOV8rm:
65   case X86::MOV16rm:
66   case X86::MOV16_rm:
67   case X86::MOV32rm:
68   case X86::MOV32_rm:
69   case X86::MOV64rm:
70   case X86::FpLD64m:
71   case X86::MOVSSrm:
72   case X86::MOVSDrm:
73   case X86::MOVAPSrm:
74   case X86::MOVAPDrm:
75     if (MI->getOperand(1).isFrameIndex() && MI->getOperand(2).isImmediate() &&
76         MI->getOperand(3).isRegister() && MI->getOperand(4).isImmediate() &&
77         MI->getOperand(2).getImmedValue() == 1 &&
78         MI->getOperand(3).getReg() == 0 &&
79         MI->getOperand(4).getImmedValue() == 0) {
80       FrameIndex = MI->getOperand(1).getFrameIndex();
81       return MI->getOperand(0).getReg();
82     }
83     break;
84   }
85   return 0;
86 }
87
88 unsigned X86InstrInfo::isStoreToStackSlot(MachineInstr *MI,
89                                           int &FrameIndex) const {
90   switch (MI->getOpcode()) {
91   default: break;
92   case X86::MOV8mr:
93   case X86::MOV16mr:
94   case X86::MOV16_mr:
95   case X86::MOV32mr:
96   case X86::MOV32_mr:
97   case X86::MOV64mr:
98   case X86::FpSTP64m:
99   case X86::MOVSSmr:
100   case X86::MOVSDmr:
101   case X86::MOVAPSmr:
102   case X86::MOVAPDmr:
103     if (MI->getOperand(0).isFrameIndex() && MI->getOperand(1).isImmediate() &&
104         MI->getOperand(2).isRegister() && MI->getOperand(3).isImmediate() &&
105         MI->getOperand(1).getImmedValue() == 1 &&
106         MI->getOperand(2).getReg() == 0 &&
107         MI->getOperand(3).getImmedValue() == 0) {
108       FrameIndex = MI->getOperand(0).getFrameIndex();
109       return MI->getOperand(4).getReg();
110     }
111     break;
112   }
113   return 0;
114 }
115
116
117 /// convertToThreeAddress - This method must be implemented by targets that
118 /// set the M_CONVERTIBLE_TO_3_ADDR flag.  When this flag is set, the target
119 /// may be able to convert a two-address instruction into a true
120 /// three-address instruction on demand.  This allows the X86 target (for
121 /// example) to convert ADD and SHL instructions into LEA instructions if they
122 /// would require register copies due to two-addressness.
123 ///
124 /// This method returns a null pointer if the transformation cannot be
125 /// performed, otherwise it returns the new instruction.
126 ///
127 MachineInstr *
128 X86InstrInfo::convertToThreeAddress(MachineFunction::iterator &MFI,
129                                     MachineBasicBlock::iterator &MBBI,
130                                     LiveVariables &LV) const {
131   MachineInstr *MI = MBBI;
132   // All instructions input are two-addr instructions.  Get the known operands.
133   unsigned Dest = MI->getOperand(0).getReg();
134   unsigned Src = MI->getOperand(1).getReg();
135
136   MachineInstr *NewMI = NULL;
137   // FIXME: 16-bit LEA's are really slow on Athlons, but not bad on P4's.  When
138   // we have subtarget support, enable the 16-bit LEA generation here.
139   bool DisableLEA16 = true;
140
141   switch (MI->getOpcode()) {
142   default: break;
143   case X86::SHUFPSrri: {
144     assert(MI->getNumOperands() == 4 && "Unknown shufps instruction!");
145     const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>();
146     unsigned A = MI->getOperand(0).getReg();
147     unsigned B = MI->getOperand(1).getReg();
148     unsigned C = MI->getOperand(2).getReg();
149     unsigned M = MI->getOperand(3).getImmedValue();
150     if (!Subtarget->hasSSE2() || B != C) return 0;
151     NewMI = BuildMI(get(X86::PSHUFDri), A).addReg(B).addImm(M);
152     goto Done;
153   }
154   }
155
156   // FIXME: None of these instructions are promotable to LEAs without
157   // additional information.  In particular, LEA doesn't set the flags that
158   // add and inc do.  :(
159   return 0;
160
161   switch (MI->getOpcode()) {
162   case X86::INC32r:
163   case X86::INC64_32r:
164     assert(MI->getNumOperands() == 2 && "Unknown inc instruction!");
165     NewMI = addRegOffset(BuildMI(get(X86::LEA32r), Dest), Src, 1);
166     break;
167   case X86::INC16r:
168   case X86::INC64_16r:
169     if (DisableLEA16) return 0;
170     assert(MI->getNumOperands() == 2 && "Unknown inc instruction!");
171     NewMI = addRegOffset(BuildMI(get(X86::LEA16r), Dest), Src, 1);
172     break;
173   case X86::DEC32r:
174   case X86::DEC64_32r:
175     assert(MI->getNumOperands() == 2 && "Unknown dec instruction!");
176     NewMI = addRegOffset(BuildMI(get(X86::LEA32r), Dest), Src, -1);
177     break;
178   case X86::DEC16r:
179   case X86::DEC64_16r:
180     if (DisableLEA16) return 0;
181     assert(MI->getNumOperands() == 2 && "Unknown dec instruction!");
182     NewMI = addRegOffset(BuildMI(get(X86::LEA16r), Dest), Src, -1);
183     break;
184   case X86::ADD32rr:
185     assert(MI->getNumOperands() == 3 && "Unknown add instruction!");
186     NewMI = addRegReg(BuildMI(get(X86::LEA32r), Dest), Src,
187                      MI->getOperand(2).getReg());
188     break;
189   case X86::ADD16rr:
190     if (DisableLEA16) return 0;
191     assert(MI->getNumOperands() == 3 && "Unknown add instruction!");
192     NewMI = addRegReg(BuildMI(get(X86::LEA16r), Dest), Src,
193                      MI->getOperand(2).getReg());
194     break;
195   case X86::ADD32ri:
196   case X86::ADD32ri8:
197     assert(MI->getNumOperands() == 3 && "Unknown add instruction!");
198     if (MI->getOperand(2).isImmediate())
199       NewMI = addRegOffset(BuildMI(get(X86::LEA32r), Dest), Src,
200                           MI->getOperand(2).getImmedValue());
201     break;
202   case X86::ADD16ri:
203   case X86::ADD16ri8:
204     if (DisableLEA16) return 0;
205     assert(MI->getNumOperands() == 3 && "Unknown add instruction!");
206     if (MI->getOperand(2).isImmediate())
207       NewMI = addRegOffset(BuildMI(get(X86::LEA16r), Dest), Src,
208                           MI->getOperand(2).getImmedValue());
209     break;
210   case X86::SHL16ri:
211     if (DisableLEA16) return 0;
212   case X86::SHL32ri:
213     assert(MI->getNumOperands() == 3 && MI->getOperand(2).isImmediate() &&
214            "Unknown shl instruction!");
215     unsigned ShAmt = MI->getOperand(2).getImmedValue();
216     if (ShAmt == 1 || ShAmt == 2 || ShAmt == 3) {
217       X86AddressMode AM;
218       AM.Scale = 1 << ShAmt;
219       AM.IndexReg = Src;
220       unsigned Opc = MI->getOpcode() == X86::SHL32ri ? X86::LEA32r :X86::LEA16r;
221       NewMI = addFullAddress(BuildMI(get(Opc), Dest), AM);
222     }
223     break;
224   }
225
226 Done:
227   if (NewMI) {
228     NewMI->copyKillDeadInfo(MI);
229     LV.instructionChanged(MI, NewMI);  // Update live variables
230     MFI->insert(MBBI, NewMI);          // Insert the new inst    
231   }
232   return NewMI;
233 }
234
235 /// commuteInstruction - We have a few instructions that must be hacked on to
236 /// commute them.
237 ///
238 MachineInstr *X86InstrInfo::commuteInstruction(MachineInstr *MI) const {
239   // FIXME: Can commute cmoves by changing the condition!
240   switch (MI->getOpcode()) {
241   case X86::SHRD16rri8: // A = SHRD16rri8 B, C, I -> A = SHLD16rri8 C, B, (16-I)
242   case X86::SHLD16rri8: // A = SHLD16rri8 B, C, I -> A = SHRD16rri8 C, B, (16-I)
243   case X86::SHRD32rri8: // A = SHRD32rri8 B, C, I -> A = SHLD32rri8 C, B, (32-I)
244   case X86::SHLD32rri8:{// A = SHLD32rri8 B, C, I -> A = SHRD32rri8 C, B, (32-I)
245     unsigned Opc;
246     unsigned Size;
247     switch (MI->getOpcode()) {
248     default: assert(0 && "Unreachable!");
249     case X86::SHRD16rri8: Size = 16; Opc = X86::SHLD16rri8; break;
250     case X86::SHLD16rri8: Size = 16; Opc = X86::SHRD16rri8; break;
251     case X86::SHRD32rri8: Size = 32; Opc = X86::SHLD32rri8; break;
252     case X86::SHLD32rri8: Size = 32; Opc = X86::SHRD32rri8; break;
253     }
254     unsigned Amt = MI->getOperand(3).getImmedValue();
255     unsigned A = MI->getOperand(0).getReg();
256     unsigned B = MI->getOperand(1).getReg();
257     unsigned C = MI->getOperand(2).getReg();
258     bool BisKill = MI->getOperand(1).isKill();
259     bool CisKill = MI->getOperand(2).isKill();
260     return BuildMI(get(Opc), A).addReg(C, false, false, CisKill)
261       .addReg(B, false, false, BisKill).addImm(Size-Amt);
262   }
263   default:
264     return TargetInstrInfo::commuteInstruction(MI);
265   }
266 }
267
268 static X86::CondCode GetCondFromBranchOpc(unsigned BrOpc) {
269   switch (BrOpc) {
270   default: return X86::COND_INVALID;
271   case X86::JE:  return X86::COND_E;
272   case X86::JNE: return X86::COND_NE;
273   case X86::JL:  return X86::COND_L;
274   case X86::JLE: return X86::COND_LE;
275   case X86::JG:  return X86::COND_G;
276   case X86::JGE: return X86::COND_GE;
277   case X86::JB:  return X86::COND_B;
278   case X86::JBE: return X86::COND_BE;
279   case X86::JA:  return X86::COND_A;
280   case X86::JAE: return X86::COND_AE;
281   case X86::JS:  return X86::COND_S;
282   case X86::JNS: return X86::COND_NS;
283   case X86::JP:  return X86::COND_P;
284   case X86::JNP: return X86::COND_NP;
285   case X86::JO:  return X86::COND_O;
286   case X86::JNO: return X86::COND_NO;
287   }
288 }
289
290 unsigned X86::GetCondBranchFromCond(X86::CondCode CC) {
291   switch (CC) {
292   default: assert(0 && "Illegal condition code!");
293   case X86::COND_E:  return X86::JE;
294   case X86::COND_NE: return X86::JNE;
295   case X86::COND_L:  return X86::JL;
296   case X86::COND_LE: return X86::JLE;
297   case X86::COND_G:  return X86::JG;
298   case X86::COND_GE: return X86::JGE;
299   case X86::COND_B:  return X86::JB;
300   case X86::COND_BE: return X86::JBE;
301   case X86::COND_A:  return X86::JA;
302   case X86::COND_AE: return X86::JAE;
303   case X86::COND_S:  return X86::JS;
304   case X86::COND_NS: return X86::JNS;
305   case X86::COND_P:  return X86::JP;
306   case X86::COND_NP: return X86::JNP;
307   case X86::COND_O:  return X86::JO;
308   case X86::COND_NO: return X86::JNO;
309   }
310 }
311
312 /// GetOppositeBranchCondition - Return the inverse of the specified condition,
313 /// e.g. turning COND_E to COND_NE.
314 X86::CondCode X86::GetOppositeBranchCondition(X86::CondCode CC) {
315   switch (CC) {
316   default: assert(0 && "Illegal condition code!");
317   case X86::COND_E:  return X86::COND_NE;
318   case X86::COND_NE: return X86::COND_E;
319   case X86::COND_L:  return X86::COND_GE;
320   case X86::COND_LE: return X86::COND_G;
321   case X86::COND_G:  return X86::COND_LE;
322   case X86::COND_GE: return X86::COND_L;
323   case X86::COND_B:  return X86::COND_AE;
324   case X86::COND_BE: return X86::COND_A;
325   case X86::COND_A:  return X86::COND_BE;
326   case X86::COND_AE: return X86::COND_B;
327   case X86::COND_S:  return X86::COND_NS;
328   case X86::COND_NS: return X86::COND_S;
329   case X86::COND_P:  return X86::COND_NP;
330   case X86::COND_NP: return X86::COND_P;
331   case X86::COND_O:  return X86::COND_NO;
332   case X86::COND_NO: return X86::COND_O;
333   }
334 }
335
336
337 bool X86InstrInfo::AnalyzeBranch(MachineBasicBlock &MBB, 
338                                  MachineBasicBlock *&TBB,
339                                  MachineBasicBlock *&FBB,
340                                  std::vector<MachineOperand> &Cond) const {
341   // TODO: If FP_REG_KILL is around, ignore it.
342                                    
343   // If the block has no terminators, it just falls into the block after it.
344   MachineBasicBlock::iterator I = MBB.end();
345   if (I == MBB.begin() || !isTerminatorInstr((--I)->getOpcode()))
346     return false;
347
348   // Get the last instruction in the block.
349   MachineInstr *LastInst = I;
350   
351   // If there is only one terminator instruction, process it.
352   if (I == MBB.begin() || !isTerminatorInstr((--I)->getOpcode())) {
353     if (!isBranch(LastInst->getOpcode()))
354       return true;
355     
356     // If the block ends with a branch there are 3 possibilities:
357     // it's an unconditional, conditional, or indirect branch.
358     
359     if (LastInst->getOpcode() == X86::JMP) {
360       TBB = LastInst->getOperand(0).getMachineBasicBlock();
361       return false;
362     }
363     X86::CondCode BranchCode = GetCondFromBranchOpc(LastInst->getOpcode());
364     if (BranchCode == X86::COND_INVALID)
365       return true;  // Can't handle indirect branch.
366
367     // Otherwise, block ends with fall-through condbranch.
368     TBB = LastInst->getOperand(0).getMachineBasicBlock();
369     Cond.push_back(MachineOperand::CreateImm(BranchCode));
370     return false;
371   }
372   
373   // Get the instruction before it if it's a terminator.
374   MachineInstr *SecondLastInst = I;
375   
376   // If there are three terminators, we don't know what sort of block this is.
377   if (SecondLastInst && I != MBB.begin() &&
378       isTerminatorInstr((--I)->getOpcode()))
379     return true;
380
381   // If the block ends with X86::JMP and a conditional branch, handle it.
382   X86::CondCode BranchCode = GetCondFromBranchOpc(SecondLastInst->getOpcode());
383   if (BranchCode != X86::COND_INVALID && LastInst->getOpcode() == X86::JMP) {
384     TBB = SecondLastInst->getOperand(0).getMachineBasicBlock();
385     Cond.push_back(MachineOperand::CreateImm(BranchCode));
386     FBB = LastInst->getOperand(0).getMachineBasicBlock();
387     return false;
388   }
389
390   // Otherwise, can't handle this.
391   return true;
392 }
393
394 void X86InstrInfo::RemoveBranch(MachineBasicBlock &MBB) const {
395   MachineBasicBlock::iterator I = MBB.end();
396   if (I == MBB.begin()) return;
397   --I;
398   if (I->getOpcode() != X86::JMP && 
399       GetCondFromBranchOpc(I->getOpcode()) == X86::COND_INVALID)
400     return;
401   
402   // Remove the branch.
403   I->eraseFromParent();
404   
405   I = MBB.end();
406   
407   if (I == MBB.begin()) return;
408   --I;
409   if (GetCondFromBranchOpc(I->getOpcode()) == X86::COND_INVALID)
410     return;
411   
412   // Remove the branch.
413   I->eraseFromParent();
414 }
415
416 void X86InstrInfo::InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
417                                 MachineBasicBlock *FBB,
418                                 const std::vector<MachineOperand> &Cond) const {
419   // Shouldn't be a fall through.
420   assert(TBB && "InsertBranch must not be told to insert a fallthrough");
421   assert((Cond.size() == 1 || Cond.size() == 0) &&
422          "X86 branch conditions have one component!");
423
424   if (FBB == 0) { // One way branch.
425     if (Cond.empty()) {
426       // Unconditional branch?
427       BuildMI(&MBB, get(X86::JMP)).addMBB(TBB);
428     } else {
429       // Conditional branch.
430       unsigned Opc = GetCondBranchFromCond((X86::CondCode)Cond[0].getImm());
431       BuildMI(&MBB, get(Opc)).addMBB(TBB);
432     }
433     return;
434   }
435   
436   // Two-way Conditional branch.
437   unsigned Opc = GetCondBranchFromCond((X86::CondCode)Cond[0].getImm());
438   BuildMI(&MBB, get(Opc)).addMBB(TBB);
439   BuildMI(&MBB, get(X86::JMP)).addMBB(FBB);
440 }
441
442 bool X86InstrInfo::BlockHasNoFallThrough(MachineBasicBlock &MBB) const {
443   if (MBB.empty()) return false;
444   
445   switch (MBB.back().getOpcode()) {
446   case X86::JMP:     // Uncond branch.
447   case X86::JMP32r:  // Indirect branch.
448   case X86::JMP32m:  // Indirect branch through mem.
449     return true;
450   default: return false;
451   }
452 }
453
454 bool X86InstrInfo::
455 ReverseBranchCondition(std::vector<MachineOperand> &Cond) const {
456   assert(Cond.size() == 1 && "Invalid X86 branch condition!");
457   Cond[0].setImm(GetOppositeBranchCondition((X86::CondCode)Cond[0].getImm()));
458   return false;
459 }
460
461 const TargetRegisterClass *X86InstrInfo::getPointerRegClass() const {
462   const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>();
463   if (Subtarget->is64Bit())
464     return &X86::GR64RegClass;
465   else
466     return &X86::GR32RegClass;
467 }