[Hexagon] Reverting 220584 to address ASAN errors.
[oota-llvm.git] / lib / Target / Hexagon / MCTargetDesc / HexagonMCInst.h
index e456aefcefb3728dddcf70166d657ddd98f78f16..90fbbf3f60a4434c09210d1d907257a85f679884 100644 (file)
 #ifndef LLVM_LIB_TARGET_HEXAGON_MCTARGETDESC_HEXAGONMCINST_H
 #define LLVM_LIB_TARGET_HEXAGON_MCTARGETDESC_HEXAGONMCINST_H
 
+#include "HexagonTargetMachine.h"
 #include "llvm/MC/MCInst.h"
 
 namespace llvm {
-class MCInstrDesc;
-class MCOperand;
-class HexagonTargetMachine;
-
-class HexagonMCInst : public MCInst {
-public:
-  explicit HexagonMCInst(unsigned op);
-
-  /// 10.6 Instruction Packets
-  bool isPacketBegin() const;
-  /// \brief Is this marked as last in packet.
-  bool isPacketEnd() const;
-  void setPacketBegin(bool Y);
-  /// \brief Mark this as last in packet.
-  void setPacketEnd(bool Y);
-  /// \brief Return the slots used.
-  unsigned getUnits(HexagonTargetMachine const &TM) const;
-  bool isConstExtended() const;
-  /// \brief Return constant extended operand number.
-  unsigned short getCExtOpNum(void) const;
-  /// \brief Return whether this is a new-value consumer.
-  bool isNewValue() const;
-  /// \brief Return whether this is a legal new-value producer.
-  bool hasNewValue() const;
-  /// \brief Return the operand that consumes or produces a new value.
-  MCOperand const &getNewValue() const;
-  /// \brief Return number of bits in the constant extended operand.
-  unsigned getBitCount(void) const;
-
-private:
-  /// \brief Return whether this must be always extended.
-  bool isExtended() const;
-  /// \brief Return true if this may be extended based on the operand value.
-  bool isExtendable() const;
-  ///  \brief Return if the operand can be constant extended.
-  bool isOperandExtended(unsigned short const OperandNum) const;
-  /// \brief Return the min value that a constant extendable operand can have
-  /// without being extended.
-  int getMinValue() const;
-  /// \brief Return the max value that a constant extendable operand can have
-  /// without being extended.
-  int getMaxValue() const;
-  bool packetBegin;
-  bool packetEnd;
-  MCInstrDesc const &MCID;
-};
+  class MCOperand;
+
+  class HexagonMCInst: public MCInst {
+    // MCID is set during instruction lowering.
+    // It is needed in order to access TSFlags for
+    // use in checking MC instruction properties.
+    const MCInstrDesc *MCID;
+
+    // Packet start and end markers
+    unsigned packetStart: 1, packetEnd: 1;
+
+  public:
+    explicit HexagonMCInst():
+      MCInst(), MCID(nullptr), packetStart(0), packetEnd(0) {};
+    HexagonMCInst(const MCInstrDesc& mcid):
+      MCInst(), MCID(&mcid), packetStart(0), packetEnd(0) {};
+
+    bool isPacketStart() const { return (packetStart); };
+    bool isPacketEnd() const { return (packetEnd); };
+    void setPacketStart(bool Y) { packetStart = Y; };
+    void setPacketEnd(bool Y) { packetEnd = Y; };
+    void resetPacket() { setPacketStart(false); setPacketEnd(false); };
+
+    // Return the slots used by the insn.
+    unsigned getUnits(const HexagonTargetMachine* TM) const;
+
+    // Return the Hexagon ISA class for the insn.
+    unsigned getType() const;
+
+    void setDesc(const MCInstrDesc& mcid) { MCID = &mcid; };
+    const MCInstrDesc& getDesc(void) const { return *MCID; };
+
+    // Return whether the insn is an actual insn.
+    bool isCanon() const;
+
+    // Return whether the insn is a prefix.
+    bool isPrefix() const;
+
+    // Return whether the insn is solo, i.e., cannot be in a packet.
+    bool isSolo() const;
+
+    // Return whether the instruction needs to be constant extended.
+    bool isConstExtended() const;
+
+    // Return constant extended operand number.
+    unsigned short getCExtOpNum(void) const;
+
+    // Return whether the insn is a new-value consumer.
+    bool isNewValue() const;
+
+    // Return whether the instruction is a legal new-value producer.
+    bool hasNewValue() const;
+
+    // Return the operand that consumes or produces a new value.
+    const MCOperand& getNewValue() const;
+
+    // Return number of bits in the constant extended operand.
+    unsigned getBitCount(void) const;
+
+  private:
+    // Return whether the instruction must be always extended.
+    bool isExtended() const;
+
+    // Return true if the insn may be extended based on the operand value.
+    bool isExtendable() const;
+
+    // Return true if the operand can be constant extended.
+    bool isOperandExtended(const unsigned short OperandNum) const;
+
+    // Return the min value that a constant extendable operand can have
+    // without being extended.
+    int getMinValue() const;
+
+    // Return the max value that a constant extendable operand can have
+    // without being extended.
+    int getMaxValue() const;
+  };
 }
 
 #endif