MachineInstrBuilder.h revision ceb408f6a263e319683209ae5c6f8d1e3e4d9b69
1f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//===-- CodeGen/MachineInstBuilder.h - Simplify creation of MIs -*- C++ -*-===//
2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//                     The LLVM Compiler Infrastructure
46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
56fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// This file was developed by the LLVM research group and is distributed under
66fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// the University of Illinois Open Source 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"
21f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
22d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
249d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattnerclass MachineInstrBuilder {
25f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  MachineInstr *MI;
269d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattnerpublic:
27f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  MachineInstrBuilder(MachineInstr *mi) : MI(mi) {}
28f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
29f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  /// Allow automatic conversion to the machine instruction we are working on.
30f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  ///
31f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  operator MachineInstr*() const { return MI; }
32024e91f6f6b9c65d767efe507df213c5c53744c7Chris Lattner  operator MachineBasicBlock::iterator() const { return MI; }
33f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
349ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner  /// addReg - Add a new virtual register operand...
35f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  ///
36890f92328d5478e050d2eba8f4de24737a04a812Alkis Evlogimenos  const MachineInstrBuilder &addReg(
37890f92328d5478e050d2eba8f4de24737a04a812Alkis Evlogimenos    int RegNo,
38890f92328d5478e050d2eba8f4de24737a04a812Alkis Evlogimenos    MachineOperand::UseType Ty = MachineOperand::Use) const {
3932f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner    MI->addRegOperand(RegNo, Ty);
40f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner    return *this;
41f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  }
42f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
436a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner  /// addImm - Add a new immediate operand.
446a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner  ///
456a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner  const MachineInstrBuilder &addImm(int Val) const {
466a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner    MI->addZeroExtImmOperand(Val);
476a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner    return *this;
486a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner  }
49f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
50f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  /// addSImm - Add a new sign extended immediate operand...
51f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  ///
526a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner  const MachineInstrBuilder &addSImm(int val) const {
53f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner    MI->addSignExtImmOperand(val);
54f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner    return *this;
55f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  }
56f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
57f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  /// addZImm - Add a new zero extended immediate operand...
58f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  ///
596a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner  const MachineInstrBuilder &addZImm(unsigned Val) const {
60f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner    MI->addZeroExtImmOperand(Val);
61f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner    return *this;
62f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  }
638cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner
642d4c88311801d6eba48b257a43aee8a6d61299a6Duraid Madina  /// addImm64 - Add a new 64-bit immediate operand...
659696a90ee66e1c6c818c8de3d9ffc32732d9d82fDuraid Madina  ///
662d4c88311801d6eba48b257a43aee8a6d61299a6Duraid Madina  const MachineInstrBuilder &addImm64(uint64_t Val) const {
679696a90ee66e1c6c818c8de3d9ffc32732d9d82fDuraid Madina    MI->addZeroExtImm64Operand(Val);
689696a90ee66e1c6c818c8de3d9ffc32732d9d82fDuraid Madina    return *this;
699696a90ee66e1c6c818c8de3d9ffc32732d9d82fDuraid Madina  }
709696a90ee66e1c6c818c8de3d9ffc32732d9d82fDuraid Madina
718cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner  const MachineInstrBuilder &addMBB(MachineBasicBlock *MBB) const {
728cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner    MI->addMachineBasicBlockOperand(MBB);
738cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner    return *this;
748cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner  }
75aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner
76aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner  const MachineInstrBuilder &addFrameIndex(unsigned Idx) const {
77aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner    MI->addFrameIndexOperand(Idx);
78aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner    return *this;
79aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner  }
809d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner
81404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng  const MachineInstrBuilder &addConstantPoolIndex(unsigned Idx,
82404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng                                                  int Offset = 0) const {
83404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng    MI->addConstantPoolIndexOperand(Idx, Offset);
849d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner    return *this;
859d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner  }
869d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner
87ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng  const MachineInstrBuilder &addJumpTableIndex(unsigned Idx) const {
88ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng    MI->addJumpTableIndexOperand(Idx);
89ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng    return *this;
90ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng  }
91ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng
929d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner  const MachineInstrBuilder &addGlobalAddress(GlobalValue *GV,
93404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng                                              int Offset = 0) const {
94ea50fabfd4e5fad25a25b312f64a9b2a53363586Chris Lattner    MI->addGlobalAddressOperand(GV, Offset);
959d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner    return *this;
969d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner  }
979d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner
98ea50fabfd4e5fad25a25b312f64a9b2a53363586Chris Lattner  const MachineInstrBuilder &addExternalSymbol(const char *FnName) const{
99ea50fabfd4e5fad25a25b312f64a9b2a53363586Chris Lattner    MI->addExternalSymbolOperand(FnName);
1009d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner    return *this;
1019d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner  }
102f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner};
103f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
104f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner/// BuildMI - Builder interface.  Specify how to create the initial instruction
1059cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// itself.  NumOperands is the number of operands to the machine instruction to
1069cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// allow for memory efficient representation of machine instructions.
107f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner///
1084052cf998f826db723e783bc1550c09e69402b29Chris Lattnerinline MachineInstrBuilder BuildMI(int Opcode, unsigned NumOperands) {
109f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  return MachineInstrBuilder(new MachineInstr(Opcode, NumOperands, true, true));
110f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner}
111f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
11291ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder sets up the first operand as a
113367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner/// destination virtual register.  NumOperands is the number of additional add*
11491ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// calls that are expected, not including the destination register.
115367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner///
116890f92328d5478e050d2eba8f4de24737a04a812Alkis Evlogimenosinline MachineInstrBuilder BuildMI(
117890f92328d5478e050d2eba8f4de24737a04a812Alkis Evlogimenos  int Opcode, unsigned NumOperands,
118890f92328d5478e050d2eba8f4de24737a04a812Alkis Evlogimenos  unsigned DestReg,
119890f92328d5478e050d2eba8f4de24737a04a812Alkis Evlogimenos  MachineOperand::UseType useType = MachineOperand::Def) {
120367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner  return MachineInstrBuilder(new MachineInstr(Opcode, NumOperands+1,
12114be64018fb38d1fa535b9cd12d11371f4eba3b5Alkis Evlogimenos                                   true, true)).addReg(DestReg, useType);
122367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner}
123367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner
12491ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built
12591ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction before the given position in the given MachineBasicBlock, and
12691ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// sets up the first operand as a destination virtual register.
12791ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// NumOperands is the number of additional add* calls that are expected,
12891ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// not including the destination register.
12991ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke///
130c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB,
131c3c106ca59e44032041414c72ce584451f1d885fChris Lattner                                   MachineBasicBlock::iterator I,
132c3c106ca59e44032041414c72ce584451f1d885fChris Lattner                                   int Opcode, unsigned NumOperands,
133c3c106ca59e44032041414c72ce584451f1d885fChris Lattner                                   unsigned DestReg) {
134c3c106ca59e44032041414c72ce584451f1d885fChris Lattner  MachineInstr *MI = new MachineInstr(Opcode, NumOperands+1, true, true);
135c3c106ca59e44032041414c72ce584451f1d885fChris Lattner  BB.insert(I, MI);
136c3c106ca59e44032041414c72ce584451f1d885fChris Lattner  return MachineInstrBuilder(MI).addReg(DestReg, MachineOperand::Def);
137c3c106ca59e44032041414c72ce584451f1d885fChris Lattner}
138c3c106ca59e44032041414c72ce584451f1d885fChris Lattner
13991ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built
14091ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction before the given position in the given MachineBasicBlock, and
14191ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// does NOT take a destination register.
14291ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke///
143c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB,
144c3c106ca59e44032041414c72ce584451f1d885fChris Lattner                                   MachineBasicBlock::iterator I,
145c3c106ca59e44032041414c72ce584451f1d885fChris Lattner                                   int Opcode, unsigned NumOperands) {
146c3c106ca59e44032041414c72ce584451f1d885fChris Lattner  MachineInstr *MI = new MachineInstr(Opcode, NumOperands, true, true);
147c3c106ca59e44032041414c72ce584451f1d885fChris Lattner  BB.insert(I, MI);
148c3c106ca59e44032041414c72ce584451f1d885fChris Lattner  return MachineInstrBuilder(MI);
149c3c106ca59e44032041414c72ce584451f1d885fChris Lattner}
150c3c106ca59e44032041414c72ce584451f1d885fChris Lattner
15191ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built
15291ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction at the end of the given MachineBasicBlock, and does NOT take a
15391ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// destination register.
1549cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner///
1554052cf998f826db723e783bc1550c09e69402b29Chris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, int Opcode,
1567db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner                                   unsigned NumOperands) {
157c3c106ca59e44032041414c72ce584451f1d885fChris Lattner  return BuildMI(*BB, BB->end(), Opcode, NumOperands);
158f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner}
1597db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner
16091ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built
16191ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction at the end of the given MachineBasicBlock, and sets up the first
16291ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// operand as a destination virtual register. NumOperands is the number of
16391ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// additional add* calls that are expected, not including the destination
16491ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// register.
1659cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner///
1664052cf998f826db723e783bc1550c09e69402b29Chris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, int Opcode,
1679cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner                                   unsigned NumOperands, unsigned DestReg) {
168c3c106ca59e44032041414c72ce584451f1d885fChris Lattner  return BuildMI(*BB, BB->end(), Opcode, NumOperands, DestReg);
1699cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner}
1709cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner
171d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
172d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
173f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#endif
174