MachineInstr.cpp revision 627eb31cd791f808eaa048478d01222577a30a1a
1035dfbe7f2d109008d2d62d9f2a67efb477a7ab6Chris Lattner//===-- MachineInstr.cpp --------------------------------------------------===//
270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve//
3035dfbe7f2d109008d2d62d9f2a67efb477a7ab6Chris Lattner//===----------------------------------------------------------------------===//
470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
5822b4fb896846b87dd11a330ae13f2239329aeefChris Lattner#include "llvm/CodeGen/MachineInstr.h"
6ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner#include "llvm/CodeGen/MachineBasicBlock.h"
73801f6d38371b734d9de2fb8394ca75d2bf190ebChris Lattner#include "llvm/Value.h"
81049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner#include "llvm/Target/TargetMachine.h"
93501feab811c86c9659248a4875fc31a3165f84dChris Lattner#include "llvm/Target/TargetInstrInfo.h"
102a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner#include "llvm/Target/MRegisterInfo.h"
11697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerusing std::cerr;
125b79591450c47920139705712a402251af7eed79Vikram S. Adve
138d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner
14f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// Global variable holding an array of descriptors for machine instructions.
15f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// The actual object needs to be created separately for each target machine.
163501feab811c86c9659248a4875fc31a3165f84dChris Lattner// This variable is initialized and reset by class TargetInstrInfo.
17f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner//
18f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// FIXME: This should be a property of the target so that more than one target
19f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// at a time can be active...
20f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner//
213501feab811c86c9659248a4875fc31a3165f84dChris Lattnerextern const TargetInstrDescriptor *TargetInstrDescriptors;
2269917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka
231885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve// Constructor for instructions with variable #operands
24b98a53f201fd3652f4b7e37d1f2cb3b9b0775d45Chris LattnerMachineInstr::MachineInstr(MachineOpCode OpCode, unsigned  numOperands)
25a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  : opCode(OpCode),
263497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve    opCodeFlags(0),
27a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve    operands(numOperands, MachineOperand()),
28a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve    numImplicitRefs(0)
29a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve{
30413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner}
31413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner
32ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - This constructor only does a _reserve_ of the operands,
33ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// not a resize for them.  It is expected that if you use this that you call
34ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// add* methods below to fill up the operands, instead of the Set methods.
35ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// Eventually, the "resizing" ctors will be phased out.
36ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner///
377279122e668816bed0d4f38d3392bbab0140fad0Chris LattnerMachineInstr::MachineInstr(MachineOpCode Opcode, unsigned numOperands,
38a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve                           bool XX, bool YY)
39a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  : opCode(Opcode),
403497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve    opCodeFlags(0),
41a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve    numImplicitRefs(0)
42a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve{
437279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner  operands.reserve(numOperands);
447279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner}
457279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner
46ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - Work exactly the same as the ctor above, except that the
47ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr is created and added to the end of the specified basic block.
48ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner///
49ddd7fcb887be752ec8167276a697994ad9cb9c4eChris LattnerMachineInstr::MachineInstr(MachineBasicBlock *MBB, MachineOpCode Opcode,
50ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner                           unsigned numOperands)
51ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner  : opCode(Opcode),
523497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve    opCodeFlags(0),
53ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner    numImplicitRefs(0)
54ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner{
55ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner  assert(MBB && "Cannot use inserting ctor with null basic block!");
56ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner  operands.reserve(numOperands);
57ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner  MBB->push_back(this);  // Add instruction to end of basic block!
58ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner}
59ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner
60ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner
61413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner// OperandComplete - Return true if it's illegal to add a new operand
62a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Advebool MachineInstr::OperandsComplete() const
63a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve{
64413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  int NumOperands = TargetInstrDescriptors[opCode].numOperands;
65a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  if (NumOperands >= 0 && getNumOperands() >= (unsigned)NumOperands)
663497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve    return true;  // Broken: we have all the operands of this instruction!
67413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  return false;
6870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
6970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
70413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner
71e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve//
72e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// Support for replacing opcode and operands of a MachineInstr in place.
73e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// This only resets the size of the operand vector and initializes it.
74e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// The new operands must be set explicitly later.
75e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve//
76a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Advevoid MachineInstr::replace(MachineOpCode Opcode, unsigned numOperands)
77a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve{
78a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  assert(getNumImplicitRefs() == 0 &&
79a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve         "This is probably broken because implicit refs are going to be lost.");
80413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  opCode = Opcode;
81e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve  operands.clear();
82413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  operands.resize(numOperands, MachineOperand());
83e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve}
84e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve
8570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid
86413746e9833d97a8b463ef6a788aa326cf3829a2Chris LattnerMachineInstr::SetMachineOperandVal(unsigned i,
877a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve                                   MachineOperand::MachineOperandType opType,
88572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner                                   Value* V,
890c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner                                   bool isdef,
900c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner                                   bool isDefAndUse)
9170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{
92a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  assert(i < operands.size());          // may be explicit or implicit op
93572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].opType = opType;
94572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].value = V;
95572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].regNum = -1;
96572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
973bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  if (isDefAndUse)
98570f55de8d9f53a0d8a5dc6dcbb6aaba46b1b6dbChris Lattner    operands[i].flags = MachineOperand::DEFUSEFLAG;
99570f55de8d9f53a0d8a5dc6dcbb6aaba46b1b6dbChris Lattner  else if (isdef || TargetInstrDescriptors[opCode].resultPos == (int) i)
1005f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve    operands[i].flags = MachineOperand::DEFONLYFLAG;
101570f55de8d9f53a0d8a5dc6dcbb6aaba46b1b6dbChris Lattner  else
102570f55de8d9f53a0d8a5dc6dcbb6aaba46b1b6dbChris Lattner    operands[i].flags = 0;
10370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
10470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
10570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid
106572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris LattnerMachineInstr::SetMachineOperandConst(unsigned i,
10770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve				MachineOperand::MachineOperandType operandType,
108c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve                                     int64_t intValue)
10970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{
110a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  assert(i < getNumOperands());          // must be explicit op
111c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve  assert(TargetInstrDescriptors[opCode].resultPos != (int) i &&
112c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve         "immed. constant cannot be defined");
113572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
114572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].opType = operandType;
115572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].value = NULL;
116572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].immedVal = intValue;
117572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].regNum = -1;
118572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].flags = 0;
11970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
12070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
12170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid
122572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris LattnerMachineInstr::SetMachineOperandReg(unsigned i,
123c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve                                   int regNum,
1242f305989b395a0a8bf00c4b9dc140a6df051245eChris Lattner                                   bool isdef) {
125a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  assert(i < getNumOperands());          // must be explicit op
126572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
1272f305989b395a0a8bf00c4b9dc140a6df051245eChris Lattner  operands[i].opType = MachineOperand::MO_MachineRegister;
128572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].value = NULL;
129572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].regNum = regNum;
130572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
1313bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  if (isdef || TargetInstrDescriptors[opCode].resultPos == (int) i)
1325f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve    operands[i].flags = MachineOperand::DEFONLYFLAG;
133570f55de8d9f53a0d8a5dc6dcbb6aaba46b1b6dbChris Lattner  else
134570f55de8d9f53a0d8a5dc6dcbb6aaba46b1b6dbChris Lattner    operands[i].flags = 0;
135570f55de8d9f53a0d8a5dc6dcbb6aaba46b1b6dbChris Lattner
13627a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner  insertUsedReg(regNum);
13770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
13870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
13970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid
1407a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. AdveMachineInstr::SetRegForOperand(unsigned i, int regNum)
14170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{
142a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  assert(i < getNumOperands());          // must be explicit op
1437a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  operands[i].setRegForValue(regNum);
14427a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner  insertUsedReg(regNum);
1457a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve}
1467a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve
1473497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Advevoid
1483497782f3843007de3be0c43e3ff206a01e2ccacVikram S. AdveMachineInstr::SetRegForImplicitRef(unsigned i, int regNum)
1493497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve{
1503497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve  getImplicitOp(i).setRegForValue(regNum);
1513497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve  insertUsedReg(regNum);
1523497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve}
1533497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve
1547a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve
155e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve// Subsitute all occurrences of Value* oldVal with newVal in all operands
156627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve// and all implicit refs.
157627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve// If defsOnly == true, substitute defs only.
158e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adveunsigned
159627eb31cd791f808eaa048478d01222577a30a1aVikram S. AdveMachineInstr::substituteValue(const Value* oldVal, Value* newVal,
160627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve                              bool defsOnly, bool notDefsAndUses,
161627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve                              bool& someArgsWereIgnored)
162e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve{
163627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve  assert((defsOnly || !notDefsAndUses) &&
164627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve         "notDefsAndUses is irrelevant if defsOnly == false.");
165627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve
166e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  unsigned numSubst = 0;
167e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
168e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  // Subsitute operands
169e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  for (MachineInstr::val_op_iterator O = begin(), E = end(); O != E; ++O)
170e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve    if (*O == oldVal)
171627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve      if (!defsOnly ||
172627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve          notDefsAndUses && O.isDefOnly() ||
173627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve          !notDefsAndUses && !O.isUseOnly())
174e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve        {
175e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve          O.getMachineOperand().value = newVal;
176e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve          ++numSubst;
177e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve        }
178627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve      else
179627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve        someArgsWereIgnored = true;
180e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
181e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  // Subsitute implicit refs
182a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  for (unsigned i=0, N=getNumImplicitRefs(); i < N; ++i)
18327a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner    if (getImplicitRef(i) == oldVal)
184627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve      if (!defsOnly ||
185627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve          notDefsAndUses && getImplicitOp(i).opIsDefOnly() ||
186627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve          !notDefsAndUses && !getImplicitOp(i).opIsUse())
187e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve        {
188a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve          getImplicitOp(i).value = newVal;
189e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve          ++numSubst;
190e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve        }
191627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve      else
192627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve        someArgsWereIgnored = true;
193e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
194e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  return numSubst;
195e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve}
196e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
197e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
1987a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Advevoid
1997a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. AdveMachineInstr::dump() const
2007a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve{
2017a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  cerr << "  " << *this;
20270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
20370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
2048c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Advestatic inline std::ostream&
2058c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. AdveOutputValue(std::ostream &os, const Value* val)
20693240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve{
20793240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve  os << "(val ";
208627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve  os << (void*) val;                    // print address always
20993240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve  if (val && val->hasName())
210627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve    os << " " << val->getName() << ")"; // print name also, if available
211627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve  return os;
21293240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve}
21393240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve
2142a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattnerstatic inline void OutputReg(std::ostream &os, unsigned RegNo,
2152a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner                             const MRegisterInfo *MRI = 0) {
2162a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner  if (MRI) {
2172a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner    if (RegNo < MRegisterInfo::FirstVirtualRegister)
2182a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner      os << "%" << MRI->get(RegNo).Name;
2192a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner    else
2202a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner      os << "%reg" << RegNo;
2212a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner  } else
2222a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner    os << "%mreg(" << RegNo << ")";
2238c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve}
2248c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve
2251049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattnerstatic void print(const MachineOperand &MO, std::ostream &OS,
2261049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner                  const TargetMachine &TM) {
2272a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner  const MRegisterInfo *MRI = TM.getRegisterInfo();
2281049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  bool CloseParen = true;
2291049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  if (MO.opHiBits32())
2301049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << "%lm(";
2311049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  else if (MO.opLoBits32())
2321049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << "%lo(";
2331049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  else if (MO.opHiBits64())
2341049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << "%hh(";
2351049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  else if (MO.opLoBits64())
2361049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << "%hm(";
2371049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  else
2381049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    CloseParen = false;
2391049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
2401049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  switch (MO.getType()) {
2411049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  case MachineOperand::MO_VirtualRegister:
2421049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    if (MO.getVRegValue()) {
2431049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      OS << "%reg";
2441049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      OutputValue(OS, MO.getVRegValue());
2451049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      if (MO.hasAllocatedReg())
2461049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner        OS << "==";
2471049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    }
2481049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    if (MO.hasAllocatedReg())
2492a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner      OutputReg(OS, MO.getAllocatedRegNum(), MRI);
2501049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
2511049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  case MachineOperand::MO_CCRegister:
2521049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << "%ccreg";
2531049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OutputValue(OS, MO.getVRegValue());
2541049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    if (MO.hasAllocatedReg()) {
2551049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      OS << "==";
2562a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner      OutputReg(OS, MO.getAllocatedRegNum(), MRI);
2571049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    }
2581049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
2591049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  case MachineOperand::MO_MachineRegister:
2602a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner    OutputReg(OS, MO.getMachineRegNum(), MRI);
2611049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
2621049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  case MachineOperand::MO_SignExtendedImmed:
2631049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << (long)MO.getImmedValue();
2641049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
2651049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  case MachineOperand::MO_UnextendedImmed:
2661049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << (long)MO.getImmedValue();
2671049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
2681049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  case MachineOperand::MO_PCRelativeDisp: {
2691049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    const Value* opVal = MO.getVRegValue();
2701049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal);
2711049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << "%disp(" << (isLabel? "label " : "addr-of-val ");
2721049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    if (opVal->hasName())
2731049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      OS << opVal->getName();
2741049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    else
2751049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      OS << (const void*) opVal;
2761049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << ")";
2771049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
2781049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  }
2792109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner  case MachineOperand::MO_MachineBasicBlock:
2802109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner    OS << "bb<"
2812109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner       << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName()
2822109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner       << "," << (void*)MO.getMachineBasicBlock()->getBasicBlock() << ">";
2832109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner    break;
28410cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner  case MachineOperand::MO_FrameIndex:
28510cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    OS << "<fi#" << MO.getFrameIndex() << ">";
28610cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    break;
2878d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  case MachineOperand::MO_ConstantPoolIndex:
2888d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    OS << "<cp#" << MO.getConstantPoolIndex() << ">";
2898d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    break;
2908d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  case MachineOperand::MO_GlobalAddress:
2918d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">";
2928d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    break;
2938d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  case MachineOperand::MO_ExternalSymbol:
2948d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    OS << "<es:" << MO.getSymbolName() << ">";
2958d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    break;
2961049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  default:
2971049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    assert(0 && "Unrecognized operand type");
2981049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  }
2991049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
3001049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  if (CloseParen)
3011049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << ")";
3021049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner}
3031049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
304af55be15dfa5321f470ce9734fabd858f5af7a88Chris Lattnervoid MachineInstr::print(std::ostream &OS, const TargetMachine &TM) const {
3056a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner  unsigned StartOp = 0;
3066a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner
3076a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner   // Specialize printing if op#0 is definition
3085f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve  if (getNumOperands() &&
3095f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve      (getOperand(0).opIsDefOnly() || getOperand(0).opIsDefAndUse())) {
3106a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    ::print(getOperand(0), OS, TM);
3116a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    OS << " = ";
3126a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    ++StartOp;   // Don't print this operand again!
3136a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner  }
3141049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  OS << TM.getInstrInfo().getName(getOpcode());
3156a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner
3166a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner  for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) {
3175f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve    const MachineOperand& mop = getOperand(i);
3186a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    if (i != StartOp)
3196a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner      OS << ",";
3206a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    OS << " ";
3215f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve    ::print(mop, OS, TM);
3226a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner
3235f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve    if (mop.opIsDefAndUse())
3241049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      OS << "<def&use>";
3255f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve    else if (mop.opIsDefOnly())
3261049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      OS << "<def>";
3271049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  }
3286a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner
3291049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  // code for printing implict references
3301049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  if (getNumImplicitRefs()) {
3311049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << "\tImplicitRefs: ";
3321049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    for(unsigned i = 0, e = getNumImplicitRefs(); i != e; ++i) {
3331049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      OS << "\t";
3345f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve      OutputValue(OS, getImplicitRef(i));
3355f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve      if (getImplicitOp(i).opIsDefAndUse())
3361049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner        OS << "<def&use>";
3375f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve      else if (getImplicitOp(i).opIsDefOnly())
3381049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner        OS << "<def>";
3391049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    }
3401049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  }
3411049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
3421049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  OS << "\n";
3431049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner}
3441049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
3451049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
3468d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattnerstd::ostream &operator<<(std::ostream& os, const MachineInstr& MI)
34770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{
3488d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  os << TargetInstrDescriptors[MI.opCode].Name;
34970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
3508d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  for (unsigned i=0, N=MI.getNumOperands(); i < N; i++) {
3518d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    os << "\t" << MI.getOperand(i);
3525f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve    if (MI.getOperand(i).opIsDefOnly())
3538d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner      os << "<d>";
3545f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve    if (MI.getOperand(i).opIsDefAndUse())
3558d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner      os << "<d&u>";
3568d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka  }
35770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
35869917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka  // code for printing implict references
3598d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  unsigned NumOfImpRefs = MI.getNumImplicitRefs();
3608d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  if (NumOfImpRefs > 0) {
36193240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve    os << "\tImplicit: ";
3628d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    for (unsigned z=0; z < NumOfImpRefs; z++) {
3638d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner      OutputValue(os, MI.getImplicitRef(z));
3645f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve      if (MI.getImplicitOp(z).opIsDefOnly()) os << "<d>";
3655f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve      if (MI.getImplicitOp(z).opIsDefAndUse()) os << "<d&u>";
36607c7086bd29b5c7223945cbdeae48494874de38fRuchira Sasanka      os << "\t";
36769917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka    }
36869917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka  }
36993240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve
370697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner  return os << "\n";
37170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
37270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
37310cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattnerstd::ostream &operator<<(std::ostream &OS, const MachineOperand &MO)
3746e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve{
3752109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner  if (MO.opHiBits32())
37610cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    OS << "%lm(";
3772109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner  else if (MO.opLoBits32())
37810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    OS << "%lo(";
3792109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner  else if (MO.opHiBits64())
38010cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    OS << "%hh(";
3812109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner  else if (MO.opLoBits64())
38210cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    OS << "%hm(";
3833bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve
3842109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner  switch (MO.getType())
3856e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    {
3866e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_VirtualRegister:
3878d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner      if (MO.hasAllocatedReg())
38810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner        OutputReg(OS, MO.getAllocatedRegNum());
3898d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner
3908d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner      if (MO.getVRegValue()) {
3918d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner	if (MO.hasAllocatedReg()) OS << "==";
3928d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner	OS << "%vreg";
3938d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner	OutputValue(OS, MO.getVRegValue());
3941049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      }
3953bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
3966e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_CCRegister:
39710cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner      OS << "%ccreg";
39810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner      OutputValue(OS, MO.getVRegValue());
3992109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner      if (MO.hasAllocatedReg()) {
40010cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner        OS << "==";
40110cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner        OutputReg(OS, MO.getAllocatedRegNum());
4021049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      }
4033bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
4043bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    case MachineOperand::MO_MachineRegister:
40510cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner      OutputReg(OS, MO.getMachineRegNum());
4063bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
4076e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_SignExtendedImmed:
40810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner      OS << (long)MO.getImmedValue();
4093bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
4106e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_UnextendedImmed:
41110cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner      OS << (long)MO.getImmedValue();
4123bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
4136e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_PCRelativeDisp:
414e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve      {
4152109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner        const Value* opVal = MO.getVRegValue();
4164d669b510c1d609c6b3fe98ac14ae38bd7c011f6Chris Lattner        bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal);
41710cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner        OS << "%disp(" << (isLabel? "label " : "addr-of-val ");
418d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve        if (opVal->hasName())
41910cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner          OS << opVal->getName();
420d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve        else
42110cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner          OS << (const void*) opVal;
42210cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner        OS << ")";
4233bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve        break;
424e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve      }
4252109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner    case MachineOperand::MO_MachineBasicBlock:
42610cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner      OS << "bb<"
4272109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner         << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName()
4282109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner         << "," << (void*)MO.getMachineBasicBlock()->getBasicBlock() << ">";
4292109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner      break;
43010cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    case MachineOperand::MO_FrameIndex:
43110cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner      OS << "<fi#" << MO.getFrameIndex() << ">";
43210cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner      break;
4338d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    case MachineOperand::MO_ConstantPoolIndex:
4348d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner      OS << "<cp#" << MO.getConstantPoolIndex() << ">";
4358d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner      break;
4368d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    case MachineOperand::MO_GlobalAddress:
4378d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner      OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">";
4388d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner      break;
4398d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    case MachineOperand::MO_ExternalSymbol:
4408d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner      OS << "<es:" << MO.getSymbolName() << ">";
4418d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner      break;
4426e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    default:
4436e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve      assert(0 && "Unrecognized operand type");
4446e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve      break;
4456e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    }
446e6fdb11e1ae823d69e646e76828ccb5d427a9d3aChris Lattner
4472109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner  if (MO.flags &
4483bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      (MachineOperand::HIFLAG32 | MachineOperand::LOFLAG32 |
4493bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve       MachineOperand::HIFLAG64 | MachineOperand::LOFLAG64))
45010cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    OS << ")";
4513bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve
45210cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner  return OS;
45370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
454