MachineInstr.cpp revision 0c63e03e04d3982e1913479bba404c3debc9a27e
1035dfbe7f2d109008d2d62d9f2a67efb477a7ab6Chris Lattner//===-- MachineInstr.cpp --------------------------------------------------===//
270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve//
3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//                     The LLVM Compiler Infrastructure
4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
5b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// This file was developed by the LLVM research group and is distributed under
6b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details.
7b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===//
921326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke//
1021326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke// Methods common to all machine instructions.
1121326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke//
1221326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke// FIXME: Now that MachineInstrs have parent pointers, they should always
1321326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke// print themselves using their MachineFunction's TargetMachine.
1421326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke//
15035dfbe7f2d109008d2d62d9f2a67efb477a7ab6Chris Lattner//===----------------------------------------------------------------------===//
1670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
17822b4fb896846b87dd11a330ae13f2239329aeefChris Lattner#include "llvm/CodeGen/MachineInstr.h"
188517e1f0beea9b5e47974f083396d53294c390adChris Lattner#include "llvm/CodeGen/MachineFunction.h"
193801f6d38371b734d9de2fb8394ca75d2bf190ebChris Lattner#include "llvm/Value.h"
201049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner#include "llvm/Target/TargetMachine.h"
213501feab811c86c9659248a4875fc31a3165f84dChris Lattner#include "llvm/Target/TargetInstrInfo.h"
222a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner#include "llvm/Target/MRegisterInfo.h"
23aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos#include "Support/LeakDetector.h"
240742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattnerusing namespace llvm;
25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
26f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// Global variable holding an array of descriptors for machine instructions.
27f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// The actual object needs to be created separately for each target machine.
283501feab811c86c9659248a4875fc31a3165f84dChris Lattner// This variable is initialized and reset by class TargetInstrInfo.
29f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner//
30f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// FIXME: This should be a property of the target so that more than one target
31f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// at a time can be active...
32f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner//
3311d1f21e1d400826ccc3cae5702d6a626baa906bChris Lattnernamespace llvm {
340742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner  extern const TargetInstrDescriptor *TargetInstrDescriptors;
350742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner}
3669917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka
371885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve// Constructor for instructions with variable #operands
38ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis EvlogimenosMachineInstr::MachineInstr(short opcode, unsigned numOperands)
39ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis Evlogimenos  : Opcode(opcode),
40ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis Evlogimenos    numImplicitRefs(0),
41ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis Evlogimenos    operands(numOperands, MachineOperand()),
42ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis Evlogimenos    parent(0) {
43aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  // Make sure that we get added to a machine basicblock
44aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  LeakDetector::addGarbageObject(this);
45413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner}
46413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner
47ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - This constructor only does a _reserve_ of the operands,
48ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// not a resize for them.  It is expected that if you use this that you call
49ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// add* methods below to fill up the operands, instead of the Set methods.
50ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// Eventually, the "resizing" ctors will be phased out.
51ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner///
5221326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian GaekeMachineInstr::MachineInstr(short opcode, unsigned numOperands, bool XX, bool YY)
5321326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke  : Opcode(opcode), numImplicitRefs(0), parent(0) {
547279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner  operands.reserve(numOperands);
55aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  // Make sure that we get added to a machine basicblock
56aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  LeakDetector::addGarbageObject(this);
577279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner}
587279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner
59ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - Work exactly the same as the ctor above, except that the
60ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr is created and added to the end of the specified basic block.
61ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner///
62ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis EvlogimenosMachineInstr::MachineInstr(MachineBasicBlock *MBB, short opcode,
63ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner                           unsigned numOperands)
6421326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke  : Opcode(opcode), numImplicitRefs(0), parent(0) {
65ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner  assert(MBB && "Cannot use inserting ctor with null basic block!");
66ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner  operands.reserve(numOperands);
67aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  // Make sure that we get added to a machine basicblock
68aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  LeakDetector::addGarbageObject(this);
69ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner  MBB->push_back(this);  // Add instruction to end of basic block!
70ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner}
71ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner
72466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner///MachineInstr ctor - Copies MachineInstr arg exactly
73466b534a570f574ed485d875bbca8454f68dcb52Tanya LattnerMachineInstr::MachineInstr(const MachineInstr &MI) {
74466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner  Opcode = MI.getOpcode();
75466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner  numImplicitRefs = MI.getNumImplicitRefs();
76b5159ed0cb7943e5938782f7693beb18342165ceTanya Lattner  operands.reserve(MI.getNumOperands());
77b5159ed0cb7943e5938782f7693beb18342165ceTanya Lattner
78466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner  //Add operands
79466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner  for(unsigned i=0; i < MI.getNumOperands(); ++i)
80466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner    operands.push_back(MachineOperand(MI.getOperand(i)));
810c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner
820c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner  //Set parent, next, and prev to null
830c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner  parent = 0;
840c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner  prev = 0;
850c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner  next = 0;
860c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner
87466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner}
88466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner
89466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner
90aad5c0505183a5b7913f1a443a1f0650122551ccAlkis EvlogimenosMachineInstr::~MachineInstr()
91aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos{
92aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  LeakDetector::removeGarbageObject(this);
93aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos}
94aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos
95466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner///clone - Create a copy of 'this' instruction that is identical in
96466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner///all ways except the following: The instruction has no parent The
97466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner///instruction has no name
980c63e03e04d3982e1913479bba404c3debc9a27eTanya LattnerMachineInstr* MachineInstr::clone() const {
99b5159ed0cb7943e5938782f7693beb18342165ceTanya Lattner  return new MachineInstr(*this);
100466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner}
101466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner
10221326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// OperandComplete - Return true if it's illegal to add a new operand
10321326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke///
1042a90ba60175f93e7438165d8423100aa573c16c5Chris Lattnerbool MachineInstr::OperandsComplete() const {
1052a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner  int NumOperands = TargetInstrDescriptors[Opcode].numOperands;
106a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  if (NumOperands >= 0 && getNumOperands() >= (unsigned)NumOperands)
1073497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve    return true;  // Broken: we have all the operands of this instruction!
108413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  return false;
10970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
11070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
11121326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// replace - Support for replacing opcode and operands of a MachineInstr in
11221326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// place. This only resets the size of the operand vector and initializes it.
11321326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// The new operands must be set explicitly later.
11421326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke///
115ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis Evlogimenosvoid MachineInstr::replace(short opcode, unsigned numOperands) {
116a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  assert(getNumImplicitRefs() == 0 &&
117a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve         "This is probably broken because implicit refs are going to be lost.");
1182a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner  Opcode = opcode;
119e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve  operands.clear();
120413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  operands.resize(numOperands, MachineOperand());
121466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner
122e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve}
123e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve
124a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattnervoid MachineInstr::SetMachineOperandVal(unsigned i,
125a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattner                                        MachineOperand::MachineOperandType opTy,
126a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattner                                        Value* V) {
127a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  assert(i < operands.size());          // may be explicit or implicit op
128a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattner  operands[i].opType = opTy;
129c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke  operands[i].contents.value = V;
130572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].regNum = -1;
13170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
13270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
13370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid
134572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris LattnerMachineInstr::SetMachineOperandConst(unsigned i,
13521326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke                                     MachineOperand::MachineOperandType opTy,
136561c0107b20e9be4a02bad57a68ae9e4f96461a9Chris Lattner                                     int intValue) {
137a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  assert(i < getNumOperands());          // must be explicit op
1382a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner  assert(TargetInstrDescriptors[Opcode].resultPos != (int) i &&
139c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve         "immed. constant cannot be defined");
140572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
14121326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke  operands[i].opType = opTy;
142c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke  operands[i].contents.value = NULL;
143c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke  operands[i].contents.immedVal = intValue;
144572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].regNum = -1;
145572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].flags = 0;
14670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
14770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
148a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattnervoid MachineInstr::SetMachineOperandReg(unsigned i, int regNum) {
149a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  assert(i < getNumOperands());          // must be explicit op
150572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
1512f305989b395a0a8bf00c4b9dc140a6df051245eChris Lattner  operands[i].opType = MachineOperand::MO_MachineRegister;
152c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke  operands[i].contents.value = NULL;
153572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].regNum = regNum;
15470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
15570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
15621326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke// Used only by the SPARC back-end.
1572a90ba60175f93e7438165d8423100aa573c16c5Chris Lattnervoid MachineInstr::SetRegForOperand(unsigned i, int regNum) {
158a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  assert(i < getNumOperands());          // must be explicit op
1597a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve  operands[i].setRegForValue(regNum);
1607a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve}
1617a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve
16221326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke// Used only by the SPARC back-end.
1632a90ba60175f93e7438165d8423100aa573c16c5Chris Lattnervoid MachineInstr::SetRegForImplicitRef(unsigned i, int regNum) {
1643497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve  getImplicitOp(i).setRegForValue(regNum);
1653497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve}
1663497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve
16721326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// substituteValue - Substitute all occurrences of Value* oldVal with newVal
16821326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// in all operands and all implicit refs. If defsOnly == true, substitute defs
16921326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// only.
17021326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke///
17121326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// FIXME: Fold this into its single caller, at SparcInstrSelection.cpp:2865,
17221326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// or make it a static function in that file.
17321326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke///
174e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adveunsigned
175627eb31cd791f808eaa048478d01222577a30a1aVikram S. AdveMachineInstr::substituteValue(const Value* oldVal, Value* newVal,
176627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve                              bool defsOnly, bool notDefsAndUses,
177627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve                              bool& someArgsWereIgnored)
178e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve{
1792010f7baec18914b8a5d1b2b4c3c21511fa6e25dVikram S. Adve  assert((!defsOnly || !notDefsAndUses) &&
1802010f7baec18914b8a5d1b2b4c3c21511fa6e25dVikram S. Adve         "notDefsAndUses is irrelevant if defsOnly == true.");
181627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve
182e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  unsigned numSubst = 0;
183e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
1846eba07a6a3dacec09aefa54a305b06c98b0c86c1Misha Brukman  // Substitute operands
185e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  for (MachineInstr::val_op_iterator O = begin(), E = end(); O != E; ++O)
186e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve    if (*O == oldVal)
187627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve      if (!defsOnly ||
1884d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos          notDefsAndUses && (O.isDef() && !O.isUse()) ||
1894d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos          !notDefsAndUses && O.isDef())
190e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve        {
191c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke          O.getMachineOperand().contents.value = newVal;
192e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve          ++numSubst;
193e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve        }
194627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve      else
195627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve        someArgsWereIgnored = true;
196e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
1976eba07a6a3dacec09aefa54a305b06c98b0c86c1Misha Brukman  // Substitute implicit refs
198a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  for (unsigned i=0, N=getNumImplicitRefs(); i < N; ++i)
19927a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner    if (getImplicitRef(i) == oldVal)
200627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve      if (!defsOnly ||
2014d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos          notDefsAndUses && (getImplicitOp(i).isDef() && !getImplicitOp(i).isUse()) ||
2024d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos          !notDefsAndUses && getImplicitOp(i).isDef())
203e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve        {
204c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke          getImplicitOp(i).contents.value = newVal;
205e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve          ++numSubst;
206e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve        }
207627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve      else
208627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve        someArgsWereIgnored = true;
209e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
210e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve  return numSubst;
211e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve}
212e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve
21321326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaekevoid MachineInstr::dump() const {
214925b771dc378d6c88da44cd5b6650f2758c3c0a7Chris Lattner  std::cerr << "  " << *this;
21570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
21670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
21721326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaekestatic inline std::ostream& OutputValue(std::ostream &os, const Value* val) {
21893240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve  os << "(val ";
219627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve  os << (void*) val;                    // print address always
22093240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve  if (val && val->hasName())
22121326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke    os << " " << val->getName(); // print name also, if available
22221326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke  os << ")";
223627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve  return os;
22493240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve}
22593240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve
2262a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattnerstatic inline void OutputReg(std::ostream &os, unsigned RegNo,
2272a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner                             const MRegisterInfo *MRI = 0) {
228ddcfd9e6fafdbbe5c973477e537119e73c115ee4Alkis Evlogimenos  if (!RegNo || MRegisterInfo::isPhysicalRegister(RegNo)) {
2298517e1f0beea9b5e47974f083396d53294c390adChris Lattner    if (MRI)
2302a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner      os << "%" << MRI->get(RegNo).Name;
2312a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner    else
2328517e1f0beea9b5e47974f083396d53294c390adChris Lattner      os << "%mreg(" << RegNo << ")";
2332a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner  } else
2348517e1f0beea9b5e47974f083396d53294c390adChris Lattner    os << "%reg" << RegNo;
2358c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve}
2368c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve
2371049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattnerstatic void print(const MachineOperand &MO, std::ostream &OS,
2381049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner                  const TargetMachine &TM) {
2392a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner  const MRegisterInfo *MRI = TM.getRegisterInfo();
2401049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  bool CloseParen = true;
2414d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos  if (MO.isHiBits32())
2421049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << "%lm(";
2434d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos  else if (MO.isLoBits32())
2441049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << "%lo(";
2454d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos  else if (MO.isHiBits64())
2461049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << "%hh(";
2474d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos  else if (MO.isLoBits64())
2481049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << "%hm(";
2491049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  else
2501049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    CloseParen = false;
2511049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
2521049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  switch (MO.getType()) {
2531049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  case MachineOperand::MO_VirtualRegister:
2541049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    if (MO.getVRegValue()) {
2551049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      OS << "%reg";
2561049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      OutputValue(OS, MO.getVRegValue());
2571049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      if (MO.hasAllocatedReg())
2581049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner        OS << "==";
2591049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    }
2601049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    if (MO.hasAllocatedReg())
261be766c72464116a445a02b542a450c4274bab5d0Alkis Evlogimenos      OutputReg(OS, MO.getReg(), MRI);
2621049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
2631049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  case MachineOperand::MO_CCRegister:
2641049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << "%ccreg";
2651049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OutputValue(OS, MO.getVRegValue());
2661049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    if (MO.hasAllocatedReg()) {
2671049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      OS << "==";
268be766c72464116a445a02b542a450c4274bab5d0Alkis Evlogimenos      OutputReg(OS, MO.getReg(), MRI);
2691049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    }
2701049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
2711049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  case MachineOperand::MO_MachineRegister:
2722a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner    OutputReg(OS, MO.getMachineRegNum(), MRI);
2731049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
2741049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  case MachineOperand::MO_SignExtendedImmed:
2751049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << (long)MO.getImmedValue();
2761049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
2771049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  case MachineOperand::MO_UnextendedImmed:
2781049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << (long)MO.getImmedValue();
2791049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
2801049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  case MachineOperand::MO_PCRelativeDisp: {
2811049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    const Value* opVal = MO.getVRegValue();
2821049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal);
2831049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << "%disp(" << (isLabel? "label " : "addr-of-val ");
2841049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    if (opVal->hasName())
2851049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      OS << opVal->getName();
2861049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    else
2871049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      OS << (const void*) opVal;
2881049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << ")";
2891049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
2901049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  }
2912109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner  case MachineOperand::MO_MachineBasicBlock:
2922109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner    OS << "bb<"
2932109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner       << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName()
2942109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner       << "," << (void*)MO.getMachineBasicBlock()->getBasicBlock() << ">";
2952109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner    break;
29610cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner  case MachineOperand::MO_FrameIndex:
29710cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    OS << "<fi#" << MO.getFrameIndex() << ">";
29810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    break;
2998d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  case MachineOperand::MO_ConstantPoolIndex:
3008d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    OS << "<cp#" << MO.getConstantPoolIndex() << ">";
3018d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    break;
3028d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  case MachineOperand::MO_GlobalAddress:
3038d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">";
3048d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    break;
3058d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  case MachineOperand::MO_ExternalSymbol:
3068d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    OS << "<es:" << MO.getSymbolName() << ">";
3078d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    break;
3081049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  default:
3091049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    assert(0 && "Unrecognized operand type");
3101049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  }
3111049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
3121049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  if (CloseParen)
3131049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << ")";
3141049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner}
3151049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
316af55be15dfa5321f470ce9734fabd858f5af7a88Chris Lattnervoid MachineInstr::print(std::ostream &OS, const TargetMachine &TM) const {
3176a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner  unsigned StartOp = 0;
3186a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner
3196a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner   // Specialize printing if op#0 is definition
3204d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos  if (getNumOperands() && getOperand(0).isDef() && !getOperand(0).isUse()) {
3210742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner    ::print(getOperand(0), OS, TM);
3226a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    OS << " = ";
3236a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    ++StartOp;   // Don't print this operand again!
3246a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner  }
3251049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  OS << TM.getInstrInfo().getName(getOpcode());
3266a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner
3276a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner  for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) {
3285f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve    const MachineOperand& mop = getOperand(i);
3296a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    if (i != StartOp)
3306a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner      OS << ",";
3316a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    OS << " ";
3320742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner    ::print(mop, OS, TM);
3336a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner
3344d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos    if (mop.isDef())
3354d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos      if (mop.isUse())
3364d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos        OS << "<def&use>";
3374d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos      else
3384d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos        OS << "<def>";
3391049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  }
3406a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner
3416eba07a6a3dacec09aefa54a305b06c98b0c86c1Misha Brukman  // code for printing implicit references
3421049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  if (getNumImplicitRefs()) {
3431049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << "\tImplicitRefs: ";
3441049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    for(unsigned i = 0, e = getNumImplicitRefs(); i != e; ++i) {
3451049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      OS << "\t";
3465f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve      OutputValue(OS, getImplicitRef(i));
3474d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos      if (getImplicitOp(i).isDef())
3484d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos          if (getImplicitOp(i).isUse())
3494d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos            OS << "<def&use>";
3504d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos          else
3514d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos            OS << "<def>";
3521049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    }
3531049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  }
3541049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
3551049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  OS << "\n";
3561049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner}
3571049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
35811d1f21e1d400826ccc3cae5702d6a626baa906bChris Lattnernamespace llvm {
3598517e1f0beea9b5e47974f083396d53294c390adChris Lattnerstd::ostream &operator<<(std::ostream &os, const MachineInstr &MI) {
3608517e1f0beea9b5e47974f083396d53294c390adChris Lattner  // If the instruction is embedded into a basic block, we can find the target
3618517e1f0beea9b5e47974f083396d53294c390adChris Lattner  // info for the instruction.
3628517e1f0beea9b5e47974f083396d53294c390adChris Lattner  if (const MachineBasicBlock *MBB = MI.getParent()) {
3638517e1f0beea9b5e47974f083396d53294c390adChris Lattner    const MachineFunction *MF = MBB->getParent();
3648517e1f0beea9b5e47974f083396d53294c390adChris Lattner    MI.print(os, MF->getTarget());
3658517e1f0beea9b5e47974f083396d53294c390adChris Lattner    return os;
3668517e1f0beea9b5e47974f083396d53294c390adChris Lattner  }
3678517e1f0beea9b5e47974f083396d53294c390adChris Lattner
3688517e1f0beea9b5e47974f083396d53294c390adChris Lattner  // Otherwise, print it out in the "raw" format without symbolic register names
3698517e1f0beea9b5e47974f083396d53294c390adChris Lattner  // and such.
3702a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner  os << TargetInstrDescriptors[MI.getOpcode()].Name;
37170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
3728d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  for (unsigned i=0, N=MI.getNumOperands(); i < N; i++) {
3738d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    os << "\t" << MI.getOperand(i);
3744d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos    if (MI.getOperand(i).isDef())
3754d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos      if (MI.getOperand(i).isUse())
3764d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos        os << "<d&u>";
3774d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos      else
3784d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos        os << "<d>";
3798d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka  }
38070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
3816eba07a6a3dacec09aefa54a305b06c98b0c86c1Misha Brukman  // code for printing implicit references
3828d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  unsigned NumOfImpRefs = MI.getNumImplicitRefs();
3838d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  if (NumOfImpRefs > 0) {
38493240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve    os << "\tImplicit: ";
3858d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    for (unsigned z=0; z < NumOfImpRefs; z++) {
3868d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner      OutputValue(os, MI.getImplicitRef(z));
3874d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos      if (MI.getImplicitOp(z).isDef())
3884d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos          if (MI.getImplicitOp(z).isUse())
3894d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos            os << "<d&u>";
3904d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos          else
3914d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos            os << "<d>";
39207c7086bd29b5c7223945cbdeae48494874de38fRuchira Sasanka      os << "\t";
39369917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka    }
39469917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka  }
39593240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve
396697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner  return os << "\n";
39770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
39870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
39921326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaekestd::ostream &operator<<(std::ostream &OS, const MachineOperand &MO) {
4004d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos  if (MO.isHiBits32())
40110cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    OS << "%lm(";
4024d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos  else if (MO.isLoBits32())
40310cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    OS << "%lo(";
4044d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos  else if (MO.isHiBits64())
40510cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    OS << "%hh(";
4064d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos  else if (MO.isLoBits64())
40710cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    OS << "%hm(";
4083bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve
4092109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner  switch (MO.getType())
4106e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    {
4116e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_VirtualRegister:
4128d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner      if (MO.hasAllocatedReg())
413be766c72464116a445a02b542a450c4274bab5d0Alkis Evlogimenos        OutputReg(OS, MO.getReg());
4148d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner
4158d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner      if (MO.getVRegValue()) {
4168d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner	if (MO.hasAllocatedReg()) OS << "==";
4178d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner	OS << "%vreg";
4188d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner	OutputValue(OS, MO.getVRegValue());
4191049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      }
4203bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
4216e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_CCRegister:
42210cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner      OS << "%ccreg";
42310cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner      OutputValue(OS, MO.getVRegValue());
4242109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner      if (MO.hasAllocatedReg()) {
42510cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner        OS << "==";
426be766c72464116a445a02b542a450c4274bab5d0Alkis Evlogimenos        OutputReg(OS, MO.getReg());
4271049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      }
4283bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
4293bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve    case MachineOperand::MO_MachineRegister:
43010cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner      OutputReg(OS, MO.getMachineRegNum());
4313bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
4326e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_SignExtendedImmed:
43310cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner      OS << (long)MO.getImmedValue();
4343bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
4356e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_UnextendedImmed:
43610cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner      OS << (long)MO.getImmedValue();
4373bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve      break;
4386e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    case MachineOperand::MO_PCRelativeDisp:
439e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve      {
4402109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner        const Value* opVal = MO.getVRegValue();
4414d669b510c1d609c6b3fe98ac14ae38bd7c011f6Chris Lattner        bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal);
44210cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner        OS << "%disp(" << (isLabel? "label " : "addr-of-val ");
443d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve        if (opVal->hasName())
44410cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner          OS << opVal->getName();
445d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve        else
44610cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner          OS << (const void*) opVal;
44710cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner        OS << ")";
4483bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve        break;
449e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve      }
4502109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner    case MachineOperand::MO_MachineBasicBlock:
45110cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner      OS << "bb<"
4522109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner         << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName()
4532109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner         << "," << (void*)MO.getMachineBasicBlock()->getBasicBlock() << ">";
4542109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner      break;
45510cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    case MachineOperand::MO_FrameIndex:
45610cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner      OS << "<fi#" << MO.getFrameIndex() << ">";
45710cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner      break;
4588d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    case MachineOperand::MO_ConstantPoolIndex:
4598d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner      OS << "<cp#" << MO.getConstantPoolIndex() << ">";
4608d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner      break;
4618d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    case MachineOperand::MO_GlobalAddress:
4628d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner      OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">";
4638d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner      break;
4648d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    case MachineOperand::MO_ExternalSymbol:
4658d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner      OS << "<es:" << MO.getSymbolName() << ">";
4668d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner      break;
4676e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    default:
4686e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve      assert(0 && "Unrecognized operand type");
4696e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve      break;
4706e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    }
471e6fdb11e1ae823d69e646e76828ccb5d427a9d3aChris Lattner
4720742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner  if (MO.isHiBits32() || MO.isLoBits32() || MO.isHiBits64() || MO.isLoBits64())
47310cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    OS << ")";
4743bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve
47510cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner  return OS;
47670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
477d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
47811d1f21e1d400826ccc3cae5702d6a626baa906bChris Lattner}
479