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" 21d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Olesen#include "llvm/CodeGen/MachineInstrBundle.h" 22320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman#include "llvm/Support/ErrorHandling.h" 23f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 26e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Chengclass MCInstrDesc; 275f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesenclass MDNode; 28c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng 29587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlingnamespace RegState { 30587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling enum { 31587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling Define = 0x2, 32587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling Implicit = 0x4, 33587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling Kill = 0x8, 34587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling Dead = 0x10, 354784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng Undef = 0x20, 364784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng EarlyClobber = 0x40, 37a65aa0f0bba1ef2322d63d05c074a92168684c63Dale Johannesen Debug = 0x80, 384efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooper InternalRead = 0x100, 39fce711cb65716f86b4e150f42cbb597bbecf7dbeJakob Stoklund Olesen DefineNoRead = Define | Undef, 40587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling ImplicitDefine = Implicit | Define, 41587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling ImplicitKill = Implicit | Kill 42587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling }; 43587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 44587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling 459d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattnerclass MachineInstrBuilder { 46433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineFunction *MF; 47f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner MachineInstr *MI; 489d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattnerpublic: 49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MachineInstrBuilder() : MF(nullptr), MI(nullptr) {} 50433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen 51433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen /// Create a MachineInstrBuilder for manipulating an existing instruction. 52433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen /// F must be the machine function that was used to allocate I. 53433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineInstrBuilder(MachineFunction &F, MachineInstr *I) : MF(&F), MI(I) {} 54f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 55f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// Allow automatic conversion to the machine instruction we are working on. 56f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// 57f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner operator MachineInstr*() const { return MI; } 5807e7998f09195806e9fe0430a2d5769020dd5dd0Chris Lattner MachineInstr *operator->() const { return MI; } 59024e91f6f6b9c65d767efe507df213c5c53744c7Chris Lattner operator MachineBasicBlock::iterator() const { return MI; } 60f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 619ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner /// addReg - Add a new virtual register operand... 62f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// 637ce45783531cfa81bfd7be561ea7e4738e8c6ca8Evan Cheng const 64587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling MachineInstrBuilder &addReg(unsigned RegNo, unsigned flags = 0, 65587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling unsigned SubReg = 0) const { 66587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling assert((flags & 0x1) == 0 && 67587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling "Passing in 'true' to addReg is forbidden! Use enums instead."); 687f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateReg(RegNo, 697f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Define, 707f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Implicit, 717f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Kill, 727f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Dead, 737f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Undef, 747f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::EarlyClobber, 757f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen SubReg, 767f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Debug, 777f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::InternalRead)); 78f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner return *this; 79f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner } 80f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 816a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner /// addImm - Add a new immediate operand. 826a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner /// 832d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner const MachineInstrBuilder &addImm(int64_t Val) const { 847f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateImm(Val)); 856a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner return *this; 866a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner } 87f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 888594d429e02c688d428036f8563f09572da3fbffDevang Patel const MachineInstrBuilder &addCImm(const ConstantInt *Val) const { 897f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateCImm(Val)); 908594d429e02c688d428036f8563f09572da3fbffDevang Patel return *this; 918594d429e02c688d428036f8563f09572da3fbffDevang Patel } 928594d429e02c688d428036f8563f09572da3fbffDevang Patel 934fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman const MachineInstrBuilder &addFPImm(const ConstantFP *Val) const { 947f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateFPImm(Val)); 954b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman return *this; 964b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman } 974b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman 989a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner const MachineInstrBuilder &addMBB(MachineBasicBlock *MBB, 999a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 1007f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateMBB(MBB, TargetFlags)); 1018cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner return *this; 1028cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner } 103aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner 1047fcbfe38d24fb556c231b24f226247a543e51c9dJim Grosbach const MachineInstrBuilder &addFrameIndex(int Idx) const { 1057f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateFI(Idx)); 106aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner return *this; 107aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner } 1089d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 109404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng const MachineInstrBuilder &addConstantPoolIndex(unsigned Idx, 1109a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner int Offset = 0, 1119a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 1127f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateCPI(Idx, Offset, TargetFlags)); 1139d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 1149d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 1159d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 1160b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen const MachineInstrBuilder &addTargetIndex(unsigned Idx, int64_t Offset = 0, 1170b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen unsigned char TargetFlags = 0) const { 1187f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateTargetIndex(Idx, Offset, 1197f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen TargetFlags)); 1200b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen return *this; 1210b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen } 1220b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen 1239a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner const MachineInstrBuilder &addJumpTableIndex(unsigned Idx, 1249a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 1257f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateJTI(Idx, TargetFlags)); 126ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng return *this; 127ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng } 128ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng 12946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman const MachineInstrBuilder &addGlobalAddress(const GlobalValue *GV, 1309a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner int64_t Offset = 0, 1319a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 1327f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateGA(GV, Offset, TargetFlags)); 1339d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 1349d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 1359d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 1366520e20e4fb31f2e65e25c38b372b19d33a83df4Dan Gohman const MachineInstrBuilder &addExternalSymbol(const char *FnName, 1379a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 1387f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateES(FnName, TargetFlags)); 1399d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 1409d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 1418cf77137533f1d83f9ea0085b5ca6d241f4bab9aDan Gohman 1427f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen const MachineInstrBuilder &addBlockAddress(const BlockAddress *BA, 1437f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen int64_t Offset = 0, 1447f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen unsigned char TargetFlags = 0) const { 1457f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateBA(BA, Offset, TargetFlags)); 1467f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen return *this; 1477f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen } 1487f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen 1497739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen const MachineInstrBuilder &addRegMask(const uint32_t *Mask) const { 1507f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateRegMask(Mask)); 1517739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen return *this; 1527739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen } 1537739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen 154c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman const MachineInstrBuilder &addMemOperand(MachineMemOperand *MMO) const { 1557f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addMemOperand(*MF, MMO); 1568cf77137533f1d83f9ea0085b5ca6d241f4bab9aDan Gohman return *this; 1578cf77137533f1d83f9ea0085b5ca6d241f4bab9aDan Gohman } 15897357614b5957cc167c261d3be54713802715d9aDan Gohman 159320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman const MachineInstrBuilder &setMemRefs(MachineInstr::mmo_iterator b, 160320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman MachineInstr::mmo_iterator e) const { 161320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman MI->setMemRefs(b, e); 162320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman return *this; 163320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman } 164320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman 165320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman 16697357614b5957cc167c261d3be54713802715d9aDan Gohman const MachineInstrBuilder &addOperand(const MachineOperand &MO) const { 1677f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MO); 16897357614b5957cc167c261d3be54713802715d9aDan Gohman return *this; 16997357614b5957cc167c261d3be54713802715d9aDan Gohman } 1705f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesen 17191c38417cf11ce56b13a7434de76306f665c88c5Dale Johannesen const MachineInstrBuilder &addMetadata(const MDNode *MD) const { 1727f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateMetadata(MD)); 1735f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesen return *this; 1745f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesen } 17536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 17636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MachineInstrBuilder &addCFIIndex(unsigned CFIIndex) const { 17736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MI->addOperand(*MF, MachineOperand::CreateCFIIndex(CFIIndex)); 17836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return *this; 17936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 18036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1813889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner const MachineInstrBuilder &addSym(MCSymbol *Sym) const { 1827f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateMCSymbol(Sym)); 1833889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner return *this; 1843889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner } 185320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman 18694c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov const MachineInstrBuilder &setMIFlags(unsigned Flags) const { 18794c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov MI->setFlags(Flags); 18894c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov return *this; 18994c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov } 19094c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov 19194c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov const MachineInstrBuilder &setMIFlag(MachineInstr::MIFlag Flag) const { 19294c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov MI->setFlag(Flag); 19394c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov return *this; 19494c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov } 19594c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov 196320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman // Add a displacement from an existing MachineOperand with an added offset. 197a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng const MachineInstrBuilder &addDisp(const MachineOperand &Disp, int64_t off, 198a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng unsigned char TargetFlags = 0) const { 199320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman switch (Disp.getType()) { 200320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman default: 201320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman llvm_unreachable("Unhandled operand type in addDisp()"); 202320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman case MachineOperand::MO_Immediate: 203320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman return addImm(Disp.getImm() + off); 204a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng case MachineOperand::MO_GlobalAddress: { 205a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng // If caller specifies new TargetFlags then use it, otherwise the 206a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng // default behavior is to copy the target flags from the existing 207a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng // MachineOperand. This means if the caller wants to clear the 208a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng // target flags it needs to do so explicitly. 209a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng if (TargetFlags) 210a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng return addGlobalAddress(Disp.getGlobal(), Disp.getOffset() + off, 211a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng TargetFlags); 212a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng return addGlobalAddress(Disp.getGlobal(), Disp.getOffset() + off, 213a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng Disp.getTargetFlags()); 214a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng } 215320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman } 216320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman } 217be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen 218be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen /// Copy all the implicit operands from OtherMI onto this one. 219be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen const MachineInstrBuilder ©ImplicitOps(const MachineInstr *OtherMI) { 220be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen MI->copyImplicitOps(*MF, OtherMI); 221be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen return *this; 222be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen } 223f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner}; 224f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 225f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner/// BuildMI - Builder interface. Specify how to create the initial instruction 226c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// itself. 227f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner/// 2288e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohmaninline MachineInstrBuilder BuildMI(MachineFunction &MF, 2299bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 230e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID) { 231433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MF.CreateMachineInstr(MCID, DL)); 232f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner} 233f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 23491ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder sets up the first operand as a 235c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// destination virtual register. 236367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner/// 2379bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendlinginline MachineInstrBuilder BuildMI(MachineFunction &MF, 2389bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 239e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID, 2409bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned DestReg) { 241433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MF.CreateMachineInstr(MCID, DL)) 242587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling .addReg(DestReg, RegState::Define); 243367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner} 244367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner 24591ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 24691ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction before the given position in the given MachineBasicBlock, and 24791ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// sets up the first operand as a destination virtual register. 24891ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// 249c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 250c3c106ca59e44032041414c72ce584451f1d885fChris Lattner MachineBasicBlock::iterator I, 2519bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 252e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID, 2539bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned DestReg) { 254433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineFunction &MF = *BB.getParent(); 255433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineInstr *MI = MF.CreateMachineInstr(MCID, DL); 256c3c106ca59e44032041414c72ce584451f1d885fChris Lattner BB.insert(I, MI); 257433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MI).addReg(DestReg, RegState::Define); 258c3c106ca59e44032041414c72ce584451f1d885fChris Lattner} 259c3c106ca59e44032041414c72ce584451f1d885fChris Lattner 260ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 261ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator I, 262ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DebugLoc DL, 263ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const MCInstrDesc &MCID, 264ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng unsigned DestReg) { 265433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineFunction &MF = *BB.getParent(); 266433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineInstr *MI = MF.CreateMachineInstr(MCID, DL); 267ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng BB.insert(I, MI); 268433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MI).addReg(DestReg, RegState::Define); 269ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 270ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 271ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 272ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineInstr *I, 273ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DebugLoc DL, 274ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const MCInstrDesc &MCID, 275ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng unsigned DestReg) { 276ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (I->isInsideBundle()) { 277ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator MII = I; 278ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return BuildMI(BB, MII, DL, MCID, DestReg); 279ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 280ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 281ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::iterator MII = I; 282ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return BuildMI(BB, MII, DL, MCID, DestReg); 283ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 284ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 28591ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 28691ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction before the given position in the given MachineBasicBlock, and 28791ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// does NOT take a destination register. 28891ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// 289c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 290c3c106ca59e44032041414c72ce584451f1d885fChris Lattner MachineBasicBlock::iterator I, 2919bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 292e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID) { 293433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineFunction &MF = *BB.getParent(); 294433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineInstr *MI = MF.CreateMachineInstr(MCID, DL); 295c3c106ca59e44032041414c72ce584451f1d885fChris Lattner BB.insert(I, MI); 296433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MI); 297c3c106ca59e44032041414c72ce584451f1d885fChris Lattner} 298c3c106ca59e44032041414c72ce584451f1d885fChris Lattner 299ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 300ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator I, 301ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DebugLoc DL, 302ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const MCInstrDesc &MCID) { 303433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineFunction &MF = *BB.getParent(); 304433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineInstr *MI = MF.CreateMachineInstr(MCID, DL); 305ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng BB.insert(I, MI); 306433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MI); 307ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 308ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 309ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 310ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineInstr *I, 311ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DebugLoc DL, 312ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const MCInstrDesc &MCID) { 313ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (I->isInsideBundle()) { 314ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator MII = I; 315ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return BuildMI(BB, MII, DL, MCID); 316ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 317ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 318ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::iterator MII = I; 319ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return BuildMI(BB, MII, DL, MCID); 320ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 321ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 32291ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 32391ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction at the end of the given MachineBasicBlock, and does NOT take a 32491ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// destination register. 3259cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// 326c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, 3279bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 328e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID) { 329e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng return BuildMI(*BB, BB->end(), DL, MCID); 3309bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling} 3317db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner 33291ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 33391ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction at the end of the given MachineBasicBlock, and sets up the first 33465b660743ccce5393f70d3667ac4e2b0b76e5236Daniel Dunbar/// operand as a destination virtual register. 3359cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// 336c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, 3379bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 338e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID, 3399bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned DestReg) { 340e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng return BuildMI(*BB, BB->end(), DL, MCID, DestReg); 3419bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling} 3429cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner 3433517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl/// BuildMI - This version of the builder builds a DBG_VALUE intrinsic 3443517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl/// for either a value in a register or a register-indirect+offset 3453517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl/// address. The convention is that a DBG_VALUE is indirect iff the 3463517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl/// second operand is an immediate. 3473517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl/// 3483517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantlinline MachineInstrBuilder BuildMI(MachineFunction &MF, 3493517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl DebugLoc DL, 3503517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl const MCInstrDesc &MCID, 3513517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl bool IsIndirect, 3523517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl unsigned Reg, 3533517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl unsigned Offset, 3543517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl const MDNode *MD) { 3553517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl if (IsIndirect) 3563517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl return BuildMI(MF, DL, MCID) 3573517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl .addReg(Reg, RegState::Debug) 3583517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl .addImm(Offset) 3593517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl .addMetadata(MD); 3603517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl else { 3613517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl assert(Offset == 0 && "A direct address cannot have an offset."); 3623517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl return BuildMI(MF, DL, MCID) 3633517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl .addReg(Reg, RegState::Debug) 3643517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl .addReg(0U, RegState::Debug) 3653517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl .addMetadata(MD); 3663517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl } 3673517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl} 3683517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl 3693517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl/// BuildMI - This version of the builder builds a DBG_VALUE intrinsic 3703517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl/// for either a value in a register or a register-indirect+offset 3713517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl/// address and inserts it at position I. 3723517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl/// 3733517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantlinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 3743517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl MachineBasicBlock::iterator I, 3753517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl DebugLoc DL, 3763517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl const MCInstrDesc &MCID, 3773517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl bool IsIndirect, 3783517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl unsigned Reg, 3793517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl unsigned Offset, 3803517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl const MDNode *MD) { 3813517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl MachineFunction &MF = *BB.getParent(); 3823517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl MachineInstr *MI = BuildMI(MF, DL, MCID, IsIndirect, Reg, Offset, MD); 3833517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl BB.insert(I, MI); 3843517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl return MachineInstrBuilder(MF, MI); 3853517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl} 3863517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl 3873517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl 388587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getDefRegState(bool B) { 389587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Define : 0; 390587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 391587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getImplRegState(bool B) { 392587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Implicit : 0; 393587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 394587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getKillRegState(bool B) { 395587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Kill : 0; 396587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 397587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getDeadRegState(bool B) { 398587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Dead : 0; 399587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 4004784f1fc73abf6005b7b7262d395af71b57b1255Evan Chenginline unsigned getUndefRegState(bool B) { 4014784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng return B ? RegState::Undef : 0; 4024784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng} 4034efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooperinline unsigned getInternalReadRegState(bool B) { 4044efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooper return B ? RegState::InternalRead : 0; 4054efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooper} 4067f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Oleseninline unsigned getDebugRegState(bool B) { 4077f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen return B ? RegState::Debug : 0; 4087f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen} 409587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling 410c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 411c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// Helper class for constructing bundles of MachineInstrs. 412c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// 413c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// MIBundleBuilder can create a bundle from scratch by inserting new 414c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// MachineInstrs one at a time, or it can create a bundle from a sequence of 415c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// existing MachineInstrs in a basic block. 416c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesenclass MIBundleBuilder { 417c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock &MBB; 418c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::instr_iterator Begin; 419c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::instr_iterator End; 420c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 421c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesenpublic: 422c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Create an MIBundleBuilder that inserts instructions into a new bundle in 423c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// BB above the bundle or instruction at Pos. 424c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MIBundleBuilder(MachineBasicBlock &BB, 425c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::iterator Pos) 426c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen : MBB(BB), Begin(Pos.getInstrIterator()), End(Begin) {} 427c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 428c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Create a bundle from the sequence of instructions between B and E. 429c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MIBundleBuilder(MachineBasicBlock &BB, 430c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::iterator B, 431c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::iterator E) 432c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen : MBB(BB), Begin(B.getInstrIterator()), End(E.getInstrIterator()) { 433c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen assert(B != E && "No instructions to bundle"); 434c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen ++B; 435c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen while (B != E) { 436c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineInstr *MI = B; 437c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen ++B; 438c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MI->bundleWithPred(); 439c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen } 440c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen } 441c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 4425d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen /// Create an MIBundleBuilder representing an existing instruction or bundle 4435d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen /// that has MI as its head. 4445d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen explicit MIBundleBuilder(MachineInstr *MI) 445d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Olesen : MBB(*MI->getParent()), Begin(MI), End(getBundleEnd(MI)) {} 4465d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen 4475d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen /// Return a reference to the basic block containing this bundle. 4485d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MachineBasicBlock &getMBB() const { return MBB; } 4495d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen 450c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Return true if no instructions have been inserted in this bundle yet. 451c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Empty bundles aren't representable in a MachineBasicBlock. 452c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen bool empty() const { return Begin == End; } 453c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 454c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Return an iterator to the first bundled instruction. 455c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::instr_iterator begin() const { return Begin; } 456c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 457c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Return an iterator beyond the last bundled instruction. 458c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::instr_iterator end() const { return End; } 459c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 4605d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen /// Insert MI into this bundle before I which must point to an instruction in 4615d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen /// the bundle, or end(). 4625d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MIBundleBuilder &insert(MachineBasicBlock::instr_iterator I, 4635d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MachineInstr *MI) { 4645d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MBB.insert(I, MI); 4655d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen if (I == Begin) { 4665d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen if (!empty()) 4675d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MI->bundleWithSucc(); 4685d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen Begin = MI; 4695d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen return *this; 4705d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen } 4715d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen if (I == End) { 4725d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MI->bundleWithPred(); 4735d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen return *this; 4745d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen } 4755d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen // MI was inserted in the middle of the bundle, so its neighbors' flags are 4765d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen // already fine. Update MI's bundle flags manually. 4775d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MI->setFlag(MachineInstr::BundledPred); 4785d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MI->setFlag(MachineInstr::BundledSucc); 4795d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen return *this; 4805d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen } 4815d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen 482c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Insert MI into MBB by prepending it to the instructions in the bundle. 483c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// MI will become the first instruction in the bundle. 484c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MIBundleBuilder &prepend(MachineInstr *MI) { 4855d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen return insert(begin(), MI); 486c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen } 487c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 488c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Insert MI into MBB by appending it to the instructions in the bundle. 489c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// MI will become the last instruction in the bundle. 490c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MIBundleBuilder &append(MachineInstr *MI) { 4915d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen return insert(end(), MI); 492c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen } 493c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen}; 494c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 495d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 496d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 497f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#endif 498