1 //===-- CodeGen/MachineInstBuilder.h - Simplify creation of MIs -*- C++ -*-===//
3 // This file exposes a function named BuildMI, which is useful for dramatically
4 // simplifying how MachineInstr's are created. Instead of using code like this:
6 // M = new MachineInstr(X86::ADDrr32);
7 // M->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister, argVal1);
8 // M->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister, argVal2);
10 // we can now use code like this:
12 // M = BuildMI(X86::ADDrr8, 2).addReg(argVal1).addReg(argVal2);
14 //===----------------------------------------------------------------------===//
16 #ifndef LLVM_CODEGEN_MACHINEINSTRBUILDER_H
17 #define LLVM_CODEGEN_MACHINEINSTRBUILDER_H
19 #include "llvm/CodeGen/MachineInstr.h"
21 class MachineInstrBuilder {
24 MachineInstrBuilder(MachineInstr *mi) : MI(mi) {}
26 /// Allow automatic conversion to the machine instruction we are working on.
28 operator MachineInstr*() const { return MI; }
30 /// addReg - Add a new virtual register operand...
32 const MachineInstrBuilder &addReg(int RegNo,
33 MOTy::UseType Ty = MOTy::Use) const {
34 MI->addRegOperand(RegNo, Ty);
38 /// addReg - Add an LLVM value that is to be used as a register...
40 const MachineInstrBuilder &addReg(Value *V,
41 MOTy::UseType Ty = MOTy::Use) const {
42 MI->addRegOperand(V, Ty);
46 /// addReg - Add an LLVM value that is to be used as a register...
48 const MachineInstrBuilder &addCCReg(Value *V,
49 MOTy::UseType Ty = MOTy::Use) const {
50 MI->addCCRegOperand(V, Ty);
54 /// addRegDef - Add an LLVM value that is to be defined as a register... this
55 /// is the same as addReg(V, MOTy::Def).
57 const MachineInstrBuilder &addRegDef(Value *V) const {
58 return addReg(V, MOTy::Def);
61 /// addPCDisp - Add an LLVM value to be treated as a PC relative
64 const MachineInstrBuilder &addPCDisp(Value *V) const {
65 MI->addPCDispOperand(V);
69 /// addMReg - Add a machine register operand...
71 const MachineInstrBuilder &addMReg(int Reg,
72 MOTy::UseType Ty = MOTy::Use) const {
73 MI->addMachineRegOperand(Reg, Ty);
77 /// addSImm - Add a new sign extended immediate operand...
79 const MachineInstrBuilder &addSImm(int64_t val) const {
80 MI->addSignExtImmOperand(val);
84 /// addZImm - Add a new zero extended immediate operand...
86 const MachineInstrBuilder &addZImm(int64_t Val) const {
87 MI->addZeroExtImmOperand(Val);
91 const MachineInstrBuilder &addMBB(MachineBasicBlock *MBB) const {
92 MI->addMachineBasicBlockOperand(MBB);
96 const MachineInstrBuilder &addFrameIndex(unsigned Idx) const {
97 MI->addFrameIndexOperand(Idx);
101 const MachineInstrBuilder &addConstantPoolIndex(unsigned Idx) const {
102 MI->addConstantPoolIndexOperand(Idx);
106 const MachineInstrBuilder &addGlobalAddress(GlobalValue *GV,
107 bool isPCRelative = false) const {
108 MI->addGlobalAddressOperand(GV, isPCRelative);
112 const MachineInstrBuilder &addExternalSymbol(const std::string &Name,
113 bool isPCRelative = false) const{
114 MI->addExternalSymbolOperand(Name, isPCRelative);
119 /// BuildMI - Builder interface. Specify how to create the initial instruction
120 /// itself. NumOperands is the number of operands to the machine instruction to
121 /// allow for memory efficient representation of machine instructions.
123 inline MachineInstrBuilder BuildMI(int Opcode, unsigned NumOperands) {
124 return MachineInstrBuilder(new MachineInstr(Opcode, NumOperands, true, true));
127 /// BuildMI - This version of the builder also sets up the first "operand" as a
128 /// destination virtual register. NumOperands is the number of additional add*
129 /// calls that are expected, it does not include the destination register.
131 inline MachineInstrBuilder BuildMI(int Opcode, unsigned NumOperands,
133 return MachineInstrBuilder(new MachineInstr(Opcode, NumOperands+1,
134 true, true)).addReg(DestReg, MOTy::Def);
138 /// BuildMI - This version of the builder inserts the built MachineInstr into
139 /// the specified MachineBasicBlock.
141 inline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, int Opcode,
142 unsigned NumOperands) {
143 return MachineInstrBuilder(new MachineInstr(BB, Opcode, NumOperands));
146 /// BuildMI - This version of the builder inserts the built MachineInstr into
147 /// the specified MachineBasicBlock, and also sets up the first "operand" as a
148 /// destination virtual register. NumOperands is the number of additional add*
149 /// calls that are expected, it does not include the destination register.
151 inline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, int Opcode,
152 unsigned NumOperands, unsigned DestReg) {
153 return MachineInstrBuilder(new MachineInstr(BB, Opcode,
154 NumOperands+1)).addReg(DestReg,