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