MachineInstr.cpp revision c356e565a69e56993d018c7d94194e504a78285f
170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve// $Id$ 270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve//*************************************************************************** 370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve// File: 470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve// MachineInstr.cpp 570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve// 670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve// Purpose: 770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve// 870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve// 970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve// Strategy: 1070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve// 1170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve// History: 1270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve// 7/2/01 - Vikram Adve - Created 1370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve//**************************************************************************/ 1470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 15822b4fb896846b87dd11a330ae13f2239329aeefChris Lattner#include "llvm/CodeGen/MachineInstr.h" 163801f6d38371b734d9de2fb8394ca75d2bf190ebChris Lattner#include "llvm/Value.h" 17697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner#include <iostream> 18697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerusing std::cerr; 195b79591450c47920139705712a402251af7eed79Vikram S. Adve 2069917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka 2170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve//************************ Class Implementations **************************/ 2270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 231885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve// Constructor for instructions with fixed #operands (nearly all) 2470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. AdveMachineInstr::MachineInstr(MachineOpCode _opCode, 2570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve OpCodeMask _opCodeMask) 2670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve : opCode(_opCode), 2770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve opCodeMask(_opCodeMask), 286a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve operands(TargetInstrDescriptors[_opCode].numOperands) 2970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 301885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve assert(TargetInstrDescriptors[_opCode].numOperands >= 0); 311885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve} 321885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve 331885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve// Constructor for instructions with variable #operands 341885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. AdveMachineInstr::MachineInstr(MachineOpCode _opCode, 351885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve unsigned numOperands, 361885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve OpCodeMask _opCodeMask) 371885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve : opCode(_opCode), 381885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve opCodeMask(_opCodeMask), 391885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve operands(numOperands) 401885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve{ 4170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 4270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 4370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 44c356e565a69e56993d018c7d94194e504a78285fVikram S. AdveMachineInstr::SetMachineOperandVal(unsigned int i, 4570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve MachineOperand::MachineOperandType operandType, 4645c171ee25619f6650e90fa5e3102d9969fd82b3Ruchira Sasanka Value* _val, bool isdef=false) 4770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 486a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve assert(i < operands.size()); 4970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve operands[i].Initialize(operandType, _val); 50149977b48a02735861697d5b4df1fe5a8592245fVikram S. Adve operands[i].isDef = isdef || 516e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve TargetInstrDescriptors[opCode].resultPos == (int) i; 5270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 5370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 5470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 55c356e565a69e56993d018c7d94194e504a78285fVikram S. AdveMachineInstr::SetMachineOperandConst(unsigned int i, 5670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve MachineOperand::MachineOperandType operandType, 57c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve int64_t intValue) 5870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 596a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve assert(i < operands.size()); 60c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve assert(TargetInstrDescriptors[opCode].resultPos != (int) i && 61c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve "immed. constant cannot be defined"); 6270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve operands[i].InitializeConst(operandType, intValue); 63c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve operands[i].isDef = false; 6470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 6570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 6670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 67c356e565a69e56993d018c7d94194e504a78285fVikram S. AdveMachineInstr::SetMachineOperandReg(unsigned int i, 68c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve int regNum, 69c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve bool isdef=false, 70c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve bool isCCReg=false) 7170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 726a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve assert(i < operands.size()); 73c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve operands[i].InitializeReg(regNum, isCCReg); 74149977b48a02735861697d5b4df1fe5a8592245fVikram S. Adve operands[i].isDef = isdef || 756e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve TargetInstrDescriptors[opCode].resultPos == (int) i; 7670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 7770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 7870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 790b03c6a492a0e09049b6c0bd127bd0ede7732aa5Ruchira SasankaMachineInstr::dump(unsigned int indent) const 8070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 8170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve for (unsigned i=0; i < indent; i++) 82697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner cerr << " "; 8370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 84697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner cerr << *this; 8570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 8670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 87697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerstd::ostream &operator<<(std::ostream& os, const MachineInstr& minstr) 8870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 896a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve os << TargetInstrDescriptors[minstr.opCode].opCodeString; 9070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 918d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka for (unsigned i=0, N=minstr.getNumOperands(); i < N; i++) { 9270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve os << "\t" << minstr.getOperand(i); 9307c7086bd29b5c7223945cbdeae48494874de38fRuchira Sasanka if( minstr.getOperand(i).opIsDef() ) 9407c7086bd29b5c7223945cbdeae48494874de38fRuchira Sasanka os << "*"; 958d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka } 9670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 976a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve#undef DEBUG_VAL_OP_ITERATOR 986a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve#ifdef DEBUG_VAL_OP_ITERATOR 99697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner os << "\n\tValue operands are: "; 1007a1767520611d9ff6face702068de858e1cadf2cChris Lattner for (MachineInstr::val_const_op_iterator vo(&minstr); ! vo.done(); ++vo) 1016a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve { 1026a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve const Value* val = *vo; 1036a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve os << val << (vo.isDef()? "(def), " : ", "); 1046a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve } 1056a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve#endif 1066a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve 10769917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka 10869917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka 10969917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka#if 1 11069917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka // code for printing implict references 11169917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka 11269917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka unsigned NumOfImpRefs = minstr.getNumImplicitRefs(); 11369917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka if( NumOfImpRefs > 0 ) { 11469917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka 11569917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka os << "\tImplicit:"; 11669917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka 11769917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka for(unsigned z=0; z < NumOfImpRefs; z++) { 11869917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka os << minstr.getImplicitRef(z); 1198d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka if( minstr.implicitRefIsDefined(z)) os << "*"; 12007c7086bd29b5c7223945cbdeae48494874de38fRuchira Sasanka os << "\t"; 12169917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka } 12269917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka } 12369917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka 12469917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka#endif 125697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner return os << "\n"; 12670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 12770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 128697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerstatic inline std::ostream &OutputOperand(std::ostream &os, 129697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner const MachineOperand &mop) 1306e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve{ 131d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve Value* val; 1326e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve switch (mop.getOperandType()) 1336e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve { 1346e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_CCRegister: 1356e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_VirtualRegister: 136d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve val = mop.getVRegValue(); 137d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve os << "(val "; 138d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve if (val && val->hasName()) 139697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner os << val->getName(); 140d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve else 141d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve os << val; 142d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve return os << ")"; 1436e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_MachineRegister: 1446e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve return os << "(" << mop.getMachineRegNum() << ")"; 1456e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve default: 1466e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve assert(0 && "Unknown operand type"); 1476e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve return os; 1486e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve } 149e6fdb11e1ae823d69e646e76828ccb5d427a9d3aChris Lattner} 15070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 151e6fdb11e1ae823d69e646e76828ccb5d427a9d3aChris Lattner 152697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerstd::ostream &operator<<(std::ostream &os, const MachineOperand &mop) 1536e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve{ 1546e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve switch(mop.opType) 1556e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve { 1566e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_VirtualRegister: 1576e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_MachineRegister: 1586e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve os << "%reg"; 1596e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve return OutputOperand(os, mop); 1606e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_CCRegister: 1616e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve os << "%ccreg"; 1626e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve return OutputOperand(os, mop); 1636e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_SignExtendedImmed: 164697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner return os << (long)mop.immedVal; 1656e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_UnextendedImmed: 166697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner return os << (long)mop.immedVal; 1676e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_PCRelativeDisp: 168e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve { 169e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve const Value* opVal = mop.getVRegValue(); 1701d87bcf4909b06dcd86320722653341f08b8b396Chris Lattner bool isLabel = isa<Method>(opVal) || isa<BasicBlock>(opVal); 171d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve os << "%disp(" << (isLabel? "label " : "addr-of-val "); 172d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve if (opVal->hasName()) 173697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner os << opVal->getName(); 174d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve else 175d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve os << opVal; 176d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve return os << ")"; 177e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve } 1786e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve default: 1796e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve assert(0 && "Unrecognized operand type"); 1806e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve break; 1816e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve } 182e6fdb11e1ae823d69e646e76828ccb5d427a9d3aChris Lattner 18370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve return os; 18470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 185