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