1 //===-- llvm/MC/MCInst.h - MCInst class -------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains the declaration of the MCInst and MCOperand classes, which
11 // is the basic representation used to represent low-level machine code
14 //===----------------------------------------------------------------------===//
16 #ifndef LLVM_MC_MCINST_H
17 #define LLVM_MC_MCINST_H
19 #include "llvm/MC/MCValue.h"
20 #include "llvm/ADT/SmallVector.h"
21 #include "llvm/Support/DataTypes.h"
22 #include "llvm/Support/DebugLoc.h"
26 /// MCOperand - Instances of this class represent operands of the MCInst class.
27 /// This is a simple discriminated union.
29 enum MachineOperandType {
30 kInvalid, ///< Uninitialized.
31 kRegister, ///< Register operand.
32 kImmediate, ///< Immediate operand.
33 kMBBLabel, ///< Basic block label.
34 kMCValue ///< Relocatable immediate operand.
49 MCOperand() : Kind(kInvalid) {}
50 MCOperand(const MCOperand &RHS) { *this = RHS; }
52 bool isValid() const { return Kind != kInvalid; }
53 bool isReg() const { return Kind == kRegister; }
54 bool isImm() const { return Kind == kImmediate; }
55 bool isMBBLabel() const { return Kind == kMBBLabel; }
56 bool isMCValue() const { return Kind == kMCValue; }
58 /// getReg - Returns the register number.
59 unsigned getReg() const {
60 assert(isReg() && "This is not a register operand!");
64 /// setReg - Set the register number.
65 void setReg(unsigned Reg) {
66 assert(isReg() && "This is not a register operand!");
70 int64_t getImm() const {
71 assert(isImm() && "This is not an immediate");
74 void setImm(int64_t Val) {
75 assert(isImm() && "This is not an immediate");
79 unsigned getMBBLabelFunction() const {
80 assert(isMBBLabel() && "Wrong accessor");
81 return MBBLabel.FunctionNo;
83 unsigned getMBBLabelBlock() const {
84 assert(isMBBLabel() && "Wrong accessor");
85 return MBBLabel.BlockNo;
88 const MCValue &getMCValue() const {
89 assert(isMCValue() && "This is not an MCValue");
92 void setMCValue(const MCValue &Val) {
93 assert(isMCValue() && "This is not an MCValue");
97 void MakeReg(unsigned Reg) {
101 void MakeImm(int64_t Val) {
105 void MakeMBBLabel(unsigned Fn, unsigned MBB) {
107 MBBLabel.FunctionNo = Fn;
108 MBBLabel.BlockNo = MBB;
110 void MakeMCValue(const MCValue &Val) {
117 /// MCInst - Instances of this class represent a single low-level machine
121 SmallVector<MCOperand, 8> Operands;
123 MCInst() : Opcode(~0U) {}
125 void setOpcode(unsigned Op) { Opcode = Op; }
127 unsigned getOpcode() const { return Opcode; }
128 DebugLoc getDebugLoc() const { return DebugLoc(); }
130 const MCOperand &getOperand(unsigned i) const { return Operands[i]; }
131 MCOperand &getOperand(unsigned i) { return Operands[i]; }
132 unsigned getNumOperands() const { return Operands.size(); }
134 void addOperand(const MCOperand &Op) {
135 Operands.push_back(Op);
140 } // end namespace llvm