MachineInstr.cpp revision 02e5f8dcda4319e05fe49301ab72c386ed859e16
1035dfbe7f2d109008d2d62d9f2a67efb477a7ab6Chris Lattner//===-- MachineInstr.cpp --------------------------------------------------===// 2edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 5b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// This file was developed by the LLVM research group and is distributed under 6b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details. 7edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 921326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke// 1021326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke// Methods common to all machine instructions. 1121326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke// 1221326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke// FIXME: Now that MachineInstrs have parent pointers, they should always 1321326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke// print themselves using their MachineFunction's TargetMachine. 1421326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke// 15035dfbe7f2d109008d2d62d9f2a67efb477a7ab6Chris Lattner//===----------------------------------------------------------------------===// 1670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 17822b4fb896846b87dd11a330ae13f2239329aeefChris Lattner#include "llvm/CodeGen/MachineInstr.h" 188517e1f0beea9b5e47974f083396d53294c390adChris Lattner#include "llvm/CodeGen/MachineFunction.h" 193801f6d38371b734d9de2fb8394ca75d2bf190ebChris Lattner#include "llvm/Value.h" 201049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner#include "llvm/Target/TargetMachine.h" 213501feab811c86c9659248a4875fc31a3165f84dChris Lattner#include "llvm/Target/TargetInstrInfo.h" 222a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner#include "llvm/Target/MRegisterInfo.h" 23551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/LeakDetector.h" 24954da37bb492b519f5c31dc360f2a142567e08b4Reid Spencer#include <iostream> 25954da37bb492b519f5c31dc360f2a142567e08b4Reid Spencer 260742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattnerusing namespace llvm; 27d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 28f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// Global variable holding an array of descriptors for machine instructions. 29f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// The actual object needs to be created separately for each target machine. 303501feab811c86c9659248a4875fc31a3165f84dChris Lattner// This variable is initialized and reset by class TargetInstrInfo. 31edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman// 32f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// FIXME: This should be a property of the target so that more than one target 33f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// at a time can be active... 34f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// 3511d1f21e1d400826ccc3cae5702d6a626baa906bChris Lattnernamespace llvm { 360742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner extern const TargetInstrDescriptor *TargetInstrDescriptors; 370742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner} 3869917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka 391885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve// Constructor for instructions with variable #operands 40ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis EvlogimenosMachineInstr::MachineInstr(short opcode, unsigned numOperands) 41ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis Evlogimenos : Opcode(opcode), 42ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis Evlogimenos operands(numOperands, MachineOperand()), 43ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis Evlogimenos parent(0) { 44aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos // Make sure that we get added to a machine basicblock 45aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos LeakDetector::addGarbageObject(this); 46413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner} 47413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner 48ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - This constructor only does a _reserve_ of the operands, 49ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// not a resize for them. It is expected that if you use this that you call 50ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// add* methods below to fill up the operands, instead of the Set methods. 51ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// Eventually, the "resizing" ctors will be phased out. 52ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// 5321326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian GaekeMachineInstr::MachineInstr(short opcode, unsigned numOperands, bool XX, bool YY) 5402e5f8dcda4319e05fe49301ab72c386ed859e16Chris Lattner : Opcode(opcode), parent(0) { 557279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner operands.reserve(numOperands); 56aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos // Make sure that we get added to a machine basicblock 57aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos LeakDetector::addGarbageObject(this); 587279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner} 597279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner 60ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - Work exactly the same as the ctor above, except that the 61ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr is created and added to the end of the specified basic block. 62ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// 63ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis EvlogimenosMachineInstr::MachineInstr(MachineBasicBlock *MBB, short opcode, 64ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner unsigned numOperands) 6502e5f8dcda4319e05fe49301ab72c386ed859e16Chris Lattner : Opcode(opcode), parent(0) { 66ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner assert(MBB && "Cannot use inserting ctor with null basic block!"); 67ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner operands.reserve(numOperands); 68aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos // Make sure that we get added to a machine basicblock 69aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos LeakDetector::addGarbageObject(this); 70ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner MBB->push_back(this); // Add instruction to end of basic block! 71ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner} 72ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner 73ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman/// MachineInstr ctor - Copies MachineInstr arg exactly 74ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman/// 75466b534a570f574ed485d875bbca8454f68dcb52Tanya LattnerMachineInstr::MachineInstr(const MachineInstr &MI) { 76466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner Opcode = MI.getOpcode(); 77b5159ed0cb7943e5938782f7693beb18342165ceTanya Lattner operands.reserve(MI.getNumOperands()); 78b5159ed0cb7943e5938782f7693beb18342165ceTanya Lattner 79ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman // Add operands 80ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman for (unsigned i = 0; i < MI.getNumOperands(); ++i) 81466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner operands.push_back(MachineOperand(MI.getOperand(i))); 820c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner 83ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman // Set parent, next, and prev to null 840c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner parent = 0; 850c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner prev = 0; 860c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner next = 0; 87466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner} 88466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner 89466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner 90ce22e76996d3ff0930716fa60c29df60a7e0481bMisha BrukmanMachineInstr::~MachineInstr() { 91aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos LeakDetector::removeGarbageObject(this); 92aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos} 93aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos 94ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman/// clone - Create a copy of 'this' instruction that is identical in all ways 95ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman/// except the following: the new instruction has no parent and it has no name 96ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman/// 970c63e03e04d3982e1913479bba404c3debc9a27eTanya LattnerMachineInstr* MachineInstr::clone() const { 98b5159ed0cb7943e5938782f7693beb18342165ceTanya Lattner return new MachineInstr(*this); 99466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner} 100466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner 10148d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner/// removeFromParent - This method unlinks 'this' from the containing basic 10248d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner/// block, and returns it, but does not delete it. 10348d7c069c76882475c23de153bda9483cd3c9bb4Chris LattnerMachineInstr *MachineInstr::removeFromParent() { 10448d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner assert(getParent() && "Not embedded in a basic block!"); 10548d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner getParent()->remove(this); 10648d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner return this; 10748d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner} 10848d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner 10948d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner 11021326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// OperandComplete - Return true if it's illegal to add a new operand 11121326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// 1122a90ba60175f93e7438165d8423100aa573c16c5Chris Lattnerbool MachineInstr::OperandsComplete() const { 1132a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner int NumOperands = TargetInstrDescriptors[Opcode].numOperands; 114a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve if (NumOperands >= 0 && getNumOperands() >= (unsigned)NumOperands) 1153497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve return true; // Broken: we have all the operands of this instruction! 116413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner return false; 11770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 11870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 119a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattnervoid MachineInstr::SetMachineOperandVal(unsigned i, 120a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattner MachineOperand::MachineOperandType opTy, 121a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattner Value* V) { 122a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < operands.size()); // may be explicit or implicit op 123a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattner operands[i].opType = opTy; 124c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke operands[i].contents.value = V; 125ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner operands[i].extra.regNum = -1; 12670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 12770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 12870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 129572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris LattnerMachineInstr::SetMachineOperandConst(unsigned i, 13021326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke MachineOperand::MachineOperandType opTy, 131561c0107b20e9be4a02bad57a68ae9e4f96461a9Chris Lattner int intValue) { 132a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < getNumOperands()); // must be explicit op 1332a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner assert(TargetInstrDescriptors[Opcode].resultPos != (int) i && 134c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve "immed. constant cannot be defined"); 135572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 13621326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke operands[i].opType = opTy; 137c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke operands[i].contents.value = NULL; 138c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke operands[i].contents.immedVal = intValue; 139ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner operands[i].extra.regNum = -1; 140572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].flags = 0; 14170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 14270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 143a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattnervoid MachineInstr::SetMachineOperandReg(unsigned i, int regNum) { 144a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < getNumOperands()); // must be explicit op 145572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 1462f305989b395a0a8bf00c4b9dc140a6df051245eChris Lattner operands[i].opType = MachineOperand::MO_MachineRegister; 147c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke operands[i].contents.value = NULL; 148ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner operands[i].extra.regNum = regNum; 14970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 15070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 15121326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaekevoid MachineInstr::dump() const { 152925b771dc378d6c88da44cd5b6650f2758c3c0a7Chris Lattner std::cerr << " " << *this; 15370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 15470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 15521326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaekestatic inline std::ostream& OutputValue(std::ostream &os, const Value* val) { 15693240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve os << "(val "; 157ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman os << (void*) val; // print address always 15893240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve if (val && val->hasName()) 159ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman os << " " << val->getName(); // print name also, if available 16021326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke os << ")"; 161627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve return os; 16293240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve} 16393240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve 1642a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattnerstatic inline void OutputReg(std::ostream &os, unsigned RegNo, 1652a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner const MRegisterInfo *MRI = 0) { 166ddcfd9e6fafdbbe5c973477e537119e73c115ee4Alkis Evlogimenos if (!RegNo || MRegisterInfo::isPhysicalRegister(RegNo)) { 1678517e1f0beea9b5e47974f083396d53294c390adChris Lattner if (MRI) 1682a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner os << "%" << MRI->get(RegNo).Name; 1692a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner else 1708517e1f0beea9b5e47974f083396d53294c390adChris Lattner os << "%mreg(" << RegNo << ")"; 1712a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner } else 1728517e1f0beea9b5e47974f083396d53294c390adChris Lattner os << "%reg" << RegNo; 1738c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve} 1748c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve 1751049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattnerstatic void print(const MachineOperand &MO, std::ostream &OS, 176b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner const TargetMachine *TM) { 177ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman const MRegisterInfo *MRI = 0; 178edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 179ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman if (TM) MRI = TM->getRegisterInfo(); 180b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner 1811049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner bool CloseParen = true; 1824d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (MO.isHiBits32()) 1831049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%lm("; 1844d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else if (MO.isLoBits32()) 1851049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%lo("; 1864d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else if (MO.isHiBits64()) 1871049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%hh("; 1884d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else if (MO.isLoBits64()) 1891049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%hm("; 1901049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner else 1911049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner CloseParen = false; 192edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 1931049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner switch (MO.getType()) { 1941049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_VirtualRegister: 1951049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (MO.getVRegValue()) { 1961049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%reg"; 1971049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OutputValue(OS, MO.getVRegValue()); 1981049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (MO.hasAllocatedReg()) 1991049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "=="; 2001049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 2011049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (MO.hasAllocatedReg()) 202be766c72464116a445a02b542a450c4274bab5d0Alkis Evlogimenos OutputReg(OS, MO.getReg(), MRI); 2031049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2041049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_CCRegister: 2051049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%ccreg"; 2061049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OutputValue(OS, MO.getVRegValue()); 2071049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (MO.hasAllocatedReg()) { 2081049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "=="; 209be766c72464116a445a02b542a450c4274bab5d0Alkis Evlogimenos OutputReg(OS, MO.getReg(), MRI); 2101049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 2111049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2121049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_MachineRegister: 2132a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner OutputReg(OS, MO.getMachineRegNum(), MRI); 2141049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2151049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_SignExtendedImmed: 2161049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << (long)MO.getImmedValue(); 2171049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2181049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_UnextendedImmed: 2191049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << (long)MO.getImmedValue(); 2201049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2211049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_PCRelativeDisp: { 2221049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner const Value* opVal = MO.getVRegValue(); 2231049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal); 2241049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%disp(" << (isLabel? "label " : "addr-of-val "); 2251049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (opVal->hasName()) 2261049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << opVal->getName(); 2271049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner else 2281049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << (const void*) opVal; 2291049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << ")"; 2301049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2311049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 2322109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner case MachineOperand::MO_MachineBasicBlock: 233988b7ba5bad830379a7108c1f9ea36fb29073245Brian Gaeke OS << "mbb<" 2342109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName() 235988b7ba5bad830379a7108c1f9ea36fb29073245Brian Gaeke << "," << (void*)MO.getMachineBasicBlock() << ">"; 2362109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner break; 23710cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner case MachineOperand::MO_FrameIndex: 23810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "<fi#" << MO.getFrameIndex() << ">"; 23910cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner break; 2408d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_ConstantPoolIndex: 2418d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<cp#" << MO.getConstantPoolIndex() << ">"; 2428d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 2438d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_GlobalAddress: 244ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner OS << "<ga:" << ((Value*)MO.getGlobal())->getName(); 245ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner if (MO.getOffset()) OS << "+" << MO.getOffset(); 246ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner OS << ">"; 2478d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 2488d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_ExternalSymbol: 249ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner OS << "<es:" << MO.getSymbolName(); 250ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner if (MO.getOffset()) OS << "+" << MO.getOffset(); 251ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner OS << ">"; 2528d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 2531049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner default: 2541049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner assert(0 && "Unrecognized operand type"); 2551049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 2561049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 2571049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (CloseParen) 2581049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << ")"; 2591049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner} 2601049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 261b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattnervoid MachineInstr::print(std::ostream &OS, const TargetMachine *TM) const { 2626a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner unsigned StartOp = 0; 2636a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner 2646a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner // Specialize printing if op#0 is definition 2654d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (getNumOperands() && getOperand(0).isDef() && !getOperand(0).isUse()) { 2660742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner ::print(getOperand(0), OS, TM); 2676a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << " = "; 2686a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner ++StartOp; // Don't print this operand again! 2696a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner } 270b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner 271ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman // Must check if Target machine is not null because machine BB could not 272ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman // be attached to a Machine function yet 273ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman if (TM) 274b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner OS << TM->getInstrInfo()->getName(getOpcode()); 275edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 2766a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) { 2775f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve const MachineOperand& mop = getOperand(i); 2786a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner if (i != StartOp) 2796a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << ","; 2806a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << " "; 2810742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner ::print(mop, OS, TM); 282edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 2834d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (mop.isDef()) 2844d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (mop.isUse()) 2854d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos OS << "<def&use>"; 2864d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else 2874d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos OS << "<def>"; 2881049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 289edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 2901049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "\n"; 2911049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner} 2921049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 29311d1f21e1d400826ccc3cae5702d6a626baa906bChris Lattnernamespace llvm { 2948517e1f0beea9b5e47974f083396d53294c390adChris Lattnerstd::ostream &operator<<(std::ostream &os, const MachineInstr &MI) { 2958517e1f0beea9b5e47974f083396d53294c390adChris Lattner // If the instruction is embedded into a basic block, we can find the target 2968517e1f0beea9b5e47974f083396d53294c390adChris Lattner // info for the instruction. 2978517e1f0beea9b5e47974f083396d53294c390adChris Lattner if (const MachineBasicBlock *MBB = MI.getParent()) { 2988517e1f0beea9b5e47974f083396d53294c390adChris Lattner const MachineFunction *MF = MBB->getParent(); 299ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman if (MF) 300b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner MI.print(os, &MF->getTarget()); 301b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner else 302b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner MI.print(os, 0); 3038517e1f0beea9b5e47974f083396d53294c390adChris Lattner return os; 3048517e1f0beea9b5e47974f083396d53294c390adChris Lattner } 3058517e1f0beea9b5e47974f083396d53294c390adChris Lattner 3068517e1f0beea9b5e47974f083396d53294c390adChris Lattner // Otherwise, print it out in the "raw" format without symbolic register names 3078517e1f0beea9b5e47974f083396d53294c390adChris Lattner // and such. 3082a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner os << TargetInstrDescriptors[MI.getOpcode()].Name; 309edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 310ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman for (unsigned i = 0, N = MI.getNumOperands(); i < N; i++) { 3118d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner os << "\t" << MI.getOperand(i); 3124d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (MI.getOperand(i).isDef()) 3134d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (MI.getOperand(i).isUse()) 3144d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos os << "<d&u>"; 3154d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else 3164d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos os << "<d>"; 3178d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka } 318edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 319697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner return os << "\n"; 32070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 32170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 32221326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaekestd::ostream &operator<<(std::ostream &OS, const MachineOperand &MO) { 3234d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (MO.isHiBits32()) 32410cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%lm("; 3254d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else if (MO.isLoBits32()) 32610cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%lo("; 3274d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else if (MO.isHiBits64()) 32810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%hh("; 3294d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else if (MO.isLoBits64()) 33010cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%hm("; 331edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 332ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman switch (MO.getType()) { 333ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman case MachineOperand::MO_VirtualRegister: 334ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman if (MO.hasAllocatedReg()) 335ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OutputReg(OS, MO.getReg()); 336ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman 337ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman if (MO.getVRegValue()) { 338ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman if (MO.hasAllocatedReg()) OS << "=="; 339ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << "%vreg"; 34010cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OutputValue(OS, MO.getVRegValue()); 3416e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve } 342ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 343ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman case MachineOperand::MO_CCRegister: 344ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << "%ccreg"; 345ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OutputValue(OS, MO.getVRegValue()); 346ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman if (MO.hasAllocatedReg()) { 347ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << "=="; 348ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OutputReg(OS, MO.getReg()); 349ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman } 350ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 351ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman case MachineOperand::MO_MachineRegister: 352ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OutputReg(OS, MO.getMachineRegNum()); 353ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 354ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman case MachineOperand::MO_SignExtendedImmed: 355ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << (long)MO.getImmedValue(); 356ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 357ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman case MachineOperand::MO_UnextendedImmed: 358ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << (long)MO.getImmedValue(); 359ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 360ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman case MachineOperand::MO_PCRelativeDisp: { 361ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman const Value* opVal = MO.getVRegValue(); 362ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal); 363ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << "%disp(" << (isLabel? "label " : "addr-of-val "); 364ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman if (opVal->hasName()) 365ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << opVal->getName(); 366ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman else 367ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << (const void*) opVal; 368ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << ")"; 369ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 370ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman } 371ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman case MachineOperand::MO_MachineBasicBlock: 372ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << "<mbb:" 373ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName() 374ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman << "@" << (void*)MO.getMachineBasicBlock() << ">"; 375ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 376ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman case MachineOperand::MO_FrameIndex: 377ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << "<fi#" << MO.getFrameIndex() << ">"; 378ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 379ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman case MachineOperand::MO_ConstantPoolIndex: 380ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << "<cp#" << MO.getConstantPoolIndex() << ">"; 381ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 382ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman case MachineOperand::MO_GlobalAddress: 383ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">"; 384ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 385ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman case MachineOperand::MO_ExternalSymbol: 386ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << "<es:" << MO.getSymbolName() << ">"; 387ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 388ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman default: 389ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman assert(0 && "Unrecognized operand type"); 390ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 391ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman } 392edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 3930742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner if (MO.isHiBits32() || MO.isLoBits32() || MO.isHiBits64() || MO.isLoBits64()) 39410cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << ")"; 395edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 39610cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner return OS; 39770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 398d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 39911d1f21e1d400826ccc3cae5702d6a626baa906bChris Lattner} 400