MachineInstrBuilder.h revision 8e5f2c6f65841542e2a7092553fe42a00048e4c7
1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//===-- CodeGen/MachineInstBuilder.h - Simplify creation of MIs -*- C++ -*-===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This file is distributed under the University of Illinois Open Source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file exposes a function named BuildMI, which is useful for dramatically 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// simplifying how MachineInstr's are created. It allows use of code like this: 129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch// 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// M = BuildMI(X86::ADDrr8, 2).addReg(argVal1).addReg(argVal2); 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef LLVM_CODEGEN_MACHINEINSTRBUILDER_H 1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#define LLVM_CODEGEN_MACHINEINSTRBUILDER_H 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/CodeGen/MachineBasicBlock.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/CodeGen/MachineFunction.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace llvm { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TargetInstrDesc; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MachineInstrBuilder { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MachineInstr *MI; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit MachineInstrBuilder(MachineInstr *mi) : MI(mi) {} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Allow automatic conversion to the machine instruction we are working on. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) operator MachineInstr*() const { return MI; } 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) operator MachineBasicBlock::iterator() const { return MI; } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// addReg - Add a new virtual register operand... 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MachineInstrBuilder &addReg(unsigned RegNo, bool isDef = false, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isImp = false, bool isKill = false, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isDead = false, unsigned SubReg = 0) const { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MI->addOperand(MachineOperand::CreateReg(RegNo, isDef, isImp, isKill, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isDead, SubReg)); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// addImm - Add a new immediate operand. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MachineInstrBuilder &addImm(int64_t Val) const { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MI->addOperand(MachineOperand::CreateImm(Val)); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MachineInstrBuilder &addMBB(MachineBasicBlock *MBB) const { 56b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MI->addOperand(MachineOperand::CreateMBB(MBB)); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MachineInstrBuilder &addFrameIndex(unsigned Idx) const { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MI->addOperand(MachineOperand::CreateFI(Idx)); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MachineInstrBuilder &addConstantPoolIndex(unsigned Idx, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int Offset = 0) const { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MI->addOperand(MachineOperand::CreateCPI(Idx, Offset)); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MachineInstrBuilder &addJumpTableIndex(unsigned Idx) const { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MI->addOperand(MachineOperand::CreateJTI(Idx)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MachineInstrBuilder &addGlobalAddress(GlobalValue *GV, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int Offset = 0) const { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MI->addOperand(MachineOperand::CreateGA(GV, Offset)); 7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return *this; 80 } 81 82 const MachineInstrBuilder &addExternalSymbol(const char *FnName) const{ 83 MI->addOperand(MachineOperand::CreateES(FnName, 0)); 84 return *this; 85 } 86}; 87 88/// BuildMI - Builder interface. Specify how to create the initial instruction 89/// itself. 90/// 91inline MachineInstrBuilder BuildMI(MachineFunction &MF, 92 const TargetInstrDesc &TID) { 93 return MachineInstrBuilder(MF.CreateMachineInstr(TID)); 94} 95 96/// BuildMI - This version of the builder sets up the first operand as a 97/// destination virtual register. 98/// 99inline MachineInstrBuilder BuildMI(MachineFunction &MF, 100 const TargetInstrDesc &TID, 101 unsigned DestReg) { 102 return MachineInstrBuilder(MF.CreateMachineInstr(TID)).addReg(DestReg, true); 103} 104 105/// BuildMI - This version of the builder inserts the newly-built 106/// instruction before the given position in the given MachineBasicBlock, and 107/// sets up the first operand as a destination virtual register. 108/// 109inline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 110 MachineBasicBlock::iterator I, 111 const TargetInstrDesc &TID, 112 unsigned DestReg) { 113 MachineInstr *MI = BB.getParent()->CreateMachineInstr(TID); 114 BB.insert(I, MI); 115 return MachineInstrBuilder(MI).addReg(DestReg, true); 116} 117 118/// BuildMI - This version of the builder inserts the newly-built 119/// instruction before the given position in the given MachineBasicBlock, and 120/// does NOT take a destination register. 121/// 122inline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 123 MachineBasicBlock::iterator I, 124 const TargetInstrDesc &TID) { 125 MachineInstr *MI = BB.getParent()->CreateMachineInstr(TID); 126 BB.insert(I, MI); 127 return MachineInstrBuilder(MI); 128} 129 130/// BuildMI - This version of the builder inserts the newly-built 131/// instruction at the end of the given MachineBasicBlock, and does NOT take a 132/// destination register. 133/// 134inline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, 135 const TargetInstrDesc &TID) { 136 return BuildMI(*BB, BB->end(), TID); 137} 138 139/// BuildMI - This version of the builder inserts the newly-built 140/// instruction at the end of the given MachineBasicBlock, and sets up the first 141/// operand as a destination virtual register. 142/// 143inline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, 144 const TargetInstrDesc &TID, 145 unsigned DestReg) { 146 return BuildMI(*BB, BB->end(), TID, DestReg); 147} 148 149} // End llvm namespace 150 151#endif 152