MachineInstr.cpp revision 2d90ac7ca6117d3b160dde8a4f322c1079a6ffce
18e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//===-- MachineInstr.cpp --------------------------------------------------===//
28e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//
38e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//                     The LLVM Compiler Infrastructure
48e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file was developed by the LLVM research group and is distributed under
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// the University of Illinois Open Source License. See LICENSE.TXT for details.
78e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//
88e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//===----------------------------------------------------------------------===//
98e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//
108e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// Methods common to all machine instructions.
118e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//
128e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// FIXME: Now that MachineInstrs have parent pointers, they should always
138e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// print themselves using their MachineFunction's TargetMachine.
148e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//
15df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner//===----------------------------------------------------------------------===//
16df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
17ff6c91efcf62d1cb99343fdcb2de6271520a1981Owen Anderson#include "llvm/CodeGen/MachineInstr.h"
18c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin#include "llvm/CodeGen/MachineFunction.h"
198e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner#include "llvm/Value.h"
20d185f64f828ce1f8b476807a4a1345c0c53d8213Chris Lattner#include "llvm/Target/TargetMachine.h"
2192bcb426c3e4503c99324afd4ed0a73521711a56Chris Lattner#include "llvm/Target/TargetInstrInfo.h"
22df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#include "llvm/Target/MRegisterInfo.h"
23df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#include "llvm/Support/LeakDetector.h"
24bcef7df6ec9aba7c5009a4d33944f80227563665Duncan Sands#include <iostream>
25a896176973d59d8e22514b363d31e8d1becf185eChris Lattner
265679d18c54ef46170e46f51bf471bb334f2b6525Misha Brukmanusing namespace llvm;
278e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
288e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// Global variable holding an array of descriptors for machine instructions.
29df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner// The actual object needs to be created separately for each target machine.
30eeb4a84ac8d91fb1d5a7c484a1c7047409faee30Chris Lattner// This variable is initialized and reset by class TargetInstrInfo.
31df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner//
32df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner// FIXME: This should be a property of the target so that more than one target
33df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner// at a time can be active...
348e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//
358e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnernamespace llvm {
368e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  extern const TargetInstrDescriptor *TargetInstrDescriptors;
378e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner}
388e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
398e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// MachineInstr ctor - This constructor only does a _reserve_ of the operands,
408e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// not a resize for them.  It is expected that if you use this that you call
418e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// add* methods below to fill up the operands, instead of the Set methods.
42df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner/// Eventually, the "resizing" ctors will be phased out.
438e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner///
448e3a8e0452695643d04c21e15c94b802aef81baeChris LattnerMachineInstr::MachineInstr(short opcode, unsigned numOperands, bool XX, bool YY)
458e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  : Opcode(opcode), parent(0) {
468e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  operands.reserve(numOperands);
478e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  // Make sure that we get added to a machine basicblock
488e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  LeakDetector::addGarbageObject(this);
49df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner}
508e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
518e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// MachineInstr ctor - Work exactly the same as the ctor above, except that the
528e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// MachineInstr is created and added to the end of the specified basic block.
538e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner///
548e3a8e0452695643d04c21e15c94b802aef81baeChris LattnerMachineInstr::MachineInstr(MachineBasicBlock *MBB, short opcode,
558e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner                           unsigned numOperands)
56df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  : Opcode(opcode), parent(0) {
578e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  assert(MBB && "Cannot use inserting ctor with null basic block!");
588e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  operands.reserve(numOperands);
598e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  // Make sure that we get added to a machine basicblock
608e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  LeakDetector::addGarbageObject(this);
618e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  MBB->push_back(this);  // Add instruction to end of basic block!
628e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner}
638e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
648e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// MachineInstr ctor - Copies MachineInstr arg exactly
658e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner///
668e3a8e0452695643d04c21e15c94b802aef81baeChris LattnerMachineInstr::MachineInstr(const MachineInstr &MI) {
678e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  Opcode = MI.getOpcode();
682c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling  operands.reserve(MI.getNumOperands());
698e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
70df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  // Add operands
718e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  for (unsigned i = 0; i < MI.getNumOperands(); ++i)
728e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    operands.push_back(MachineOperand(MI.getOperand(i)));
738e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
748e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  // Set parent, next, and prev to null
758e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  parent = 0;
768e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  prev = 0;
77df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  next = 0;
78df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner}
798e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
808e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
818e3a8e0452695643d04c21e15c94b802aef81baeChris LattnerMachineInstr::~MachineInstr() {
828e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  LeakDetector::removeGarbageObject(this);
838e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner}
848e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
858e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// clone - Create a copy of 'this' instruction that is identical in all ways
868e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// except the following: the new instruction has no parent and it has no name
878e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner///
888e3a8e0452695643d04c21e15c94b802aef81baeChris LattnerMachineInstr* MachineInstr::clone() const {
898e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  return new MachineInstr(*this);
908e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner}
918e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
928e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// removeFromParent - This method unlinks 'this' from the containing basic
938e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// block, and returns it, but does not delete it.
948e3a8e0452695643d04c21e15c94b802aef81baeChris LattnerMachineInstr *MachineInstr::removeFromParent() {
958e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  assert(getParent() && "Not embedded in a basic block!");
968e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  getParent()->remove(this);
978e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  return this;
988e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner}
998e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
1008e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
1018e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// OperandComplete - Return true if it's illegal to add a new operand
102d343c6b70ec03b357d42e47ce7c00b3c3cb78efdChris Lattner///
103df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnerbool MachineInstr::OperandsComplete() const {
1048e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  int NumOperands = TargetInstrDescriptors[Opcode].numOperands;
1058e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  if (NumOperands >= 0 && getNumOperands() >= (unsigned)NumOperands)
1061b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen    return true;  // Broken: we have all the operands of this instruction!
1071b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen  return false;
1081b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen}
1091b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen
1101b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesenvoid MachineInstr::dump() const {
1111b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen  std::cerr << "  " << *this;
1121b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen}
1131b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen
1141b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesenstatic inline std::ostream& OutputValue(std::ostream &os, const Value* val) {
1151b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen  os << "(val ";
1161b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen  os << (void*) val;                // print address always
1171b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen  if (val && val->hasName())
1181b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen    os << " " << val->getName();    // print name also, if available
1191b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen  os << ")";
1201b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen  return os;
1211b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen}
1221b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen
1231b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesenstatic inline void OutputReg(std::ostream &os, unsigned RegNo,
1241b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen                             const MRegisterInfo *MRI = 0) {
1251b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen  if (!RegNo || MRegisterInfo::isPhysicalRegister(RegNo)) {
1261b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen    if (MRI)
1271b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen      os << "%" << MRI->get(RegNo).Name;
1281b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen    else
1291b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen      os << "%mreg(" << RegNo << ")";
1301b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen  } else
1311b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen    os << "%reg" << RegNo;
1321b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen}
1331b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen
1341b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesenstatic void print(const MachineOperand &MO, std::ostream &OS,
1351b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen                  const TargetMachine *TM) {
1361b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen  const MRegisterInfo *MRI = 0;
1378e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
1388e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  if (TM) MRI = TM->getRegisterInfo();
1398e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
1408e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  switch (MO.getType()) {
1412c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling  case MachineOperand::MO_Register:
1428e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    OutputReg(OS, MO.getReg(), MRI);
1438e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    break;
1448e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  case MachineOperand::MO_Immediate:
1458e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    OS << (long)MO.getImmedValue();
1468e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    break;
1478e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  case MachineOperand::MO_MachineBasicBlock:
1488e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    OS << "mbb<"
1498e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner       << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName()
1508e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner       << "," << (void*)MO.getMachineBasicBlock() << ">";
1518e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    break;
1528e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  case MachineOperand::MO_FrameIndex:
1538e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    OS << "<fi#" << MO.getFrameIndex() << ">";
1548e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    break;
1558e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  case MachineOperand::MO_ConstantPoolIndex:
1568e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    OS << "<cp#" << MO.getConstantPoolIndex() << ">";
1578e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    break;
1588e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  case MachineOperand::MO_JumpTableIndex:
1598e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    OS << "<jt#" << MO.getJumpTableIndex() << ">";
1608e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    break;
1618e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  case MachineOperand::MO_GlobalAddress:
1628e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    OS << "<ga:" << ((Value*)MO.getGlobal())->getName();
1638e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    if (MO.getOffset()) OS << "+" << MO.getOffset();
1648e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    OS << ">";
1658e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    break;
1668e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  case MachineOperand::MO_ExternalSymbol:
1678e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    OS << "<es:" << MO.getSymbolName();
1688e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    if (MO.getOffset()) OS << "+" << MO.getOffset();
1698e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    OS << ">";
1708e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    break;
1718e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  default:
1728e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    assert(0 && "Unrecognized operand type");
1738e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  }
1748e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner}
1758e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
1768e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnervoid MachineInstr::print(std::ostream &OS, const TargetMachine *TM) const {
1778e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  unsigned StartOp = 0;
1788e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
1798e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner   // Specialize printing if op#0 is definition
1808e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  if (getNumOperands() && getOperand(0).isDef() && !getOperand(0).isUse()) {
1818e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    ::print(getOperand(0), OS, TM);
1828e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    OS << " = ";
1838e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    ++StartOp;   // Don't print this operand again!
1848e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  }
1858e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
186ff6c91efcf62d1cb99343fdcb2de6271520a1981Owen Anderson  // Must check if Target machine is not null because machine BB could not
187ff6c91efcf62d1cb99343fdcb2de6271520a1981Owen Anderson  // be attached to a Machine function yet
188ff6c91efcf62d1cb99343fdcb2de6271520a1981Owen Anderson  if (TM)
1898e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    OS << TM->getInstrInfo()->getName(getOpcode());
1908e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
1918e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) {
1928e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    const MachineOperand& mop = getOperand(i);
1938e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    if (i != StartOp)
1948e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner      OS << ",";
1958e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    OS << " ";
1968e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    ::print(mop, OS, TM);
1978e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
1988e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    if (mop.isDef())
1998e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner      if (mop.isUse())
2008e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner        OS << "<def&use>";
2018e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner      else
2028e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner        OS << "<def>";
2038e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  }
2048e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
2052c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling  OS << "\n";
2068e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner}
2072c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling
2088e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnerstd::ostream &llvm::operator<<(std::ostream &os, const MachineInstr &MI) {
2092c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling  // If the instruction is embedded into a basic block, we can find the target
2108e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  // info for the instruction.
2118e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  if (const MachineBasicBlock *MBB = MI.getParent()) {
2128e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    const MachineFunction *MF = MBB->getParent();
213df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    if (MF)
2148e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner      MI.print(os, &MF->getTarget());
2152c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling    else
2168e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner      MI.print(os, 0);
2178e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    return os;
2188e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  }
2198e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
2208e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  // Otherwise, print it out in the "raw" format without symbolic register names
2218e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  // and such.
2222c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling  os << TargetInstrDescriptors[MI.getOpcode()].Name;
223df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
224df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  for (unsigned i = 0, N = MI.getNumOperands(); i < N; i++) {
2258e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    os << "\t" << MI.getOperand(i);
2268e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    if (MI.getOperand(i).isDef())
2278e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner      if (MI.getOperand(i).isUse())
2288e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner        os << "<d&u>";
2298e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner      else
2308e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner        os << "<d>";
2318e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  }
2328e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
2338e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  return os << "\n";
2348e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner}
2358e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner
2368e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnerstd::ostream &llvm::operator<<(std::ostream &OS, const MachineOperand &MO) {
2378e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  switch (MO.getType()) {
2388e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  case MachineOperand::MO_Register:
239df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    OutputReg(OS, MO.getReg());
240df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    break;
2418e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  case MachineOperand::MO_Immediate:
2428e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    OS << (long)MO.getImmedValue();
2438e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    break;
244df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  case MachineOperand::MO_MachineBasicBlock:
2458e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    OS << "<mbb:"
246df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner       << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName()
2478e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner       << "@" << (void*)MO.getMachineBasicBlock() << ">";
2488e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    break;
2498e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  case MachineOperand::MO_FrameIndex:
250df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    OS << "<fi#" << MO.getFrameIndex() << ">";
251df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    break;
2528e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  case MachineOperand::MO_ConstantPoolIndex:
253df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    OS << "<cp#" << MO.getConstantPoolIndex() << ">";
2548e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    break;
2558e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  case MachineOperand::MO_JumpTableIndex:
2568e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    OS << "<jt#" << MO.getJumpTableIndex() << ">";
257eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel    break;
2588e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  case MachineOperand::MO_GlobalAddress:
2598e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner    OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">";
2602c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling    break;
2618e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner  case MachineOperand::MO_ExternalSymbol:
262df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    OS << "<es:" << MO.getSymbolName() << ">";
263df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    break;
264df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  default:
265df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    assert(0 && "Unrecognized operand type");
266df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    break;
267df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  }
268df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
269df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  return OS;
270df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner}
271df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner