MachineInstr.cpp revision 8517e1f0beea9b5e47974f083396d53294c390ad
1035dfbe7f2d109008d2d62d9f2a67efb477a7ab6Chris Lattner//===-- MachineInstr.cpp --------------------------------------------------===// 270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve// 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. 7b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 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" 23aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos#include "Support/LeakDetector.h" 248d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner 25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 26d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 27f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// Global variable holding an array of descriptors for machine instructions. 28f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// The actual object needs to be created separately for each target machine. 293501feab811c86c9659248a4875fc31a3165f84dChris Lattner// This variable is initialized and reset by class TargetInstrInfo. 30f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// 31f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// FIXME: This should be a property of the target so that more than one target 32f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// at a time can be active... 33f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// 343501feab811c86c9659248a4875fc31a3165f84dChris Lattnerextern const TargetInstrDescriptor *TargetInstrDescriptors; 3569917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka 361885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve// Constructor for instructions with variable #operands 37ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis EvlogimenosMachineInstr::MachineInstr(short opcode, unsigned numOperands) 38ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis Evlogimenos : Opcode(opcode), 39ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis Evlogimenos numImplicitRefs(0), 40ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis Evlogimenos operands(numOperands, MachineOperand()), 41ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis Evlogimenos parent(0) { 42aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos // Make sure that we get added to a machine basicblock 43aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos LeakDetector::addGarbageObject(this); 44413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner} 45413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner 46ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - This constructor only does a _reserve_ of the operands, 47ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// not a resize for them. It is expected that if you use this that you call 48ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// add* methods below to fill up the operands, instead of the Set methods. 49ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// Eventually, the "resizing" ctors will be phased out. 50ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// 5121326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian GaekeMachineInstr::MachineInstr(short opcode, unsigned numOperands, bool XX, bool YY) 5221326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke : Opcode(opcode), numImplicitRefs(0), parent(0) { 537279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner operands.reserve(numOperands); 54aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos // Make sure that we get added to a machine basicblock 55aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos LeakDetector::addGarbageObject(this); 567279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner} 577279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner 58ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - Work exactly the same as the ctor above, except that the 59ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr is created and added to the end of the specified basic block. 60ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// 61ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis EvlogimenosMachineInstr::MachineInstr(MachineBasicBlock *MBB, short opcode, 62ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner unsigned numOperands) 6321326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke : Opcode(opcode), numImplicitRefs(0), parent(0) { 64ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner assert(MBB && "Cannot use inserting ctor with null basic block!"); 65ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner operands.reserve(numOperands); 66aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos // Make sure that we get added to a machine basicblock 67aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos LeakDetector::addGarbageObject(this); 68ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner MBB->push_back(this); // Add instruction to end of basic block! 69ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner} 70ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner 71aad5c0505183a5b7913f1a443a1f0650122551ccAlkis EvlogimenosMachineInstr::~MachineInstr() 72aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos{ 73aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos LeakDetector::removeGarbageObject(this); 74aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos} 75aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos 7621326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// OperandComplete - Return true if it's illegal to add a new operand 7721326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// 782a90ba60175f93e7438165d8423100aa573c16c5Chris Lattnerbool MachineInstr::OperandsComplete() const { 792a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner int NumOperands = TargetInstrDescriptors[Opcode].numOperands; 80a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve if (NumOperands >= 0 && getNumOperands() >= (unsigned)NumOperands) 813497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve return true; // Broken: we have all the operands of this instruction! 82413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner return false; 8370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 8470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 8521326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// replace - Support for replacing opcode and operands of a MachineInstr in 8621326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// place. This only resets the size of the operand vector and initializes it. 8721326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// The new operands must be set explicitly later. 8821326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// 89ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis Evlogimenosvoid MachineInstr::replace(short opcode, unsigned numOperands) { 90a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(getNumImplicitRefs() == 0 && 91a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve "This is probably broken because implicit refs are going to be lost."); 922a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner Opcode = opcode; 93e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve operands.clear(); 94413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner operands.resize(numOperands, MachineOperand()); 95e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve} 96e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve 97a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattnervoid MachineInstr::SetMachineOperandVal(unsigned i, 98a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattner MachineOperand::MachineOperandType opTy, 99a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattner Value* V) { 100a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < operands.size()); // may be explicit or implicit op 101a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattner operands[i].opType = opTy; 102572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].value = V; 103572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].regNum = -1; 10470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 10570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 10670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 107572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris LattnerMachineInstr::SetMachineOperandConst(unsigned i, 10821326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke MachineOperand::MachineOperandType opTy, 1092a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner int64_t intValue) { 110a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < getNumOperands()); // must be explicit op 1112a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner assert(TargetInstrDescriptors[Opcode].resultPos != (int) i && 112c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve "immed. constant cannot be defined"); 113572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 11421326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke operands[i].opType = opTy; 115572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].value = NULL; 116572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].immedVal = intValue; 117572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].regNum = -1; 118572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].flags = 0; 11970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 12070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 121a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattnervoid MachineInstr::SetMachineOperandReg(unsigned i, int regNum) { 122a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < getNumOperands()); // must be explicit op 123572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 1242f305989b395a0a8bf00c4b9dc140a6df051245eChris Lattner operands[i].opType = MachineOperand::MO_MachineRegister; 125572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].value = NULL; 126572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].regNum = regNum; 12770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 12870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 12921326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke// Used only by the SPARC back-end. 1302a90ba60175f93e7438165d8423100aa573c16c5Chris Lattnervoid MachineInstr::SetRegForOperand(unsigned i, int regNum) { 131a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < getNumOperands()); // must be explicit op 1327a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve operands[i].setRegForValue(regNum); 1337a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve} 1347a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve 13521326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke// Used only by the SPARC back-end. 1362a90ba60175f93e7438165d8423100aa573c16c5Chris Lattnervoid MachineInstr::SetRegForImplicitRef(unsigned i, int regNum) { 1373497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve getImplicitOp(i).setRegForValue(regNum); 1383497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve} 1393497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve 14021326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// substituteValue - Substitute all occurrences of Value* oldVal with newVal 14121326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// in all operands and all implicit refs. If defsOnly == true, substitute defs 14221326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// only. 14321326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// 14421326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// FIXME: Fold this into its single caller, at SparcInstrSelection.cpp:2865, 14521326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// or make it a static function in that file. 14621326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// 147e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adveunsigned 148627eb31cd791f808eaa048478d01222577a30a1aVikram S. AdveMachineInstr::substituteValue(const Value* oldVal, Value* newVal, 149627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve bool defsOnly, bool notDefsAndUses, 150627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve bool& someArgsWereIgnored) 151e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve{ 1522010f7baec18914b8a5d1b2b4c3c21511fa6e25dVikram S. Adve assert((!defsOnly || !notDefsAndUses) && 1532010f7baec18914b8a5d1b2b4c3c21511fa6e25dVikram S. Adve "notDefsAndUses is irrelevant if defsOnly == true."); 154627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve 155e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve unsigned numSubst = 0; 156e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 1576eba07a6a3dacec09aefa54a305b06c98b0c86c1Misha Brukman // Substitute operands 158e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve for (MachineInstr::val_op_iterator O = begin(), E = end(); O != E; ++O) 159e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve if (*O == oldVal) 160627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve if (!defsOnly || 1614d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos notDefsAndUses && (O.isDef() && !O.isUse()) || 1624d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos !notDefsAndUses && O.isDef()) 163e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve { 164e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve O.getMachineOperand().value = newVal; 165e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve ++numSubst; 166e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve } 167627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve else 168627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve someArgsWereIgnored = true; 169e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 1706eba07a6a3dacec09aefa54a305b06c98b0c86c1Misha Brukman // Substitute implicit refs 171a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve for (unsigned i=0, N=getNumImplicitRefs(); i < N; ++i) 17227a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner if (getImplicitRef(i) == oldVal) 173627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve if (!defsOnly || 1744d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos notDefsAndUses && (getImplicitOp(i).isDef() && !getImplicitOp(i).isUse()) || 1754d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos !notDefsAndUses && getImplicitOp(i).isDef()) 176e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve { 177a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve getImplicitOp(i).value = newVal; 178e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve ++numSubst; 179e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve } 180627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve else 181627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve someArgsWereIgnored = true; 182e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 183e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve return numSubst; 184e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve} 185e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 18621326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaekevoid MachineInstr::dump() const { 187925b771dc378d6c88da44cd5b6650f2758c3c0a7Chris Lattner std::cerr << " " << *this; 18870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 18970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 19021326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaekestatic inline std::ostream& OutputValue(std::ostream &os, const Value* val) { 19193240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve os << "(val "; 192627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve os << (void*) val; // print address always 19393240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve if (val && val->hasName()) 19421326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke os << " " << val->getName(); // print name also, if available 19521326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke os << ")"; 196627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve return os; 19793240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve} 19893240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve 1992a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattnerstatic inline void OutputReg(std::ostream &os, unsigned RegNo, 2002a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner const MRegisterInfo *MRI = 0) { 2018517e1f0beea9b5e47974f083396d53294c390adChris Lattner if (MRegisterInfo::isPhysicalRegister(RegNo)) { 2028517e1f0beea9b5e47974f083396d53294c390adChris Lattner if (MRI) 2032a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner os << "%" << MRI->get(RegNo).Name; 2042a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner else 2058517e1f0beea9b5e47974f083396d53294c390adChris Lattner os << "%mreg(" << RegNo << ")"; 2062a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner } else 2078517e1f0beea9b5e47974f083396d53294c390adChris Lattner os << "%reg" << RegNo; 2088c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve} 2098c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve 2101049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattnerstatic void print(const MachineOperand &MO, std::ostream &OS, 2111049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner const TargetMachine &TM) { 2122a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner const MRegisterInfo *MRI = TM.getRegisterInfo(); 2131049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner bool CloseParen = true; 2144d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (MO.isHiBits32()) 2151049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%lm("; 2164d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else if (MO.isLoBits32()) 2171049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%lo("; 2184d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else if (MO.isHiBits64()) 2191049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%hh("; 2204d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else if (MO.isLoBits64()) 2211049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%hm("; 2221049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner else 2231049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner CloseParen = false; 2241049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 2251049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner switch (MO.getType()) { 2261049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_VirtualRegister: 2271049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (MO.getVRegValue()) { 2281049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%reg"; 2291049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OutputValue(OS, MO.getVRegValue()); 2301049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (MO.hasAllocatedReg()) 2311049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "=="; 2321049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 2331049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (MO.hasAllocatedReg()) 234be766c72464116a445a02b542a450c4274bab5d0Alkis Evlogimenos OutputReg(OS, MO.getReg(), MRI); 2351049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2361049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_CCRegister: 2371049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%ccreg"; 2381049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OutputValue(OS, MO.getVRegValue()); 2391049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (MO.hasAllocatedReg()) { 2401049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "=="; 241be766c72464116a445a02b542a450c4274bab5d0Alkis Evlogimenos OutputReg(OS, MO.getReg(), MRI); 2421049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 2431049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2441049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_MachineRegister: 2452a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner OutputReg(OS, MO.getMachineRegNum(), MRI); 2461049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2471049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_SignExtendedImmed: 2481049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << (long)MO.getImmedValue(); 2491049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2501049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_UnextendedImmed: 2511049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << (long)MO.getImmedValue(); 2521049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2531049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_PCRelativeDisp: { 2541049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner const Value* opVal = MO.getVRegValue(); 2551049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal); 2561049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%disp(" << (isLabel? "label " : "addr-of-val "); 2571049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (opVal->hasName()) 2581049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << opVal->getName(); 2591049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner else 2601049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << (const void*) opVal; 2611049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << ")"; 2621049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2631049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 2642109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner case MachineOperand::MO_MachineBasicBlock: 2652109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner OS << "bb<" 2662109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName() 2672109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner << "," << (void*)MO.getMachineBasicBlock()->getBasicBlock() << ">"; 2682109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner break; 26910cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner case MachineOperand::MO_FrameIndex: 27010cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "<fi#" << MO.getFrameIndex() << ">"; 27110cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner break; 2728d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_ConstantPoolIndex: 2738d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<cp#" << MO.getConstantPoolIndex() << ">"; 2748d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 2758d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_GlobalAddress: 2768d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">"; 2778d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 2788d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_ExternalSymbol: 2798d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<es:" << MO.getSymbolName() << ">"; 2808d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 2811049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner default: 2821049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner assert(0 && "Unrecognized operand type"); 2831049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 2841049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 2851049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (CloseParen) 2861049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << ")"; 2871049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner} 2881049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 289af55be15dfa5321f470ce9734fabd858f5af7a88Chris Lattnervoid MachineInstr::print(std::ostream &OS, const TargetMachine &TM) const { 2906a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner unsigned StartOp = 0; 2916a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner 2926a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner // Specialize printing if op#0 is definition 2934d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (getNumOperands() && getOperand(0).isDef() && !getOperand(0).isUse()) { 294d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke llvm::print(getOperand(0), OS, TM); 2956a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << " = "; 2966a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner ++StartOp; // Don't print this operand again! 2976a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner } 2981049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << TM.getInstrInfo().getName(getOpcode()); 2996a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner 3006a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) { 3015f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve const MachineOperand& mop = getOperand(i); 3026a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner if (i != StartOp) 3036a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << ","; 3046a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << " "; 305d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke llvm::print(mop, OS, TM); 3066a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner 3074d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (mop.isDef()) 3084d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (mop.isUse()) 3094d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos OS << "<def&use>"; 3104d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else 3114d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos OS << "<def>"; 3121049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 3136a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner 3146eba07a6a3dacec09aefa54a305b06c98b0c86c1Misha Brukman // code for printing implicit references 3151049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (getNumImplicitRefs()) { 3161049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "\tImplicitRefs: "; 3171049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner for(unsigned i = 0, e = getNumImplicitRefs(); i != e; ++i) { 3181049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "\t"; 3195f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve OutputValue(OS, getImplicitRef(i)); 3204d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (getImplicitOp(i).isDef()) 3214d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (getImplicitOp(i).isUse()) 3224d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos OS << "<def&use>"; 3234d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else 3244d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos OS << "<def>"; 3251049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 3261049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 3271049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 3281049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "\n"; 3291049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner} 3301049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 3318517e1f0beea9b5e47974f083396d53294c390adChris Lattnerstd::ostream &operator<<(std::ostream &os, const MachineInstr &MI) { 3328517e1f0beea9b5e47974f083396d53294c390adChris Lattner // If the instruction is embedded into a basic block, we can find the target 3338517e1f0beea9b5e47974f083396d53294c390adChris Lattner // info for the instruction. 3348517e1f0beea9b5e47974f083396d53294c390adChris Lattner if (const MachineBasicBlock *MBB = MI.getParent()) { 3358517e1f0beea9b5e47974f083396d53294c390adChris Lattner const MachineFunction *MF = MBB->getParent(); 3368517e1f0beea9b5e47974f083396d53294c390adChris Lattner MI.print(os, MF->getTarget()); 3378517e1f0beea9b5e47974f083396d53294c390adChris Lattner return os; 3388517e1f0beea9b5e47974f083396d53294c390adChris Lattner } 3398517e1f0beea9b5e47974f083396d53294c390adChris Lattner 3408517e1f0beea9b5e47974f083396d53294c390adChris Lattner // Otherwise, print it out in the "raw" format without symbolic register names 3418517e1f0beea9b5e47974f083396d53294c390adChris Lattner // and such. 3422a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner os << TargetInstrDescriptors[MI.getOpcode()].Name; 34370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 3448d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner for (unsigned i=0, N=MI.getNumOperands(); i < N; i++) { 3458d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner os << "\t" << MI.getOperand(i); 3464d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (MI.getOperand(i).isDef()) 3474d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (MI.getOperand(i).isUse()) 3484d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos os << "<d&u>"; 3494d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else 3504d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos os << "<d>"; 3518d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka } 35270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 3536eba07a6a3dacec09aefa54a305b06c98b0c86c1Misha Brukman // code for printing implicit references 3548d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner unsigned NumOfImpRefs = MI.getNumImplicitRefs(); 3558d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner if (NumOfImpRefs > 0) { 35693240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve os << "\tImplicit: "; 3578d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner for (unsigned z=0; z < NumOfImpRefs; z++) { 3588d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OutputValue(os, MI.getImplicitRef(z)); 3594d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (MI.getImplicitOp(z).isDef()) 3604d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (MI.getImplicitOp(z).isUse()) 3614d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos os << "<d&u>"; 3624d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else 3634d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos os << "<d>"; 36407c7086bd29b5c7223945cbdeae48494874de38fRuchira Sasanka os << "\t"; 36569917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka } 36669917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka } 36793240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve 368697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner return os << "\n"; 36970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 37070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 37121326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaekestd::ostream &operator<<(std::ostream &OS, const MachineOperand &MO) { 3724d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (MO.isHiBits32()) 37310cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%lm("; 3744d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else if (MO.isLoBits32()) 37510cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%lo("; 3764d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else if (MO.isHiBits64()) 37710cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%hh("; 3784d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else if (MO.isLoBits64()) 37910cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%hm("; 3803bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve 3812109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner switch (MO.getType()) 3826e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve { 3836e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_VirtualRegister: 3848d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner if (MO.hasAllocatedReg()) 385be766c72464116a445a02b542a450c4274bab5d0Alkis Evlogimenos OutputReg(OS, MO.getReg()); 3868d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner 3878d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner if (MO.getVRegValue()) { 3888d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner if (MO.hasAllocatedReg()) OS << "=="; 3898d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "%vreg"; 3908d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OutputValue(OS, MO.getVRegValue()); 3911049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 3923bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 3936e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_CCRegister: 39410cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%ccreg"; 39510cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OutputValue(OS, MO.getVRegValue()); 3962109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner if (MO.hasAllocatedReg()) { 39710cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "=="; 398be766c72464116a445a02b542a450c4274bab5d0Alkis Evlogimenos OutputReg(OS, MO.getReg()); 3991049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 4003bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 4013bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve case MachineOperand::MO_MachineRegister: 40210cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OutputReg(OS, MO.getMachineRegNum()); 4033bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 4046e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_SignExtendedImmed: 40510cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << (long)MO.getImmedValue(); 4063bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 4076e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_UnextendedImmed: 40810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << (long)MO.getImmedValue(); 4093bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 4106e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_PCRelativeDisp: 411e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve { 4122109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner const Value* opVal = MO.getVRegValue(); 4134d669b510c1d609c6b3fe98ac14ae38bd7c011f6Chris Lattner bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal); 41410cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%disp(" << (isLabel? "label " : "addr-of-val "); 415d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve if (opVal->hasName()) 41610cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << opVal->getName(); 417d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve else 41810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << (const void*) opVal; 41910cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << ")"; 4203bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 421e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve } 4222109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner case MachineOperand::MO_MachineBasicBlock: 42310cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "bb<" 4242109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName() 4252109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner << "," << (void*)MO.getMachineBasicBlock()->getBasicBlock() << ">"; 4262109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner break; 42710cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner case MachineOperand::MO_FrameIndex: 42810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "<fi#" << MO.getFrameIndex() << ">"; 42910cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner break; 4308d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_ConstantPoolIndex: 4318d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<cp#" << MO.getConstantPoolIndex() << ">"; 4328d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 4338d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_GlobalAddress: 4348d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">"; 4358d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 4368d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_ExternalSymbol: 4378d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<es:" << MO.getSymbolName() << ">"; 4388d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 4396e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve default: 4406e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve assert(0 && "Unrecognized operand type"); 4416e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve break; 4426e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve } 443e6fdb11e1ae823d69e646e76828ccb5d427a9d3aChris Lattner 4442109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner if (MO.flags & 4453bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve (MachineOperand::HIFLAG32 | MachineOperand::LOFLAG32 | 4463bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve MachineOperand::HIFLAG64 | MachineOperand::LOFLAG64)) 44710cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << ")"; 4483bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve 44910cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner return OS; 45070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 451d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 452d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 453