blob: 3aabbc47f5fc1880992753dd94d35aa07e66732c [file] [log] [blame]
Chris Lattner035dfbe2002-08-09 20:08:06 +00001//===-- MachineInstr.cpp --------------------------------------------------===//
Vikram S. Adve70bc4b52001-07-21 12:41:50 +00002//
John Criswellb576c942003-10-20 19:43:21 +00003// 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.
7//
8//===----------------------------------------------------------------------===//
Brian Gaeke21326fc2004-02-13 04:39:32 +00009//
10// Methods common to all machine instructions.
11//
12// FIXME: Now that MachineInstrs have parent pointers, they should always
13// print themselves using their MachineFunction's TargetMachine.
14//
Chris Lattner035dfbe2002-08-09 20:08:06 +000015//===----------------------------------------------------------------------===//
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000016
Chris Lattner822b4fb2001-09-07 17:18:30 +000017#include "llvm/CodeGen/MachineInstr.h"
Chris Lattner8517e1f2004-02-19 16:17:08 +000018#include "llvm/CodeGen/MachineFunction.h"
Chris Lattner3801f6d2002-02-03 07:46:01 +000019#include "llvm/Value.h"
Chris Lattner10491642002-10-30 00:48:05 +000020#include "llvm/Target/TargetMachine.h"
Chris Lattner3501fea2003-01-14 22:00:31 +000021#include "llvm/Target/TargetInstrInfo.h"
Chris Lattner2a79a092002-10-30 00:58:19 +000022#include "llvm/Target/MRegisterInfo.h"
Alkis Evlogimenosaad5c052004-02-16 07:17:43 +000023#include "Support/LeakDetector.h"
Chris Lattner8d95ef42003-01-13 00:23:24 +000024
Brian Gaeked0fde302003-11-11 22:41:34 +000025namespace llvm {
26
Chris Lattnerf1757c42002-10-29 17:40:30 +000027// Global variable holding an array of descriptors for machine instructions.
28// The actual object needs to be created separately for each target machine.
Chris Lattner3501fea2003-01-14 22:00:31 +000029// This variable is initialized and reset by class TargetInstrInfo.
Chris Lattnerf1757c42002-10-29 17:40:30 +000030//
31// FIXME: This should be a property of the target so that more than one target
32// at a time can be active...
33//
Chris Lattner3501fea2003-01-14 22:00:31 +000034extern const TargetInstrDescriptor *TargetInstrDescriptors;
Ruchira Sasanka69917e22001-10-18 22:40:02 +000035
Vikram S. Adve1885da42001-07-31 21:49:28 +000036// Constructor for instructions with variable #operands
Alkis Evlogimenosab8672c2004-02-12 18:49:07 +000037MachineInstr::MachineInstr(short opcode, unsigned numOperands)
38 : Opcode(opcode),
39 numImplicitRefs(0),
40 operands(numOperands, MachineOperand()),
41 parent(0) {
Alkis Evlogimenosaad5c052004-02-16 07:17:43 +000042 // Make sure that we get added to a machine basicblock
43 LeakDetector::addGarbageObject(this);
Vikram S. Adve70bc4b52001-07-21 12:41:50 +000044}
45
Chris Lattnerddd7fcb2002-10-29 23:19:00 +000046/// MachineInstr ctor - This constructor only does a _reserve_ of the operands,
47/// not a resize for them. It is expected that if you use this that you call
48/// add* methods below to fill up the operands, instead of the Set methods.
49/// Eventually, the "resizing" ctors will be phased out.
50///
Brian Gaeke21326fc2004-02-13 04:39:32 +000051MachineInstr::MachineInstr(short opcode, unsigned numOperands, bool XX, bool YY)
52 : Opcode(opcode), numImplicitRefs(0), parent(0) {
Chris Lattner72791222002-10-28 20:59:49 +000053 operands.reserve(numOperands);
Alkis Evlogimenosaad5c052004-02-16 07:17:43 +000054 // Make sure that we get added to a machine basicblock
55 LeakDetector::addGarbageObject(this);
Chris Lattner72791222002-10-28 20:59:49 +000056}
57
Chris Lattnerddd7fcb2002-10-29 23:19:00 +000058/// MachineInstr ctor - Work exactly the same as the ctor above, except that the
59/// MachineInstr is created and added to the end of the specified basic block.
60///
Alkis Evlogimenosab8672c2004-02-12 18:49:07 +000061MachineInstr::MachineInstr(MachineBasicBlock *MBB, short opcode,
Chris Lattnerddd7fcb2002-10-29 23:19:00 +000062 unsigned numOperands)
Brian Gaeke21326fc2004-02-13 04:39:32 +000063 : Opcode(opcode), numImplicitRefs(0), parent(0) {
Chris Lattnerddd7fcb2002-10-29 23:19:00 +000064 assert(MBB && "Cannot use inserting ctor with null basic block!");
65 operands.reserve(numOperands);
Alkis Evlogimenosaad5c052004-02-16 07:17:43 +000066 // Make sure that we get added to a machine basicblock
67 LeakDetector::addGarbageObject(this);
Chris Lattnerddd7fcb2002-10-29 23:19:00 +000068 MBB->push_back(this); // Add instruction to end of basic block!
69}
70
Alkis Evlogimenosaad5c052004-02-16 07:17:43 +000071MachineInstr::~MachineInstr()
72{
73 LeakDetector::removeGarbageObject(this);
74}
75
Brian Gaeke21326fc2004-02-13 04:39:32 +000076/// OperandComplete - Return true if it's illegal to add a new operand
77///
Chris Lattner2a90ba62004-02-12 16:09:53 +000078bool MachineInstr::OperandsComplete() const {
79 int NumOperands = TargetInstrDescriptors[Opcode].numOperands;
Vikram S. Advea2bae302002-10-29 19:41:18 +000080 if (NumOperands >= 0 && getNumOperands() >= (unsigned)NumOperands)
Vikram S. Adve34977822003-05-31 07:39:06 +000081 return true; // Broken: we have all the operands of this instruction!
Chris Lattner413746e2002-10-28 20:48:39 +000082 return false;
83}
84
Brian Gaeke21326fc2004-02-13 04:39:32 +000085/// replace - Support for replacing opcode and operands of a MachineInstr in
86/// place. This only resets the size of the operand vector and initializes it.
87/// The new operands must be set explicitly later.
88///
Alkis Evlogimenosab8672c2004-02-12 18:49:07 +000089void MachineInstr::replace(short opcode, unsigned numOperands) {
Vikram S. Advea2bae302002-10-29 19:41:18 +000090 assert(getNumImplicitRefs() == 0 &&
91 "This is probably broken because implicit refs are going to be lost.");
Chris Lattner2a90ba62004-02-12 16:09:53 +000092 Opcode = opcode;
Vikram S. Advee8b57ef2002-09-20 00:47:49 +000093 operands.clear();
Chris Lattner413746e2002-10-28 20:48:39 +000094 operands.resize(numOperands, MachineOperand());
Vikram S. Advee8b57ef2002-09-20 00:47:49 +000095}
96
Chris Lattnera2dd7452003-08-05 16:58:46 +000097void MachineInstr::SetMachineOperandVal(unsigned i,
98 MachineOperand::MachineOperandType opTy,
99 Value* V) {
Vikram S. Advea2bae302002-10-29 19:41:18 +0000100 assert(i < operands.size()); // may be explicit or implicit op
Chris Lattnera2dd7452003-08-05 16:58:46 +0000101 operands[i].opType = opTy;
Chris Lattner572f5c82002-10-28 04:24:49 +0000102 operands[i].value = V;
103 operands[i].regNum = -1;
Vikram S. Adve70bc4b52001-07-21 12:41:50 +0000104}
105
106void
Chris Lattner572f5c82002-10-28 04:24:49 +0000107MachineInstr::SetMachineOperandConst(unsigned i,
Brian Gaeke21326fc2004-02-13 04:39:32 +0000108 MachineOperand::MachineOperandType opTy,
Chris Lattner2a90ba62004-02-12 16:09:53 +0000109 int64_t intValue) {
Vikram S. Advea2bae302002-10-29 19:41:18 +0000110 assert(i < getNumOperands()); // must be explicit op
Chris Lattner2a90ba62004-02-12 16:09:53 +0000111 assert(TargetInstrDescriptors[Opcode].resultPos != (int) i &&
Vikram S. Advec356e562002-03-18 03:35:24 +0000112 "immed. constant cannot be defined");
Chris Lattner572f5c82002-10-28 04:24:49 +0000113
Brian Gaeke21326fc2004-02-13 04:39:32 +0000114 operands[i].opType = opTy;
Chris Lattner572f5c82002-10-28 04:24:49 +0000115 operands[i].value = NULL;
116 operands[i].immedVal = intValue;
117 operands[i].regNum = -1;
118 operands[i].flags = 0;
Vikram S. Adve70bc4b52001-07-21 12:41:50 +0000119}
120
Chris Lattnera2dd7452003-08-05 16:58:46 +0000121void MachineInstr::SetMachineOperandReg(unsigned i, int regNum) {
Vikram S. Advea2bae302002-10-29 19:41:18 +0000122 assert(i < getNumOperands()); // must be explicit op
Chris Lattner572f5c82002-10-28 04:24:49 +0000123
Chris Lattner2f305982002-10-28 19:46:59 +0000124 operands[i].opType = MachineOperand::MO_MachineRegister;
Chris Lattner572f5c82002-10-28 04:24:49 +0000125 operands[i].value = NULL;
126 operands[i].regNum = regNum;
Vikram S. Adve70bc4b52001-07-21 12:41:50 +0000127}
128
Brian Gaeke21326fc2004-02-13 04:39:32 +0000129// Used only by the SPARC back-end.
Chris Lattner2a90ba62004-02-12 16:09:53 +0000130void MachineInstr::SetRegForOperand(unsigned i, int regNum) {
Vikram S. Advea2bae302002-10-29 19:41:18 +0000131 assert(i < getNumOperands()); // must be explicit op
Vikram S. Adve7a4be952002-07-08 22:38:45 +0000132 operands[i].setRegForValue(regNum);
Vikram S. Adve7a4be952002-07-08 22:38:45 +0000133}
134
Brian Gaeke21326fc2004-02-13 04:39:32 +0000135// Used only by the SPARC back-end.
Chris Lattner2a90ba62004-02-12 16:09:53 +0000136void MachineInstr::SetRegForImplicitRef(unsigned i, int regNum) {
Vikram S. Adve34977822003-05-31 07:39:06 +0000137 getImplicitOp(i).setRegForValue(regNum);
Vikram S. Adve34977822003-05-31 07:39:06 +0000138}
139
Brian Gaeke21326fc2004-02-13 04:39:32 +0000140/// substituteValue - Substitute all occurrences of Value* oldVal with newVal
141/// in all operands and all implicit refs. If defsOnly == true, substitute defs
142/// only.
143///
144/// FIXME: Fold this into its single caller, at SparcInstrSelection.cpp:2865,
145/// or make it a static function in that file.
146///
Vikram S. Advee2a78e32002-08-14 16:52:58 +0000147unsigned
Vikram S. Adve627eb312003-07-10 19:45:07 +0000148MachineInstr::substituteValue(const Value* oldVal, Value* newVal,
149 bool defsOnly, bool notDefsAndUses,
150 bool& someArgsWereIgnored)
Vikram S. Advee2a78e32002-08-14 16:52:58 +0000151{
Vikram S. Adve2010f7b2003-08-07 15:01:48 +0000152 assert((!defsOnly || !notDefsAndUses) &&
153 "notDefsAndUses is irrelevant if defsOnly == true.");
Vikram S. Adve627eb312003-07-10 19:45:07 +0000154
Vikram S. Advee2a78e32002-08-14 16:52:58 +0000155 unsigned numSubst = 0;
156
Misha Brukman6eba07a2003-09-17 21:34:23 +0000157 // Substitute operands
Vikram S. Advee2a78e32002-08-14 16:52:58 +0000158 for (MachineInstr::val_op_iterator O = begin(), E = end(); O != E; ++O)
159 if (*O == oldVal)
Vikram S. Adve627eb312003-07-10 19:45:07 +0000160 if (!defsOnly ||
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000161 notDefsAndUses && (O.isDef() && !O.isUse()) ||
162 !notDefsAndUses && O.isDef())
Vikram S. Advee2a78e32002-08-14 16:52:58 +0000163 {
164 O.getMachineOperand().value = newVal;
165 ++numSubst;
166 }
Vikram S. Adve627eb312003-07-10 19:45:07 +0000167 else
168 someArgsWereIgnored = true;
Vikram S. Advee2a78e32002-08-14 16:52:58 +0000169
Misha Brukman6eba07a2003-09-17 21:34:23 +0000170 // Substitute implicit refs
Vikram S. Advea2bae302002-10-29 19:41:18 +0000171 for (unsigned i=0, N=getNumImplicitRefs(); i < N; ++i)
Chris Lattner27a08932002-10-22 23:16:21 +0000172 if (getImplicitRef(i) == oldVal)
Vikram S. Adve627eb312003-07-10 19:45:07 +0000173 if (!defsOnly ||
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000174 notDefsAndUses && (getImplicitOp(i).isDef() && !getImplicitOp(i).isUse()) ||
175 !notDefsAndUses && getImplicitOp(i).isDef())
Vikram S. Advee2a78e32002-08-14 16:52:58 +0000176 {
Vikram S. Advea2bae302002-10-29 19:41:18 +0000177 getImplicitOp(i).value = newVal;
Vikram S. Advee2a78e32002-08-14 16:52:58 +0000178 ++numSubst;
179 }
Vikram S. Adve627eb312003-07-10 19:45:07 +0000180 else
181 someArgsWereIgnored = true;
Vikram S. Advee2a78e32002-08-14 16:52:58 +0000182
183 return numSubst;
184}
185
Brian Gaeke21326fc2004-02-13 04:39:32 +0000186void MachineInstr::dump() const {
Chris Lattner925b7712003-08-03 20:24:29 +0000187 std::cerr << " " << *this;
Vikram S. Adve70bc4b52001-07-21 12:41:50 +0000188}
189
Brian Gaeke21326fc2004-02-13 04:39:32 +0000190static inline std::ostream& OutputValue(std::ostream &os, const Value* val) {
Vikram S. Adve93240fe2002-04-25 04:31:18 +0000191 os << "(val ";
Vikram S. Adve627eb312003-07-10 19:45:07 +0000192 os << (void*) val; // print address always
Vikram S. Adve93240fe2002-04-25 04:31:18 +0000193 if (val && val->hasName())
Brian Gaeke21326fc2004-02-13 04:39:32 +0000194 os << " " << val->getName(); // print name also, if available
195 os << ")";
Vikram S. Adve627eb312003-07-10 19:45:07 +0000196 return os;
Vikram S. Adve93240fe2002-04-25 04:31:18 +0000197}
198
Chris Lattner2a79a092002-10-30 00:58:19 +0000199static inline void OutputReg(std::ostream &os, unsigned RegNo,
200 const MRegisterInfo *MRI = 0) {
Chris Lattner8517e1f2004-02-19 16:17:08 +0000201 if (MRegisterInfo::isPhysicalRegister(RegNo)) {
202 if (MRI)
Chris Lattner2a79a092002-10-30 00:58:19 +0000203 os << "%" << MRI->get(RegNo).Name;
204 else
Chris Lattner8517e1f2004-02-19 16:17:08 +0000205 os << "%mreg(" << RegNo << ")";
Chris Lattner2a79a092002-10-30 00:58:19 +0000206 } else
Chris Lattner8517e1f2004-02-19 16:17:08 +0000207 os << "%reg" << RegNo;
Vikram S. Adve8c6936a2002-09-16 15:18:53 +0000208}
209
Chris Lattner10491642002-10-30 00:48:05 +0000210static void print(const MachineOperand &MO, std::ostream &OS,
211 const TargetMachine &TM) {
Chris Lattner2a79a092002-10-30 00:58:19 +0000212 const MRegisterInfo *MRI = TM.getRegisterInfo();
Chris Lattner10491642002-10-30 00:48:05 +0000213 bool CloseParen = true;
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000214 if (MO.isHiBits32())
Chris Lattner10491642002-10-30 00:48:05 +0000215 OS << "%lm(";
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000216 else if (MO.isLoBits32())
Chris Lattner10491642002-10-30 00:48:05 +0000217 OS << "%lo(";
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000218 else if (MO.isHiBits64())
Chris Lattner10491642002-10-30 00:48:05 +0000219 OS << "%hh(";
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000220 else if (MO.isLoBits64())
Chris Lattner10491642002-10-30 00:48:05 +0000221 OS << "%hm(";
222 else
223 CloseParen = false;
224
225 switch (MO.getType()) {
226 case MachineOperand::MO_VirtualRegister:
227 if (MO.getVRegValue()) {
228 OS << "%reg";
229 OutputValue(OS, MO.getVRegValue());
230 if (MO.hasAllocatedReg())
231 OS << "==";
232 }
233 if (MO.hasAllocatedReg())
Alkis Evlogimenosbe766c72004-02-13 21:01:20 +0000234 OutputReg(OS, MO.getReg(), MRI);
Chris Lattner10491642002-10-30 00:48:05 +0000235 break;
236 case MachineOperand::MO_CCRegister:
237 OS << "%ccreg";
238 OutputValue(OS, MO.getVRegValue());
239 if (MO.hasAllocatedReg()) {
240 OS << "==";
Alkis Evlogimenosbe766c72004-02-13 21:01:20 +0000241 OutputReg(OS, MO.getReg(), MRI);
Chris Lattner10491642002-10-30 00:48:05 +0000242 }
243 break;
244 case MachineOperand::MO_MachineRegister:
Chris Lattner2a79a092002-10-30 00:58:19 +0000245 OutputReg(OS, MO.getMachineRegNum(), MRI);
Chris Lattner10491642002-10-30 00:48:05 +0000246 break;
247 case MachineOperand::MO_SignExtendedImmed:
248 OS << (long)MO.getImmedValue();
249 break;
250 case MachineOperand::MO_UnextendedImmed:
251 OS << (long)MO.getImmedValue();
252 break;
253 case MachineOperand::MO_PCRelativeDisp: {
254 const Value* opVal = MO.getVRegValue();
255 bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal);
256 OS << "%disp(" << (isLabel? "label " : "addr-of-val ");
257 if (opVal->hasName())
258 OS << opVal->getName();
259 else
260 OS << (const void*) opVal;
261 OS << ")";
262 break;
263 }
Chris Lattner2109f502002-12-15 20:35:25 +0000264 case MachineOperand::MO_MachineBasicBlock:
265 OS << "bb<"
266 << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName()
267 << "," << (void*)MO.getMachineBasicBlock()->getBasicBlock() << ">";
268 break;
Chris Lattner10cb79b2002-12-28 20:37:37 +0000269 case MachineOperand::MO_FrameIndex:
270 OS << "<fi#" << MO.getFrameIndex() << ">";
271 break;
Chris Lattner8d95ef42003-01-13 00:23:24 +0000272 case MachineOperand::MO_ConstantPoolIndex:
273 OS << "<cp#" << MO.getConstantPoolIndex() << ">";
274 break;
275 case MachineOperand::MO_GlobalAddress:
276 OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">";
277 break;
278 case MachineOperand::MO_ExternalSymbol:
279 OS << "<es:" << MO.getSymbolName() << ">";
280 break;
Chris Lattner10491642002-10-30 00:48:05 +0000281 default:
282 assert(0 && "Unrecognized operand type");
283 }
284
285 if (CloseParen)
286 OS << ")";
287}
288
Chris Lattneraf55be12002-11-17 23:22:13 +0000289void MachineInstr::print(std::ostream &OS, const TargetMachine &TM) const {
Chris Lattner6a592272002-10-30 01:55:38 +0000290 unsigned StartOp = 0;
Chris Lattner10491642002-10-30 00:48:05 +0000291
Chris Lattner6a592272002-10-30 01:55:38 +0000292 // Specialize printing if op#0 is definition
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000293 if (getNumOperands() && getOperand(0).isDef() && !getOperand(0).isUse()) {
Brian Gaeked0fde302003-11-11 22:41:34 +0000294 llvm::print(getOperand(0), OS, TM);
Chris Lattner6a592272002-10-30 01:55:38 +0000295 OS << " = ";
296 ++StartOp; // Don't print this operand again!
297 }
298 OS << TM.getInstrInfo().getName(getOpcode());
299
300 for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) {
Vikram S. Adve5f2180c2003-05-27 00:05:23 +0000301 const MachineOperand& mop = getOperand(i);
Chris Lattner6a592272002-10-30 01:55:38 +0000302 if (i != StartOp)
303 OS << ",";
304 OS << " ";
Brian Gaeked0fde302003-11-11 22:41:34 +0000305 llvm::print(mop, OS, TM);
Chris Lattner6a592272002-10-30 01:55:38 +0000306
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000307 if (mop.isDef())
308 if (mop.isUse())
309 OS << "<def&use>";
310 else
311 OS << "<def>";
Chris Lattner10491642002-10-30 00:48:05 +0000312 }
Chris Lattner6a592272002-10-30 01:55:38 +0000313
Misha Brukman6eba07a2003-09-17 21:34:23 +0000314 // code for printing implicit references
Chris Lattner10491642002-10-30 00:48:05 +0000315 if (getNumImplicitRefs()) {
316 OS << "\tImplicitRefs: ";
317 for(unsigned i = 0, e = getNumImplicitRefs(); i != e; ++i) {
318 OS << "\t";
Vikram S. Adve5f2180c2003-05-27 00:05:23 +0000319 OutputValue(OS, getImplicitRef(i));
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000320 if (getImplicitOp(i).isDef())
321 if (getImplicitOp(i).isUse())
322 OS << "<def&use>";
323 else
324 OS << "<def>";
Chris Lattner10491642002-10-30 00:48:05 +0000325 }
326 }
327
328 OS << "\n";
329}
330
Chris Lattner8517e1f2004-02-19 16:17:08 +0000331std::ostream &operator<<(std::ostream &os, const MachineInstr &MI) {
332 // If the instruction is embedded into a basic block, we can find the target
333 // info for the instruction.
334 if (const MachineBasicBlock *MBB = MI.getParent()) {
335 const MachineFunction *MF = MBB->getParent();
336 MI.print(os, MF->getTarget());
337 return os;
338 }
339
340 // Otherwise, print it out in the "raw" format without symbolic register names
341 // and such.
Chris Lattner2a90ba62004-02-12 16:09:53 +0000342 os << TargetInstrDescriptors[MI.getOpcode()].Name;
Vikram S. Adve70bc4b52001-07-21 12:41:50 +0000343
Chris Lattner8d95ef42003-01-13 00:23:24 +0000344 for (unsigned i=0, N=MI.getNumOperands(); i < N; i++) {
345 os << "\t" << MI.getOperand(i);
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000346 if (MI.getOperand(i).isDef())
347 if (MI.getOperand(i).isUse())
348 os << "<d&u>";
349 else
350 os << "<d>";
Ruchira Sasanka8d243372001-11-14 20:05:23 +0000351 }
Vikram S. Adve70bc4b52001-07-21 12:41:50 +0000352
Misha Brukman6eba07a2003-09-17 21:34:23 +0000353 // code for printing implicit references
Chris Lattner8d95ef42003-01-13 00:23:24 +0000354 unsigned NumOfImpRefs = MI.getNumImplicitRefs();
355 if (NumOfImpRefs > 0) {
Vikram S. Adve93240fe2002-04-25 04:31:18 +0000356 os << "\tImplicit: ";
Chris Lattner8d95ef42003-01-13 00:23:24 +0000357 for (unsigned z=0; z < NumOfImpRefs; z++) {
358 OutputValue(os, MI.getImplicitRef(z));
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000359 if (MI.getImplicitOp(z).isDef())
360 if (MI.getImplicitOp(z).isUse())
361 os << "<d&u>";
362 else
363 os << "<d>";
Ruchira Sasanka07c70862001-11-15 20:46:40 +0000364 os << "\t";
Ruchira Sasanka69917e22001-10-18 22:40:02 +0000365 }
366 }
Vikram S. Adve93240fe2002-04-25 04:31:18 +0000367
Chris Lattner697954c2002-01-20 22:54:45 +0000368 return os << "\n";
Vikram S. Adve70bc4b52001-07-21 12:41:50 +0000369}
370
Brian Gaeke21326fc2004-02-13 04:39:32 +0000371std::ostream &operator<<(std::ostream &OS, const MachineOperand &MO) {
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000372 if (MO.isHiBits32())
Chris Lattner10cb79b2002-12-28 20:37:37 +0000373 OS << "%lm(";
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000374 else if (MO.isLoBits32())
Chris Lattner10cb79b2002-12-28 20:37:37 +0000375 OS << "%lo(";
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000376 else if (MO.isHiBits64())
Chris Lattner10cb79b2002-12-28 20:37:37 +0000377 OS << "%hh(";
Alkis Evlogimenos4d7af652003-12-14 13:24:17 +0000378 else if (MO.isLoBits64())
Chris Lattner10cb79b2002-12-28 20:37:37 +0000379 OS << "%hm(";
Vikram S. Adve3bc9ef92002-07-10 21:45:04 +0000380
Chris Lattner2109f502002-12-15 20:35:25 +0000381 switch (MO.getType())
Vikram S. Adve6e447182001-09-18 12:56:28 +0000382 {
383 case MachineOperand::MO_VirtualRegister:
Chris Lattner8d95ef42003-01-13 00:23:24 +0000384 if (MO.hasAllocatedReg())
Alkis Evlogimenosbe766c72004-02-13 21:01:20 +0000385 OutputReg(OS, MO.getReg());
Chris Lattner8d95ef42003-01-13 00:23:24 +0000386
387 if (MO.getVRegValue()) {
388 if (MO.hasAllocatedReg()) OS << "==";
389 OS << "%vreg";
390 OutputValue(OS, MO.getVRegValue());
Chris Lattner10491642002-10-30 00:48:05 +0000391 }
Vikram S. Adve3bc9ef92002-07-10 21:45:04 +0000392 break;
Vikram S. Adve6e447182001-09-18 12:56:28 +0000393 case MachineOperand::MO_CCRegister:
Chris Lattner10cb79b2002-12-28 20:37:37 +0000394 OS << "%ccreg";
395 OutputValue(OS, MO.getVRegValue());
Chris Lattner2109f502002-12-15 20:35:25 +0000396 if (MO.hasAllocatedReg()) {
Chris Lattner10cb79b2002-12-28 20:37:37 +0000397 OS << "==";
Alkis Evlogimenosbe766c72004-02-13 21:01:20 +0000398 OutputReg(OS, MO.getReg());
Chris Lattner10491642002-10-30 00:48:05 +0000399 }
Vikram S. Adve3bc9ef92002-07-10 21:45:04 +0000400 break;
401 case MachineOperand::MO_MachineRegister:
Chris Lattner10cb79b2002-12-28 20:37:37 +0000402 OutputReg(OS, MO.getMachineRegNum());
Vikram S. Adve3bc9ef92002-07-10 21:45:04 +0000403 break;
Vikram S. Adve6e447182001-09-18 12:56:28 +0000404 case MachineOperand::MO_SignExtendedImmed:
Chris Lattner10cb79b2002-12-28 20:37:37 +0000405 OS << (long)MO.getImmedValue();
Vikram S. Adve3bc9ef92002-07-10 21:45:04 +0000406 break;
Vikram S. Adve6e447182001-09-18 12:56:28 +0000407 case MachineOperand::MO_UnextendedImmed:
Chris Lattner10cb79b2002-12-28 20:37:37 +0000408 OS << (long)MO.getImmedValue();
Vikram S. Adve3bc9ef92002-07-10 21:45:04 +0000409 break;
Vikram S. Adve6e447182001-09-18 12:56:28 +0000410 case MachineOperand::MO_PCRelativeDisp:
Vikram S. Advee949da52001-09-30 23:44:19 +0000411 {
Chris Lattner2109f502002-12-15 20:35:25 +0000412 const Value* opVal = MO.getVRegValue();
Chris Lattner4d669b52002-04-08 22:01:15 +0000413 bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal);
Chris Lattner10cb79b2002-12-28 20:37:37 +0000414 OS << "%disp(" << (isLabel? "label " : "addr-of-val ");
Vikram S. Adved9beb972001-11-12 14:19:47 +0000415 if (opVal->hasName())
Chris Lattner10cb79b2002-12-28 20:37:37 +0000416 OS << opVal->getName();
Vikram S. Adved9beb972001-11-12 14:19:47 +0000417 else
Chris Lattner10cb79b2002-12-28 20:37:37 +0000418 OS << (const void*) opVal;
419 OS << ")";
Vikram S. Adve3bc9ef92002-07-10 21:45:04 +0000420 break;
Vikram S. Advee949da52001-09-30 23:44:19 +0000421 }
Chris Lattner2109f502002-12-15 20:35:25 +0000422 case MachineOperand::MO_MachineBasicBlock:
Chris Lattner10cb79b2002-12-28 20:37:37 +0000423 OS << "bb<"
Chris Lattner2109f502002-12-15 20:35:25 +0000424 << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName()
425 << "," << (void*)MO.getMachineBasicBlock()->getBasicBlock() << ">";
426 break;
Chris Lattner10cb79b2002-12-28 20:37:37 +0000427 case MachineOperand::MO_FrameIndex:
428 OS << "<fi#" << MO.getFrameIndex() << ">";
429 break;
Chris Lattner8d95ef42003-01-13 00:23:24 +0000430 case MachineOperand::MO_ConstantPoolIndex:
431 OS << "<cp#" << MO.getConstantPoolIndex() << ">";
432 break;
433 case MachineOperand::MO_GlobalAddress:
434 OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">";
435 break;
436 case MachineOperand::MO_ExternalSymbol:
437 OS << "<es:" << MO.getSymbolName() << ">";
438 break;
Vikram S. Adve6e447182001-09-18 12:56:28 +0000439 default:
440 assert(0 && "Unrecognized operand type");
441 break;
442 }
Vikram S. Adve70bc4b52001-07-21 12:41:50 +0000443
Chris Lattner2109f502002-12-15 20:35:25 +0000444 if (MO.flags &
Vikram S. Adve3bc9ef92002-07-10 21:45:04 +0000445 (MachineOperand::HIFLAG32 | MachineOperand::LOFLAG32 |
446 MachineOperand::HIFLAG64 | MachineOperand::LOFLAG64))
Chris Lattner10cb79b2002-12-28 20:37:37 +0000447 OS << ")";
Vikram S. Adve3bc9ef92002-07-10 21:45:04 +0000448
Chris Lattner10cb79b2002-12-28 20:37:37 +0000449 return OS;
Vikram S. Adve70bc4b52001-07-21 12:41:50 +0000450}
Brian Gaeked0fde302003-11-11 22:41:34 +0000451
452} // End llvm namespace