1 //===-- llvm/MC/MCInstBuilder.h - Simplify creation of MCInsts --*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file contains the MCInstBuilder class for convenient creation of
10 // MCInsts.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_MC_MCINSTBUILDER_H
15 #define LLVM_MC_MCINSTBUILDER_H
16 
17 #include "llvm/MC/MCInst.h"
18 
19 namespace llvm {
20 
21 class MCInstBuilder {
22   MCInst Inst;
23 
24 public:
25   /// Create a new MCInstBuilder for an MCInst with a specific opcode.
MCInstBuilder(unsigned Opcode)26   MCInstBuilder(unsigned Opcode) {
27     Inst.setOpcode(Opcode);
28   }
29 
30   /// Add a new register operand.
addReg(unsigned Reg)31   MCInstBuilder &addReg(unsigned Reg) {
32     Inst.addOperand(MCOperand::createReg(Reg));
33     return *this;
34   }
35 
36   /// Add a new integer immediate operand.
addImm(int64_t Val)37   MCInstBuilder &addImm(int64_t Val) {
38     Inst.addOperand(MCOperand::createImm(Val));
39     return *this;
40   }
41 
42   /// Add a new single floating point immediate operand.
addSFPImm(uint32_t Val)43   MCInstBuilder &addSFPImm(uint32_t Val) {
44     Inst.addOperand(MCOperand::createSFPImm(Val));
45     return *this;
46   }
47 
48   /// Add a new floating point immediate operand.
addDFPImm(uint64_t Val)49   MCInstBuilder &addDFPImm(uint64_t Val) {
50     Inst.addOperand(MCOperand::createDFPImm(Val));
51     return *this;
52   }
53 
54   /// Add a new MCExpr operand.
addExpr(const MCExpr * Val)55   MCInstBuilder &addExpr(const MCExpr *Val) {
56     Inst.addOperand(MCOperand::createExpr(Val));
57     return *this;
58   }
59 
60   /// Add a new MCInst operand.
addInst(const MCInst * Val)61   MCInstBuilder &addInst(const MCInst *Val) {
62     Inst.addOperand(MCOperand::createInst(Val));
63     return *this;
64   }
65 
66   /// Add an operand.
addOperand(const MCOperand & Op)67   MCInstBuilder &addOperand(const MCOperand &Op) {
68     Inst.addOperand(Op);
69     return *this;
70   }
71 
72   operator MCInst&() {
73     return Inst;
74   }
75 };
76 
77 } // end namespace llvm
78 
79 #endif
80