1f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===-- llvm/CodeGen/MachineOperand.h - MachineOperand class ----*- C++ -*-===// 2f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 3f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// The LLVM Compiler Infrastructure 4f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 5f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// This file is distributed under the University of Illinois Open Source 6f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// License. See LICENSE.TXT for details. 7f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 8f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===----------------------------------------------------------------------===// 9f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 10f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// This file contains the declaration of the MachineOperand class. 11f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 12f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===----------------------------------------------------------------------===// 13f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 14f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#ifndef LLVM_CODEGEN_MACHINEOPERAND_H 15f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#define LLVM_CODEGEN_MACHINEOPERAND_H 16f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 17f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/DenseMap.h" 18f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/IR/Intrinsics.h" 19f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/Support/DataTypes.h" 20f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <cassert> 21f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 22f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotnamespace llvm { 23f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 24f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass BlockAddress; 25f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ConstantFP; 26f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ConstantInt; 27f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass GlobalValue; 28f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MachineBasicBlock; 29f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MachineInstr; 30f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MachineRegisterInfo; 31f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MDNode; 32f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass ModuleSlotTracker; 33f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass TargetMachine; 34f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass TargetIntrinsicInfo; 35f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass TargetRegisterInfo; 36f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass hash_code; 37f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass raw_ostream; 38f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MCSymbol; 39f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 40f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// MachineOperand class - Representation of each machine instruction operand. 41f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 42f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// This class isn't a POD type because it has a private constructor, but its 43f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// destructor must be trivial. Functions like MachineInstr::addOperand(), 44f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// MachineRegisterInfo::moveOperands(), and MF::DeleteMachineInstr() depend on 45f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// not having to call the MachineOperand destructor. 46f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 47f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MachineOperand { 48f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 49f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot enum MachineOperandType : unsigned char { 50f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_Register, ///< Register operand. 51f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_Immediate, ///< Immediate operand 52f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_CImmediate, ///< Immediate >64bit operand 53f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_FPImmediate, ///< Floating-point immediate operand 54f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_MachineBasicBlock, ///< MachineBasicBlock reference 55f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_FrameIndex, ///< Abstract Stack Frame Index 56f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_ConstantPoolIndex, ///< Address of indexed Constant in Constant Pool 57f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_TargetIndex, ///< Target-dependent index+offset operand. 58f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_JumpTableIndex, ///< Address of indexed Jump Table for switch 59f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_ExternalSymbol, ///< Name of external global symbol 60f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_GlobalAddress, ///< Address of a global value 61f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_BlockAddress, ///< Address of a basic block 62f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_RegisterMask, ///< Mask of preserved registers. 63f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_RegisterLiveOut, ///< Mask of live-out registers. 64f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_Metadata, ///< Metadata reference (for debug info) 65f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_MCSymbol, ///< MCSymbol reference (for debug/eh info) 66f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_CFIIndex, ///< MCCFIInstruction index. 67f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_IntrinsicID, ///< Intrinsic ID for ISel 68f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_Predicate, ///< Generic predicate for ISel 69f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_Last = MO_Predicate, 70f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 71f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 72f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate: 73f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// OpKind - Specify what kind of operand this is. This discriminates the 74f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// union. 75f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperandType OpKind : 8; 76f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 77f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Subregister number for MO_Register. A value of 0 indicates the 78f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// MO_Register has no subReg. 79f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 80f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// For all other kinds of operands, this field holds target-specific flags. 81f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned SubReg_TargetFlags : 12; 82f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 83f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// TiedTo - Non-zero when this register operand is tied to another register 84f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// operand. The encoding of this field is described in the block comment 85f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// before MachineInstr::tieOperands(). 86f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned char TiedTo : 4; 87f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 88f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// IsDef/IsImp/IsKill/IsDead flags - These are only valid for MO_Register 89f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// operands. 90f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 91f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// IsDef - True if this is a def, false if this is a use of the register. 92f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 93f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool IsDef : 1; 94f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 95f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// IsImp - True if this is an implicit def or use, false if it is explicit. 96f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 97f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool IsImp : 1; 98f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 99f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// IsKill - True if this instruction is the last use of the register on this 100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// path through the function. This is only valid on uses of registers. 101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool IsKill : 1; 102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// IsDead - True if this register is never used by a subsequent instruction. 104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// This is only valid on definitions of registers. 105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool IsDead : 1; 106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// IsUndef - True if this register operand reads an "undef" value, i.e. the 108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// read value doesn't matter. This flag can be set on both use and def 109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// operands. On a sub-register def operand, it refers to the part of the 110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// register that isn't written. On a full-register def operand, it is a 111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// noop. See readsReg(). 112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// This is only valid on registers. 114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Note that an instruction may have multiple <undef> operands referring to 116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the same register. In that case, the instruction may depend on those 117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// operands reading the same dont-care value. For example: 118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// %vreg1<def> = XOR %vreg2<undef>, %vreg2<undef> 120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Any register can be used for %vreg2, and its value doesn't matter, but 122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the two operands must be the same register. 123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool IsUndef : 1; 125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// IsInternalRead - True if this operand reads a value that was defined 127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// inside the same instruction or bundle. This flag can be set on both use 128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// and def operands. On a sub-register def operand, it refers to the part 129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// of the register that isn't written. On a full-register def operand, it 130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// is a noop. 131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// When this flag is set, the instruction bundle must contain at least one 133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// other def of the register. If multiple instructions in the bundle define 134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the register, the meaning is target-defined. 135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool IsInternalRead : 1; 136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// IsEarlyClobber - True if this MO_Register 'def' operand is written to 138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// by the MachineInstr before all input registers are read. This is used to 139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// model the GCC inline asm '&' constraint modifier. 140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool IsEarlyClobber : 1; 141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// IsDebug - True if this MO_Register 'use' operand is in a debug pseudo, 143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// not a real instruction. Such uses should be ignored during codegen. 144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool IsDebug : 1; 145f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// SmallContents - This really should be part of the Contents union, but 147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// lives out here so we can get a better packed struct. 148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// MO_Register: Register number. 149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// OffsetedInfo: Low bits of offset. 150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot union { 151f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned RegNo; // For MO_Register. 152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned OffsetLo; // Matches Contents.OffsetedInfo.OffsetHi. 153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } SmallContents; 154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// ParentMI - This is the instruction that this operand is embedded into. 156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// This is valid for all operand types, when the operand is in an instr. 157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineInstr *ParentMI; 158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Contents union - This contains the payload for the various operand types. 160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot union { 161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineBasicBlock *MBB; // For MO_MachineBasicBlock. 162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const ConstantFP *CFP; // For MO_FPImmediate. 163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const ConstantInt *CI; // For MO_CImmediate. Integers > 64bit. 164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot int64_t ImmVal; // For MO_Immediate. 165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const uint32_t *RegMask; // For MO_RegisterMask and MO_RegisterLiveOut. 166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const MDNode *MD; // For MO_Metadata. 167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSymbol *Sym; // For MO_MCSymbol. 168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned CFIIndex; // For MO_CFI. 169f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Intrinsic::ID IntrinsicID; // For MO_IntrinsicID. 170f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Pred; // For MO_Predicate 171f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 172f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot struct { // For MO_Register. 173f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Register number is in SmallContents.RegNo. 174f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand *Prev; // Access list for register. See MRI. 175f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand *Next; 176f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } Reg; 177f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 178f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// OffsetedInfo - This struct contains the offset and an object identifier. 179f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// this represent the object as with an optional offset from it. 180f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot struct { 181f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot union { 182f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot int Index; // For MO_*Index - The index itself. 183f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const char *SymbolName; // For MO_ExternalSymbol. 184f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const GlobalValue *GV; // For MO_GlobalAddress. 185f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const BlockAddress *BA; // For MO_BlockAddress. 186f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } Val; 187f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Low bits of offset are in SmallContents.OffsetLo. 188f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot int OffsetHi; // An offset from the object, high 32 bits. 189f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } OffsetedInfo; 190f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } Contents; 191f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 192f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot explicit MachineOperand(MachineOperandType K) 193f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : OpKind(K), SubReg_TargetFlags(0), ParentMI(nullptr) {} 194f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 195f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// getType - Returns the MachineOperandType for this operand. 196f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 197f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperandType getType() const { return (MachineOperandType)OpKind; } 198f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 199f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned getTargetFlags() const { 200f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return isReg() ? 0 : SubReg_TargetFlags; 201f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 202f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setTargetFlags(unsigned F) { 203f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(!isReg() && "Register operands can't have target flags"); 204f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SubReg_TargetFlags = F; 205f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(SubReg_TargetFlags == F && "Target flags out of range"); 206f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 207f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void addTargetFlag(unsigned F) { 208f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(!isReg() && "Register operands can't have target flags"); 209f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SubReg_TargetFlags |= F; 210f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert((SubReg_TargetFlags & F) && "Target flags out of range"); 211f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 212f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 213f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 214f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// getParent - Return the instruction that this operand belongs to. 215f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 216f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineInstr *getParent() { return ParentMI; } 217f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const MachineInstr *getParent() const { return ParentMI; } 218f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 219f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// clearParent - Reset the parent pointer. 220f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 221f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The MachineOperand copy constructor also copies ParentMI, expecting the 222f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// original to be deleted. If a MachineOperand is ever stored outside a 223f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// MachineInstr, the parent pointer must be cleared. 224f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 225f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Never call clearParent() on an operand in a MachineInstr. 226f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 227f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void clearParent() { ParentMI = nullptr; } 228f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 229f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void print(raw_ostream &os, const TargetRegisterInfo *TRI = nullptr, 230f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const TargetIntrinsicInfo *IntrinsicInfo = nullptr) const; 231f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void print(raw_ostream &os, ModuleSlotTracker &MST, 232f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const TargetRegisterInfo *TRI = nullptr, 233f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const TargetIntrinsicInfo *IntrinsicInfo = nullptr) const; 234f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void dump() const; 235f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 236f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===--------------------------------------------------------------------===// 237f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Accessors that tell you what kind of MachineOperand you're looking at. 238f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===--------------------------------------------------------------------===// 239f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 240f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// isReg - Tests if this is a MO_Register operand. 241f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isReg() const { return OpKind == MO_Register; } 242f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// isImm - Tests if this is a MO_Immediate operand. 243f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isImm() const { return OpKind == MO_Immediate; } 244f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// isCImm - Test if this is a MO_CImmediate operand. 245f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isCImm() const { return OpKind == MO_CImmediate; } 246f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// isFPImm - Tests if this is a MO_FPImmediate operand. 247f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isFPImm() const { return OpKind == MO_FPImmediate; } 248f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// isMBB - Tests if this is a MO_MachineBasicBlock operand. 249f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isMBB() const { return OpKind == MO_MachineBasicBlock; } 250f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// isFI - Tests if this is a MO_FrameIndex operand. 251f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isFI() const { return OpKind == MO_FrameIndex; } 252f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// isCPI - Tests if this is a MO_ConstantPoolIndex operand. 253f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isCPI() const { return OpKind == MO_ConstantPoolIndex; } 254f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// isTargetIndex - Tests if this is a MO_TargetIndex operand. 255f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isTargetIndex() const { return OpKind == MO_TargetIndex; } 256f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// isJTI - Tests if this is a MO_JumpTableIndex operand. 257f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isJTI() const { return OpKind == MO_JumpTableIndex; } 258f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// isGlobal - Tests if this is a MO_GlobalAddress operand. 259f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isGlobal() const { return OpKind == MO_GlobalAddress; } 260f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// isSymbol - Tests if this is a MO_ExternalSymbol operand. 261f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isSymbol() const { return OpKind == MO_ExternalSymbol; } 262f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// isBlockAddress - Tests if this is a MO_BlockAddress operand. 263f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isBlockAddress() const { return OpKind == MO_BlockAddress; } 264f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// isRegMask - Tests if this is a MO_RegisterMask operand. 265f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isRegMask() const { return OpKind == MO_RegisterMask; } 266f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// isRegLiveOut - Tests if this is a MO_RegisterLiveOut operand. 267f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isRegLiveOut() const { return OpKind == MO_RegisterLiveOut; } 268f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// isMetadata - Tests if this is a MO_Metadata operand. 269f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isMetadata() const { return OpKind == MO_Metadata; } 270f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isMCSymbol() const { return OpKind == MO_MCSymbol; } 271f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isCFIIndex() const { return OpKind == MO_CFIIndex; } 272f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isIntrinsicID() const { return OpKind == MO_IntrinsicID; } 273f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isPredicate() const { return OpKind == MO_Predicate; } 274f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===--------------------------------------------------------------------===// 275f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Accessors for Register Operands 276f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===--------------------------------------------------------------------===// 277f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 278f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// getReg - Returns the register number. 279f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned getReg() const { 280f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && "This is not a register operand!"); 281f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return SmallContents.RegNo; 282f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 283f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 284f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned getSubReg() const { 285f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && "Wrong MachineOperand accessor"); 286f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return SubReg_TargetFlags; 287f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 288f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 289f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isUse() const { 290f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && "Wrong MachineOperand accessor"); 291f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return !IsDef; 292f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 293f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 294f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isDef() const { 295f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && "Wrong MachineOperand accessor"); 296f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return IsDef; 297f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 298f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 299f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isImplicit() const { 300f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && "Wrong MachineOperand accessor"); 301f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return IsImp; 302f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 303f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 304f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isDead() const { 305f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && "Wrong MachineOperand accessor"); 306f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return IsDead; 307f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 308f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 309f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isKill() const { 310f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && "Wrong MachineOperand accessor"); 311f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return IsKill; 312f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 313f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 314f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isUndef() const { 315f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && "Wrong MachineOperand accessor"); 316f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return IsUndef; 317f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 318f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 319f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isInternalRead() const { 320f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && "Wrong MachineOperand accessor"); 321f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return IsInternalRead; 322f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 323f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 324f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isEarlyClobber() const { 325f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && "Wrong MachineOperand accessor"); 326f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return IsEarlyClobber; 327f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 328f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 329f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isTied() const { 330f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && "Wrong MachineOperand accessor"); 331f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return TiedTo; 332f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 333f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 334f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isDebug() const { 335f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && "Wrong MachineOperand accessor"); 336f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return IsDebug; 337f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 338f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 339f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// readsReg - Returns true if this operand reads the previous value of its 340f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// register. A use operand with the <undef> flag set doesn't read its 341f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// register. A sub-register def implicitly reads the other parts of the 342f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// register being redefined unless the <undef> flag is set. 343f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 344f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// This refers to reading the register value from before the current 345f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// instruction or bundle. Internal bundle reads are not included. 346f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool readsReg() const { 347f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && "Wrong MachineOperand accessor"); 348f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return !isUndef() && !isInternalRead() && (isUse() || getSubReg()); 349f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 350f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 351f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===--------------------------------------------------------------------===// 352f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Mutators for Register Operands 353f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===--------------------------------------------------------------------===// 354f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 355f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Change the register this operand corresponds to. 356f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 357f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setReg(unsigned Reg); 358f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 359f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setSubReg(unsigned subReg) { 360f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && "Wrong MachineOperand mutator"); 361f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SubReg_TargetFlags = subReg; 362f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(SubReg_TargetFlags == subReg && "SubReg out of range"); 363f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 364f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 365f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// substVirtReg - Substitute the current register with the virtual 366f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// subregister Reg:SubReg. Take any existing SubReg index into account, 367f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// using TargetRegisterInfo to compose the subreg indices if necessary. 368f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Reg must be a virtual register, SubIdx can be 0. 369f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 370f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void substVirtReg(unsigned Reg, unsigned SubIdx, const TargetRegisterInfo&); 371f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 372f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// substPhysReg - Substitute the current register with the physical register 373f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Reg, taking any existing SubReg into account. For instance, 374f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// substPhysReg(%EAX) will change %reg1024:sub_8bit to %AL. 375f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 376f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void substPhysReg(unsigned Reg, const TargetRegisterInfo&); 377f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 378f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setIsUse(bool Val = true) { setIsDef(!Val); } 379f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 380f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setIsDef(bool Val = true); 381f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 382f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setImplicit(bool Val = true) { 383f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && "Wrong MachineOperand mutator"); 384f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot IsImp = Val; 385f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 386f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 387f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setIsKill(bool Val = true) { 388f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && !IsDef && "Wrong MachineOperand mutator"); 389f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert((!Val || !isDebug()) && "Marking a debug operation as kill"); 390f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot IsKill = Val; 391f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 392f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 393f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setIsDead(bool Val = true) { 394f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && IsDef && "Wrong MachineOperand mutator"); 395f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot IsDead = Val; 396f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 397f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 398f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setIsUndef(bool Val = true) { 399f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && "Wrong MachineOperand mutator"); 400f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot IsUndef = Val; 401f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 402f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 403f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setIsInternalRead(bool Val = true) { 404f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && "Wrong MachineOperand mutator"); 405f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot IsInternalRead = Val; 406f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 407f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 408f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setIsEarlyClobber(bool Val = true) { 409f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && IsDef && "Wrong MachineOperand mutator"); 410f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot IsEarlyClobber = Val; 411f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 412f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 413f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setIsDebug(bool Val = true) { 414f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && !IsDef && "Wrong MachineOperand mutator"); 415f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot IsDebug = Val; 416f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 417f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 418f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===--------------------------------------------------------------------===// 419f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Accessors for various operand types. 420f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===--------------------------------------------------------------------===// 421f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 422f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot int64_t getImm() const { 423f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isImm() && "Wrong MachineOperand accessor"); 424f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Contents.ImmVal; 425f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 426f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 427f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const ConstantInt *getCImm() const { 428f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isCImm() && "Wrong MachineOperand accessor"); 429f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Contents.CI; 430f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 431f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 432f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const ConstantFP *getFPImm() const { 433f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isFPImm() && "Wrong MachineOperand accessor"); 434f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Contents.CFP; 435f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 436f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 437f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineBasicBlock *getMBB() const { 438f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isMBB() && "Wrong MachineOperand accessor"); 439f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Contents.MBB; 440f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 441f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 442f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot int getIndex() const { 443f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert((isFI() || isCPI() || isTargetIndex() || isJTI()) && 444f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot "Wrong MachineOperand accessor"); 445f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Contents.OffsetedInfo.Val.Index; 446f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 447f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 448f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const GlobalValue *getGlobal() const { 449f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isGlobal() && "Wrong MachineOperand accessor"); 450f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Contents.OffsetedInfo.Val.GV; 451f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 452f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 453f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const BlockAddress *getBlockAddress() const { 454f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isBlockAddress() && "Wrong MachineOperand accessor"); 455f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Contents.OffsetedInfo.Val.BA; 456f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 457f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 458f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MCSymbol *getMCSymbol() const { 459f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isMCSymbol() && "Wrong MachineOperand accessor"); 460f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Contents.Sym; 461f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 462f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 463f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned getCFIIndex() const { 464f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isCFIIndex() && "Wrong MachineOperand accessor"); 465f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Contents.CFIIndex; 466f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 467f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 468f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Intrinsic::ID getIntrinsicID() const { 469f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isIntrinsicID() && "Wrong MachineOperand accessor"); 470f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Contents.IntrinsicID; 471f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 472f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 473f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned getPredicate() const { 474f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isPredicate() && "Wrong MachineOperand accessor"); 475f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Contents.Pred; 476f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 477f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 478f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return the offset from the symbol in this operand. This always returns 0 479f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// for ExternalSymbol operands. 480f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot int64_t getOffset() const { 481f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert((isGlobal() || isSymbol() || isMCSymbol() || isCPI() || 482f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot isTargetIndex() || isBlockAddress()) && 483f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot "Wrong MachineOperand accessor"); 484f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return int64_t(uint64_t(Contents.OffsetedInfo.OffsetHi) << 32) | 485f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SmallContents.OffsetLo; 486f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 487f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 488f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const char *getSymbolName() const { 489f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isSymbol() && "Wrong MachineOperand accessor"); 490f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Contents.OffsetedInfo.Val.SymbolName; 491f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 492f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 493f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// clobbersPhysReg - Returns true if this RegMask clobbers PhysReg. 494f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// It is sometimes necessary to detach the register mask pointer from its 495f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// machine operand. This static method can be used for such detached bit 496f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// mask pointers. 497f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool clobbersPhysReg(const uint32_t *RegMask, unsigned PhysReg) { 498f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // See TargetRegisterInfo.h. 499f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(PhysReg < (1u << 30) && "Not a physical register"); 500f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return !(RegMask[PhysReg / 32] & (1u << PhysReg % 32)); 501f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 502f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 503f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// clobbersPhysReg - Returns true if this RegMask operand clobbers PhysReg. 504f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool clobbersPhysReg(unsigned PhysReg) const { 505f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return clobbersPhysReg(getRegMask(), PhysReg); 506f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 507f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 508f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// getRegMask - Returns a bit mask of registers preserved by this RegMask 509f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// operand. 510f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const uint32_t *getRegMask() const { 511f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isRegMask() && "Wrong MachineOperand accessor"); 512f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Contents.RegMask; 513f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 514f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 515f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// getRegLiveOut - Returns a bit mask of live-out registers. 516f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const uint32_t *getRegLiveOut() const { 517f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isRegLiveOut() && "Wrong MachineOperand accessor"); 518f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Contents.RegMask; 519f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 520f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 521f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const MDNode *getMetadata() const { 522f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isMetadata() && "Wrong MachineOperand accessor"); 523f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Contents.MD; 524f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 525f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 526f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===--------------------------------------------------------------------===// 527f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Mutators for various operand types. 528f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===--------------------------------------------------------------------===// 529f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 530f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setImm(int64_t immVal) { 531f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isImm() && "Wrong MachineOperand mutator"); 532f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Contents.ImmVal = immVal; 533f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 534f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 535f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setFPImm(const ConstantFP *CFP) { 536f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isFPImm() && "Wrong MachineOperand mutator"); 537f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Contents.CFP = CFP; 538f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 539f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 540f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setOffset(int64_t Offset) { 541f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert((isGlobal() || isSymbol() || isMCSymbol() || isCPI() || 542f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot isTargetIndex() || isBlockAddress()) && 543f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot "Wrong MachineOperand mutator"); 544f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SmallContents.OffsetLo = unsigned(Offset); 545f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Contents.OffsetedInfo.OffsetHi = int(Offset >> 32); 546f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 547f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 548f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setIndex(int Idx) { 549f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert((isFI() || isCPI() || isTargetIndex() || isJTI()) && 550f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot "Wrong MachineOperand mutator"); 551f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Contents.OffsetedInfo.Val.Index = Idx; 552f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 553f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 554f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setMetadata(const MDNode *MD) { 555f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isMetadata() && "Wrong MachineOperand mutator"); 556f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Contents.MD = MD; 557f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 558f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 559f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setMBB(MachineBasicBlock *MBB) { 560f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isMBB() && "Wrong MachineOperand mutator"); 561f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Contents.MBB = MBB; 562f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 563f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 564f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Sets value of register mask operand referencing Mask. The 565f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// operand does not take ownership of the memory referenced by Mask, it must 566f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// remain valid for the lifetime of the operand. See CreateRegMask(). 567f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Any physreg with a 0 bit in the mask is clobbered by the instruction. 568f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setRegMask(const uint32_t *RegMaskPtr) { 569f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isRegMask() && "Wrong MachineOperand mutator"); 570f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Contents.RegMask = RegMaskPtr; 571f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 572f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 573f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===--------------------------------------------------------------------===// 574f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Other methods. 575f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===--------------------------------------------------------------------===// 576f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 577f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Returns true if this operand is identical to the specified operand except 578f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// for liveness related flags (isKill, isUndef and isDead). 579f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isIdenticalTo(const MachineOperand &Other) const; 580f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 581f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief MachineOperand hash_value overload. 582f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 583f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Note that this includes the same information in the hash that 584f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// isIdenticalTo uses for comparison. It is thus suited for use in hash 585f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// tables which use that function for equality comparisons only. 586f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot friend hash_code hash_value(const MachineOperand &MO); 587f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 588f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// ChangeToImmediate - Replace this operand with a new immediate operand of 589f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the specified value. If an operand is known to be an immediate already, 590f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the setImm method should be used. 591f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void ChangeToImmediate(int64_t ImmVal); 592f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 593f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// ChangeToFPImmediate - Replace this operand with a new FP immediate operand 594f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// of the specified value. If an operand is known to be an FP immediate 595f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// already, the setFPImm method should be used. 596f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void ChangeToFPImmediate(const ConstantFP *FPImm); 597f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 598f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// ChangeToES - Replace this operand with a new external symbol operand. 599f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void ChangeToES(const char *SymName, unsigned char TargetFlags = 0); 600f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 601f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// ChangeToMCSymbol - Replace this operand with a new MC symbol operand. 602f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void ChangeToMCSymbol(MCSymbol *Sym); 603f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 604f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Replace this operand with a frame index. 605f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void ChangeToFrameIndex(int Idx); 606f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 607f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Replace this operand with a target index. 608f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void ChangeToTargetIndex(unsigned Idx, int64_t Offset, 609f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned char TargetFlags = 0); 610f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 611f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// ChangeToRegister - Replace this operand with a new register operand of 612f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the specified value. If an operand is known to be an register already, 613f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the setReg method should be used. 614f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void ChangeToRegister(unsigned Reg, bool isDef, bool isImp = false, 615f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isKill = false, bool isDead = false, 616f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isUndef = false, bool isDebug = false); 617f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 618f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===--------------------------------------------------------------------===// 619f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Construction methods. 620f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===--------------------------------------------------------------------===// 621f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 622f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static MachineOperand CreateImm(int64_t Val) { 623f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand Op(MachineOperand::MO_Immediate); 624f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.setImm(Val); 625f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Op; 626f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 627f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 628f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static MachineOperand CreateCImm(const ConstantInt *CI) { 629f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand Op(MachineOperand::MO_CImmediate); 630f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.Contents.CI = CI; 631f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Op; 632f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 633f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 634f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static MachineOperand CreateFPImm(const ConstantFP *CFP) { 635f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand Op(MachineOperand::MO_FPImmediate); 636f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.Contents.CFP = CFP; 637f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Op; 638f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 639f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 640f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static MachineOperand CreateReg(unsigned Reg, bool isDef, bool isImp = false, 641f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isKill = false, bool isDead = false, 642f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isUndef = false, 643f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isEarlyClobber = false, 644f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned SubReg = 0, 645f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isDebug = false, 646f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isInternalRead = false) { 647f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(!(isDead && !isDef) && "Dead flag on non-def"); 648f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(!(isKill && isDef) && "Kill flag on def"); 649f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand Op(MachineOperand::MO_Register); 650f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.IsDef = isDef; 651f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.IsImp = isImp; 652f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.IsKill = isKill; 653f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.IsDead = isDead; 654f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.IsUndef = isUndef; 655f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.IsInternalRead = isInternalRead; 656f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.IsEarlyClobber = isEarlyClobber; 657f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.TiedTo = 0; 658f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.IsDebug = isDebug; 659f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.SmallContents.RegNo = Reg; 660f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.Contents.Reg.Prev = nullptr; 661f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.Contents.Reg.Next = nullptr; 662f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.setSubReg(SubReg); 663f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Op; 664f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 665f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static MachineOperand CreateMBB(MachineBasicBlock *MBB, 666f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned char TargetFlags = 0) { 667f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand Op(MachineOperand::MO_MachineBasicBlock); 668f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.setMBB(MBB); 669f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.setTargetFlags(TargetFlags); 670f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Op; 671f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 672f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static MachineOperand CreateFI(int Idx) { 673f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand Op(MachineOperand::MO_FrameIndex); 674f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.setIndex(Idx); 675f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Op; 676f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 677f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static MachineOperand CreateCPI(unsigned Idx, int Offset, 678f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned char TargetFlags = 0) { 679f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand Op(MachineOperand::MO_ConstantPoolIndex); 680f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.setIndex(Idx); 681f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.setOffset(Offset); 682f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.setTargetFlags(TargetFlags); 683f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Op; 684f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 685f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static MachineOperand CreateTargetIndex(unsigned Idx, int64_t Offset, 686f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned char TargetFlags = 0) { 687f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand Op(MachineOperand::MO_TargetIndex); 688f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.setIndex(Idx); 689f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.setOffset(Offset); 690f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.setTargetFlags(TargetFlags); 691f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Op; 692f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 693f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static MachineOperand CreateJTI(unsigned Idx, 694f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned char TargetFlags = 0) { 695f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand Op(MachineOperand::MO_JumpTableIndex); 696f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.setIndex(Idx); 697f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.setTargetFlags(TargetFlags); 698f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Op; 699f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 700f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static MachineOperand CreateGA(const GlobalValue *GV, int64_t Offset, 701f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned char TargetFlags = 0) { 702f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand Op(MachineOperand::MO_GlobalAddress); 703f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.Contents.OffsetedInfo.Val.GV = GV; 704f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.setOffset(Offset); 705f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.setTargetFlags(TargetFlags); 706f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Op; 707f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 708f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static MachineOperand CreateES(const char *SymName, 709f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned char TargetFlags = 0) { 710f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand Op(MachineOperand::MO_ExternalSymbol); 711f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.Contents.OffsetedInfo.Val.SymbolName = SymName; 712f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.setOffset(0); // Offset is always 0. 713f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.setTargetFlags(TargetFlags); 714f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Op; 715f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 716f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static MachineOperand CreateBA(const BlockAddress *BA, int64_t Offset, 717f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned char TargetFlags = 0) { 718f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand Op(MachineOperand::MO_BlockAddress); 719f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.Contents.OffsetedInfo.Val.BA = BA; 720f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.setOffset(Offset); 721f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.setTargetFlags(TargetFlags); 722f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Op; 723f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 724f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// CreateRegMask - Creates a register mask operand referencing Mask. The 725f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// operand does not take ownership of the memory referenced by Mask, it must 726f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// remain valid for the lifetime of the operand. 727f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 728f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// A RegMask operand represents a set of non-clobbered physical registers on 729f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// an instruction that clobbers many registers, typically a call. The bit 730f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// mask has a bit set for each physreg that is preserved by this 731f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// instruction, as described in the documentation for 732f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// TargetRegisterInfo::getCallPreservedMask(). 733f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 734f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Any physreg with a 0 bit in the mask is clobbered by the instruction. 735f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 736f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static MachineOperand CreateRegMask(const uint32_t *Mask) { 737f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(Mask && "Missing register mask"); 738f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand Op(MachineOperand::MO_RegisterMask); 739f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.Contents.RegMask = Mask; 740f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Op; 741f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 742f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static MachineOperand CreateRegLiveOut(const uint32_t *Mask) { 743f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(Mask && "Missing live-out register mask"); 744f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand Op(MachineOperand::MO_RegisterLiveOut); 745f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.Contents.RegMask = Mask; 746f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Op; 747f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 748f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static MachineOperand CreateMetadata(const MDNode *Meta) { 749f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand Op(MachineOperand::MO_Metadata); 750f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.Contents.MD = Meta; 751f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Op; 752f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 753f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 754f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static MachineOperand CreateMCSymbol(MCSymbol *Sym, 755f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned char TargetFlags = 0) { 756f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand Op(MachineOperand::MO_MCSymbol); 757f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.Contents.Sym = Sym; 758f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.setOffset(0); 759f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.setTargetFlags(TargetFlags); 760f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Op; 761f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 762f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 763f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static MachineOperand CreateCFIIndex(unsigned CFIIndex) { 764f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand Op(MachineOperand::MO_CFIIndex); 765f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.Contents.CFIIndex = CFIIndex; 766f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Op; 767f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 768f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 769f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static MachineOperand CreateIntrinsicID(Intrinsic::ID ID) { 770f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand Op(MachineOperand::MO_IntrinsicID); 771f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.Contents.IntrinsicID = ID; 772f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Op; 773f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 774f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 775f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static MachineOperand CreatePredicate(unsigned Pred) { 776f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand Op(MachineOperand::MO_Predicate); 777f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Op.Contents.Pred = Pred; 778f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Op; 779f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 780f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 781f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot friend class MachineInstr; 782f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot friend class MachineRegisterInfo; 783f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate: 784f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void removeRegFromUses(); 785f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 786f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Artificial kinds for DenseMap usage. 787f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot enum : unsigned char { 788f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_Empty = MO_Last + 1, 789f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO_Tombstone, 790f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 791f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 792f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot friend struct DenseMapInfo<MachineOperand>; 793f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 794f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===--------------------------------------------------------------------===// 795f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Methods for handling register use/def lists. 796f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot //===--------------------------------------------------------------------===// 797f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 798f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// isOnRegUseList - Return true if this operand is on a register use/def list 799f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// or false if not. This can only be called for register operands that are 800f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// part of a machine instruction. 801f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isOnRegUseList() const { 802f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot assert(isReg() && "Can only add reg operand to use lists"); 803f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Contents.Reg.Prev != nullptr; 804f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 805f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 806f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 807f3014761c955345d6e05491608e73228d014afbandroid-build-team Robottemplate <> struct DenseMapInfo<MachineOperand> { 808f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static MachineOperand getEmptyKey() { 809f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return MachineOperand(static_cast<MachineOperand::MachineOperandType>( 810f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand::MO_Empty)); 811f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 812f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static MachineOperand getTombstoneKey() { 813f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return MachineOperand(static_cast<MachineOperand::MachineOperandType>( 814f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand::MO_Tombstone)); 815f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 816f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static unsigned getHashValue(const MachineOperand &MO) { 817f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return hash_value(MO); 818f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 819f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool isEqual(const MachineOperand &LHS, const MachineOperand &RHS) { 820f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if (LHS.getType() == static_cast<MachineOperand::MachineOperandType>( 821f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand::MO_Empty) || 822f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot LHS.getType() == static_cast<MachineOperand::MachineOperandType>( 823f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MachineOperand::MO_Tombstone)) 824f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return LHS.getType() == RHS.getType(); 825f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return LHS.isIdenticalTo(RHS); 826f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 827f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 828f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 829f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotinline raw_ostream &operator<<(raw_ostream &OS, const MachineOperand& MO) { 830f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MO.print(OS, nullptr); 831f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return OS; 832f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 833f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 834f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // See friend declaration above. This additional declaration is required in 835f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // order to compile LLVM with IBM xlC compiler. 836f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot hash_code hash_value(const MachineOperand &MO); 837f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} // End llvm namespace 838f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 839f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#endif 840