MachineInstrBuilder.h revision 4b6e7069c3ac98179e8cdc0a896f5f434670dafc
1f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//===-- CodeGen/MachineInstBuilder.h - Simplify creation of MIs -*- C++ -*-===//
2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//                     The LLVM Compiler Infrastructure
46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===//
9f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//
10f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// This file exposes a function named BuildMI, which is useful for dramatically
11ceb408f6a263e319683209ae5c6f8d1e3e4d9b69Chris Lattner// simplifying how MachineInstr's are created.  It allows use of code like this:
12f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//
139ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner//   M = BuildMI(X86::ADDrr8, 2).addReg(argVal1).addReg(argVal2);
14f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//
15f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//===----------------------------------------------------------------------===//
16f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
17f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#ifndef LLVM_CODEGEN_MACHINEINSTRBUILDER_H
18f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#define LLVM_CODEGEN_MACHINEINSTRBUILDER_H
19f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
20c3c106ca59e44032041414c72ce584451f1d885fChris Lattner#include "llvm/CodeGen/MachineBasicBlock.h"
217ce45783531cfa81bfd7be561ea7e4738e8c6ca8Evan Cheng#include "llvm/CodeGen/MachineFunction.h"
22f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
25749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattnerclass TargetInstrDesc;
26c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng
279d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattnerclass MachineInstrBuilder {
28f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  MachineInstr *MI;
299d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattnerpublic:
30423c2260f95883f7c84ac962e58ac66c3a11efacDan Gohman  explicit MachineInstrBuilder(MachineInstr *mi) : MI(mi) {}
31f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
32f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  /// Allow automatic conversion to the machine instruction we are working on.
33f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  ///
34f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  operator MachineInstr*() const { return MI; }
35024e91f6f6b9c65d767efe507df213c5c53744c7Chris Lattner  operator MachineBasicBlock::iterator() const { return MI; }
36f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
379ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner  /// addReg - Add a new virtual register operand...
38f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  ///
397ce45783531cfa81bfd7be561ea7e4738e8c6ca8Evan Cheng  const
40f0006127b3c4dd5e0e104ae0ef1d25d7540d57f0Christopher Lamb  MachineInstrBuilder &addReg(unsigned RegNo, bool isDef = false,
41f0006127b3c4dd5e0e104ae0ef1d25d7540d57f0Christopher Lamb                              bool isImp = false, bool isKill = false,
42c498b0281fa81bc213ad1a1228664d480936c0e6Evan Cheng                              bool isDead = false, unsigned SubReg = 0) const {
43c8313f1d7957843d6032170573716cf8e6aeb93cChris Lattner    MI->addOperand(MachineOperand::CreateReg(RegNo, isDef, isImp, isKill,
44c8313f1d7957843d6032170573716cf8e6aeb93cChris Lattner                                             isDead, SubReg));
45f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner    return *this;
46f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  }
47f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
486a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner  /// addImm - Add a new immediate operand.
496a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner  ///
502d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner  const MachineInstrBuilder &addImm(int64_t Val) const {
51c8313f1d7957843d6032170573716cf8e6aeb93cChris Lattner    MI->addOperand(MachineOperand::CreateImm(Val));
526a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner    return *this;
536a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner  }
54f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
554b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman  const MachineInstrBuilder &addFPImm(ConstantFP *Val) const {
564b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman    MI->addOperand(MachineOperand::CreateFPImm(Val));
574b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman    return *this;
584b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman  }
594b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman
608cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner  const MachineInstrBuilder &addMBB(MachineBasicBlock *MBB) const {
6139697a83b5ebb857263fc8b9a83ea1834e9d7fe4Chris Lattner    MI->addOperand(MachineOperand::CreateMBB(MBB));
628cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner    return *this;
638cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner  }
64aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner
65aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner  const MachineInstrBuilder &addFrameIndex(unsigned Idx) const {
6639697a83b5ebb857263fc8b9a83ea1834e9d7fe4Chris Lattner    MI->addOperand(MachineOperand::CreateFI(Idx));
67aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner    return *this;
68aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner  }
699d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner
70404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng  const MachineInstrBuilder &addConstantPoolIndex(unsigned Idx,
71404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng                                                  int Offset = 0) const {
7239697a83b5ebb857263fc8b9a83ea1834e9d7fe4Chris Lattner    MI->addOperand(MachineOperand::CreateCPI(Idx, Offset));
739d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner    return *this;
749d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner  }
759d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner
76ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng  const MachineInstrBuilder &addJumpTableIndex(unsigned Idx) const {
7739697a83b5ebb857263fc8b9a83ea1834e9d7fe4Chris Lattner    MI->addOperand(MachineOperand::CreateJTI(Idx));
78ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng    return *this;
79ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng  }
80ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng
819d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner  const MachineInstrBuilder &addGlobalAddress(GlobalValue *GV,
82404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng                                              int Offset = 0) const {
8339697a83b5ebb857263fc8b9a83ea1834e9d7fe4Chris Lattner    MI->addOperand(MachineOperand::CreateGA(GV, Offset));
849d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner    return *this;
859d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner  }
869d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner
87ea50fabfd4e5fad25a25b312f64a9b2a53363586Chris Lattner  const MachineInstrBuilder &addExternalSymbol(const char *FnName) const{
8839697a83b5ebb857263fc8b9a83ea1834e9d7fe4Chris Lattner    MI->addOperand(MachineOperand::CreateES(FnName, 0));
899d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner    return *this;
909d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner  }
91f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner};
92f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
93f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner/// BuildMI - Builder interface.  Specify how to create the initial instruction
94c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// itself.
95f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner///
968e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohmaninline MachineInstrBuilder BuildMI(MachineFunction &MF,
978e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman                                   const TargetInstrDesc &TID) {
988e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  return MachineInstrBuilder(MF.CreateMachineInstr(TID));
99f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner}
100f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
10191ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder sets up the first operand as a
102c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// destination virtual register.
103367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner///
1048e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohmaninline MachineInstrBuilder  BuildMI(MachineFunction &MF,
1058e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman                                    const TargetInstrDesc &TID,
106afed8142b713e4c0c741731d04817c422e78dc94Evan Cheng                                    unsigned DestReg) {
1078e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  return MachineInstrBuilder(MF.CreateMachineInstr(TID)).addReg(DestReg, true);
108367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner}
109367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner
11091ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built
11191ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction before the given position in the given MachineBasicBlock, and
11291ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// sets up the first operand as a destination virtual register.
11391ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke///
114c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB,
115c3c106ca59e44032041414c72ce584451f1d885fChris Lattner                                   MachineBasicBlock::iterator I,
116749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner                                   const TargetInstrDesc &TID,
117c3c106ca59e44032041414c72ce584451f1d885fChris Lattner                                   unsigned DestReg) {
1188e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  MachineInstr *MI = BB.getParent()->CreateMachineInstr(TID);
119c3c106ca59e44032041414c72ce584451f1d885fChris Lattner  BB.insert(I, MI);
12009e460662a8d7328da1b938d5581a6ef3740b51dChris Lattner  return MachineInstrBuilder(MI).addReg(DestReg, true);
121c3c106ca59e44032041414c72ce584451f1d885fChris Lattner}
122c3c106ca59e44032041414c72ce584451f1d885fChris Lattner
12391ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built
12491ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction before the given position in the given MachineBasicBlock, and
12591ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// does NOT take a destination register.
12691ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke///
127c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB,
128c3c106ca59e44032041414c72ce584451f1d885fChris Lattner                                   MachineBasicBlock::iterator I,
129749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner                                   const TargetInstrDesc &TID) {
1308e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  MachineInstr *MI = BB.getParent()->CreateMachineInstr(TID);
131c3c106ca59e44032041414c72ce584451f1d885fChris Lattner  BB.insert(I, MI);
132c3c106ca59e44032041414c72ce584451f1d885fChris Lattner  return MachineInstrBuilder(MI);
133c3c106ca59e44032041414c72ce584451f1d885fChris Lattner}
134c3c106ca59e44032041414c72ce584451f1d885fChris Lattner
13591ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built
13691ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction at the end of the given MachineBasicBlock, and does NOT take a
13791ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// destination register.
1389cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner///
139c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock *BB,
140749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner                                   const TargetInstrDesc &TID) {
141c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng  return BuildMI(*BB, BB->end(), TID);
142f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner}
1437db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner
14491ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built
14591ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction at the end of the given MachineBasicBlock, and sets up the first
146c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// operand as a destination virtual register.
1479cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner///
148c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock *BB,
149749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner                                   const TargetInstrDesc &TID,
150c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng                                   unsigned DestReg) {
151c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng  return BuildMI(*BB, BB->end(), TID, DestReg);
1529cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner}
1539cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner
154d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
155d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
156f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#endif
157