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