MachineInstr.h revision 3c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58
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" 1335880f394fd547b9bec1e92e92ac68db9a931a58Misha Brukman#include "llvm/Target/MRegisterInfo.h" 144a63b72df95b5c0d4af064cef19377f811ba6060Chris Lattner#include "Support/iterator" 15054c1f6cb6f3a680fe4b8447880ed960fd7fe441Chris Lattner#include "Support/NonCopyable.h" 16054c1f6cb6f3a680fe4b8447880ed960fd7fe441Chris Lattner#include <vector> 17054c1f6cb6f3a680fe4b8447880ed960fd7fe441Chris Lattnerclass Value; 18054c1f6cb6f3a680fe4b8447880ed960fd7fe441Chris Lattnerclass Function; 197db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattnerclass MachineBasicBlock; 20fa78fbf446b505767e838f9c188707183c57fc9cChris Lattnerclass TargetMachine; 213c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattnerclass GlobalValue; 22054c1f6cb6f3a680fe4b8447880ed960fd7fe441Chris Lattner 23054c1f6cb6f3a680fe4b8447880ed960fd7fe441Chris Lattnertypedef int MachineOpCode; 246a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve 2532f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner/// MOTy - MachineOperandType - This namespace contains an enum that describes 2632f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner/// how the machine operand is used by the instruction: is it read, defined, or 2732f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner/// both? Note that the MachineInstr/Operator class currently uses bool 2832f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner/// arguments to represent this information instead of an enum. Eventually this 2932f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner/// should change over to use this _easier to read_ representation instead. 3032f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner/// 3132f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattnernamespace MOTy { 3232f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner enum UseType { 3332f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner Use, /// This machine operand is only read by the instruction 3432f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner Def, /// This machine operand is only written by the instruction 3532f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner UseAndDef /// This machine operand is read AND written 3632f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner }; 3732f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner} 3832f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner 3923ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//--------------------------------------------------------------------------- 4023ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// class MachineOperand 4123ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// 4223ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// Purpose: 4323ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// Representation of each machine instruction operand. 4423ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// This class is designed so that you can allocate a vector of operands 4523ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// first and initialize each one later. 4623ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// 4723ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// E.g, for this VM instruction: 4823ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// ptr = alloca type, numElements 4923ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// we generate 2 machine instructions on the SPARC: 5023ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// 5123ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// mul Constant, Numelements -> Reg 5223ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// add %sp, Reg -> Ptr 5323ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// 5423ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// Each instruction has 3 operands, listed above. Of those: 5523ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// - Reg, NumElements, and Ptr are of operand type MO_Register. 5623ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// - Constant is of operand type MO_SignExtendedImmed on the SPARC. 5723ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// 5823ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// For the register operands, the virtual register type is as follows: 5923ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// 6023ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// - Reg will be of virtual register type MO_MInstrVirtualReg. The field 6123ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// MachineInstr* minstr will point to the instruction that computes reg. 6223ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// 6323ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// - %sp will be of virtual register type MO_MachineReg. 6423ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// The field regNum identifies the machine register. 6523ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// 6623ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// - NumElements will be of virtual register type MO_VirtualReg. 6723ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// The field Value* value identifies the value. 6823ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// 6923ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// - Ptr will also be of virtual register type MO_VirtualReg. 7023ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// Again, the field Value* value identifies the value. 7123ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// 7223ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//--------------------------------------------------------------------------- 7323ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve 743c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattnerstruct MachineOperand { 7523ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve enum MachineOperandType { 766a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve MO_VirtualRegister, // virtual register for *value 776a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve MO_MachineRegister, // pre-assigned machine register `regNum' 7823ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve MO_CCRegister, 7923ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve MO_SignExtendedImmed, 8023ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve MO_UnextendedImmed, 8123ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve MO_PCRelativeDisp, 828cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner MO_MachineBasicBlock, // MachineBasicBlock reference 8356cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner MO_FrameIndex, // Abstract Stack Frame Index 843c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner MO_ConstantPoolIndex, // Address of indexed Constant in Constant Pool 853c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner MO_ExternalSymbol, // Name of external global symbol 863c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner MO_GlobalAddress, // Address of a global value 8723ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve }; 8823ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve 896a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adveprivate: 9069cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve // Bit fields of the flags variable used for different operand properties 913c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner enum { 923c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner DEFFLAG = 0x01, // this is a def of the operand 933c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner DEFUSEFLAG = 0x02, // this is both a def and a use 943c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner HIFLAG32 = 0x04, // operand is %hi32(value_or_immedVal) 953c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner LOFLAG32 = 0x08, // operand is %lo32(value_or_immedVal) 963c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner HIFLAG64 = 0x10, // operand is %hi64(value_or_immedVal) 973c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner LOFLAG64 = 0x20, // operand is %lo64(value_or_immedVal) 983c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner PCRELATIVE = 0x40, // Operand is relative to PC, not a global address 9969cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve 1003c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner USEDEFMASK = 0x03, 1013c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner }; 1023c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner 10369cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adveprivate: 1046a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve union { 1056a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve Value* value; // BasicBlockVal for a label operand. 10623ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve // ConstantVal for a non-address immediate. 1076a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve // Virtual register for an SSA operand, 1083c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner // including hidden operands required for 1093c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner // the generated machine code. 1103c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner // LLVM global for MO_GlobalAddress. 1113c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner 1123c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner int64_t immedVal; // Constant value for an explicit constant 1138cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner 1148cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner MachineBasicBlock *MBB; // For MO_MachineBasicBlock type 1153c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner std::string *SymbolName; // For MO_ExternalSymbol type 1166a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve }; 117773fc471bdc36a221ff9302a07e58f8f7210d87dRuchira Sasanka 1181a33e6eb7477ecc015f3aadbd47f1c1434003a66Chris Lattner char flags; // see bit field definitions above 1198cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner MachineOperandType opType:8; // Pack into 8 bits efficiently after flags. 12021721b63c3b5a314dfa0be14823b10273860787cRuchira Sasanka int regNum; // register number for an explicit register 121427a5273113274ee35cff78534dba2ae812c79ceRuchira Sasanka // will be set for a value after reg allocation 122413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattnerprivate: 123413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner MachineOperand() 124a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve : immedVal(0), 125a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve flags(0), 1268cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner opType(MO_VirtualRegister), 127a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve regNum(-1) {} 128a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve 129413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner MachineOperand(int64_t ImmVal, MachineOperandType OpTy) 130a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve : immedVal(ImmVal), 131a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve flags(0), 1328cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner opType(OpTy), 133a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve regNum(-1) {} 134a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve 13532f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner MachineOperand(int Reg, MachineOperandType OpTy, MOTy::UseType UseTy) 136a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve : immedVal(0), 137a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve opType(OpTy), 13832f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner regNum(Reg) { 13932f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner switch (UseTy) { 14032f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner case MOTy::Use: flags = 0; break; 14132f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner case MOTy::Def: flags = DEFFLAG; break; 14232f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner case MOTy::UseAndDef: flags = DEFUSEFLAG; break; 14332f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner default: assert(0 && "Invalid value for UseTy!"); 14432f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner } 14532f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner } 146a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve 1473c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner MachineOperand(Value *V, MachineOperandType OpTy, MOTy::UseType UseTy, 1483c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner bool isPCRelative = false) 14932f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner : value(V), opType(OpTy), regNum(-1) { 15032f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner switch (UseTy) { 15132f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner case MOTy::Use: flags = 0; break; 15232f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner case MOTy::Def: flags = DEFFLAG; break; 15332f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner case MOTy::UseAndDef: flags = DEFUSEFLAG; break; 15432f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner default: assert(0 && "Invalid value for UseTy!"); 15532f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner } 1563c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner if (isPCRelative) flags |= PCRELATIVE; 157413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner } 158413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner 1598cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner MachineOperand(MachineBasicBlock *mbb) 1608cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner : MBB(mbb), flags(0), opType(MO_MachineBasicBlock), regNum(-1) {} 1618cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner 1623c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner MachineOperand(const std::string &SymName, bool isPCRelative) 1633c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner : SymbolName(new std::string(SymName)), flags(isPCRelative ? PCRELATIVE :0), 1643c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner opType(MO_ExternalSymbol), regNum(-1) {} 1653c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner 1666a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Advepublic: 1673c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner MachineOperand(const MachineOperand &M) : immedVal(M.immedVal), 1683c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner flags(M.flags), 1693c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner opType(M.opType), 1703c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner regNum(M.regNum) { 1713c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner if (isExternalSymbol()) 1723c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner SymbolName = new std::string(M.getSymbolName()); 1733c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner } 174a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve 1753c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner ~MachineOperand() { 1763c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner if (isExternalSymbol()) 1773c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner delete SymbolName; 1783c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner } 17923ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve 1803c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner const MachineOperand &operator=(const MachineOperand &MO) { 1813c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner immedVal = MO.immedVal; 1823c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner flags = MO.flags; 1833c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner opType = MO.opType; 1843c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner regNum = MO.regNum; 1853c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner if (isExternalSymbol()) 1863c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner SymbolName = new std::string(MO.getSymbolName()); 1873c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner return *this; 1883c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner } 1893c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner 1906a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve // Accessor methods. Caller is responsible for checking the 1916a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve // operand type before invoking the corresponding accessor. 1926a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve // 193133f079c8cf966d2222c2dda2de56d2cc600497eChris Lattner MachineOperandType getType() const { return opType; } 194572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 1953c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner /// isPCRelative - This returns the value of the PCRELATIVE flag, which 1963c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner /// indicates whether this operand should be emitted as a PC relative value 1973c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner /// instead of a global address. This is used for operands of the forms: 1983c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner /// MachineBasicBlock, GlobalAddress, ExternalSymbol 1993c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner /// 2003c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner bool isPCRelative() const { return (flags & PCRELATIVE) != 0; } 2013c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner 20235880f394fd547b9bec1e92e92ac68db9a931a58Misha Brukman 20335880f394fd547b9bec1e92e92ac68db9a931a58Misha Brukman // This is to finally stop caring whether we have a virtual or machine 20435880f394fd547b9bec1e92e92ac68db9a931a58Misha Brukman // register -- an easier interface is to simply call both virtual and machine 20535880f394fd547b9bec1e92e92ac68db9a931a58Misha Brukman // registers essentially the same, yet be able to distinguish when 20635880f394fd547b9bec1e92e92ac68db9a931a58Misha Brukman // necessary. Thus the instruction selector can just add registers without 20735880f394fd547b9bec1e92e92ac68db9a931a58Misha Brukman // abandon, and the register allocator won't be confused. 20835880f394fd547b9bec1e92e92ac68db9a931a58Misha Brukman bool isVirtualRegister() const { 20935880f394fd547b9bec1e92e92ac68db9a931a58Misha Brukman return (opType == MO_VirtualRegister || opType == MO_MachineRegister) 21035880f394fd547b9bec1e92e92ac68db9a931a58Misha Brukman && regNum >= MRegisterInfo::FirstVirtualRegister; 21135880f394fd547b9bec1e92e92ac68db9a931a58Misha Brukman } 2128cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner bool isPhysicalRegister() const { 2138cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner return (opType == MO_VirtualRegister || opType == MO_MachineRegister) 2143c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner && (unsigned)regNum < MRegisterInfo::FirstVirtualRegister; 2158cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner } 2168cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner bool isRegister() const { return isVirtualRegister() || isPhysicalRegister();} 21735880f394fd547b9bec1e92e92ac68db9a931a58Misha Brukman bool isMachineRegister() const { return !isVirtualRegister(); } 2188cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner bool isMachineBasicBlock() const { return opType == MO_MachineBasicBlock; } 2198cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner bool isPCRelativeDisp() const { return opType == MO_PCRelativeDisp; } 2208cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner bool isImmediate() const { 2218cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner return opType == MO_SignExtendedImmed || opType == MO_UnextendedImmed; 2228cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner } 22356cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner bool isFrameIndex() const { return opType == MO_FrameIndex; } 2243c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner bool isConstantPoolIndex() const { return opType == MO_ConstantPoolIndex; } 2253c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner bool isGlobalAddress() const { return opType == MO_GlobalAddress; } 2263c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner bool isExternalSymbol() const { return opType == MO_ExternalSymbol; } 22735880f394fd547b9bec1e92e92ac68db9a931a58Misha Brukman 22856cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner Value* getVRegValue() const { 229746e0014a6c59f285ffefc30c722ef2cf69eb95dChris Lattner assert(opType == MO_VirtualRegister || opType == MO_CCRegister || 23056cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner isPCRelativeDisp()); 2316a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve return value; 2326a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve } 23356cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner Value* getVRegValueOrNull() const { 234a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve return (opType == MO_VirtualRegister || opType == MO_CCRegister || 23556cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner isPCRelativeDisp()) ? value : NULL; 236a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve } 23756cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner int getMachineRegNum() const { 2386a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve assert(opType == MO_MachineRegister); 239df1c3b8398d1df253ebd389ac1068ec732a2f28fVikram S. Adve return regNum; 2406a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve } 24156cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner int64_t getImmedValue() const { assert(isImmediate()); return immedVal; } 2428cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner MachineBasicBlock *getMachineBasicBlock() const { 2438cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner assert(isMachineBasicBlock() && "Can't get MBB in non-MBB operand!"); 2448cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner return MBB; 2458cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner } 2467ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner int getFrameIndex() const { assert(isFrameIndex()); return immedVal; } 2473c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner unsigned getConstantPoolIndex() const { 2483c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner assert(isConstantPoolIndex()); 2493c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner return immedVal; 2503c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner } 2513c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner 2523c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner GlobalValue *getGlobal() const { 2533c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner assert(isGlobalAddress()); 2543c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner return (GlobalValue*)value; 2553c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner } 2563c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner 2573c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner const std::string &getSymbolName() const { 2583c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner assert(isExternalSymbol()); 2593c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner return *SymbolName; 2603c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner } 2618cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner 262c583175e720653182d48a6924948df8a49aaa8fdChris Lattner bool opIsUse () const { return (flags & USEDEFMASK) == 0; } 263572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner bool opIsDef () const { return flags & DEFFLAG; } 264572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner bool opIsDefAndUse () const { return flags & DEFUSEFLAG; } 265572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner bool opHiBits32 () const { return flags & HIFLAG32; } 266572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner bool opLoBits32 () const { return flags & LOFLAG32; } 267572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner bool opHiBits64 () const { return flags & HIFLAG64; } 268572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner bool opLoBits64 () const { return flags & LOFLAG64; } 269504fc5b7b5a9ffa9f82e95e7212015575030c7a7Vikram S. Adve 270504fc5b7b5a9ffa9f82e95e7212015575030c7a7Vikram S. Adve // used to check if a machine register has been allocated to this operand 27156cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner bool hasAllocatedReg() const { 272504fc5b7b5a9ffa9f82e95e7212015575030c7a7Vikram S. Adve return (regNum >= 0 && 273504fc5b7b5a9ffa9f82e95e7212015575030c7a7Vikram S. Adve (opType == MO_VirtualRegister || opType == MO_CCRegister || 274504fc5b7b5a9ffa9f82e95e7212015575030c7a7Vikram S. Adve opType == MO_MachineRegister)); 275504fc5b7b5a9ffa9f82e95e7212015575030c7a7Vikram S. Adve } 276504fc5b7b5a9ffa9f82e95e7212015575030c7a7Vikram S. Adve 277504fc5b7b5a9ffa9f82e95e7212015575030c7a7Vikram S. Adve // used to get the reg number if when one is allocated 27856cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner int getAllocatedRegNum() const { 27969cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve assert(opType == MO_VirtualRegister || opType == MO_CCRegister || 28069cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve opType == MO_MachineRegister); 28169cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve return regNum; 2827a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve } 283504fc5b7b5a9ffa9f82e95e7212015575030c7a7Vikram S. Adve 28456cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner unsigned getReg() const { 285ce3d3eadef1c2a72a0a6e16735e5091fb1e6dc16Chris Lattner assert(hasAllocatedReg() && "Cannot call MachineOperand::getReg()!"); 286ce3d3eadef1c2a72a0a6e16735e5091fb1e6dc16Chris Lattner return regNum; 287ce3d3eadef1c2a72a0a6e16735e5091fb1e6dc16Chris Lattner } 2886a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve 289697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner friend std::ostream& operator<<(std::ostream& os, const MachineOperand& mop); 29098f2f8053bebaad7683de074bfb74239364098d2Vikram S. Adve 2916a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adveprivate: 2926a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve 29369cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve // Construction methods needed for fine-grain control. 29469cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve // These must be accessed via coresponding methods in MachineInstr. 29569cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve void markHi32() { flags |= HIFLAG32; } 29669cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve void markLo32() { flags |= LOFLAG32; } 29769cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve void markHi64() { flags |= HIFLAG64; } 29869cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve void markLo64() { flags |= LOFLAG64; } 29969cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve 3007a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve // Replaces the Value with its corresponding physical register after 301427a5273113274ee35cff78534dba2ae812c79ceRuchira Sasanka // register allocation is complete 302eda6806f6aaec9a64707a8e5609ae21b15e1440aRuchira Sasanka void setRegForValue(int reg) { 3031876f92599b90f0a4b276aae413a1b965954174dVikram S. Adve assert(opType == MO_VirtualRegister || opType == MO_CCRegister || 3041876f92599b90f0a4b276aae413a1b965954174dVikram S. Adve opType == MO_MachineRegister); 305427a5273113274ee35cff78534dba2ae812c79ceRuchira Sasanka regNum = reg; 306427a5273113274ee35cff78534dba2ae812c79ceRuchira Sasanka } 3077a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve 30869cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve friend class MachineInstr; 30923ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve}; 31023ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve 31123ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve 31223ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//--------------------------------------------------------------------------- 31323ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// class MachineInstr 31423ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// 31523ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// Purpose: 31623ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// Representation of each machine instruction. 31723ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// 31823ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// MachineOpCode must be an enum, defined separately for each target. 31923ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// E.g., It is defined in SparcInstructionSelection.h for the SPARC. 32023ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve// 321a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve// There are 2 kinds of operands: 322a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve// 323a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve// (1) Explicit operands of the machine instruction in vector operands[] 324a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve// 325a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve// (2) "Implicit operands" are values implicitly used or defined by the 326a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve// machine instruction, such as arguments to a CALL, return value of 327a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve// a CALL (if any), and return value of a RETURN. 32823ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//--------------------------------------------------------------------------- 32923ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve 330a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adveclass MachineInstr: public NonCopyable { // Disable copy operations 331a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve 3327a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve MachineOpCode opCode; // the opcode 333756a55000be056a8c6e11adaa8c19d5a06d03291Chris Lattner std::vector<MachineOperand> operands; // the operands 334a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve unsigned numImplicitRefs; // number of implicit operands 33527a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner 336a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve MachineOperand& getImplicitOp(unsigned i) { 337a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < numImplicitRefs && "implicit ref# out of range!"); 338a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve return operands[i + operands.size() - numImplicitRefs]; 339a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve } 340a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve const MachineOperand& getImplicitOp(unsigned i) const { 341a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < numImplicitRefs && "implicit ref# out of range!"); 342a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve return operands[i + operands.size() - numImplicitRefs]; 343a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve } 34427a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner 34527a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner // regsUsed - all machine registers used for this instruction, including regs 34627a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner // used to save values across the instruction. This is a bitset of registers. 34727a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner std::vector<bool> regsUsed; 348413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner 349413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner // OperandComplete - Return true if it's illegal to add a new operand 350413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner bool OperandsComplete() const; 351a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve 3526a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Advepublic: 3537279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner MachineInstr(MachineOpCode Opcode); 3547279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner MachineInstr(MachineOpCode Opcode, unsigned numOperands); 355413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner 356413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner /// MachineInstr ctor - This constructor only does a _reserve_ of the 357413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner /// operands, not a resize for them. It is expected that if you use this that 358413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner /// you call add* methods below to fill up the operands, instead of the Set 3597db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner /// methods. Eventually, the "resizing" ctors will be phased out. 360413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner /// 361413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner MachineInstr(MachineOpCode Opcode, unsigned numOperands, bool XX, bool YY); 362e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve 3637db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner /// MachineInstr ctor - Work exactly the same as the ctor above, except that 3647db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner /// the MachineInstr is created and added to the end of the specified basic 3657db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner /// block. 3667db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner /// 3677db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner MachineInstr(MachineBasicBlock *MBB, MachineOpCode Opcode, unsigned numOps); 3687db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner 3697db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner 370572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner // The opcode. 371e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve // 3727db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner const MachineOpCode getOpcode() const { return opCode; } 373572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner const MachineOpCode getOpCode() const { return opCode; } 374da47526737c111128e34b9627a3beea1a68bd93eChris Lattner 375a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve // 376a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve // Information about explicit operands of the instruction 377a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve // 378a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve unsigned getNumOperands() const { return operands.size() - numImplicitRefs; } 379a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve 380572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner const MachineOperand& getOperand(unsigned i) const { 381a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < getNumOperands() && "getOperand() out of range!"); 382572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner return operands[i]; 383572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner } 384572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner MachineOperand& getOperand(unsigned i) { 385a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < getNumOperands() && "getOperand() out of range!"); 386572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner return operands[i]; 387572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner } 3886d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner 3897ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner // FIXME: ELIMINATE 3906d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner MachineOperand::MachineOperandType getOperandType(unsigned i) const { 391133f079c8cf966d2222c2dda2de56d2cc600497eChris Lattner return getOperand(i).getType(); 3926d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner } 3936d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner 3947ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner // FIXME: ELIMINATE: Misleading name: Definition not defined. 3956d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner bool operandIsDefined(unsigned i) const { 3966d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner return getOperand(i).opIsDef(); 3976d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner } 3986d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner 3996d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner bool operandIsDefinedAndUsed(unsigned i) const { 4006d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner return getOperand(i).opIsDefAndUse(); 4016d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner } 402a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve 403a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve // 404a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve // Information about implicit operands of the instruction 405a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve // 406a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve unsigned getNumImplicitRefs() const{ return numImplicitRefs; } 407a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve 408572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner const Value* getImplicitRef(unsigned i) const { 409a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve return getImplicitOp(i).getVRegValue(); 410572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner } 411572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner Value* getImplicitRef(unsigned i) { 412a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve return getImplicitOp(i).getVRegValue(); 413572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner } 414572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 415572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner bool implicitRefIsDefined(unsigned i) const { 416a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve return getImplicitOp(i).opIsDef(); 417572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner } 418572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner bool implicitRefIsDefinedAndUsed(unsigned i) const { 419a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve return getImplicitOp(i).opIsDefAndUse(); 420572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner } 421a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve inline void addImplicitRef (Value* V, 422a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve bool isDef=false,bool isDefAndUse=false); 423a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve inline void setImplicitRef (unsigned i, Value* V, 424a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve bool isDef=false, bool isDefAndUse=false); 425a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve 426a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve // 4277a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve // Information about registers used in this instruction 4287a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve // 429572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner const std::vector<bool> &getRegsUsed() const { return regsUsed; } 4307a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve 43127a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner // insertUsedReg - Add a register to the Used registers set... 43227a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner void insertUsedReg(unsigned Reg) { 43327a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner if (Reg >= regsUsed.size()) 43427a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner regsUsed.resize(Reg+1); 43527a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner regsUsed[Reg] = true; 43627a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner } 43727a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner 4387a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve // 439a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve // Debugging support 440fa78fbf446b505767e838f9c188707183c57fc9cChris Lattner // 441af55be15dfa5321f470ce9734fabd858f5af7a88Chris Lattner void print(std::ostream &OS, const TargetMachine &TM) const; 442572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner void dump() const; 443572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner friend std::ostream& operator<<(std::ostream& os, const MachineInstr& minstr); 4442f898d207466bf233b55607e404baca302bc7b5eChris Lattner 4452f898d207466bf233b55607e404baca302bc7b5eChris Lattner // 4462f898d207466bf233b55607e404baca302bc7b5eChris Lattner // Define iterators to access the Value operands of the Machine Instruction. 447a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve // Note that these iterators only enumerate the explicit operands. 4482f898d207466bf233b55607e404baca302bc7b5eChris Lattner // begin() and end() are defined to produce these iterators... 4492f898d207466bf233b55607e404baca302bc7b5eChris Lattner // 4502f898d207466bf233b55607e404baca302bc7b5eChris Lattner template<class _MI, class _V> class ValOpIterator; 4512f898d207466bf233b55607e404baca302bc7b5eChris Lattner typedef ValOpIterator<const MachineInstr*,const Value*> const_val_op_iterator; 4522f898d207466bf233b55607e404baca302bc7b5eChris Lattner typedef ValOpIterator< MachineInstr*, Value*> val_op_iterator; 4532f898d207466bf233b55607e404baca302bc7b5eChris Lattner 454572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 455413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner //===--------------------------------------------------------------------===// 456413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner // Accessors to add operands when building up machine instructions 457413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner // 458413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner 459413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner /// addRegOperand - Add a MO_VirtualRegister operand to the end of the 460413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner /// operands list... 461413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner /// 46223e6bba592af68ba991ee6900978e81eb21a08afChris Lattner void addRegOperand(Value *V, bool isDef, bool isDefAndUse=false) { 463413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner assert(!OperandsComplete() && 464413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner "Trying to add an operand to a machine instr that is already done!"); 465413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner operands.push_back(MachineOperand(V, MachineOperand::MO_VirtualRegister, 46632f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner !isDef ? MOTy::Use : (isDefAndUse ? MOTy::UseAndDef : MOTy::Def))); 46732f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner } 46832f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner 4693c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner void addRegOperand(Value *V, MOTy::UseType UTy = MOTy::Use, 4703c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner bool isPCRelative = false) { 47132f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner assert(!OperandsComplete() && 47232f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner "Trying to add an operand to a machine instr that is already done!"); 47332f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner operands.push_back(MachineOperand(V, MachineOperand::MO_VirtualRegister, 4743c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner UTy, isPCRelative)); 475413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner } 476413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner 477413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner /// addRegOperand - Add a symbolic virtual register reference... 478413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner /// 47923e6bba592af68ba991ee6900978e81eb21a08afChris Lattner void addRegOperand(int reg, bool isDef) { 480413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner assert(!OperandsComplete() && 481413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner "Trying to add an operand to a machine instr that is already done!"); 4829cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner operands.push_back(MachineOperand(reg, MachineOperand::MO_VirtualRegister, 48332f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner isDef ? MOTy::Def : MOTy::Use)); 484413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner } 485413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner 48623e6bba592af68ba991ee6900978e81eb21a08afChris Lattner /// addRegOperand - Add a symbolic virtual register reference... 48723e6bba592af68ba991ee6900978e81eb21a08afChris Lattner /// 48823e6bba592af68ba991ee6900978e81eb21a08afChris Lattner void addRegOperand(int reg, MOTy::UseType UTy = MOTy::Use) { 48923e6bba592af68ba991ee6900978e81eb21a08afChris Lattner assert(!OperandsComplete() && 49023e6bba592af68ba991ee6900978e81eb21a08afChris Lattner "Trying to add an operand to a machine instr that is already done!"); 49123e6bba592af68ba991ee6900978e81eb21a08afChris Lattner operands.push_back(MachineOperand(reg, MachineOperand::MO_VirtualRegister, 49223e6bba592af68ba991ee6900978e81eb21a08afChris Lattner UTy)); 49323e6bba592af68ba991ee6900978e81eb21a08afChris Lattner } 49423e6bba592af68ba991ee6900978e81eb21a08afChris Lattner 495413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner /// addPCDispOperand - Add a PC relative displacement operand to the MI 496413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner /// 497413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner void addPCDispOperand(Value *V) { 498413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner assert(!OperandsComplete() && 499413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner "Trying to add an operand to a machine instr that is already done!"); 50032f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner operands.push_back(MachineOperand(V, MachineOperand::MO_PCRelativeDisp, 50132f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner MOTy::Use)); 502413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner } 503413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner 504413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner /// addMachineRegOperand - Add a virtual register operand to this MachineInstr 505413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner /// 50623e6bba592af68ba991ee6900978e81eb21a08afChris Lattner void addMachineRegOperand(int reg, bool isDef) { 507413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner assert(!OperandsComplete() && 508413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner "Trying to add an operand to a machine instr that is already done!"); 509413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner operands.push_back(MachineOperand(reg, MachineOperand::MO_MachineRegister, 51032f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner isDef ? MOTy::Def : MOTy::Use)); 511413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner insertUsedReg(reg); 512413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner } 513413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner 51423e6bba592af68ba991ee6900978e81eb21a08afChris Lattner /// addMachineRegOperand - Add a virtual register operand to this MachineInstr 51523e6bba592af68ba991ee6900978e81eb21a08afChris Lattner /// 51623e6bba592af68ba991ee6900978e81eb21a08afChris Lattner void addMachineRegOperand(int reg, MOTy::UseType UTy = MOTy::Use) { 51723e6bba592af68ba991ee6900978e81eb21a08afChris Lattner assert(!OperandsComplete() && 51823e6bba592af68ba991ee6900978e81eb21a08afChris Lattner "Trying to add an operand to a machine instr that is already done!"); 51923e6bba592af68ba991ee6900978e81eb21a08afChris Lattner operands.push_back(MachineOperand(reg, MachineOperand::MO_MachineRegister, 52023e6bba592af68ba991ee6900978e81eb21a08afChris Lattner UTy)); 52123e6bba592af68ba991ee6900978e81eb21a08afChris Lattner insertUsedReg(reg); 52223e6bba592af68ba991ee6900978e81eb21a08afChris Lattner } 52323e6bba592af68ba991ee6900978e81eb21a08afChris Lattner 524413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner /// addZeroExtImmOperand - Add a zero extended constant argument to the 525413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner /// machine instruction. 526413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner /// 527413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner void addZeroExtImmOperand(int64_t intValue) { 528413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner assert(!OperandsComplete() && 529413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner "Trying to add an operand to a machine instr that is already done!"); 530413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner operands.push_back(MachineOperand(intValue, 531413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner MachineOperand::MO_UnextendedImmed)); 532413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner } 533413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner 534413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner /// addSignExtImmOperand - Add a zero extended constant argument to the 535413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner /// machine instruction. 536413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner /// 537413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner void addSignExtImmOperand(int64_t intValue) { 538413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner assert(!OperandsComplete() && 539413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner "Trying to add an operand to a machine instr that is already done!"); 540413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner operands.push_back(MachineOperand(intValue, 541413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner MachineOperand::MO_SignExtendedImmed)); 542413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner } 543413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner 5448cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner void addMachineBasicBlockOperand(MachineBasicBlock *MBB) { 5458cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner assert(!OperandsComplete() && 5468cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner "Trying to add an operand to a machine instr that is already done!"); 5478cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner operands.push_back(MachineOperand(MBB)); 5488cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner } 549413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner 55056cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner /// addFrameIndexOperand - Add an abstract frame index to the instruction 55156cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner /// 55256cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner void addFrameIndexOperand(unsigned Idx) { 55356cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner assert(!OperandsComplete() && 55456cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner "Trying to add an operand to a machine instr that is already done!"); 55556cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner operands.push_back(MachineOperand(Idx, MachineOperand::MO_FrameIndex)); 55656cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner } 55756cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner 5583c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner /// addConstantPoolndexOperand - Add a constant pool object index to the 5593c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner /// instruction. 5603c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner /// 5613c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner void addConstantPoolIndexOperand(unsigned I) { 5623c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner assert(!OperandsComplete() && 5633c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner "Trying to add an operand to a machine instr that is already done!"); 5643c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner operands.push_back(MachineOperand(I, MachineOperand::MO_ConstantPoolIndex)); 5653c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner } 5663c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner 5673c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner void addGlobalAddressOperand(GlobalValue *GV, bool isPCRelative) { 5683c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner assert(!OperandsComplete() && 5693c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner "Trying to add an operand to a machine instr that is already done!"); 5703c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner operands.push_back(MachineOperand((Value*)GV, 5713c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner MachineOperand::MO_GlobalAddress, 5723c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner MOTy::Use, isPCRelative)); 5733c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner } 5743c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner 5753c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner /// addExternalSymbolOperand - Add an external symbol operand to this instr 5763c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner /// 5773c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner void addExternalSymbolOperand(const std::string &SymName, bool isPCRelative) { 5783c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner operands.push_back(MachineOperand(SymName, isPCRelative)); 5793c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner } 5807ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner 5817ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner //===--------------------------------------------------------------------===// 5827ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner // Accessors used to modify instructions in place. 5837ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner // 5847ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner // FIXME: Move this stuff to MachineOperand itself! 5857ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner 5867ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner /// replace - Support to rewrite a machine instruction in place: for now, 5877ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner /// simply replace() and then set new operands with Set.*Operand methods 5887ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner /// below. 5897ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner /// 5907ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner void replace(MachineOpCode Opcode, unsigned numOperands); 5917ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner 5923c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner /// setOpcode - Replace the opcode of the current instruction with a new one. 5933c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner /// 5943c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner void setOpcode(unsigned Op) { opCode = Op; } 5953c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner 5963c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner /// RemoveOperand - Erase an operand from an instruction, leaving it with one 5973c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner /// fewer operand than it started with. 5983c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner /// 5993c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner void RemoveOperand(unsigned i) { 6003c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner operands.erase(operands.begin()+i); 6013c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner } 6023c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner 6037ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner // Access to set the operands when building the machine instruction 6047ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner // 6057ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner void SetMachineOperandVal (unsigned i, 6067ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner MachineOperand::MachineOperandType operandType, 6077ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner Value* V, 6087ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner bool isDef=false, 6097ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner bool isDefAndUse=false); 6107ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner 6117ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner void SetMachineOperandConst (unsigned i, 6127ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner MachineOperand::MachineOperandType operandType, 6137ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner int64_t intValue); 6147ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner 6157ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner void SetMachineOperandReg (unsigned i, 6167ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner int regNum, 6177ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner bool isDef=false); 6187ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner 6197ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner 620572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner unsigned substituteValue(const Value* oldVal, Value* newVal, 621572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner bool defsOnly = true); 622572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 623572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner void setOperandHi32(unsigned i) { operands[i].markHi32(); } 624572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner void setOperandLo32(unsigned i) { operands[i].markLo32(); } 625572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner void setOperandHi64(unsigned i) { operands[i].markHi64(); } 626572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner void setOperandLo64(unsigned i) { operands[i].markLo64(); } 627a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve 62869cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve 629572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner // SetRegForOperand - Replaces the Value for the operand with its allocated 6307a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve // physical register after register allocation is complete. 6317a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve // 632572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner void SetRegForOperand(unsigned i, int regNum); 6336d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner 6347a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve // 6357a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve // Iterator to enumerate machine operands. 6367a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve // 6372f898d207466bf233b55607e404baca302bc7b5eChris Lattner template<class MITy, class VTy> 63839d69009d015a5177303c9d8865143531e099314Chris Lattner class ValOpIterator : public forward_iterator<VTy, ptrdiff_t> { 6392f898d207466bf233b55607e404baca302bc7b5eChris Lattner unsigned i; 6402f898d207466bf233b55607e404baca302bc7b5eChris Lattner MITy MI; 6412f898d207466bf233b55607e404baca302bc7b5eChris Lattner 6426d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner void skipToNextVal() { 6432f898d207466bf233b55607e404baca302bc7b5eChris Lattner while (i < MI->getNumOperands() && 644a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve !( (MI->getOperandType(i) == MachineOperand::MO_VirtualRegister || 645a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve MI->getOperandType(i) == MachineOperand::MO_CCRegister) 646a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve && MI->getOperand(i).getVRegValue() != 0)) 6472f898d207466bf233b55607e404baca302bc7b5eChris Lattner ++i; 6482f898d207466bf233b55607e404baca302bc7b5eChris Lattner } 6492f898d207466bf233b55607e404baca302bc7b5eChris Lattner 6502f898d207466bf233b55607e404baca302bc7b5eChris Lattner inline ValOpIterator(MITy mi, unsigned I) : i(I), MI(mi) { 6512f898d207466bf233b55607e404baca302bc7b5eChris Lattner skipToNextVal(); 6522f898d207466bf233b55607e404baca302bc7b5eChris Lattner } 6532f898d207466bf233b55607e404baca302bc7b5eChris Lattner 6542f898d207466bf233b55607e404baca302bc7b5eChris Lattner public: 6552f898d207466bf233b55607e404baca302bc7b5eChris Lattner typedef ValOpIterator<MITy, VTy> _Self; 6562f898d207466bf233b55607e404baca302bc7b5eChris Lattner 657a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve inline VTy operator*() const { 658a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve return MI->getOperand(i).getVRegValue(); 6592f898d207466bf233b55607e404baca302bc7b5eChris Lattner } 6602f898d207466bf233b55607e404baca302bc7b5eChris Lattner 661a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve const MachineOperand &getMachineOperand() const { return MI->getOperand(i);} 662a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve MachineOperand &getMachineOperand() { return MI->getOperand(i);} 663a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve 6642f898d207466bf233b55607e404baca302bc7b5eChris Lattner inline VTy operator->() const { return operator*(); } 665a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve 666a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve inline bool isDef() const { return MI->getOperand(i).opIsDef(); } 667a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve inline bool isDefAndUse() const { return MI->getOperand(i).opIsDefAndUse();} 668a7710518dacb30dabf0c2f057b546dc7bcf37071Vikram S. Adve 6692f898d207466bf233b55607e404baca302bc7b5eChris Lattner inline _Self& operator++() { i++; skipToNextVal(); return *this; } 6702f898d207466bf233b55607e404baca302bc7b5eChris Lattner inline _Self operator++(int) { _Self tmp = *this; ++*this; return tmp; } 6712f898d207466bf233b55607e404baca302bc7b5eChris Lattner 6722f898d207466bf233b55607e404baca302bc7b5eChris Lattner inline bool operator==(const _Self &y) const { 6732f898d207466bf233b55607e404baca302bc7b5eChris Lattner return i == y.i; 6742f898d207466bf233b55607e404baca302bc7b5eChris Lattner } 6752f898d207466bf233b55607e404baca302bc7b5eChris Lattner inline bool operator!=(const _Self &y) const { 6762f898d207466bf233b55607e404baca302bc7b5eChris Lattner return !operator==(y); 6772f898d207466bf233b55607e404baca302bc7b5eChris Lattner } 6782f898d207466bf233b55607e404baca302bc7b5eChris Lattner 6792f898d207466bf233b55607e404baca302bc7b5eChris Lattner static _Self begin(MITy MI) { 6802f898d207466bf233b55607e404baca302bc7b5eChris Lattner return _Self(MI, 0); 6812f898d207466bf233b55607e404baca302bc7b5eChris Lattner } 6822f898d207466bf233b55607e404baca302bc7b5eChris Lattner static _Self end(MITy MI) { 6832f898d207466bf233b55607e404baca302bc7b5eChris Lattner return _Self(MI, MI->getNumOperands()); 6842f898d207466bf233b55607e404baca302bc7b5eChris Lattner } 6852f898d207466bf233b55607e404baca302bc7b5eChris Lattner }; 6862f898d207466bf233b55607e404baca302bc7b5eChris Lattner 6872f898d207466bf233b55607e404baca302bc7b5eChris Lattner // define begin() and end() 6882f898d207466bf233b55607e404baca302bc7b5eChris Lattner val_op_iterator begin() { return val_op_iterator::begin(this); } 6892f898d207466bf233b55607e404baca302bc7b5eChris Lattner val_op_iterator end() { return val_op_iterator::end(this); } 6902f898d207466bf233b55607e404baca302bc7b5eChris Lattner 6912f898d207466bf233b55607e404baca302bc7b5eChris Lattner const_val_op_iterator begin() const { 6922f898d207466bf233b55607e404baca302bc7b5eChris Lattner return const_val_op_iterator::begin(this); 6932f898d207466bf233b55607e404baca302bc7b5eChris Lattner } 6942f898d207466bf233b55607e404baca302bc7b5eChris Lattner const_val_op_iterator end() const { 6952f898d207466bf233b55607e404baca302bc7b5eChris Lattner return const_val_op_iterator::end(this); 6962f898d207466bf233b55607e404baca302bc7b5eChris Lattner } 697a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve}; 69823ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve 699a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve 700a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve// Define here to enable inlining of the functions used. 701a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve// 702a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Advevoid MachineInstr::addImplicitRef(Value* V, 703a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve bool isDef, 704a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve bool isDefAndUse) 705a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve{ 706a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve ++numImplicitRefs; 707a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve addRegOperand(V, isDef, isDefAndUse); 708a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve} 709a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve 710a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Advevoid MachineInstr::setImplicitRef(unsigned i, 711a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve Value* V, 712a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve bool isDef, 713a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve bool isDefAndUse) 714a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve{ 715a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < getNumImplicitRefs() && "setImplicitRef() out of range!"); 7168f211a4ab013d4a3324162b972a5b4d075cbd20eVikram S. Adve SetMachineOperandVal(i + getNumOperands(), 717a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve MachineOperand::MO_VirtualRegister, 718a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve V, isDef, isDefAndUse); 719a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve} 720a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve 721a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve 72223ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//--------------------------------------------------------------------------- 723593da4acc56d4c591ad688e6605b04d0825c867eVikram S. Adve// Debugging Support 72423ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//--------------------------------------------------------------------------- 72523ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve 726a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Advestd::ostream& operator<< (std::ostream& os, 727a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve const MachineInstr& minstr); 728593da4acc56d4c591ad688e6605b04d0825c867eVikram S. Adve 729a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Advestd::ostream& operator<< (std::ostream& os, 730a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve const MachineOperand& mop); 73123ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve 732a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Advevoid PrintMachineInstructions (const Function *F); 733136c9f4062b0fe6d864ebc2bc2b0cbada931a28eVikram S. Adve 73423ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve#endif 735