MachineInstr.cpp revision 02e5f8dcda4319e05fe49301ab72c386ed859e16
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
391885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve// Constructor for instructions with variable #operands
40ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis EvlogimenosMachineInstr::MachineInstr(short opcode, unsigned numOperands)
41ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis Evlogimenos  : Opcode(opcode),
42ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis Evlogimenos    operands(numOperands, MachineOperand()),
43ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis Evlogimenos    parent(0) {
44aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  // Make sure that we get added to a machine basicblock
45aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  LeakDetector::addGarbageObject(this);
46413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner}
47413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner
48ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - This constructor only does a _reserve_ of the operands,
49ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// not a resize for them.  It is expected that if you use this that you call
50ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// add* methods below to fill up the operands, instead of the Set methods.
51ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// Eventually, the "resizing" ctors will be phased out.
52ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner///
5321326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian GaekeMachineInstr::MachineInstr(short opcode, unsigned numOperands, bool XX, bool YY)
5402e5f8dcda4319e05fe49301ab72c386ed859e16Chris Lattner  : Opcode(opcode), parent(0) {
557279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner  operands.reserve(numOperands);
56aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  // Make sure that we get added to a machine basicblock
57aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  LeakDetector::addGarbageObject(this);
587279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner}
597279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner
60ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - Work exactly the same as the ctor above, except that the
61ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr is created and added to the end of the specified basic block.
62ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner///
63ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis EvlogimenosMachineInstr::MachineInstr(MachineBasicBlock *MBB, short opcode,
64ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner                           unsigned numOperands)
6502e5f8dcda4319e05fe49301ab72c386ed859e16Chris Lattner  : Opcode(opcode), parent(0) {
66ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner  assert(MBB && "Cannot use inserting ctor with null basic block!");
67ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner  operands.reserve(numOperands);
68aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  // Make sure that we get added to a machine basicblock
69aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  LeakDetector::addGarbageObject(this);
70ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner  MBB->push_back(this);  // Add instruction to end of basic block!
71ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner}
72ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner
73ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman/// MachineInstr ctor - Copies MachineInstr arg exactly
74ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman///
75466b534a570f574ed485d875bbca8454f68dcb52Tanya LattnerMachineInstr::MachineInstr(const MachineInstr &MI) {
76466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner  Opcode = MI.getOpcode();
77b5159ed0cb7943e5938782f7693beb18342165ceTanya Lattner  operands.reserve(MI.getNumOperands());
78b5159ed0cb7943e5938782f7693beb18342165ceTanya Lattner
79ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  // Add operands
80ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  for (unsigned i = 0; i < MI.getNumOperands(); ++i)
81466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner    operands.push_back(MachineOperand(MI.getOperand(i)));
820c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner
83ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  // Set parent, next, and prev to null
840c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner  parent = 0;
850c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner  prev = 0;
860c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner  next = 0;
87466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner}
88466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner
89466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner
90ce22e76996d3ff0930716fa60c29df60a7e0481bMisha BrukmanMachineInstr::~MachineInstr() {
91aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  LeakDetector::removeGarbageObject(this);
92aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos}
93aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos
94ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman/// clone - Create a copy of 'this' instruction that is identical in all ways
95ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman/// except the following: the new instruction has no parent and it has no name
96ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman///
970c63e03e04d3982e1913479bba404c3debc9a27eTanya LattnerMachineInstr* MachineInstr::clone() const {
98b5159ed0cb7943e5938782f7693beb18342165ceTanya Lattner  return new MachineInstr(*this);
99466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner}
100466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner
10148d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner/// removeFromParent - This method unlinks 'this' from the containing basic
10248d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner/// block, and returns it, but does not delete it.
10348d7c069c76882475c23de153bda9483cd3c9bb4Chris LattnerMachineInstr *MachineInstr::removeFromParent() {
10448d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner  assert(getParent() && "Not embedded in a basic block!");
10548d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner  getParent()->remove(this);
10648d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner  return this;
10748d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner}
10848d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner
10948d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner
11021326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// OperandComplete - Return true if it's illegal to add a new operand
11121326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke///
1122a90ba60175f93e7438165d8423100aa573c16c5Chris Lattnerbool MachineInstr::OperandsComplete() const {
1132a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner  int NumOperands = TargetInstrDescriptors[Opcode].numOperands;
114a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  if (NumOperands >= 0 && getNumOperands() >= (unsigned)NumOperands)
1153497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve    return true;  // Broken: we have all the operands of this instruction!
116413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  return false;
11770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
11870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
119a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattnervoid MachineInstr::SetMachineOperandVal(unsigned i,
120a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattner                                        MachineOperand::MachineOperandType opTy,
121a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattner                                        Value* V) {
122a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  assert(i < operands.size());          // may be explicit or implicit op
123a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattner  operands[i].opType = opTy;
124c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke  operands[i].contents.value = V;
125ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner  operands[i].extra.regNum = -1;
12670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
12770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
12870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid
129572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris LattnerMachineInstr::SetMachineOperandConst(unsigned i,
13021326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke                                     MachineOperand::MachineOperandType opTy,
131561c0107b20e9be4a02bad57a68ae9e4f96461a9Chris Lattner                                     int intValue) {
132a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  assert(i < getNumOperands());          // must be explicit op
1332a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner  assert(TargetInstrDescriptors[Opcode].resultPos != (int) i &&
134c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve         "immed. constant cannot be defined");
135572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
13621326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke  operands[i].opType = opTy;
137c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke  operands[i].contents.value = NULL;
138c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke  operands[i].contents.immedVal = intValue;
139ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner  operands[i].extra.regNum = -1;
140572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner  operands[i].flags = 0;
14170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
14270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
143a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattnervoid MachineInstr::SetMachineOperandReg(unsigned i, int regNum) {
144a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve  assert(i < getNumOperands());          // must be explicit op
145572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner
1462f305989b395a0a8bf00c4b9dc140a6df051245eChris Lattner  operands[i].opType = MachineOperand::MO_MachineRegister;
147c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke  operands[i].contents.value = NULL;
148ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner  operands[i].extra.regNum = regNum;
14970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
15070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
15121326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaekevoid MachineInstr::dump() const {
152925b771dc378d6c88da44cd5b6650f2758c3c0a7Chris Lattner  std::cerr << "  " << *this;
15370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
15470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
15521326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaekestatic inline std::ostream& OutputValue(std::ostream &os, const Value* val) {
15693240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve  os << "(val ";
157ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  os << (void*) val;                // print address always
15893240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve  if (val && val->hasName())
159ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    os << " " << val->getName();    // print name also, if available
16021326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke  os << ")";
161627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve  return os;
16293240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve}
16393240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve
1642a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattnerstatic inline void OutputReg(std::ostream &os, unsigned RegNo,
1652a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner                             const MRegisterInfo *MRI = 0) {
166ddcfd9e6fafdbbe5c973477e537119e73c115ee4Alkis Evlogimenos  if (!RegNo || MRegisterInfo::isPhysicalRegister(RegNo)) {
1678517e1f0beea9b5e47974f083396d53294c390adChris Lattner    if (MRI)
1682a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner      os << "%" << MRI->get(RegNo).Name;
1692a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner    else
1708517e1f0beea9b5e47974f083396d53294c390adChris Lattner      os << "%mreg(" << RegNo << ")";
1712a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner  } else
1728517e1f0beea9b5e47974f083396d53294c390adChris Lattner    os << "%reg" << RegNo;
1738c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve}
1748c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve
1751049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattnerstatic void print(const MachineOperand &MO, std::ostream &OS,
176b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner                  const TargetMachine *TM) {
177ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  const MRegisterInfo *MRI = 0;
178edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
179ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  if (TM) MRI = TM->getRegisterInfo();
180b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner
1811049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  bool CloseParen = true;
1824d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos  if (MO.isHiBits32())
1831049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << "%lm(";
1844d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos  else if (MO.isLoBits32())
1851049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << "%lo(";
1864d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos  else if (MO.isHiBits64())
1871049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << "%hh(";
1884d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos  else if (MO.isLoBits64())
1891049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << "%hm(";
1901049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  else
1911049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    CloseParen = false;
192edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
1931049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  switch (MO.getType()) {
1941049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  case MachineOperand::MO_VirtualRegister:
1951049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    if (MO.getVRegValue()) {
1961049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      OS << "%reg";
1971049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      OutputValue(OS, MO.getVRegValue());
1981049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      if (MO.hasAllocatedReg())
1991049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner        OS << "==";
2001049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    }
2011049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    if (MO.hasAllocatedReg())
202be766c72464116a445a02b542a450c4274bab5d0Alkis Evlogimenos      OutputReg(OS, MO.getReg(), MRI);
2031049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
2041049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  case MachineOperand::MO_CCRegister:
2051049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << "%ccreg";
2061049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OutputValue(OS, MO.getVRegValue());
2071049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    if (MO.hasAllocatedReg()) {
2081049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      OS << "==";
209be766c72464116a445a02b542a450c4274bab5d0Alkis Evlogimenos      OutputReg(OS, MO.getReg(), MRI);
2101049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    }
2111049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
2121049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  case MachineOperand::MO_MachineRegister:
2132a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner    OutputReg(OS, MO.getMachineRegNum(), MRI);
2141049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
2151049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  case MachineOperand::MO_SignExtendedImmed:
2161049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << (long)MO.getImmedValue();
2171049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
2181049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  case MachineOperand::MO_UnextendedImmed:
2191049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << (long)MO.getImmedValue();
2201049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
2211049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  case MachineOperand::MO_PCRelativeDisp: {
2221049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    const Value* opVal = MO.getVRegValue();
2231049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal);
2241049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << "%disp(" << (isLabel? "label " : "addr-of-val ");
2251049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    if (opVal->hasName())
2261049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      OS << opVal->getName();
2271049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    else
2281049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner      OS << (const void*) opVal;
2291049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << ")";
2301049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    break;
2311049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  }
2322109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner  case MachineOperand::MO_MachineBasicBlock:
233988b7ba5bad830379a7108c1f9ea36fb29073245Brian Gaeke    OS << "mbb<"
2342109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner       << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName()
235988b7ba5bad830379a7108c1f9ea36fb29073245Brian Gaeke       << "," << (void*)MO.getMachineBasicBlock() << ">";
2362109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner    break;
23710cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner  case MachineOperand::MO_FrameIndex:
23810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    OS << "<fi#" << MO.getFrameIndex() << ">";
23910cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    break;
2408d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  case MachineOperand::MO_ConstantPoolIndex:
2418d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    OS << "<cp#" << MO.getConstantPoolIndex() << ">";
2428d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    break;
2438d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  case MachineOperand::MO_GlobalAddress:
244ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner    OS << "<ga:" << ((Value*)MO.getGlobal())->getName();
245ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner    if (MO.getOffset()) OS << "+" << MO.getOffset();
246ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner    OS << ">";
2478d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    break;
2488d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner  case MachineOperand::MO_ExternalSymbol:
249ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner    OS << "<es:" << MO.getSymbolName();
250ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner    if (MO.getOffset()) OS << "+" << MO.getOffset();
251ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner    OS << ">";
2528d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    break;
2531049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  default:
2541049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    assert(0 && "Unrecognized operand type");
2551049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  }
2561049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
2571049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  if (CloseParen)
2581049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner    OS << ")";
2591049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner}
2601049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
261b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattnervoid MachineInstr::print(std::ostream &OS, const TargetMachine *TM) const {
2626a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner  unsigned StartOp = 0;
2636a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner
2646a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner   // Specialize printing if op#0 is definition
2654d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos  if (getNumOperands() && getOperand(0).isDef() && !getOperand(0).isUse()) {
2660742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner    ::print(getOperand(0), OS, TM);
2676a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    OS << " = ";
2686a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    ++StartOp;   // Don't print this operand again!
2696a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner  }
270b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner
271ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  // Must check if Target machine is not null because machine BB could not
272ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  // be attached to a Machine function yet
273ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  if (TM)
274b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner    OS << TM->getInstrInfo()->getName(getOpcode());
275edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
2766a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner  for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) {
2775f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve    const MachineOperand& mop = getOperand(i);
2786a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    if (i != StartOp)
2796a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner      OS << ",";
2806a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    OS << " ";
2810742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner    ::print(mop, OS, TM);
282edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
2834d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos    if (mop.isDef())
2844d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos      if (mop.isUse())
2854d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos        OS << "<def&use>";
2864d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos      else
2874d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos        OS << "<def>";
2881049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  }
289edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
2901049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  OS << "\n";
2911049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner}
2921049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
29311d1f21e1d400826ccc3cae5702d6a626baa906bChris Lattnernamespace llvm {
2948517e1f0beea9b5e47974f083396d53294c390adChris Lattnerstd::ostream &operator<<(std::ostream &os, const MachineInstr &MI) {
2958517e1f0beea9b5e47974f083396d53294c390adChris Lattner  // If the instruction is embedded into a basic block, we can find the target
2968517e1f0beea9b5e47974f083396d53294c390adChris Lattner  // info for the instruction.
2978517e1f0beea9b5e47974f083396d53294c390adChris Lattner  if (const MachineBasicBlock *MBB = MI.getParent()) {
2988517e1f0beea9b5e47974f083396d53294c390adChris Lattner    const MachineFunction *MF = MBB->getParent();
299ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    if (MF)
300b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner      MI.print(os, &MF->getTarget());
301b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner    else
302b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner      MI.print(os, 0);
3038517e1f0beea9b5e47974f083396d53294c390adChris Lattner    return os;
3048517e1f0beea9b5e47974f083396d53294c390adChris Lattner  }
3058517e1f0beea9b5e47974f083396d53294c390adChris Lattner
3068517e1f0beea9b5e47974f083396d53294c390adChris Lattner  // Otherwise, print it out in the "raw" format without symbolic register names
3078517e1f0beea9b5e47974f083396d53294c390adChris Lattner  // and such.
3082a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner  os << TargetInstrDescriptors[MI.getOpcode()].Name;
309edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
310ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  for (unsigned i = 0, N = MI.getNumOperands(); i < N; i++) {
3118d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner    os << "\t" << MI.getOperand(i);
3124d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos    if (MI.getOperand(i).isDef())
3134d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos      if (MI.getOperand(i).isUse())
3144d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos        os << "<d&u>";
3154d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos      else
3164d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos        os << "<d>";
3178d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka  }
318edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
319697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner  return os << "\n";
32070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
32170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
32221326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaekestd::ostream &operator<<(std::ostream &OS, const MachineOperand &MO) {
3234d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos  if (MO.isHiBits32())
32410cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    OS << "%lm(";
3254d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos  else if (MO.isLoBits32())
32610cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    OS << "%lo(";
3274d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos  else if (MO.isHiBits64())
32810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    OS << "%hh(";
3294d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos  else if (MO.isLoBits64())
33010cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    OS << "%hm(";
331edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
332ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  switch (MO.getType()) {
333ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  case MachineOperand::MO_VirtualRegister:
334ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    if (MO.hasAllocatedReg())
335ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman      OutputReg(OS, MO.getReg());
336ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman
337ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    if (MO.getVRegValue()) {
338ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman      if (MO.hasAllocatedReg()) OS << "==";
339ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman      OS << "%vreg";
34010cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner      OutputValue(OS, MO.getVRegValue());
3416e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve    }
342ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
343ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  case MachineOperand::MO_CCRegister:
344ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << "%ccreg";
345ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OutputValue(OS, MO.getVRegValue());
346ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    if (MO.hasAllocatedReg()) {
347ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman      OS << "==";
348ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman      OutputReg(OS, MO.getReg());
349ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    }
350ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
351ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  case MachineOperand::MO_MachineRegister:
352ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OutputReg(OS, MO.getMachineRegNum());
353ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
354ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  case MachineOperand::MO_SignExtendedImmed:
355ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << (long)MO.getImmedValue();
356ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
357ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  case MachineOperand::MO_UnextendedImmed:
358ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << (long)MO.getImmedValue();
359ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
360ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  case MachineOperand::MO_PCRelativeDisp: {
361ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    const Value* opVal = MO.getVRegValue();
362ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal);
363ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << "%disp(" << (isLabel? "label " : "addr-of-val ");
364ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    if (opVal->hasName())
365ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman      OS << opVal->getName();
366ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    else
367ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman      OS << (const void*) opVal;
368ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << ")";
369ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
370ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  }
371ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  case MachineOperand::MO_MachineBasicBlock:
372ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << "<mbb:"
373ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman       << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName()
374ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman       << "@" << (void*)MO.getMachineBasicBlock() << ">";
375ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
376ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  case MachineOperand::MO_FrameIndex:
377ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << "<fi#" << MO.getFrameIndex() << ">";
378ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
379ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  case MachineOperand::MO_ConstantPoolIndex:
380ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << "<cp#" << MO.getConstantPoolIndex() << ">";
381ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
382ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  case MachineOperand::MO_GlobalAddress:
383ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">";
384ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
385ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  case MachineOperand::MO_ExternalSymbol:
386ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    OS << "<es:" << MO.getSymbolName() << ">";
387ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
388ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  default:
389ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    assert(0 && "Unrecognized operand type");
390ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman    break;
391ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  }
392edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
3930742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner  if (MO.isHiBits32() || MO.isLoBits32() || MO.isHiBits64() || MO.isLoBits64())
39410cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner    OS << ")";
395edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
39610cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner  return OS;
39770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
398d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
39911d1f21e1d400826ccc3cae5702d6a626baa906bChris Lattner}
400