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