Include DataTypes.h for 'uint64_t'.
[oota-llvm.git] / include / llvm / MC / MCInst.h
1 //===-- llvm/MC/MCInst.h - MCInst class -------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
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
12 // instructions.
13 //
14 //===----------------------------------------------------------------------===//
15
16
17 #ifndef LLVM_MC_MCINST_H
18 #define LLVM_MC_MCINST_H
19
20 #include "llvm/ADT/SmallVector.h"
21 #include "llvm/Support/DataTypes.h"
22
23 namespace llvm {
24
25 /// MCOperand - Instances of this class represent operands of the MCInst class.
26 /// This is a simple discriminated union.
27 class MCOperand {
28   enum MachineOperandType {
29     kInvalid,                 ///< Uninitialized.
30     kRegister,                ///< Register operand.
31     kImmediate                ///< Immediate operand.
32   };
33   unsigned char Kind;
34   
35   union {
36     unsigned RegVal;
37     uint64_t ImmVal;
38   };
39 public:
40   
41   MCOperand() : Kind(kInvalid) {}
42   MCOperand(const MCOperand &RHS) { *this = RHS; }
43
44   bool isReg() const { return Kind == kRegister; }
45   bool isImm() const { return Kind == kImmediate; }
46   
47   /// getReg - Returns the register number.
48   unsigned getReg() const {
49     assert(isReg() && "This is not a register operand!");
50     return RegVal;
51   }
52
53   /// setReg - Set the register number.
54   void setReg(unsigned Reg) {
55     assert(isReg() && "This is not a register operand!");
56     RegVal = Reg;
57   }
58   
59   uint64_t getImm() const {
60     assert(isImm() && "This is not an immediate");
61     return ImmVal;
62   }
63   void setImm(uint64_t Val) {
64     assert(isImm() && "This is not an immediate");
65     ImmVal = Val;
66   }
67   
68   void MakeReg(unsigned Reg) {
69     Kind = kRegister;
70     RegVal = Reg;
71   }
72   void MakeImm(uint64_t Val) {
73     Kind = kImmediate;
74     ImmVal = Val;
75   }
76 };
77
78   
79 /// MCInst - Instances of this class represent a single low-level machine
80 /// instruction. 
81 class MCInst {
82   unsigned Opcode;
83   SmallVector<MCOperand, 8> Operands;
84 public:
85   MCInst() : Opcode(~0U) {}
86   
87   
88   
89 };
90
91
92 } // end namespace llvm
93
94 #endif