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