1103a64318bb716d68a4248996466900411d789beChris Lattner//===-- llvm/CodeGen/MachineOperand.h - MachineOperand class ----*- C++ -*-===// 2103a64318bb716d68a4248996466900411d789beChris Lattner// 3103a64318bb716d68a4248996466900411d789beChris Lattner// The LLVM Compiler Infrastructure 4103a64318bb716d68a4248996466900411d789beChris Lattner// 5103a64318bb716d68a4248996466900411d789beChris Lattner// This file is distributed under the University of Illinois Open Source 6103a64318bb716d68a4248996466900411d789beChris Lattner// License. See LICENSE.TXT for details. 7103a64318bb716d68a4248996466900411d789beChris Lattner// 8103a64318bb716d68a4248996466900411d789beChris Lattner//===----------------------------------------------------------------------===// 9103a64318bb716d68a4248996466900411d789beChris Lattner// 10103a64318bb716d68a4248996466900411d789beChris Lattner// This file contains the declaration of the MachineOperand class. 11103a64318bb716d68a4248996466900411d789beChris Lattner// 12103a64318bb716d68a4248996466900411d789beChris Lattner//===----------------------------------------------------------------------===// 13103a64318bb716d68a4248996466900411d789beChris Lattner 14103a64318bb716d68a4248996466900411d789beChris Lattner#ifndef LLVM_CODEGEN_MACHINEOPERAND_H 15103a64318bb716d68a4248996466900411d789beChris Lattner#define LLVM_CODEGEN_MACHINEOPERAND_H 16103a64318bb716d68a4248996466900411d789beChris Lattner 171f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h" 18103a64318bb716d68a4248996466900411d789beChris Lattner#include <cassert> 19103a64318bb716d68a4248996466900411d789beChris Lattner 20103a64318bb716d68a4248996466900411d789beChris Lattnernamespace llvm { 2185dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 2264348df5c9a4757e82b2a6b081b3537dfe37313bDan Gohmanclass BlockAddress; 239066f4c6fc4cae76afd727a6ac11f86fdea8b280Evan Chengclass ConstantFP; 248594d429e02c688d428036f8563f09572da3fbffDevang Patelclass ConstantInt; 25103a64318bb716d68a4248996466900411d789beChris Lattnerclass GlobalValue; 269066f4c6fc4cae76afd727a6ac11f86fdea8b280Evan Chengclass MachineBasicBlock; 27f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattnerclass MachineInstr; 2862ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattnerclass MachineRegisterInfo; 2968c3def12618f73ec237359cb07f8e9e68d50b3aDale Johannesenclass MDNode; 309066f4c6fc4cae76afd727a6ac11f86fdea8b280Evan Chengclass TargetMachine; 312da53370241fdd1b5c291483311b34e609f06c73Jakob Stoklund Olesenclass TargetRegisterInfo; 32b985e9aacdd604a5a503496a1633fa9c6ef7235cBenjamin Kramerclass hash_code; 33cb3718832375a581c5ea23f15918f3ea447a446cOwen Andersonclass raw_ostream; 3472aaa3c79869870bd16402ed1f37b80a5e71c800Chris Lattnerclass MCSymbol; 3585dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 36103a64318bb716d68a4248996466900411d789beChris Lattner/// MachineOperand class - Representation of each machine instruction operand. 37103a64318bb716d68a4248996466900411d789beChris Lattner/// 38f1d015f3429f611c423f943c75f86e6823810dc3Jakob Stoklund Olesen/// This class isn't a POD type because it has a private constructor, but its 39f1d015f3429f611c423f943c75f86e6823810dc3Jakob Stoklund Olesen/// destructor must be trivial. Functions like MachineInstr::addOperand(), 40f1d015f3429f611c423f943c75f86e6823810dc3Jakob Stoklund Olesen/// MachineRegisterInfo::moveOperands(), and MF::DeleteMachineInstr() depend on 41f1d015f3429f611c423f943c75f86e6823810dc3Jakob Stoklund Olesen/// not having to call the MachineOperand destructor. 42f1d015f3429f611c423f943c75f86e6823810dc3Jakob Stoklund Olesen/// 43103a64318bb716d68a4248996466900411d789beChris Lattnerclass MachineOperand { 44103a64318bb716d68a4248996466900411d789beChris Lattnerpublic: 45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines enum MachineOperandType : unsigned char { 4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MO_Register, ///< Register operand. 4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MO_Immediate, ///< Immediate operand 4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MO_CImmediate, ///< Immediate >64bit operand 4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MO_FPImmediate, ///< Floating-point immediate operand 5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MO_MachineBasicBlock, ///< MachineBasicBlock reference 5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MO_FrameIndex, ///< Abstract Stack Frame Index 5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MO_ConstantPoolIndex, ///< Address of indexed Constant in Constant Pool 5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MO_TargetIndex, ///< Target-dependent index+offset operand. 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MO_JumpTableIndex, ///< Address of indexed Jump Table for switch 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MO_ExternalSymbol, ///< Name of external global symbol 5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MO_GlobalAddress, ///< Address of a global value 5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MO_BlockAddress, ///< Address of a basic block 5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MO_RegisterMask, ///< Mask of preserved registers. 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MO_RegisterLiveOut, ///< Mask of live-out registers. 6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MO_Metadata, ///< Metadata reference (for debug info) 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MO_MCSymbol, ///< MCSymbol reference (for debug/eh info) 6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MO_CFIIndex ///< MCCFIInstruction index. 63103a64318bb716d68a4248996466900411d789beChris Lattner }; 64103a64318bb716d68a4248996466900411d789beChris Lattner 65103a64318bb716d68a4248996466900411d789beChris Lattnerprivate: 66a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner /// OpKind - Specify what kind of operand this is. This discriminates the 67a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner /// union. 68dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MachineOperandType OpKind; 6985dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 70682106050979f0d48fcf17338c99e91672352789Jakob Stoklund Olesen /// Subregister number for MO_Register. A value of 0 indicates the 71682106050979f0d48fcf17338c99e91672352789Jakob Stoklund Olesen /// MO_Register has no subReg. 72682106050979f0d48fcf17338c99e91672352789Jakob Stoklund Olesen /// 73682106050979f0d48fcf17338c99e91672352789Jakob Stoklund Olesen /// For all other kinds of operands, this field holds target-specific flags. 74682106050979f0d48fcf17338c99e91672352789Jakob Stoklund Olesen unsigned SubReg_TargetFlags : 12; 7585dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 769c130672761e006c47ea23b34a7bd414f2cd8368Jakob Stoklund Olesen /// TiedTo - Non-zero when this register operand is tied to another register 779c130672761e006c47ea23b34a7bd414f2cd8368Jakob Stoklund Olesen /// operand. The encoding of this field is described in the block comment 789c130672761e006c47ea23b34a7bd414f2cd8368Jakob Stoklund Olesen /// before MachineInstr::tieOperands(). 799c130672761e006c47ea23b34a7bd414f2cd8368Jakob Stoklund Olesen unsigned char TiedTo : 4; 809c130672761e006c47ea23b34a7bd414f2cd8368Jakob Stoklund Olesen 81a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner /// IsDef/IsImp/IsKill/IsDead flags - These are only valid for MO_Register 82a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner /// operands. 8385dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 84a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner /// IsDef - True if this is a def, false if this is a use of the register. 85a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner /// 86a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner bool IsDef : 1; 8785dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 88a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner /// IsImp - True if this is an implicit def or use, false if it is explicit. 89a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner /// 90a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner bool IsImp : 1; 91103a64318bb716d68a4248996466900411d789beChris Lattner 92a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner /// IsKill - True if this instruction is the last use of the register on this 93a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner /// path through the function. This is only valid on uses of registers. 94a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner bool IsKill : 1; 95a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner 96a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner /// IsDead - True if this register is never used by a subsequent instruction. 97a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner /// This is only valid on definitions of registers. 98a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner bool IsDead : 1; 99e3087890ac7f2fcf4697f8e09091e9a384311b9cChris Lattner 1007016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen /// IsUndef - True if this register operand reads an "undef" value, i.e. the 1017016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen /// read value doesn't matter. This flag can be set on both use and def 1027016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen /// operands. On a sub-register def operand, it refers to the part of the 1037016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen /// register that isn't written. On a full-register def operand, it is a 1047016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen /// noop. See readsReg(). 1057016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen /// 1067016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen /// This is only valid on registers. 1077016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen /// 1087016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen /// Note that an instruction may have multiple <undef> operands referring to 1097016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen /// the same register. In that case, the instruction may depend on those 1107016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen /// operands reading the same dont-care value. For example: 1117016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen /// 1127016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen /// %vreg1<def> = XOR %vreg2<undef>, %vreg2<undef> 1137016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen /// 1147016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen /// Any register can be used for %vreg2, and its value doesn't matter, but 1157016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen /// the two operands must be the same register. 1167016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen /// 1174784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng bool IsUndef : 1; 1184784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng 1192068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen /// IsInternalRead - True if this operand reads a value that was defined 1202068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen /// inside the same instruction or bundle. This flag can be set on both use 1212068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen /// and def operands. On a sub-register def operand, it refers to the part 1222068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen /// of the register that isn't written. On a full-register def operand, it 1232068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen /// is a noop. 1242068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen /// 1252068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen /// When this flag is set, the instruction bundle must contain at least one 1262068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen /// other def of the register. If multiple instructions in the bundle define 1272068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen /// the register, the meaning is target-defined. 1282068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen bool IsInternalRead : 1; 1292068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen 13014743e83b9214fa9a6a5697dc08aafa37b62b046Chris Lattner /// IsEarlyClobber - True if this MO_Register 'def' operand is written to 13114743e83b9214fa9a6a5697dc08aafa37b62b046Chris Lattner /// by the MachineInstr before all input registers are read. This is used to 13214743e83b9214fa9a6a5697dc08aafa37b62b046Chris Lattner /// model the GCC inline asm '&' constraint modifier. 133913d3dfac43f29921467f33aa743f28ee1bfc5d1Dale Johannesen bool IsEarlyClobber : 1; 134913d3dfac43f29921467f33aa743f28ee1bfc5d1Dale Johannesen 135a65aa0f0bba1ef2322d63d05c074a92168684c63Dale Johannesen /// IsDebug - True if this MO_Register 'use' operand is in a debug pseudo, 136a65aa0f0bba1ef2322d63d05c074a92168684c63Dale Johannesen /// not a real instruction. Such uses should be ignored during codegen. 137a65aa0f0bba1ef2322d63d05c074a92168684c63Dale Johannesen bool IsDebug : 1; 138a65aa0f0bba1ef2322d63d05c074a92168684c63Dale Johannesen 1390958870a085e74c3216186700ca24f3272340ad2Eric Christopher /// SmallContents - This really should be part of the Contents union, but 1400958870a085e74c3216186700ca24f3272340ad2Eric Christopher /// lives out here so we can get a better packed struct. 1412594746045258958673ebe42db2a27a4d05b0b73Jakob Stoklund Olesen /// MO_Register: Register number. 1422594746045258958673ebe42db2a27a4d05b0b73Jakob Stoklund Olesen /// OffsetedInfo: Low bits of offset. 1432594746045258958673ebe42db2a27a4d05b0b73Jakob Stoklund Olesen union { 1442594746045258958673ebe42db2a27a4d05b0b73Jakob Stoklund Olesen unsigned RegNo; // For MO_Register. 1452594746045258958673ebe42db2a27a4d05b0b73Jakob Stoklund Olesen unsigned OffsetLo; // Matches Contents.OffsetedInfo.OffsetHi. 1462594746045258958673ebe42db2a27a4d05b0b73Jakob Stoklund Olesen } SmallContents; 1472594746045258958673ebe42db2a27a4d05b0b73Jakob Stoklund Olesen 14885dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach /// ParentMI - This is the instruction that this operand is embedded into. 149a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner /// This is valid for all operand types, when the operand is in an instr. 150a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner MachineInstr *ParentMI; 151103a64318bb716d68a4248996466900411d789beChris Lattner 152a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner /// Contents union - This contains the payload for the various operand types. 153a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner union { 15436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineBasicBlock *MBB; // For MO_MachineBasicBlock. 15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const ConstantFP *CFP; // For MO_FPImmediate. 15636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const ConstantInt *CI; // For MO_CImmediate. Integers > 64bit. 15736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines int64_t ImmVal; // For MO_Immediate. 15836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const uint32_t *RegMask; // For MO_RegisterMask and MO_RegisterLiveOut. 15936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MDNode *MD; // For MO_Metadata. 16036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCSymbol *Sym; // For MO_MCSymbol. 16136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned CFIIndex; // For MO_CFI. 16262ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner 16362ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner struct { // For MO_Register. 1642594746045258958673ebe42db2a27a4d05b0b73Jakob Stoklund Olesen // Register number is in SmallContents.RegNo. 165c7908037d87c8f6866b872e9f6b5a7fffae5b63eJakob Stoklund Olesen MachineOperand *Prev; // Access list for register. See MRI. 16662ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner MachineOperand *Next; 16762ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner } Reg; 16885dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 169a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner /// OffsetedInfo - This struct contains the offset and an object identifier. 170a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner /// this represent the object as with an optional offset from it. 171a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner struct { 172a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner union { 173a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner int Index; // For MO_*Index - The index itself. 174a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner const char *SymbolName; // For MO_ExternalSymbol. 17546510a73e977273ec67747eb34cbdb43f815e451Dan Gohman const GlobalValue *GV; // For MO_GlobalAddress. 17646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman const BlockAddress *BA; // For MO_BlockAddress. 177a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner } Val; 1782594746045258958673ebe42db2a27a4d05b0b73Jakob Stoklund Olesen // Low bits of offset are in SmallContents.OffsetLo. 1792594746045258958673ebe42db2a27a4d05b0b73Jakob Stoklund Olesen int OffsetHi; // An offset from the object, high 32 bits. 180a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner } OffsetedInfo; 181a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner } Contents; 18285dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 183682106050979f0d48fcf17338c99e91672352789Jakob Stoklund Olesen explicit MachineOperand(MachineOperandType K) 184dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : OpKind(K), SubReg_TargetFlags(0), ParentMI(nullptr) {} 185103a64318bb716d68a4248996466900411d789beChris Lattnerpublic: 186103a64318bb716d68a4248996466900411d789beChris Lattner /// getType - Returns the MachineOperandType for this operand. 187103a64318bb716d68a4248996466900411d789beChris Lattner /// 18831530617dd206c3ac549e98508d8f98e91bf8275Chris Lattner MachineOperandType getType() const { return (MachineOperandType)OpKind; } 18985dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 190682106050979f0d48fcf17338c99e91672352789Jakob Stoklund Olesen unsigned getTargetFlags() const { 191682106050979f0d48fcf17338c99e91672352789Jakob Stoklund Olesen return isReg() ? 0 : SubReg_TargetFlags; 192190e342cbcb1456ebb21b53a35cfefa99435bd65Jakob Stoklund Olesen } 193682106050979f0d48fcf17338c99e91672352789Jakob Stoklund Olesen void setTargetFlags(unsigned F) { 194190e342cbcb1456ebb21b53a35cfefa99435bd65Jakob Stoklund Olesen assert(!isReg() && "Register operands can't have target flags"); 195682106050979f0d48fcf17338c99e91672352789Jakob Stoklund Olesen SubReg_TargetFlags = F; 196682106050979f0d48fcf17338c99e91672352789Jakob Stoklund Olesen assert(SubReg_TargetFlags == F && "Target flags out of range"); 197190e342cbcb1456ebb21b53a35cfefa99435bd65Jakob Stoklund Olesen } 198682106050979f0d48fcf17338c99e91672352789Jakob Stoklund Olesen void addTargetFlag(unsigned F) { 199190e342cbcb1456ebb21b53a35cfefa99435bd65Jakob Stoklund Olesen assert(!isReg() && "Register operands can't have target flags"); 200682106050979f0d48fcf17338c99e91672352789Jakob Stoklund Olesen SubReg_TargetFlags |= F; 201682106050979f0d48fcf17338c99e91672352789Jakob Stoklund Olesen assert((SubReg_TargetFlags & F) && "Target flags out of range"); 202190e342cbcb1456ebb21b53a35cfefa99435bd65Jakob Stoklund Olesen } 20385dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 204103a64318bb716d68a4248996466900411d789beChris Lattner 205e3087890ac7f2fcf4697f8e09091e9a384311b9cChris Lattner /// getParent - Return the instruction that this operand belongs to. 206e3087890ac7f2fcf4697f8e09091e9a384311b9cChris Lattner /// 207e3087890ac7f2fcf4697f8e09091e9a384311b9cChris Lattner MachineInstr *getParent() { return ParentMI; } 208e3087890ac7f2fcf4697f8e09091e9a384311b9cChris Lattner const MachineInstr *getParent() const { return ParentMI; } 20985dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 2100804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen /// clearParent - Reset the parent pointer. 2110804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen /// 2120804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen /// The MachineOperand copy constructor also copies ParentMI, expecting the 2130804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen /// original to be deleted. If a MachineOperand is ever stored outside a 2140804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen /// MachineInstr, the parent pointer must be cleared. 2150804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen /// 2160804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen /// Never call clearParent() on an operand in a MachineInstr. 2170804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen /// 218dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void clearParent() { ParentMI = nullptr; } 2190804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen 220dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void print(raw_ostream &os, const TargetMachine *TM = nullptr) const; 221f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner 222d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman //===--------------------------------------------------------------------===// 223d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman // Accessors that tell you what kind of MachineOperand you're looking at. 224d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman //===--------------------------------------------------------------------===// 225d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman 226d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman /// isReg - Tests if this is a MO_Register operand. 227d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman bool isReg() const { return OpKind == MO_Register; } 228d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman /// isImm - Tests if this is a MO_Immediate operand. 229d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman bool isImm() const { return OpKind == MO_Immediate; } 230dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// isCImm - Test if this is a MO_CImmediate operand. 2318594d429e02c688d428036f8563f09572da3fbffDevang Patel bool isCImm() const { return OpKind == MO_CImmediate; } 232d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman /// isFPImm - Tests if this is a MO_FPImmediate operand. 233d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman bool isFPImm() const { return OpKind == MO_FPImmediate; } 234d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman /// isMBB - Tests if this is a MO_MachineBasicBlock operand. 235d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman bool isMBB() const { return OpKind == MO_MachineBasicBlock; } 236d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman /// isFI - Tests if this is a MO_FrameIndex operand. 237d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman bool isFI() const { return OpKind == MO_FrameIndex; } 238d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman /// isCPI - Tests if this is a MO_ConstantPoolIndex operand. 239d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman bool isCPI() const { return OpKind == MO_ConstantPoolIndex; } 2400b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen /// isTargetIndex - Tests if this is a MO_TargetIndex operand. 2410b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen bool isTargetIndex() const { return OpKind == MO_TargetIndex; } 242d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman /// isJTI - Tests if this is a MO_JumpTableIndex operand. 243d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman bool isJTI() const { return OpKind == MO_JumpTableIndex; } 244d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman /// isGlobal - Tests if this is a MO_GlobalAddress operand. 245d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman bool isGlobal() const { return OpKind == MO_GlobalAddress; } 246d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman /// isSymbol - Tests if this is a MO_ExternalSymbol operand. 247d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman bool isSymbol() const { return OpKind == MO_ExternalSymbol; } 24864348df5c9a4757e82b2a6b081b3537dfe37313bDan Gohman /// isBlockAddress - Tests if this is a MO_BlockAddress operand. 24964348df5c9a4757e82b2a6b081b3537dfe37313bDan Gohman bool isBlockAddress() const { return OpKind == MO_BlockAddress; } 2507739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen /// isRegMask - Tests if this is a MO_RegisterMask operand. 2517739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen bool isRegMask() const { return OpKind == MO_RegisterMask; } 25236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// isRegLiveOut - Tests if this is a MO_RegisterLiveOut operand. 25336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isRegLiveOut() const { return OpKind == MO_RegisterLiveOut; } 25468c3def12618f73ec237359cb07f8e9e68d50b3aDale Johannesen /// isMetadata - Tests if this is a MO_Metadata operand. 25568c3def12618f73ec237359cb07f8e9e68d50b3aDale Johannesen bool isMetadata() const { return OpKind == MO_Metadata; } 25672aaa3c79869870bd16402ed1f37b80a5e71c800Chris Lattner bool isMCSymbol() const { return OpKind == MO_MCSymbol; } 25736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isCFIIndex() const { return OpKind == MO_CFIIndex; } 2587739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen 259f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner //===--------------------------------------------------------------------===// 260f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner // Accessors for Register Operands 261f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner //===--------------------------------------------------------------------===// 262f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner 263f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner /// getReg - Returns the register number. 264f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner unsigned getReg() const { 265d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(isReg() && "This is not a register operand!"); 2662594746045258958673ebe42db2a27a4d05b0b73Jakob Stoklund Olesen return SmallContents.RegNo; 267f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner } 26885dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 269f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner unsigned getSubReg() const { 270d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(isReg() && "Wrong MachineOperand accessor"); 271682106050979f0d48fcf17338c99e91672352789Jakob Stoklund Olesen return SubReg_TargetFlags; 272f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner } 27385dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 27485dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach bool isUse() const { 275d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(isReg() && "Wrong MachineOperand accessor"); 276f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner return !IsDef; 277f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner } 27885dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 279f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner bool isDef() const { 280d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(isReg() && "Wrong MachineOperand accessor"); 281f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner return IsDef; 282f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner } 28385dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 28485dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach bool isImplicit() const { 285d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(isReg() && "Wrong MachineOperand accessor"); 286f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner return IsImp; 287f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner } 28885dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 289f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner bool isDead() const { 290d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(isReg() && "Wrong MachineOperand accessor"); 291f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner return IsDead; 292f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner } 29385dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 294f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner bool isKill() const { 295d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(isReg() && "Wrong MachineOperand accessor"); 296f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner return IsKill; 297f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner } 29885dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 2994784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng bool isUndef() const { 3004784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng assert(isReg() && "Wrong MachineOperand accessor"); 3014784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng return IsUndef; 3024784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng } 30385dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 3042068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen bool isInternalRead() const { 3052068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen assert(isReg() && "Wrong MachineOperand accessor"); 3062068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen return IsInternalRead; 3072068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen } 3082068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen 309913d3dfac43f29921467f33aa743f28ee1bfc5d1Dale Johannesen bool isEarlyClobber() const { 310d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(isReg() && "Wrong MachineOperand accessor"); 311913d3dfac43f29921467f33aa743f28ee1bfc5d1Dale Johannesen return IsEarlyClobber; 312913d3dfac43f29921467f33aa743f28ee1bfc5d1Dale Johannesen } 313913d3dfac43f29921467f33aa743f28ee1bfc5d1Dale Johannesen 3144ba6916a98fffd9dedac5945ac51d40c8948069eJakob Stoklund Olesen bool isTied() const { 3154ba6916a98fffd9dedac5945ac51d40c8948069eJakob Stoklund Olesen assert(isReg() && "Wrong MachineOperand accessor"); 3169c130672761e006c47ea23b34a7bd414f2cd8368Jakob Stoklund Olesen return TiedTo; 3174ba6916a98fffd9dedac5945ac51d40c8948069eJakob Stoklund Olesen } 3184ba6916a98fffd9dedac5945ac51d40c8948069eJakob Stoklund Olesen 319a65aa0f0bba1ef2322d63d05c074a92168684c63Dale Johannesen bool isDebug() const { 320a65aa0f0bba1ef2322d63d05c074a92168684c63Dale Johannesen assert(isReg() && "Wrong MachineOperand accessor"); 321a65aa0f0bba1ef2322d63d05c074a92168684c63Dale Johannesen return IsDebug; 322a65aa0f0bba1ef2322d63d05c074a92168684c63Dale Johannesen } 323a65aa0f0bba1ef2322d63d05c074a92168684c63Dale Johannesen 3247016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen /// readsReg - Returns true if this operand reads the previous value of its 3257016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen /// register. A use operand with the <undef> flag set doesn't read its 3267016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen /// register. A sub-register def implicitly reads the other parts of the 3277016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen /// register being redefined unless the <undef> flag is set. 3282068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen /// 3292068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen /// This refers to reading the register value from before the current 3302068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen /// instruction or bundle. Internal bundle reads are not included. 3317016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen bool readsReg() const { 3327016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen assert(isReg() && "Wrong MachineOperand accessor"); 3332068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen return !isUndef() && !isInternalRead() && (isUse() || getSubReg()); 3347016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen } 3357016cf66ee21ddf3f7823d4e332b2cb84953bebdJakob Stoklund Olesen 336f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner //===--------------------------------------------------------------------===// 337f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner // Mutators for Register Operands 338f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner //===--------------------------------------------------------------------===// 33985dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 34062ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner /// Change the register this operand corresponds to. 34162ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner /// 34262ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner void setReg(unsigned Reg); 34385dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 344f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner void setSubReg(unsigned subReg) { 345d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(isReg() && "Wrong MachineOperand accessor"); 346682106050979f0d48fcf17338c99e91672352789Jakob Stoklund Olesen SubReg_TargetFlags = subReg; 347682106050979f0d48fcf17338c99e91672352789Jakob Stoklund Olesen assert(SubReg_TargetFlags == subReg && "SubReg out of range"); 348f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner } 3492da53370241fdd1b5c291483311b34e609f06c73Jakob Stoklund Olesen 3502da53370241fdd1b5c291483311b34e609f06c73Jakob Stoklund Olesen /// substVirtReg - Substitute the current register with the virtual 3512da53370241fdd1b5c291483311b34e609f06c73Jakob Stoklund Olesen /// subregister Reg:SubReg. Take any existing SubReg index into account, 3522da53370241fdd1b5c291483311b34e609f06c73Jakob Stoklund Olesen /// using TargetRegisterInfo to compose the subreg indices if necessary. 3532da53370241fdd1b5c291483311b34e609f06c73Jakob Stoklund Olesen /// Reg must be a virtual register, SubIdx can be 0. 3542da53370241fdd1b5c291483311b34e609f06c73Jakob Stoklund Olesen /// 3552da53370241fdd1b5c291483311b34e609f06c73Jakob Stoklund Olesen void substVirtReg(unsigned Reg, unsigned SubIdx, const TargetRegisterInfo&); 3562da53370241fdd1b5c291483311b34e609f06c73Jakob Stoklund Olesen 3572da53370241fdd1b5c291483311b34e609f06c73Jakob Stoklund Olesen /// substPhysReg - Substitute the current register with the physical register 3582da53370241fdd1b5c291483311b34e609f06c73Jakob Stoklund Olesen /// Reg, taking any existing SubReg into account. For instance, 3592da53370241fdd1b5c291483311b34e609f06c73Jakob Stoklund Olesen /// substPhysReg(%EAX) will change %reg1024:sub_8bit to %AL. 3602da53370241fdd1b5c291483311b34e609f06c73Jakob Stoklund Olesen /// 3612da53370241fdd1b5c291483311b34e609f06c73Jakob Stoklund Olesen void substPhysReg(unsigned Reg, const TargetRegisterInfo&); 3622da53370241fdd1b5c291483311b34e609f06c73Jakob Stoklund Olesen 363d6397eba2389e8a24d37aa56e049187c1ee75f4fJakob Stoklund Olesen void setIsUse(bool Val = true) { setIsDef(!Val); } 36485dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 365d6397eba2389e8a24d37aa56e049187c1ee75f4fJakob Stoklund Olesen void setIsDef(bool Val = true); 366f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner 36785dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach void setImplicit(bool Val = true) { 368d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(isReg() && "Wrong MachineOperand accessor"); 369f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner IsImp = Val; 370f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner } 371f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner 372f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner void setIsKill(bool Val = true) { 373d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(isReg() && !IsDef && "Wrong MachineOperand accessor"); 37438007ca86a51a6fa932b1dd0f3998f952d1145e2Dale Johannesen assert((!Val || !isDebug()) && "Marking a debug operation as kill"); 375f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner IsKill = Val; 376f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner } 37785dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 378f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner void setIsDead(bool Val = true) { 379d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(isReg() && IsDef && "Wrong MachineOperand accessor"); 380f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner IsDead = Val; 381f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner } 382f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner 3834784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng void setIsUndef(bool Val = true) { 3844784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng assert(isReg() && "Wrong MachineOperand accessor"); 3854784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng IsUndef = Val; 3864784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng } 38785dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 3882068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen void setIsInternalRead(bool Val = true) { 3892068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen assert(isReg() && "Wrong MachineOperand accessor"); 3902068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen IsInternalRead = Val; 3912068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen } 3922068215e8515203ab4839ee494cdc53dfd0cdf02Jakob Stoklund Olesen 393913d3dfac43f29921467f33aa743f28ee1bfc5d1Dale Johannesen void setIsEarlyClobber(bool Val = true) { 394d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(isReg() && IsDef && "Wrong MachineOperand accessor"); 395913d3dfac43f29921467f33aa743f28ee1bfc5d1Dale Johannesen IsEarlyClobber = Val; 396913d3dfac43f29921467f33aa743f28ee1bfc5d1Dale Johannesen } 397f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner 398bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng void setIsDebug(bool Val = true) { 399b7770e0b851295141f2b5ec8383380253a75c5f8David Blaikie assert(isReg() && !IsDef && "Wrong MachineOperand accessor"); 400bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng IsDebug = Val; 401bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng } 402bfcb3051899b7141a946d769fcf6e8a8453bc530Evan Cheng 403f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner //===--------------------------------------------------------------------===// 404f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner // Accessors for various operand types. 405f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner //===--------------------------------------------------------------------===// 40685dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 407103a64318bb716d68a4248996466900411d789beChris Lattner int64_t getImm() const { 408d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(isImm() && "Wrong MachineOperand accessor"); 409a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner return Contents.ImmVal; 410103a64318bb716d68a4248996466900411d789beChris Lattner } 41185dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 4128594d429e02c688d428036f8563f09572da3fbffDevang Patel const ConstantInt *getCImm() const { 4138594d429e02c688d428036f8563f09572da3fbffDevang Patel assert(isCImm() && "Wrong MachineOperand accessor"); 4148594d429e02c688d428036f8563f09572da3fbffDevang Patel return Contents.CI; 4158594d429e02c688d428036f8563f09572da3fbffDevang Patel } 4168594d429e02c688d428036f8563f09572da3fbffDevang Patel 4174fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman const ConstantFP *getFPImm() const { 418d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(isFPImm() && "Wrong MachineOperand accessor"); 419e8b7ccf0c9a06831266d690d0b10ead71e0a4ac5Nate Begeman return Contents.CFP; 420e8b7ccf0c9a06831266d690d0b10ead71e0a4ac5Nate Begeman } 42185dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 422103a64318bb716d68a4248996466900411d789beChris Lattner MachineBasicBlock *getMBB() const { 423d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(isMBB() && "Wrong MachineOperand accessor"); 424a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner return Contents.MBB; 425103a64318bb716d68a4248996466900411d789beChris Lattner } 426a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner 427a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner int getIndex() const { 4280b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen assert((isFI() || isCPI() || isTargetIndex() || isJTI()) && 429a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner "Wrong MachineOperand accessor"); 430a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner return Contents.OffsetedInfo.Val.Index; 431103a64318bb716d68a4248996466900411d789beChris Lattner } 43285dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 43346510a73e977273ec67747eb34cbdb43f815e451Dan Gohman const GlobalValue *getGlobal() const { 434d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(isGlobal() && "Wrong MachineOperand accessor"); 435a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner return Contents.OffsetedInfo.Val.GV; 436103a64318bb716d68a4248996466900411d789beChris Lattner } 43764348df5c9a4757e82b2a6b081b3537dfe37313bDan Gohman 43846510a73e977273ec67747eb34cbdb43f815e451Dan Gohman const BlockAddress *getBlockAddress() const { 43964348df5c9a4757e82b2a6b081b3537dfe37313bDan Gohman assert(isBlockAddress() && "Wrong MachineOperand accessor"); 44064348df5c9a4757e82b2a6b081b3537dfe37313bDan Gohman return Contents.OffsetedInfo.Val.BA; 44164348df5c9a4757e82b2a6b081b3537dfe37313bDan Gohman } 44272aaa3c79869870bd16402ed1f37b80a5e71c800Chris Lattner 44372aaa3c79869870bd16402ed1f37b80a5e71c800Chris Lattner MCSymbol *getMCSymbol() const { 44472aaa3c79869870bd16402ed1f37b80a5e71c800Chris Lattner assert(isMCSymbol() && "Wrong MachineOperand accessor"); 44572aaa3c79869870bd16402ed1f37b80a5e71c800Chris Lattner return Contents.Sym; 44672aaa3c79869870bd16402ed1f37b80a5e71c800Chris Lattner } 44785dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 44836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getCFIIndex() const { 44936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(isCFIIndex() && "Wrong MachineOperand accessor"); 45036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Contents.CFIIndex; 45136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 45236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 45336bf49c6b767dfa1dabb2900f25f1c33234d90e7Chris Lattner /// getOffset - Return the offset from the symbol in this operand. This always 45436bf49c6b767dfa1dabb2900f25f1c33234d90e7Chris Lattner /// returns 0 for ExternalSymbol operands. 4556520e20e4fb31f2e65e25c38b372b19d33a83df4Dan Gohman int64_t getOffset() const { 4560b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen assert((isGlobal() || isSymbol() || isCPI() || isTargetIndex() || 4570b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen isBlockAddress()) && "Wrong MachineOperand accessor"); 4581144af3c9b4da48cd581156e05b24261c8de366aRichard Smith return int64_t(uint64_t(Contents.OffsetedInfo.OffsetHi) << 32) | 4592594746045258958673ebe42db2a27a4d05b0b73Jakob Stoklund Olesen SmallContents.OffsetLo; 460103a64318bb716d68a4248996466900411d789beChris Lattner } 46185dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 462103a64318bb716d68a4248996466900411d789beChris Lattner const char *getSymbolName() const { 463d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(isSymbol() && "Wrong MachineOperand accessor"); 464a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner return Contents.OffsetedInfo.Val.SymbolName; 465103a64318bb716d68a4248996466900411d789beChris Lattner } 46668c3def12618f73ec237359cb07f8e9e68d50b3aDale Johannesen 467938200859ec714f59f8f93acceb999e212e9c539Jakob Stoklund Olesen /// clobbersPhysReg - Returns true if this RegMask clobbers PhysReg. 468938200859ec714f59f8f93acceb999e212e9c539Jakob Stoklund Olesen /// It is sometimes necessary to detach the register mask pointer from its 469938200859ec714f59f8f93acceb999e212e9c539Jakob Stoklund Olesen /// machine operand. This static method can be used for such detached bit 470f1deaff53b5ab02821a10ce561966b46aa0dda5eJakob Stoklund Olesen /// mask pointers. 471938200859ec714f59f8f93acceb999e212e9c539Jakob Stoklund Olesen static bool clobbersPhysReg(const uint32_t *RegMask, unsigned PhysReg) { 4727739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen // See TargetRegisterInfo.h. 4737739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen assert(PhysReg < (1u << 30) && "Not a physical register"); 474938200859ec714f59f8f93acceb999e212e9c539Jakob Stoklund Olesen return !(RegMask[PhysReg / 32] & (1u << PhysReg % 32)); 475938200859ec714f59f8f93acceb999e212e9c539Jakob Stoklund Olesen } 476938200859ec714f59f8f93acceb999e212e9c539Jakob Stoklund Olesen 477938200859ec714f59f8f93acceb999e212e9c539Jakob Stoklund Olesen /// clobbersPhysReg - Returns true if this RegMask operand clobbers PhysReg. 478938200859ec714f59f8f93acceb999e212e9c539Jakob Stoklund Olesen bool clobbersPhysReg(unsigned PhysReg) const { 479938200859ec714f59f8f93acceb999e212e9c539Jakob Stoklund Olesen return clobbersPhysReg(getRegMask(), PhysReg); 4807739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen } 4817739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen 4827739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen /// getRegMask - Returns a bit mask of registers preserved by this RegMask 483478a8a02bc0f2e739ed8f4240152e99837e480b9Jakob Stoklund Olesen /// operand. 4847739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen const uint32_t *getRegMask() const { 4857739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen assert(isRegMask() && "Wrong MachineOperand accessor"); 4867739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen return Contents.RegMask; 4877739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen } 4887739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen 48936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// getRegLiveOut - Returns a bit mask of live-out registers. 49036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const uint32_t *getRegLiveOut() const { 49136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(isRegLiveOut() && "Wrong MachineOperand accessor"); 49236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Contents.RegMask; 49336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 49436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4955f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesen const MDNode *getMetadata() const { 49668c3def12618f73ec237359cb07f8e9e68d50b3aDale Johannesen assert(isMetadata() && "Wrong MachineOperand accessor"); 49768c3def12618f73ec237359cb07f8e9e68d50b3aDale Johannesen return Contents.MD; 49868c3def12618f73ec237359cb07f8e9e68d50b3aDale Johannesen } 49985dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 500f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner //===--------------------------------------------------------------------===// 501f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner // Mutators for various operand types. 502f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner //===--------------------------------------------------------------------===// 50385dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 504103a64318bb716d68a4248996466900411d789beChris Lattner void setImm(int64_t immVal) { 505d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(isImm() && "Wrong MachineOperand mutator"); 506a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner Contents.ImmVal = immVal; 507103a64318bb716d68a4248996466900411d789beChris Lattner } 508103a64318bb716d68a4248996466900411d789beChris Lattner 5096520e20e4fb31f2e65e25c38b372b19d33a83df4Dan Gohman void setOffset(int64_t Offset) { 5100b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen assert((isGlobal() || isSymbol() || isCPI() || isTargetIndex() || 5110b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen isBlockAddress()) && "Wrong MachineOperand accessor"); 5122594746045258958673ebe42db2a27a4d05b0b73Jakob Stoklund Olesen SmallContents.OffsetLo = unsigned(Offset); 5132594746045258958673ebe42db2a27a4d05b0b73Jakob Stoklund Olesen Contents.OffsetedInfo.OffsetHi = int(Offset >> 32); 514103a64318bb716d68a4248996466900411d789beChris Lattner } 51585dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 516a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner void setIndex(int Idx) { 5170b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen assert((isFI() || isCPI() || isTargetIndex() || isJTI()) && 518a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner "Wrong MachineOperand accessor"); 519a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner Contents.OffsetedInfo.Val.Index = Idx; 520103a64318bb716d68a4248996466900411d789beChris Lattner } 52185dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 5228aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner void setMBB(MachineBasicBlock *MBB) { 523d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(isMBB() && "Wrong MachineOperand accessor"); 524a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner Contents.MBB = MBB; 525103a64318bb716d68a4248996466900411d789beChris Lattner } 52685dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 527f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner //===--------------------------------------------------------------------===// 528f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner // Other methods. 529f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner //===--------------------------------------------------------------------===// 53085dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 531103a64318bb716d68a4248996466900411d789beChris Lattner /// isIdenticalTo - Return true if this operand is identical to the specified 532103a64318bb716d68a4248996466900411d789beChris Lattner /// operand. Note: This method ignores isKill and isDead properties. 533103a64318bb716d68a4248996466900411d789beChris Lattner bool isIdenticalTo(const MachineOperand &Other) const; 53485dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 535d862d697d2d6f7d4e8fdd0b70686a6695e04d362Chandler Carruth /// \brief MachineOperand hash_value overload. 536d862d697d2d6f7d4e8fdd0b70686a6695e04d362Chandler Carruth /// 537d862d697d2d6f7d4e8fdd0b70686a6695e04d362Chandler Carruth /// Note that this includes the same information in the hash that 538d862d697d2d6f7d4e8fdd0b70686a6695e04d362Chandler Carruth /// isIdenticalTo uses for comparison. It is thus suited for use in hash 539d862d697d2d6f7d4e8fdd0b70686a6695e04d362Chandler Carruth /// tables which use that function for equality comparisons only. 540d862d697d2d6f7d4e8fdd0b70686a6695e04d362Chandler Carruth friend hash_code hash_value(const MachineOperand &MO); 541d862d697d2d6f7d4e8fdd0b70686a6695e04d362Chandler Carruth 542103a64318bb716d68a4248996466900411d789beChris Lattner /// ChangeToImmediate - Replace this operand with a new immediate operand of 543103a64318bb716d68a4248996466900411d789beChris Lattner /// the specified value. If an operand is known to be an immediate already, 544e3087890ac7f2fcf4697f8e09091e9a384311b9cChris Lattner /// the setImm method should be used. 54562ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner void ChangeToImmediate(int64_t ImmVal); 54685dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 547103a64318bb716d68a4248996466900411d789beChris Lattner /// ChangeToRegister - Replace this operand with a new register operand of 548103a64318bb716d68a4248996466900411d789beChris Lattner /// the specified value. If an operand is known to be an register already, 549103a64318bb716d68a4248996466900411d789beChris Lattner /// the setReg method should be used. 550103a64318bb716d68a4248996466900411d789beChris Lattner void ChangeToRegister(unsigned Reg, bool isDef, bool isImp = false, 5514784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng bool isKill = false, bool isDead = false, 5529653f9ec970147a12216d787078eab2f8b9c122aDale Johannesen bool isUndef = false, bool isDebug = false); 55385dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 554f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner //===--------------------------------------------------------------------===// 555f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner // Construction methods. 556f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner //===--------------------------------------------------------------------===// 55785dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 558103a64318bb716d68a4248996466900411d789beChris Lattner static MachineOperand CreateImm(int64_t Val) { 559a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner MachineOperand Op(MachineOperand::MO_Immediate); 560a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner Op.setImm(Val); 561103a64318bb716d68a4248996466900411d789beChris Lattner return Op; 562103a64318bb716d68a4248996466900411d789beChris Lattner } 56385dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 5648594d429e02c688d428036f8563f09572da3fbffDevang Patel static MachineOperand CreateCImm(const ConstantInt *CI) { 5658594d429e02c688d428036f8563f09572da3fbffDevang Patel MachineOperand Op(MachineOperand::MO_CImmediate); 5668594d429e02c688d428036f8563f09572da3fbffDevang Patel Op.Contents.CI = CI; 5678594d429e02c688d428036f8563f09572da3fbffDevang Patel return Op; 5688594d429e02c688d428036f8563f09572da3fbffDevang Patel } 5698594d429e02c688d428036f8563f09572da3fbffDevang Patel 5704fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman static MachineOperand CreateFPImm(const ConstantFP *CFP) { 571e8b7ccf0c9a06831266d690d0b10ead71e0a4ac5Nate Begeman MachineOperand Op(MachineOperand::MO_FPImmediate); 572e8b7ccf0c9a06831266d690d0b10ead71e0a4ac5Nate Begeman Op.Contents.CFP = CFP; 573e8b7ccf0c9a06831266d690d0b10ead71e0a4ac5Nate Begeman return Op; 574e8b7ccf0c9a06831266d690d0b10ead71e0a4ac5Nate Begeman } 57585dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 576103a64318bb716d68a4248996466900411d789beChris Lattner static MachineOperand CreateReg(unsigned Reg, bool isDef, bool isImp = false, 577103a64318bb716d68a4248996466900411d789beChris Lattner bool isKill = false, bool isDead = false, 5784784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng bool isUndef = false, 5794784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng bool isEarlyClobber = false, 580a65aa0f0bba1ef2322d63d05c074a92168684c63Dale Johannesen unsigned SubReg = 0, 5814efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooper bool isDebug = false, 5824efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooper bool isInternalRead = false) { 5833d238de4d54eb0b16afd96a57f49f92b2f7748e0Bill Wendling assert(!(isDead && !isDef) && "Dead flag on non-def"); 5843d238de4d54eb0b16afd96a57f49f92b2f7748e0Bill Wendling assert(!(isKill && isDef) && "Kill flag on def"); 585a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner MachineOperand Op(MachineOperand::MO_Register); 586103a64318bb716d68a4248996466900411d789beChris Lattner Op.IsDef = isDef; 587103a64318bb716d68a4248996466900411d789beChris Lattner Op.IsImp = isImp; 588103a64318bb716d68a4248996466900411d789beChris Lattner Op.IsKill = isKill; 589103a64318bb716d68a4248996466900411d789beChris Lattner Op.IsDead = isDead; 5904784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng Op.IsUndef = isUndef; 5914efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooper Op.IsInternalRead = isInternalRead; 592913d3dfac43f29921467f33aa743f28ee1bfc5d1Dale Johannesen Op.IsEarlyClobber = isEarlyClobber; 5939c130672761e006c47ea23b34a7bd414f2cd8368Jakob Stoklund Olesen Op.TiedTo = 0; 594a65aa0f0bba1ef2322d63d05c074a92168684c63Dale Johannesen Op.IsDebug = isDebug; 5952594746045258958673ebe42db2a27a4d05b0b73Jakob Stoklund Olesen Op.SmallContents.RegNo = Reg; 596dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Op.Contents.Reg.Prev = nullptr; 597dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Op.Contents.Reg.Next = nullptr; 598682106050979f0d48fcf17338c99e91672352789Jakob Stoklund Olesen Op.setSubReg(SubReg); 599103a64318bb716d68a4248996466900411d789beChris Lattner return Op; 600103a64318bb716d68a4248996466900411d789beChris Lattner } 6019a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner static MachineOperand CreateMBB(MachineBasicBlock *MBB, 6029a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) { 603a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner MachineOperand Op(MachineOperand::MO_MachineBasicBlock); 6048aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner Op.setMBB(MBB); 6059a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner Op.setTargetFlags(TargetFlags); 606103a64318bb716d68a4248996466900411d789beChris Lattner return Op; 607103a64318bb716d68a4248996466900411d789beChris Lattner } 6087fcbfe38d24fb556c231b24f226247a543e51c9dJim Grosbach static MachineOperand CreateFI(int Idx) { 609a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner MachineOperand Op(MachineOperand::MO_FrameIndex); 610a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner Op.setIndex(Idx); 611103a64318bb716d68a4248996466900411d789beChris Lattner return Op; 612103a64318bb716d68a4248996466900411d789beChris Lattner } 6139a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner static MachineOperand CreateCPI(unsigned Idx, int Offset, 6149a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) { 615a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner MachineOperand Op(MachineOperand::MO_ConstantPoolIndex); 616a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner Op.setIndex(Idx); 617a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner Op.setOffset(Offset); 6189a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner Op.setTargetFlags(TargetFlags); 619103a64318bb716d68a4248996466900411d789beChris Lattner return Op; 620103a64318bb716d68a4248996466900411d789beChris Lattner } 6210b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen static MachineOperand CreateTargetIndex(unsigned Idx, int64_t Offset, 6220b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen unsigned char TargetFlags = 0) { 6230b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen MachineOperand Op(MachineOperand::MO_TargetIndex); 6240b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen Op.setIndex(Idx); 6250b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen Op.setOffset(Offset); 6260b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen Op.setTargetFlags(TargetFlags); 6270b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen return Op; 6280b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen } 6299a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner static MachineOperand CreateJTI(unsigned Idx, 6309a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) { 631a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner MachineOperand Op(MachineOperand::MO_JumpTableIndex); 632a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner Op.setIndex(Idx); 6339a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner Op.setTargetFlags(TargetFlags); 634103a64318bb716d68a4248996466900411d789beChris Lattner return Op; 635103a64318bb716d68a4248996466900411d789beChris Lattner } 63646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman static MachineOperand CreateGA(const GlobalValue *GV, int64_t Offset, 6379a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) { 638a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner MachineOperand Op(MachineOperand::MO_GlobalAddress); 639a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner Op.Contents.OffsetedInfo.Val.GV = GV; 640a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner Op.setOffset(Offset); 6419a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner Op.setTargetFlags(TargetFlags); 6426d9148ce3d42a3f81c2828754a720278061c7aa7Devang Patel return Op; 6436d9148ce3d42a3f81c2828754a720278061c7aa7Devang Patel } 64431e2c7b4c13c2f31774614b1124533628958d0cdDaniel Dunbar static MachineOperand CreateES(const char *SymName, 6459a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) { 646a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner MachineOperand Op(MachineOperand::MO_ExternalSymbol); 647a29b8aac900c7209d6ff178493e96ffa60137170Chris Lattner Op.Contents.OffsetedInfo.Val.SymbolName = SymName; 64831e2c7b4c13c2f31774614b1124533628958d0cdDaniel Dunbar Op.setOffset(0); // Offset is always 0. 6499a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner Op.setTargetFlags(TargetFlags); 650103a64318bb716d68a4248996466900411d789beChris Lattner return Op; 651103a64318bb716d68a4248996466900411d789beChris Lattner } 6526c7ccaa3fd1d6e96d0bf922554b09d2b17c3b0e3Michael Liao static MachineOperand CreateBA(const BlockAddress *BA, int64_t Offset, 65329cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman unsigned char TargetFlags = 0) { 65464348df5c9a4757e82b2a6b081b3537dfe37313bDan Gohman MachineOperand Op(MachineOperand::MO_BlockAddress); 65564348df5c9a4757e82b2a6b081b3537dfe37313bDan Gohman Op.Contents.OffsetedInfo.Val.BA = BA; 6566c7ccaa3fd1d6e96d0bf922554b09d2b17c3b0e3Michael Liao Op.setOffset(Offset); 65729cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman Op.setTargetFlags(TargetFlags); 65864348df5c9a4757e82b2a6b081b3537dfe37313bDan Gohman return Op; 65964348df5c9a4757e82b2a6b081b3537dfe37313bDan Gohman } 6607739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen /// CreateRegMask - Creates a register mask operand referencing Mask. The 6617739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen /// operand does not take ownership of the memory referenced by Mask, it must 6627739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen /// remain valid for the lifetime of the operand. 6637739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen /// 6647739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen /// A RegMask operand represents a set of non-clobbered physical registers on 6657739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen /// an instruction that clobbers many registers, typically a call. The bit 6667739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen /// mask has a bit set for each physreg that is preserved by this 6677739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen /// instruction, as described in the documentation for 6687739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen /// TargetRegisterInfo::getCallPreservedMask(). 6697739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen /// 6707739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen /// Any physreg with a 0 bit in the mask is clobbered by the instruction. 6717739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen /// 6727739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen static MachineOperand CreateRegMask(const uint32_t *Mask) { 673478a8a02bc0f2e739ed8f4240152e99837e480b9Jakob Stoklund Olesen assert(Mask && "Missing register mask"); 6747739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen MachineOperand Op(MachineOperand::MO_RegisterMask); 6757739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen Op.Contents.RegMask = Mask; 6767739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen return Op; 6777739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen } 67836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines static MachineOperand CreateRegLiveOut(const uint32_t *Mask) { 67936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Mask && "Missing live-out register mask"); 68036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineOperand Op(MachineOperand::MO_RegisterLiveOut); 68136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op.Contents.RegMask = Mask; 68236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Op; 68336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 68491c38417cf11ce56b13a7434de76306f665c88c5Dale Johannesen static MachineOperand CreateMetadata(const MDNode *Meta) { 68568c3def12618f73ec237359cb07f8e9e68d50b3aDale Johannesen MachineOperand Op(MachineOperand::MO_Metadata); 68668c3def12618f73ec237359cb07f8e9e68d50b3aDale Johannesen Op.Contents.MD = Meta; 68768c3def12618f73ec237359cb07f8e9e68d50b3aDale Johannesen return Op; 68868c3def12618f73ec237359cb07f8e9e68d50b3aDale Johannesen } 689103a64318bb716d68a4248996466900411d789beChris Lattner 69072aaa3c79869870bd16402ed1f37b80a5e71c800Chris Lattner static MachineOperand CreateMCSymbol(MCSymbol *Sym) { 69172aaa3c79869870bd16402ed1f37b80a5e71c800Chris Lattner MachineOperand Op(MachineOperand::MO_MCSymbol); 69272aaa3c79869870bd16402ed1f37b80a5e71c800Chris Lattner Op.Contents.Sym = Sym; 69372aaa3c79869870bd16402ed1f37b80a5e71c800Chris Lattner return Op; 69472aaa3c79869870bd16402ed1f37b80a5e71c800Chris Lattner } 69585dbce31d02894233f8cfd15a5cc08f2d3fba3ebJim Grosbach 69636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines static MachineOperand CreateCFIIndex(unsigned CFIIndex) { 69736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineOperand Op(MachineOperand::MO_CFIIndex); 69836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Op.Contents.CFIIndex = CFIIndex; 69936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Op; 70036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 70136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 702103a64318bb716d68a4248996466900411d789beChris Lattner friend class MachineInstr; 70362ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner friend class MachineRegisterInfo; 70462ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattnerprivate: 70562ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner //===--------------------------------------------------------------------===// 70662ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner // Methods for handling register use/def lists. 70762ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner //===--------------------------------------------------------------------===// 70862ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner 70962ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner /// isOnRegUseList - Return true if this operand is on a register use/def list 71062ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner /// or false if not. This can only be called for register operands that are 71162ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner /// part of a machine instruction. 71262ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner bool isOnRegUseList() const { 713d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(isReg() && "Can only add reg operand to use lists"); 714dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return Contents.Reg.Prev != nullptr; 71562ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner } 716103a64318bb716d68a4248996466900411d789beChris Lattner}; 717103a64318bb716d68a4248996466900411d789beChris Lattner 718cb3718832375a581c5ea23f15918f3ea447a446cOwen Andersoninline raw_ostream &operator<<(raw_ostream &OS, const MachineOperand& MO) { 719dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MO.print(OS, nullptr); 720cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson return OS; 721cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson} 722cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson 7233a9b71434cda6f66d65a031effec1bbe58e1dda3Rafael Espindola // See friend declaration above. This additional declaration is required in 7243a9b71434cda6f66d65a031effec1bbe58e1dda3Rafael Espindola // order to compile LLVM with IBM xlC compiler. 7253a9b71434cda6f66d65a031effec1bbe58e1dda3Rafael Espindola hash_code hash_value(const MachineOperand &MO); 726103a64318bb716d68a4248996466900411d789beChris Lattner} // End llvm namespace 727103a64318bb716d68a4248996466900411d789beChris Lattner 728103a64318bb716d68a4248996466900411d789beChris Lattner#endif 729