MachineInstr.cpp revision 27a08935ca4ccf2121c2cf4bfbf148e2382c7762
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
30e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve//
31e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// Support for replacing opcode and operands of a MachineInstr in place.
32e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// This only resets the size of the operand vector and initializes it.
33e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// The new operands must be set explicitly later.
34e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve//
35e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Advevoid
36e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. AdveMachineInstr::replace(MachineOpCode _opCode,
37e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve                      unsigned	    numOperands,
38e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve                      OpCodeMask    _opCodeMask)
39e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve{
40e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve  opCode = _opCode;
41e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve  opCodeMask = _opCodeMask;
42e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve  operands.clear();
43e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve  operands.resize(numOperands);
44e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve}
45e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve
4670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid
47c356e565a69e56993d018c7d94194e504a78285fVikram S. AdveMachineInstr::SetMachineOperandVal(unsigned int i,
487a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve                                   MachineOperand::MachineOperandType opType,
497a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve                                   Value* _val,
500c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner                                   bool isdef,
510c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner                                   bool isDefAndUse)
5270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{
536a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve  assert(i < operands.size());
547a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  operands[i].Initialize(opType, _val);
553bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  if (isdef || TargetInstrDescriptors[opCode].resultPos == (int) i)
563bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    operands[i].markDef();
573bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  if (isDefAndUse)
583bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    operands[i].markDefAndUse();
5970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
6070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
6170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid
62c356e565a69e56993d018c7d94194e504a78285fVikram S. AdveMachineInstr::SetMachineOperandConst(unsigned int i,
6370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve				MachineOperand::MachineOperandType operandType,
64c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve                                     int64_t intValue)
6570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{
666a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve  assert(i < operands.size());
67c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve  assert(TargetInstrDescriptors[opCode].resultPos != (int) i &&
68c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve         "immed. constant cannot be defined");
6970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve  operands[i].InitializeConst(operandType, intValue);
7070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
7170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
7270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid
73c356e565a69e56993d018c7d94194e504a78285fVikram S. AdveMachineInstr::SetMachineOperandReg(unsigned int i,
74c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve                                   int regNum,
750c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner                                   bool isdef,
760c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner                                   bool isDefAndUse,
770c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner                                   bool isCCReg)
7870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{
796a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve  assert(i < operands.size());
80c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve  operands[i].InitializeReg(regNum, isCCReg);
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();
8527a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner  insertUsedReg(regNum);
8670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
8770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
8870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid
897a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. AdveMachineInstr::SetRegForOperand(unsigned i, int regNum)
9070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{
917a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  operands[i].setRegForValue(regNum);
9227a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner  insertUsedReg(regNum);
937a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve}
947a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve
957a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve
96e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve// Subsitute all occurrences of Value* oldVal with newVal in all operands
97e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve// and all implicit refs.  If defsOnly == true, substitute defs only.
98e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adveunsigned
99e2a78e31862c2b6142491db5a67065756d6870beVikram S. AdveMachineInstr::substituteValue(const Value* oldVal, Value* newVal, bool defsOnly)
100e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve{
101e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  unsigned numSubst = 0;
102e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
103e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  // Subsitute operands
104e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  for (MachineInstr::val_op_iterator O = begin(), E = end(); O != E; ++O)
105e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve    if (*O == oldVal)
106e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve      if (!defsOnly || O.isDef())
107e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve        {
108e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve          O.getMachineOperand().value = newVal;
109e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve          ++numSubst;
110e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve        }
111e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
112e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  // Subsitute implicit refs
113e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  for (unsigned i=0, N=implicitRefs.size(); i < N; ++i)
11427a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner    if (getImplicitRef(i) == oldVal)
115e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve      if (!defsOnly || implicitRefIsDefined(i))
116e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve        {
11727a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner          implicitRefs[i].Val = newVal;
118e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve          ++numSubst;
119e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve        }
120e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
121e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  return numSubst;
122e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve}
123e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
124e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
1257a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Advevoid
1267a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. AdveMachineInstr::dump() const
1277a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve{
1287a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  cerr << "  " << *this;
12970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
13070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
1318c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Advestatic inline std::ostream&
1328c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. AdveOutputValue(std::ostream &os, const Value* val)
13393240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve{
13493240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve  os << "(val ";
13593240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve  if (val && val->hasName())
1363bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    return os << val->getName() << ")";
13793240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve  else
1383bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    return os << (void*) val << ")";              // print address only
13993240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve}
14093240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve
1418c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Advestatic inline std::ostream&
1428c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. AdveOutputReg(std::ostream &os, unsigned int regNum)
1438c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve{
1448c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve  return os << "%mreg(" << regNum << ")";
1458c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve}
1468c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve
147697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerstd::ostream &operator<<(std::ostream& os, const MachineInstr& minstr)
14870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{
1496a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve  os << TargetInstrDescriptors[minstr.opCode].opCodeString;
15070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
1518d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka  for (unsigned i=0, N=minstr.getNumOperands(); i < N; i++) {
15270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve    os << "\t" << minstr.getOperand(i);
1537a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve    if( minstr.operandIsDefined(i) )
1547a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve      os << "*";
1557a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve    if( minstr.operandIsDefinedAndUsed(i) )
15607c7086bd29b5c7223945cbdeae48494874de38fRuchira Sasanka      os << "*";
1578d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka  }
15870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
15969917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka  // code for printing implict references
16069917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka  unsigned NumOfImpRefs =  minstr.getNumImplicitRefs();
16169917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka  if(  NumOfImpRefs > 0 ) {
16293240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve    os << "\tImplicit: ";
16369917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka    for(unsigned z=0; z < NumOfImpRefs; z++) {
16493240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve      OutputValue(os, minstr.getImplicitRef(z));
1658d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka      if( minstr.implicitRefIsDefined(z)) os << "*";
1667a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve      if( minstr.implicitRefIsDefinedAndUsed(z)) os << "*";
16707c7086bd29b5c7223945cbdeae48494874de38fRuchira Sasanka      os << "\t";
16869917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka    }
16969917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka  }
17093240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve
171697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner  return os << "\n";
17270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
17370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
174697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerstd::ostream &operator<<(std::ostream &os, const MachineOperand &mop)
1756e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve{
1763bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  if (mop.opHiBits32())
1773bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    os << "%lm(";
1783bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  else if (mop.opLoBits32())
1793bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    os << "%lo(";
1803bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  else if (mop.opHiBits64())
1813bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    os << "%hh(";
1823bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  else if (mop.opLoBits64())
1833bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    os << "%hm(";
1843bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve
1856e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve  switch(mop.opType)
1866e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    {
1876e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_VirtualRegister:
1886e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve      os << "%reg";
1893bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      OutputValue(os, mop.getVRegValue());
1908c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve      if (mop.hasAllocatedReg())
1918c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve        os << "==" << OutputReg(os, mop.getAllocatedRegNum());
1923bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
1936e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_CCRegister:
1946e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve      os << "%ccreg";
1953bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      OutputValue(os, mop.getVRegValue());
1968c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve      if (mop.hasAllocatedReg())
1978c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve        os << "==" << OutputReg(os, mop.getAllocatedRegNum());
1983bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
1993bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    case MachineOperand::MO_MachineRegister:
2008c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve      OutputReg(os, mop.getMachineRegNum());
2013bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
2026e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_SignExtendedImmed:
2033bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      os << (long)mop.immedVal;
2043bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
2056e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_UnextendedImmed:
2063bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      os << (long)mop.immedVal;
2073bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
2086e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_PCRelativeDisp:
209e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve      {
210e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve        const Value* opVal = mop.getVRegValue();
2114d669b510c1d609c6b3fe98ac14ae38bd7c011f6Chris Lattner        bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal);
212d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve        os << "%disp(" << (isLabel? "label " : "addr-of-val ");
213d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve        if (opVal->hasName())
214697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner          os << opVal->getName();
215d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve        else
2167a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve          os << (const void*) opVal;
2173bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve        os << ")";
2183bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve        break;
219e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve      }
2206e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    default:
2216e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve      assert(0 && "Unrecognized operand type");
2226e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve      break;
2236e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    }
224e6fdb11e1ae823d69e646e76828ccb5d427a9d3aChris Lattner
2253bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  if (mop.flags &
2263bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      (MachineOperand::HIFLAG32 | MachineOperand::LOFLAG32 |
2273bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve       MachineOperand::HIFLAG64 | MachineOperand::LOFLAG64))
2283bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    os << ")";
2293bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve
23070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve  return os;
23170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
232