| Chris Lattner | 035dfbe | 2002-08-09 20:08:06 +0000 | [diff] [blame] | 1 | //===-- MachineInstr.cpp --------------------------------------------------===// | 
| Misha Brukman | edf128a | 2005-04-21 22:36:52 +0000 | [diff] [blame] | 2 | // | 
| John Criswell | b576c94 | 2003-10-20 19:43:21 +0000 | [diff] [blame] | 3 | //                     The LLVM Compiler Infrastructure | 
 | 4 | // | 
 | 5 | // This file was developed by the LLVM research group and is distributed under | 
 | 6 | // the University of Illinois Open Source License. See LICENSE.TXT for details. | 
| Misha Brukman | edf128a | 2005-04-21 22:36:52 +0000 | [diff] [blame] | 7 | // | 
| John Criswell | b576c94 | 2003-10-20 19:43:21 +0000 | [diff] [blame] | 8 | //===----------------------------------------------------------------------===// | 
| Brian Gaeke | 21326fc | 2004-02-13 04:39:32 +0000 | [diff] [blame] | 9 | // | 
 | 10 | // Methods common to all machine instructions. | 
 | 11 | // | 
| Chris Lattner | 035dfbe | 2002-08-09 20:08:06 +0000 | [diff] [blame] | 12 | //===----------------------------------------------------------------------===// | 
| Vikram S. Adve | 70bc4b5 | 2001-07-21 12:41:50 +0000 | [diff] [blame] | 13 |  | 
| Chris Lattner | 822b4fb | 2001-09-07 17:18:30 +0000 | [diff] [blame] | 14 | #include "llvm/CodeGen/MachineInstr.h" | 
| Chris Lattner | 8517e1f | 2004-02-19 16:17:08 +0000 | [diff] [blame] | 15 | #include "llvm/CodeGen/MachineFunction.h" | 
| Chris Lattner | 1049164 | 2002-10-30 00:48:05 +0000 | [diff] [blame] | 16 | #include "llvm/Target/TargetMachine.h" | 
| Chris Lattner | 3501fea | 2003-01-14 22:00:31 +0000 | [diff] [blame] | 17 | #include "llvm/Target/TargetInstrInfo.h" | 
| Chris Lattner | 2a79a09 | 2002-10-30 00:58:19 +0000 | [diff] [blame] | 18 | #include "llvm/Target/MRegisterInfo.h" | 
| Reid Spencer | 551ccae | 2004-09-01 22:55:40 +0000 | [diff] [blame] | 19 | #include "llvm/Support/LeakDetector.h" | 
| Reid Spencer | 954da37 | 2004-07-04 12:19:56 +0000 | [diff] [blame] | 20 | #include <iostream> | 
 | 21 |  | 
| Chris Lattner | 0742b59 | 2004-02-23 18:38:20 +0000 | [diff] [blame] | 22 | using namespace llvm; | 
| Brian Gaeke | d0fde30 | 2003-11-11 22:41:34 +0000 | [diff] [blame] | 23 |  | 
| Chris Lattner | f1757c4 | 2002-10-29 17:40:30 +0000 | [diff] [blame] | 24 | // Global variable holding an array of descriptors for machine instructions. | 
 | 25 | // The actual object needs to be created separately for each target machine. | 
| Chris Lattner | 3501fea | 2003-01-14 22:00:31 +0000 | [diff] [blame] | 26 | // This variable is initialized and reset by class TargetInstrInfo. | 
| Misha Brukman | edf128a | 2005-04-21 22:36:52 +0000 | [diff] [blame] | 27 | // | 
| Chris Lattner | f1757c4 | 2002-10-29 17:40:30 +0000 | [diff] [blame] | 28 | // FIXME: This should be a property of the target so that more than one target | 
 | 29 | // at a time can be active... | 
 | 30 | // | 
| Chris Lattner | 11d1f21 | 2004-02-23 18:40:08 +0000 | [diff] [blame] | 31 | namespace llvm { | 
| Chris Lattner | 0742b59 | 2004-02-23 18:38:20 +0000 | [diff] [blame] | 32 |   extern const TargetInstrDescriptor *TargetInstrDescriptors; | 
 | 33 | } | 
| Ruchira Sasanka | 69917e2 | 2001-10-18 22:40:02 +0000 | [diff] [blame] | 34 |  | 
| Chris Lattner | ddd7fcb | 2002-10-29 23:19:00 +0000 | [diff] [blame] | 35 | /// MachineInstr ctor - This constructor only does a _reserve_ of the operands, | 
 | 36 | /// not a resize for them.  It is expected that if you use this that you call | 
 | 37 | /// add* methods below to fill up the operands, instead of the Set methods. | 
 | 38 | /// Eventually, the "resizing" ctors will be phased out. | 
 | 39 | /// | 
| Chris Lattner | 8b915b4 | 2006-05-04 18:16:01 +0000 | [diff] [blame] | 40 | MachineInstr::MachineInstr(short opcode, unsigned numOperands) | 
| Chris Lattner | 02e5f8d | 2006-04-20 18:08:53 +0000 | [diff] [blame] | 41 |   : Opcode(opcode), parent(0) { | 
| Chris Lattner | 943b5e1 | 2006-05-04 19:14:44 +0000 | [diff] [blame] | 42 |   Operands.reserve(numOperands); | 
| Alkis Evlogimenos | aad5c05 | 2004-02-16 07:17:43 +0000 | [diff] [blame] | 43 |   // Make sure that we get added to a machine basicblock | 
 | 44 |   LeakDetector::addGarbageObject(this); | 
| Chris Lattner | 7279122 | 2002-10-28 20:59:49 +0000 | [diff] [blame] | 45 | } | 
 | 46 |  | 
| Chris Lattner | ddd7fcb | 2002-10-29 23:19:00 +0000 | [diff] [blame] | 47 | /// MachineInstr ctor - Work exactly the same as the ctor above, except that the | 
 | 48 | /// MachineInstr is created and added to the end of the specified basic block. | 
 | 49 | /// | 
| Alkis Evlogimenos | ab8672c | 2004-02-12 18:49:07 +0000 | [diff] [blame] | 50 | MachineInstr::MachineInstr(MachineBasicBlock *MBB, short opcode, | 
| Chris Lattner | ddd7fcb | 2002-10-29 23:19:00 +0000 | [diff] [blame] | 51 |                            unsigned numOperands) | 
| Chris Lattner | 02e5f8d | 2006-04-20 18:08:53 +0000 | [diff] [blame] | 52 |   : Opcode(opcode), parent(0) { | 
| Chris Lattner | ddd7fcb | 2002-10-29 23:19:00 +0000 | [diff] [blame] | 53 |   assert(MBB && "Cannot use inserting ctor with null basic block!"); | 
| Chris Lattner | 943b5e1 | 2006-05-04 19:14:44 +0000 | [diff] [blame] | 54 |   Operands.reserve(numOperands); | 
| Alkis Evlogimenos | aad5c05 | 2004-02-16 07:17:43 +0000 | [diff] [blame] | 55 |   // Make sure that we get added to a machine basicblock | 
 | 56 |   LeakDetector::addGarbageObject(this); | 
| Chris Lattner | ddd7fcb | 2002-10-29 23:19:00 +0000 | [diff] [blame] | 57 |   MBB->push_back(this);  // Add instruction to end of basic block! | 
 | 58 | } | 
 | 59 |  | 
| Misha Brukman | ce22e76 | 2004-07-09 14:45:17 +0000 | [diff] [blame] | 60 | /// MachineInstr ctor - Copies MachineInstr arg exactly | 
 | 61 | /// | 
| Tanya Lattner | 466b534 | 2004-05-23 19:35:12 +0000 | [diff] [blame] | 62 | MachineInstr::MachineInstr(const MachineInstr &MI) { | 
 | 63 |   Opcode = MI.getOpcode(); | 
| Chris Lattner | 943b5e1 | 2006-05-04 19:14:44 +0000 | [diff] [blame] | 64 |   Operands.reserve(MI.getNumOperands()); | 
| Tanya Lattner | b5159ed | 2004-05-23 20:58:02 +0000 | [diff] [blame] | 65 |  | 
| Misha Brukman | ce22e76 | 2004-07-09 14:45:17 +0000 | [diff] [blame] | 66 |   // Add operands | 
| Chris Lattner | 943b5e1 | 2006-05-04 19:14:44 +0000 | [diff] [blame] | 67 |   for (unsigned i = 0; i != MI.getNumOperands(); ++i) | 
 | 68 |     Operands.push_back(MI.getOperand(i)); | 
| Tanya Lattner | 0c63e03 | 2004-05-24 03:14:18 +0000 | [diff] [blame] | 69 |  | 
| Misha Brukman | ce22e76 | 2004-07-09 14:45:17 +0000 | [diff] [blame] | 70 |   // Set parent, next, and prev to null | 
| Tanya Lattner | 0c63e03 | 2004-05-24 03:14:18 +0000 | [diff] [blame] | 71 |   parent = 0; | 
 | 72 |   prev = 0; | 
 | 73 |   next = 0; | 
| Tanya Lattner | 466b534 | 2004-05-23 19:35:12 +0000 | [diff] [blame] | 74 | } | 
 | 75 |  | 
 | 76 |  | 
| Misha Brukman | ce22e76 | 2004-07-09 14:45:17 +0000 | [diff] [blame] | 77 | MachineInstr::~MachineInstr() { | 
| Alkis Evlogimenos | aad5c05 | 2004-02-16 07:17:43 +0000 | [diff] [blame] | 78 |   LeakDetector::removeGarbageObject(this); | 
 | 79 | } | 
 | 80 |  | 
| Chris Lattner | 48d7c06 | 2006-04-17 21:35:41 +0000 | [diff] [blame] | 81 | /// removeFromParent - This method unlinks 'this' from the containing basic | 
 | 82 | /// block, and returns it, but does not delete it. | 
 | 83 | MachineInstr *MachineInstr::removeFromParent() { | 
 | 84 |   assert(getParent() && "Not embedded in a basic block!"); | 
 | 85 |   getParent()->remove(this); | 
 | 86 |   return this; | 
 | 87 | } | 
 | 88 |  | 
 | 89 |  | 
| Brian Gaeke | 21326fc | 2004-02-13 04:39:32 +0000 | [diff] [blame] | 90 | /// OperandComplete - Return true if it's illegal to add a new operand | 
 | 91 | /// | 
| Chris Lattner | 2a90ba6 | 2004-02-12 16:09:53 +0000 | [diff] [blame] | 92 | bool MachineInstr::OperandsComplete() const { | 
 | 93 |   int NumOperands = TargetInstrDescriptors[Opcode].numOperands; | 
| Vikram S. Adve | a2bae30 | 2002-10-29 19:41:18 +0000 | [diff] [blame] | 94 |   if (NumOperands >= 0 && getNumOperands() >= (unsigned)NumOperands) | 
| Vikram S. Adve | 3497782 | 2003-05-31 07:39:06 +0000 | [diff] [blame] | 95 |     return true;  // Broken: we have all the operands of this instruction! | 
| Chris Lattner | 413746e | 2002-10-28 20:48:39 +0000 | [diff] [blame] | 96 |   return false; | 
 | 97 | } | 
 | 98 |  | 
| Brian Gaeke | 21326fc | 2004-02-13 04:39:32 +0000 | [diff] [blame] | 99 | void MachineInstr::dump() const { | 
| Chris Lattner | 925b771 | 2003-08-03 20:24:29 +0000 | [diff] [blame] | 100 |   std::cerr << "  " << *this; | 
| Vikram S. Adve | 70bc4b5 | 2001-07-21 12:41:50 +0000 | [diff] [blame] | 101 | } | 
 | 102 |  | 
| Chris Lattner | 2a79a09 | 2002-10-30 00:58:19 +0000 | [diff] [blame] | 103 | static inline void OutputReg(std::ostream &os, unsigned RegNo, | 
 | 104 |                              const MRegisterInfo *MRI = 0) { | 
| Alkis Evlogimenos | ddcfd9e | 2004-02-27 01:52:34 +0000 | [diff] [blame] | 105 |   if (!RegNo || MRegisterInfo::isPhysicalRegister(RegNo)) { | 
| Chris Lattner | 8517e1f | 2004-02-19 16:17:08 +0000 | [diff] [blame] | 106 |     if (MRI) | 
| Chris Lattner | 2a79a09 | 2002-10-30 00:58:19 +0000 | [diff] [blame] | 107 |       os << "%" << MRI->get(RegNo).Name; | 
 | 108 |     else | 
| Chris Lattner | 8517e1f | 2004-02-19 16:17:08 +0000 | [diff] [blame] | 109 |       os << "%mreg(" << RegNo << ")"; | 
| Chris Lattner | 2a79a09 | 2002-10-30 00:58:19 +0000 | [diff] [blame] | 110 |   } else | 
| Chris Lattner | 8517e1f | 2004-02-19 16:17:08 +0000 | [diff] [blame] | 111 |     os << "%reg" << RegNo; | 
| Vikram S. Adve | 8c6936a | 2002-09-16 15:18:53 +0000 | [diff] [blame] | 112 | } | 
 | 113 |  | 
| Chris Lattner | 1049164 | 2002-10-30 00:48:05 +0000 | [diff] [blame] | 114 | static void print(const MachineOperand &MO, std::ostream &OS, | 
| Tanya Lattner | b140762 | 2004-06-25 00:13:11 +0000 | [diff] [blame] | 115 |                   const TargetMachine *TM) { | 
| Misha Brukman | ce22e76 | 2004-07-09 14:45:17 +0000 | [diff] [blame] | 116 |   const MRegisterInfo *MRI = 0; | 
| Misha Brukman | edf128a | 2005-04-21 22:36:52 +0000 | [diff] [blame] | 117 |  | 
| Misha Brukman | ce22e76 | 2004-07-09 14:45:17 +0000 | [diff] [blame] | 118 |   if (TM) MRI = TM->getRegisterInfo(); | 
| Tanya Lattner | b140762 | 2004-06-25 00:13:11 +0000 | [diff] [blame] | 119 |  | 
| Chris Lattner | 1049164 | 2002-10-30 00:48:05 +0000 | [diff] [blame] | 120 |   switch (MO.getType()) { | 
| Chris Lattner | 2d90ac7 | 2006-05-04 18:05:43 +0000 | [diff] [blame] | 121 |   case MachineOperand::MO_Register: | 
| Chris Lattner | 4efeab2 | 2006-05-04 01:26:39 +0000 | [diff] [blame] | 122 |     OutputReg(OS, MO.getReg(), MRI); | 
| Chris Lattner | 1049164 | 2002-10-30 00:48:05 +0000 | [diff] [blame] | 123 |     break; | 
| Chris Lattner | 63b3d71 | 2006-05-04 17:21:20 +0000 | [diff] [blame] | 124 |   case MachineOperand::MO_Immediate: | 
| Evan Cheng | 00aff7d | 2006-05-26 08:00:14 +0000 | [diff] [blame^] | 125 |     OS << MO.getImmedValue(); | 
| Chris Lattner | 1049164 | 2002-10-30 00:48:05 +0000 | [diff] [blame] | 126 |     break; | 
| Chris Lattner | 2109f50 | 2002-12-15 20:35:25 +0000 | [diff] [blame] | 127 |   case MachineOperand::MO_MachineBasicBlock: | 
| Brian Gaeke | 988b7ba | 2004-06-17 22:26:53 +0000 | [diff] [blame] | 128 |     OS << "mbb<" | 
| Chris Lattner | 2109f50 | 2002-12-15 20:35:25 +0000 | [diff] [blame] | 129 |        << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName() | 
| Brian Gaeke | 988b7ba | 2004-06-17 22:26:53 +0000 | [diff] [blame] | 130 |        << "," << (void*)MO.getMachineBasicBlock() << ">"; | 
| Chris Lattner | 2109f50 | 2002-12-15 20:35:25 +0000 | [diff] [blame] | 131 |     break; | 
| Chris Lattner | 10cb79b | 2002-12-28 20:37:37 +0000 | [diff] [blame] | 132 |   case MachineOperand::MO_FrameIndex: | 
 | 133 |     OS << "<fi#" << MO.getFrameIndex() << ">"; | 
 | 134 |     break; | 
| Chris Lattner | 8d95ef4 | 2003-01-13 00:23:24 +0000 | [diff] [blame] | 135 |   case MachineOperand::MO_ConstantPoolIndex: | 
 | 136 |     OS << "<cp#" << MO.getConstantPoolIndex() << ">"; | 
 | 137 |     break; | 
| Nate Begeman | 37efe67 | 2006-04-22 18:53:45 +0000 | [diff] [blame] | 138 |   case MachineOperand::MO_JumpTableIndex: | 
 | 139 |     OS << "<jt#" << MO.getJumpTableIndex() << ">"; | 
 | 140 |     break; | 
| Chris Lattner | 8d95ef4 | 2003-01-13 00:23:24 +0000 | [diff] [blame] | 141 |   case MachineOperand::MO_GlobalAddress: | 
| Chris Lattner | ca4f6eb | 2004-10-15 04:38:41 +0000 | [diff] [blame] | 142 |     OS << "<ga:" << ((Value*)MO.getGlobal())->getName(); | 
 | 143 |     if (MO.getOffset()) OS << "+" << MO.getOffset(); | 
 | 144 |     OS << ">"; | 
| Chris Lattner | 8d95ef4 | 2003-01-13 00:23:24 +0000 | [diff] [blame] | 145 |     break; | 
 | 146 |   case MachineOperand::MO_ExternalSymbol: | 
| Chris Lattner | ca4f6eb | 2004-10-15 04:38:41 +0000 | [diff] [blame] | 147 |     OS << "<es:" << MO.getSymbolName(); | 
 | 148 |     if (MO.getOffset()) OS << "+" << MO.getOffset(); | 
 | 149 |     OS << ">"; | 
| Chris Lattner | 8d95ef4 | 2003-01-13 00:23:24 +0000 | [diff] [blame] | 150 |     break; | 
| Chris Lattner | 1049164 | 2002-10-30 00:48:05 +0000 | [diff] [blame] | 151 |   default: | 
 | 152 |     assert(0 && "Unrecognized operand type"); | 
 | 153 |   } | 
| Chris Lattner | 1049164 | 2002-10-30 00:48:05 +0000 | [diff] [blame] | 154 | } | 
 | 155 |  | 
| Tanya Lattner | b140762 | 2004-06-25 00:13:11 +0000 | [diff] [blame] | 156 | void MachineInstr::print(std::ostream &OS, const TargetMachine *TM) const { | 
| Chris Lattner | 6a59227 | 2002-10-30 01:55:38 +0000 | [diff] [blame] | 157 |   unsigned StartOp = 0; | 
| Chris Lattner | 1049164 | 2002-10-30 00:48:05 +0000 | [diff] [blame] | 158 |  | 
| Chris Lattner | 6a59227 | 2002-10-30 01:55:38 +0000 | [diff] [blame] | 159 |    // Specialize printing if op#0 is definition | 
| Alkis Evlogimenos | 4d7af65 | 2003-12-14 13:24:17 +0000 | [diff] [blame] | 160 |   if (getNumOperands() && getOperand(0).isDef() && !getOperand(0).isUse()) { | 
| Chris Lattner | 0742b59 | 2004-02-23 18:38:20 +0000 | [diff] [blame] | 161 |     ::print(getOperand(0), OS, TM); | 
| Chris Lattner | 6a59227 | 2002-10-30 01:55:38 +0000 | [diff] [blame] | 162 |     OS << " = "; | 
 | 163 |     ++StartOp;   // Don't print this operand again! | 
 | 164 |   } | 
| Tanya Lattner | b140762 | 2004-06-25 00:13:11 +0000 | [diff] [blame] | 165 |  | 
| Misha Brukman | ce22e76 | 2004-07-09 14:45:17 +0000 | [diff] [blame] | 166 |   // Must check if Target machine is not null because machine BB could not | 
 | 167 |   // be attached to a Machine function yet | 
 | 168 |   if (TM) | 
| Tanya Lattner | b140762 | 2004-06-25 00:13:11 +0000 | [diff] [blame] | 169 |     OS << TM->getInstrInfo()->getName(getOpcode()); | 
| Misha Brukman | edf128a | 2005-04-21 22:36:52 +0000 | [diff] [blame] | 170 |  | 
| Chris Lattner | 6a59227 | 2002-10-30 01:55:38 +0000 | [diff] [blame] | 171 |   for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) { | 
| Vikram S. Adve | 5f2180c | 2003-05-27 00:05:23 +0000 | [diff] [blame] | 172 |     const MachineOperand& mop = getOperand(i); | 
| Chris Lattner | 6a59227 | 2002-10-30 01:55:38 +0000 | [diff] [blame] | 173 |     if (i != StartOp) | 
 | 174 |       OS << ","; | 
 | 175 |     OS << " "; | 
| Chris Lattner | 0742b59 | 2004-02-23 18:38:20 +0000 | [diff] [blame] | 176 |     ::print(mop, OS, TM); | 
| Misha Brukman | edf128a | 2005-04-21 22:36:52 +0000 | [diff] [blame] | 177 |  | 
| Alkis Evlogimenos | 4d7af65 | 2003-12-14 13:24:17 +0000 | [diff] [blame] | 178 |     if (mop.isDef()) | 
 | 179 |       if (mop.isUse()) | 
 | 180 |         OS << "<def&use>"; | 
 | 181 |       else | 
 | 182 |         OS << "<def>"; | 
| Chris Lattner | 1049164 | 2002-10-30 00:48:05 +0000 | [diff] [blame] | 183 |   } | 
| Misha Brukman | edf128a | 2005-04-21 22:36:52 +0000 | [diff] [blame] | 184 |  | 
| Chris Lattner | 1049164 | 2002-10-30 00:48:05 +0000 | [diff] [blame] | 185 |   OS << "\n"; | 
 | 186 | } | 
 | 187 |  | 
| Chris Lattner | 34fb2ca | 2006-05-04 00:49:59 +0000 | [diff] [blame] | 188 | std::ostream &llvm::operator<<(std::ostream &os, const MachineInstr &MI) { | 
| Chris Lattner | 8517e1f | 2004-02-19 16:17:08 +0000 | [diff] [blame] | 189 |   // If the instruction is embedded into a basic block, we can find the target | 
 | 190 |   // info for the instruction. | 
 | 191 |   if (const MachineBasicBlock *MBB = MI.getParent()) { | 
 | 192 |     const MachineFunction *MF = MBB->getParent(); | 
| Misha Brukman | ce22e76 | 2004-07-09 14:45:17 +0000 | [diff] [blame] | 193 |     if (MF) | 
| Tanya Lattner | b140762 | 2004-06-25 00:13:11 +0000 | [diff] [blame] | 194 |       MI.print(os, &MF->getTarget()); | 
 | 195 |     else | 
 | 196 |       MI.print(os, 0); | 
| Chris Lattner | 8517e1f | 2004-02-19 16:17:08 +0000 | [diff] [blame] | 197 |     return os; | 
 | 198 |   } | 
 | 199 |  | 
 | 200 |   // Otherwise, print it out in the "raw" format without symbolic register names | 
 | 201 |   // and such. | 
| Chris Lattner | 2a90ba6 | 2004-02-12 16:09:53 +0000 | [diff] [blame] | 202 |   os << TargetInstrDescriptors[MI.getOpcode()].Name; | 
| Misha Brukman | edf128a | 2005-04-21 22:36:52 +0000 | [diff] [blame] | 203 |  | 
| Misha Brukman | ce22e76 | 2004-07-09 14:45:17 +0000 | [diff] [blame] | 204 |   for (unsigned i = 0, N = MI.getNumOperands(); i < N; i++) { | 
| Chris Lattner | 8d95ef4 | 2003-01-13 00:23:24 +0000 | [diff] [blame] | 205 |     os << "\t" << MI.getOperand(i); | 
| Alkis Evlogimenos | 4d7af65 | 2003-12-14 13:24:17 +0000 | [diff] [blame] | 206 |     if (MI.getOperand(i).isDef()) | 
 | 207 |       if (MI.getOperand(i).isUse()) | 
 | 208 |         os << "<d&u>"; | 
 | 209 |       else | 
 | 210 |         os << "<d>"; | 
| Ruchira Sasanka | 8d24337 | 2001-11-14 20:05:23 +0000 | [diff] [blame] | 211 |   } | 
| Misha Brukman | edf128a | 2005-04-21 22:36:52 +0000 | [diff] [blame] | 212 |  | 
| Chris Lattner | 697954c | 2002-01-20 22:54:45 +0000 | [diff] [blame] | 213 |   return os << "\n"; | 
| Vikram S. Adve | 70bc4b5 | 2001-07-21 12:41:50 +0000 | [diff] [blame] | 214 | } | 
 | 215 |  | 
| Chris Lattner | 34fb2ca | 2006-05-04 00:49:59 +0000 | [diff] [blame] | 216 | std::ostream &llvm::operator<<(std::ostream &OS, const MachineOperand &MO) { | 
| Misha Brukman | ce22e76 | 2004-07-09 14:45:17 +0000 | [diff] [blame] | 217 |   switch (MO.getType()) { | 
| Chris Lattner | 2d90ac7 | 2006-05-04 18:05:43 +0000 | [diff] [blame] | 218 |   case MachineOperand::MO_Register: | 
| Chris Lattner | 4efeab2 | 2006-05-04 01:26:39 +0000 | [diff] [blame] | 219 |     OutputReg(OS, MO.getReg()); | 
| Misha Brukman | ce22e76 | 2004-07-09 14:45:17 +0000 | [diff] [blame] | 220 |     break; | 
| Chris Lattner | 63b3d71 | 2006-05-04 17:21:20 +0000 | [diff] [blame] | 221 |   case MachineOperand::MO_Immediate: | 
| Misha Brukman | ce22e76 | 2004-07-09 14:45:17 +0000 | [diff] [blame] | 222 |     OS << (long)MO.getImmedValue(); | 
 | 223 |     break; | 
| Misha Brukman | ce22e76 | 2004-07-09 14:45:17 +0000 | [diff] [blame] | 224 |   case MachineOperand::MO_MachineBasicBlock: | 
 | 225 |     OS << "<mbb:" | 
 | 226 |        << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName() | 
 | 227 |        << "@" << (void*)MO.getMachineBasicBlock() << ">"; | 
 | 228 |     break; | 
 | 229 |   case MachineOperand::MO_FrameIndex: | 
 | 230 |     OS << "<fi#" << MO.getFrameIndex() << ">"; | 
 | 231 |     break; | 
 | 232 |   case MachineOperand::MO_ConstantPoolIndex: | 
 | 233 |     OS << "<cp#" << MO.getConstantPoolIndex() << ">"; | 
 | 234 |     break; | 
| Nate Begeman | 37efe67 | 2006-04-22 18:53:45 +0000 | [diff] [blame] | 235 |   case MachineOperand::MO_JumpTableIndex: | 
 | 236 |     OS << "<jt#" << MO.getJumpTableIndex() << ">"; | 
 | 237 |     break; | 
| Misha Brukman | ce22e76 | 2004-07-09 14:45:17 +0000 | [diff] [blame] | 238 |   case MachineOperand::MO_GlobalAddress: | 
 | 239 |     OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">"; | 
 | 240 |     break; | 
 | 241 |   case MachineOperand::MO_ExternalSymbol: | 
 | 242 |     OS << "<es:" << MO.getSymbolName() << ">"; | 
 | 243 |     break; | 
 | 244 |   default: | 
 | 245 |     assert(0 && "Unrecognized operand type"); | 
 | 246 |     break; | 
 | 247 |   } | 
| Misha Brukman | edf128a | 2005-04-21 22:36:52 +0000 | [diff] [blame] | 248 |  | 
| Chris Lattner | 10cb79b | 2002-12-28 20:37:37 +0000 | [diff] [blame] | 249 |   return OS; | 
| Vikram S. Adve | 70bc4b5 | 2001-07-21 12:41:50 +0000 | [diff] [blame] | 250 | } |