MachineInstr.cpp revision 943b5e117fe9a087f9aa529a2632c2d32cc22374
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 39ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - This constructor only does a _reserve_ of the operands, 40ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// not a resize for them. It is expected that if you use this that you call 41ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// add* methods below to fill up the operands, instead of the Set methods. 42ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// Eventually, the "resizing" ctors will be phased out. 43ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// 448b915b4ed2c6e43413937ac71c0cbcf476ad1a98Chris LattnerMachineInstr::MachineInstr(short opcode, unsigned numOperands) 4502e5f8dcda4319e05fe49301ab72c386ed859e16Chris Lattner : Opcode(opcode), parent(0) { 46943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner Operands.reserve(numOperands); 47aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos // Make sure that we get added to a machine basicblock 48aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos LeakDetector::addGarbageObject(this); 497279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner} 507279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner 51ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - Work exactly the same as the ctor above, except that the 52ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr is created and added to the end of the specified basic block. 53ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// 54ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis EvlogimenosMachineInstr::MachineInstr(MachineBasicBlock *MBB, short opcode, 55ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner unsigned numOperands) 5602e5f8dcda4319e05fe49301ab72c386ed859e16Chris Lattner : Opcode(opcode), parent(0) { 57ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner assert(MBB && "Cannot use inserting ctor with null basic block!"); 58943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner Operands.reserve(numOperands); 59aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos // Make sure that we get added to a machine basicblock 60aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos LeakDetector::addGarbageObject(this); 61ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner MBB->push_back(this); // Add instruction to end of basic block! 62ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner} 63ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner 64ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman/// MachineInstr ctor - Copies MachineInstr arg exactly 65ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman/// 66466b534a570f574ed485d875bbca8454f68dcb52Tanya LattnerMachineInstr::MachineInstr(const MachineInstr &MI) { 67466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner Opcode = MI.getOpcode(); 68943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner Operands.reserve(MI.getNumOperands()); 69b5159ed0cb7943e5938782f7693beb18342165ceTanya Lattner 70ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman // Add operands 71943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner for (unsigned i = 0; i != MI.getNumOperands(); ++i) 72943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner Operands.push_back(MI.getOperand(i)); 730c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner 74ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman // Set parent, next, and prev to null 750c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner parent = 0; 760c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner prev = 0; 770c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner next = 0; 78466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner} 79466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner 80466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner 81ce22e76996d3ff0930716fa60c29df60a7e0481bMisha BrukmanMachineInstr::~MachineInstr() { 82aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos LeakDetector::removeGarbageObject(this); 83aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos} 84aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos 8548d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner/// removeFromParent - This method unlinks 'this' from the containing basic 8648d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner/// block, and returns it, but does not delete it. 8748d7c069c76882475c23de153bda9483cd3c9bb4Chris LattnerMachineInstr *MachineInstr::removeFromParent() { 8848d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner assert(getParent() && "Not embedded in a basic block!"); 8948d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner getParent()->remove(this); 9048d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner return this; 9148d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner} 9248d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner 9348d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner 9421326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// OperandComplete - Return true if it's illegal to add a new operand 9521326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// 962a90ba60175f93e7438165d8423100aa573c16c5Chris Lattnerbool MachineInstr::OperandsComplete() const { 972a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner int NumOperands = TargetInstrDescriptors[Opcode].numOperands; 98a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve if (NumOperands >= 0 && getNumOperands() >= (unsigned)NumOperands) 993497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve return true; // Broken: we have all the operands of this instruction! 100413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner return false; 10170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 10270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 10321326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaekevoid MachineInstr::dump() const { 104925b771dc378d6c88da44cd5b6650f2758c3c0a7Chris Lattner std::cerr << " " << *this; 10570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 10670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 1072a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattnerstatic inline void OutputReg(std::ostream &os, unsigned RegNo, 1082a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner const MRegisterInfo *MRI = 0) { 109ddcfd9e6fafdbbe5c973477e537119e73c115ee4Alkis Evlogimenos if (!RegNo || MRegisterInfo::isPhysicalRegister(RegNo)) { 1108517e1f0beea9b5e47974f083396d53294c390adChris Lattner if (MRI) 1112a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner os << "%" << MRI->get(RegNo).Name; 1122a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner else 1138517e1f0beea9b5e47974f083396d53294c390adChris Lattner os << "%mreg(" << RegNo << ")"; 1142a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner } else 1158517e1f0beea9b5e47974f083396d53294c390adChris Lattner os << "%reg" << RegNo; 1168c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve} 1178c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve 1181049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattnerstatic void print(const MachineOperand &MO, std::ostream &OS, 119b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner const TargetMachine *TM) { 120ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman const MRegisterInfo *MRI = 0; 121edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 122ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman if (TM) MRI = TM->getRegisterInfo(); 123b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner 1241049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner switch (MO.getType()) { 1252d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner case MachineOperand::MO_Register: 1264efeab208cf0fe7ae2f68bcdd1264a8fdb18826cChris Lattner OutputReg(OS, MO.getReg(), MRI); 1271049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 12863b3d7113d93fda622c4954c6b1d046ce029044eChris Lattner case MachineOperand::MO_Immediate: 1291049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << (long)MO.getImmedValue(); 1301049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 1312109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner case MachineOperand::MO_MachineBasicBlock: 132988b7ba5bad830379a7108c1f9ea36fb29073245Brian Gaeke OS << "mbb<" 1332109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName() 134988b7ba5bad830379a7108c1f9ea36fb29073245Brian Gaeke << "," << (void*)MO.getMachineBasicBlock() << ">"; 1352109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner break; 13610cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner case MachineOperand::MO_FrameIndex: 13710cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "<fi#" << MO.getFrameIndex() << ">"; 13810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner break; 1398d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_ConstantPoolIndex: 1408d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<cp#" << MO.getConstantPoolIndex() << ">"; 1418d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 14237efe6764568a3829fee26aba532283131d1a104Nate Begeman case MachineOperand::MO_JumpTableIndex: 14337efe6764568a3829fee26aba532283131d1a104Nate Begeman OS << "<jt#" << MO.getJumpTableIndex() << ">"; 14437efe6764568a3829fee26aba532283131d1a104Nate Begeman break; 1458d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_GlobalAddress: 146ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner OS << "<ga:" << ((Value*)MO.getGlobal())->getName(); 147ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner if (MO.getOffset()) OS << "+" << MO.getOffset(); 148ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner OS << ">"; 1498d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 1508d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_ExternalSymbol: 151ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner OS << "<es:" << MO.getSymbolName(); 152ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner if (MO.getOffset()) OS << "+" << MO.getOffset(); 153ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner OS << ">"; 1548d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 1551049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner default: 1561049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner assert(0 && "Unrecognized operand type"); 1571049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 1581049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner} 1591049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 160b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattnervoid MachineInstr::print(std::ostream &OS, const TargetMachine *TM) const { 1616a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner unsigned StartOp = 0; 1626a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner 1636a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner // Specialize printing if op#0 is definition 1644d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (getNumOperands() && getOperand(0).isDef() && !getOperand(0).isUse()) { 1650742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner ::print(getOperand(0), OS, TM); 1666a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << " = "; 1676a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner ++StartOp; // Don't print this operand again! 1686a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner } 169b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner 170ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman // Must check if Target machine is not null because machine BB could not 171ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman // be attached to a Machine function yet 172ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman if (TM) 173b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner OS << TM->getInstrInfo()->getName(getOpcode()); 174edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 1756a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) { 1765f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve const MachineOperand& mop = getOperand(i); 1776a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner if (i != StartOp) 1786a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << ","; 1796a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << " "; 1800742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner ::print(mop, OS, TM); 181edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 1824d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (mop.isDef()) 1834d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (mop.isUse()) 1844d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos OS << "<def&use>"; 1854d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else 1864d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos OS << "<def>"; 1871049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 188edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 1891049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "\n"; 1901049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner} 1911049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 19234fb2cad46adb39f3c2cc705fbbf439a383d0f65Chris Lattnerstd::ostream &llvm::operator<<(std::ostream &os, const MachineInstr &MI) { 1938517e1f0beea9b5e47974f083396d53294c390adChris Lattner // If the instruction is embedded into a basic block, we can find the target 1948517e1f0beea9b5e47974f083396d53294c390adChris Lattner // info for the instruction. 1958517e1f0beea9b5e47974f083396d53294c390adChris Lattner if (const MachineBasicBlock *MBB = MI.getParent()) { 1968517e1f0beea9b5e47974f083396d53294c390adChris Lattner const MachineFunction *MF = MBB->getParent(); 197ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman if (MF) 198b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner MI.print(os, &MF->getTarget()); 199b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner else 200b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner MI.print(os, 0); 2018517e1f0beea9b5e47974f083396d53294c390adChris Lattner return os; 2028517e1f0beea9b5e47974f083396d53294c390adChris Lattner } 2038517e1f0beea9b5e47974f083396d53294c390adChris Lattner 2048517e1f0beea9b5e47974f083396d53294c390adChris Lattner // Otherwise, print it out in the "raw" format without symbolic register names 2058517e1f0beea9b5e47974f083396d53294c390adChris Lattner // and such. 2062a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner os << TargetInstrDescriptors[MI.getOpcode()].Name; 207edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 208ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman for (unsigned i = 0, N = MI.getNumOperands(); i < N; i++) { 2098d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner os << "\t" << MI.getOperand(i); 2104d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (MI.getOperand(i).isDef()) 2114d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (MI.getOperand(i).isUse()) 2124d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos os << "<d&u>"; 2134d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else 2144d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos os << "<d>"; 2158d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka } 216edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 217697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner return os << "\n"; 21870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 21970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 22034fb2cad46adb39f3c2cc705fbbf439a383d0f65Chris Lattnerstd::ostream &llvm::operator<<(std::ostream &OS, const MachineOperand &MO) { 221ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman switch (MO.getType()) { 2222d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner case MachineOperand::MO_Register: 2234efeab208cf0fe7ae2f68bcdd1264a8fdb18826cChris Lattner OutputReg(OS, MO.getReg()); 224ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 22563b3d7113d93fda622c4954c6b1d046ce029044eChris Lattner case MachineOperand::MO_Immediate: 226ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << (long)MO.getImmedValue(); 227ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 228ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman case MachineOperand::MO_MachineBasicBlock: 229ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << "<mbb:" 230ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName() 231ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman << "@" << (void*)MO.getMachineBasicBlock() << ">"; 232ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 233ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman case MachineOperand::MO_FrameIndex: 234ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << "<fi#" << MO.getFrameIndex() << ">"; 235ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 236ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman case MachineOperand::MO_ConstantPoolIndex: 237ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << "<cp#" << MO.getConstantPoolIndex() << ">"; 238ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 23937efe6764568a3829fee26aba532283131d1a104Nate Begeman case MachineOperand::MO_JumpTableIndex: 24037efe6764568a3829fee26aba532283131d1a104Nate Begeman OS << "<jt#" << MO.getJumpTableIndex() << ">"; 24137efe6764568a3829fee26aba532283131d1a104Nate Begeman break; 242ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman case MachineOperand::MO_GlobalAddress: 243ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">"; 244ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 245ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman case MachineOperand::MO_ExternalSymbol: 246ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << "<es:" << MO.getSymbolName() << ">"; 247ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 248ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman default: 249ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman assert(0 && "Unrecognized operand type"); 250ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 251ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman } 252edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 25310cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner return OS; 25470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 255