MachineInstrBuilder.h revision 4b6e7069c3ac98179e8cdc0a896f5f434670dafc
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 25749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattnerclass TargetInstrDesc; 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 { 43c8313f1d7957843d6032170573716cf8e6aeb93cChris Lattner MI->addOperand(MachineOperand::CreateReg(RegNo, isDef, isImp, isKill, 44c8313f1d7957843d6032170573716cf8e6aeb93cChris Lattner isDead, SubReg)); 45f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner return *this; 46f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner } 47f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 486a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner /// addImm - Add a new immediate operand. 496a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner /// 502d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner const MachineInstrBuilder &addImm(int64_t Val) const { 51c8313f1d7957843d6032170573716cf8e6aeb93cChris Lattner MI->addOperand(MachineOperand::CreateImm(Val)); 526a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner return *this; 536a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner } 54f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 554b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman const MachineInstrBuilder &addFPImm(ConstantFP *Val) const { 564b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman MI->addOperand(MachineOperand::CreateFPImm(Val)); 574b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman return *this; 584b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman } 594b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman 608cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner const MachineInstrBuilder &addMBB(MachineBasicBlock *MBB) const { 6139697a83b5ebb857263fc8b9a83ea1834e9d7fe4Chris Lattner MI->addOperand(MachineOperand::CreateMBB(MBB)); 628cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner return *this; 638cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner } 64aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner 65aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner const MachineInstrBuilder &addFrameIndex(unsigned Idx) const { 6639697a83b5ebb857263fc8b9a83ea1834e9d7fe4Chris Lattner MI->addOperand(MachineOperand::CreateFI(Idx)); 67aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner return *this; 68aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner } 699d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 70404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng const MachineInstrBuilder &addConstantPoolIndex(unsigned Idx, 71404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng int Offset = 0) const { 7239697a83b5ebb857263fc8b9a83ea1834e9d7fe4Chris Lattner MI->addOperand(MachineOperand::CreateCPI(Idx, Offset)); 739d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 749d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 759d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 76ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng const MachineInstrBuilder &addJumpTableIndex(unsigned Idx) const { 7739697a83b5ebb857263fc8b9a83ea1834e9d7fe4Chris Lattner MI->addOperand(MachineOperand::CreateJTI(Idx)); 78ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng return *this; 79ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng } 80ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng 819d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner const MachineInstrBuilder &addGlobalAddress(GlobalValue *GV, 82404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng int Offset = 0) const { 8339697a83b5ebb857263fc8b9a83ea1834e9d7fe4Chris Lattner MI->addOperand(MachineOperand::CreateGA(GV, Offset)); 849d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 859d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 869d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 87ea50fabfd4e5fad25a25b312f64a9b2a53363586Chris Lattner const MachineInstrBuilder &addExternalSymbol(const char *FnName) const{ 8839697a83b5ebb857263fc8b9a83ea1834e9d7fe4Chris Lattner MI->addOperand(MachineOperand::CreateES(FnName, 0)); 899d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 909d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 91f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner}; 92f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 93f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner/// BuildMI - Builder interface. Specify how to create the initial instruction 94c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// itself. 95f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner/// 968e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohmaninline MachineInstrBuilder BuildMI(MachineFunction &MF, 978e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman const TargetInstrDesc &TID) { 988e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman return MachineInstrBuilder(MF.CreateMachineInstr(TID)); 99f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner} 100f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 10191ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder sets up the first operand as a 102c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// destination virtual register. 103367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner/// 1048e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohmaninline MachineInstrBuilder BuildMI(MachineFunction &MF, 1058e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman const TargetInstrDesc &TID, 106afed8142b713e4c0c741731d04817c422e78dc94Evan Cheng unsigned DestReg) { 1078e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman return MachineInstrBuilder(MF.CreateMachineInstr(TID)).addReg(DestReg, true); 108367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner} 109367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner 11091ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 11191ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction before the given position in the given MachineBasicBlock, and 11291ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// sets up the first operand as a destination virtual register. 11391ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// 114c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 115c3c106ca59e44032041414c72ce584451f1d885fChris Lattner MachineBasicBlock::iterator I, 116749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner const TargetInstrDesc &TID, 117c3c106ca59e44032041414c72ce584451f1d885fChris Lattner unsigned DestReg) { 1188e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman MachineInstr *MI = BB.getParent()->CreateMachineInstr(TID); 119c3c106ca59e44032041414c72ce584451f1d885fChris Lattner BB.insert(I, MI); 12009e460662a8d7328da1b938d5581a6ef3740b51dChris Lattner return MachineInstrBuilder(MI).addReg(DestReg, true); 121c3c106ca59e44032041414c72ce584451f1d885fChris Lattner} 122c3c106ca59e44032041414c72ce584451f1d885fChris Lattner 12391ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 12491ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction before the given position in the given MachineBasicBlock, and 12591ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// does NOT take a destination register. 12691ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// 127c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 128c3c106ca59e44032041414c72ce584451f1d885fChris Lattner MachineBasicBlock::iterator I, 129749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner const TargetInstrDesc &TID) { 1308e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman MachineInstr *MI = BB.getParent()->CreateMachineInstr(TID); 131c3c106ca59e44032041414c72ce584451f1d885fChris Lattner BB.insert(I, MI); 132c3c106ca59e44032041414c72ce584451f1d885fChris Lattner return MachineInstrBuilder(MI); 133c3c106ca59e44032041414c72ce584451f1d885fChris Lattner} 134c3c106ca59e44032041414c72ce584451f1d885fChris Lattner 13591ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 13691ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction at the end of the given MachineBasicBlock, and does NOT take a 13791ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// destination register. 1389cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// 139c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, 140749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner const TargetInstrDesc &TID) { 141c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng return BuildMI(*BB, BB->end(), TID); 142f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner} 1437db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner 14491ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 14591ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction at the end of the given MachineBasicBlock, and sets up the first 146c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// operand as a destination virtual register. 1479cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// 148c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, 149749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner const TargetInstrDesc &TID, 150c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng unsigned DestReg) { 151c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng return BuildMI(*BB, BB->end(), TID, DestReg); 1529cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner} 1539cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner 154d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 155d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 156f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#endif 157