MachineInstr.h revision 32dfbeada7292167bb488f36a71a5a6a519ddaff
148486893f46d2e12e926682a3ecb908716bc66c4Chris Lattner//===-- llvm/CodeGen/MachineInstr.h - MachineInstr class --------*- 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//===----------------------------------------------------------------------===//
9a730c864227b287cdfad5f5f3d5d0808c9f422bbChris Lattner//
10a730c864227b287cdfad5f5f3d5d0808c9f422bbChris Lattner// This file contains the declaration of the MachineInstr class, which is the
11ef6a6a69ff1e1b709d0acb315b9f6c926c67a778Misha Brukman// basic representation for all target dependent machine instructions used by
12a730c864227b287cdfad5f5f3d5d0808c9f422bbChris Lattner// the back end.
13a730c864227b287cdfad5f5f3d5d0808c9f422bbChris Lattner//
14a730c864227b287cdfad5f5f3d5d0808c9f422bbChris Lattner//===----------------------------------------------------------------------===//
1523ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve
1623ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve#ifndef LLVM_CODEGEN_MACHINEINSTR_H
1723ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve#define LLVM_CODEGEN_MACHINEINSTR_H
1823ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve
19551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/ADT/iterator"
209696a90ee66e1c6c818c8de3d9ffc32732d9d82fDuraid Madina#include "llvm/Support/DataTypes.h"
21b5ebf15b2b2ce8989caf1a1114b05d80b0f9bd48Bill Wendling#include "llvm/Support/Streams.h"
22376ad9fa9f66facc7100186f0a1f56c1be858ff5Chris Lattner#include <vector>
237598a1a9a8ad9b974e428e24606c108aa3ba1431Chris Lattner#include <cassert>
241ccc4684f3413d1f176a2c7a867545ce03b6414cChris Lattner#include <iosfwd>
25be583b914d8156b99d3da264d5adca37fee8dbc9John Criswell
26d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
27d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
28054c1f6cb6f3a680fe4b8447880ed960fd7fe441Chris Lattnerclass Value;
29054c1f6cb6f3a680fe4b8447880ed960fd7fe441Chris Lattnerclass Function;
307db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattnerclass MachineBasicBlock;
31d7de496b23fca8145f777a56281457bf64e8bbadEvan Chengclass TargetInstrDescriptor;
32fa78fbf446b505767e838f9c188707183c57fc9cChris Lattnerclass TargetMachine;
333c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattnerclass GlobalValue;
34054c1f6cb6f3a680fe4b8447880ed960fd7fe441Chris Lattner
351fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnertemplate <typename T> struct ilist_traits;
361fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnertemplate <typename T> struct ilist;
37c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos
38b05497e0ca1ba2e7f57b792cc160e5d1c8579582Chris Lattner//===----------------------------------------------------------------------===//
39ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// class MachineOperand
40ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
4123ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve//   Representation of each machine instruction operand.
4200876a2808f1a8061f7e0852c7949fc5074ecb04Misha Brukman//
433c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattnerstruct MachineOperand {
4423ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve  enum MachineOperandType {
452d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner    MO_Register,                // Register operand.
4663b3d7113d93fda622c4954c6b1d046ce029044eChris Lattner    MO_Immediate,               // Immediate Operand
478cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner    MO_MachineBasicBlock,       // MachineBasicBlock reference
4856cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner    MO_FrameIndex,              // Abstract Stack Frame Index
493c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner    MO_ConstantPoolIndex,       // Address of indexed Constant in Constant Pool
5037efe6764568a3829fee26aba532283131d1a104Nate Begeman    MO_JumpTableIndex,          // Address of indexed Jump Table for switch
513c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner    MO_ExternalSymbol,          // Name of external global symbol
52410354fe0c052141dadeca939395743f8dd58e38Chris Lattner    MO_GlobalAddress            // Address of a global value
5323ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve  };
54ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman
556a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adveprivate:
566a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve  union {
576e994b74921d8519472a087246d7a56731e958d4Chris Lattner    GlobalValue *GV;          // For MO_GlobalAddress.
586e994b74921d8519472a087246d7a56731e958d4Chris Lattner    MachineBasicBlock *MBB;   // For MO_MachineBasicBlock.
596e994b74921d8519472a087246d7a56731e958d4Chris Lattner    const char *SymbolName;   // For MO_ExternalSymbol.
606e994b74921d8519472a087246d7a56731e958d4Chris Lattner    unsigned RegNo;           // For MO_Register.
616e994b74921d8519472a087246d7a56731e958d4Chris Lattner    int64_t immedVal;         // For MO_Immediate and MO_*Index.
62c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke  } contents;
63773fc471bdc36a221ff9302a07e58f8f7210d87dRuchira Sasanka
6409e460662a8d7328da1b938d5581a6ef3740b51dChris Lattner  MachineOperandType opType:8; // Discriminate the union.
6509e460662a8d7328da1b938d5581a6ef3740b51dChris Lattner  bool IsDef : 1;              // True if this is a def, false if this is a use.
66e7680cef84c42bc2ee68904bc2bd0b30a312da08Evan Cheng  bool IsImp : 1;              // True if this is an implicit def or use.
67d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng
68d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  bool IsKill : 1;             // True if this is a reg use and the reg is dead
69d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng                               // immediately after the read.
70d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  bool IsDead : 1;             // True if this is a reg def and the reg is dead
71d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng                               // immediately after the write. i.e. A register
72d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng                               // that is defined but never used.
7302597f3b8826e9760cee11ea07b4cfc5f260f736Chris Lattner
747bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman  /// auxInfo - auxiliary information used by the MachineOperand
757bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman  union {
767bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman    /// offset - Offset to address of global or external, only valid for
777bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman    /// MO_GlobalAddress, MO_ExternalSym and MO_ConstantPoolIndex
787bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman    int offset;
797bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman  } auxInfo;
807bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman
81943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner  MachineOperand() {}
824b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen
834b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen  void print(std::ostream &os) const;
845c7e326585f3a543388ba871c3425f7664cd9143Bill Wendling  void print(std::ostream *os) const { if (os) print(*os); }
854b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen
866a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Advepublic:
8702597f3b8826e9760cee11ea07b4cfc5f260f736Chris Lattner  MachineOperand(const MachineOperand &M) {
8802597f3b8826e9760cee11ea07b4cfc5f260f736Chris Lattner    *this = M;
893c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  }
90986cc38613e7859ab6c9ab8aa9fc2e686f8c2ab4Chris Lattner
917b55d4fce2c2b8eebbb1fc654400c7d46fd6bfbaChris Lattner  ~MachineOperand() {}
92986cc38613e7859ab6c9ab8aa9fc2e686f8c2ab4Chris Lattner
93986cc38613e7859ab6c9ab8aa9fc2e686f8c2ab4Chris Lattner  static MachineOperand CreateImm(int64_t Val) {
94986cc38613e7859ab6c9ab8aa9fc2e686f8c2ab4Chris Lattner    MachineOperand Op;
95986cc38613e7859ab6c9ab8aa9fc2e686f8c2ab4Chris Lattner    Op.opType = MachineOperand::MO_Immediate;
96986cc38613e7859ab6c9ab8aa9fc2e686f8c2ab4Chris Lattner    Op.contents.immedVal = Val;
97986cc38613e7859ab6c9ab8aa9fc2e686f8c2ab4Chris Lattner    Op.IsDef = false;
98e7680cef84c42bc2ee68904bc2bd0b30a312da08Evan Cheng    Op.IsImp = false;
99d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng    Op.IsKill = false;
100d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng    Op.IsDead = false;
1017bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman    Op.auxInfo.offset = 0;
102986cc38613e7859ab6c9ab8aa9fc2e686f8c2ab4Chris Lattner    return Op;
103986cc38613e7859ab6c9ab8aa9fc2e686f8c2ab4Chris Lattner  }
104986cc38613e7859ab6c9ab8aa9fc2e686f8c2ab4Chris Lattner
10542a0f9a4fb74bf11fdc36a73772b7c9b744cc867Evan Cheng  static MachineOperand CreateFrameIndex(unsigned Idx) {
10642a0f9a4fb74bf11fdc36a73772b7c9b744cc867Evan Cheng    MachineOperand Op;
10742a0f9a4fb74bf11fdc36a73772b7c9b744cc867Evan Cheng    Op.opType = MachineOperand::MO_FrameIndex;
10842a0f9a4fb74bf11fdc36a73772b7c9b744cc867Evan Cheng    Op.contents.immedVal = Idx;
10942a0f9a4fb74bf11fdc36a73772b7c9b744cc867Evan Cheng    Op.IsDef = false;
11042a0f9a4fb74bf11fdc36a73772b7c9b744cc867Evan Cheng    Op.IsImp = false;
11142a0f9a4fb74bf11fdc36a73772b7c9b744cc867Evan Cheng    Op.IsKill = false;
11242a0f9a4fb74bf11fdc36a73772b7c9b744cc867Evan Cheng    Op.IsDead = false;
11342a0f9a4fb74bf11fdc36a73772b7c9b744cc867Evan Cheng    Op.auxInfo.offset = 0;
11442a0f9a4fb74bf11fdc36a73772b7c9b744cc867Evan Cheng    return Op;
11542a0f9a4fb74bf11fdc36a73772b7c9b744cc867Evan Cheng  }
11642a0f9a4fb74bf11fdc36a73772b7c9b744cc867Evan Cheng
1173c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  const MachineOperand &operator=(const MachineOperand &MO) {
118c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke    contents = MO.contents;
11909e460662a8d7328da1b938d5581a6ef3740b51dChris Lattner    IsDef    = MO.IsDef;
120e7680cef84c42bc2ee68904bc2bd0b30a312da08Evan Cheng    IsImp    = MO.IsImp;
121d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng    IsKill   = MO.IsKill;
122d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng    IsDead   = MO.IsDead;
1233c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner    opType   = MO.opType;
1247bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman    auxInfo  = MO.auxInfo;
1253c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner    return *this;
1263c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  }
1273c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner
1280eda78a3729a917592a89ede933d7b7df82e0dc3Brian Gaeke  /// getType - Returns the MachineOperandType for this operand.
129ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman  ///
130133f079c8cf966d2222c2dda2de56d2cc600497eChris Lattner  MachineOperandType getType() const { return opType; }
131572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
132c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke  /// Accessors that tell you what kind of MachineOperand you're looking at.
133c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke  ///
1342d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner  bool isRegister() const { return opType == MO_Register; }
13563b3d7113d93fda622c4954c6b1d046ce029044eChris Lattner  bool isImmediate() const { return opType == MO_Immediate; }
13668ab4c6367f34e6320c5f0ce22b85f800bdcfd81Chris Lattner  bool isMachineBasicBlock() const { return opType == MO_MachineBasicBlock; }
13756cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner  bool isFrameIndex() const { return opType == MO_FrameIndex; }
1383c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  bool isConstantPoolIndex() const { return opType == MO_ConstantPoolIndex; }
13937efe6764568a3829fee26aba532283131d1a104Nate Begeman  bool isJumpTableIndex() const { return opType == MO_JumpTableIndex; }
1403c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  bool isGlobalAddress() const { return opType == MO_GlobalAddress; }
1413c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  bool isExternalSymbol() const { return opType == MO_ExternalSymbol; }
14235880f394fd547b9bec1e92e92ac68db9a931a58Misha Brukman
143171ce440aa1eca773a4025362efb2b498c562d71Chris Lattner  int64_t getImm() const {
14492dfe2001e96f6e2b6d327e8816f38033f88b295Dan Gohman    assert(isImmediate() && "Wrong MachineOperand accessor");
145171ce440aa1eca773a4025362efb2b498c562d71Chris Lattner    return contents.immedVal;
146171ce440aa1eca773a4025362efb2b498c562d71Chris Lattner  }
147171ce440aa1eca773a4025362efb2b498c562d71Chris Lattner
1489696a90ee66e1c6c818c8de3d9ffc32732d9d82fDuraid Madina  int64_t getImmedValue() const {
14992dfe2001e96f6e2b6d327e8816f38033f88b295Dan Gohman    assert(isImmediate() && "Wrong MachineOperand accessor");
150c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke    return contents.immedVal;
151c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke  }
152fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner  MachineBasicBlock *getMBB() const {
153fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner    assert(isMachineBasicBlock() && "Wrong MachineOperand accessor");
154fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner    return contents.MBB;
155fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner  }
1568cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner  MachineBasicBlock *getMachineBasicBlock() const {
157c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke    assert(isMachineBasicBlock() && "Wrong MachineOperand accessor");
158c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke    return contents.MBB;
159c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke  }
160dc4a4922d32b470acd68498d41e3b8130cf1e74eChris Lattner  void setMachineBasicBlock(MachineBasicBlock *MBB) {
161dc4a4922d32b470acd68498d41e3b8130cf1e74eChris Lattner    assert(isMachineBasicBlock() && "Wrong MachineOperand accessor");
162dc4a4922d32b470acd68498d41e3b8130cf1e74eChris Lattner    contents.MBB = MBB;
163dc4a4922d32b470acd68498d41e3b8130cf1e74eChris Lattner  }
164c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke  int getFrameIndex() const {
165c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke    assert(isFrameIndex() && "Wrong MachineOperand accessor");
1663bdfdfd10f73dcf17aa3381679e9be3e08a16d78Jeff Cohen    return (int)contents.immedVal;
1678cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner  }
1683c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  unsigned getConstantPoolIndex() const {
169c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke    assert(isConstantPoolIndex() && "Wrong MachineOperand accessor");
1703bdfdfd10f73dcf17aa3381679e9be3e08a16d78Jeff Cohen    return (unsigned)contents.immedVal;
1713c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  }
17237efe6764568a3829fee26aba532283131d1a104Nate Begeman  unsigned getJumpTableIndex() const {
17337efe6764568a3829fee26aba532283131d1a104Nate Begeman    assert(isJumpTableIndex() && "Wrong MachineOperand accessor");
17437efe6764568a3829fee26aba532283131d1a104Nate Begeman    return (unsigned)contents.immedVal;
17537efe6764568a3829fee26aba532283131d1a104Nate Begeman  }
1763c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  GlobalValue *getGlobal() const {
177c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke    assert(isGlobalAddress() && "Wrong MachineOperand accessor");
178ceb408f6a263e319683209ae5c6f8d1e3e4d9b69Chris Lattner    return contents.GV;
1793c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  }
180ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner  int getOffset() const {
181404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng    assert((isGlobalAddress() || isExternalSymbol() || isConstantPoolIndex()) &&
182ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner        "Wrong MachineOperand accessor");
1837bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman    return auxInfo.offset;
1847bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman  }
1857b55d4fce2c2b8eebbb1fc654400c7d46fd6bfbaChris Lattner  const char *getSymbolName() const {
186c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke    assert(isExternalSymbol() && "Wrong MachineOperand accessor");
1877b55d4fce2c2b8eebbb1fc654400c7d46fd6bfbaChris Lattner    return contents.SymbolName;
1883c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  }
1898cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner
190f89e2a941616681c93d4c52da05870f18660cadaEvan Cheng  bool isUse() const {
191f89e2a941616681c93d4c52da05870f18660cadaEvan Cheng    assert(isRegister() && "Wrong MachineOperand accessor");
192f89e2a941616681c93d4c52da05870f18660cadaEvan Cheng    return !IsDef;
193f89e2a941616681c93d4c52da05870f18660cadaEvan Cheng  }
194f89e2a941616681c93d4c52da05870f18660cadaEvan Cheng  bool isDef() const {
195f89e2a941616681c93d4c52da05870f18660cadaEvan Cheng    assert(isRegister() && "Wrong MachineOperand accessor");
196f89e2a941616681c93d4c52da05870f18660cadaEvan Cheng    return IsDef;
197f89e2a941616681c93d4c52da05870f18660cadaEvan Cheng  }
198f89e2a941616681c93d4c52da05870f18660cadaEvan Cheng  void setIsUse() {
199f89e2a941616681c93d4c52da05870f18660cadaEvan Cheng    assert(isRegister() && "Wrong MachineOperand accessor");
200f89e2a941616681c93d4c52da05870f18660cadaEvan Cheng    IsDef = false;
201f89e2a941616681c93d4c52da05870f18660cadaEvan Cheng  }
202f89e2a941616681c93d4c52da05870f18660cadaEvan Cheng  void setIsDef() {
203f89e2a941616681c93d4c52da05870f18660cadaEvan Cheng    assert(isRegister() && "Wrong MachineOperand accessor");
204f89e2a941616681c93d4c52da05870f18660cadaEvan Cheng    IsDef = true;
205f89e2a941616681c93d4c52da05870f18660cadaEvan Cheng  }
206504fc5b7b5a9ffa9f82e95e7212015575030c7a7Vikram S. Adve
207e7680cef84c42bc2ee68904bc2bd0b30a312da08Evan Cheng  bool isImplicit() const {
208e7680cef84c42bc2ee68904bc2bd0b30a312da08Evan Cheng    assert(isRegister() && "Wrong MachineOperand accessor");
209e7680cef84c42bc2ee68904bc2bd0b30a312da08Evan Cheng    return IsImp;
210e7680cef84c42bc2ee68904bc2bd0b30a312da08Evan Cheng  }
2118097ef3d7b8d429b04e23552d8ab8d0855c41563Jim Laskey  void setImplicit() {
212e7680cef84c42bc2ee68904bc2bd0b30a312da08Evan Cheng    assert(isRegister() && "Wrong MachineOperand accessor");
213e7680cef84c42bc2ee68904bc2bd0b30a312da08Evan Cheng    IsImp = true;
214e7680cef84c42bc2ee68904bc2bd0b30a312da08Evan Cheng  }
215e7680cef84c42bc2ee68904bc2bd0b30a312da08Evan Cheng
216d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  bool isKill() const {
217d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng    assert(isRegister() && "Wrong MachineOperand accessor");
218d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng    return IsKill;
219d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  }
220d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  bool isDead() const {
221d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng    assert(isRegister() && "Wrong MachineOperand accessor");
222d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng    return IsDead;
223d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  }
224d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  void setIsKill() {
2259a00279988612d0f960fb8d43e4ccfcab89e0e14Evan Cheng    assert(isRegister() && !IsDef && "Wrong MachineOperand accessor");
226d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng    IsKill = true;
227d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  }
228d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  void setIsDead() {
2299a00279988612d0f960fb8d43e4ccfcab89e0e14Evan Cheng    assert(isRegister() && IsDef && "Wrong MachineOperand accessor");
230d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng    IsDead = true;
231d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  }
232d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  void unsetIsKill() {
2339a00279988612d0f960fb8d43e4ccfcab89e0e14Evan Cheng    assert(isRegister() && !IsDef && "Wrong MachineOperand accessor");
234d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng    IsKill = false;
235d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  }
236d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  void unsetIsDead() {
2379a00279988612d0f960fb8d43e4ccfcab89e0e14Evan Cheng    assert(isRegister() && IsDef && "Wrong MachineOperand accessor");
238d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng    IsDead = false;
239d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  }
240d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng
24168ab4c6367f34e6320c5f0ce22b85f800bdcfd81Chris Lattner  /// getReg - Returns the register number.
242c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke  ///
243be766c72464116a445a02b542a450c4274bab5d0Alkis Evlogimenos  unsigned getReg() const {
24468ab4c6367f34e6320c5f0ce22b85f800bdcfd81Chris Lattner    assert(isRegister() && "This is not a register operand!");
24502597f3b8826e9760cee11ea07b4cfc5f260f736Chris Lattner    return contents.RegNo;
2467a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  }
247504fc5b7b5a9ffa9f82e95e7212015575030c7a7Vikram S. Adve
2484efeab208cf0fe7ae2f68bcdd1264a8fdb18826cChris Lattner  /// MachineOperand mutators.
249c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke  ///
250786a518f47fca5521d036031f78e3f2470a7a49aChris Lattner  void setReg(unsigned Reg) {
25168ab4c6367f34e6320c5f0ce22b85f800bdcfd81Chris Lattner    assert(isRegister() && "This is not a register operand!");
25202597f3b8826e9760cee11ea07b4cfc5f260f736Chris Lattner    contents.RegNo = Reg;
253ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman  }
254b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner
255e53f4a055f74bded20d6129b4724ddd17fd199f6Chris Lattner  void setImmedValue(int64_t immVal) {
25692dfe2001e96f6e2b6d327e8816f38033f88b295Dan Gohman    assert(isImmediate() && "Wrong MachineOperand mutator");
257171ce440aa1eca773a4025362efb2b498c562d71Chris Lattner    contents.immedVal = immVal;
258171ce440aa1eca773a4025362efb2b498c562d71Chris Lattner  }
259171ce440aa1eca773a4025362efb2b498c562d71Chris Lattner  void setImm(int64_t immVal) {
26092dfe2001e96f6e2b6d327e8816f38033f88b295Dan Gohman    assert(isImmediate() && "Wrong MachineOperand mutator");
261c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke    contents.immedVal = immVal;
262c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke  }
2639f495b54fa94dba4e0be59ba9736c7cf18d996d9Vikram S. Adve
264ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner  void setOffset(int Offset) {
26537efe6764568a3829fee26aba532283131d1a104Nate Begeman    assert((isGlobalAddress() || isExternalSymbol() || isConstantPoolIndex() ||
26637efe6764568a3829fee26aba532283131d1a104Nate Begeman            isJumpTableIndex()) &&
267ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner        "Wrong MachineOperand accessor");
2687bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman    auxInfo.offset = Offset;
2697bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman  }
270b6bb7e1ffe7a1324e70ec410b3a06f008f37b072Chris Lattner  void setConstantPoolIndex(unsigned Idx) {
271b6bb7e1ffe7a1324e70ec410b3a06f008f37b072Chris Lattner    assert(isConstantPoolIndex() && "Wrong MachineOperand accessor");
272b6bb7e1ffe7a1324e70ec410b3a06f008f37b072Chris Lattner    contents.immedVal = Idx;
273b6bb7e1ffe7a1324e70ec410b3a06f008f37b072Chris Lattner  }
2744976dfb4b9d6dd3c138736e93b17e31e0f8e9be6Chris Lattner  void setJumpTableIndex(unsigned Idx) {
2754976dfb4b9d6dd3c138736e93b17e31e0f8e9be6Chris Lattner    assert(isJumpTableIndex() && "Wrong MachineOperand accessor");
2764976dfb4b9d6dd3c138736e93b17e31e0f8e9be6Chris Lattner    contents.immedVal = Idx;
2774976dfb4b9d6dd3c138736e93b17e31e0f8e9be6Chris Lattner  }
278b6bb7e1ffe7a1324e70ec410b3a06f008f37b072Chris Lattner
279fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner  /// isIdenticalTo - Return true if this operand is identical to the specified
2809a00279988612d0f960fb8d43e4ccfcab89e0e14Evan Cheng  /// operand. Note: This method ignores isKill and isDead properties.
281fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner  bool isIdenticalTo(const MachineOperand &Other) const;
282e53f4a055f74bded20d6129b4724ddd17fd199f6Chris Lattner
283e53f4a055f74bded20d6129b4724ddd17fd199f6Chris Lattner  /// ChangeToImmediate - Replace this operand with a new immediate operand of
284e53f4a055f74bded20d6129b4724ddd17fd199f6Chris Lattner  /// the specified value.  If an operand is known to be an immediate already,
285e53f4a055f74bded20d6129b4724ddd17fd199f6Chris Lattner  /// the setImmedValue method should be used.
286e53f4a055f74bded20d6129b4724ddd17fd199f6Chris Lattner  void ChangeToImmediate(int64_t ImmVal) {
287e53f4a055f74bded20d6129b4724ddd17fd199f6Chris Lattner    opType = MO_Immediate;
288e53f4a055f74bded20d6129b4724ddd17fd199f6Chris Lattner    contents.immedVal = ImmVal;
289e53f4a055f74bded20d6129b4724ddd17fd199f6Chris Lattner  }
290e53f4a055f74bded20d6129b4724ddd17fd199f6Chris Lattner
291e53f4a055f74bded20d6129b4724ddd17fd199f6Chris Lattner  /// ChangeToRegister - Replace this operand with a new register operand of
292e53f4a055f74bded20d6129b4724ddd17fd199f6Chris Lattner  /// the specified value.  If an operand is known to be an register already,
293e53f4a055f74bded20d6129b4724ddd17fd199f6Chris Lattner  /// the setReg method should be used.
294659ba970e3d64465cfa1abc4d7d3f9595b5b0878Evan Cheng  void ChangeToRegister(unsigned Reg, bool isDef, bool isImp = false,
295659ba970e3d64465cfa1abc4d7d3f9595b5b0878Evan Cheng                        bool isKill = false, bool isDead = false) {
2962d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner    opType = MO_Register;
29702597f3b8826e9760cee11ea07b4cfc5f260f736Chris Lattner    contents.RegNo = Reg;
29809e460662a8d7328da1b938d5581a6ef3740b51dChris Lattner    IsDef = isDef;
299659ba970e3d64465cfa1abc4d7d3f9595b5b0878Evan Cheng    IsImp = isImp;
300659ba970e3d64465cfa1abc4d7d3f9595b5b0878Evan Cheng    IsKill = isKill;
301659ba970e3d64465cfa1abc4d7d3f9595b5b0878Evan Cheng    IsDead = isDead;
302e53f4a055f74bded20d6129b4724ddd17fd199f6Chris Lattner  }
303ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner
3044b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen  friend std::ostream& operator<<(std::ostream& os, const MachineOperand& mop) {
3054b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen    mop.print(os);
3064b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen    return os;
3074b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen  }
30898f2f8053bebaad7683de074bfb74239364098d2Vikram S. Adve
30969cacd471093e38a51e0e637fca1a1768b935136Vikram S. Adve  friend class MachineInstr;
31023ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve};
31123ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve
31223ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve
313b05497e0ca1ba2e7f57b792cc160e5d1c8579582Chris Lattner//===----------------------------------------------------------------------===//
3148b915b4ed2c6e43413937ac71c0cbcf476ad1a98Chris Lattner/// MachineInstr - Representation of each machine instruction.
3158b915b4ed2c6e43413937ac71c0cbcf476ad1a98Chris Lattner///
3169452b0797a80001920576d7e2ef4af05242cba69Chris Lattnerclass MachineInstr {
31767f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  const TargetInstrDescriptor *TID;     // Instruction descriptor.
318c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng  unsigned short NumImplicitOps;        // Number of implicit operands (which
3199a00279988612d0f960fb8d43e4ccfcab89e0e14Evan Cheng                                        // are determined at construction time).
3209a00279988612d0f960fb8d43e4ccfcab89e0e14Evan Cheng
321943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner  std::vector<MachineOperand> Operands; // the operands
322c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos  MachineInstr* prev, *next;            // links for our intrusive list
323ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis Evlogimenos  MachineBasicBlock* parent;            // pointer to the owning basic block
324c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke
325413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  // OperandComplete - Return true if it's illegal to add a new operand
326413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  bool OperandsComplete() const;
327a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve
328466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner  MachineInstr(const MachineInstr&);
3299452b0797a80001920576d7e2ef4af05242cba69Chris Lattner  void operator=(const MachineInstr&); // DO NOT IMPLEMENT
330c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos
331c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos  // Intrusive list support
332c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos  //
3331fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattner  friend struct ilist_traits<MachineInstr>;
334c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos
3356a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Advepublic:
336c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng  /// MachineInstr ctor - This constructor creates a dummy MachineInstr with
33767f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  /// TID NULL and no operands.
338c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng  MachineInstr();
339e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve
340d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  /// MachineInstr ctor - This constructor create a MachineInstr and add the
341c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng  /// implicit operands. It reserves space for number of operands specified by
342c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng  /// TargetInstrDescriptor.
343ec82dc9a7c7172c6905d242523d13079a3e94427Dan Gohman  explicit MachineInstr(const TargetInstrDescriptor &TID);
344d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng
3457db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner  /// MachineInstr ctor - Work exactly the same as the ctor above, except that
3467db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner  /// the MachineInstr is created and added to the end of the specified basic
3477db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner  /// block.
3487db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner  ///
349c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng  MachineInstr(MachineBasicBlock *MBB, const TargetInstrDescriptor &TID);
350ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman
351aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  ~MachineInstr();
352aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos
353ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis Evlogimenos  const MachineBasicBlock* getParent() const { return parent; }
354ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis Evlogimenos  MachineBasicBlock* getParent() { return parent; }
35567f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng
35667f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  /// getInstrDescriptor - Returns the target instruction descriptor of this
35767f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  /// MachineInstr.
35867f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  const TargetInstrDescriptor *getInstrDescriptor() const { return TID; }
359ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis Evlogimenos
360c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke  /// getOpcode - Returns the opcode of this MachineInstr.
361cd0b3a90aa34bd42d75d8d86f74ca4972145781dBrian Gaeke  ///
362cb648f90a26eb05ae8d508d500ca12881df50824Dan Gohman  int getOpcode() const;
3639f495b54fa94dba4e0be59ba9736c7cf18d996d9Vikram S. Adve
364cd0b3a90aa34bd42d75d8d86f74ca4972145781dBrian Gaeke  /// Access to explicit operands of the instruction.
365cd0b3a90aa34bd42d75d8d86f74ca4972145781dBrian Gaeke  ///
366943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner  unsigned getNumOperands() const { return Operands.size(); }
367ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman
368572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  const MachineOperand& getOperand(unsigned i) const {
369a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve    assert(i < getNumOperands() && "getOperand() out of range!");
370943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    return Operands[i];
371572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  }
372572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  MachineOperand& getOperand(unsigned i) {
373a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve    assert(i < getNumOperands() && "getOperand() out of range!");
374943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    return Operands[i];
375572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  }
3766d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner
37719e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng  /// getNumExplicitOperands - Returns the number of non-implicit operands.
37819e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng  ///
37919e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng  unsigned getNumExplicitOperands() const;
380fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner
381fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner  /// isIdenticalTo - Return true if this instruction is identical to (same
382fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner  /// opcode and same operands as) the specified instruction.
383fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner  bool isIdenticalTo(const MachineInstr *Other) const {
384fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner    if (Other->getOpcode() != getOpcode() ||
385846c1b49365be588b5aaddd02916e46c2422ae6fChris Lattner        Other->getNumOperands() != getNumOperands())
386fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner      return false;
387fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner    for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
388fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner      if (!getOperand(i).isIdenticalTo(Other->getOperand(i)))
389fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner        return false;
390fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner    return true;
391fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner  }
392a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve
393b5159ed0cb7943e5938782f7693beb18342165ceTanya Lattner  /// clone - Create a copy of 'this' instruction that is identical in
394b5159ed0cb7943e5938782f7693beb18342165ceTanya Lattner  /// all ways except the the instruction has no parent, prev, or next.
395943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner  MachineInstr* clone() const { return new MachineInstr(*this); }
3966b560918426182d2b46b899d609911d49f6739f7Chris Lattner
3976b560918426182d2b46b899d609911d49f6739f7Chris Lattner  /// removeFromParent - This method unlinks 'this' from the containing basic
3986b560918426182d2b46b899d609911d49f6739f7Chris Lattner  /// block, and returns it, but does not delete it.
3996b560918426182d2b46b899d609911d49f6739f7Chris Lattner  MachineInstr *removeFromParent();
4006b560918426182d2b46b899d609911d49f6739f7Chris Lattner
4016b560918426182d2b46b899d609911d49f6739f7Chris Lattner  /// eraseFromParent - This method unlinks 'this' from the containing basic
4026b560918426182d2b46b899d609911d49f6739f7Chris Lattner  /// block and deletes it.
4036b560918426182d2b46b899d609911d49f6739f7Chris Lattner  void eraseFromParent() {
4046b560918426182d2b46b899d609911d49f6739f7Chris Lattner    delete removeFromParent();
4056b560918426182d2b46b899d609911d49f6739f7Chris Lattner  }
406466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner
407faa510726f4b40aa4495e60e4d341c6467e3fb01Evan Cheng  /// findRegisterUseOperandIdx() - Returns the operand index that is a use of
40832eb1f1ca4220d2f24916e587ad7e8574d7d82a1Evan Cheng  /// the specific register or -1 if it is not found. It further tightening
40976d7e76c15c258ec4a71fd75a2a32bca3a5e5e27Evan Cheng  /// the search criteria to a use that kills the register if isKill is true.
410f277ee4be7edabb759a7f78138b693d72d0c263fEvan Cheng  int findRegisterUseOperandIdx(unsigned Reg, bool isKill = false) const;
411576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng
412b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  /// findRegisterDefOperand() - Returns the MachineOperand that is a def of
413b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  /// the specific register or NULL if it is not found.
414b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  MachineOperand *findRegisterDefOperand(unsigned Reg);
41519e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng
416f277ee4be7edabb759a7f78138b693d72d0c263fEvan Cheng  /// findFirstPredOperandIdx() - Find the index of the first operand in the
417f277ee4be7edabb759a7f78138b693d72d0c263fEvan Cheng  /// operand list that is used to represent the predicate. It returns -1 if
418f277ee4be7edabb759a7f78138b693d72d0c263fEvan Cheng  /// none is found.
419f277ee4be7edabb759a7f78138b693d72d0c263fEvan Cheng  int findFirstPredOperandIdx() const;
420b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
42132dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng  /// isRegReDefinedByTwoAddr - Returns true if the Reg re-definition is due
42232dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng  /// to two addr elimination.
42332dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng  bool isRegReDefinedByTwoAddr(unsigned Reg) const;
42432dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng
4259a00279988612d0f960fb8d43e4ccfcab89e0e14Evan Cheng  /// copyKillDeadInfo - Copies kill / dead operand properties from MI.
4269a00279988612d0f960fb8d43e4ccfcab89e0e14Evan Cheng  ///
427576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng  void copyKillDeadInfo(const MachineInstr *MI);
4289a00279988612d0f960fb8d43e4ccfcab89e0e14Evan Cheng
42919e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng  /// copyPredicates - Copies predicate operand(s) from MI.
43019e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng  void copyPredicates(const MachineInstr *MI);
43119e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng
432a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve  //
433a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve  // Debugging support
434fa78fbf446b505767e838f9c188707183c57fc9cChris Lattner  //
4355c7e326585f3a543388ba871c3425f7664cd9143Bill Wendling  void print(std::ostream *OS, const TargetMachine *TM) const {
4365c7e326585f3a543388ba871c3425f7664cd9143Bill Wendling    if (OS) print(*OS, TM);
437b5ebf15b2b2ce8989caf1a1114b05d80b0f9bd48Bill Wendling  }
438b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner  void print(std::ostream &OS, const TargetMachine *TM) const;
4394b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen  void print(std::ostream &OS) const;
4405c7e326585f3a543388ba871c3425f7664cd9143Bill Wendling  void print(std::ostream *OS) const { if (OS) print(*OS); }
441572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  void dump() const;
4424b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen  friend std::ostream& operator<<(std::ostream& os, const MachineInstr& minstr){
4434b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen    minstr.print(os);
4444b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen    return os;
4454b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen  }
4462f898d207466bf233b55607e404baca302bc7b5eChris Lattner
447413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  //===--------------------------------------------------------------------===//
448943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner  // Accessors to add operands when building up machine instructions.
449413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  //
450413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner
451943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner  /// addRegOperand - Add a register operand.
452413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  ///
453d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  void addRegOperand(unsigned Reg, bool IsDef, bool IsImp = false,
454d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng                     bool IsKill = false, bool IsDead = false) {
455e7680cef84c42bc2ee68904bc2bd0b30a312da08Evan Cheng    MachineOperand &Op = AddNewOperand(IsImp);
456943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    Op.opType = MachineOperand::MO_Register;
45709e460662a8d7328da1b938d5581a6ef3740b51dChris Lattner    Op.IsDef = IsDef;
458e7680cef84c42bc2ee68904bc2bd0b30a312da08Evan Cheng    Op.IsImp = IsImp;
459d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng    Op.IsKill = IsKill;
460d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng    Op.IsDead = IsDead;
461943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    Op.contents.RegNo = Reg;
46223e6bba592af68ba991ee6900978e81eb21a08afChris Lattner  }
46323e6bba592af68ba991ee6900978e81eb21a08afChris Lattner
4642d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner  /// addImmOperand - Add a zero extended constant argument to the
465413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  /// machine instruction.
466413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  ///
4672d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner  void addImmOperand(int64_t Val) {
468943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    MachineOperand &Op = AddNewOperand();
469943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    Op.opType = MachineOperand::MO_Immediate;
470943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    Op.contents.immedVal = Val;
4717bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman    Op.auxInfo.offset = 0;
472413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  }
473413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner
4748cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner  void addMachineBasicBlockOperand(MachineBasicBlock *MBB) {
475943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    MachineOperand &Op = AddNewOperand();
476943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    Op.opType = MachineOperand::MO_MachineBasicBlock;
477943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    Op.contents.MBB = MBB;
4787bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman    Op.auxInfo.offset = 0;
4798cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner  }
480413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner
48156cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner  /// addFrameIndexOperand - Add an abstract frame index to the instruction
48256cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner  ///
48356cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner  void addFrameIndexOperand(unsigned Idx) {
484943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    MachineOperand &Op = AddNewOperand();
485943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    Op.opType = MachineOperand::MO_FrameIndex;
486943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    Op.contents.immedVal = Idx;
4877bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman    Op.auxInfo.offset = 0;
48856cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner  }
48956cf63f2f6db6ae47dec06489d09011ef6b0ee02Chris Lattner
4903c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  /// addConstantPoolndexOperand - Add a constant pool object index to the
4913c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  /// instruction.
4923c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  ///
493943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner  void addConstantPoolIndexOperand(unsigned Idx, int Offset) {
494943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    MachineOperand &Op = AddNewOperand();
495943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    Op.opType = MachineOperand::MO_ConstantPoolIndex;
496943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    Op.contents.immedVal = Idx;
4977bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman    Op.auxInfo.offset = Offset;
4983c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  }
4993c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner
50037efe6764568a3829fee26aba532283131d1a104Nate Begeman  /// addJumpTableIndexOperand - Add a jump table object index to the
50137efe6764568a3829fee26aba532283131d1a104Nate Begeman  /// instruction.
50237efe6764568a3829fee26aba532283131d1a104Nate Begeman  ///
503943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner  void addJumpTableIndexOperand(unsigned Idx) {
504943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    MachineOperand &Op = AddNewOperand();
505943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    Op.opType = MachineOperand::MO_JumpTableIndex;
506943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    Op.contents.immedVal = Idx;
5077bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman    Op.auxInfo.offset = 0;
50837efe6764568a3829fee26aba532283131d1a104Nate Begeman  }
50937efe6764568a3829fee26aba532283131d1a104Nate Begeman
510ea50fabfd4e5fad25a25b312f64a9b2a53363586Chris Lattner  void addGlobalAddressOperand(GlobalValue *GV, int Offset) {
511943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    MachineOperand &Op = AddNewOperand();
512943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    Op.opType = MachineOperand::MO_GlobalAddress;
513943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    Op.contents.GV = GV;
5147bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman    Op.auxInfo.offset = Offset;
5153c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  }
5163c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner
5173c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  /// addExternalSymbolOperand - Add an external symbol operand to this instr
5183c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  ///
519ea50fabfd4e5fad25a25b312f64a9b2a53363586Chris Lattner  void addExternalSymbolOperand(const char *SymName) {
520943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    MachineOperand &Op = AddNewOperand();
521943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    Op.opType = MachineOperand::MO_ExternalSymbol;
522943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    Op.contents.SymbolName = SymName;
5237bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman    Op.auxInfo.offset = 0;
5243c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  }
5257ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner
5267ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner  //===--------------------------------------------------------------------===//
5277ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner  // Accessors used to modify instructions in place.
5287ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner  //
5297ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner
53067f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  /// setInstrDescriptor - Replace the instruction descriptor (thus opcode) of
53167f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  /// the current instruction with a new one.
5323c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  ///
53367f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  void setInstrDescriptor(const TargetInstrDescriptor &tid) { TID = &tid; }
5343c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner
5353c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  /// RemoveOperand - Erase an operand  from an instruction, leaving it with one
5363c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  /// fewer operand than it started with.
5373c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  ///
5383c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  void RemoveOperand(unsigned i) {
539943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    Operands.erase(Operands.begin()+i);
540943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner  }
541943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattnerprivate:
542e7680cef84c42bc2ee68904bc2bd0b30a312da08Evan Cheng  MachineOperand &AddNewOperand(bool IsImp = false) {
543e7680cef84c42bc2ee68904bc2bd0b30a312da08Evan Cheng    assert((IsImp || !OperandsComplete()) &&
544943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner           "Trying to add an operand to a machine instr that is already done!");
545cdee1c4272d4c87292116fe3edf1bc85f50d6040Evan Cheng    if (IsImp || NumImplicitOps == 0) { // This is true most of the time.
546d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      Operands.push_back(MachineOperand());
547d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      return Operands.back();
548d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng    }
549cdee1c4272d4c87292116fe3edf1bc85f50d6040Evan Cheng    return *Operands.insert(Operands.begin()+Operands.size()-NumImplicitOps,
550cdee1c4272d4c87292116fe3edf1bc85f50d6040Evan Cheng                            MachineOperand());
5513c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner  }
552d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng
553d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  /// addImplicitDefUseOperands - Add all implicit def and use operands to
554d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  /// this instruction.
55567f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  void addImplicitDefUseOperands();
556a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve};
55723ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve
558b05497e0ca1ba2e7f57b792cc160e5d1c8579582Chris Lattner//===----------------------------------------------------------------------===//
559593da4acc56d4c591ad688e6605b04d0825c867eVikram S. Adve// Debugging Support
560593da4acc56d4c591ad688e6605b04d0825c867eVikram S. Adve
561b05497e0ca1ba2e7f57b792cc160e5d1c8579582Chris Lattnerstd::ostream& operator<<(std::ostream &OS, const MachineInstr &MI);
562b05497e0ca1ba2e7f57b792cc160e5d1c8579582Chris Lattnerstd::ostream& operator<<(std::ostream &OS, const MachineOperand &MO);
563136c9f4062b0fe6d864ebc2bc2b0cbada931a28eVikram S. Adve
564d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
565d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
56623ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve#endif
567