MachineInstr.cpp revision 943b5e117fe9a087f9aa529a2632c2d32cc22374
1035dfbe7f2d109008d2d62d9f2a67efb477a7ab6Chris Lattner//===-- MachineInstr.cpp --------------------------------------------------===//
2edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman//
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.
7edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman//
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"
23551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/LeakDetector.h"
24954da37bb492b519f5c31dc360f2a142567e08b4Reid Spencer#include <iostream>
25954da37bb492b519f5c31dc360f2a142567e08b4Reid Spencer
260742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattnerusing namespace llvm;
27d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
28f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// Global variable holding an array of descriptors for machine instructions.
29f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// The actual object needs to be created separately for each target machine.
303501feab811c86c9659248a4875fc31a3165f84dChris Lattner// This variable is initialized and reset by class TargetInstrInfo.
31edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman//
32f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// FIXME: This should be a property of the target so that more than one target
33f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// at a time can be active...
34f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner//
3511d1f21e1d400826ccc3cae5702d6a626baa906bChris Lattnernamespace llvm {
360742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner  extern const TargetInstrDescriptor *TargetInstrDescriptors;
370742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner}
3869917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka
39ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - This constructor only does a _reserve_ of the operands,
40ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// not a resize for them.  It is expected that if you use this that you call
41ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// add* methods below to fill up the operands, instead of the Set methods.
42ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// Eventually, the "resizing" ctors will be phased out.
43ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner///
448b915b4ed2c6e43413937ac71c0cbcf476ad1a98Chris LattnerMachineInstr::MachineInstr(short opcode, unsigned numOperands)
4502e5f8dcda4319e05fe49301ab72c386ed859e16Chris Lattner  : Opcode(opcode), parent(0) {
46943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner  Operands.reserve(numOperands);
47aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  // Make sure that we get added to a machine basicblock
48aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  LeakDetector::addGarbageObject(this);
497279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner}
507279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner
51ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - Work exactly the same as the ctor above, except that the
52ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr is created and added to the end of the specified basic block.
53ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner///
54ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis EvlogimenosMachineInstr::MachineInstr(MachineBasicBlock *MBB, short opcode,
55ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner                           unsigned numOperands)
5602e5f8dcda4319e05fe49301ab72c386ed859e16Chris Lattner  : Opcode(opcode), parent(0) {
57ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner  assert(MBB && "Cannot use inserting ctor with null basic block!");
58943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner  Operands.reserve(numOperands);
59aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  // Make sure that we get added to a machine basicblock
60aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  LeakDetector::addGarbageObject(this);
61ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner  MBB->push_back(this);  // Add instruction to end of basic block!
62ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner}
63ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner
64ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman/// MachineInstr ctor - Copies MachineInstr arg exactly
65ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman///
66466b534a570f574ed485d875bbca8454f68dcb52Tanya LattnerMachineInstr::MachineInstr(const MachineInstr &MI) {
67466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner  Opcode = MI.getOpcode();
68943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner  Operands.reserve(MI.getNumOperands());
69b5159ed0cb7943e5938782f7693beb18342165ceTanya Lattner
70ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  // Add operands
71943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner  for (unsigned i = 0; i != MI.getNumOperands(); ++i)
72943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    Operands.push_back(MI.getOperand(i));
730c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner
74ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  // Set parent, next, and prev to null
750c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner  parent = 0;
760c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner  prev = 0;
770c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner  next = 0;
78466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner}
79466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner
80466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner
81ce22e76996d3ff0930716fa60c29df60a7e0481bMisha BrukmanMachineInstr::~MachineInstr() {
82aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  LeakDetector::removeGarbageObject(this);
83aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos}
84aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos
8548d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner/// removeFromParent - This method unlinks 'this' from the containing basic
8648d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner/// block, and returns it, but does not delete it.
8748d7c069c76882475c23de153bda9483cd3c9bb4Chris LattnerMachineInstr *MachineInstr::removeFromParent() {
8848d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner  assert(getParent() && "Not embedded in a basic block!");
8948d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner  getParent()->remove(this);
9048d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner  return this;
9148d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner}
9248d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner
9348d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner
9421326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// OperandComplete - Return true if it's illegal to add a new operand
9521326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke///
962a90ba60175f93e7438165d8423100aa573c16c5Chris Lattnerbool MachineInstr::OperandsComplete() const {
972a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner  int NumOperands = TargetInstrDescriptors[Opcode].numOperands;
98a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  if (NumOperands >= 0 && getNumOperands() >= (unsigned)NumOperands)
993497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve    return true;  // Broken: we have all the operands of this instruction!
100413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  return false;
10170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
10270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
10321326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaekevoid MachineInstr::dump() const {
104925b771dc378d6c88da44cd5b6650f2758c3c0a7Chris Lattner  std::cerr << "  " << *this;
10570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
10670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
1072a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattnerstatic inline void OutputReg(std::ostream &os, unsigned RegNo,
1082a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner                             const MRegisterInfo *MRI = 0) {
109ddcfd9e6fafdbbe5c973477e537119e73c115ee4Alkis Evlogimenos  if (!RegNo || MRegisterInfo::isPhysicalRegister(RegNo)) {
1108517e1f0beea9b5e47974f083396d53294c390adChris Lattner    if (MRI)
1112a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner      os << "%" << MRI->get(RegNo).Name;
1122a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner    else
1138517e1f0beea9b5e47974f083396d53294c390adChris Lattner      os << "%mreg(" << RegNo << ")";
1142a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner  } else
1158517e1f0beea9b5e47974f083396d53294c390adChris Lattner    os << "%reg" << RegNo;
1168c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve}
1178c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve
1181049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattnerstatic void print(const MachineOperand &MO, std::ostream &OS,
119b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner                  const TargetMachine *TM) {
120ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  const MRegisterInfo *MRI = 0;
121edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
122ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  if (TM) MRI = TM->getRegisterInfo();
123b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner
1241049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  switch (MO.getType()) {
1252d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner  case MachineOperand::MO_Register:
1264efeab208cf0fe7ae2f68bcdd1264a8fdb18826cChris Lattner    OutputReg(OS, MO.getReg(), MRI);
1271049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
12863b3d7113d93fda622c4954c6b1d046ce029044eChris Lattner  case MachineOperand::MO_Immediate:
1291049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << (long)MO.getImmedValue();
1301049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
1312109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner  case MachineOperand::MO_MachineBasicBlock:
132988b7ba5bad830379a7108c1f9ea36fb29073245Brian Gaeke    OS << "mbb<"
1332109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner       << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName()
134988b7ba5bad830379a7108c1f9ea36fb29073245Brian Gaeke       << "," << (void*)MO.getMachineBasicBlock() << ">";
1352109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner    break;
13610cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner  case MachineOperand::MO_FrameIndex:
13710cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    OS << "<fi#" << MO.getFrameIndex() << ">";
13810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    break;
1398d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  case MachineOperand::MO_ConstantPoolIndex:
1408d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    OS << "<cp#" << MO.getConstantPoolIndex() << ">";
1418d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    break;
14237efe6764568a3829fee26aba532283131d1a104Nate Begeman  case MachineOperand::MO_JumpTableIndex:
14337efe6764568a3829fee26aba532283131d1a104Nate Begeman    OS << "<jt#" << MO.getJumpTableIndex() << ">";
14437efe6764568a3829fee26aba532283131d1a104Nate Begeman    break;
1458d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  case MachineOperand::MO_GlobalAddress:
146ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner    OS << "<ga:" << ((Value*)MO.getGlobal())->getName();
147ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner    if (MO.getOffset()) OS << "+" << MO.getOffset();
148ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner    OS << ">";
1498d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    break;
1508d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  case MachineOperand::MO_ExternalSymbol:
151ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner    OS << "<es:" << MO.getSymbolName();
152ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner    if (MO.getOffset()) OS << "+" << MO.getOffset();
153ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner    OS << ">";
1548d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    break;
1551049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  default:
1561049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    assert(0 && "Unrecognized operand type");
1571049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  }
1581049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner}
1591049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
160b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattnervoid MachineInstr::print(std::ostream &OS, const TargetMachine *TM) const {
1616a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner  unsigned StartOp = 0;
1626a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner
1636a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner   // Specialize printing if op#0 is definition
1644d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos  if (getNumOperands() && getOperand(0).isDef() && !getOperand(0).isUse()) {
1650742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner    ::print(getOperand(0), OS, TM);
1666a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    OS << " = ";
1676a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    ++StartOp;   // Don't print this operand again!
1686a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner  }
169b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner
170ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  // Must check if Target machine is not null because machine BB could not
171ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  // be attached to a Machine function yet
172ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  if (TM)
173b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner    OS << TM->getInstrInfo()->getName(getOpcode());
174edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
1756a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner  for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) {
1765f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve    const MachineOperand& mop = getOperand(i);
1776a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    if (i != StartOp)
1786a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner      OS << ",";
1796a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    OS << " ";
1800742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner    ::print(mop, OS, TM);
181edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
1824d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos    if (mop.isDef())
1834d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos      if (mop.isUse())
1844d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos        OS << "<def&use>";
1854d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos      else
1864d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos        OS << "<def>";
1871049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  }
188edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
1891049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  OS << "\n";
1901049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner}
1911049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
19234fb2cad46adb39f3c2cc705fbbf439a383d0f65Chris Lattnerstd::ostream &llvm::operator<<(std::ostream &os, const MachineInstr &MI) {
1938517e1f0beea9b5e47974f083396d53294c390adChris Lattner  // If the instruction is embedded into a basic block, we can find the target
1948517e1f0beea9b5e47974f083396d53294c390adChris Lattner  // info for the instruction.
1958517e1f0beea9b5e47974f083396d53294c390adChris Lattner  if (const MachineBasicBlock *MBB = MI.getParent()) {
1968517e1f0beea9b5e47974f083396d53294c390adChris Lattner    const MachineFunction *MF = MBB->getParent();
197ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    if (MF)
198b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner      MI.print(os, &MF->getTarget());
199b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner    else
200b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner      MI.print(os, 0);
2018517e1f0beea9b5e47974f083396d53294c390adChris Lattner    return os;
2028517e1f0beea9b5e47974f083396d53294c390adChris Lattner  }
2038517e1f0beea9b5e47974f083396d53294c390adChris Lattner
2048517e1f0beea9b5e47974f083396d53294c390adChris Lattner  // Otherwise, print it out in the "raw" format without symbolic register names
2058517e1f0beea9b5e47974f083396d53294c390adChris Lattner  // and such.
2062a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner  os << TargetInstrDescriptors[MI.getOpcode()].Name;
207edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
208ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  for (unsigned i = 0, N = MI.getNumOperands(); i < N; i++) {
2098d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    os << "\t" << MI.getOperand(i);
2104d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos    if (MI.getOperand(i).isDef())
2114d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos      if (MI.getOperand(i).isUse())
2124d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos        os << "<d&u>";
2134d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos      else
2144d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos        os << "<d>";
2158d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka  }
216edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
217697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner  return os << "\n";
21870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
21970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
22034fb2cad46adb39f3c2cc705fbbf439a383d0f65Chris Lattnerstd::ostream &llvm::operator<<(std::ostream &OS, const MachineOperand &MO) {
221ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  switch (MO.getType()) {
2222d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner  case MachineOperand::MO_Register:
2234efeab208cf0fe7ae2f68bcdd1264a8fdb18826cChris Lattner    OutputReg(OS, MO.getReg());
224ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
22563b3d7113d93fda622c4954c6b1d046ce029044eChris Lattner  case MachineOperand::MO_Immediate:
226ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << (long)MO.getImmedValue();
227ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
228ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  case MachineOperand::MO_MachineBasicBlock:
229ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << "<mbb:"
230ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman       << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName()
231ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman       << "@" << (void*)MO.getMachineBasicBlock() << ">";
232ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
233ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  case MachineOperand::MO_FrameIndex:
234ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << "<fi#" << MO.getFrameIndex() << ">";
235ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
236ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  case MachineOperand::MO_ConstantPoolIndex:
237ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << "<cp#" << MO.getConstantPoolIndex() << ">";
238ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
23937efe6764568a3829fee26aba532283131d1a104Nate Begeman  case MachineOperand::MO_JumpTableIndex:
24037efe6764568a3829fee26aba532283131d1a104Nate Begeman    OS << "<jt#" << MO.getJumpTableIndex() << ">";
24137efe6764568a3829fee26aba532283131d1a104Nate Begeman    break;
242ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  case MachineOperand::MO_GlobalAddress:
243ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">";
244ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
245ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  case MachineOperand::MO_ExternalSymbol:
246ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << "<es:" << MO.getSymbolName() << ">";
247ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
248ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  default:
249ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    assert(0 && "Unrecognized operand type");
250ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
251ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  }
252edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
25310cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner  return OS;
25470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
255