MachineInstr.cpp revision f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41
1035dfbe7f2d109008d2d62d9f2a67efb477a7ab6Chris Lattner//===-- MachineInstr.cpp --------------------------------------------------===// 270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve// 3035dfbe7f2d109008d2d62d9f2a67efb477a7ab6Chris Lattner//===----------------------------------------------------------------------===// 470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 5822b4fb896846b87dd11a330ae13f2239329aeefChris Lattner#include "llvm/CodeGen/MachineInstr.h" 63801f6d38371b734d9de2fb8394ca75d2bf190ebChris Lattner#include "llvm/Value.h" 70be79c6c1bc4fca31599f396528511506e3a1378Chris Lattner#include "llvm/Target/MachineInstrInfo.h" // FIXME: shouldn't need this! 8697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerusing std::cerr; 95b79591450c47920139705712a402251af7eed79Vikram S. Adve 10f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// Global variable holding an array of descriptors for machine instructions. 11f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// The actual object needs to be created separately for each target machine. 12f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// This variable is initialized and reset by class MachineInstrInfo. 13f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// 14f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// FIXME: This should be a property of the target so that more than one target 15f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// at a time can be active... 16f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// 17f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattnerextern const MachineInstrDescriptor *TargetInstrDescriptors; 1869917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka 191885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve// Constructor for instructions with fixed #operands (nearly all) 207279122e668816bed0d4f38d3392bbab0140fad0Chris LattnerMachineInstr::MachineInstr(MachineOpCode _opCode) 219a8e4121aa4121100fb562134c098aeb38f70b37Chris Lattner : opCode(_opCode), 22413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner operands(TargetInstrDescriptors[_opCode].numOperands, MachineOperand()) { 231885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve assert(TargetInstrDescriptors[_opCode].numOperands >= 0); 241885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve} 251885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve 261885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve// Constructor for instructions with variable #operands 27b98a53f201fd3652f4b7e37d1f2cb3b9b0775d45Chris LattnerMachineInstr::MachineInstr(MachineOpCode OpCode, unsigned numOperands) 289a8e4121aa4121100fb562134c098aeb38f70b37Chris Lattner : opCode(OpCode), operands(numOperands, MachineOperand()) { 29413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner} 30413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner 317279122e668816bed0d4f38d3392bbab0140fad0Chris LattnerMachineInstr::MachineInstr(MachineOpCode Opcode, unsigned numOperands, 329a8e4121aa4121100fb562134c098aeb38f70b37Chris Lattner bool XX, bool YY) : opCode(Opcode) { 337279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner operands.reserve(numOperands); 347279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner} 357279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner 36413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner// OperandComplete - Return true if it's illegal to add a new operand 37413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattnerbool MachineInstr::OperandsComplete() const { 38413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner int NumOperands = TargetInstrDescriptors[opCode].numOperands; 39413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner if (NumOperands >= 0 && operands.size() >= (unsigned)NumOperands) 40413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner return true; // Broken! 41413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner return false; 4270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 4370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 44413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner 45e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// 46e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// Support for replacing opcode and operands of a MachineInstr in place. 47e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// This only resets the size of the operand vector and initializes it. 48e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// The new operands must be set explicitly later. 49e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// 50b98a53f201fd3652f4b7e37d1f2cb3b9b0775d45Chris Lattnervoid MachineInstr::replace(MachineOpCode Opcode, unsigned numOperands) { 51413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner opCode = Opcode; 52e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve operands.clear(); 53413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner operands.resize(numOperands, MachineOperand()); 54e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve} 55e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve 5670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 57413746e9833d97a8b463ef6a788aa326cf3829a2Chris LattnerMachineInstr::SetMachineOperandVal(unsigned i, 587a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve MachineOperand::MachineOperandType opType, 59572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner Value* V, 600c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner bool isdef, 610c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner bool isDefAndUse) 6270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 636a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve assert(i < operands.size()); 64572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].opType = opType; 65572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].value = V; 66572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].regNum = -1; 67572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].flags = 0; 68572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 693bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve if (isdef || TargetInstrDescriptors[opCode].resultPos == (int) i) 703bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve operands[i].markDef(); 713bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve if (isDefAndUse) 723bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve operands[i].markDefAndUse(); 7370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 7470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 7570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 76572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris LattnerMachineInstr::SetMachineOperandConst(unsigned i, 7770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve MachineOperand::MachineOperandType operandType, 78c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve int64_t intValue) 7970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 806a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve assert(i < operands.size()); 81c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve assert(TargetInstrDescriptors[opCode].resultPos != (int) i && 82c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve "immed. constant cannot be defined"); 83572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 84572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].opType = operandType; 85572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].value = NULL; 86572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].immedVal = intValue; 87572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].regNum = -1; 88572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].flags = 0; 8970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 9070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 9170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 92572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris LattnerMachineInstr::SetMachineOperandReg(unsigned i, 93c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve int regNum, 942f305989b395a0a8bf00c4b9dc140a6df051245eChris Lattner bool isdef) { 956a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve assert(i < operands.size()); 96572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 972f305989b395a0a8bf00c4b9dc140a6df051245eChris Lattner operands[i].opType = MachineOperand::MO_MachineRegister; 98572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].value = NULL; 99572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].regNum = regNum; 100572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].flags = 0; 101572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 1023bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve if (isdef || TargetInstrDescriptors[opCode].resultPos == (int) i) 1033bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve operands[i].markDef(); 10427a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner insertUsedReg(regNum); 10570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 10670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 10770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 1087a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. AdveMachineInstr::SetRegForOperand(unsigned i, int regNum) 10970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 1107a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve operands[i].setRegForValue(regNum); 11127a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner insertUsedReg(regNum); 1127a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve} 1137a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve 1147a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve 115e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve// Subsitute all occurrences of Value* oldVal with newVal in all operands 116e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve// and all implicit refs. If defsOnly == true, substitute defs only. 117e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adveunsigned 118e2a78e31862c2b6142491db5a67065756d6870beVikram S. AdveMachineInstr::substituteValue(const Value* oldVal, Value* newVal, bool defsOnly) 119e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve{ 120e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve unsigned numSubst = 0; 121e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 122e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve // Subsitute operands 123e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve for (MachineInstr::val_op_iterator O = begin(), E = end(); O != E; ++O) 124e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve if (*O == oldVal) 125e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve if (!defsOnly || O.isDef()) 126e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve { 127e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve O.getMachineOperand().value = newVal; 128e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve ++numSubst; 129e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve } 130e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 131e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve // Subsitute implicit refs 132e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve for (unsigned i=0, N=implicitRefs.size(); i < N; ++i) 13327a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner if (getImplicitRef(i) == oldVal) 134e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve if (!defsOnly || implicitRefIsDefined(i)) 135e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve { 13627a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner implicitRefs[i].Val = newVal; 137e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve ++numSubst; 138e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve } 139e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 140e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve return numSubst; 141e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve} 142e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 143e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 1447a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Advevoid 1457a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. AdveMachineInstr::dump() const 1467a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve{ 1477a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve cerr << " " << *this; 14870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 14970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 1508c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Advestatic inline std::ostream& 1518c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. AdveOutputValue(std::ostream &os, const Value* val) 15293240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve{ 15393240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve os << "(val "; 15493240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve if (val && val->hasName()) 1553bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve return os << val->getName() << ")"; 15693240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve else 1573bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve return os << (void*) val << ")"; // print address only 15893240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve} 15993240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve 1608c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Advestatic inline std::ostream& 1618c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. AdveOutputReg(std::ostream &os, unsigned int regNum) 1628c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve{ 1638c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve return os << "%mreg(" << regNum << ")"; 1648c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve} 1658c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve 166697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerstd::ostream &operator<<(std::ostream& os, const MachineInstr& minstr) 16770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 168d9512caca8ec1e5488cdc94b34986c8ab2d447bbChris Lattner os << TargetInstrDescriptors[minstr.opCode].Name; 16970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 1708d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka for (unsigned i=0, N=minstr.getNumOperands(); i < N; i++) { 17170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve os << "\t" << minstr.getOperand(i); 1727a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve if( minstr.operandIsDefined(i) ) 1737a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve os << "*"; 1747a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve if( minstr.operandIsDefinedAndUsed(i) ) 17507c7086bd29b5c7223945cbdeae48494874de38fRuchira Sasanka os << "*"; 1768d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka } 17770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 17869917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka // code for printing implict references 17969917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka unsigned NumOfImpRefs = minstr.getNumImplicitRefs(); 18069917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka if( NumOfImpRefs > 0 ) { 18193240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve os << "\tImplicit: "; 18269917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka for(unsigned z=0; z < NumOfImpRefs; z++) { 18393240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve OutputValue(os, minstr.getImplicitRef(z)); 1848d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka if( minstr.implicitRefIsDefined(z)) os << "*"; 1857a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve if( minstr.implicitRefIsDefinedAndUsed(z)) os << "*"; 18607c7086bd29b5c7223945cbdeae48494874de38fRuchira Sasanka os << "\t"; 18769917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka } 18869917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka } 18993240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve 190697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner return os << "\n"; 19170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 19270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 193697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerstd::ostream &operator<<(std::ostream &os, const MachineOperand &mop) 1946e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve{ 1953bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve if (mop.opHiBits32()) 1963bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << "%lm("; 1973bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve else if (mop.opLoBits32()) 1983bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << "%lo("; 1993bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve else if (mop.opHiBits64()) 2003bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << "%hh("; 2013bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve else if (mop.opLoBits64()) 2023bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << "%hm("; 2033bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve 2046e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve switch(mop.opType) 2056e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve { 2066e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_VirtualRegister: 2076e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve os << "%reg"; 2083bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve OutputValue(os, mop.getVRegValue()); 2098c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve if (mop.hasAllocatedReg()) 2108c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve os << "==" << OutputReg(os, mop.getAllocatedRegNum()); 2113bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 2126e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_CCRegister: 2136e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve os << "%ccreg"; 2143bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve OutputValue(os, mop.getVRegValue()); 2158c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve if (mop.hasAllocatedReg()) 2168c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve os << "==" << OutputReg(os, mop.getAllocatedRegNum()); 2173bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 2183bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve case MachineOperand::MO_MachineRegister: 2198c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve OutputReg(os, mop.getMachineRegNum()); 2203bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 2216e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_SignExtendedImmed: 2223bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << (long)mop.immedVal; 2233bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 2246e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_UnextendedImmed: 2253bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << (long)mop.immedVal; 2263bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 2276e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_PCRelativeDisp: 228e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve { 229e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve const Value* opVal = mop.getVRegValue(); 2304d669b510c1d609c6b3fe98ac14ae38bd7c011f6Chris Lattner bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal); 231d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve os << "%disp(" << (isLabel? "label " : "addr-of-val "); 232d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve if (opVal->hasName()) 233697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner os << opVal->getName(); 234d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve else 2357a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve os << (const void*) opVal; 2363bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << ")"; 2373bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 238e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve } 2396e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve default: 2406e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve assert(0 && "Unrecognized operand type"); 2416e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve break; 2426e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve } 243e6fdb11e1ae823d69e646e76828ccb5d427a9d3aChris Lattner 2443bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve if (mop.flags & 2453bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve (MachineOperand::HIFLAG32 | MachineOperand::LOFLAG32 | 2463bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve MachineOperand::HIFLAG64 | MachineOperand::LOFLAG64)) 2473bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << ")"; 2483bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve 24970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve return os; 25070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 251