MachineInstr.cpp revision c21c5eeb4f56f160e79522df2d3aab5cfe73c05d
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//
12035dfbe7f2d109008d2d62d9f2a67efb477a7ab6Chris Lattner//===----------------------------------------------------------------------===//
1370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
14822b4fb896846b87dd11a330ae13f2239329aeefChris Lattner#include "llvm/CodeGen/MachineInstr.h"
158517e1f0beea9b5e47974f083396d53294c390adChris Lattner#include "llvm/CodeGen/MachineFunction.h"
161049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner#include "llvm/Target/TargetMachine.h"
173501feab811c86c9659248a4875fc31a3165f84dChris Lattner#include "llvm/Target/TargetInstrInfo.h"
182a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner#include "llvm/Target/MRegisterInfo.h"
19551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/LeakDetector.h"
20a09362eb975730ac624c0bd210a95655ee105296Bill Wendling#include "llvm/Support/Streams.h"
21c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen#include <ostream>
220742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattnerusing namespace llvm;
23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
24c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// MachineInstr ctor - This constructor creates a dummy MachineInstr with
2567f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng/// TID NULL and no operands.
26c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan ChengMachineInstr::MachineInstr()
2767f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  : TID(0), NumImplicitOps(0), parent(0) {
28aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  // Make sure that we get added to a machine basicblock
29aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  LeakDetector::addGarbageObject(this);
307279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner}
317279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner
3267f660cb080965ea93ed6d7265a67100f2fe38e4Evan Chengvoid MachineInstr::addImplicitDefUseOperands() {
3367f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  if (TID->ImplicitDefs)
3467f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng    for (const unsigned *ImpDefs = TID->ImplicitDefs; *ImpDefs; ++ImpDefs) {
35d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      MachineOperand Op;
36d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      Op.opType = MachineOperand::MO_Register;
37d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      Op.IsDef = true;
38d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      Op.IsImp = true;
39d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      Op.IsKill = false;
40d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      Op.IsDead = false;
41d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      Op.contents.RegNo = *ImpDefs;
42d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      Op.offset = 0;
43d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      Operands.push_back(Op);
44d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng    }
4567f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  if (TID->ImplicitUses)
4667f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng    for (const unsigned *ImpUses = TID->ImplicitUses; *ImpUses; ++ImpUses) {
47d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      MachineOperand Op;
48d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      Op.opType = MachineOperand::MO_Register;
49d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      Op.IsDef = false;
50d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      Op.IsImp = true;
51d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      Op.IsKill = false;
52d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      Op.IsDead = false;
53d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      Op.contents.RegNo = *ImpUses;
54d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      Op.offset = 0;
55d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      Operands.push_back(Op);
56d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng    }
57d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng}
58d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng
59d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng/// MachineInstr ctor - This constructor create a MachineInstr and add the
60c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// implicit operands. It reserves space for number of operands specified by
61c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// TargetInstrDescriptor or the numOperands if it is not zero. (for
62c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// instructions with variable number of operands).
6367f660cb080965ea93ed6d7265a67100f2fe38e4Evan ChengMachineInstr::MachineInstr(const TargetInstrDescriptor &tid)
6467f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  : TID(&tid), NumImplicitOps(0), parent(0) {
6567f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  if (TID->ImplicitDefs)
6667f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng    for (const unsigned *ImpDefs = TID->ImplicitDefs; *ImpDefs; ++ImpDefs)
67d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      NumImplicitOps++;
6867f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  if (TID->ImplicitUses)
6967f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng    for (const unsigned *ImpUses = TID->ImplicitUses; *ImpUses; ++ImpUses)
70d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      NumImplicitOps++;
7167f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  Operands.reserve(NumImplicitOps + TID->numOperands);
7267f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  addImplicitDefUseOperands();
73d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  // Make sure that we get added to a machine basicblock
74d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  LeakDetector::addGarbageObject(this);
75d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng}
76d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng
77ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - Work exactly the same as the ctor above, except that the
78ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr is created and added to the end of the specified basic block.
79ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner///
80c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan ChengMachineInstr::MachineInstr(MachineBasicBlock *MBB,
8167f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng                           const TargetInstrDescriptor &tid)
8267f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  : TID(&tid), NumImplicitOps(0), parent(0) {
83ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner  assert(MBB && "Cannot use inserting ctor with null basic block!");
8467f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  if (TID->ImplicitDefs)
8567f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng    for (const unsigned *ImpDefs = TID->ImplicitDefs; *ImpDefs; ++ImpDefs)
86d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      NumImplicitOps++;
8767f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  if (TID->ImplicitUses)
8867f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng    for (const unsigned *ImpUses = TID->ImplicitUses; *ImpUses; ++ImpUses)
89d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      NumImplicitOps++;
9067f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  Operands.reserve(NumImplicitOps + TID->numOperands);
9167f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  addImplicitDefUseOperands();
92aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  // Make sure that we get added to a machine basicblock
93aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  LeakDetector::addGarbageObject(this);
94ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner  MBB->push_back(this);  // Add instruction to end of basic block!
95ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner}
96ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner
97ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman/// MachineInstr ctor - Copies MachineInstr arg exactly
98ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman///
99466b534a570f574ed485d875bbca8454f68dcb52Tanya LattnerMachineInstr::MachineInstr(const MachineInstr &MI) {
10067f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  TID = MI.getInstrDescriptor();
1016b2c05f3d3c7b44183c629485ade10c18b86828dEvan Cheng  NumImplicitOps = MI.NumImplicitOps;
102943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner  Operands.reserve(MI.getNumOperands());
103b5159ed0cb7943e5938782f7693beb18342165ceTanya Lattner
104ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  // Add operands
105943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner  for (unsigned i = 0; i != MI.getNumOperands(); ++i)
106943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    Operands.push_back(MI.getOperand(i));
1070c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner
108ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  // Set parent, next, and prev to null
1090c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner  parent = 0;
1100c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner  prev = 0;
1110c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner  next = 0;
112466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner}
113466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner
114466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner
115ce22e76996d3ff0930716fa60c29df60a7e0481bMisha BrukmanMachineInstr::~MachineInstr() {
116aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  LeakDetector::removeGarbageObject(this);
117aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos}
118aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos
11967f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng/// getOpcode - Returns the opcode of this MachineInstr.
12067f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng///
12167f660cb080965ea93ed6d7265a67100f2fe38e4Evan Chengconst int MachineInstr::getOpcode() const {
12267f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  return TID->Opcode;
12367f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng}
12467f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng
12548d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner/// removeFromParent - This method unlinks 'this' from the containing basic
12648d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner/// block, and returns it, but does not delete it.
12748d7c069c76882475c23de153bda9483cd3c9bb4Chris LattnerMachineInstr *MachineInstr::removeFromParent() {
12848d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner  assert(getParent() && "Not embedded in a basic block!");
12948d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner  getParent()->remove(this);
13048d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner  return this;
13148d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner}
13248d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner
13348d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner
13421326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// OperandComplete - Return true if it's illegal to add a new operand
13521326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke///
1362a90ba60175f93e7438165d8423100aa573c16c5Chris Lattnerbool MachineInstr::OperandsComplete() const {
13767f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  unsigned short NumOperands = TID->numOperands;
13867f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  if ((TID->Flags & M_VARIABLE_OPS) == 0 &&
1398bcb042f22f06d034f18aee8cb5dd0a04745fd97Evan Cheng      getNumOperands()-NumImplicitOps >= NumOperands)
1403497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve    return true;  // Broken: we have all the operands of this instruction!
141413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  return false;
14270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
14370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
1448ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner/// isIdenticalTo - Return true if this operand is identical to the specified
1458ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner/// operand.
1468ace2cd034be10c09be51daf08c3dda327f54262Chris Lattnerbool MachineOperand::isIdenticalTo(const MachineOperand &Other) const {
1478ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner  if (getType() != Other.getType()) return false;
1488ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner
1498ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner  switch (getType()) {
1508ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner  default: assert(0 && "Unrecognized operand type");
1518ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner  case MachineOperand::MO_Register:
1528ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner    return getReg() == Other.getReg() && isDef() == Other.isDef();
1538ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner  case MachineOperand::MO_Immediate:
1548ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner    return getImm() == Other.getImm();
1558ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner  case MachineOperand::MO_MachineBasicBlock:
1568ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner    return getMBB() == Other.getMBB();
1578ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner  case MachineOperand::MO_FrameIndex:
1588ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner    return getFrameIndex() == Other.getFrameIndex();
1598ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner  case MachineOperand::MO_ConstantPoolIndex:
1608ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner    return getConstantPoolIndex() == Other.getConstantPoolIndex() &&
1618ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner           getOffset() == Other.getOffset();
1628ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner  case MachineOperand::MO_JumpTableIndex:
1638ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner    return getJumpTableIndex() == Other.getJumpTableIndex();
1648ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner  case MachineOperand::MO_GlobalAddress:
1658ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner    return getGlobal() == Other.getGlobal() && getOffset() == Other.getOffset();
1668ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner  case MachineOperand::MO_ExternalSymbol:
16713a04125df039d118c688df26998343a00d8a749Chris Lattner    return !strcmp(getSymbolName(), Other.getSymbolName()) &&
1688ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner           getOffset() == Other.getOffset();
1698ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner  }
1708ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner}
1718ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner
172576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng/// findRegisterUseOperand() - Returns the MachineOperand that is a use of
173576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng/// the specific register or NULL if it is not found.
174576d123e130a8291669dd2384a3735cc4933fd00Evan ChengMachineOperand *MachineInstr::findRegisterUseOperand(unsigned Reg) {
175576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng  for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
176576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng    MachineOperand &MO = getOperand(i);
177576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng    if (MO.isReg() && MO.isUse() && MO.getReg() == Reg)
178576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng      return &MO;
179576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng  }
180576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng  return NULL;
181576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng}
182576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng
183576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng/// copyKillDeadInfo - Copies kill / dead operand properties from MI.
184576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng///
185576d123e130a8291669dd2384a3735cc4933fd00Evan Chengvoid MachineInstr::copyKillDeadInfo(const MachineInstr *MI) {
186576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
187576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng    const MachineOperand &MO = MI->getOperand(i);
188576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng    if (!MO.isReg() || (!MO.isKill() && !MO.isDead()))
189576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng      continue;
190576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng    for (unsigned j = 0, ee = getNumOperands(); j != ee; ++j) {
191576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng      MachineOperand &MOp = getOperand(j);
192576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng      if (!MOp.isIdenticalTo(MO))
193576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng        continue;
194576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng      if (MO.isKill())
195576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng        MOp.setIsKill();
196576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng      else
197576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng        MOp.setIsDead();
198576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng      break;
199576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng    }
200576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng  }
201576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng}
202576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng
20321326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaekevoid MachineInstr::dump() const {
204e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling  cerr << "  " << *this;
20570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
20670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
2072a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattnerstatic inline void OutputReg(std::ostream &os, unsigned RegNo,
2082a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner                             const MRegisterInfo *MRI = 0) {
209ddcfd9e6fafdbbe5c973477e537119e73c115ee4Alkis Evlogimenos  if (!RegNo || MRegisterInfo::isPhysicalRegister(RegNo)) {
2108517e1f0beea9b5e47974f083396d53294c390adChris Lattner    if (MRI)
2112a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner      os << "%" << MRI->get(RegNo).Name;
2122a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner    else
2138517e1f0beea9b5e47974f083396d53294c390adChris Lattner      os << "%mreg(" << RegNo << ")";
2142a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner  } else
2158517e1f0beea9b5e47974f083396d53294c390adChris Lattner    os << "%reg" << RegNo;
2168c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve}
2178c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve
2181049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattnerstatic void print(const MachineOperand &MO, std::ostream &OS,
219b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner                  const TargetMachine *TM) {
220ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  const MRegisterInfo *MRI = 0;
221edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
222ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  if (TM) MRI = TM->getRegisterInfo();
223b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner
2241049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  switch (MO.getType()) {
2252d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner  case MachineOperand::MO_Register:
2264efeab208cf0fe7ae2f68bcdd1264a8fdb18826cChris Lattner    OutputReg(OS, MO.getReg(), MRI);
2271049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
22863b3d7113d93fda622c4954c6b1d046ce029044eChris Lattner  case MachineOperand::MO_Immediate:
22900aff7d9772e4945e3a946e70a3ef9998006b8deEvan Cheng    OS << MO.getImmedValue();
2301049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
2312109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner  case MachineOperand::MO_MachineBasicBlock:
232988b7ba5bad830379a7108c1f9ea36fb29073245Brian Gaeke    OS << "mbb<"
2332109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner       << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName()
234988b7ba5bad830379a7108c1f9ea36fb29073245Brian Gaeke       << "," << (void*)MO.getMachineBasicBlock() << ">";
2352109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner    break;
23610cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner  case MachineOperand::MO_FrameIndex:
23710cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    OS << "<fi#" << MO.getFrameIndex() << ">";
23810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    break;
2398d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  case MachineOperand::MO_ConstantPoolIndex:
2408d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    OS << "<cp#" << MO.getConstantPoolIndex() << ">";
2418d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    break;
24237efe6764568a3829fee26aba532283131d1a104Nate Begeman  case MachineOperand::MO_JumpTableIndex:
24337efe6764568a3829fee26aba532283131d1a104Nate Begeman    OS << "<jt#" << MO.getJumpTableIndex() << ">";
24437efe6764568a3829fee26aba532283131d1a104Nate Begeman    break;
2458d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  case MachineOperand::MO_GlobalAddress:
246ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner    OS << "<ga:" << ((Value*)MO.getGlobal())->getName();
247ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner    if (MO.getOffset()) OS << "+" << MO.getOffset();
248ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner    OS << ">";
2498d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    break;
2508d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  case MachineOperand::MO_ExternalSymbol:
251ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner    OS << "<es:" << MO.getSymbolName();
252ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner    if (MO.getOffset()) OS << "+" << MO.getOffset();
253ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner    OS << ">";
2548d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    break;
2551049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  default:
2561049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    assert(0 && "Unrecognized operand type");
2571049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  }
2581049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner}
2591049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
260b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattnervoid MachineInstr::print(std::ostream &OS, const TargetMachine *TM) const {
2616a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner  unsigned StartOp = 0;
2626a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner
2636a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner   // Specialize printing if op#0 is definition
264d8f44e07b89e651b2f0e3b0d680a775f44e667daChris Lattner  if (getNumOperands() && getOperand(0).isReg() && getOperand(0).isDef()) {
2650742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner    ::print(getOperand(0), OS, TM);
2666a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    OS << " = ";
2676a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    ++StartOp;   // Don't print this operand again!
2686a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner  }
269b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner
27067f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  if (TID)
27167f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng    OS << TID->Name;
272edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
2736a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner  for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) {
2745f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve    const MachineOperand& mop = getOperand(i);
2756a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    if (i != StartOp)
2766a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner      OS << ",";
2776a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    OS << " ";
2780742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner    ::print(mop, OS, TM);
279edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
280438f7bc67cf235ccee7e6f7ac7f4ae2186eb8020Evan Cheng    if (mop.isReg()) {
281d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      if (mop.isDef() || mop.isKill() || mop.isDead() || mop.isImplicit()) {
282d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng        OS << "<";
283d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng        bool NeedComma = false;
284d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng        if (mop.isImplicit()) {
285d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng          OS << (mop.isDef() ? "imp-def" : "imp-use");
286d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng          NeedComma = true;
287d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng        } else if (mop.isDef()) {
288d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng          OS << "def";
289d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng          NeedComma = true;
290d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng        }
291d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng        if (mop.isKill() || mop.isDead()) {
292d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng          if (NeedComma)
293d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng            OS << ",";
294d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng          if (mop.isKill())
295d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng            OS << "kill";
296d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng          if (mop.isDead())
297d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng            OS << "dead";
298d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng        }
299d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng        OS << ">";
300d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      }
301438f7bc67cf235ccee7e6f7ac7f4ae2186eb8020Evan Cheng    }
3021049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  }
303edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
3041049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  OS << "\n";
3051049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner}
3061049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
30734fb2cad46adb39f3c2cc705fbbf439a383d0f65Chris Lattnerstd::ostream &llvm::operator<<(std::ostream &os, const MachineInstr &MI) {
3088517e1f0beea9b5e47974f083396d53294c390adChris Lattner  // If the instruction is embedded into a basic block, we can find the target
3098517e1f0beea9b5e47974f083396d53294c390adChris Lattner  // info for the instruction.
3108517e1f0beea9b5e47974f083396d53294c390adChris Lattner  if (const MachineBasicBlock *MBB = MI.getParent()) {
3118517e1f0beea9b5e47974f083396d53294c390adChris Lattner    const MachineFunction *MF = MBB->getParent();
312ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    if (MF)
313b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner      MI.print(os, &MF->getTarget());
314b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner    else
315b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner      MI.print(os, 0);
3168517e1f0beea9b5e47974f083396d53294c390adChris Lattner    return os;
3178517e1f0beea9b5e47974f083396d53294c390adChris Lattner  }
3188517e1f0beea9b5e47974f083396d53294c390adChris Lattner
3198517e1f0beea9b5e47974f083396d53294c390adChris Lattner  // Otherwise, print it out in the "raw" format without symbolic register names
3208517e1f0beea9b5e47974f083396d53294c390adChris Lattner  // and such.
32167f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  os << MI.getInstrDescriptor()->Name;
322edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
323ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  for (unsigned i = 0, N = MI.getNumOperands(); i < N; i++) {
3248d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    os << "\t" << MI.getOperand(i);
325d8f44e07b89e651b2f0e3b0d680a775f44e667daChris Lattner    if (MI.getOperand(i).isReg() && MI.getOperand(i).isDef())
326d8f44e07b89e651b2f0e3b0d680a775f44e667daChris Lattner      os << "<d>";
3278d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka  }
328edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
329697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner  return os << "\n";
33070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
33170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
33234fb2cad46adb39f3c2cc705fbbf439a383d0f65Chris Lattnerstd::ostream &llvm::operator<<(std::ostream &OS, const MachineOperand &MO) {
333ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  switch (MO.getType()) {
3342d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner  case MachineOperand::MO_Register:
3354efeab208cf0fe7ae2f68bcdd1264a8fdb18826cChris Lattner    OutputReg(OS, MO.getReg());
336ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
33763b3d7113d93fda622c4954c6b1d046ce029044eChris Lattner  case MachineOperand::MO_Immediate:
338ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << (long)MO.getImmedValue();
339ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
340ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  case MachineOperand::MO_MachineBasicBlock:
341ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << "<mbb:"
342ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman       << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName()
343ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman       << "@" << (void*)MO.getMachineBasicBlock() << ">";
344ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
345ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  case MachineOperand::MO_FrameIndex:
346ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << "<fi#" << MO.getFrameIndex() << ">";
347ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
348ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  case MachineOperand::MO_ConstantPoolIndex:
349ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << "<cp#" << MO.getConstantPoolIndex() << ">";
350ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
35137efe6764568a3829fee26aba532283131d1a104Nate Begeman  case MachineOperand::MO_JumpTableIndex:
35237efe6764568a3829fee26aba532283131d1a104Nate Begeman    OS << "<jt#" << MO.getJumpTableIndex() << ">";
35337efe6764568a3829fee26aba532283131d1a104Nate Begeman    break;
354ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  case MachineOperand::MO_GlobalAddress:
355ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">";
356ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
357ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  case MachineOperand::MO_ExternalSymbol:
358ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << "<es:" << MO.getSymbolName() << ">";
359ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
360ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  default:
361ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    assert(0 && "Unrecognized operand type");
362ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
363ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  }
364edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
36510cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner  return OS;
36670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
367c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen
368c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff CohenOStream& llvm::operator<<(OStream& os, const MachineInstr& minstr) {
369c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen  if (os.stream()) *os.stream() << minstr;
370c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen  return os;
371c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen}
372c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen
373c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff CohenOStream& llvm::operator<<(OStream& os, const MachineOperand& mop) {
374c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen  if (os.stream()) *os.stream() << mop;
375c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen  return os;
376c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen}
377c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen
378