MachineInstr.cpp revision f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41
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),
22413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner    operands(TargetInstrDescriptors[_opCode].numOperands, MachineOperand()) {
231885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve  assert(TargetInstrDescriptors[_opCode].numOperands >= 0);
241885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve}
251885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve
261885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve// Constructor for instructions with variable #operands
27b98a53f201fd3652f4b7e37d1f2cb3b9b0775d45Chris LattnerMachineInstr::MachineInstr(MachineOpCode OpCode, unsigned  numOperands)
289a8e4121aa4121100fb562134c098aeb38f70b37Chris Lattner  : opCode(OpCode), operands(numOperands, MachineOperand()) {
29413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner}
30413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner
317279122e668816bed0d4f38d3392bbab0140fad0Chris LattnerMachineInstr::MachineInstr(MachineOpCode Opcode, unsigned numOperands,
329a8e4121aa4121100fb562134c098aeb38f70b37Chris Lattner                           bool XX, bool YY) : opCode(Opcode) {
337279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner  operands.reserve(numOperands);
347279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner}
357279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner
36413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner// OperandComplete - Return true if it's illegal to add a new operand
37413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattnerbool MachineInstr::OperandsComplete() const {
38413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  int NumOperands = TargetInstrDescriptors[opCode].numOperands;
39413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  if (NumOperands >= 0 && operands.size() >= (unsigned)NumOperands)
40413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner    return true;  // Broken!
41413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  return false;
4270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
4370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
44413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner
45e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve//
46e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// Support for replacing opcode and operands of a MachineInstr in place.
47e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// This only resets the size of the operand vector and initializes it.
48e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// The new operands must be set explicitly later.
49e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve//
50b98a53f201fd3652f4b7e37d1f2cb3b9b0775d45Chris Lattnervoid MachineInstr::replace(MachineOpCode Opcode, unsigned numOperands) {
51413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  opCode = Opcode;
52e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve  operands.clear();
53413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  operands.resize(numOperands, MachineOperand());
54e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve}
55e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve
5670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid
57413746e9833d97a8b463ef6a788aa326cf3829a2Chris LattnerMachineInstr::SetMachineOperandVal(unsigned i,
587a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve                                   MachineOperand::MachineOperandType opType,
59572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner                                   Value* V,
600c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner                                   bool isdef,
610c0edf8afc35a42b15a24ebb5fa5f3fc674290aeChris Lattner                                   bool isDefAndUse)
6270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{
636a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve  assert(i < operands.size());
64572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].opType = opType;
65572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].value = V;
66572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].regNum = -1;
67572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].flags = 0;
68572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
693bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  if (isdef || TargetInstrDescriptors[opCode].resultPos == (int) i)
703bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    operands[i].markDef();
713bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  if (isDefAndUse)
723bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    operands[i].markDefAndUse();
7370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
7470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
7570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid
76572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris LattnerMachineInstr::SetMachineOperandConst(unsigned i,
7770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve				MachineOperand::MachineOperandType operandType,
78c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve                                     int64_t intValue)
7970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{
806a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve  assert(i < operands.size());
81c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve  assert(TargetInstrDescriptors[opCode].resultPos != (int) i &&
82c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve         "immed. constant cannot be defined");
83572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
84572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].opType = operandType;
85572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].value = NULL;
86572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].immedVal = intValue;
87572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].regNum = -1;
88572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].flags = 0;
8970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
9070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
9170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid
92572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris LattnerMachineInstr::SetMachineOperandReg(unsigned i,
93c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve                                   int regNum,
942f305989b395a0a8bf00c4b9dc140a6df051245eChris Lattner                                   bool isdef) {
956a175e01eb164baac5cc16311c474ff644ce17c1Vikram S. Adve  assert(i < operands.size());
96572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
972f305989b395a0a8bf00c4b9dc140a6df051245eChris Lattner  operands[i].opType = MachineOperand::MO_MachineRegister;
98572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].value = NULL;
99572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].regNum = regNum;
100572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].flags = 0;
101572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
1023bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  if (isdef || TargetInstrDescriptors[opCode].resultPos == (int) i)
1033bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    operands[i].markDef();
10427a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner  insertUsedReg(regNum);
10570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
10670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
10770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid
1087a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. AdveMachineInstr::SetRegForOperand(unsigned i, int regNum)
10970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{
1107a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  operands[i].setRegForValue(regNum);
11127a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner  insertUsedReg(regNum);
1127a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve}
1137a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve
1147a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve
115e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve// Subsitute all occurrences of Value* oldVal with newVal in all operands
116e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve// and all implicit refs.  If defsOnly == true, substitute defs only.
117e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adveunsigned
118e2a78e31862c2b6142491db5a67065756d6870beVikram S. AdveMachineInstr::substituteValue(const Value* oldVal, Value* newVal, bool defsOnly)
119e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve{
120e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  unsigned numSubst = 0;
121e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
122e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  // Subsitute operands
123e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  for (MachineInstr::val_op_iterator O = begin(), E = end(); O != E; ++O)
124e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve    if (*O == oldVal)
125e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve      if (!defsOnly || O.isDef())
126e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve        {
127e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve          O.getMachineOperand().value = newVal;
128e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve          ++numSubst;
129e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve        }
130e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
131e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  // Subsitute implicit refs
132e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  for (unsigned i=0, N=implicitRefs.size(); i < N; ++i)
13327a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner    if (getImplicitRef(i) == oldVal)
134e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve      if (!defsOnly || implicitRefIsDefined(i))
135e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve        {
13627a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner          implicitRefs[i].Val = newVal;
137e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve          ++numSubst;
138e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve        }
139e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
140e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  return numSubst;
141e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve}
142e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
143e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
1447a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Advevoid
1457a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. AdveMachineInstr::dump() const
1467a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve{
1477a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  cerr << "  " << *this;
14870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
14970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
1508c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Advestatic inline std::ostream&
1518c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. AdveOutputValue(std::ostream &os, const Value* val)
15293240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve{
15393240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve  os << "(val ";
15493240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve  if (val && val->hasName())
1553bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    return os << val->getName() << ")";
15693240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve  else
1573bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    return os << (void*) val << ")";              // print address only
15893240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve}
15993240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve
1608c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Advestatic inline std::ostream&
1618c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. AdveOutputReg(std::ostream &os, unsigned int regNum)
1628c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve{
1638c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve  return os << "%mreg(" << regNum << ")";
1648c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve}
1658c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve
166697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerstd::ostream &operator<<(std::ostream& os, const MachineInstr& minstr)
16770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{
168d9512caca8ec1e5488cdc94b34986c8ab2d447bbChris Lattner  os << TargetInstrDescriptors[minstr.opCode].Name;
16970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
1708d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka  for (unsigned i=0, N=minstr.getNumOperands(); i < N; i++) {
17170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve    os << "\t" << minstr.getOperand(i);
1727a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve    if( minstr.operandIsDefined(i) )
1737a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve      os << "*";
1747a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve    if( minstr.operandIsDefinedAndUsed(i) )
17507c7086bd29b5c7223945cbdeae48494874de38fRuchira Sasanka      os << "*";
1768d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka  }
17770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
17869917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka  // code for printing implict references
17969917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka  unsigned NumOfImpRefs =  minstr.getNumImplicitRefs();
18069917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka  if(  NumOfImpRefs > 0 ) {
18193240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve    os << "\tImplicit: ";
18269917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka    for(unsigned z=0; z < NumOfImpRefs; z++) {
18393240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve      OutputValue(os, minstr.getImplicitRef(z));
1848d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka      if( minstr.implicitRefIsDefined(z)) os << "*";
1857a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve      if( minstr.implicitRefIsDefinedAndUsed(z)) os << "*";
18607c7086bd29b5c7223945cbdeae48494874de38fRuchira Sasanka      os << "\t";
18769917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka    }
18869917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka  }
18993240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve
190697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner  return os << "\n";
19170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
19270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
193697954c15da58bd8b186dbafdedd8b06db770201Chris Lattnerstd::ostream &operator<<(std::ostream &os, const MachineOperand &mop)
1946e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve{
1953bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  if (mop.opHiBits32())
1963bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    os << "%lm(";
1973bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  else if (mop.opLoBits32())
1983bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    os << "%lo(";
1993bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  else if (mop.opHiBits64())
2003bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    os << "%hh(";
2013bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  else if (mop.opLoBits64())
2023bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    os << "%hm(";
2033bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve
2046e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve  switch(mop.opType)
2056e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    {
2066e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_VirtualRegister:
2076e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve      os << "%reg";
2083bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      OutputValue(os, mop.getVRegValue());
2098c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve      if (mop.hasAllocatedReg())
2108c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve        os << "==" << OutputReg(os, mop.getAllocatedRegNum());
2113bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
2126e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_CCRegister:
2136e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve      os << "%ccreg";
2143bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      OutputValue(os, mop.getVRegValue());
2158c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve      if (mop.hasAllocatedReg())
2168c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve        os << "==" << OutputReg(os, mop.getAllocatedRegNum());
2173bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
2183bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    case MachineOperand::MO_MachineRegister:
2198c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve      OutputReg(os, mop.getMachineRegNum());
2203bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
2216e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_SignExtendedImmed:
2223bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      os << (long)mop.immedVal;
2233bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
2246e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_UnextendedImmed:
2253bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      os << (long)mop.immedVal;
2263bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
2276e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_PCRelativeDisp:
228e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve      {
229e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve        const Value* opVal = mop.getVRegValue();
2304d669b510c1d609c6b3fe98ac14ae38bd7c011f6Chris Lattner        bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal);
231d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve        os << "%disp(" << (isLabel? "label " : "addr-of-val ");
232d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve        if (opVal->hasName())
233697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner          os << opVal->getName();
234d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve        else
2357a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve          os << (const void*) opVal;
2363bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve        os << ")";
2373bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve        break;
238e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve      }
2396e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    default:
2406e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve      assert(0 && "Unrecognized operand type");
2416e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve      break;
2426e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    }
243e6fdb11e1ae823d69e646e76828ccb5d427a9d3aChris Lattner
2443bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve  if (mop.flags &
2453bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      (MachineOperand::HIFLAG32 | MachineOperand::LOFLAG32 |
2463bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve       MachineOperand::HIFLAG64 | MachineOperand::LOFLAG64))
2473bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    os << ")";
2483bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve
24970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve  return os;
25070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
251