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