MachineInstrBuilder.h revision 6fbcc26f1460eaee4e0eb8b426fc1ff0c7af11be
1f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//===-- CodeGen/MachineInstBuilder.h - Simplify creation of MIs -*- C++ -*-===//
26fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
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.
76fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===//
9f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//
10f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// This file exposes a function named BuildMI, which is useful for dramatically
11f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// simplifying how MachineInstr's are created.  Instead of using code like this:
12f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//
13f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//   M = new MachineInstr(X86::ADDrr32);
14f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//   M->SetMachineOperandVal(0, MachineOperand::MO_VirtualRegister, argVal1);
15f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//   M->SetMachineOperandVal(1, MachineOperand::MO_VirtualRegister, argVal2);
16f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//
17f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// we can now use code like this:
18f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//
199ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner//   M = BuildMI(X86::ADDrr8, 2).addReg(argVal1).addReg(argVal2);
20f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//
21f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//===----------------------------------------------------------------------===//
22f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
23f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#ifndef LLVM_CODEGEN_MACHINEINSTRBUILDER_H
24f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#define LLVM_CODEGEN_MACHINEINSTRBUILDER_H
25f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
26f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#include "llvm/CodeGen/MachineInstr.h"
27f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
289d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattnerclass MachineInstrBuilder {
29f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  MachineInstr *MI;
309d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattnerpublic:
31f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  MachineInstrBuilder(MachineInstr *mi) : MI(mi) {}
32f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
33f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  /// Allow automatic conversion to the machine instruction we are working on.
34f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  ///
35f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  operator MachineInstr*() const { return MI; }
36f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
379ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner  /// addReg - Add a new virtual register operand...
38f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  ///
3932f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner  const MachineInstrBuilder &addReg(int RegNo,
4032f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner                                    MOTy::UseType Ty = MOTy::Use) const {
4132f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner    MI->addRegOperand(RegNo, Ty);
42f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner    return *this;
43f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  }
44f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
456559bb96a9901af21c6037675f9508373773bd35Brian Gaeke  /// addReg - Add an LLVM value that is to be used as a register...
469ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner  ///
4732f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner  const MachineInstrBuilder &addReg(Value *V,
4832f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner                                    MOTy::UseType Ty = MOTy::Use) const {
4932f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner    MI->addRegOperand(V, Ty);
50f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner    return *this;
51f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  }
52f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
5383435fbaf98a89cc5d6f13a68bab7e52e8fb6cb3Chris Lattner  /// addReg - Add an LLVM value that is to be used as a register...
5483435fbaf98a89cc5d6f13a68bab7e52e8fb6cb3Chris Lattner  ///
5583435fbaf98a89cc5d6f13a68bab7e52e8fb6cb3Chris Lattner  const MachineInstrBuilder &addCCReg(Value *V,
5683435fbaf98a89cc5d6f13a68bab7e52e8fb6cb3Chris Lattner                                      MOTy::UseType Ty = MOTy::Use) const {
5783435fbaf98a89cc5d6f13a68bab7e52e8fb6cb3Chris Lattner    MI->addCCRegOperand(V, Ty);
5883435fbaf98a89cc5d6f13a68bab7e52e8fb6cb3Chris Lattner    return *this;
5983435fbaf98a89cc5d6f13a68bab7e52e8fb6cb3Chris Lattner  }
6083435fbaf98a89cc5d6f13a68bab7e52e8fb6cb3Chris Lattner
61e387de30841a5e106015379b6c47c568cde8b06eChris Lattner  /// addRegDef - Add an LLVM value that is to be defined as a register... this
62e387de30841a5e106015379b6c47c568cde8b06eChris Lattner  /// is the same as addReg(V, MOTy::Def).
636559bb96a9901af21c6037675f9508373773bd35Brian Gaeke  ///
64e387de30841a5e106015379b6c47c568cde8b06eChris Lattner  const MachineInstrBuilder &addRegDef(Value *V) const {
65e387de30841a5e106015379b6c47c568cde8b06eChris Lattner    return addReg(V, MOTy::Def);
666559bb96a9901af21c6037675f9508373773bd35Brian Gaeke  }
676559bb96a9901af21c6037675f9508373773bd35Brian Gaeke
689ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner  /// addPCDisp - Add an LLVM value to be treated as a PC relative
699ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner  /// displacement...
709ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner  ///
715494c7ed9dd8f5a3dbaf42d2b9ddb9cd3a85aa34Chris Lattner  const MachineInstrBuilder &addPCDisp(Value *V) const {
72f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner    MI->addPCDispOperand(V);
73f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner    return *this;
74f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  }
75f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
769ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner  /// addMReg - Add a machine register operand...
779ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner  ///
7832f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner  const MachineInstrBuilder &addMReg(int Reg,
7932f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner                                     MOTy::UseType Ty = MOTy::Use) const {
8032f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner    MI->addMachineRegOperand(Reg, Ty);
81f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner    return *this;
82f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  }
83f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
84f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  /// addSImm - Add a new sign extended immediate operand...
85f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  ///
865494c7ed9dd8f5a3dbaf42d2b9ddb9cd3a85aa34Chris Lattner  const MachineInstrBuilder &addSImm(int64_t val) const {
87f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner    MI->addSignExtImmOperand(val);
88f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner    return *this;
89f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  }
90f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
91f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  /// addZImm - Add a new zero extended immediate operand...
92f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  ///
935494c7ed9dd8f5a3dbaf42d2b9ddb9cd3a85aa34Chris Lattner  const MachineInstrBuilder &addZImm(int64_t Val) const {
94f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner    MI->addZeroExtImmOperand(Val);
95f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner    return *this;
96f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  }
978cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner
988cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner  const MachineInstrBuilder &addMBB(MachineBasicBlock *MBB) const {
998cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner    MI->addMachineBasicBlockOperand(MBB);
1008cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner    return *this;
1018cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner  }
102aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner
103aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner  const MachineInstrBuilder &addFrameIndex(unsigned Idx) const {
104aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner    MI->addFrameIndexOperand(Idx);
105aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner    return *this;
106aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner  }
1079d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner
1089d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner  const MachineInstrBuilder &addConstantPoolIndex(unsigned Idx) const {
1099d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner    MI->addConstantPoolIndexOperand(Idx);
1109d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner    return *this;
1119d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner  }
1129d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner
1139d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner  const MachineInstrBuilder &addGlobalAddress(GlobalValue *GV,
1149d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner					      bool isPCRelative = false) const {
1159d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner    MI->addGlobalAddressOperand(GV, isPCRelative);
1169d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner    return *this;
1179d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner  }
1189d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner
1199d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner  const MachineInstrBuilder &addExternalSymbol(const std::string &Name,
1209d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner					       bool isPCRelative = false) const{
1219d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner    MI->addExternalSymbolOperand(Name, isPCRelative);
1229d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner    return *this;
1239d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner  }
124f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner};
125f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
126f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner/// BuildMI - Builder interface.  Specify how to create the initial instruction
1279cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// itself.  NumOperands is the number of operands to the machine instruction to
1289cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// allow for memory efficient representation of machine instructions.
129f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner///
1304052cf998f826db723e783bc1550c09e69402b29Chris Lattnerinline MachineInstrBuilder BuildMI(int Opcode, unsigned NumOperands) {
131f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner  return MachineInstrBuilder(new MachineInstr(Opcode, NumOperands, true, true));
132f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner}
133f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner
134367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner/// BuildMI - This version of the builder also sets up the first "operand" as a
135367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner/// destination virtual register.  NumOperands is the number of additional add*
136367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner/// calls that are expected, it does not include the destination register.
137367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner///
1384052cf998f826db723e783bc1550c09e69402b29Chris Lattnerinline MachineInstrBuilder BuildMI(int Opcode, unsigned NumOperands,
139367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner                                   unsigned DestReg) {
140367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner  return MachineInstrBuilder(new MachineInstr(Opcode, NumOperands+1,
141367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner                                   true, true)).addReg(DestReg, MOTy::Def);
142367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner}
143367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner
144367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner
1459cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// BuildMI - This version of the builder inserts the built MachineInstr into
1469cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// the specified MachineBasicBlock.
1479cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner///
1484052cf998f826db723e783bc1550c09e69402b29Chris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, int Opcode,
1497db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner                                   unsigned NumOperands) {
1507db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner  return MachineInstrBuilder(new MachineInstr(BB, Opcode, NumOperands));
151f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner}
1527db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner
1539cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// BuildMI - This version of the builder inserts the built MachineInstr into
1549cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// the specified MachineBasicBlock, and also sets up the first "operand" as a
1559cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// destination virtual register.  NumOperands is the number of additional add*
1569cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// calls that are expected, it does not include the destination register.
1579cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner///
1584052cf998f826db723e783bc1550c09e69402b29Chris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, int Opcode,
1599cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner                                   unsigned NumOperands, unsigned DestReg) {
1609cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner  return MachineInstrBuilder(new MachineInstr(BB, Opcode,
1619cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner                                              NumOperands+1)).addReg(DestReg,
16232f3d08cdebd8941f2149a8f32acd45bd224ca8dChris Lattner                                                                     MOTy::Def);
1639cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner}
1649cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner
165f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#endif
166