MachineInstr.cpp revision 627eb31cd791f808eaa048478d01222577a30a1a
1035dfbe7f2d109008d2d62d9f2a67efb477a7ab6Chris Lattner//===-- MachineInstr.cpp --------------------------------------------------===// 270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve// 3035dfbe7f2d109008d2d62d9f2a67efb477a7ab6Chris Lattner//===----------------------------------------------------------------------===// 470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 5822b4fb896846b87dd11a330ae13f2239329aeefChris Lattner#include "llvm/CodeGen/MachineInstr.h" 6ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner#include "llvm/CodeGen/MachineBasicBlock.h" 73801f6d38371b734d9de2fb8394ca75d2bf190ebChris Lattner#include "llvm/Value.h" 81049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner#include "llvm/Target/TargetMachine.h" 93501feab811c86c9659248a4875fc31a3165f84dChris Lattner#include "llvm/Target/TargetInstrInfo.h" 102a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner#include "llvm/Target/MRegisterInfo.h" 11697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerusing std::cerr; 125b79591450c47920139705712a402251af7eed79Vikram S. Adve 138d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner 14f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// Global variable holding an array of descriptors for machine instructions. 15f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// The actual object needs to be created separately for each target machine. 163501feab811c86c9659248a4875fc31a3165f84dChris Lattner// This variable is initialized and reset by class TargetInstrInfo. 17f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// 18f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// FIXME: This should be a property of the target so that more than one target 19f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// at a time can be active... 20f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// 213501feab811c86c9659248a4875fc31a3165f84dChris Lattnerextern const TargetInstrDescriptor *TargetInstrDescriptors; 2269917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka 231885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve// Constructor for instructions with variable #operands 24b98a53f201fd3652f4b7e37d1f2cb3b9b0775d45Chris LattnerMachineInstr::MachineInstr(MachineOpCode OpCode, unsigned numOperands) 25a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve : opCode(OpCode), 263497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve opCodeFlags(0), 27a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve operands(numOperands, MachineOperand()), 28a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve numImplicitRefs(0) 29a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve{ 30413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner} 31413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner 32ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - This constructor only does a _reserve_ of the operands, 33ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// not a resize for them. It is expected that if you use this that you call 34ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// add* methods below to fill up the operands, instead of the Set methods. 35ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// Eventually, the "resizing" ctors will be phased out. 36ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// 377279122e668816bed0d4f38d3392bbab0140fad0Chris LattnerMachineInstr::MachineInstr(MachineOpCode Opcode, unsigned numOperands, 38a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve bool XX, bool YY) 39a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve : opCode(Opcode), 403497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve opCodeFlags(0), 41a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve numImplicitRefs(0) 42a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve{ 437279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner operands.reserve(numOperands); 447279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner} 457279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner 46ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - Work exactly the same as the ctor above, except that the 47ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr is created and added to the end of the specified basic block. 48ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// 49ddd7fcb887be752ec8167276a697994ad9cb9c4eChris LattnerMachineInstr::MachineInstr(MachineBasicBlock *MBB, MachineOpCode Opcode, 50ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner unsigned numOperands) 51ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner : opCode(Opcode), 523497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve opCodeFlags(0), 53ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner numImplicitRefs(0) 54ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner{ 55ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner assert(MBB && "Cannot use inserting ctor with null basic block!"); 56ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner operands.reserve(numOperands); 57ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner MBB->push_back(this); // Add instruction to end of basic block! 58ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner} 59ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner 60ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner 61413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner// OperandComplete - Return true if it's illegal to add a new operand 62a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Advebool MachineInstr::OperandsComplete() const 63a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve{ 64413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner int NumOperands = TargetInstrDescriptors[opCode].numOperands; 65a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve if (NumOperands >= 0 && getNumOperands() >= (unsigned)NumOperands) 663497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve return true; // Broken: we have all the operands of this instruction! 67413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner return false; 6870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 6970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 70413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner 71e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// 72e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// Support for replacing opcode and operands of a MachineInstr in place. 73e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// This only resets the size of the operand vector and initializes it. 74e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// The new operands must be set explicitly later. 75e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// 76a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Advevoid MachineInstr::replace(MachineOpCode Opcode, unsigned numOperands) 77a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve{ 78a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(getNumImplicitRefs() == 0 && 79a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve "This is probably broken because implicit refs are going to be lost."); 80413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner opCode = Opcode; 81e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve operands.clear(); 82413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner operands.resize(numOperands, MachineOperand()); 83e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve} 84e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve 8570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 86413746e9833d97a8b463ef6a788aa326cf3829a2Chris LattnerMachineInstr::SetMachineOperandVal(unsigned i, 877a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve MachineOperand::MachineOperandType opType, 88572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner Value* V, 890c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner bool isdef, 900c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner bool isDefAndUse) 9170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 92a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < operands.size()); // may be explicit or implicit op 93572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].opType = opType; 94572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].value = V; 95572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].regNum = -1; 96572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 973bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve if (isDefAndUse) 98570f55de8d9f53a0d8a5dc6dcbb6aaba46b1b6dbChris Lattner operands[i].flags = MachineOperand::DEFUSEFLAG; 99570f55de8d9f53a0d8a5dc6dcbb6aaba46b1b6dbChris Lattner else if (isdef || TargetInstrDescriptors[opCode].resultPos == (int) i) 1005f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve operands[i].flags = MachineOperand::DEFONLYFLAG; 101570f55de8d9f53a0d8a5dc6dcbb6aaba46b1b6dbChris Lattner else 102570f55de8d9f53a0d8a5dc6dcbb6aaba46b1b6dbChris Lattner operands[i].flags = 0; 10370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 10470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 10570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 106572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris LattnerMachineInstr::SetMachineOperandConst(unsigned i, 10770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve MachineOperand::MachineOperandType operandType, 108c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve int64_t intValue) 10970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 110a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < getNumOperands()); // must be explicit op 111c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve assert(TargetInstrDescriptors[opCode].resultPos != (int) i && 112c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve "immed. constant cannot be defined"); 113572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 114572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].opType = operandType; 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 12170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 122572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris LattnerMachineInstr::SetMachineOperandReg(unsigned i, 123c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve int regNum, 1242f305989b395a0a8bf00c4b9dc140a6df051245eChris Lattner bool isdef) { 125a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < getNumOperands()); // must be explicit op 126572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 1272f305989b395a0a8bf00c4b9dc140a6df051245eChris Lattner operands[i].opType = MachineOperand::MO_MachineRegister; 128572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].value = NULL; 129572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].regNum = regNum; 130572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 1313bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve if (isdef || TargetInstrDescriptors[opCode].resultPos == (int) i) 1325f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve operands[i].flags = MachineOperand::DEFONLYFLAG; 133570f55de8d9f53a0d8a5dc6dcbb6aaba46b1b6dbChris Lattner else 134570f55de8d9f53a0d8a5dc6dcbb6aaba46b1b6dbChris Lattner operands[i].flags = 0; 135570f55de8d9f53a0d8a5dc6dcbb6aaba46b1b6dbChris Lattner 13627a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner insertUsedReg(regNum); 13770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 13870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 13970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 1407a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. AdveMachineInstr::SetRegForOperand(unsigned i, int regNum) 14170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 142a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < getNumOperands()); // must be explicit op 1437a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve operands[i].setRegForValue(regNum); 14427a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner insertUsedReg(regNum); 1457a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve} 1467a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve 1473497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Advevoid 1483497782f3843007de3be0c43e3ff206a01e2ccacVikram S. AdveMachineInstr::SetRegForImplicitRef(unsigned i, int regNum) 1493497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve{ 1503497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve getImplicitOp(i).setRegForValue(regNum); 1513497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve insertUsedReg(regNum); 1523497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve} 1533497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve 1547a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve 155e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve// Subsitute all occurrences of Value* oldVal with newVal in all operands 156627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve// and all implicit refs. 157627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve// If defsOnly == true, substitute defs only. 158e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adveunsigned 159627eb31cd791f808eaa048478d01222577a30a1aVikram S. AdveMachineInstr::substituteValue(const Value* oldVal, Value* newVal, 160627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve bool defsOnly, bool notDefsAndUses, 161627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve bool& someArgsWereIgnored) 162e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve{ 163627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve assert((defsOnly || !notDefsAndUses) && 164627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve "notDefsAndUses is irrelevant if defsOnly == false."); 165627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve 166e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve unsigned numSubst = 0; 167e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 168e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve // Subsitute operands 169e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve for (MachineInstr::val_op_iterator O = begin(), E = end(); O != E; ++O) 170e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve if (*O == oldVal) 171627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve if (!defsOnly || 172627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve notDefsAndUses && O.isDefOnly() || 173627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve !notDefsAndUses && !O.isUseOnly()) 174e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve { 175e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve O.getMachineOperand().value = newVal; 176e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve ++numSubst; 177e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve } 178627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve else 179627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve someArgsWereIgnored = true; 180e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 181e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve // Subsitute implicit refs 182a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve for (unsigned i=0, N=getNumImplicitRefs(); i < N; ++i) 18327a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner if (getImplicitRef(i) == oldVal) 184627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve if (!defsOnly || 185627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve notDefsAndUses && getImplicitOp(i).opIsDefOnly() || 186627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve !notDefsAndUses && !getImplicitOp(i).opIsUse()) 187e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve { 188a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve getImplicitOp(i).value = newVal; 189e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve ++numSubst; 190e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve } 191627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve else 192627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve someArgsWereIgnored = true; 193e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 194e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve return numSubst; 195e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve} 196e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 197e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 1987a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Advevoid 1997a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. AdveMachineInstr::dump() const 2007a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve{ 2017a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve cerr << " " << *this; 20270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 20370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 2048c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Advestatic inline std::ostream& 2058c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. AdveOutputValue(std::ostream &os, const Value* val) 20693240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve{ 20793240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve os << "(val "; 208627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve os << (void*) val; // print address always 20993240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve if (val && val->hasName()) 210627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve os << " " << val->getName() << ")"; // print name also, if available 211627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve return os; 21293240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve} 21393240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve 2142a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattnerstatic inline void OutputReg(std::ostream &os, unsigned RegNo, 2152a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner const MRegisterInfo *MRI = 0) { 2162a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner if (MRI) { 2172a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner if (RegNo < MRegisterInfo::FirstVirtualRegister) 2182a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner os << "%" << MRI->get(RegNo).Name; 2192a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner else 2202a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner os << "%reg" << RegNo; 2212a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner } else 2222a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner os << "%mreg(" << RegNo << ")"; 2238c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve} 2248c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve 2251049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattnerstatic void print(const MachineOperand &MO, std::ostream &OS, 2261049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner const TargetMachine &TM) { 2272a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner const MRegisterInfo *MRI = TM.getRegisterInfo(); 2281049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner bool CloseParen = true; 2291049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (MO.opHiBits32()) 2301049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%lm("; 2311049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner else if (MO.opLoBits32()) 2321049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%lo("; 2331049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner else if (MO.opHiBits64()) 2341049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%hh("; 2351049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner else if (MO.opLoBits64()) 2361049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%hm("; 2371049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner else 2381049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner CloseParen = false; 2391049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 2401049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner switch (MO.getType()) { 2411049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_VirtualRegister: 2421049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (MO.getVRegValue()) { 2431049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%reg"; 2441049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OutputValue(OS, MO.getVRegValue()); 2451049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (MO.hasAllocatedReg()) 2461049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "=="; 2471049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 2481049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (MO.hasAllocatedReg()) 2492a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner OutputReg(OS, MO.getAllocatedRegNum(), MRI); 2501049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2511049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_CCRegister: 2521049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%ccreg"; 2531049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OutputValue(OS, MO.getVRegValue()); 2541049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (MO.hasAllocatedReg()) { 2551049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "=="; 2562a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner OutputReg(OS, MO.getAllocatedRegNum(), MRI); 2571049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 2581049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2591049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_MachineRegister: 2602a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner OutputReg(OS, MO.getMachineRegNum(), MRI); 2611049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2621049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_SignExtendedImmed: 2631049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << (long)MO.getImmedValue(); 2641049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2651049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_UnextendedImmed: 2661049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << (long)MO.getImmedValue(); 2671049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2681049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_PCRelativeDisp: { 2691049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner const Value* opVal = MO.getVRegValue(); 2701049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal); 2711049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%disp(" << (isLabel? "label " : "addr-of-val "); 2721049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (opVal->hasName()) 2731049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << opVal->getName(); 2741049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner else 2751049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << (const void*) opVal; 2761049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << ")"; 2771049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2781049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 2792109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner case MachineOperand::MO_MachineBasicBlock: 2802109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner OS << "bb<" 2812109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName() 2822109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner << "," << (void*)MO.getMachineBasicBlock()->getBasicBlock() << ">"; 2832109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner break; 28410cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner case MachineOperand::MO_FrameIndex: 28510cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "<fi#" << MO.getFrameIndex() << ">"; 28610cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner break; 2878d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_ConstantPoolIndex: 2888d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<cp#" << MO.getConstantPoolIndex() << ">"; 2898d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 2908d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_GlobalAddress: 2918d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">"; 2928d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 2938d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_ExternalSymbol: 2948d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<es:" << MO.getSymbolName() << ">"; 2958d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 2961049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner default: 2971049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner assert(0 && "Unrecognized operand type"); 2981049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 2991049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 3001049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (CloseParen) 3011049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << ")"; 3021049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner} 3031049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 304af55be15dfa5321f470ce9734fabd858f5af7a88Chris Lattnervoid MachineInstr::print(std::ostream &OS, const TargetMachine &TM) const { 3056a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner unsigned StartOp = 0; 3066a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner 3076a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner // Specialize printing if op#0 is definition 3085f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve if (getNumOperands() && 3095f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve (getOperand(0).opIsDefOnly() || getOperand(0).opIsDefAndUse())) { 3106a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner ::print(getOperand(0), OS, TM); 3116a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << " = "; 3126a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner ++StartOp; // Don't print this operand again! 3136a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner } 3141049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << TM.getInstrInfo().getName(getOpcode()); 3156a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner 3166a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) { 3175f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve const MachineOperand& mop = getOperand(i); 3186a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner if (i != StartOp) 3196a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << ","; 3206a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << " "; 3215f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve ::print(mop, OS, TM); 3226a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner 3235f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve if (mop.opIsDefAndUse()) 3241049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "<def&use>"; 3255f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve else if (mop.opIsDefOnly()) 3261049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "<def>"; 3271049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 3286a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner 3291049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner // code for printing implict references 3301049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (getNumImplicitRefs()) { 3311049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "\tImplicitRefs: "; 3321049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner for(unsigned i = 0, e = getNumImplicitRefs(); i != e; ++i) { 3331049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "\t"; 3345f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve OutputValue(OS, getImplicitRef(i)); 3355f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve if (getImplicitOp(i).opIsDefAndUse()) 3361049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "<def&use>"; 3375f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve else if (getImplicitOp(i).opIsDefOnly()) 3381049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "<def>"; 3391049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 3401049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 3411049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 3421049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "\n"; 3431049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner} 3441049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 3451049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 3468d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattnerstd::ostream &operator<<(std::ostream& os, const MachineInstr& MI) 34770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 3488d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner os << TargetInstrDescriptors[MI.opCode].Name; 34970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 3508d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner for (unsigned i=0, N=MI.getNumOperands(); i < N; i++) { 3518d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner os << "\t" << MI.getOperand(i); 3525f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve if (MI.getOperand(i).opIsDefOnly()) 3538d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner os << "<d>"; 3545f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve if (MI.getOperand(i).opIsDefAndUse()) 3558d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner os << "<d&u>"; 3568d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka } 35770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 35869917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka // code for printing implict references 3598d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner unsigned NumOfImpRefs = MI.getNumImplicitRefs(); 3608d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner if (NumOfImpRefs > 0) { 36193240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve os << "\tImplicit: "; 3628d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner for (unsigned z=0; z < NumOfImpRefs; z++) { 3638d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OutputValue(os, MI.getImplicitRef(z)); 3645f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve if (MI.getImplicitOp(z).opIsDefOnly()) os << "<d>"; 3655f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve if (MI.getImplicitOp(z).opIsDefAndUse()) os << "<d&u>"; 36607c7086bd29b5c7223945cbdeae48494874de38fRuchira Sasanka os << "\t"; 36769917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka } 36869917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka } 36993240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve 370697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner return os << "\n"; 37170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 37270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 37310cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattnerstd::ostream &operator<<(std::ostream &OS, const MachineOperand &MO) 3746e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve{ 3752109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner if (MO.opHiBits32()) 37610cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%lm("; 3772109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner else if (MO.opLoBits32()) 37810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%lo("; 3792109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner else if (MO.opHiBits64()) 38010cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%hh("; 3812109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner else if (MO.opLoBits64()) 38210cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%hm("; 3833bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve 3842109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner switch (MO.getType()) 3856e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve { 3866e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_VirtualRegister: 3878d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner if (MO.hasAllocatedReg()) 38810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OutputReg(OS, MO.getAllocatedRegNum()); 3898d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner 3908d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner if (MO.getVRegValue()) { 3918d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner if (MO.hasAllocatedReg()) OS << "=="; 3928d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "%vreg"; 3938d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OutputValue(OS, MO.getVRegValue()); 3941049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 3953bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 3966e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_CCRegister: 39710cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%ccreg"; 39810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OutputValue(OS, MO.getVRegValue()); 3992109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner if (MO.hasAllocatedReg()) { 40010cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "=="; 40110cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OutputReg(OS, MO.getAllocatedRegNum()); 4021049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 4033bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 4043bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve case MachineOperand::MO_MachineRegister: 40510cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OutputReg(OS, MO.getMachineRegNum()); 4063bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 4076e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_SignExtendedImmed: 40810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << (long)MO.getImmedValue(); 4093bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 4106e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_UnextendedImmed: 41110cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << (long)MO.getImmedValue(); 4123bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 4136e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_PCRelativeDisp: 414e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve { 4152109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner const Value* opVal = MO.getVRegValue(); 4164d669b510c1d609c6b3fe98ac14ae38bd7c011f6Chris Lattner bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal); 41710cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%disp(" << (isLabel? "label " : "addr-of-val "); 418d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve if (opVal->hasName()) 41910cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << opVal->getName(); 420d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve else 42110cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << (const void*) opVal; 42210cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << ")"; 4233bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 424e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve } 4252109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner case MachineOperand::MO_MachineBasicBlock: 42610cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "bb<" 4272109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName() 4282109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner << "," << (void*)MO.getMachineBasicBlock()->getBasicBlock() << ">"; 4292109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner break; 43010cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner case MachineOperand::MO_FrameIndex: 43110cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "<fi#" << MO.getFrameIndex() << ">"; 43210cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner break; 4338d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_ConstantPoolIndex: 4348d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<cp#" << MO.getConstantPoolIndex() << ">"; 4358d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 4368d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_GlobalAddress: 4378d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">"; 4388d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 4398d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_ExternalSymbol: 4408d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<es:" << MO.getSymbolName() << ">"; 4418d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 4426e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve default: 4436e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve assert(0 && "Unrecognized operand type"); 4446e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve break; 4456e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve } 446e6fdb11e1ae823d69e646e76828ccb5d427a9d3aChris Lattner 4472109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner if (MO.flags & 4483bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve (MachineOperand::HIFLAG32 | MachineOperand::LOFLAG32 | 4493bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve MachineOperand::HIFLAG64 | MachineOperand::LOFLAG64)) 45010cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << ")"; 4513bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve 45210cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner return OS; 45370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 454