MachineInstr.cpp revision a2bae305fb5a870c4ef753ed290a7ddea73ec82b
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"
70be79c6c1bc4fca31599f396528511506e3a1378Chris Lattner#include "llvm/Target/MachineInstrInfo.h"  // FIXME: shouldn't need this!
8697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerusing std::cerr;
95b79591450c47920139705712a402251af7eed79Vikram S. Adve
10f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// Global variable holding an array of descriptors for machine instructions.
11f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// The actual object needs to be created separately for each target machine.
12f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// This variable is initialized and reset by class MachineInstrInfo.
13f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner//
14f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// FIXME: This should be a property of the target so that more than one target
15f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// at a time can be active...
16f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner//
17f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattnerextern const MachineInstrDescriptor *TargetInstrDescriptors;
1869917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka
191885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve// Constructor for instructions with fixed #operands (nearly all)
207279122e668816bed0d4f38d3392bbab0140fad0Chris LattnerMachineInstr::MachineInstr(MachineOpCode _opCode)
219a8e4121aa4121100fb562134c098aeb38f70b37Chris Lattner  : opCode(_opCode),
22a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve    operands(TargetInstrDescriptors[_opCode].numOperands, MachineOperand()),
23a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve    numImplicitRefs(0)
24a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve{
251885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve  assert(TargetInstrDescriptors[_opCode].numOperands >= 0);
261885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve}
271885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve
281885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve// Constructor for instructions with variable #operands
29b98a53f201fd3652f4b7e37d1f2cb3b9b0775d45Chris LattnerMachineInstr::MachineInstr(MachineOpCode OpCode, unsigned  numOperands)
30a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  : opCode(OpCode),
31a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve    operands(numOperands, MachineOperand()),
32a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve    numImplicitRefs(0)
33a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve{
34413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner}
35413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner
367279122e668816bed0d4f38d3392bbab0140fad0Chris LattnerMachineInstr::MachineInstr(MachineOpCode Opcode, unsigned numOperands,
37a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve                           bool XX, bool YY)
38a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  : opCode(Opcode),
39a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve    numImplicitRefs(0)
40a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve{
417279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner  operands.reserve(numOperands);
427279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner}
437279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner
44413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner// OperandComplete - Return true if it's illegal to add a new operand
45a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Advebool MachineInstr::OperandsComplete() const
46a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve{
47413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  int NumOperands = TargetInstrDescriptors[opCode].numOperands;
48a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  if (NumOperands >= 0 && getNumOperands() >= (unsigned)NumOperands)
49413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner    return true;  // Broken!
50413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  return false;
5170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
5270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
53413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner
54e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve//
55e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// Support for replacing opcode and operands of a MachineInstr in place.
56e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// This only resets the size of the operand vector and initializes it.
57e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// The new operands must be set explicitly later.
58e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve//
59a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Advevoid MachineInstr::replace(MachineOpCode Opcode, unsigned numOperands)
60a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve{
61a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  assert(getNumImplicitRefs() == 0 &&
62a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve         "This is probably broken because implicit refs are going to be lost.");
63413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  opCode = Opcode;
64e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve  operands.clear();
65413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  operands.resize(numOperands, MachineOperand());
66e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve}
67e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve
6870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid
69413746e9833d97a8b463ef6a788aa326cf3829a2Chris LattnerMachineInstr::SetMachineOperandVal(unsigned i,
707a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve                                   MachineOperand::MachineOperandType opType,
71572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner                                   Value* V,
720c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner                                   bool isdef,
730c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner                                   bool isDefAndUse)
7470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{
75a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  assert(i < operands.size());          // may be explicit or implicit op
76572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].opType = opType;
77572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].value = V;
78572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].regNum = -1;
79572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].flags = 0;
80572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
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();
8570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
8670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
8770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid
88572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris LattnerMachineInstr::SetMachineOperandConst(unsigned i,
8970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve				MachineOperand::MachineOperandType operandType,
90c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve                                     int64_t intValue)
9170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{
92a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  assert(i < getNumOperands());          // must be explicit op
93c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve  assert(TargetInstrDescriptors[opCode].resultPos != (int) i &&
94c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve         "immed. constant cannot be defined");
95572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
96572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].opType = operandType;
97572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].value = NULL;
98572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].immedVal = intValue;
99572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].regNum = -1;
100572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].flags = 0;
10170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
10270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
10370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid
104572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris LattnerMachineInstr::SetMachineOperandReg(unsigned i,
105c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve                                   int regNum,
1062f305989b395a0a8bf00c4b9dc140a6df051245eChris Lattner                                   bool isdef) {
107a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  assert(i < getNumOperands());          // must be explicit op
108572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
1092f305989b395a0a8bf00c4b9dc140a6df051245eChris Lattner  operands[i].opType = MachineOperand::MO_MachineRegister;
110572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].value = NULL;
111572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].regNum = regNum;
112572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].flags = 0;
113572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
1143bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  if (isdef || TargetInstrDescriptors[opCode].resultPos == (int) i)
1153bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    operands[i].markDef();
11627a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner  insertUsedReg(regNum);
11770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
11870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
11970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid
1207a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. AdveMachineInstr::SetRegForOperand(unsigned i, int regNum)
12170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{
122a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  assert(i < getNumOperands());          // must be explicit op
1237a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  operands[i].setRegForValue(regNum);
12427a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner  insertUsedReg(regNum);
1257a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve}
1267a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve
1277a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve
128e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve// Subsitute all occurrences of Value* oldVal with newVal in all operands
129e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve// and all implicit refs.  If defsOnly == true, substitute defs only.
130e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adveunsigned
131e2a78e31862c2b6142491db5a67065756d6870beVikram S. AdveMachineInstr::substituteValue(const Value* oldVal, Value* newVal, bool defsOnly)
132e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve{
133e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  unsigned numSubst = 0;
134e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
135e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  // Subsitute operands
136e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  for (MachineInstr::val_op_iterator O = begin(), E = end(); O != E; ++O)
137e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve    if (*O == oldVal)
138e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve      if (!defsOnly || O.isDef())
139e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve        {
140e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve          O.getMachineOperand().value = newVal;
141e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve          ++numSubst;
142e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve        }
143e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
144e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  // Subsitute implicit refs
145a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  for (unsigned i=0, N=getNumImplicitRefs(); i < N; ++i)
14627a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner    if (getImplicitRef(i) == oldVal)
147e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve      if (!defsOnly || implicitRefIsDefined(i))
148e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve        {
149a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve          getImplicitOp(i).value = newVal;
150e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve          ++numSubst;
151e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve        }
152e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
153e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  return numSubst;
154e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve}
155e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
156e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
1577a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Advevoid
1587a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. AdveMachineInstr::dump() const
1597a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve{
1607a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  cerr << "  " << *this;
16170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
16270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
1638c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Advestatic inline std::ostream&
1648c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. AdveOutputValue(std::ostream &os, const Value* val)
16593240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve{
16693240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve  os << "(val ";
16793240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve  if (val && val->hasName())
1683bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    return os << val->getName() << ")";
16993240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve  else
1703bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    return os << (void*) val << ")";              // print address only
17193240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve}
17293240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve
1738c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Advestatic inline std::ostream&
1748c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. AdveOutputReg(std::ostream &os, unsigned int regNum)
1758c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve{
1768c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve  return os << "%mreg(" << regNum << ")";
1778c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve}
1788c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve
179697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerstd::ostream &operator<<(std::ostream& os, const MachineInstr& minstr)
18070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{
181d9512caca8ec1e5488cdc94b34986c8ab2d447bbChris Lattner  os << TargetInstrDescriptors[minstr.opCode].Name;
18270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
1838d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka  for (unsigned i=0, N=minstr.getNumOperands(); i < N; i++) {
18470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve    os << "\t" << minstr.getOperand(i);
1857a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve    if( minstr.operandIsDefined(i) )
1867a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve      os << "*";
1877a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve    if( minstr.operandIsDefinedAndUsed(i) )
18807c7086bd29b5c7223945cbdeae48494874de38fRuchira Sasanka      os << "*";
1898d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka  }
19070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
19169917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka  // code for printing implict references
19269917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka  unsigned NumOfImpRefs =  minstr.getNumImplicitRefs();
19369917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka  if(  NumOfImpRefs > 0 ) {
19493240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve    os << "\tImplicit: ";
19569917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka    for(unsigned z=0; z < NumOfImpRefs; z++) {
19693240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve      OutputValue(os, minstr.getImplicitRef(z));
1978d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka      if( minstr.implicitRefIsDefined(z)) os << "*";
1987a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve      if( minstr.implicitRefIsDefinedAndUsed(z)) os << "*";
19907c7086bd29b5c7223945cbdeae48494874de38fRuchira Sasanka      os << "\t";
20069917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka    }
20169917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka  }
20293240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve
203697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner  return os << "\n";
20470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
20570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
206697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerstd::ostream &operator<<(std::ostream &os, const MachineOperand &mop)
2076e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve{
2083bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  if (mop.opHiBits32())
2093bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    os << "%lm(";
2103bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  else if (mop.opLoBits32())
2113bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    os << "%lo(";
2123bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  else if (mop.opHiBits64())
2133bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    os << "%hh(";
2143bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  else if (mop.opLoBits64())
2153bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    os << "%hm(";
2163bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve
2176e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve  switch(mop.opType)
2186e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    {
2196e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_VirtualRegister:
2206e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve      os << "%reg";
2213bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      OutputValue(os, mop.getVRegValue());
2228c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve      if (mop.hasAllocatedReg())
2238c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve        os << "==" << OutputReg(os, mop.getAllocatedRegNum());
2243bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
2256e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_CCRegister:
2266e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve      os << "%ccreg";
2273bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      OutputValue(os, mop.getVRegValue());
2288c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve      if (mop.hasAllocatedReg())
2298c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve        os << "==" << OutputReg(os, mop.getAllocatedRegNum());
2303bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
2313bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    case MachineOperand::MO_MachineRegister:
2328c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve      OutputReg(os, mop.getMachineRegNum());
2333bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
2346e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_SignExtendedImmed:
2353bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      os << (long)mop.immedVal;
2363bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
2376e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_UnextendedImmed:
2383bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      os << (long)mop.immedVal;
2393bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
2406e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_PCRelativeDisp:
241e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve      {
242e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve        const Value* opVal = mop.getVRegValue();
2434d669b510c1d609c6b3fe98ac14ae38bd7c011f6Chris Lattner        bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal);
244d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve        os << "%disp(" << (isLabel? "label " : "addr-of-val ");
245d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve        if (opVal->hasName())
246697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner          os << opVal->getName();
247d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve        else
2487a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve          os << (const void*) opVal;
2493bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve        os << ")";
2503bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve        break;
251e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve      }
2526e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    default:
2536e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve      assert(0 && "Unrecognized operand type");
2546e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve      break;
2556e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    }
256e6fdb11e1ae823d69e646e76828ccb5d427a9d3aChris Lattner
2573bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  if (mop.flags &
2583bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      (MachineOperand::HIFLAG32 | MachineOperand::LOFLAG32 |
2593bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve       MachineOperand::HIFLAG64 | MachineOperand::LOFLAG64))
2603bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    os << ")";
2613bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve
26270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve  return os;
26370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
264