MachineInstr.h revision 133f079c8cf966d2222c2dda2de56d2cc600497e
1a730c864227b287cdfad5f5f3d5d0808c9f422bbChris Lattner//===-- llvm/CodeGen/MachineInstr.h - MachineInstr class ---------*- C++ -*--=//
2a730c864227b287cdfad5f5f3d5d0808c9f422bbChris Lattner//
3a730c864227b287cdfad5f5f3d5d0808c9f422bbChris Lattner// This file contains the declaration of the MachineInstr class, which is the
4a730c864227b287cdfad5f5f3d5d0808c9f422bbChris Lattner// basic representation for all target dependant machine instructions used by
5a730c864227b287cdfad5f5f3d5d0808c9f422bbChris Lattner// the back end.
6a730c864227b287cdfad5f5f3d5d0808c9f422bbChris Lattner//
7a730c864227b287cdfad5f5f3d5d0808c9f422bbChris Lattner//===----------------------------------------------------------------------===//
823ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve
923ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve#ifndef LLVM_CODEGEN_MACHINEINSTR_H
1023ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve#define LLVM_CODEGEN_MACHINEINSTR_H
1123ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve
128eb04905e84470a0baff867fa99b0de097f49a3bVikram S. Adve#include "llvm/Annotation.h"
134a63b72df95b5c0d4af064cef19377f811ba6060Chris Lattner#include "Support/iterator"
14054c1f6cb6f3a680fe4b8447880ed960fd7fe441Chris Lattner#include "Support/NonCopyable.h"
15054c1f6cb6f3a680fe4b8447880ed960fd7fe441Chris Lattner#include <vector>
16054c1f6cb6f3a680fe4b8447880ed960fd7fe441Chris Lattnerclass Value;
17054c1f6cb6f3a680fe4b8447880ed960fd7fe441Chris Lattnerclass Function;
18054c1f6cb6f3a680fe4b8447880ed960fd7fe441Chris Lattner
19054c1f6cb6f3a680fe4b8447880ed960fd7fe441Chris Lattnertypedef int MachineOpCode;
20054c1f6cb6f3a680fe4b8447880ed960fd7fe441Chris Lattnertypedef int OpCodeMask;
21054c1f6cb6f3a680fe4b8447880ed960fd7fe441Chris Lattnertypedef int InstrSchedClass;
226a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve
2323ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//---------------------------------------------------------------------------
2423ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// class MachineOperand
2523ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//
2623ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// Purpose:
2723ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//   Representation of each machine instruction operand.
2823ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//   This class is designed so that you can allocate a vector of operands
2923ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//   first and initialize each one later.
3023ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//
3123ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//   E.g, for this VM instruction:
3223ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//		ptr = alloca type, numElements
3323ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//   we generate 2 machine instructions on the SPARC:
3423ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//
3523ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//		mul Constant, Numelements -> Reg
3623ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//		add %sp, Reg -> Ptr
3723ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//
3823ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//   Each instruction has 3 operands, listed above.  Of those:
3923ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//   -	Reg, NumElements, and Ptr are of operand type MO_Register.
4023ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//   -	Constant is of operand type MO_SignExtendedImmed on the SPARC.
4123ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//
4223ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//   For the register operands, the virtual register type is as follows:
4323ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//
4423ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//   -  Reg will be of virtual register type MO_MInstrVirtualReg.  The field
4523ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//	MachineInstr* minstr will point to the instruction that computes reg.
4623ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//
4723ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//   -	%sp will be of virtual register type MO_MachineReg.
4823ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//	The field regNum identifies the machine register.
4923ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//
5023ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//   -	NumElements will be of virtual register type MO_VirtualReg.
5123ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//	The field Value* value identifies the value.
5223ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//
5323ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//   -	Ptr will also be of virtual register type MO_VirtualReg.
5423ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//	Again, the field Value* value identifies the value.
5523ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//
5623ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//---------------------------------------------------------------------------
5723ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve
581bf6d645cd8e167851660e841276dcc53be0e344Ruchira Sasanka
5923ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adveclass MachineOperand {
6023ee550765232e22d0daf6407141ecef4c55c06fVikram S. Advepublic:
6123ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve  enum MachineOperandType {
626a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve    MO_VirtualRegister,		// virtual register for *value
636a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve    MO_MachineRegister,		// pre-assigned machine register `regNum'
6423ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve    MO_CCRegister,
6523ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve    MO_SignExtendedImmed,
6623ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve    MO_UnextendedImmed,
6723ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve    MO_PCRelativeDisp,
6823ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve  };
6923ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve
706a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adveprivate:
7169cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve  // Bit fields of the flags variable used for different operand properties
7269cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve  static const char DEFFLAG    = 0x1;  // this is a def of the operand
7369cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve  static const char DEFUSEFLAG = 0x2;  // this is both a def and a use
7469cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve  static const char HIFLAG32   = 0x4;  // operand is %hi32(value_or_immedVal)
7569cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve  static const char LOFLAG32   = 0x8;  // operand is %lo32(value_or_immedVal)
7669cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve  static const char HIFLAG64   = 0x10; // operand is %hi64(value_or_immedVal)
7769cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve  static const char LOFLAG64   = 0x20; // operand is %lo64(value_or_immedVal)
7869cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve
7969cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adveprivate:
806a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve  union {
816a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve    Value*	value;		// BasicBlockVal for a label operand.
8223ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve				// ConstantVal for a non-address immediate.
836a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve				// Virtual register for an SSA operand,
846a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve				// including hidden operands required for
85427a5273113274ee35cff78534dba2ae812c79ceRuchira Sasanka				// the generated machine code.
866a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve    int64_t immedVal;		// constant value for an explicit constant
876a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve  };
88773fc471bdc36a221ff9302a07e58f8f7210d87dRuchira Sasanka
891a33e6eb7477ecc015f3aadbd47f1c1434003a66Chris Lattner  MachineOperandType opType:8;  // Pack into 8 bits efficiently after flags.
901a33e6eb7477ecc015f3aadbd47f1c1434003a66Chris Lattner  char flags;                   // see bit field definitions above
9121721b63c3b5a314dfa0be14823b10273860787cRuchira Sasanka  int regNum;	                // register number for an explicit register
92427a5273113274ee35cff78534dba2ae812c79ceRuchira Sasanka                                // will be set for a value after reg allocation
936a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Advepublic:
94572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  MachineOperand() : immedVal(0), opType(MO_VirtualRegister),
95572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner                     flags(0), regNum(-1) {}
96572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  MachineOperand(const MachineOperand &M)
97572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner    : immedVal(M.immedVal), opType(M.opType), flags(M.flags), regNum(M.regNum) {
98572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  }
99572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  ~MachineOperand() {}
10023ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve
1016a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve  // Accessor methods.  Caller is responsible for checking the
1026a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve  // operand type before invoking the corresponding accessor.
1036a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve  //
104133f079c8cf966d2222c2dda2de56d2cc600497eChris Lattner  MachineOperandType getType() const { return opType; }
105572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
10698f2f8053bebaad7683de074bfb74239364098d2Vikram S. Adve  inline Value*		getVRegValue	() const {
107746e0014a6c59f285ffefc30c722ef2cf69eb95dChris Lattner    assert(opType == MO_VirtualRegister || opType == MO_CCRegister ||
108746e0014a6c59f285ffefc30c722ef2cf69eb95dChris Lattner	   opType == MO_PCRelativeDisp);
1096a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve    return value;
1106a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve  }
111a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve  inline Value*		getVRegValueOrNull() const {
112a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve    return (opType == MO_VirtualRegister || opType == MO_CCRegister ||
113a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve            opType == MO_PCRelativeDisp)? value : NULL;
114a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve  }
115df1c3b8398d1df253ebd389ac1068ec732a2f28fVikram S. Adve  inline int            getMachineRegNum() const {
1166a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve    assert(opType == MO_MachineRegister);
117df1c3b8398d1df253ebd389ac1068ec732a2f28fVikram S. Adve    return regNum;
1186a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve  }
11998f2f8053bebaad7683de074bfb74239364098d2Vikram S. Adve  inline int64_t	getImmedValue	() const {
120dd52255e9a26fbc9b7e0cd22a2dd99b0b6bae991Vikram S. Adve    assert(opType == MO_SignExtendedImmed || opType == MO_UnextendedImmed);
1216a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve    return immedVal;
1226a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve  }
123572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  bool		opIsDef		() const { return flags & DEFFLAG; }
124572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  bool		opIsDefAndUse	() const { return flags & DEFUSEFLAG; }
125572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  bool          opHiBits32      () const { return flags & HIFLAG32; }
126572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  bool          opLoBits32      () const { return flags & LOFLAG32; }
127572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  bool          opHiBits64      () const { return flags & HIFLAG64; }
128572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  bool          opLoBits64      () const { return flags & LOFLAG64; }
129504fc5b7b5a9ffa9f82e95e7212015575030c7a7Vikram S. Adve
130504fc5b7b5a9ffa9f82e95e7212015575030c7a7Vikram S. Adve  // used to check if a machine register has been allocated to this operand
131504fc5b7b5a9ffa9f82e95e7212015575030c7a7Vikram S. Adve  inline bool   hasAllocatedReg() const {
132504fc5b7b5a9ffa9f82e95e7212015575030c7a7Vikram S. Adve    return (regNum >= 0 &&
133504fc5b7b5a9ffa9f82e95e7212015575030c7a7Vikram S. Adve            (opType == MO_VirtualRegister || opType == MO_CCRegister ||
134504fc5b7b5a9ffa9f82e95e7212015575030c7a7Vikram S. Adve             opType == MO_MachineRegister));
135504fc5b7b5a9ffa9f82e95e7212015575030c7a7Vikram S. Adve  }
136504fc5b7b5a9ffa9f82e95e7212015575030c7a7Vikram S. Adve
137504fc5b7b5a9ffa9f82e95e7212015575030c7a7Vikram S. Adve  // used to get the reg number if when one is allocated
13869cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve  inline int  getAllocatedRegNum() const {
13969cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve    assert(opType == MO_VirtualRegister || opType == MO_CCRegister ||
14069cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve	   opType == MO_MachineRegister);
14169cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve    return regNum;
1427a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  }
143504fc5b7b5a9ffa9f82e95e7212015575030c7a7Vikram S. Adve
1446a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve
145697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner  friend std::ostream& operator<<(std::ostream& os, const MachineOperand& mop);
14698f2f8053bebaad7683de074bfb74239364098d2Vikram S. Adve
1476a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adveprivate:
1486a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve
14969cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve  // Construction methods needed for fine-grain control.
15069cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve  // These must be accessed via coresponding methods in MachineInstr.
15169cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve  void markDef()       { flags |= DEFFLAG; }
15269cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve  void markDefAndUse() { flags |= DEFUSEFLAG; }
15369cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve  void markHi32()      { flags |= HIFLAG32; }
15469cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve  void markLo32()      { flags |= LOFLAG32; }
15569cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve  void markHi64()      { flags |= HIFLAG64; }
15669cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve  void markLo64()      { flags |= LOFLAG64; }
15769cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve
1587a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  // Replaces the Value with its corresponding physical register after
159427a5273113274ee35cff78534dba2ae812c79ceRuchira Sasanka  // register allocation is complete
160eda6806f6aaec9a64707a8e5609ae21b15e1440aRuchira Sasanka  void setRegForValue(int reg) {
1611876f92599b90f0a4b276aae413a1b965954174dVikram S. Adve    assert(opType == MO_VirtualRegister || opType == MO_CCRegister ||
1621876f92599b90f0a4b276aae413a1b965954174dVikram S. Adve	   opType == MO_MachineRegister);
163427a5273113274ee35cff78534dba2ae812c79ceRuchira Sasanka    regNum = reg;
164427a5273113274ee35cff78534dba2ae812c79ceRuchira Sasanka  }
1657a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve
16669cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve  friend class MachineInstr;
16723ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve};
16823ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve
16923ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve
17023ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//---------------------------------------------------------------------------
17123ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// class MachineInstr
17223ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//
17323ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// Purpose:
17423ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//   Representation of each machine instruction.
17523ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//
17623ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//   MachineOpCode must be an enum, defined separately for each target.
17723ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//   E.g., It is defined in SparcInstructionSelection.h for the SPARC.
17823ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//
17923ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//   opCodeMask is used to record variants of an instruction.
18023ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//   E.g., each branch instruction on SPARC has 2 flags (i.e., 4 variants):
18123ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//	ANNUL:		   if 1: Annul delay slot instruction.
18223ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//	PREDICT-NOT-TAKEN: if 1: predict branch not taken.
18323ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//   Instead of creating 4 different opcodes for BNZ, we create a single
18423ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//   opcode and set bits in opCodeMask for each of these flags.
185a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve//
186a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve//  There are 2 kinds of operands:
187a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve//
188a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve//  (1) Explicit operands of the machine instruction in vector operands[]
189a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve//
190a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve//  (2) "Implicit operands" are values implicitly used or defined by the
191a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve//      machine instruction, such as arguments to a CALL, return value of
192a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve//      a CALL (if any), and return value of a RETURN.
19323ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//---------------------------------------------------------------------------
19423ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve
19527a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattnerclass MachineInstr : public Annotable,         // MachineInstrs are annotable
19627a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner                     public NonCopyable {      // Disable copy operations
1977a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  MachineOpCode    opCode;              // the opcode
1987a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  OpCodeMask       opCodeMask;          // extra bits for variants of an opcode
199756a55000be056a8c6e11adaa8c19d5a06d03291Chris Lattner  std::vector<MachineOperand> operands; // the operands
20027a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner
20127a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner  struct ImplicitRef {
20227a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner    Value *Val;
20327a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner    bool isDef, isDefAndUse;
20427a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner
20527a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner    ImplicitRef(Value *V, bool D, bool DU) : Val(V), isDef(D), isDefAndUse(DU){}
20627a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner  };
20727a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner
20827a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner  // implicitRefs - Values implicitly referenced by this machine instruction
20927a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner  // (eg, call args)
21027a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner  std::vector<ImplicitRef> implicitRefs;
21127a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner
21227a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner  // regsUsed - all machine registers used for this instruction, including regs
21327a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner  // used to save values across the instruction.  This is a bitset of registers.
21427a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner  std::vector<bool> regsUsed;
2156a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Advepublic:
21623ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve  /*ctor*/		MachineInstr	(MachineOpCode _opCode,
217572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner					 OpCodeMask    _opCodeMask = 0);
2181885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve  /*ctor*/		MachineInstr	(MachineOpCode _opCode,
2191885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve					 unsigned	numOperands,
220572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner					 OpCodeMask    _opCodeMask = 0);
2214bc3daaa3f3c9f22d5dd695e987e8d20f999791cChris Lattner  inline           	~MachineInstr	() {}
222e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve
223e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve  //
224e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve  // Support to rewrite a machine instruction in place: for now, simply
225e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve  // replace() and then set new operands with Set.*Operand methods below.
226e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve  //
227e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve  void                  replace         (MachineOpCode _opCode,
228e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve					 unsigned	numOperands,
229e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve					 OpCodeMask    _opCodeMask = 0x0);
230e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve
231e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve  //
232572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  // The opcode.
233e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve  //
234572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  const MachineOpCode getOpCode() const { return opCode; }
235da47526737c111128e34b9627a3beea1a68bd93eChris Lattner
236a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve  //
237a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve  // Information about explicit operands of the instruction
238a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve  //
239572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  unsigned getNumOperands() const { return operands.size(); }
240a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve
241572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  const MachineOperand& getOperand(unsigned i) const {
242572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner    assert(i < operands.size() && "getOperand() out of range!");
243572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner    return operands[i];
244572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  }
245572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  MachineOperand& getOperand(unsigned i) {
246572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner    assert(i < operands.size() && "getOperand() out of range!");
247572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner    return operands[i];
248572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  }
2496d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner
2506d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner  MachineOperand::MachineOperandType getOperandType(unsigned i) const {
251133f079c8cf966d2222c2dda2de56d2cc600497eChris Lattner    return getOperand(i).getType();
2526d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner  }
2536d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner
2546d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner  bool operandIsDefined(unsigned i) const {
2556d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner    return getOperand(i).opIsDef();
2566d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner  }
2576d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner
2586d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner  bool operandIsDefinedAndUsed(unsigned i) const {
2596d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner    return getOperand(i).opIsDefAndUse();
2606d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner  }
26123ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve
262a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve  //
263a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve  // Information about implicit operands of the instruction
264a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve  //
265572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  unsigned getNumImplicitRefs() const{ return implicitRefs.size();}
266a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve
267572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  const Value* getImplicitRef(unsigned i) const {
268572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner    assert(i < implicitRefs.size() && "getImplicitRef() out of range!");
269572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner    return implicitRefs[i].Val;
270572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  }
271572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  Value* getImplicitRef(unsigned i) {
272572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner    assert(i < implicitRefs.size() && "getImplicitRef() out of range!");
273572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner    return implicitRefs[i].Val;
274572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  }
275572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
276572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  bool implicitRefIsDefined(unsigned i) const {
277572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner    assert(i < implicitRefs.size() && "implicitRefIsDefined() out of range!");
278572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner    return implicitRefs[i].isDef;
279572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  }
280572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  bool implicitRefIsDefinedAndUsed(unsigned i) const {
281572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner    assert(i < implicitRefs.size() && "implicitRefIsDef&Used() out of range!");
282572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner    return implicitRefs[i].isDefAndUse;
283572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  }
284136c9f4062b0fe6d864ebc2bc2b0cbada931a28eVikram S. Adve
285572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  void addImplicitRef(Value* V, bool isDef=false, bool isDefAndUse=false) {
286572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner    implicitRefs.push_back(ImplicitRef(V, isDef, isDefAndUse));
287572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  }
288572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
289572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  void setImplicitRef(unsigned i, Value* V, bool isDef=false,
290572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner                      bool isDefAndUse=false) {
291572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner    assert(i < implicitRefs.size() && "setImplicitRef() out of range!");
292572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner    implicitRefs[i] = ImplicitRef(V, isDef, isDefAndUse);
293572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  }
294a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve
295a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve  //
2967a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  // Information about registers used in this instruction
2977a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  //
298572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  const std::vector<bool> &getRegsUsed() const { return regsUsed; }
2997a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve
30027a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner  // insertUsedReg - Add a register to the Used registers set...
30127a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner  void insertUsedReg(unsigned Reg) {
30227a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner    if (Reg >= regsUsed.size())
30327a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner      regsUsed.resize(Reg+1);
30427a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner    regsUsed[Reg] = true;
30527a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner  }
30627a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner
3077a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  //
308a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve  // Debugging support
309a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve  //
310572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  void dump() const;
311572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  friend std::ostream& operator<<(std::ostream& os, const MachineInstr& minstr);
3122f898d207466bf233b55607e404baca302bc7b5eChris Lattner
3132f898d207466bf233b55607e404baca302bc7b5eChris Lattner  //
3142f898d207466bf233b55607e404baca302bc7b5eChris Lattner  // Define iterators to access the Value operands of the Machine Instruction.
3152f898d207466bf233b55607e404baca302bc7b5eChris Lattner  // begin() and end() are defined to produce these iterators...
3162f898d207466bf233b55607e404baca302bc7b5eChris Lattner  //
3172f898d207466bf233b55607e404baca302bc7b5eChris Lattner  template<class _MI, class _V> class ValOpIterator;
3182f898d207466bf233b55607e404baca302bc7b5eChris Lattner  typedef ValOpIterator<const MachineInstr*,const Value*> const_val_op_iterator;
3192f898d207466bf233b55607e404baca302bc7b5eChris Lattner  typedef ValOpIterator<      MachineInstr*,      Value*> val_op_iterator;
3202f898d207466bf233b55607e404baca302bc7b5eChris Lattner
3212f898d207466bf233b55607e404baca302bc7b5eChris Lattner
32223ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve  // Access to set the operands when building the machine instruction
3237a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  //
324572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  void SetMachineOperandVal(unsigned i,
325572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner                            MachineOperand::MachineOperandType operandType,
326572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner                            Value* V, bool isDef=false, bool isDefAndUse=false);
327572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  void SetMachineOperandConst(unsigned i,
328572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner                              MachineOperand::MachineOperandType operandType,
329572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner                              int64_t intValue);
330572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  void SetMachineOperandReg(unsigned i, int regNum, bool isDef=false,
331572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner                            bool isDefAndUse=false, bool isCCReg=false);
332572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
333572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  unsigned substituteValue(const Value* oldVal, Value* newVal,
334572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner                           bool defsOnly = true);
335572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
336572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  void setOperandHi32(unsigned i) { operands[i].markHi32(); }
337572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  void setOperandLo32(unsigned i) { operands[i].markLo32(); }
338572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  void setOperandHi64(unsigned i) { operands[i].markHi64(); }
339572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  void setOperandLo64(unsigned i) { operands[i].markLo64(); }
340a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve
34169cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve
342572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  // SetRegForOperand - Replaces the Value for the operand with its allocated
3437a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  // physical register after register allocation is complete.
3447a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  //
345572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  void SetRegForOperand(unsigned i, int regNum);
3466d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner
3477a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  //
3487a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  // Iterator to enumerate machine operands.
3497a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  //
3502f898d207466bf233b55607e404baca302bc7b5eChris Lattner  template<class MITy, class VTy>
35139d69009d015a5177303c9d8865143531e099314Chris Lattner  class ValOpIterator : public forward_iterator<VTy, ptrdiff_t> {
3522f898d207466bf233b55607e404baca302bc7b5eChris Lattner    unsigned i;
3532f898d207466bf233b55607e404baca302bc7b5eChris Lattner    MITy MI;
3542f898d207466bf233b55607e404baca302bc7b5eChris Lattner
3556d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner    void skipToNextVal() {
3562f898d207466bf233b55607e404baca302bc7b5eChris Lattner      while (i < MI->getNumOperands() &&
3576d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner             !((MI->getOperandType(i) == MachineOperand::MO_VirtualRegister ||
3586d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner                MI->getOperandType(i) == MachineOperand::MO_CCRegister)
3592f898d207466bf233b55607e404baca302bc7b5eChris Lattner               && MI->getOperand(i).getVRegValue() != 0))
3602f898d207466bf233b55607e404baca302bc7b5eChris Lattner        ++i;
3612f898d207466bf233b55607e404baca302bc7b5eChris Lattner    }
3622f898d207466bf233b55607e404baca302bc7b5eChris Lattner
3632f898d207466bf233b55607e404baca302bc7b5eChris Lattner    inline ValOpIterator(MITy mi, unsigned I) : i(I), MI(mi) {
3642f898d207466bf233b55607e404baca302bc7b5eChris Lattner      skipToNextVal();
3652f898d207466bf233b55607e404baca302bc7b5eChris Lattner    }
3662f898d207466bf233b55607e404baca302bc7b5eChris Lattner
3672f898d207466bf233b55607e404baca302bc7b5eChris Lattner  public:
3682f898d207466bf233b55607e404baca302bc7b5eChris Lattner    typedef ValOpIterator<MITy, VTy> _Self;
3692f898d207466bf233b55607e404baca302bc7b5eChris Lattner
370a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve    inline VTy operator*() const {
371a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve      return MI->getOperand(i).getVRegValue();
3722f898d207466bf233b55607e404baca302bc7b5eChris Lattner    }
3732f898d207466bf233b55607e404baca302bc7b5eChris Lattner
374a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve    const MachineOperand &getMachineOperand() const { return MI->getOperand(i);}
375a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve          MachineOperand &getMachineOperand()       { return MI->getOperand(i);}
376a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve
3772f898d207466bf233b55607e404baca302bc7b5eChris Lattner    inline VTy operator->() const { return operator*(); }
378a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve
379a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve    inline bool isDef()       const { return MI->getOperand(i).opIsDef(); }
380a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve    inline bool isDefAndUse() const { return MI->getOperand(i).opIsDefAndUse();}
381a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve
3822f898d207466bf233b55607e404baca302bc7b5eChris Lattner    inline _Self& operator++() { i++; skipToNextVal(); return *this; }
3832f898d207466bf233b55607e404baca302bc7b5eChris Lattner    inline _Self  operator++(int) { _Self tmp = *this; ++*this; return tmp; }
3842f898d207466bf233b55607e404baca302bc7b5eChris Lattner
3852f898d207466bf233b55607e404baca302bc7b5eChris Lattner    inline bool operator==(const _Self &y) const {
3862f898d207466bf233b55607e404baca302bc7b5eChris Lattner      return i == y.i;
3872f898d207466bf233b55607e404baca302bc7b5eChris Lattner    }
3882f898d207466bf233b55607e404baca302bc7b5eChris Lattner    inline bool operator!=(const _Self &y) const {
3892f898d207466bf233b55607e404baca302bc7b5eChris Lattner      return !operator==(y);
3902f898d207466bf233b55607e404baca302bc7b5eChris Lattner    }
3912f898d207466bf233b55607e404baca302bc7b5eChris Lattner
3922f898d207466bf233b55607e404baca302bc7b5eChris Lattner    static _Self begin(MITy MI) {
3932f898d207466bf233b55607e404baca302bc7b5eChris Lattner      return _Self(MI, 0);
3942f898d207466bf233b55607e404baca302bc7b5eChris Lattner    }
3952f898d207466bf233b55607e404baca302bc7b5eChris Lattner    static _Self end(MITy MI) {
3962f898d207466bf233b55607e404baca302bc7b5eChris Lattner      return _Self(MI, MI->getNumOperands());
3972f898d207466bf233b55607e404baca302bc7b5eChris Lattner    }
3982f898d207466bf233b55607e404baca302bc7b5eChris Lattner  };
3992f898d207466bf233b55607e404baca302bc7b5eChris Lattner
4002f898d207466bf233b55607e404baca302bc7b5eChris Lattner  // define begin() and end()
4012f898d207466bf233b55607e404baca302bc7b5eChris Lattner  val_op_iterator begin() { return val_op_iterator::begin(this); }
4022f898d207466bf233b55607e404baca302bc7b5eChris Lattner  val_op_iterator end()   { return val_op_iterator::end(this); }
4032f898d207466bf233b55607e404baca302bc7b5eChris Lattner
4042f898d207466bf233b55607e404baca302bc7b5eChris Lattner  const_val_op_iterator begin() const {
4052f898d207466bf233b55607e404baca302bc7b5eChris Lattner    return const_val_op_iterator::begin(this);
4062f898d207466bf233b55607e404baca302bc7b5eChris Lattner  }
4072f898d207466bf233b55607e404baca302bc7b5eChris Lattner  const_val_op_iterator end() const {
4082f898d207466bf233b55607e404baca302bc7b5eChris Lattner    return const_val_op_iterator::end(this);
4092f898d207466bf233b55607e404baca302bc7b5eChris Lattner  }
410a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve};
41123ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve
41223ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//---------------------------------------------------------------------------
413593da4acc56d4c591ad688e6605b04d0825c867eVikram S. Adve// Debugging Support
41423ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//---------------------------------------------------------------------------
41523ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve
416572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattnerstd::ostream& operator<<(std::ostream& os, const MachineInstr& minstr);
417593da4acc56d4c591ad688e6605b04d0825c867eVikram S. Adve
418572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattnerstd::ostream& operator<<(std::ostream& os, const MachineOperand& mop);
41923ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve
420572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattnervoid PrintMachineInstructions(const Function *F);
421136c9f4062b0fe6d864ebc2bc2b0cbada931a28eVikram S. Adve
42223ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve#endif
423