Don't #include <Support/*>, #include "Support/*"
[oota-llvm.git] / include / llvm / CodeGen / MachineInstr.h
1 //===-- llvm/CodeGen/MachineInstr.h - MachineInstr class ---------*- C++ -*--=//
2 //
3 // This file contains the declaration of the MachineInstr class, which is the
4 // basic representation for all target dependant machine instructions used by
5 // the back end.
6 //
7 //===----------------------------------------------------------------------===//
8
9 #ifndef LLVM_CODEGEN_MACHINEINSTR_H
10 #define LLVM_CODEGEN_MACHINEINSTR_H
11
12 #include "llvm/Target/MachineInstrInfo.h"
13 #include "llvm/Annotation.h"
14 #include "Support/iterator"
15 class Instruction;
16
17 //---------------------------------------------------------------------------
18 // class MachineOperand 
19 // 
20 // Purpose:
21 //   Representation of each machine instruction operand.
22 //   This class is designed so that you can allocate a vector of operands
23 //   first and initialize each one later.
24 //
25 //   E.g, for this VM instruction:
26 //              ptr = alloca type, numElements
27 //   we generate 2 machine instructions on the SPARC:
28 // 
29 //              mul Constant, Numelements -> Reg
30 //              add %sp, Reg -> Ptr
31 // 
32 //   Each instruction has 3 operands, listed above.  Of those:
33 //   -  Reg, NumElements, and Ptr are of operand type MO_Register.
34 //   -  Constant is of operand type MO_SignExtendedImmed on the SPARC.
35 //      
36 //   For the register operands, the virtual register type is as follows:
37 //      
38 //   -  Reg will be of virtual register type MO_MInstrVirtualReg.  The field
39 //      MachineInstr* minstr will point to the instruction that computes reg.
40 // 
41 //   -  %sp will be of virtual register type MO_MachineReg.
42 //      The field regNum identifies the machine register.
43 // 
44 //   -  NumElements will be of virtual register type MO_VirtualReg.
45 //      The field Value* value identifies the value.
46 // 
47 //   -  Ptr will also be of virtual register type MO_VirtualReg.
48 //      Again, the field Value* value identifies the value.
49 // 
50 //---------------------------------------------------------------------------
51
52
53 class MachineOperand {
54 public:
55   enum MachineOperandType {
56     MO_VirtualRegister,         // virtual register for *value
57     MO_MachineRegister,         // pre-assigned machine register `regNum'
58     MO_CCRegister,
59     MO_SignExtendedImmed,
60     MO_UnextendedImmed,
61     MO_PCRelativeDisp,
62   };
63   
64 private:
65   // Bit fields of the flags variable used for different operand properties
66   static const char DEFFLAG    = 0x1;  // this is a def of the operand
67   static const char DEFUSEFLAG = 0x2;  // this is both a def and a use
68   static const char HIFLAG32   = 0x4;  // operand is %hi32(value_or_immedVal)
69   static const char LOFLAG32   = 0x8;  // operand is %lo32(value_or_immedVal)
70   static const char HIFLAG64   = 0x10; // operand is %hi64(value_or_immedVal)
71   static const char LOFLAG64   = 0x20; // operand is %lo64(value_or_immedVal)
72   
73 private:
74   union {
75     Value*      value;          // BasicBlockVal for a label operand.
76                                 // ConstantVal for a non-address immediate.
77                                 // Virtual register for an SSA operand,
78                                 // including hidden operands required for
79                                 // the generated machine code.     
80     int64_t immedVal;           // constant value for an explicit constant
81   };
82
83   MachineOperandType opType:8;  // Pack into 8 bits efficiently after flags.
84   char flags;                   // see bit field definitions above
85   int regNum;                   // register number for an explicit register
86                                 // will be set for a value after reg allocation
87 public:
88   /*ctor*/              MachineOperand  ();
89   /*ctor*/              MachineOperand  (MachineOperandType operandType,
90                                          Value* _val);
91   /*copy ctor*/         MachineOperand  (const MachineOperand&);
92   /*dtor*/              ~MachineOperand () {}
93   
94   // Accessor methods.  Caller is responsible for checking the
95   // operand type before invoking the corresponding accessor.
96   // 
97   inline MachineOperandType getOperandType() const {
98     return opType;
99   }
100   inline Value*         getVRegValue    () const {
101     assert(opType == MO_VirtualRegister || opType == MO_CCRegister || 
102            opType == MO_PCRelativeDisp);
103     return value;
104   }
105   inline Value*         getVRegValueOrNull() const {
106     return (opType == MO_VirtualRegister || opType == MO_CCRegister || 
107             opType == MO_PCRelativeDisp)? value : NULL;
108   }
109   inline int            getMachineRegNum() const {
110     assert(opType == MO_MachineRegister);
111     return regNum;
112   }
113   inline int64_t        getImmedValue   () const {
114     assert(opType == MO_SignExtendedImmed || opType == MO_UnextendedImmed);
115     return immedVal;
116   }
117   inline bool           opIsDef         () const {
118     return flags & DEFFLAG;
119   }
120   inline bool           opIsDefAndUse   () const {
121     return flags & DEFUSEFLAG;
122   }
123   inline bool           opHiBits32      () const {
124     return flags & HIFLAG32;
125   }
126   inline bool           opLoBits32      () const {
127     return flags & LOFLAG32;
128   }
129   inline bool           opHiBits64      () const {
130     return flags & HIFLAG64;
131   }
132   inline bool           opLoBits64      () const {
133     return flags & LOFLAG64;
134   }
135
136   // used to check if a machine register has been allocated to this operand
137   inline bool   hasAllocatedReg() const {
138     return (regNum >= 0 &&
139             (opType == MO_VirtualRegister || opType == MO_CCRegister || 
140              opType == MO_MachineRegister));
141   }
142
143   // used to get the reg number if when one is allocated
144   inline int  getAllocatedRegNum() const {
145     assert(opType == MO_VirtualRegister || opType == MO_CCRegister || 
146            opType == MO_MachineRegister);
147     return regNum;
148   }
149
150   
151 public:
152   friend std::ostream& operator<<(std::ostream& os, const MachineOperand& mop);
153
154 private:
155   // These functions are provided so that a vector of operands can be
156   // statically allocated and individual ones can be initialized later.
157   // Give class MachineInstr access to these functions.
158   // 
159   void                  Initialize      (MachineOperandType operandType,
160                                          Value* _val);
161   void                  InitializeConst (MachineOperandType operandType,
162                                          int64_t intValue);
163   void                  InitializeReg   (int regNum,
164                                          bool isCCReg);
165
166   // Construction methods needed for fine-grain control.
167   // These must be accessed via coresponding methods in MachineInstr.
168   void markDef()       { flags |= DEFFLAG; }
169   void markDefAndUse() { flags |= DEFUSEFLAG; }
170   void markHi32()      { flags |= HIFLAG32; }
171   void markLo32()      { flags |= LOFLAG32; }
172   void markHi64()      { flags |= HIFLAG64; }
173   void markLo64()      { flags |= LOFLAG64; }
174   
175   // Replaces the Value with its corresponding physical register after
176   // register allocation is complete
177   void setRegForValue(int reg) {
178     assert(opType == MO_VirtualRegister || opType == MO_CCRegister || 
179            opType == MO_MachineRegister);
180     regNum = reg;
181   }
182   
183   friend class MachineInstr;
184 };
185
186
187 inline
188 MachineOperand::MachineOperand()
189   : immedVal(0), opType(MO_VirtualRegister), flags(0), regNum(-1)
190 {}
191
192 inline
193 MachineOperand::MachineOperand(MachineOperandType operandType,
194                                Value* _val)
195   : immedVal(0), opType(operandType), flags(0), regNum(-1)
196 {}
197
198 inline
199 MachineOperand::MachineOperand(const MachineOperand& mo)
200   : opType(mo.opType), flags(mo.flags)
201 {
202   switch(opType) {
203   case MO_VirtualRegister:
204   case MO_CCRegister:           value = mo.value; break;
205   case MO_MachineRegister:      regNum = mo.regNum; break;
206   case MO_SignExtendedImmed:
207   case MO_UnextendedImmed:
208   case MO_PCRelativeDisp:       immedVal = mo.immedVal; break;
209   default: assert(0);
210   }
211 }
212
213 inline void
214 MachineOperand::Initialize(MachineOperandType operandType,
215                            Value* _val)
216 {
217   opType = operandType;
218   value = _val;
219   regNum = -1;
220   flags = 0;
221 }
222
223 inline void
224 MachineOperand::InitializeConst(MachineOperandType operandType,
225                                 int64_t intValue)
226 {
227   opType = operandType;
228   value = NULL;
229   immedVal = intValue;
230   regNum = -1;
231   flags = 0;
232 }
233
234 inline void
235 MachineOperand::InitializeReg(int _regNum, bool isCCReg)
236 {
237   opType = isCCReg? MO_CCRegister : MO_MachineRegister;
238   value = NULL;
239   regNum = (int) _regNum;
240   flags = 0;
241 }
242
243
244 //---------------------------------------------------------------------------
245 // class MachineInstr 
246 // 
247 // Purpose:
248 //   Representation of each machine instruction.
249 // 
250 //   MachineOpCode must be an enum, defined separately for each target.
251 //   E.g., It is defined in SparcInstructionSelection.h for the SPARC.
252 // 
253 //   opCodeMask is used to record variants of an instruction.
254 //   E.g., each branch instruction on SPARC has 2 flags (i.e., 4 variants):
255 //      ANNUL:             if 1: Annul delay slot instruction.
256 //      PREDICT-NOT-TAKEN: if 1: predict branch not taken.
257 //   Instead of creating 4 different opcodes for BNZ, we create a single
258 //   opcode and set bits in opCodeMask for each of these flags.
259 //
260 //  There are 2 kinds of operands:
261 // 
262 //  (1) Explicit operands of the machine instruction in vector operands[] 
263 // 
264 //  (2) "Implicit operands" are values implicitly used or defined by the
265 //      machine instruction, such as arguments to a CALL, return value of
266 //      a CALL (if any), and return value of a RETURN.
267 //---------------------------------------------------------------------------
268
269 class MachineInstr : public Annotable,         // MachineInstrs are annotable
270                      public NonCopyable {      // Disable copy operations
271   MachineOpCode    opCode;              // the opcode
272   OpCodeMask       opCodeMask;          // extra bits for variants of an opcode
273   std::vector<MachineOperand> operands; // the operands
274
275   struct ImplicitRef {
276     Value *Val;
277     bool isDef, isDefAndUse;
278
279     ImplicitRef(Value *V, bool D, bool DU) : Val(V), isDef(D), isDefAndUse(DU){}
280   };
281
282   // implicitRefs - Values implicitly referenced by this machine instruction
283   // (eg, call args)
284   std::vector<ImplicitRef> implicitRefs;
285
286   // regsUsed - all machine registers used for this instruction, including regs
287   // used to save values across the instruction.  This is a bitset of registers.
288   std::vector<bool> regsUsed;
289 public:
290   /*ctor*/              MachineInstr    (MachineOpCode _opCode,
291                                          OpCodeMask    _opCodeMask = 0x0);
292   /*ctor*/              MachineInstr    (MachineOpCode _opCode,
293                                          unsigned       numOperands,
294                                          OpCodeMask    _opCodeMask = 0x0);
295   inline                ~MachineInstr   () {}
296
297   // 
298   // Support to rewrite a machine instruction in place: for now, simply
299   // replace() and then set new operands with Set.*Operand methods below.
300   // 
301   void                  replace         (MachineOpCode _opCode,
302                                          unsigned       numOperands,
303                                          OpCodeMask    _opCodeMask = 0x0);
304   
305   //
306   // The op code.  Note that MachineOpCode is a target-specific type.
307   // 
308   const MachineOpCode   getOpCode       () const { return opCode; }
309
310   //
311   // Information about explicit operands of the instruction
312   // 
313   unsigned int          getNumOperands  () const { return operands.size(); }
314   
315   bool                  operandIsDefined(unsigned i) const;
316   bool                  operandIsDefinedAndUsed(unsigned i) const;
317   
318   const MachineOperand& getOperand      (unsigned i) const;
319         MachineOperand& getOperand      (unsigned i);
320   
321   //
322   // Information about implicit operands of the instruction
323   // 
324   unsigned              getNumImplicitRefs() const{ return implicitRefs.size();}
325   
326   bool                  implicitRefIsDefined(unsigned i) const;
327   bool                  implicitRefIsDefinedAndUsed(unsigned i) const;
328   
329   const Value*          getImplicitRef  (unsigned i) const;
330         Value*          getImplicitRef  (unsigned i);
331   
332   //
333   // Information about registers used in this instruction
334   // 
335   const std::vector<bool> &getRegsUsed    () const { return regsUsed; }
336   
337   // insertUsedReg - Add a register to the Used registers set...
338   void insertUsedReg(unsigned Reg) {
339     if (Reg >= regsUsed.size())
340       regsUsed.resize(Reg+1);
341     regsUsed[Reg] = true;
342   }
343
344   //
345   // Debugging support
346   // 
347   void                  dump            () const;
348   friend std::ostream& operator<<       (std::ostream& os,
349                                          const MachineInstr& minstr);
350
351   //
352   // Define iterators to access the Value operands of the Machine Instruction.
353   // begin() and end() are defined to produce these iterators...
354   //
355   template<class _MI, class _V> class ValOpIterator;
356   typedef ValOpIterator<const MachineInstr*,const Value*> const_val_op_iterator;
357   typedef ValOpIterator<      MachineInstr*,      Value*> val_op_iterator;
358
359
360   // Access to set the operands when building the machine instruction
361   // 
362   void                  SetMachineOperandVal(unsigned i,
363                                              MachineOperand::MachineOperandType
364                                                operandType,
365                                              Value* _val,
366                                              bool isDef=false,
367                                              bool isDefAndUse=false);
368   void                  SetMachineOperandConst(unsigned i,
369                                            MachineOperand::MachineOperandType
370                                                  operandType,
371                                                int64_t intValue);
372   void                  SetMachineOperandReg(unsigned i, int regNum, 
373                                              bool isDef=false,
374                                              bool isDefAndUse=false,
375                                              bool isCCReg=false);
376   
377   void                  addImplicitRef   (Value* val, 
378                                           bool isDef=false,
379                                           bool isDefAndUse=false);
380   
381   void                  setImplicitRef   (unsigned i,
382                                           Value* val, 
383                                           bool isDef=false,
384                                           bool isDefAndUse=false);
385
386   unsigned              substituteValue  (const Value* oldVal,
387                                           Value* newVal,
388                                           bool defsOnly = true);
389
390   void                  setOperandHi32   (unsigned i);
391   void                  setOperandLo32   (unsigned i);
392   void                  setOperandHi64   (unsigned i);
393   void                  setOperandLo64   (unsigned i);
394   
395   
396   // Replaces the Value for the operand with its allocated
397   // physical register after register allocation is complete.
398   // 
399   void                  SetRegForOperand(unsigned i, int regNum);
400   
401   //
402   // Iterator to enumerate machine operands.
403   // 
404   template<class MITy, class VTy>
405   class ValOpIterator : public forward_iterator<VTy, ptrdiff_t> {
406     unsigned i;
407     MITy MI;
408     
409     inline void skipToNextVal() {
410       while (i < MI->getNumOperands() &&
411              !((MI->getOperand(i).getOperandType() == MachineOperand::MO_VirtualRegister ||
412                 MI->getOperand(i).getOperandType() == MachineOperand::MO_CCRegister)
413                && MI->getOperand(i).getVRegValue() != 0))
414         ++i;
415     }
416   
417     inline ValOpIterator(MITy mi, unsigned I) : i(I), MI(mi) {
418       skipToNextVal();
419     }
420   
421   public:
422     typedef ValOpIterator<MITy, VTy> _Self;
423     
424     inline VTy operator*() const {
425       return MI->getOperand(i).getVRegValue();
426     }
427
428     const MachineOperand &getMachineOperand() const { return MI->getOperand(i);}
429           MachineOperand &getMachineOperand()       { return MI->getOperand(i);}
430
431     inline VTy operator->() const { return operator*(); }
432
433     inline bool isDef()       const { return MI->getOperand(i).opIsDef(); } 
434     inline bool isDefAndUse() const { return MI->getOperand(i).opIsDefAndUse();}
435
436     inline _Self& operator++() { i++; skipToNextVal(); return *this; }
437     inline _Self  operator++(int) { _Self tmp = *this; ++*this; return tmp; }
438
439     inline bool operator==(const _Self &y) const { 
440       return i == y.i;
441     }
442     inline bool operator!=(const _Self &y) const { 
443       return !operator==(y);
444     }
445
446     static _Self begin(MITy MI) {
447       return _Self(MI, 0);
448     }
449     static _Self end(MITy MI) {
450       return _Self(MI, MI->getNumOperands());
451     }
452   };
453
454   // define begin() and end()
455   val_op_iterator begin() { return val_op_iterator::begin(this); }
456   val_op_iterator end()   { return val_op_iterator::end(this); }
457
458   const_val_op_iterator begin() const {
459     return const_val_op_iterator::begin(this);
460   }
461   const_val_op_iterator end() const {
462     return const_val_op_iterator::end(this);
463   }
464 };
465
466
467 inline MachineOperand&
468 MachineInstr::getOperand(unsigned int i)
469 {
470   assert(i < operands.size() && "getOperand() out of range!");
471   return operands[i];
472 }
473
474 inline const MachineOperand&
475 MachineInstr::getOperand(unsigned int i) const
476 {
477   assert(i < operands.size() && "getOperand() out of range!");
478   return operands[i];
479 }
480
481 inline bool
482 MachineInstr::operandIsDefined(unsigned int i) const
483 {
484   return getOperand(i).opIsDef();
485 }
486
487 inline bool
488 MachineInstr::operandIsDefinedAndUsed(unsigned int i) const
489 {
490   return getOperand(i).opIsDefAndUse();
491 }
492
493 inline bool
494 MachineInstr::implicitRefIsDefined(unsigned i) const
495 {
496   assert(i < implicitRefs.size() && "operand out of range!");
497   return implicitRefs[i].isDef;
498 }
499
500 inline bool
501 MachineInstr::implicitRefIsDefinedAndUsed(unsigned i) const
502 {
503   assert(i < implicitRefs.size() && "operand out of range!");
504   return implicitRefs[i].isDefAndUse;
505 }
506
507 inline const Value*
508 MachineInstr::getImplicitRef(unsigned i) const
509 {
510   assert(i < implicitRefs.size() && "getImplicitRef() out of range!");
511   return implicitRefs[i].Val;
512 }
513
514 inline Value*
515 MachineInstr::getImplicitRef(unsigned i)
516 {
517   assert(i < implicitRefs.size() && "getImplicitRef() out of range!");
518   return implicitRefs[i].Val;
519 }
520
521 inline void
522 MachineInstr::addImplicitRef(Value* val, 
523                              bool isDef,
524                              bool isDefAndUse) {
525   implicitRefs.push_back(ImplicitRef(val, isDef, isDefAndUse));
526 }
527
528 inline void
529 MachineInstr::setImplicitRef(unsigned int i,
530                              Value* val, 
531                              bool isDef,
532                              bool isDefAndUse)
533 {
534   assert(i < implicitRefs.size() && "setImplicitRef() out of range!");
535   implicitRefs[i].Val = val;
536   implicitRefs[i].isDef = isDef;
537   implicitRefs[i].isDefAndUse = isDefAndUse;
538 }
539
540 inline void
541 MachineInstr::setOperandHi32(unsigned i)
542 {
543   operands[i].markHi32();
544 }
545
546 inline void
547 MachineInstr::setOperandLo32(unsigned i)
548 {
549   operands[i].markLo32();
550 }
551
552 inline void
553 MachineInstr::setOperandHi64(unsigned i)
554 {
555   operands[i].markHi64();
556 }
557
558 inline void
559 MachineInstr::setOperandLo64(unsigned i)
560 {
561   operands[i].markLo64();
562 }
563
564
565 //---------------------------------------------------------------------------
566 // Debugging Support
567 //---------------------------------------------------------------------------
568
569 std::ostream& operator<<    (std::ostream& os, const MachineInstr& minstr);
570
571 std::ostream& operator<<    (std::ostream& os, const MachineOperand& mop);
572                                          
573 void    PrintMachineInstructions(const Function *F);
574
575 #endif