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