MCInst.h revision 6dbe29e34e0017dac703f951429964d9c95b528c
1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam//===-- llvm/MC/MCInst.h - MCInst class -------------------------*- C++ -*-===//
2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam//
3c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom//                     The LLVM Compiler Infrastructure
4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam//
5c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom// This file is distributed under the University of Illinois Open Source
66e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom// License. See LICENSE.TXT for details.
76e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom//
86e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom//===----------------------------------------------------------------------===//
9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam//
10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam// This file contains the declaration of the MCInst and MCOperand classes, which
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom// is the basic representation used to represent low-level machine code
12c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom// instructions.
13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam//
14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam//===----------------------------------------------------------------------===//
15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam#ifndef LLVM_MC_MCINST_H
17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam#define LLVM_MC_MCINST_H
18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam#include "llvm/ADT/SmallVector.h"
20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam#include "llvm/ADT/StringRef.h"
21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam#include "llvm/System/DataTypes.h"
22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamnamespace llvm {
24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamclass raw_ostream;
25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamclass MCAsmInfo;
26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamclass MCInstPrinter;
27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamclass MCExpr;
28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom/// MCOperand - Instances of this class represent operands of the MCInst class.
306e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom/// This is a simple discriminated union.
316e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromclass MCOperand {
326e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom  enum MachineOperandType {
336e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    kInvalid,                 ///< Uninitialized.
346e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    kRegister,                ///< Register operand.
356e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    kImmediate,               ///< Immediate operand.
366e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    kFPImmediate,             ///< Floating-point immediate operand.
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    kExpr                     ///< Relocatable immediate operand.
386e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom  };
39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  unsigned char Kind;
40b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  union {
42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    unsigned RegVal;
43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    int64_t ImmVal;
44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    double FPImmVal;
45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    const MCExpr *ExprVal;
46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  };
47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic:
48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  MCOperand() : Kind(kInvalid), FPImmVal(0.0) {}
50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  bool isValid() const { return Kind != kInvalid; }
52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  bool isReg() const { return Kind == kRegister; }
53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  bool isImm() const { return Kind == kImmediate; }
544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom  bool isFPImm() const { return Kind == kFPImmediate; }
55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  bool isExpr() const { return Kind == kExpr; }
564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom  /// getReg - Returns the register number.
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom  unsigned getReg() const {
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    assert(isReg() && "This is not a register operand!");
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    return RegVal;
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom  }
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom  /// setReg - Set the register number.
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom  void setReg(unsigned Reg) {
654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    assert(isReg() && "This is not a register operand!");
664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    RegVal = Reg;
674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom  }
684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom  int64_t getImm() const {
704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    assert(isImm() && "This is not an immediate");
714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    return ImmVal;
724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom  }
73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  void setImm(int64_t Val) {
74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    assert(isImm() && "This is not an immediate");
75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    ImmVal = Val;
76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  }
77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  double getFPImm() const {
79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    assert(isFPImm() && "This is not an FP immediate");
80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    return FPImmVal;
81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  }
82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  void setFPImm(double Val) {
84c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    assert(isFPImm() && "This is not an FP immediate");
85c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    FPImmVal = Val;
86c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom  }
87c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  const MCExpr *getExpr() const {
89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    assert(isExpr() && "This is not an expression");
90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    return ExprVal;
91c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom  }
92c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom  void setExpr(const MCExpr *Val) {
93c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    assert(isExpr() && "This is not an expression");
94c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    ExprVal = Val;
95c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom  }
96c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
97c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom  static MCOperand CreateReg(unsigned Reg) {
98c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    MCOperand Op;
99c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    Op.Kind = kRegister;
100c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    Op.RegVal = Reg;
101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    return Op;
102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  }
103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  static MCOperand CreateImm(int64_t Val) {
104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    MCOperand Op;
105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    Op.Kind = kImmediate;
106b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    Op.ImmVal = Val;
107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    return Op;
108c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom  }
109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  static MCOperand CreateFPImm(double Val) {
110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    MCOperand Op;
111c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    Op.Kind = kFPImmediate;
1124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    Op.FPImmVal = Val;
113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    return Op;
114c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom  }
115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  static MCOperand CreateExpr(const MCExpr *Val) {
116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    MCOperand Op;
117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    Op.Kind = kExpr;
118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    Op.ExprVal = Val;
119c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    return Op;
120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  }
121c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  void print(raw_ostream &OS, const MCAsmInfo *MAI) const;
123b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  void dump() const;
1244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom};
1254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom/// MCInst - Instances of this class represent a single low-level machine
1284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom/// instruction.
1294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromclass MCInst {
1304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom  unsigned Opcode;
1314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom  SmallVector<MCOperand, 8> Operands;
1324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic:
1334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom  MCInst() : Opcode(0) {}
1344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1356e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom  void setOpcode(unsigned Op) { Opcode = Op; }
1364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1376e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom  unsigned getOpcode() const { return Opcode; }
1386e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom  const MCOperand &getOperand(unsigned i) const { return Operands[i]; }
140b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  MCOperand &getOperand(unsigned i) { return Operands[i]; }
141b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  unsigned getNumOperands() const { return Operands.size(); }
142b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
143b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  void addOperand(const MCOperand &Op) {
144b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    Operands.push_back(Op);
145b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam  }
146b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
147  void print(raw_ostream &OS, const MCAsmInfo *MAI) const;
148  void dump() const;
149
150  /// \brief Dump the MCInst as prettily as possible using the additional MC
151  /// structures, if given. Operators are separated by the \arg Separator
152  /// string.
153  void dump_pretty(raw_ostream &OS, const MCAsmInfo *MAI = 0,
154                   const MCInstPrinter *Printer = 0,
155                   StringRef Separator = " ") const;
156};
157
158
159} // end namespace llvm
160
161#endif
162