Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===-- llvm/MC/MCInstrDesc.h - Instruction Descriptors -*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file defines the MCOperandInfo and MCInstrDesc classes, which
  10. // are used to describe target instructions and their operands.
  11. //
  12. //===----------------------------------------------------------------------===//
  13.  
  14. #ifndef LLVM_MC_MCINSTRDESC_H
  15. #define LLVM_MC_MCINSTRDESC_H
  16.  
  17. #include "llvm/ADT/ArrayRef.h"
  18. #include "llvm/ADT/iterator_range.h"
  19. #include "llvm/MC/MCRegister.h"
  20.  
  21. namespace llvm {
  22. class MCRegisterInfo;
  23.  
  24. class MCInst;
  25.  
  26. //===----------------------------------------------------------------------===//
  27. // Machine Operand Flags and Description
  28. //===----------------------------------------------------------------------===//
  29.  
  30. namespace MCOI {
  31. /// Operand constraints. These are encoded in 16 bits with one of the
  32. /// low-order 3 bits specifying that a constraint is present and the
  33. /// corresponding high-order hex digit specifying the constraint value.
  34. /// This allows for a maximum of 3 constraints.
  35. enum OperandConstraint {
  36.   TIED_TO = 0,  // Must be allocated the same register as specified value.
  37.   EARLY_CLOBBER // If present, operand is an early clobber register.
  38. };
  39.  
  40. // Define a macro to produce each constraint value.
  41. #define MCOI_TIED_TO(op) \
  42.   ((1 << MCOI::TIED_TO) | ((op) << (4 + MCOI::TIED_TO * 4)))
  43.  
  44. #define MCOI_EARLY_CLOBBER \
  45.   (1 << MCOI::EARLY_CLOBBER)
  46.  
  47. /// These are flags set on operands, but should be considered
  48. /// private, all access should go through the MCOperandInfo accessors.
  49. /// See the accessors for a description of what these are.
  50. enum OperandFlags {
  51.   LookupPtrRegClass = 0,
  52.   Predicate,
  53.   OptionalDef,
  54.   BranchTarget
  55. };
  56.  
  57. /// Operands are tagged with one of the values of this enum.
  58. enum OperandType {
  59.   OPERAND_UNKNOWN = 0,
  60.   OPERAND_IMMEDIATE = 1,
  61.   OPERAND_REGISTER = 2,
  62.   OPERAND_MEMORY = 3,
  63.   OPERAND_PCREL = 4,
  64.  
  65.   OPERAND_FIRST_GENERIC = 6,
  66.   OPERAND_GENERIC_0 = 6,
  67.   OPERAND_GENERIC_1 = 7,
  68.   OPERAND_GENERIC_2 = 8,
  69.   OPERAND_GENERIC_3 = 9,
  70.   OPERAND_GENERIC_4 = 10,
  71.   OPERAND_GENERIC_5 = 11,
  72.   OPERAND_LAST_GENERIC = 11,
  73.  
  74.   OPERAND_FIRST_GENERIC_IMM = 12,
  75.   OPERAND_GENERIC_IMM_0 = 12,
  76.   OPERAND_LAST_GENERIC_IMM = 12,
  77.  
  78.   OPERAND_FIRST_TARGET = 13,
  79. };
  80.  
  81. } // namespace MCOI
  82.  
  83. /// This holds information about one operand of a machine instruction,
  84. /// indicating the register class for register operands, etc.
  85. class MCOperandInfo {
  86. public:
  87.   /// This specifies the register class enumeration of the operand
  88.   /// if the operand is a register.  If isLookupPtrRegClass is set, then this is
  89.   /// an index that is passed to TargetRegisterInfo::getPointerRegClass(x) to
  90.   /// get a dynamic register class.
  91.   int16_t RegClass;
  92.  
  93.   /// These are flags from the MCOI::OperandFlags enum.
  94.   uint8_t Flags;
  95.  
  96.   /// Information about the type of the operand.
  97.   uint8_t OperandType;
  98.  
  99.   /// Operand constraints (see OperandConstraint enum).
  100.   uint16_t Constraints;
  101.  
  102.   /// Set if this operand is a pointer value and it requires a callback
  103.   /// to look up its register class.
  104.   bool isLookupPtrRegClass() const {
  105.     return Flags & (1 << MCOI::LookupPtrRegClass);
  106.   }
  107.  
  108.   /// Set if this is one of the operands that made up of the predicate
  109.   /// operand that controls an isPredicable() instruction.
  110.   bool isPredicate() const { return Flags & (1 << MCOI::Predicate); }
  111.  
  112.   /// Set if this operand is a optional def.
  113.   bool isOptionalDef() const { return Flags & (1 << MCOI::OptionalDef); }
  114.  
  115.   /// Set if this operand is a branch target.
  116.   bool isBranchTarget() const { return Flags & (1 << MCOI::BranchTarget); }
  117.  
  118.   bool isGenericType() const {
  119.     return OperandType >= MCOI::OPERAND_FIRST_GENERIC &&
  120.            OperandType <= MCOI::OPERAND_LAST_GENERIC;
  121.   }
  122.  
  123.   unsigned getGenericTypeIndex() const {
  124.     assert(isGenericType() && "non-generic types don't have an index");
  125.     return OperandType - MCOI::OPERAND_FIRST_GENERIC;
  126.   }
  127.  
  128.   bool isGenericImm() const {
  129.     return OperandType >= MCOI::OPERAND_FIRST_GENERIC_IMM &&
  130.            OperandType <= MCOI::OPERAND_LAST_GENERIC_IMM;
  131.   }
  132.  
  133.   unsigned getGenericImmIndex() const {
  134.     assert(isGenericImm() && "non-generic immediates don't have an index");
  135.     return OperandType - MCOI::OPERAND_FIRST_GENERIC_IMM;
  136.   }
  137. };
  138.  
  139. //===----------------------------------------------------------------------===//
  140. // Machine Instruction Flags and Description
  141. //===----------------------------------------------------------------------===//
  142.  
  143. namespace MCID {
  144. /// These should be considered private to the implementation of the
  145. /// MCInstrDesc class.  Clients should use the predicate methods on MCInstrDesc,
  146. /// not use these directly.  These all correspond to bitfields in the
  147. /// MCInstrDesc::Flags field.
  148. enum Flag {
  149.   PreISelOpcode = 0,
  150.   Variadic,
  151.   HasOptionalDef,
  152.   Pseudo,
  153.   Meta,
  154.   Return,
  155.   EHScopeReturn,
  156.   Call,
  157.   Barrier,
  158.   Terminator,
  159.   Branch,
  160.   IndirectBranch,
  161.   Compare,
  162.   MoveImm,
  163.   MoveReg,
  164.   Bitcast,
  165.   Select,
  166.   DelaySlot,
  167.   FoldableAsLoad,
  168.   MayLoad,
  169.   MayStore,
  170.   MayRaiseFPException,
  171.   Predicable,
  172.   NotDuplicable,
  173.   UnmodeledSideEffects,
  174.   Commutable,
  175.   ConvertibleTo3Addr,
  176.   UsesCustomInserter,
  177.   HasPostISelHook,
  178.   Rematerializable,
  179.   CheapAsAMove,
  180.   ExtraSrcRegAllocReq,
  181.   ExtraDefRegAllocReq,
  182.   RegSequence,
  183.   ExtractSubreg,
  184.   InsertSubreg,
  185.   Convergent,
  186.   Add,
  187.   Trap,
  188.   VariadicOpsAreDefs,
  189.   Authenticated,
  190. };
  191. } // namespace MCID
  192.  
  193. /// Describe properties that are true of each instruction in the target
  194. /// description file.  This captures information about side effects, register
  195. /// use and many other things.  There is one instance of this struct for each
  196. /// target instruction class, and the MachineInstr class points to this struct
  197. /// directly to describe itself.
  198. class MCInstrDesc {
  199. public:
  200.   // FIXME: Disable copies and moves.
  201.   // Do not allow MCInstrDescs to be copied or moved. They should only exist in
  202.   // the <Target>Insts table because they rely on knowing their own address to
  203.   // find other information elsewhere in the same table.
  204.  
  205.   unsigned short Opcode;         // The opcode number
  206.   unsigned short NumOperands;    // Num of args (may be more if variable_ops)
  207.   unsigned char NumDefs;         // Num of args that are definitions
  208.   unsigned char Size;            // Number of bytes in encoding.
  209.   unsigned short SchedClass;     // enum identifying instr sched class
  210.   unsigned char NumImplicitUses; // Num of regs implicitly used
  211.   unsigned char NumImplicitDefs; // Num of regs implicitly defined
  212.   uint64_t Flags;                // Flags identifying machine instr class
  213.   uint64_t TSFlags;              // Target Specific Flag values
  214.   const MCPhysReg *ImplicitOps;  // List of implicit uses followed by defs
  215.   const MCOperandInfo *OpInfo;   // 'NumOperands' entries about operands
  216.  
  217.   /// Returns the value of the specified operand constraint if
  218.   /// it is present. Returns -1 if it is not present.
  219.   int getOperandConstraint(unsigned OpNum,
  220.                            MCOI::OperandConstraint Constraint) const {
  221.     if (OpNum < NumOperands &&
  222.         (operands()[OpNum].Constraints & (1 << Constraint))) {
  223.       unsigned ValuePos = 4 + Constraint * 4;
  224.       return (int)(operands()[OpNum].Constraints >> ValuePos) & 0x0f;
  225.     }
  226.     return -1;
  227.   }
  228.  
  229.   /// Return the opcode number for this descriptor.
  230.   unsigned getOpcode() const { return Opcode; }
  231.  
  232.   /// Return the number of declared MachineOperands for this
  233.   /// MachineInstruction.  Note that variadic (isVariadic() returns true)
  234.   /// instructions may have additional operands at the end of the list, and note
  235.   /// that the machine instruction may include implicit register def/uses as
  236.   /// well.
  237.   unsigned getNumOperands() const { return NumOperands; }
  238.  
  239.   using const_opInfo_iterator = const MCOperandInfo *;
  240.  
  241.   const_opInfo_iterator opInfo_begin() const { return OpInfo; }
  242.   const_opInfo_iterator opInfo_end() const { return OpInfo + NumOperands; }
  243.  
  244.   ArrayRef<MCOperandInfo> operands() const {
  245.     return ArrayRef(OpInfo, NumOperands);
  246.   }
  247.  
  248.   /// Return the number of MachineOperands that are register
  249.   /// definitions.  Register definitions always occur at the start of the
  250.   /// machine operand list.  This is the number of "outs" in the .td file,
  251.   /// and does not include implicit defs.
  252.   unsigned getNumDefs() const { return NumDefs; }
  253.  
  254.   /// Return flags of this instruction.
  255.   uint64_t getFlags() const { return Flags; }
  256.  
  257.   /// \returns true if this instruction is emitted before instruction selection
  258.   /// and should be legalized/regbankselected/selected.
  259.   bool isPreISelOpcode() const { return Flags & (1ULL << MCID::PreISelOpcode); }
  260.  
  261.   /// Return true if this instruction can have a variable number of
  262.   /// operands.  In this case, the variable operands will be after the normal
  263.   /// operands but before the implicit definitions and uses (if any are
  264.   /// present).
  265.   bool isVariadic() const { return Flags & (1ULL << MCID::Variadic); }
  266.  
  267.   /// Set if this instruction has an optional definition, e.g.
  268.   /// ARM instructions which can set condition code if 's' bit is set.
  269.   bool hasOptionalDef() const { return Flags & (1ULL << MCID::HasOptionalDef); }
  270.  
  271.   /// Return true if this is a pseudo instruction that doesn't
  272.   /// correspond to a real machine instruction.
  273.   bool isPseudo() const { return Flags & (1ULL << MCID::Pseudo); }
  274.  
  275.   /// Return true if this is a meta instruction that doesn't
  276.   /// produce any output in the form of executable instructions.
  277.   bool isMetaInstruction() const { return Flags & (1ULL << MCID::Meta); }
  278.  
  279.   /// Return true if the instruction is a return.
  280.   bool isReturn() const { return Flags & (1ULL << MCID::Return); }
  281.  
  282.   /// Return true if the instruction is an add instruction.
  283.   bool isAdd() const { return Flags & (1ULL << MCID::Add); }
  284.  
  285.   /// Return true if this instruction is a trap.
  286.   bool isTrap() const { return Flags & (1ULL << MCID::Trap); }
  287.  
  288.   /// Return true if the instruction is a register to register move.
  289.   bool isMoveReg() const { return Flags & (1ULL << MCID::MoveReg); }
  290.  
  291.   ///  Return true if the instruction is a call.
  292.   bool isCall() const { return Flags & (1ULL << MCID::Call); }
  293.  
  294.   /// Returns true if the specified instruction stops control flow
  295.   /// from executing the instruction immediately following it.  Examples include
  296.   /// unconditional branches and return instructions.
  297.   bool isBarrier() const { return Flags & (1ULL << MCID::Barrier); }
  298.  
  299.   /// Returns true if this instruction part of the terminator for
  300.   /// a basic block.  Typically this is things like return and branch
  301.   /// instructions.
  302.   ///
  303.   /// Various passes use this to insert code into the bottom of a basic block,
  304.   /// but before control flow occurs.
  305.   bool isTerminator() const { return Flags & (1ULL << MCID::Terminator); }
  306.  
  307.   /// Returns true if this is a conditional, unconditional, or
  308.   /// indirect branch.  Predicates below can be used to discriminate between
  309.   /// these cases, and the TargetInstrInfo::analyzeBranch method can be used to
  310.   /// get more information.
  311.   bool isBranch() const { return Flags & (1ULL << MCID::Branch); }
  312.  
  313.   /// Return true if this is an indirect branch, such as a
  314.   /// branch through a register.
  315.   bool isIndirectBranch() const { return Flags & (1ULL << MCID::IndirectBranch); }
  316.  
  317.   /// Return true if this is a branch which may fall
  318.   /// through to the next instruction or may transfer control flow to some other
  319.   /// block.  The TargetInstrInfo::analyzeBranch method can be used to get more
  320.   /// information about this branch.
  321.   bool isConditionalBranch() const {
  322.     return isBranch() && !isBarrier() && !isIndirectBranch();
  323.   }
  324.  
  325.   /// Return true if this is a branch which always
  326.   /// transfers control flow to some other block.  The
  327.   /// TargetInstrInfo::analyzeBranch method can be used to get more information
  328.   /// about this branch.
  329.   bool isUnconditionalBranch() const {
  330.     return isBranch() && isBarrier() && !isIndirectBranch();
  331.   }
  332.  
  333.   /// Return true if this is a branch or an instruction which directly
  334.   /// writes to the program counter. Considered 'may' affect rather than
  335.   /// 'does' affect as things like predication are not taken into account.
  336.   bool mayAffectControlFlow(const MCInst &MI, const MCRegisterInfo &RI) const;
  337.  
  338.   /// Return true if this instruction has a predicate operand
  339.   /// that controls execution. It may be set to 'always', or may be set to other
  340.   /// values. There are various methods in TargetInstrInfo that can be used to
  341.   /// control and modify the predicate in this instruction.
  342.   bool isPredicable() const { return Flags & (1ULL << MCID::Predicable); }
  343.  
  344.   /// Return true if this instruction is a comparison.
  345.   bool isCompare() const { return Flags & (1ULL << MCID::Compare); }
  346.  
  347.   /// Return true if this instruction is a move immediate
  348.   /// (including conditional moves) instruction.
  349.   bool isMoveImmediate() const { return Flags & (1ULL << MCID::MoveImm); }
  350.  
  351.   /// Return true if this instruction is a bitcast instruction.
  352.   bool isBitcast() const { return Flags & (1ULL << MCID::Bitcast); }
  353.  
  354.   /// Return true if this is a select instruction.
  355.   bool isSelect() const { return Flags & (1ULL << MCID::Select); }
  356.  
  357.   /// Return true if this instruction cannot be safely
  358.   /// duplicated.  For example, if the instruction has a unique labels attached
  359.   /// to it, duplicating it would cause multiple definition errors.
  360.   bool isNotDuplicable() const { return Flags & (1ULL << MCID::NotDuplicable); }
  361.  
  362.   /// Returns true if the specified instruction has a delay slot which
  363.   /// must be filled by the code generator.
  364.   bool hasDelaySlot() const { return Flags & (1ULL << MCID::DelaySlot); }
  365.  
  366.   /// Return true for instructions that can be folded as memory operands
  367.   /// in other instructions. The most common use for this is instructions that
  368.   /// are simple loads from memory that don't modify the loaded value in any
  369.   /// way, but it can also be used for instructions that can be expressed as
  370.   /// constant-pool loads, such as V_SETALLONES on x86, to allow them to be
  371.   /// folded when it is beneficial.  This should only be set on instructions
  372.   /// that return a value in their only virtual register definition.
  373.   bool canFoldAsLoad() const { return Flags & (1ULL << MCID::FoldableAsLoad); }
  374.  
  375.   /// Return true if this instruction behaves
  376.   /// the same way as the generic REG_SEQUENCE instructions.
  377.   /// E.g., on ARM,
  378.   /// dX VMOVDRR rY, rZ
  379.   /// is equivalent to
  380.   /// dX = REG_SEQUENCE rY, ssub_0, rZ, ssub_1.
  381.   ///
  382.   /// Note that for the optimizers to be able to take advantage of
  383.   /// this property, TargetInstrInfo::getRegSequenceLikeInputs has to be
  384.   /// override accordingly.
  385.   bool isRegSequenceLike() const { return Flags & (1ULL << MCID::RegSequence); }
  386.  
  387.   /// Return true if this instruction behaves
  388.   /// the same way as the generic EXTRACT_SUBREG instructions.
  389.   /// E.g., on ARM,
  390.   /// rX, rY VMOVRRD dZ
  391.   /// is equivalent to two EXTRACT_SUBREG:
  392.   /// rX = EXTRACT_SUBREG dZ, ssub_0
  393.   /// rY = EXTRACT_SUBREG dZ, ssub_1
  394.   ///
  395.   /// Note that for the optimizers to be able to take advantage of
  396.   /// this property, TargetInstrInfo::getExtractSubregLikeInputs has to be
  397.   /// override accordingly.
  398.   bool isExtractSubregLike() const {
  399.     return Flags & (1ULL << MCID::ExtractSubreg);
  400.   }
  401.  
  402.   /// Return true if this instruction behaves
  403.   /// the same way as the generic INSERT_SUBREG instructions.
  404.   /// E.g., on ARM,
  405.   /// dX = VSETLNi32 dY, rZ, Imm
  406.   /// is equivalent to a INSERT_SUBREG:
  407.   /// dX = INSERT_SUBREG dY, rZ, translateImmToSubIdx(Imm)
  408.   ///
  409.   /// Note that for the optimizers to be able to take advantage of
  410.   /// this property, TargetInstrInfo::getInsertSubregLikeInputs has to be
  411.   /// override accordingly.
  412.   bool isInsertSubregLike() const { return Flags & (1ULL << MCID::InsertSubreg); }
  413.  
  414.  
  415.   /// Return true if this instruction is convergent.
  416.   ///
  417.   /// Convergent instructions may not be made control-dependent on any
  418.   /// additional values.
  419.   bool isConvergent() const { return Flags & (1ULL << MCID::Convergent); }
  420.  
  421.   /// Return true if variadic operands of this instruction are definitions.
  422.   bool variadicOpsAreDefs() const {
  423.     return Flags & (1ULL << MCID::VariadicOpsAreDefs);
  424.   }
  425.  
  426.   /// Return true if this instruction authenticates a pointer (e.g. LDRAx/BRAx
  427.   /// from ARMv8.3, which perform loads/branches with authentication).
  428.   ///
  429.   /// An authenticated instruction may fail in an ABI-defined manner when
  430.   /// operating on an invalid signed pointer.
  431.   bool isAuthenticated() const {
  432.     return Flags & (1ULL << MCID::Authenticated);
  433.   }
  434.  
  435.   //===--------------------------------------------------------------------===//
  436.   // Side Effect Analysis
  437.   //===--------------------------------------------------------------------===//
  438.  
  439.   /// Return true if this instruction could possibly read memory.
  440.   /// Instructions with this flag set are not necessarily simple load
  441.   /// instructions, they may load a value and modify it, for example.
  442.   bool mayLoad() const { return Flags & (1ULL << MCID::MayLoad); }
  443.  
  444.   /// Return true if this instruction could possibly modify memory.
  445.   /// Instructions with this flag set are not necessarily simple store
  446.   /// instructions, they may store a modified value based on their operands, or
  447.   /// may not actually modify anything, for example.
  448.   bool mayStore() const { return Flags & (1ULL << MCID::MayStore); }
  449.  
  450.   /// Return true if this instruction may raise a floating-point exception.
  451.   bool mayRaiseFPException() const {
  452.     return Flags & (1ULL << MCID::MayRaiseFPException);
  453.   }
  454.  
  455.   /// Return true if this instruction has side
  456.   /// effects that are not modeled by other flags.  This does not return true
  457.   /// for instructions whose effects are captured by:
  458.   ///
  459.   ///  1. Their operand list and implicit definition/use list.  Register use/def
  460.   ///     info is explicit for instructions.
  461.   ///  2. Memory accesses.  Use mayLoad/mayStore.
  462.   ///  3. Calling, branching, returning: use isCall/isReturn/isBranch.
  463.   ///
  464.   /// Examples of side effects would be modifying 'invisible' machine state like
  465.   /// a control register, flushing a cache, modifying a register invisible to
  466.   /// LLVM, etc.
  467.   bool hasUnmodeledSideEffects() const {
  468.     return Flags & (1ULL << MCID::UnmodeledSideEffects);
  469.   }
  470.  
  471.   //===--------------------------------------------------------------------===//
  472.   // Flags that indicate whether an instruction can be modified by a method.
  473.   //===--------------------------------------------------------------------===//
  474.  
  475.   /// Return true if this may be a 2- or 3-address instruction (of the
  476.   /// form "X = op Y, Z, ..."), which produces the same result if Y and Z are
  477.   /// exchanged.  If this flag is set, then the
  478.   /// TargetInstrInfo::commuteInstruction method may be used to hack on the
  479.   /// instruction.
  480.   ///
  481.   /// Note that this flag may be set on instructions that are only commutable
  482.   /// sometimes.  In these cases, the call to commuteInstruction will fail.
  483.   /// Also note that some instructions require non-trivial modification to
  484.   /// commute them.
  485.   bool isCommutable() const { return Flags & (1ULL << MCID::Commutable); }
  486.  
  487.   /// Return true if this is a 2-address instruction which can be changed
  488.   /// into a 3-address instruction if needed.  Doing this transformation can be
  489.   /// profitable in the register allocator, because it means that the
  490.   /// instruction can use a 2-address form if possible, but degrade into a less
  491.   /// efficient form if the source and dest register cannot be assigned to the
  492.   /// same register.  For example, this allows the x86 backend to turn a "shl
  493.   /// reg, 3" instruction into an LEA instruction, which is the same speed as
  494.   /// the shift but has bigger code size.
  495.   ///
  496.   /// If this returns true, then the target must implement the
  497.   /// TargetInstrInfo::convertToThreeAddress method for this instruction, which
  498.   /// is allowed to fail if the transformation isn't valid for this specific
  499.   /// instruction (e.g. shl reg, 4 on x86).
  500.   ///
  501.   bool isConvertibleTo3Addr() const {
  502.     return Flags & (1ULL << MCID::ConvertibleTo3Addr);
  503.   }
  504.  
  505.   /// Return true if this instruction requires custom insertion support
  506.   /// when the DAG scheduler is inserting it into a machine basic block.  If
  507.   /// this is true for the instruction, it basically means that it is a pseudo
  508.   /// instruction used at SelectionDAG time that is expanded out into magic code
  509.   /// by the target when MachineInstrs are formed.
  510.   ///
  511.   /// If this is true, the TargetLoweringInfo::InsertAtEndOfBasicBlock method
  512.   /// is used to insert this into the MachineBasicBlock.
  513.   bool usesCustomInsertionHook() const {
  514.     return Flags & (1ULL << MCID::UsesCustomInserter);
  515.   }
  516.  
  517.   /// Return true if this instruction requires *adjustment* after
  518.   /// instruction selection by calling a target hook. For example, this can be
  519.   /// used to fill in ARM 's' optional operand depending on whether the
  520.   /// conditional flag register is used.
  521.   bool hasPostISelHook() const { return Flags & (1ULL << MCID::HasPostISelHook); }
  522.  
  523.   /// Returns true if this instruction is a candidate for remat. This
  524.   /// flag is only used in TargetInstrInfo method isTriviallyRematerializable.
  525.   ///
  526.   /// If this flag is set, the isReallyTriviallyReMaterializable()
  527.   /// or isReallyTriviallyReMaterializableGeneric methods are called to verify
  528.   /// the instruction is really rematable.
  529.   bool isRematerializable() const {
  530.     return Flags & (1ULL << MCID::Rematerializable);
  531.   }
  532.  
  533.   /// Returns true if this instruction has the same cost (or less) than a
  534.   /// move instruction. This is useful during certain types of optimizations
  535.   /// (e.g., remat during two-address conversion or machine licm) where we would
  536.   /// like to remat or hoist the instruction, but not if it costs more than
  537.   /// moving the instruction into the appropriate register. Note, we are not
  538.   /// marking copies from and to the same register class with this flag.
  539.   ///
  540.   /// This method could be called by interface TargetInstrInfo::isAsCheapAsAMove
  541.   /// for different subtargets.
  542.   bool isAsCheapAsAMove() const { return Flags & (1ULL << MCID::CheapAsAMove); }
  543.  
  544.   /// Returns true if this instruction source operands have special
  545.   /// register allocation requirements that are not captured by the operand
  546.   /// register classes. e.g. ARM::STRD's two source registers must be an even /
  547.   /// odd pair, ARM::STM registers have to be in ascending order.  Post-register
  548.   /// allocation passes should not attempt to change allocations for sources of
  549.   /// instructions with this flag.
  550.   bool hasExtraSrcRegAllocReq() const {
  551.     return Flags & (1ULL << MCID::ExtraSrcRegAllocReq);
  552.   }
  553.  
  554.   /// Returns true if this instruction def operands have special register
  555.   /// allocation requirements that are not captured by the operand register
  556.   /// classes. e.g. ARM::LDRD's two def registers must be an even / odd pair,
  557.   /// ARM::LDM registers have to be in ascending order.  Post-register
  558.   /// allocation passes should not attempt to change allocations for definitions
  559.   /// of instructions with this flag.
  560.   bool hasExtraDefRegAllocReq() const {
  561.     return Flags & (1ULL << MCID::ExtraDefRegAllocReq);
  562.   }
  563.  
  564.   /// Return a list of registers that are potentially read by any
  565.   /// instance of this machine instruction.  For example, on X86, the "adc"
  566.   /// instruction adds two register operands and adds the carry bit in from the
  567.   /// flags register.  In this case, the instruction is marked as implicitly
  568.   /// reading the flags.  Likewise, the variable shift instruction on X86 is
  569.   /// marked as implicitly reading the 'CL' register, which it always does.
  570.   ArrayRef<MCPhysReg> implicit_uses() const {
  571.     return {ImplicitOps, NumImplicitUses};
  572.   }
  573.  
  574.   /// Return a list of registers that are potentially written by any
  575.   /// instance of this machine instruction.  For example, on X86, many
  576.   /// instructions implicitly set the flags register.  In this case, they are
  577.   /// marked as setting the FLAGS.  Likewise, many instructions always deposit
  578.   /// their result in a physical register.  For example, the X86 divide
  579.   /// instruction always deposits the quotient and remainder in the EAX/EDX
  580.   /// registers.  For that instruction, this will return a list containing the
  581.   /// EAX/EDX/EFLAGS registers.
  582.   ArrayRef<MCPhysReg> implicit_defs() const {
  583.     return {ImplicitOps + NumImplicitUses, NumImplicitDefs};
  584.   }
  585.  
  586.   /// Return true if this instruction implicitly
  587.   /// uses the specified physical register.
  588.   bool hasImplicitUseOfPhysReg(unsigned Reg) const {
  589.     return is_contained(implicit_uses(), Reg);
  590.   }
  591.  
  592.   /// Return true if this instruction implicitly
  593.   /// defines the specified physical register.
  594.   bool hasImplicitDefOfPhysReg(unsigned Reg,
  595.                                const MCRegisterInfo *MRI = nullptr) const;
  596.  
  597.   /// Return the scheduling class for this instruction.  The
  598.   /// scheduling class is an index into the InstrItineraryData table.  This
  599.   /// returns zero if there is no known scheduling information for the
  600.   /// instruction.
  601.   unsigned getSchedClass() const { return SchedClass; }
  602.  
  603.   /// Return the number of bytes in the encoding of this instruction,
  604.   /// or zero if the encoding size cannot be known from the opcode.
  605.   unsigned getSize() const { return Size; }
  606.  
  607.   /// Find the index of the first operand in the
  608.   /// operand list that is used to represent the predicate. It returns -1 if
  609.   /// none is found.
  610.   int findFirstPredOperandIdx() const {
  611.     if (isPredicable()) {
  612.       for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
  613.         if (operands()[i].isPredicate())
  614.           return i;
  615.     }
  616.     return -1;
  617.   }
  618.  
  619.   /// Return true if this instruction defines the specified physical
  620.   /// register, either explicitly or implicitly.
  621.   bool hasDefOfPhysReg(const MCInst &MI, unsigned Reg,
  622.                        const MCRegisterInfo &RI) const;
  623. };
  624.  
  625. } // end namespace llvm
  626.  
  627. #endif
  628.