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