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