MachineInstrBuilder.h revision 6fbcc26f1460eaee4e0eb8b426fc1ff0c7af11be
1f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//===-- CodeGen/MachineInstBuilder.h - Simplify creation of MIs -*- C++ -*-===// 26fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// The LLVM Compiler Infrastructure 46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 56fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// This file was developed by the LLVM research group and is distributed under 66fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details. 76fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===// 9f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// 10f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// This file exposes a function named BuildMI, which is useful for dramatically 11f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// simplifying how MachineInstr's are created. Instead of using code like this: 12f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// 13f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// M = new MachineInstr(X86::ADDrr32); 14f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// M->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister, argVal1); 15f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// M->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister, argVal2); 16f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// 17f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// we can now use code like this: 18f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// 199ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner// M = BuildMI(X86::ADDrr8, 2).addReg(argVal1).addReg(argVal2); 20f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// 21f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//===----------------------------------------------------------------------===// 22f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 23f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#ifndef LLVM_CODEGEN_MACHINEINSTRBUILDER_H 24f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#define LLVM_CODEGEN_MACHINEINSTRBUILDER_H 25f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 26f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#include "llvm/CodeGen/MachineInstr.h" 27f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 289d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattnerclass MachineInstrBuilder { 29f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner MachineInstr *MI; 309d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattnerpublic: 31f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner MachineInstrBuilder(MachineInstr *mi) : MI(mi) {} 32f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 33f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// Allow automatic conversion to the machine instruction we are working on. 34f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// 35f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner operator MachineInstr*() const { return MI; } 36f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 379ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner /// addReg - Add a new virtual register operand... 38f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// 3932f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner const MachineInstrBuilder &addReg(int RegNo, 4032f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner MOTy::UseType Ty = MOTy::Use) const { 4132f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner MI->addRegOperand(RegNo, Ty); 42f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner return *this; 43f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner } 44f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 456559bb96a9901af21c6037675f9508373773bd35Brian Gaeke /// addReg - Add an LLVM value that is to be used as a register... 469ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner /// 4732f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner const MachineInstrBuilder &addReg(Value *V, 4832f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner MOTy::UseType Ty = MOTy::Use) const { 4932f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner MI->addRegOperand(V, Ty); 50f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner return *this; 51f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner } 52f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 5383435fbaf98a89cc5d6f13a68bab7e52e8fb6cb3Chris Lattner /// addReg - Add an LLVM value that is to be used as a register... 5483435fbaf98a89cc5d6f13a68bab7e52e8fb6cb3Chris Lattner /// 5583435fbaf98a89cc5d6f13a68bab7e52e8fb6cb3Chris Lattner const MachineInstrBuilder &addCCReg(Value *V, 5683435fbaf98a89cc5d6f13a68bab7e52e8fb6cb3Chris Lattner MOTy::UseType Ty = MOTy::Use) const { 5783435fbaf98a89cc5d6f13a68bab7e52e8fb6cb3Chris Lattner MI->addCCRegOperand(V, Ty); 5883435fbaf98a89cc5d6f13a68bab7e52e8fb6cb3Chris Lattner return *this; 5983435fbaf98a89cc5d6f13a68bab7e52e8fb6cb3Chris Lattner } 6083435fbaf98a89cc5d6f13a68bab7e52e8fb6cb3Chris Lattner 61e387de30841a5e106015379b6c47c568cde8b06eChris Lattner /// addRegDef - Add an LLVM value that is to be defined as a register... this 62e387de30841a5e106015379b6c47c568cde8b06eChris Lattner /// is the same as addReg(V, MOTy::Def). 636559bb96a9901af21c6037675f9508373773bd35Brian Gaeke /// 64e387de30841a5e106015379b6c47c568cde8b06eChris Lattner const MachineInstrBuilder &addRegDef(Value *V) const { 65e387de30841a5e106015379b6c47c568cde8b06eChris Lattner return addReg(V, MOTy::Def); 666559bb96a9901af21c6037675f9508373773bd35Brian Gaeke } 676559bb96a9901af21c6037675f9508373773bd35Brian Gaeke 689ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner /// addPCDisp - Add an LLVM value to be treated as a PC relative 699ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner /// displacement... 709ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner /// 715494c7ed9dd8f5a3dbaf42d2b9ddb9cd3a85aa34Chris Lattner const MachineInstrBuilder &addPCDisp(Value *V) const { 72f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner MI->addPCDispOperand(V); 73f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner return *this; 74f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner } 75f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 769ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner /// addMReg - Add a machine register operand... 779ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner /// 7832f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner const MachineInstrBuilder &addMReg(int Reg, 7932f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner MOTy::UseType Ty = MOTy::Use) const { 8032f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner MI->addMachineRegOperand(Reg, Ty); 81f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner return *this; 82f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner } 83f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 84f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// addSImm - Add a new sign extended immediate operand... 85f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// 865494c7ed9dd8f5a3dbaf42d2b9ddb9cd3a85aa34Chris Lattner const MachineInstrBuilder &addSImm(int64_t val) const { 87f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner MI->addSignExtImmOperand(val); 88f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner return *this; 89f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner } 90f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 91f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// addZImm - Add a new zero extended immediate operand... 92f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// 935494c7ed9dd8f5a3dbaf42d2b9ddb9cd3a85aa34Chris Lattner const MachineInstrBuilder &addZImm(int64_t Val) const { 94f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner MI->addZeroExtImmOperand(Val); 95f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner return *this; 96f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner } 978cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner 988cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner const MachineInstrBuilder &addMBB(MachineBasicBlock *MBB) const { 998cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner MI->addMachineBasicBlockOperand(MBB); 1008cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner return *this; 1018cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner } 102aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner 103aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner const MachineInstrBuilder &addFrameIndex(unsigned Idx) const { 104aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner MI->addFrameIndexOperand(Idx); 105aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner return *this; 106aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner } 1079d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 1089d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner const MachineInstrBuilder &addConstantPoolIndex(unsigned Idx) const { 1099d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner MI->addConstantPoolIndexOperand(Idx); 1109d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 1119d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 1129d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 1139d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner const MachineInstrBuilder &addGlobalAddress(GlobalValue *GV, 1149d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner bool isPCRelative = false) const { 1159d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner MI->addGlobalAddressOperand(GV, isPCRelative); 1169d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 1179d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 1189d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 1199d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner const MachineInstrBuilder &addExternalSymbol(const std::string &Name, 1209d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner bool isPCRelative = false) const{ 1219d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner MI->addExternalSymbolOperand(Name, isPCRelative); 1229d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 1239d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 124f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner}; 125f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 126f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner/// BuildMI - Builder interface. Specify how to create the initial instruction 1279cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// itself. NumOperands is the number of operands to the machine instruction to 1289cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// allow for memory efficient representation of machine instructions. 129f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner/// 1304052cf998f826db723e783bc1550c09e69402b29Chris Lattnerinline MachineInstrBuilder BuildMI(int Opcode, unsigned NumOperands) { 131f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner return MachineInstrBuilder(new MachineInstr(Opcode, NumOperands, true, true)); 132f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner} 133f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 134367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner/// BuildMI - This version of the builder also sets up the first "operand" as a 135367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner/// destination virtual register. NumOperands is the number of additional add* 136367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner/// calls that are expected, it does not include the destination register. 137367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner/// 1384052cf998f826db723e783bc1550c09e69402b29Chris Lattnerinline MachineInstrBuilder BuildMI(int Opcode, unsigned NumOperands, 139367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner unsigned DestReg) { 140367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner return MachineInstrBuilder(new MachineInstr(Opcode, NumOperands+1, 141367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner true, true)).addReg(DestReg, MOTy::Def); 142367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner} 143367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner 144367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner 1459cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// BuildMI - This version of the builder inserts the built MachineInstr into 1469cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// the specified MachineBasicBlock. 1479cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// 1484052cf998f826db723e783bc1550c09e69402b29Chris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, int Opcode, 1497db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner unsigned NumOperands) { 1507db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner return MachineInstrBuilder(new MachineInstr(BB, Opcode, NumOperands)); 151f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner} 1527db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner 1539cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// BuildMI - This version of the builder inserts the built MachineInstr into 1549cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// the specified MachineBasicBlock, and also sets up the first "operand" as a 1559cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// destination virtual register. NumOperands is the number of additional add* 1569cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// calls that are expected, it does not include the destination register. 1579cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// 1584052cf998f826db723e783bc1550c09e69402b29Chris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, int Opcode, 1599cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner unsigned NumOperands, unsigned DestReg) { 1609cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner return MachineInstrBuilder(new MachineInstr(BB, Opcode, 1619cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner NumOperands+1)).addReg(DestReg, 16232f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner MOTy::Def); 1639cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner} 1649cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner 165f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#endif 166