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 struct 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 MachineInstrBuilder &addReg(int RegNo) {
33 MI->addRegOperand(RegNo);
37 /// addReg - Add an LLVM value that is to be used as a register...x
39 MachineInstrBuilder &addReg(Value *V, bool isDef = false, bool isDNU = false){
40 MI->addRegOperand(V, isDef, isDNU);
44 /// addPCDisp - Add an LLVM value to be treated as a PC relative
47 MachineInstrBuilder &addPCDisp(Value *V) {
48 MI->addPCDispOperand(V);
52 /// addMReg - Add a machine register operand...
54 MachineInstrBuilder &addMReg(int Reg, bool isDef=false) {
55 MI->addMachineRegOperand(Reg, isDef);
59 /// addSImm - Add a new sign extended immediate operand...
61 MachineInstrBuilder &addSImm(int64_t val) {
62 MI->addSignExtImmOperand(val);
66 /// addZImm - Add a new zero extended immediate operand...
68 MachineInstrBuilder &addZImm(int64_t Val) {
69 MI->addZeroExtImmOperand(Val);
74 /// BuildMI - Builder interface. Specify how to create the initial instruction
77 inline MachineInstrBuilder BuildMI(MachineOpCode Opcode, unsigned NumOperands) {
78 return MachineInstrBuilder(new MachineInstr(Opcode, NumOperands, true, true));
82 inline MachineInstrBuilder BuildMI(MBasicBlock *BB, MachineOpCode Opcode,
83 unsigned DestReg = 0) {
84 return MachineInstrBuilder(new MachineInstr(BB, Opcode, DestReg));