MachineInstr.cpp revision e2a78e31862c2b6142491db5a67065756d6870be
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" 7697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerusing std::cerr; 85b79591450c47920139705712a402251af7eed79Vikram S. Adve 969917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka 101885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve// Constructor for instructions with fixed #operands (nearly all) 1170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. AdveMachineInstr::MachineInstr(MachineOpCode _opCode, 1270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve OpCodeMask _opCodeMask) 1370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve : opCode(_opCode), 1470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve opCodeMask(_opCodeMask), 156a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve operands(TargetInstrDescriptors[_opCode].numOperands) 1670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 171885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve assert(TargetInstrDescriptors[_opCode].numOperands >= 0); 181885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve} 191885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve 201885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve// Constructor for instructions with variable #operands 211885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. AdveMachineInstr::MachineInstr(MachineOpCode _opCode, 221885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve unsigned numOperands, 231885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve OpCodeMask _opCodeMask) 241885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve : opCode(_opCode), 251885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve opCodeMask(_opCodeMask), 261885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve operands(numOperands) 271885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve{ 2870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 2970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 3070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 31c356e565a69e56993d018c7d94194e504a78285fVikram S. AdveMachineInstr::SetMachineOperandVal(unsigned int i, 327a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve MachineOperand::MachineOperandType opType, 337a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve Value* _val, 340c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner bool isdef, 350c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner bool isDefAndUse) 3670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 376a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve assert(i < operands.size()); 387a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve operands[i].Initialize(opType, _val); 393bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve if (isdef || TargetInstrDescriptors[opCode].resultPos == (int) i) 403bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve operands[i].markDef(); 413bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve if (isDefAndUse) 423bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve operands[i].markDefAndUse(); 4370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 4470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 4570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 46c356e565a69e56993d018c7d94194e504a78285fVikram S. AdveMachineInstr::SetMachineOperandConst(unsigned int i, 4770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve MachineOperand::MachineOperandType operandType, 48c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve int64_t intValue) 4970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 506a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve assert(i < operands.size()); 51c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve assert(TargetInstrDescriptors[opCode].resultPos != (int) i && 52c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve "immed. constant cannot be defined"); 5370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve operands[i].InitializeConst(operandType, intValue); 5470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 5570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 5670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 57c356e565a69e56993d018c7d94194e504a78285fVikram S. AdveMachineInstr::SetMachineOperandReg(unsigned int i, 58c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve int regNum, 590c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner bool isdef, 600c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner bool isDefAndUse, 610c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner bool isCCReg) 6270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 636a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve assert(i < operands.size()); 64c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve operands[i].InitializeReg(regNum, isCCReg); 653bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve if (isdef || TargetInstrDescriptors[opCode].resultPos == (int) i) 663bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve operands[i].markDef(); 673bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve if (isDefAndUse) 683bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve operands[i].markDefAndUse(); 697a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve regsUsed.insert(regNum); 7070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 7170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 7270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 737a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. AdveMachineInstr::SetRegForOperand(unsigned i, int regNum) 7470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 757a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve operands[i].setRegForValue(regNum); 767a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve regsUsed.insert(regNum); 777a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve} 787a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve 797a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve 80e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve// Subsitute all occurrences of Value* oldVal with newVal in all operands 81e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve// and all implicit refs. If defsOnly == true, substitute defs only. 82e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adveunsigned 83e2a78e31862c2b6142491db5a67065756d6870beVikram S. AdveMachineInstr::substituteValue(const Value* oldVal, Value* newVal, bool defsOnly) 84e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve{ 85e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve unsigned numSubst = 0; 86e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 87e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve // Subsitute operands 88e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve for (MachineInstr::val_op_iterator O = begin(), E = end(); O != E; ++O) 89e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve if (*O == oldVal) 90e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve if (!defsOnly || O.isDef()) 91e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve { 92e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve O.getMachineOperand().value = newVal; 93e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve ++numSubst; 94e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve } 95e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 96e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve // Subsitute implicit refs 97e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve for (unsigned i=0, N=implicitRefs.size(); i < N; ++i) 98e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve if (implicitRefs[i] == oldVal) 99e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve if (!defsOnly || implicitRefIsDefined(i)) 100e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve { 101e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve implicitRefs[i] = newVal; 102e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve ++numSubst; 103e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve } 104e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 105e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve return numSubst; 106e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve} 107e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 108e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 1097a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Advevoid 1107a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. AdveMachineInstr::dump() const 1117a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve{ 1127a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve cerr << " " << *this; 11370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 11470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 11593240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Advestatic inline std::ostream &OutputValue(std::ostream &os, 11693240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve const Value* val) 11793240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve{ 11893240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve os << "(val "; 11993240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve if (val && val->hasName()) 1203bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve return os << val->getName() << ")"; 12193240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve else 1223bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve return os << (void*) val << ")"; // print address only 12393240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve} 12493240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve 125697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerstd::ostream &operator<<(std::ostream& os, const MachineInstr& minstr) 12670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 1276a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve os << TargetInstrDescriptors[minstr.opCode].opCodeString; 12870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 1298d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka for (unsigned i=0, N=minstr.getNumOperands(); i < N; i++) { 13070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve os << "\t" << minstr.getOperand(i); 1317a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve if( minstr.operandIsDefined(i) ) 1327a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve os << "*"; 1337a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve if( minstr.operandIsDefinedAndUsed(i) ) 13407c7086bd29b5c7223945cbdeae48494874de38fRuchira Sasanka os << "*"; 1358d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka } 13670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 13769917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka // code for printing implict references 13869917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka unsigned NumOfImpRefs = minstr.getNumImplicitRefs(); 13969917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka if( NumOfImpRefs > 0 ) { 14093240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve os << "\tImplicit: "; 14169917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka for(unsigned z=0; z < NumOfImpRefs; z++) { 14293240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve OutputValue(os, minstr.getImplicitRef(z)); 1438d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka if( minstr.implicitRefIsDefined(z)) os << "*"; 1447a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve if( minstr.implicitRefIsDefinedAndUsed(z)) os << "*"; 14507c7086bd29b5c7223945cbdeae48494874de38fRuchira Sasanka os << "\t"; 14669917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka } 14769917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka } 14893240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve 149697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner return os << "\n"; 15070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 15170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 152697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerstd::ostream &operator<<(std::ostream &os, const MachineOperand &mop) 1536e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve{ 1543bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve if (mop.opHiBits32()) 1553bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << "%lm("; 1563bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve else if (mop.opLoBits32()) 1573bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << "%lo("; 1583bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve else if (mop.opHiBits64()) 1593bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << "%hh("; 1603bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve else if (mop.opLoBits64()) 1613bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << "%hm("; 1623bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve 1636e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve switch(mop.opType) 1646e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve { 1656e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_VirtualRegister: 1666e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve os << "%reg"; 1673bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve OutputValue(os, mop.getVRegValue()); 1683bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 1696e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_CCRegister: 1706e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve os << "%ccreg"; 1713bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve OutputValue(os, mop.getVRegValue()); 1723bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 1733bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve case MachineOperand::MO_MachineRegister: 1743bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << "%reg"; 1753bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << "(" << mop.getMachineRegNum() << ")"; 1763bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 1776e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_SignExtendedImmed: 1783bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << (long)mop.immedVal; 1793bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 1806e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_UnextendedImmed: 1813bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << (long)mop.immedVal; 1823bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 1836e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_PCRelativeDisp: 184e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve { 185e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve const Value* opVal = mop.getVRegValue(); 1864d669b510c1d609c6b3fe98ac14ae38bd7c011f6Chris Lattner bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal); 187d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve os << "%disp(" << (isLabel? "label " : "addr-of-val "); 188d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve if (opVal->hasName()) 189697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner os << opVal->getName(); 190d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve else 1917a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve os << (const void*) opVal; 1923bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << ")"; 1933bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 194e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve } 1956e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve default: 1966e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve assert(0 && "Unrecognized operand type"); 1976e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve break; 1986e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve } 199e6fdb11e1ae823d69e646e76828ccb5d427a9d3aChris Lattner 2003bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve if (mop.flags & 2013bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve (MachineOperand::HIFLAG32 | MachineOperand::LOFLAG32 | 2023bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve MachineOperand::HIFLAG64 | MachineOperand::LOFLAG64)) 2033bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve os << ")"; 2043bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve 20570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve return os; 20670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 207