MachineInstrBuilder.h revision 7ed47a13356daed2a34cd2209a31f92552e3bdd8
1f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//===-- CodeGen/MachineInstBuilder.h - Simplify creation of MIs -*- C++ -*-===// 2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// The LLVM Compiler Infrastructure 46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// 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" 217ce45783531cfa81bfd7be561ea7e4738e8c6ca8Evan Cheng#include "llvm/CodeGen/MachineFunction.h" 22f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 25c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chengclass TargetInstrDescriptor; 26c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng 279d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattnerclass MachineInstrBuilder { 28f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner MachineInstr *MI; 299d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattnerpublic: 30423c2260f95883f7c84ac962e58ac66c3a11efacDan Gohman explicit MachineInstrBuilder(MachineInstr *mi) : MI(mi) {} 31f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 32f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// Allow automatic conversion to the machine instruction we are working on. 33f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// 34f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner operator MachineInstr*() const { return MI; } 35024e91f6f6b9c65d767efe507df213c5c53744c7Chris Lattner operator MachineBasicBlock::iterator() const { return MI; } 36f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 379ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner /// addReg - Add a new virtual register operand... 38f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// 397ce45783531cfa81bfd7be561ea7e4738e8c6ca8Evan Cheng const 40f0006127b3c4dd5e0e104ae0ef1d25d7540d57f0Christopher Lamb MachineInstrBuilder &addReg(unsigned RegNo, bool isDef = false, 41f0006127b3c4dd5e0e104ae0ef1d25d7540d57f0Christopher Lamb bool isImp = false, bool isKill = false, 42c498b0281fa81bc213ad1a1228664d480936c0e6Evan Cheng bool isDead = false, unsigned SubReg = 0) const { 43c498b0281fa81bc213ad1a1228664d480936c0e6Evan Cheng MI->addRegOperand(RegNo, isDef, isImp, isKill, isDead, SubReg); 44f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner return *this; 45f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner } 46f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 476a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner /// addImm - Add a new immediate operand. 486a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner /// 492d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner const MachineInstrBuilder &addImm(int64_t Val) const { 502d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner MI->addImmOperand(Val); 516a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner return *this; 526a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner } 53f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 548cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner const MachineInstrBuilder &addMBB(MachineBasicBlock *MBB) const { 558cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner MI->addMachineBasicBlockOperand(MBB); 568cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner return *this; 578cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner } 58aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner 59aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner const MachineInstrBuilder &addFrameIndex(unsigned Idx) const { 60aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner MI->addFrameIndexOperand(Idx); 61aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner return *this; 62aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner } 639d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 64404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng const MachineInstrBuilder &addConstantPoolIndex(unsigned Idx, 65404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng int Offset = 0) const { 66404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng MI->addConstantPoolIndexOperand(Idx, Offset); 679d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 689d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 699d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 70ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng const MachineInstrBuilder &addJumpTableIndex(unsigned Idx) const { 71ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng MI->addJumpTableIndexOperand(Idx); 72ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng return *this; 73ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng } 74ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng 759d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner const MachineInstrBuilder &addGlobalAddress(GlobalValue *GV, 76404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng int Offset = 0) const { 77ea50fabfd4e5fad25a25b312f64a9b2a53363586Chris Lattner MI->addGlobalAddressOperand(GV, Offset); 789d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 799d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 809d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 81ea50fabfd4e5fad25a25b312f64a9b2a53363586Chris Lattner const MachineInstrBuilder &addExternalSymbol(const char *FnName) const{ 82ea50fabfd4e5fad25a25b312f64a9b2a53363586Chris Lattner MI->addExternalSymbolOperand(FnName); 839d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 849d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 85f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner}; 86f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 87f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner/// BuildMI - Builder interface. Specify how to create the initial instruction 88c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// itself. 89f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner/// 90c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chenginline MachineInstrBuilder BuildMI(const TargetInstrDescriptor &TID) { 91c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng return MachineInstrBuilder(new MachineInstr(TID)); 92f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner} 93f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 9491ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder sets up the first operand as a 95c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// destination virtual register. 96367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner/// 97afed8142b713e4c0c741731d04817c422e78dc94Evan Chenginline MachineInstrBuilder BuildMI(const TargetInstrDescriptor &TID, 98afed8142b713e4c0c741731d04817c422e78dc94Evan Cheng unsigned DestReg) { 99c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng return MachineInstrBuilder(new MachineInstr(TID)).addReg(DestReg, true); 100367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner} 101367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner 10291ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 10391ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction before the given position in the given MachineBasicBlock, and 10491ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// sets up the first operand as a destination virtual register. 10591ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// 106c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 107c3c106ca59e44032041414c72ce584451f1d885fChris Lattner MachineBasicBlock::iterator I, 108c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng const TargetInstrDescriptor &TID, 109c3c106ca59e44032041414c72ce584451f1d885fChris Lattner unsigned DestReg) { 110c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng MachineInstr *MI = new MachineInstr(TID); 111c3c106ca59e44032041414c72ce584451f1d885fChris Lattner BB.insert(I, MI); 11209e460662a8d7328da1b938d5581a6ef3740b51dChris Lattner return MachineInstrBuilder(MI).addReg(DestReg, true); 113c3c106ca59e44032041414c72ce584451f1d885fChris Lattner} 114c3c106ca59e44032041414c72ce584451f1d885fChris Lattner 11591ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 11691ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction before the given position in the given MachineBasicBlock, and 11791ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// does NOT take a destination register. 11891ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// 119c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 120c3c106ca59e44032041414c72ce584451f1d885fChris Lattner MachineBasicBlock::iterator I, 121c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng const TargetInstrDescriptor &TID) { 122c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng MachineInstr *MI = new MachineInstr(TID); 123c3c106ca59e44032041414c72ce584451f1d885fChris Lattner BB.insert(I, MI); 124c3c106ca59e44032041414c72ce584451f1d885fChris Lattner return MachineInstrBuilder(MI); 125c3c106ca59e44032041414c72ce584451f1d885fChris Lattner} 126c3c106ca59e44032041414c72ce584451f1d885fChris Lattner 12791ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 12891ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction at the end of the given MachineBasicBlock, and does NOT take a 12991ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// destination register. 1309cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// 131c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, 132c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng const TargetInstrDescriptor &TID) { 133c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng return BuildMI(*BB, BB->end(), TID); 134f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner} 1357db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner 13691ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 13791ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction at the end of the given MachineBasicBlock, and sets up the first 138c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// operand as a destination virtual register. 1399cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// 140c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, 141c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng const TargetInstrDescriptor &TID, 142c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng unsigned DestReg) { 143c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng return BuildMI(*BB, BB->end(), TID, DestReg); 1449cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner} 1459cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner 146d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 147d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 148f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#endif 149