MachineInstr.cpp revision 570f55de8d9f53a0d8a5dc6dcbb6aaba46b1b6db
13a8b0f00e6d23ae57fee93f7f2c18fe8e6b45c3cChris Lattner//===-- MachineInstr.cpp --------------------------------------------------===//
29769ab22265b313171d201b5928688524a01bd87Misha Brukman//
36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===//
46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner#include "llvm/CodeGen/MachineInstr.h"
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner#include "llvm/CodeGen/MachineBasicBlock.h"
79769ab22265b313171d201b5928688524a01bd87Misha Brukman#include "llvm/Value.h"
86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell#include "llvm/Target/TargetMachine.h"
9009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner#include "llvm/Target/MachineInstrInfo.h"
10009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner#include "llvm/Target/MRegisterInfo.h"
11fab8c796f6754962f5732145248303e3a1f7b96bChris Lattnerusing std::cerr;
12009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
13009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// Global variable holding an array of descriptors for machine instructions.
14009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// The actual object needs to be created separately for each target machine.
15009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// This variable is initialized and reset by class MachineInstrInfo.
16009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//
17009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// FIXME: This should be a property of the target so that more than one target
18009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// at a time can be active...
19fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman//
2061336ae001e07c6d68454b1494e45954d373fb51Chris Lattnerextern const MachineInstrDescriptor *TargetInstrDescriptors;
217a73b80b9052136c8cd2234eb3433a07df7cf38eJohn Criswell
22d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke// Constructor for instructions with fixed #operands (nearly all)
23d0fde30ce850b78371fd1386338350591f9ff494Brian GaekeMachineInstr::MachineInstr(MachineOpCode _opCode)
2412ddd409535b52a7fa5157ded9a4cedd161fedb6Benjamin Kramer  : opCode(_opCode),
253990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner    operands(TargetInstrDescriptors[_opCode].numOperands, MachineOperand()),
26333c40096561218bc3597cf153c0a3895274414cOwen Anderson    numImplicitRefs(0)
2717fcdd5e1b78b829068ca657c97357a39d6e768bChris Lattner{
2817fcdd5e1b78b829068ca657c97357a39d6e768bChris Lattner  assert(TargetInstrDescriptors[_opCode].numOperands >= 0);
29009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner}
30fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
31c5f24a2c2a16681f7816ac053c8f46a2692a3b7aJeff Cohen// Constructor for instructions with variable #operands
32c5f24a2c2a16681f7816ac053c8f46a2692a3b7aJeff CohenMachineInstr::MachineInstr(MachineOpCode OpCode, unsigned  numOperands)
33c5f24a2c2a16681f7816ac053c8f46a2692a3b7aJeff Cohen  : opCode(OpCode),
34009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner    operands(numOperands, MachineOperand()),
3584e679beea11ac55ed7871eec4deaccdf393de3eChris Lattner    numImplicitRefs(0)
363990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner{
37b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner}
38b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner
39b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner/// MachineInstr ctor - This constructor only does a _reserve_ of the operands,
40b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner/// not a resize for them.  It is expected that if you use this that you call
41b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner/// add* methods below to fill up the operands, instead of the Set methods.
42009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner/// Eventually, the "resizing" ctors will be phased out.
43afba8fe662d65b25b4baf46bb26cc18e1f9cc0a5Gordon Henriksen///
44afba8fe662d65b25b4baf46bb26cc18e1f9cc0a5Gordon HenriksenMachineInstr::MachineInstr(MachineOpCode Opcode, unsigned numOperands,
45afba8fe662d65b25b4baf46bb26cc18e1f9cc0a5Gordon Henriksen                           bool XX, bool YY)
46cb4f10b4d5e9ba2e37e70424b290dd1187ca6ea7Chris Lattner  : opCode(Opcode),
47cb4f10b4d5e9ba2e37e70424b290dd1187ca6ea7Chris Lattner    numImplicitRefs(0)
48cb4f10b4d5e9ba2e37e70424b290dd1187ca6ea7Chris Lattner{
49cb4f10b4d5e9ba2e37e70424b290dd1187ca6ea7Chris Lattner  operands.reserve(numOperands);
50cb4f10b4d5e9ba2e37e70424b290dd1187ca6ea7Chris Lattner}
51009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
52009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner/// MachineInstr ctor - Work exactly the same as the ctor above, except that the
5318961504fc2b299578dba817900a0696cf3ccc4dChris Lattner/// MachineInstr is created and added to the end of the specified basic block.
54b92f50fe6091a7a12f54f9884529b1127b1a14e5Chris Lattner///
55b92f50fe6091a7a12f54f9884529b1127b1a14e5Chris LattnerMachineInstr::MachineInstr(MachineBasicBlock *MBB, MachineOpCode Opcode,
56f0a93ed9c59d706494496c6fe4e8354864d24aa7Chris Lattner                           unsigned numOperands)
57b92f50fe6091a7a12f54f9884529b1127b1a14e5Chris Lattner  : opCode(Opcode),
58b92f50fe6091a7a12f54f9884529b1127b1a14e5Chris Lattner    numImplicitRefs(0)
59b92f50fe6091a7a12f54f9884529b1127b1a14e5Chris Lattner{
60b92f50fe6091a7a12f54f9884529b1127b1a14e5Chris Lattner  assert(MBB && "Cannot use inserting ctor with null basic block!");
61b92f50fe6091a7a12f54f9884529b1127b1a14e5Chris Lattner  operands.reserve(numOperands);
62b92f50fe6091a7a12f54f9884529b1127b1a14e5Chris Lattner  MBB->push_back(this);  // Add instruction to end of basic block!
63cfad5df977f257299063309fa34f3c24831093c4Chris Lattner}
6426bb50ab48c561adfd32d129e0eff0cbf0a04625Owen Anderson
6526bb50ab48c561adfd32d129e0eff0cbf0a04625Owen Anderson
6626bb50ab48c561adfd32d129e0eff0cbf0a04625Owen Anderson// OperandComplete - Return true if it's illegal to add a new operand
6726bb50ab48c561adfd32d129e0eff0cbf0a04625Owen Andersonbool MachineInstr::OperandsComplete() const
683ff704fa2b67d6c857142218c5aca3058b6239fcChris Lattner{
693ff704fa2b67d6c857142218c5aca3058b6239fcChris Lattner  int NumOperands = TargetInstrDescriptors[opCode].numOperands;
703ff704fa2b67d6c857142218c5aca3058b6239fcChris Lattner  if (NumOperands >= 0 && getNumOperands() >= (unsigned)NumOperands)
713ff704fa2b67d6c857142218c5aca3058b6239fcChris Lattner    return true;  // Broken!
72287921d1889e101cb7f5cfa031a34ebe53a9a4a0Chris Lattner  return false;
73287921d1889e101cb7f5cfa031a34ebe53a9a4a0Chris Lattner}
74287921d1889e101cb7f5cfa031a34ebe53a9a4a0Chris Lattner
75287921d1889e101cb7f5cfa031a34ebe53a9a4a0Chris Lattner
76287921d1889e101cb7f5cfa031a34ebe53a9a4a0Chris Lattner//
773990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner// Support for replacing opcode and operands of a MachineInstr in place.
783990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner// This only resets the size of the operand vector and initializes it.
793990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner// The new operands must be set explicitly later.
803990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner//
813990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattnervoid MachineInstr::replace(MachineOpCode Opcode, unsigned numOperands)
82a1a702cdd23221e6e3f36632be91150138958e9dDan Gohman{
833990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner  assert(getNumImplicitRefs() == 0 &&
84555c729a2f604027840b96d8e05f7d07d1f51053Chris Lattner         "This is probably broken because implicit refs are going to be lost.");
85555c729a2f604027840b96d8e05f7d07d1f51053Chris Lattner  opCode = Opcode;
86555c729a2f604027840b96d8e05f7d07d1f51053Chris Lattner  operands.clear();
87555c729a2f604027840b96d8e05f7d07d1f51053Chris Lattner  operands.resize(numOperands, MachineOperand());
88555c729a2f604027840b96d8e05f7d07d1f51053Chris Lattner}
89555c729a2f604027840b96d8e05f7d07d1f51053Chris Lattner
905814008f4b77774c8563578e1562c9c24a6750c2Vikram S. Advevoid
91009505452b713ed2e3a8e99c5545a6e721c65495Chris LattnerMachineInstr::SetMachineOperandVal(unsigned i,
92dac69c83c22a00d3f8de3bb4d62b9dbeb0a20cafReid Spencer                                   MachineOperand::MachineOperandType opType,
93dac69c83c22a00d3f8de3bb4d62b9dbeb0a20cafReid Spencer                                   Value* V,
94dac69c83c22a00d3f8de3bb4d62b9dbeb0a20cafReid Spencer                                   bool isdef,
95dac69c83c22a00d3f8de3bb4d62b9dbeb0a20cafReid Spencer                                   bool isDefAndUse)
96555c729a2f604027840b96d8e05f7d07d1f51053Chris Lattner{
97555c729a2f604027840b96d8e05f7d07d1f51053Chris Lattner  assert(i < operands.size());          // may be explicit or implicit op
98009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner  operands[i].opType = opType;
99009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner  operands[i].value = V;
100832254e1c2387c0cbeb0a820b8315fbe85cb003aReid Spencer  operands[i].regNum = -1;
101832254e1c2387c0cbeb0a820b8315fbe85cb003aReid Spencer
102832254e1c2387c0cbeb0a820b8315fbe85cb003aReid Spencer  if (isDefAndUse)
103832254e1c2387c0cbeb0a820b8315fbe85cb003aReid Spencer    operands[i].flags = MachineOperand::DEFUSEFLAG;
104832254e1c2387c0cbeb0a820b8315fbe85cb003aReid Spencer  else if (isdef || TargetInstrDescriptors[opCode].resultPos == (int) i)
105832254e1c2387c0cbeb0a820b8315fbe85cb003aReid Spencer    operands[i].flags = MachineOperand::DEFFLAG;
106832254e1c2387c0cbeb0a820b8315fbe85cb003aReid Spencer  else
107cedbacffd67939d8e8f42e5506d458ddc187e575Dan Gohman    operands[i].flags = 0;
108832254e1c2387c0cbeb0a820b8315fbe85cb003aReid Spencer}
109832254e1c2387c0cbeb0a820b8315fbe85cb003aReid Spencer
110832254e1c2387c0cbeb0a820b8315fbe85cb003aReid Spencervoid
111031b7481c818b7ad6f43ba942ed33663aef7f1b8Misha BrukmanMachineInstr::SetMachineOperandConst(unsigned i,
112cedbacffd67939d8e8f42e5506d458ddc187e575Dan Gohman				MachineOperand::MachineOperandType operandType,
113832254e1c2387c0cbeb0a820b8315fbe85cb003aReid Spencer                                     int64_t intValue)
114832254e1c2387c0cbeb0a820b8315fbe85cb003aReid Spencer{
115832254e1c2387c0cbeb0a820b8315fbe85cb003aReid Spencer  assert(i < getNumOperands());          // must be explicit op
1163da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer  assert(TargetInstrDescriptors[opCode].resultPos != (int) i &&
1173da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer         "immed. constant cannot be defined");
1183da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer
1193da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer  operands[i].opType = operandType;
1203da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer  operands[i].value = NULL;
1213990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner  operands[i].immedVal = intValue;
1223990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner  operands[i].regNum = -1;
1233990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner  operands[i].flags = 0;
1243990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner}
1253990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner
1263990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattnervoid
1273990b121cf4a0b280ed3e54cf13870cbf4259e78Chris LattnerMachineInstr::SetMachineOperandReg(unsigned i,
12861336ae001e07c6d68454b1494e45954d373fb51Chris Lattner                                   int regNum,
12961336ae001e07c6d68454b1494e45954d373fb51Chris Lattner                                   bool isdef) {
13061336ae001e07c6d68454b1494e45954d373fb51Chris Lattner  assert(i < getNumOperands());          // must be explicit op
13161336ae001e07c6d68454b1494e45954d373fb51Chris Lattner
13261336ae001e07c6d68454b1494e45954d373fb51Chris Lattner  operands[i].opType = MachineOperand::MO_MachineRegister;
13361336ae001e07c6d68454b1494e45954d373fb51Chris Lattner  operands[i].value = NULL;
13461336ae001e07c6d68454b1494e45954d373fb51Chris Lattner  operands[i].regNum = regNum;
1353990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner
1363990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner  if (isdef || TargetInstrDescriptors[opCode].resultPos == (int) i)
1373990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner    operands[i].flags = MachineOperand::DEFFLAG;
1383990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner  else
1393990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner    operands[i].flags = 0;
1403990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner
1413990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner  insertUsedReg(regNum);
1423990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner}
1433990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner
1443990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattnervoid
1453990b121cf4a0b280ed3e54cf13870cbf4259e78Chris LattnerMachineInstr::SetRegForOperand(unsigned i, int regNum)
1463990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner{
1473990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner  assert(i < getNumOperands());          // must be explicit op
1483990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner  operands[i].setRegForValue(regNum);
1493990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner  insertUsedReg(regNum);
1503990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner}
1513990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner
1523990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner
1533990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner// Subsitute all occurrences of Value* oldVal with newVal in all operands
1543990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner// and all implicit refs.  If defsOnly == true, substitute defs only.
1553990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattnerunsigned
1563990b121cf4a0b280ed3e54cf13870cbf4259e78Chris LattnerMachineInstr::substituteValue(const Value* oldVal, Value* newVal, bool defsOnly)
1573990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner{
1583990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner  unsigned numSubst = 0;
15961336ae001e07c6d68454b1494e45954d373fb51Chris Lattner
16061336ae001e07c6d68454b1494e45954d373fb51Chris Lattner  // Subsitute operands
16161336ae001e07c6d68454b1494e45954d373fb51Chris Lattner  for (MachineInstr::val_op_iterator O = begin(), E = end(); O != E; ++O)
16261336ae001e07c6d68454b1494e45954d373fb51Chris Lattner    if (*O == oldVal)
16361336ae001e07c6d68454b1494e45954d373fb51Chris Lattner      if (!defsOnly || O.isDef())
16461336ae001e07c6d68454b1494e45954d373fb51Chris Lattner        {
16561336ae001e07c6d68454b1494e45954d373fb51Chris Lattner          O.getMachineOperand().value = newVal;
16661336ae001e07c6d68454b1494e45954d373fb51Chris Lattner          ++numSubst;
167f451cb870efcf9e0302d25ed05f4cac6bb494e42Dan Gohman        }
1683990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner
1693990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner  // Subsitute implicit refs
1703990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner  for (unsigned i=0, N=getNumImplicitRefs(); i < N; ++i)
1713990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner    if (getImplicitRef(i) == oldVal)
1723990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner      if (!defsOnly || implicitRefIsDefined(i))
17361336ae001e07c6d68454b1494e45954d373fb51Chris Lattner        {
17484e679beea11ac55ed7871eec4deaccdf393de3eChris Lattner          getImplicitOp(i).value = newVal;
17561336ae001e07c6d68454b1494e45954d373fb51Chris Lattner          ++numSubst;
17661336ae001e07c6d68454b1494e45954d373fb51Chris Lattner        }
17784e679beea11ac55ed7871eec4deaccdf393de3eChris Lattner
178870cfcf9a6189b65a8ee805b93a2c737c0183e62Chris Lattner  return numSubst;
1793990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner}
180ec39f095f5abaf1ec90d7c6c46454032cda36e1cChris Lattner
181ec39f095f5abaf1ec90d7c6c46454032cda36e1cChris Lattner
182ec39f095f5abaf1ec90d7c6c46454032cda36e1cChris Lattnervoid
183ec39f095f5abaf1ec90d7c6c46454032cda36e1cChris LattnerMachineInstr::dump() const
184ec39f095f5abaf1ec90d7c6c46454032cda36e1cChris Lattner{
185ec39f095f5abaf1ec90d7c6c46454032cda36e1cChris Lattner  cerr << "  " << *this;
1863990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner}
1873990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner
1883990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattnerstatic inline std::ostream&
1893990b121cf4a0b280ed3e54cf13870cbf4259e78Chris LattnerOutputValue(std::ostream &os, const Value* val)
19061336ae001e07c6d68454b1494e45954d373fb51Chris Lattner{
19161336ae001e07c6d68454b1494e45954d373fb51Chris Lattner  os << "(val ";
1924f1be4abba762f8a7b77d7622abaf1ed1a87b48bDan Gohman  if (val && val->hasName())
1933990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner    return os << val->getName() << ")";
1943990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner  else
1953990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner    return os << (void*) val << ")";              // print address only
1963990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner}
1973990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattner
1983990b121cf4a0b280ed3e54cf13870cbf4259e78Chris Lattnerstatic inline void OutputReg(std::ostream &os, unsigned RegNo,
199f2da7241f590aaae128ecce7732c6094084df2b6Chris Lattner                             const MRegisterInfo *MRI = 0) {
200f2da7241f590aaae128ecce7732c6094084df2b6Chris Lattner  if (MRI) {
201686e65fb65f97176e000c4d4cae82fc7b404ef9dMisha Brukman    if (RegNo < MRegisterInfo::FirstVirtualRegister)
202f2da7241f590aaae128ecce7732c6094084df2b6Chris Lattner      os << "%" << MRI->get(RegNo).Name;
2030d7ce5ffa4aa853b75e1015c62e27bd9f23ef73bDuncan Sands    else
204f2da7241f590aaae128ecce7732c6094084df2b6Chris Lattner      os << "%reg" << RegNo;
2050d7ce5ffa4aa853b75e1015c62e27bd9f23ef73bDuncan Sands  } else
2060d7ce5ffa4aa853b75e1015c62e27bd9f23ef73bDuncan Sands    os << "%mreg(" << RegNo << ")";
207f2da7241f590aaae128ecce7732c6094084df2b6Chris Lattner}
208f2da7241f590aaae128ecce7732c6094084df2b6Chris Lattner
209f2da7241f590aaae128ecce7732c6094084df2b6Chris Lattnerstatic void print(const MachineOperand &MO, std::ostream &OS,
210686e65fb65f97176e000c4d4cae82fc7b404ef9dMisha Brukman                  const TargetMachine &TM) {
211f2da7241f590aaae128ecce7732c6094084df2b6Chris Lattner  const MRegisterInfo *MRI = TM.getRegisterInfo();
212f2da7241f590aaae128ecce7732c6094084df2b6Chris Lattner  bool CloseParen = true;
213f2da7241f590aaae128ecce7732c6094084df2b6Chris Lattner  if (MO.opHiBits32())
214f2da7241f590aaae128ecce7732c6094084df2b6Chris Lattner    OS << "%lm(";
215f2da7241f590aaae128ecce7732c6094084df2b6Chris Lattner  else if (MO.opLoBits32())
216f2da7241f590aaae128ecce7732c6094084df2b6Chris Lattner    OS << "%lo(";
217f2da7241f590aaae128ecce7732c6094084df2b6Chris Lattner  else if (MO.opHiBits64())
2187af1c78b98d2df7d0ab9154461ca3d835706716eDuncan Sands    OS << "%hh(";
2197af1c78b98d2df7d0ab9154461ca3d835706716eDuncan Sands  else if (MO.opLoBits64())
2207af1c78b98d2df7d0ab9154461ca3d835706716eDuncan Sands    OS << "%hm(";
2217af1c78b98d2df7d0ab9154461ca3d835706716eDuncan Sands  else
2227af1c78b98d2df7d0ab9154461ca3d835706716eDuncan Sands    CloseParen = false;
2237af1c78b98d2df7d0ab9154461ca3d835706716eDuncan Sands
2247af1c78b98d2df7d0ab9154461ca3d835706716eDuncan Sands  switch (MO.getType()) {
2257af1c78b98d2df7d0ab9154461ca3d835706716eDuncan Sands  case MachineOperand::MO_VirtualRegister:
2266f3ba37ebb06de206c74d73c7c2b422cca28a16dEli Friedman    if (MO.getVRegValue()) {
2276f3ba37ebb06de206c74d73c7c2b422cca28a16dEli Friedman      OS << "%reg";
2286f3ba37ebb06de206c74d73c7c2b422cca28a16dEli Friedman      OutputValue(OS, MO.getVRegValue());
2296f3ba37ebb06de206c74d73c7c2b422cca28a16dEli Friedman      if (MO.hasAllocatedReg())
2306f3ba37ebb06de206c74d73c7c2b422cca28a16dEli Friedman        OS << "==";
2316f3ba37ebb06de206c74d73c7c2b422cca28a16dEli Friedman    }
2326f3ba37ebb06de206c74d73c7c2b422cca28a16dEli Friedman    if (MO.hasAllocatedReg())
2337af1c78b98d2df7d0ab9154461ca3d835706716eDuncan Sands      OutputReg(OS, MO.getAllocatedRegNum(), MRI);
2347af1c78b98d2df7d0ab9154461ca3d835706716eDuncan Sands    break;
2357af1c78b98d2df7d0ab9154461ca3d835706716eDuncan Sands  case MachineOperand::MO_CCRegister:
2367af1c78b98d2df7d0ab9154461ca3d835706716eDuncan Sands    OS << "%ccreg";
2377af1c78b98d2df7d0ab9154461ca3d835706716eDuncan Sands    OutputValue(OS, MO.getVRegValue());
2387af1c78b98d2df7d0ab9154461ca3d835706716eDuncan Sands    if (MO.hasAllocatedReg()) {
2398b7d706c80afa7ad40acaab08f7406093a2851ffEli Friedman      OS << "==";
2408b7d706c80afa7ad40acaab08f7406093a2851ffEli Friedman      OutputReg(OS, MO.getAllocatedRegNum(), MRI);
2418b7d706c80afa7ad40acaab08f7406093a2851ffEli Friedman    }
2428b7d706c80afa7ad40acaab08f7406093a2851ffEli Friedman    break;
2437af1c78b98d2df7d0ab9154461ca3d835706716eDuncan Sands  case MachineOperand::MO_MachineRegister:
2447af1c78b98d2df7d0ab9154461ca3d835706716eDuncan Sands    OutputReg(OS, MO.getMachineRegNum(), MRI);
2457af1c78b98d2df7d0ab9154461ca3d835706716eDuncan Sands    break;
2467af1c78b98d2df7d0ab9154461ca3d835706716eDuncan Sands  case MachineOperand::MO_SignExtendedImmed:
2470b79a7727d68a507837e827803859424cf3d997bEli Friedman    OS << (long)MO.getImmedValue();
2480b79a7727d68a507837e827803859424cf3d997bEli Friedman    break;
2498b7d706c80afa7ad40acaab08f7406093a2851ffEli Friedman  case MachineOperand::MO_UnextendedImmed:
2508b7d706c80afa7ad40acaab08f7406093a2851ffEli Friedman    OS << (long)MO.getImmedValue();
2518b7d706c80afa7ad40acaab08f7406093a2851ffEli Friedman    break;
2528b7d706c80afa7ad40acaab08f7406093a2851ffEli Friedman  case MachineOperand::MO_PCRelativeDisp: {
2538b7d706c80afa7ad40acaab08f7406093a2851ffEli Friedman    const Value* opVal = MO.getVRegValue();
2548b7d706c80afa7ad40acaab08f7406093a2851ffEli Friedman    bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal);
2558b7d706c80afa7ad40acaab08f7406093a2851ffEli Friedman    OS << "%disp(" << (isLabel? "label " : "addr-of-val ");
2568b7d706c80afa7ad40acaab08f7406093a2851ffEli Friedman    if (opVal->hasName())
2578b7d706c80afa7ad40acaab08f7406093a2851ffEli Friedman      OS << opVal->getName();
2588b7d706c80afa7ad40acaab08f7406093a2851ffEli Friedman    else
2590b79a7727d68a507837e827803859424cf3d997bEli Friedman      OS << (const void*) opVal;
2600b79a7727d68a507837e827803859424cf3d997bEli Friedman    OS << ")";
2610b79a7727d68a507837e827803859424cf3d997bEli Friedman    break;
2628b7d706c80afa7ad40acaab08f7406093a2851ffEli Friedman  }
2638b7d706c80afa7ad40acaab08f7406093a2851ffEli Friedman  default:
2648b7d706c80afa7ad40acaab08f7406093a2851ffEli Friedman    assert(0 && "Unrecognized operand type");
2650b79a7727d68a507837e827803859424cf3d997bEli Friedman  }
2660b79a7727d68a507837e827803859424cf3d997bEli Friedman
267f309880ad86114cda05037538c46123f6cda1a7eChris Lattner  if (CloseParen)
268f309880ad86114cda05037538c46123f6cda1a7eChris Lattner    OS << ")";
269f309880ad86114cda05037538c46123f6cda1a7eChris Lattner}
270f309880ad86114cda05037538c46123f6cda1a7eChris Lattner
271f309880ad86114cda05037538c46123f6cda1a7eChris Lattnervoid MachineInstr::print(std::ostream &OS, const TargetMachine &TM) {
272f309880ad86114cda05037538c46123f6cda1a7eChris Lattner  unsigned StartOp = 0;
273f309880ad86114cda05037538c46123f6cda1a7eChris Lattner
274f309880ad86114cda05037538c46123f6cda1a7eChris Lattner   // Specialize printing if op#0 is definition
275f309880ad86114cda05037538c46123f6cda1a7eChris Lattner  if (getNumOperands() && operandIsDefined(0)) {
276f309880ad86114cda05037538c46123f6cda1a7eChris Lattner    ::print(getOperand(0), OS, TM);
277f309880ad86114cda05037538c46123f6cda1a7eChris Lattner    OS << " = ";
278f309880ad86114cda05037538c46123f6cda1a7eChris Lattner    ++StartOp;   // Don't print this operand again!
279f309880ad86114cda05037538c46123f6cda1a7eChris Lattner  }
280f309880ad86114cda05037538c46123f6cda1a7eChris Lattner  OS << TM.getInstrInfo().getName(getOpcode());
281f309880ad86114cda05037538c46123f6cda1a7eChris Lattner
282f309880ad86114cda05037538c46123f6cda1a7eChris Lattner  for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) {
283f309880ad86114cda05037538c46123f6cda1a7eChris Lattner    if (i != StartOp)
284f309880ad86114cda05037538c46123f6cda1a7eChris Lattner      OS << ",";
285f309880ad86114cda05037538c46123f6cda1a7eChris Lattner    OS << " ";
286f309880ad86114cda05037538c46123f6cda1a7eChris Lattner    ::print(getOperand(i), OS, TM);
287f309880ad86114cda05037538c46123f6cda1a7eChris Lattner
288f309880ad86114cda05037538c46123f6cda1a7eChris Lattner    if (operandIsDefinedAndUsed(i))
289f309880ad86114cda05037538c46123f6cda1a7eChris Lattner      OS << "<def&use>";
290f309880ad86114cda05037538c46123f6cda1a7eChris Lattner    else if (operandIsDefined(i))
291f309880ad86114cda05037538c46123f6cda1a7eChris Lattner      OS << "<def>";
292f309880ad86114cda05037538c46123f6cda1a7eChris Lattner  }
293f309880ad86114cda05037538c46123f6cda1a7eChris Lattner
294f309880ad86114cda05037538c46123f6cda1a7eChris Lattner  // code for printing implict references
295f309880ad86114cda05037538c46123f6cda1a7eChris Lattner  if (getNumImplicitRefs()) {
296f309880ad86114cda05037538c46123f6cda1a7eChris Lattner    OS << "\tImplicitRefs: ";
297f309880ad86114cda05037538c46123f6cda1a7eChris Lattner    for(unsigned i = 0, e = getNumImplicitRefs(); i != e; ++i) {
298f309880ad86114cda05037538c46123f6cda1a7eChris Lattner      OS << "\t";
299f309880ad86114cda05037538c46123f6cda1a7eChris Lattner      OutputValue(OS, getImplicitRef(i));
300f309880ad86114cda05037538c46123f6cda1a7eChris Lattner      if (implicitRefIsDefinedAndUsed(i))
30126199059268a05739c84ebf465fcdbf7ded861dfChris Lattner        OS << "<def&use>";
30270cfe13f19e91a595808ed6c6ff7e87ff0dccd64Chris Lattner      else if (implicitRefIsDefined(i))
303b00c582b6d40e6b9ff2d1ed4f5eaf7930e792aceChris Lattner        OS << "<def>";
304a1a702cdd23221e6e3f36632be91150138958e9dDan Gohman    }
3057295eb4ea3e3a81e697600cbca681674e4b35a20Chris Lattner  }
3069769ab22265b313171d201b5928688524a01bd87Misha Brukman
307009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner  OS << "\n";
308f309880ad86114cda05037538c46123f6cda1a7eChris Lattner}
309009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
310009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
3110b16ae209a1d0876a7ea6800bb567d925443cba3Chris Lattnerstd::ostream &operator<<(std::ostream& os, const MachineInstr& minstr)
312f96315e985880178562ba43b51efbc0efc8f6c8aChris Lattner{
31382870e0b733fa72c759271c1c62cb5f07be2c4dbChris Lattner  os << TargetInstrDescriptors[minstr.opCode].Name;
314f96315e985880178562ba43b51efbc0efc8f6c8aChris Lattner
315009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner  for (unsigned i=0, N=minstr.getNumOperands(); i < N; i++) {
316009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner    os << "\t" << minstr.getOperand(i);
317009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner    if( minstr.operandIsDefined(i) )
3180b16ae209a1d0876a7ea6800bb567d925443cba3Chris Lattner      os << "*";
319f96315e985880178562ba43b51efbc0efc8f6c8aChris Lattner    if( minstr.operandIsDefinedAndUsed(i) )
32082870e0b733fa72c759271c1c62cb5f07be2c4dbChris Lattner      os << "*";
321f96315e985880178562ba43b51efbc0efc8f6c8aChris Lattner  }
322009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
323009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner  // code for printing implict references
324009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner  unsigned NumOfImpRefs =  minstr.getNumImplicitRefs();
3250b16ae209a1d0876a7ea6800bb567d925443cba3Chris Lattner  if(  NumOfImpRefs > 0 ) {
326f96315e985880178562ba43b51efbc0efc8f6c8aChris Lattner    os << "\tImplicit: ";
32782870e0b733fa72c759271c1c62cb5f07be2c4dbChris Lattner    for(unsigned z=0; z < NumOfImpRefs; z++) {
328f96315e985880178562ba43b51efbc0efc8f6c8aChris Lattner      OutputValue(os, minstr.getImplicitRef(z));
329009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner      if( minstr.implicitRefIsDefined(z)) os << "*";
330009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner      if( minstr.implicitRefIsDefinedAndUsed(z)) os << "*";
3313da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer      os << "\t";
3323da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer    }
3333da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer  }
3343da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer
3353da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer  return os << "\n";
3363da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer}
3373da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer
338009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnerstd::ostream &operator<<(std::ostream &os, const MachineOperand &mop)
3390b16ae209a1d0876a7ea6800bb567d925443cba3Chris Lattner{
340f96315e985880178562ba43b51efbc0efc8f6c8aChris Lattner  if (mop.opHiBits32())
34182870e0b733fa72c759271c1c62cb5f07be2c4dbChris Lattner    os << "%lm(";
342f96315e985880178562ba43b51efbc0efc8f6c8aChris Lattner  else if (mop.opLoBits32())
343009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner    os << "%lo(";
344b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner  else if (mop.opHiBits64())
345b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner    os << "%hh(";
346b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner  else if (mop.opLoBits64())
347b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner    os << "%hm(";
348b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner
349b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner  switch (mop.getType())
350b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner    {
351b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner    case MachineOperand::MO_VirtualRegister:
352b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner      os << "%reg";
353b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner      OutputValue(os, mop.getVRegValue());
354ec39f095f5abaf1ec90d7c6c46454032cda36e1cChris Lattner      if (mop.hasAllocatedReg()) {
355b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner        os << "==";
356b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner        OutputReg(os, mop.getAllocatedRegNum());
357b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner      }
358b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner      break;
359b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner    case MachineOperand::MO_CCRegister:
360b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner      os << "%ccreg";
361b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner      OutputValue(os, mop.getVRegValue());
362b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner      if (mop.hasAllocatedReg()) {
363b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner        os << "==";
364b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner        OutputReg(os, mop.getAllocatedRegNum());
365b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner      }
366b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner      break;
367b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner    case MachineOperand::MO_MachineRegister:
368b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner      OutputReg(os, mop.getMachineRegNum());
369b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner      break;
370b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner    case MachineOperand::MO_SignExtendedImmed:
371b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner      os << (long)mop.getImmedValue();
372b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner      break;
373b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner    case MachineOperand::MO_UnextendedImmed:
374b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner      os << (long)mop.getImmedValue();
375db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner      break;
376b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner    case MachineOperand::MO_PCRelativeDisp:
377db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner      {
378b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner        const Value* opVal = mop.getVRegValue();
379b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner        bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal);
380b2406d9895314cbc61183c2fb712cd1a2ddfe7e0Chris Lattner        os << "%disp(" << (isLabel? "label " : "addr-of-val ");
381009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner        if (opVal->hasName())
382009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner          os << opVal->getName();
383e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner        else
384e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner          os << (const void*) opVal;
385e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner        os << ")";
386e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner        break;
387e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner      }
388e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner    default:
389e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner      assert(0 && "Unrecognized operand type");
390e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner      break;
391e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner    }
392e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner
393e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner  if (mop.flags &
394e30173ac3396510bd0bb26a66fd615ff9083436dChris Lattner      (MachineOperand::HIFLAG32 | MachineOperand::LOFLAG32 |
395d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke       MachineOperand::HIFLAG64 | MachineOperand::LOFLAG64))
396d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke    os << ")";
397009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
398  return os;
399}
400