| //===-- llvm/MC/MCInst.h - MCInst class -------------------------*- C++ -*-===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file contains the declaration of the MCInst and MCOperand classes, which | |
| // is the basic representation used to represent low-level machine code | |
| // instructions. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_MC_MCINST_H | |
| #define LLVM_MC_MCINST_H | |
| #include "llvm/ADT/SmallVector.h" | |
| #include "llvm/ADT/StringRef.h" | |
| #include "llvm/Support/DataTypes.h" | |
| namespace llvm { | |
| class raw_ostream; | |
| class MCAsmInfo; | |
| class MCInstPrinter; | |
| class MCExpr; | |
| /// MCOperand - Instances of this class represent operands of the MCInst class. | |
| /// This is a simple discriminated union. | |
| class MCOperand { | |
| enum MachineOperandType { | |
| kInvalid, ///< Uninitialized. | |
| kRegister, ///< Register operand. | |
| kImmediate, ///< Immediate operand. | |
| kFPImmediate, ///< Floating-point immediate operand. | |
| kExpr ///< Relocatable immediate operand. | |
| }; | |
| unsigned char Kind; | |
| union { | |
| unsigned RegVal; | |
| int64_t ImmVal; | |
| double FPImmVal; | |
| const MCExpr *ExprVal; | |
| }; | |
| public: | |
| MCOperand() : Kind(kInvalid), FPImmVal(0.0) {} | |
| bool isValid() const { return Kind != kInvalid; } | |
| bool isReg() const { return Kind == kRegister; } | |
| bool isImm() const { return Kind == kImmediate; } | |
| bool isFPImm() const { return Kind == kFPImmediate; } | |
| bool isExpr() const { return Kind == kExpr; } | |
| /// getReg - Returns the register number. | |
| unsigned getReg() const { | |
| assert(isReg() && "This is not a register operand!"); | |
| return RegVal; | |
| } | |
| /// setReg - Set the register number. | |
| void setReg(unsigned Reg) { | |
| assert(isReg() && "This is not a register operand!"); | |
| RegVal = Reg; | |
| } | |
| int64_t getImm() const { | |
| assert(isImm() && "This is not an immediate"); | |
| return ImmVal; | |
| } | |
| void setImm(int64_t Val) { | |
| assert(isImm() && "This is not an immediate"); | |
| ImmVal = Val; | |
| } | |
| double getFPImm() const { | |
| assert(isFPImm() && "This is not an FP immediate"); | |
| return FPImmVal; | |
| } | |
| void setFPImm(double Val) { | |
| assert(isFPImm() && "This is not an FP immediate"); | |
| FPImmVal = Val; | |
| } | |
| const MCExpr *getExpr() const { | |
| assert(isExpr() && "This is not an expression"); | |
| return ExprVal; | |
| } | |
| void setExpr(const MCExpr *Val) { | |
| assert(isExpr() && "This is not an expression"); | |
| ExprVal = Val; | |
| } | |
| static MCOperand CreateReg(unsigned Reg) { | |
| MCOperand Op; | |
| Op.Kind = kRegister; | |
| Op.RegVal = Reg; | |
| return Op; | |
| } | |
| static MCOperand CreateImm(int64_t Val) { | |
| MCOperand Op; | |
| Op.Kind = kImmediate; | |
| Op.ImmVal = Val; | |
| return Op; | |
| } | |
| static MCOperand CreateFPImm(double Val) { | |
| MCOperand Op; | |
| Op.Kind = kFPImmediate; | |
| Op.FPImmVal = Val; | |
| return Op; | |
| } | |
| static MCOperand CreateExpr(const MCExpr *Val) { | |
| MCOperand Op; | |
| Op.Kind = kExpr; | |
| Op.ExprVal = Val; | |
| return Op; | |
| } | |
| void print(raw_ostream &OS, const MCAsmInfo *MAI) const; | |
| void dump() const; | |
| }; | |
| /// MCInst - Instances of this class represent a single low-level machine | |
| /// instruction. | |
| class MCInst { | |
| unsigned Opcode; | |
| SmallVector<MCOperand, 8> Operands; | |
| public: | |
| MCInst() : Opcode(0) {} | |
| void setOpcode(unsigned Op) { Opcode = Op; } | |
| unsigned getOpcode() const { return Opcode; } | |
| const MCOperand &getOperand(unsigned i) const { return Operands[i]; } | |
| MCOperand &getOperand(unsigned i) { return Operands[i]; } | |
| unsigned getNumOperands() const { return Operands.size(); } | |
| void addOperand(const MCOperand &Op) { | |
| Operands.push_back(Op); | |
| } | |
| void clear() { Operands.clear(); } | |
| size_t size() { return Operands.size(); } | |
| typedef SmallVector<MCOperand, 8>::iterator iterator; | |
| iterator begin() { return Operands.begin(); } | |
| iterator end() { return Operands.end(); } | |
| iterator insert(iterator I, const MCOperand &Op) { | |
| return Operands.insert(I, Op); | |
| } | |
| void print(raw_ostream &OS, const MCAsmInfo *MAI) const; | |
| void dump() const; | |
| /// \brief Dump the MCInst as prettily as possible using the additional MC | |
| /// structures, if given. Operators are separated by the \arg Separator | |
| /// string. | |
| void dump_pretty(raw_ostream &OS, const MCAsmInfo *MAI = 0, | |
| const MCInstPrinter *Printer = 0, | |
| StringRef Separator = " ") const; | |
| }; | |
| inline raw_ostream& operator<<(raw_ostream &OS, const MCOperand &MO) { | |
| MO.print(OS, 0); | |
| return OS; | |
| } | |
| inline raw_ostream& operator<<(raw_ostream &OS, const MCInst &MI) { | |
| MI.print(OS, 0); | |
| return OS; | |
| } | |
| } // end namespace llvm | |
| #endif |