MachineInstrBuilder.h revision 7fcbfe38d24fb556c231b24f226247a543e51c9d
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 207ce45783531cfa81bfd7be561ea7e4738e8c6ca8Evan Cheng#include "llvm/CodeGen/MachineFunction.h" 21320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman#include "llvm/Support/ErrorHandling.h" 22f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 25749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattnerclass TargetInstrDesc; 265f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesenclass MDNode; 27c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng 28587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlingnamespace RegState { 29587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling enum { 30587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling Define = 0x2, 31587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling Implicit = 0x4, 32587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling Kill = 0x8, 33587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling Dead = 0x10, 344784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng Undef = 0x20, 354784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng EarlyClobber = 0x40, 36a65aa0f0bba1ef2322d63d05c074a92168684c63Dale Johannesen Debug = 0x80, 37587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling ImplicitDefine = Implicit | Define, 38587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling ImplicitKill = Implicit | Kill 39587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling }; 40587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 41587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling 429d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattnerclass MachineInstrBuilder { 43f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner MachineInstr *MI; 449d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattnerpublic: 45f9dc699c42a11a60ec299970c8fb0093d51e993bChris Lattner MachineInstrBuilder() : MI(0) {} 46423c2260f95883f7c84ac962e58ac66c3a11efacDan Gohman explicit MachineInstrBuilder(MachineInstr *mi) : MI(mi) {} 47f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 48f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// Allow automatic conversion to the machine instruction we are working on. 49f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// 50f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner operator MachineInstr*() const { return MI; } 5107e7998f09195806e9fe0430a2d5769020dd5dd0Chris Lattner MachineInstr *operator->() const { return MI; } 52024e91f6f6b9c65d767efe507df213c5c53744c7Chris Lattner operator MachineBasicBlock::iterator() const { return MI; } 53f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 549ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner /// addReg - Add a new virtual register operand... 55f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// 567ce45783531cfa81bfd7be561ea7e4738e8c6ca8Evan Cheng const 57587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling MachineInstrBuilder &addReg(unsigned RegNo, unsigned flags = 0, 58587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling unsigned SubReg = 0) const { 59587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling assert((flags & 0x1) == 0 && 60587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling "Passing in 'true' to addReg is forbidden! Use enums instead."); 61587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling MI->addOperand(MachineOperand::CreateReg(RegNo, 62587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling flags & RegState::Define, 63587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling flags & RegState::Implicit, 64587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling flags & RegState::Kill, 65587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling flags & RegState::Dead, 664784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng flags & RegState::Undef, 674784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng flags & RegState::EarlyClobber, 68a65aa0f0bba1ef2322d63d05c074a92168684c63Dale Johannesen SubReg, 69a65aa0f0bba1ef2322d63d05c074a92168684c63Dale Johannesen flags & RegState::Debug)); 70f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner return *this; 71f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner } 72f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 736a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner /// addImm - Add a new immediate operand. 746a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner /// 752d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner const MachineInstrBuilder &addImm(int64_t Val) const { 76c8313f1d7957843d6032170573716cf8e6aeb93cChris Lattner MI->addOperand(MachineOperand::CreateImm(Val)); 776a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner return *this; 786a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner } 79f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 804fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman const MachineInstrBuilder &addFPImm(const ConstantFP *Val) const { 814b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman MI->addOperand(MachineOperand::CreateFPImm(Val)); 824b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman return *this; 834b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman } 844b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman 859a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner const MachineInstrBuilder &addMBB(MachineBasicBlock *MBB, 869a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 879a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner MI->addOperand(MachineOperand::CreateMBB(MBB, TargetFlags)); 888cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner return *this; 898cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner } 90aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner 917fcbfe38d24fb556c231b24f226247a543e51c9dJim Grosbach const MachineInstrBuilder &addFrameIndex(int Idx) const { 9239697a83b5ebb857263fc8b9a83ea1834e9d7fe4Chris Lattner MI->addOperand(MachineOperand::CreateFI(Idx)); 93aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner return *this; 94aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner } 959d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 96404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng const MachineInstrBuilder &addConstantPoolIndex(unsigned Idx, 979a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner int Offset = 0, 989a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 999a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner MI->addOperand(MachineOperand::CreateCPI(Idx, Offset, TargetFlags)); 1009d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 1019d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 1029d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 1039a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner const MachineInstrBuilder &addJumpTableIndex(unsigned Idx, 1049a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 1059a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner MI->addOperand(MachineOperand::CreateJTI(Idx, TargetFlags)); 106ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng return *this; 107ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng } 108ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng 10946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman const MachineInstrBuilder &addGlobalAddress(const GlobalValue *GV, 1109a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner int64_t Offset = 0, 1119a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 1129a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner MI->addOperand(MachineOperand::CreateGA(GV, Offset, TargetFlags)); 1139d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 1149d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 1159d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 1166520e20e4fb31f2e65e25c38b372b19d33a83df4Dan Gohman const MachineInstrBuilder &addExternalSymbol(const char *FnName, 1179a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 11831e2c7b4c13c2f31774614b1124533628958d0cdDaniel Dunbar MI->addOperand(MachineOperand::CreateES(FnName, TargetFlags)); 1199d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 1209d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 1218cf77137533f1d83f9ea0085b5ca6d241f4bab9aDan Gohman 122c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman const MachineInstrBuilder &addMemOperand(MachineMemOperand *MMO) const { 1238cf77137533f1d83f9ea0085b5ca6d241f4bab9aDan Gohman MI->addMemOperand(*MI->getParent()->getParent(), MMO); 1248cf77137533f1d83f9ea0085b5ca6d241f4bab9aDan Gohman return *this; 1258cf77137533f1d83f9ea0085b5ca6d241f4bab9aDan Gohman } 12697357614b5957cc167c261d3be54713802715d9aDan Gohman 127320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman const MachineInstrBuilder &setMemRefs(MachineInstr::mmo_iterator b, 128320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman MachineInstr::mmo_iterator e) const { 129320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman MI->setMemRefs(b, e); 130320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman return *this; 131320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman } 132320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman 133320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman 13497357614b5957cc167c261d3be54713802715d9aDan Gohman const MachineInstrBuilder &addOperand(const MachineOperand &MO) const { 135b1fb84dee9c3797ec2f2bfd2c9cf8e6ee0436487Chris Lattner MI->addOperand(MO); 13697357614b5957cc167c261d3be54713802715d9aDan Gohman return *this; 13797357614b5957cc167c261d3be54713802715d9aDan Gohman } 1385f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesen 13991c38417cf11ce56b13a7434de76306f665c88c5Dale Johannesen const MachineInstrBuilder &addMetadata(const MDNode *MD) const { 1405f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesen MI->addOperand(MachineOperand::CreateMetadata(MD)); 1415f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesen return *this; 1425f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesen } 1433889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner 1443889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner const MachineInstrBuilder &addSym(MCSymbol *Sym) const { 1453889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner MI->addOperand(MachineOperand::CreateMCSymbol(Sym)); 1463889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner return *this; 1473889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner } 148320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman 14994c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov const MachineInstrBuilder &setMIFlags(unsigned Flags) const { 15094c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov MI->setFlags(Flags); 15194c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov return *this; 15294c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov } 15394c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov 15494c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov const MachineInstrBuilder &setMIFlag(MachineInstr::MIFlag Flag) const { 15594c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov MI->setFlag(Flag); 15694c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov return *this; 15794c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov } 15894c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov 159320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman // Add a displacement from an existing MachineOperand with an added offset. 160320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman const MachineInstrBuilder &addDisp(const MachineOperand &Disp, 161320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman int64_t off) const { 162320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman switch (Disp.getType()) { 163320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman default: 164320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman llvm_unreachable("Unhandled operand type in addDisp()"); 165320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman case MachineOperand::MO_Immediate: 166320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman return addImm(Disp.getImm() + off); 167320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman case MachineOperand::MO_GlobalAddress: 168320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman return addGlobalAddress(Disp.getGlobal(), Disp.getOffset() + off); 169320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman } 170320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman } 171f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner}; 172f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 173f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner/// BuildMI - Builder interface. Specify how to create the initial instruction 174c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// itself. 175f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner/// 1768e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohmaninline MachineInstrBuilder BuildMI(MachineFunction &MF, 1779bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 1789bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling const TargetInstrDesc &TID) { 1799bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling return MachineInstrBuilder(MF.CreateMachineInstr(TID, DL)); 180f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner} 181f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 18291ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder sets up the first operand as a 183c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// destination virtual register. 184367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner/// 1859bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendlinginline MachineInstrBuilder BuildMI(MachineFunction &MF, 1869bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 1879bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling const TargetInstrDesc &TID, 1889bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned DestReg) { 1899bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling return MachineInstrBuilder(MF.CreateMachineInstr(TID, DL)) 190587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling .addReg(DestReg, RegState::Define); 191367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner} 192367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner 19391ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 19491ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction before the given position in the given MachineBasicBlock, and 19591ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// sets up the first operand as a destination virtual register. 19691ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// 197c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 198c3c106ca59e44032041414c72ce584451f1d885fChris Lattner MachineBasicBlock::iterator I, 1999bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 2009bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling const TargetInstrDesc &TID, 2019bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned DestReg) { 2029bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling MachineInstr *MI = BB.getParent()->CreateMachineInstr(TID, DL); 203c3c106ca59e44032041414c72ce584451f1d885fChris Lattner BB.insert(I, MI); 204587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return MachineInstrBuilder(MI).addReg(DestReg, RegState::Define); 205c3c106ca59e44032041414c72ce584451f1d885fChris Lattner} 206c3c106ca59e44032041414c72ce584451f1d885fChris Lattner 20791ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 20891ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction before the given position in the given MachineBasicBlock, and 20991ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// does NOT take a destination register. 21091ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// 211c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 212c3c106ca59e44032041414c72ce584451f1d885fChris Lattner MachineBasicBlock::iterator I, 2139bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 2149bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling const TargetInstrDesc &TID) { 2159bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling MachineInstr *MI = BB.getParent()->CreateMachineInstr(TID, DL); 216c3c106ca59e44032041414c72ce584451f1d885fChris Lattner BB.insert(I, MI); 217c3c106ca59e44032041414c72ce584451f1d885fChris Lattner return MachineInstrBuilder(MI); 218c3c106ca59e44032041414c72ce584451f1d885fChris Lattner} 219c3c106ca59e44032041414c72ce584451f1d885fChris Lattner 22091ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 22191ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction at the end of the given MachineBasicBlock, and does NOT take a 22291ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// destination register. 2239cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// 224c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, 2259bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 2269bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling const TargetInstrDesc &TID) { 2279bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling return BuildMI(*BB, BB->end(), DL, TID); 2289bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling} 2297db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner 23091ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 23191ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction at the end of the given MachineBasicBlock, and sets up the first 23265b660743ccce5393f70d3667ac4e2b0b76e5236Daniel Dunbar/// operand as a destination virtual register. 2339cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// 234c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, 2359bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 2369bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling const TargetInstrDesc &TID, 2379bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned DestReg) { 2389bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling return BuildMI(*BB, BB->end(), DL, TID, DestReg); 2399bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling} 2409cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner 241587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getDefRegState(bool B) { 242587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Define : 0; 243587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 244587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getImplRegState(bool B) { 245587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Implicit : 0; 246587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 247587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getKillRegState(bool B) { 248587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Kill : 0; 249587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 250587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getDeadRegState(bool B) { 251587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Dead : 0; 252587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 2534784f1fc73abf6005b7b7262d395af71b57b1255Evan Chenginline unsigned getUndefRegState(bool B) { 2544784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng return B ? RegState::Undef : 0; 2554784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng} 256587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling 257d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 258d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 259f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#endif 260