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