MachineInstr.cpp revision a2bae305fb5a870c4ef753ed290a7ddea73ec82b
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), 22a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve operands(TargetInstrDescriptors[_opCode].numOperands, MachineOperand()), 23a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve numImplicitRefs(0) 24a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve{ 251885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve assert(TargetInstrDescriptors[_opCode].numOperands >= 0); 261885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve} 271885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve 281885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve// Constructor for instructions with variable #operands 29b98a53f201fd3652f4b7e37d1f2cb3b9b0775d45Chris LattnerMachineInstr::MachineInstr(MachineOpCode OpCode, unsigned numOperands) 30a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve : opCode(OpCode), 31a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve operands(numOperands, MachineOperand()), 32a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve numImplicitRefs(0) 33a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve{ 34413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner} 35413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner 367279122e668816bed0d4f38d3392bbab0140fad0Chris LattnerMachineInstr::MachineInstr(MachineOpCode Opcode, unsigned numOperands, 37a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve bool XX, bool YY) 38a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve : opCode(Opcode), 39a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve numImplicitRefs(0) 40a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve{ 417279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner operands.reserve(numOperands); 427279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner} 437279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner 44413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner// OperandComplete - Return true if it's illegal to add a new operand 45a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Advebool MachineInstr::OperandsComplete() const 46a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve{ 47413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner int NumOperands = TargetInstrDescriptors[opCode].numOperands; 48a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve if (NumOperands >= 0 && getNumOperands() >= (unsigned)NumOperands) 49413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner return true; // Broken! 50413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner return false; 5170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 5270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 53413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner 54e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// 55e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// Support for replacing opcode and operands of a MachineInstr in place. 56e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// This only resets the size of the operand vector and initializes it. 57e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// The new operands must be set explicitly later. 58e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// 59a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Advevoid MachineInstr::replace(MachineOpCode Opcode, unsigned numOperands) 60a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve{ 61a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(getNumImplicitRefs() == 0 && 62a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve "This is probably broken because implicit refs are going to be lost."); 63413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner opCode = Opcode; 64e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve operands.clear(); 65413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner operands.resize(numOperands, MachineOperand()); 66e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve} 67e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve 6870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 69413746e9833d97a8b463ef6a788aa326cf3829a2Chris LattnerMachineInstr::SetMachineOperandVal(unsigned i, 707a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve MachineOperand::MachineOperandType opType, 71572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner Value* V, 720c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner bool isdef, 730c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner bool isDefAndUse) 7470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 75a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < operands.size()); // may be explicit or implicit op 76572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].opType = opType; 77572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].value = V; 78572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].regNum = -1; 79572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].flags = 0; 80572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 813bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve if (isdef || TargetInstrDescriptors[opCode].resultPos == (int) i) 823bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve operands[i].markDef(); 833bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve if (isDefAndUse) 843bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve operands[i].markDefAndUse(); 8570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 8670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 8770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 88572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris LattnerMachineInstr::SetMachineOperandConst(unsigned i, 8970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve MachineOperand::MachineOperandType operandType, 90c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve int64_t intValue) 9170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 92a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < getNumOperands()); // must be explicit op 93c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve assert(TargetInstrDescriptors[opCode].resultPos != (int) i && 94c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve "immed. constant cannot be defined"); 95572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 96572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].opType = operandType; 97572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].value = NULL; 98572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].immedVal = intValue; 99572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].regNum = -1; 100572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].flags = 0; 10170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 10270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 10370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 104572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris LattnerMachineInstr::SetMachineOperandReg(unsigned i, 105c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve int regNum, 1062f305989b395a0a8bf00c4b9dc140a6df051245eChris Lattner bool isdef) { 107a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < getNumOperands()); // must be explicit op 108572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 1092f305989b395a0a8bf00c4b9dc140a6df051245eChris Lattner operands[i].opType = MachineOperand::MO_MachineRegister; 110572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].value = NULL; 111572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].regNum = regNum; 112572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].flags = 0; 113572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 1143bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve if (isdef || TargetInstrDescriptors[opCode].resultPos == (int) i) 1153bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve operands[i].markDef(); 11627a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner insertUsedReg(regNum); 11770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 11870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 11970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 1207a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. AdveMachineInstr::SetRegForOperand(unsigned i, int regNum) 12170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 122a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < getNumOperands()); // must be explicit op 1237a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve operands[i].setRegForValue(regNum); 12427a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner insertUsedReg(regNum); 1257a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve} 1267a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve 1277a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve 128e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve// Subsitute all occurrences of Value* oldVal with newVal in all operands 129e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve// and all implicit refs. If defsOnly == true, substitute defs only. 130e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adveunsigned 131e2a78e31862c2b6142491db5a67065756d6870beVikram S. AdveMachineInstr::substituteValue(const Value* oldVal, Value* newVal, bool defsOnly) 132e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve{ 133e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve unsigned numSubst = 0; 134e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 135e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve // Subsitute operands 136e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve for (MachineInstr::val_op_iterator O = begin(), E = end(); O != E; ++O) 137e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve if (*O == oldVal) 138e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve if (!defsOnly || O.isDef()) 139e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve { 140e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve O.getMachineOperand().value = newVal; 141e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve ++numSubst; 142e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve } 143e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 144e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve // Subsitute implicit refs 145a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve for (unsigned i=0, N=getNumImplicitRefs(); i < N; ++i) 14627a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner if (getImplicitRef(i) == oldVal) 147e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve if (!defsOnly || implicitRefIsDefined(i)) 148e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve { 149a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve getImplicitOp(i).value = newVal; 150e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve ++numSubst; 151e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve } 152e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 153e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve return numSubst; 154e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve} 155e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 156e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 1577a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Advevoid 1587a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. AdveMachineInstr::dump() const 1597a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve{ 1607a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve cerr << " " << *this; 16170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 16270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 1638c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Advestatic inline std::ostream& 1648c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. AdveOutputValue(std::ostream &os, const Value* val) 16593240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve{ 16693240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve os << "(val "; 16793240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve if (val && val->hasName()) 1683bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve return os << val->getName() << ")"; 16993240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve else 1703bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve return os << (void*) val << ")"; // print address only 17193240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve} 17293240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve 1738c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Advestatic inline std::ostream& 1748c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. AdveOutputReg(std::ostream &os, unsigned int regNum) 1758c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve{ 1768c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve return os << "%mreg(" << regNum << ")"; 1778c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve} 1788c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve 179697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerstd::ostream &operator<<(std::ostream& os, const MachineInstr& minstr) 18070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 181d9512caca8ec1e5488cdc94b34986c8ab2d447bbChris Lattner os << TargetInstrDescriptors[minstr.opCode].Name; 18270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 1838d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka for (unsigned i=0, N=minstr.getNumOperands(); i < N; i++) { 18470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve os << "\t" << minstr.getOperand(i); 1857a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve if( minstr.operandIsDefined(i) ) 1867a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve os << "*"; 1877a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve if( minstr.operandIsDefinedAndUsed(i) ) 18807c7086bd29b5c7223945cbdeae48494874de38fRuchira Sasanka os << "*"; 1898d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka } 19070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 19169917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka // code for printing implict references 19269917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka unsigned NumOfImpRefs = minstr.getNumImplicitRefs(); 19369917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka if( NumOfImpRefs > 0 ) { 19493240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve os << "\tImplicit: "; 19569917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka for(unsigned z=0; z < NumOfImpRefs; z++) { 19693240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve OutputValue(os, minstr.getImplicitRef(z)); 1978d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka if( minstr.implicitRefIsDefined(z)) os << "*"; 1987a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve if( minstr.implicitRefIsDefinedAndUsed(z)) os << "*"; 19907c7086bd29b5c7223945cbdeae48494874de38fRuchira Sasanka os << "\t"; 20069917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka } 20169917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka } 20293240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve 203697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner return os << "\n"; 20470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 20570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 206697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerstd::ostream &operator<<(std::ostream &os, const MachineOperand &mop) 2076e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve{ 2083bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve if (mop.opHiBits32()) 2093bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << "%lm("; 2103bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve else if (mop.opLoBits32()) 2113bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << "%lo("; 2123bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve else if (mop.opHiBits64()) 2133bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << "%hh("; 2143bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve else if (mop.opLoBits64()) 2153bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << "%hm("; 2163bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve 2176e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve switch(mop.opType) 2186e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve { 2196e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_VirtualRegister: 2206e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve os << "%reg"; 2213bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve OutputValue(os, mop.getVRegValue()); 2228c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve if (mop.hasAllocatedReg()) 2238c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve os << "==" << OutputReg(os, mop.getAllocatedRegNum()); 2243bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 2256e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_CCRegister: 2266e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve os << "%ccreg"; 2273bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve OutputValue(os, mop.getVRegValue()); 2288c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve if (mop.hasAllocatedReg()) 2298c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve os << "==" << OutputReg(os, mop.getAllocatedRegNum()); 2303bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 2313bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve case MachineOperand::MO_MachineRegister: 2328c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve OutputReg(os, mop.getMachineRegNum()); 2333bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 2346e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_SignExtendedImmed: 2353bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << (long)mop.immedVal; 2363bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 2376e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_UnextendedImmed: 2383bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << (long)mop.immedVal; 2393bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 2406e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_PCRelativeDisp: 241e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve { 242e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve const Value* opVal = mop.getVRegValue(); 2434d669b510c1d609c6b3fe98ac14ae38bd7c011f6Chris Lattner bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal); 244d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve os << "%disp(" << (isLabel? "label " : "addr-of-val "); 245d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve if (opVal->hasName()) 246697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner os << opVal->getName(); 247d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve else 2487a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve os << (const void*) opVal; 2493bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << ")"; 2503bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 251e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve } 2526e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve default: 2536e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve assert(0 && "Unrecognized operand type"); 2546e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve break; 2556e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve } 256e6fdb11e1ae823d69e646e76828ccb5d427a9d3aChris Lattner 2573bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve if (mop.flags & 2583bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve (MachineOperand::HIFLAG32 | MachineOperand::LOFLAG32 | 2593bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve MachineOperand::HIFLAG64 | MachineOperand::LOFLAG64)) 2603bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << ")"; 2613bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve 26270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve return os; 26370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 264