MachineInstrBuilder.h revision ceb408f6a263e319683209ae5c6f8d1e3e4d9b69
1f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//===-- CodeGen/MachineInstBuilder.h - Simplify creation of MIs -*- C++ -*-===// 2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 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. 7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===// 9f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// 10f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// This file exposes a function named BuildMI, which is useful for dramatically 11ceb408f6a263e319683209ae5c6f8d1e3e4d9b69Chris Lattner// simplifying how MachineInstr's are created. It allows use of code like this: 12f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// 139ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner// M = BuildMI(X86::ADDrr8, 2).addReg(argVal1).addReg(argVal2); 14f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// 15f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//===----------------------------------------------------------------------===// 16f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 17f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#ifndef LLVM_CODEGEN_MACHINEINSTRBUILDER_H 18f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#define LLVM_CODEGEN_MACHINEINSTRBUILDER_H 19f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 20c3c106ca59e44032041414c72ce584451f1d885fChris Lattner#include "llvm/CodeGen/MachineBasicBlock.h" 21f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 22d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 249d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattnerclass MachineInstrBuilder { 25f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner MachineInstr *MI; 269d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattnerpublic: 27f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner MachineInstrBuilder(MachineInstr *mi) : MI(mi) {} 28f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 29f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// Allow automatic conversion to the machine instruction we are working on. 30f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// 31f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner operator MachineInstr*() const { return MI; } 32024e91f6f6b9c65d767efe507df213c5c53744c7Chris Lattner operator MachineBasicBlock::iterator() const { return MI; } 33f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 349ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner /// addReg - Add a new virtual register operand... 35f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// 36890f92328d5478e050d2eba8f4de24737a04a812Alkis Evlogimenos const MachineInstrBuilder &addReg( 37890f92328d5478e050d2eba8f4de24737a04a812Alkis Evlogimenos int RegNo, 38890f92328d5478e050d2eba8f4de24737a04a812Alkis Evlogimenos MachineOperand::UseType Ty = MachineOperand::Use) const { 3932f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner MI->addRegOperand(RegNo, Ty); 40f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner return *this; 41f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner } 42f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 436a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner /// addImm - Add a new immediate operand. 446a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner /// 456a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner const MachineInstrBuilder &addImm(int Val) const { 466a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner MI->addZeroExtImmOperand(Val); 476a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner return *this; 486a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner } 49f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 50f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// addSImm - Add a new sign extended immediate operand... 51f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// 526a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner const MachineInstrBuilder &addSImm(int val) const { 53f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner MI->addSignExtImmOperand(val); 54f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner return *this; 55f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner } 56f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 57f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// addZImm - Add a new zero extended immediate operand... 58f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// 596a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner const MachineInstrBuilder &addZImm(unsigned Val) const { 60f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner MI->addZeroExtImmOperand(Val); 61f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner return *this; 62f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner } 638cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner 642d4c88311801d6eba48b257a43aee8a6d61299a6Duraid Madina /// addImm64 - Add a new 64-bit immediate operand... 659696a90ee66e1c6c818c8de3d9ffc32732d9d82fDuraid Madina /// 662d4c88311801d6eba48b257a43aee8a6d61299a6Duraid Madina const MachineInstrBuilder &addImm64(uint64_t Val) const { 679696a90ee66e1c6c818c8de3d9ffc32732d9d82fDuraid Madina MI->addZeroExtImm64Operand(Val); 689696a90ee66e1c6c818c8de3d9ffc32732d9d82fDuraid Madina return *this; 699696a90ee66e1c6c818c8de3d9ffc32732d9d82fDuraid Madina } 709696a90ee66e1c6c818c8de3d9ffc32732d9d82fDuraid Madina 718cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner const MachineInstrBuilder &addMBB(MachineBasicBlock *MBB) const { 728cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner MI->addMachineBasicBlockOperand(MBB); 738cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner return *this; 748cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner } 75aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner 76aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner const MachineInstrBuilder &addFrameIndex(unsigned Idx) const { 77aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner MI->addFrameIndexOperand(Idx); 78aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner return *this; 79aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner } 809d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 81404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng const MachineInstrBuilder &addConstantPoolIndex(unsigned Idx, 82404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng int Offset = 0) const { 83404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng MI->addConstantPoolIndexOperand(Idx, Offset); 849d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 859d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 869d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 87ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng const MachineInstrBuilder &addJumpTableIndex(unsigned Idx) const { 88ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng MI->addJumpTableIndexOperand(Idx); 89ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng return *this; 90ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng } 91ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng 929d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner const MachineInstrBuilder &addGlobalAddress(GlobalValue *GV, 93404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng int Offset = 0) const { 94ea50fabfd4e5fad25a25b312f64a9b2a53363586Chris Lattner MI->addGlobalAddressOperand(GV, Offset); 959d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 969d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 979d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 98ea50fabfd4e5fad25a25b312f64a9b2a53363586Chris Lattner const MachineInstrBuilder &addExternalSymbol(const char *FnName) const{ 99ea50fabfd4e5fad25a25b312f64a9b2a53363586Chris Lattner MI->addExternalSymbolOperand(FnName); 1009d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 1019d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 102f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner}; 103f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 104f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner/// BuildMI - Builder interface. Specify how to create the initial instruction 1059cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// itself. NumOperands is the number of operands to the machine instruction to 1069cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// allow for memory efficient representation of machine instructions. 107f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner/// 1084052cf998f826db723e783bc1550c09e69402b29Chris Lattnerinline MachineInstrBuilder BuildMI(int Opcode, unsigned NumOperands) { 109f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner return MachineInstrBuilder(new MachineInstr(Opcode, NumOperands, true, true)); 110f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner} 111f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 11291ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder sets up the first operand as a 113367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner/// destination virtual register. NumOperands is the number of additional add* 11491ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// calls that are expected, not including the destination register. 115367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner/// 116890f92328d5478e050d2eba8f4de24737a04a812Alkis Evlogimenosinline MachineInstrBuilder BuildMI( 117890f92328d5478e050d2eba8f4de24737a04a812Alkis Evlogimenos int Opcode, unsigned NumOperands, 118890f92328d5478e050d2eba8f4de24737a04a812Alkis Evlogimenos unsigned DestReg, 119890f92328d5478e050d2eba8f4de24737a04a812Alkis Evlogimenos MachineOperand::UseType useType = MachineOperand::Def) { 120367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner return MachineInstrBuilder(new MachineInstr(Opcode, NumOperands+1, 12114be64018fb38d1fa535b9cd12d11371f4eba3b5Alkis Evlogimenos true, true)).addReg(DestReg, useType); 122367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner} 123367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner 12491ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 12591ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction before the given position in the given MachineBasicBlock, and 12691ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// sets up the first operand as a destination virtual register. 12791ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// NumOperands is the number of additional add* calls that are expected, 12891ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// not including the destination register. 12991ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// 130c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 131c3c106ca59e44032041414c72ce584451f1d885fChris Lattner MachineBasicBlock::iterator I, 132c3c106ca59e44032041414c72ce584451f1d885fChris Lattner int Opcode, unsigned NumOperands, 133c3c106ca59e44032041414c72ce584451f1d885fChris Lattner unsigned DestReg) { 134c3c106ca59e44032041414c72ce584451f1d885fChris Lattner MachineInstr *MI = new MachineInstr(Opcode, NumOperands+1, true, true); 135c3c106ca59e44032041414c72ce584451f1d885fChris Lattner BB.insert(I, MI); 136c3c106ca59e44032041414c72ce584451f1d885fChris Lattner return MachineInstrBuilder(MI).addReg(DestReg, MachineOperand::Def); 137c3c106ca59e44032041414c72ce584451f1d885fChris Lattner} 138c3c106ca59e44032041414c72ce584451f1d885fChris Lattner 13991ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 14091ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction before the given position in the given MachineBasicBlock, and 14191ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// does NOT take a destination register. 14291ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// 143c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 144c3c106ca59e44032041414c72ce584451f1d885fChris Lattner MachineBasicBlock::iterator I, 145c3c106ca59e44032041414c72ce584451f1d885fChris Lattner int Opcode, unsigned NumOperands) { 146c3c106ca59e44032041414c72ce584451f1d885fChris Lattner MachineInstr *MI = new MachineInstr(Opcode, NumOperands, true, true); 147c3c106ca59e44032041414c72ce584451f1d885fChris Lattner BB.insert(I, MI); 148c3c106ca59e44032041414c72ce584451f1d885fChris Lattner return MachineInstrBuilder(MI); 149c3c106ca59e44032041414c72ce584451f1d885fChris Lattner} 150c3c106ca59e44032041414c72ce584451f1d885fChris Lattner 15191ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 15291ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction at the end of the given MachineBasicBlock, and does NOT take a 15391ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// destination register. 1549cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// 1554052cf998f826db723e783bc1550c09e69402b29Chris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, int Opcode, 1567db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner unsigned NumOperands) { 157c3c106ca59e44032041414c72ce584451f1d885fChris Lattner return BuildMI(*BB, BB->end(), Opcode, NumOperands); 158f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner} 1597db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner 16091ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 16191ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction at the end of the given MachineBasicBlock, and sets up the first 16291ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// operand as a destination virtual register. NumOperands is the number of 16391ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// additional add* calls that are expected, not including the destination 16491ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// register. 1659cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// 1664052cf998f826db723e783bc1550c09e69402b29Chris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, int Opcode, 1679cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner unsigned NumOperands, unsigned DestReg) { 168c3c106ca59e44032041414c72ce584451f1d885fChris Lattner return BuildMI(*BB, BB->end(), Opcode, NumOperands, DestReg); 1699cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner} 1709cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner 171d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 172d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 173f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#endif 174