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