MachineInstr.cpp revision c21c5eeb4f56f160e79522df2d3aab5cfe73c05d
1035dfbe7f2d109008d2d62d9f2a67efb477a7ab6Chris Lattner//===-- MachineInstr.cpp --------------------------------------------------===// 2edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 5b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// This file was developed by the LLVM research group and is distributed under 6b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details. 7edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 921326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke// 1021326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke// Methods common to all machine instructions. 1121326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke// 12035dfbe7f2d109008d2d62d9f2a67efb477a7ab6Chris Lattner//===----------------------------------------------------------------------===// 1370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 14822b4fb896846b87dd11a330ae13f2239329aeefChris Lattner#include "llvm/CodeGen/MachineInstr.h" 158517e1f0beea9b5e47974f083396d53294c390adChris Lattner#include "llvm/CodeGen/MachineFunction.h" 161049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner#include "llvm/Target/TargetMachine.h" 173501feab811c86c9659248a4875fc31a3165f84dChris Lattner#include "llvm/Target/TargetInstrInfo.h" 182a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner#include "llvm/Target/MRegisterInfo.h" 19551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/LeakDetector.h" 20a09362eb975730ac624c0bd210a95655ee105296Bill Wendling#include "llvm/Support/Streams.h" 21c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen#include <ostream> 220742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattnerusing namespace llvm; 23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 24c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// MachineInstr ctor - This constructor creates a dummy MachineInstr with 2567f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng/// TID NULL and no operands. 26c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan ChengMachineInstr::MachineInstr() 2767f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng : TID(0), NumImplicitOps(0), parent(0) { 28aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos // Make sure that we get added to a machine basicblock 29aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos LeakDetector::addGarbageObject(this); 307279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner} 317279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner 3267f660cb080965ea93ed6d7265a67100f2fe38e4Evan Chengvoid MachineInstr::addImplicitDefUseOperands() { 3367f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng if (TID->ImplicitDefs) 3467f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng for (const unsigned *ImpDefs = TID->ImplicitDefs; *ImpDefs; ++ImpDefs) { 35d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng MachineOperand Op; 36d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng Op.opType = MachineOperand::MO_Register; 37d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng Op.IsDef = true; 38d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng Op.IsImp = true; 39d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng Op.IsKill = false; 40d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng Op.IsDead = false; 41d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng Op.contents.RegNo = *ImpDefs; 42d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng Op.offset = 0; 43d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng Operands.push_back(Op); 44d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng } 4567f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng if (TID->ImplicitUses) 4667f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng for (const unsigned *ImpUses = TID->ImplicitUses; *ImpUses; ++ImpUses) { 47d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng MachineOperand Op; 48d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng Op.opType = MachineOperand::MO_Register; 49d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng Op.IsDef = false; 50d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng Op.IsImp = true; 51d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng Op.IsKill = false; 52d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng Op.IsDead = false; 53d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng Op.contents.RegNo = *ImpUses; 54d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng Op.offset = 0; 55d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng Operands.push_back(Op); 56d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng } 57d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng} 58d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng 59d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng/// MachineInstr ctor - This constructor create a MachineInstr and add the 60c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// implicit operands. It reserves space for number of operands specified by 61c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// TargetInstrDescriptor or the numOperands if it is not zero. (for 62c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// instructions with variable number of operands). 6367f660cb080965ea93ed6d7265a67100f2fe38e4Evan ChengMachineInstr::MachineInstr(const TargetInstrDescriptor &tid) 6467f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng : TID(&tid), NumImplicitOps(0), parent(0) { 6567f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng if (TID->ImplicitDefs) 6667f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng for (const unsigned *ImpDefs = TID->ImplicitDefs; *ImpDefs; ++ImpDefs) 67d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng NumImplicitOps++; 6867f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng if (TID->ImplicitUses) 6967f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng for (const unsigned *ImpUses = TID->ImplicitUses; *ImpUses; ++ImpUses) 70d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng NumImplicitOps++; 7167f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng Operands.reserve(NumImplicitOps + TID->numOperands); 7267f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng addImplicitDefUseOperands(); 73d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng // Make sure that we get added to a machine basicblock 74d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng LeakDetector::addGarbageObject(this); 75d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng} 76d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng 77ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - Work exactly the same as the ctor above, except that the 78ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr is created and added to the end of the specified basic block. 79ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// 80c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan ChengMachineInstr::MachineInstr(MachineBasicBlock *MBB, 8167f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng const TargetInstrDescriptor &tid) 8267f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng : TID(&tid), NumImplicitOps(0), parent(0) { 83ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner assert(MBB && "Cannot use inserting ctor with null basic block!"); 8467f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng if (TID->ImplicitDefs) 8567f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng for (const unsigned *ImpDefs = TID->ImplicitDefs; *ImpDefs; ++ImpDefs) 86d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng NumImplicitOps++; 8767f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng if (TID->ImplicitUses) 8867f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng for (const unsigned *ImpUses = TID->ImplicitUses; *ImpUses; ++ImpUses) 89d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng NumImplicitOps++; 9067f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng Operands.reserve(NumImplicitOps + TID->numOperands); 9167f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng addImplicitDefUseOperands(); 92aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos // Make sure that we get added to a machine basicblock 93aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos LeakDetector::addGarbageObject(this); 94ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner MBB->push_back(this); // Add instruction to end of basic block! 95ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner} 96ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner 97ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman/// MachineInstr ctor - Copies MachineInstr arg exactly 98ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman/// 99466b534a570f574ed485d875bbca8454f68dcb52Tanya LattnerMachineInstr::MachineInstr(const MachineInstr &MI) { 10067f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng TID = MI.getInstrDescriptor(); 1016b2c05f3d3c7b44183c629485ade10c18b86828dEvan Cheng NumImplicitOps = MI.NumImplicitOps; 102943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner Operands.reserve(MI.getNumOperands()); 103b5159ed0cb7943e5938782f7693beb18342165ceTanya Lattner 104ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman // Add operands 105943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner for (unsigned i = 0; i != MI.getNumOperands(); ++i) 106943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner Operands.push_back(MI.getOperand(i)); 1070c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner 108ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman // Set parent, next, and prev to null 1090c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner parent = 0; 1100c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner prev = 0; 1110c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner next = 0; 112466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner} 113466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner 114466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner 115ce22e76996d3ff0930716fa60c29df60a7e0481bMisha BrukmanMachineInstr::~MachineInstr() { 116aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos LeakDetector::removeGarbageObject(this); 117aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos} 118aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos 11967f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng/// getOpcode - Returns the opcode of this MachineInstr. 12067f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng/// 12167f660cb080965ea93ed6d7265a67100f2fe38e4Evan Chengconst int MachineInstr::getOpcode() const { 12267f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng return TID->Opcode; 12367f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng} 12467f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng 12548d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner/// removeFromParent - This method unlinks 'this' from the containing basic 12648d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner/// block, and returns it, but does not delete it. 12748d7c069c76882475c23de153bda9483cd3c9bb4Chris LattnerMachineInstr *MachineInstr::removeFromParent() { 12848d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner assert(getParent() && "Not embedded in a basic block!"); 12948d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner getParent()->remove(this); 13048d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner return this; 13148d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner} 13248d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner 13348d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner 13421326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// OperandComplete - Return true if it's illegal to add a new operand 13521326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// 1362a90ba60175f93e7438165d8423100aa573c16c5Chris Lattnerbool MachineInstr::OperandsComplete() const { 13767f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng unsigned short NumOperands = TID->numOperands; 13867f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng if ((TID->Flags & M_VARIABLE_OPS) == 0 && 1398bcb042f22f06d034f18aee8cb5dd0a04745fd97Evan Cheng getNumOperands()-NumImplicitOps >= NumOperands) 1403497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve return true; // Broken: we have all the operands of this instruction! 141413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner return false; 14270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 14370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 1448ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner/// isIdenticalTo - Return true if this operand is identical to the specified 1458ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner/// operand. 1468ace2cd034be10c09be51daf08c3dda327f54262Chris Lattnerbool MachineOperand::isIdenticalTo(const MachineOperand &Other) const { 1478ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner if (getType() != Other.getType()) return false; 1488ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner 1498ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner switch (getType()) { 1508ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner default: assert(0 && "Unrecognized operand type"); 1518ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner case MachineOperand::MO_Register: 1528ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner return getReg() == Other.getReg() && isDef() == Other.isDef(); 1538ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner case MachineOperand::MO_Immediate: 1548ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner return getImm() == Other.getImm(); 1558ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner case MachineOperand::MO_MachineBasicBlock: 1568ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner return getMBB() == Other.getMBB(); 1578ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner case MachineOperand::MO_FrameIndex: 1588ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner return getFrameIndex() == Other.getFrameIndex(); 1598ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner case MachineOperand::MO_ConstantPoolIndex: 1608ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner return getConstantPoolIndex() == Other.getConstantPoolIndex() && 1618ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner getOffset() == Other.getOffset(); 1628ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner case MachineOperand::MO_JumpTableIndex: 1638ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner return getJumpTableIndex() == Other.getJumpTableIndex(); 1648ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner case MachineOperand::MO_GlobalAddress: 1658ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner return getGlobal() == Other.getGlobal() && getOffset() == Other.getOffset(); 1668ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner case MachineOperand::MO_ExternalSymbol: 16713a04125df039d118c688df26998343a00d8a749Chris Lattner return !strcmp(getSymbolName(), Other.getSymbolName()) && 1688ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner getOffset() == Other.getOffset(); 1698ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner } 1708ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner} 1718ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner 172576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng/// findRegisterUseOperand() - Returns the MachineOperand that is a use of 173576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng/// the specific register or NULL if it is not found. 174576d123e130a8291669dd2384a3735cc4933fd00Evan ChengMachineOperand *MachineInstr::findRegisterUseOperand(unsigned Reg) { 175576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { 176576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng MachineOperand &MO = getOperand(i); 177576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng if (MO.isReg() && MO.isUse() && MO.getReg() == Reg) 178576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng return &MO; 179576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng } 180576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng return NULL; 181576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng} 182576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng 183576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng/// copyKillDeadInfo - Copies kill / dead operand properties from MI. 184576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng/// 185576d123e130a8291669dd2384a3735cc4933fd00Evan Chengvoid MachineInstr::copyKillDeadInfo(const MachineInstr *MI) { 186576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 187576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng const MachineOperand &MO = MI->getOperand(i); 188576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng if (!MO.isReg() || (!MO.isKill() && !MO.isDead())) 189576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng continue; 190576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng for (unsigned j = 0, ee = getNumOperands(); j != ee; ++j) { 191576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng MachineOperand &MOp = getOperand(j); 192576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng if (!MOp.isIdenticalTo(MO)) 193576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng continue; 194576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng if (MO.isKill()) 195576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng MOp.setIsKill(); 196576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng else 197576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng MOp.setIsDead(); 198576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng break; 199576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng } 200576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng } 201576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng} 202576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng 20321326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaekevoid MachineInstr::dump() const { 204e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling cerr << " " << *this; 20570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 20670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 2072a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattnerstatic inline void OutputReg(std::ostream &os, unsigned RegNo, 2082a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner const MRegisterInfo *MRI = 0) { 209ddcfd9e6fafdbbe5c973477e537119e73c115ee4Alkis Evlogimenos if (!RegNo || MRegisterInfo::isPhysicalRegister(RegNo)) { 2108517e1f0beea9b5e47974f083396d53294c390adChris Lattner if (MRI) 2112a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner os << "%" << MRI->get(RegNo).Name; 2122a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner else 2138517e1f0beea9b5e47974f083396d53294c390adChris Lattner os << "%mreg(" << RegNo << ")"; 2142a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner } else 2158517e1f0beea9b5e47974f083396d53294c390adChris Lattner os << "%reg" << RegNo; 2168c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve} 2178c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve 2181049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattnerstatic void print(const MachineOperand &MO, std::ostream &OS, 219b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner const TargetMachine *TM) { 220ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman const MRegisterInfo *MRI = 0; 221edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 222ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman if (TM) MRI = TM->getRegisterInfo(); 223b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner 2241049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner switch (MO.getType()) { 2252d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner case MachineOperand::MO_Register: 2264efeab208cf0fe7ae2f68bcdd1264a8fdb18826cChris Lattner OutputReg(OS, MO.getReg(), MRI); 2271049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 22863b3d7113d93fda622c4954c6b1d046ce029044eChris Lattner case MachineOperand::MO_Immediate: 22900aff7d9772e4945e3a946e70a3ef9998006b8deEvan Cheng OS << MO.getImmedValue(); 2301049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2312109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner case MachineOperand::MO_MachineBasicBlock: 232988b7ba5bad830379a7108c1f9ea36fb29073245Brian Gaeke OS << "mbb<" 2332109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName() 234988b7ba5bad830379a7108c1f9ea36fb29073245Brian Gaeke << "," << (void*)MO.getMachineBasicBlock() << ">"; 2352109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner break; 23610cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner case MachineOperand::MO_FrameIndex: 23710cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "<fi#" << MO.getFrameIndex() << ">"; 23810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner break; 2398d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_ConstantPoolIndex: 2408d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<cp#" << MO.getConstantPoolIndex() << ">"; 2418d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 24237efe6764568a3829fee26aba532283131d1a104Nate Begeman case MachineOperand::MO_JumpTableIndex: 24337efe6764568a3829fee26aba532283131d1a104Nate Begeman OS << "<jt#" << MO.getJumpTableIndex() << ">"; 24437efe6764568a3829fee26aba532283131d1a104Nate Begeman break; 2458d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_GlobalAddress: 246ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner OS << "<ga:" << ((Value*)MO.getGlobal())->getName(); 247ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner if (MO.getOffset()) OS << "+" << MO.getOffset(); 248ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner OS << ">"; 2498d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 2508d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_ExternalSymbol: 251ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner OS << "<es:" << MO.getSymbolName(); 252ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner if (MO.getOffset()) OS << "+" << MO.getOffset(); 253ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner OS << ">"; 2548d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 2551049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner default: 2561049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner assert(0 && "Unrecognized operand type"); 2571049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 2581049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner} 2591049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 260b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattnervoid MachineInstr::print(std::ostream &OS, const TargetMachine *TM) const { 2616a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner unsigned StartOp = 0; 2626a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner 2636a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner // Specialize printing if op#0 is definition 264d8f44e07b89e651b2f0e3b0d680a775f44e667daChris Lattner if (getNumOperands() && getOperand(0).isReg() && getOperand(0).isDef()) { 2650742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner ::print(getOperand(0), OS, TM); 2666a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << " = "; 2676a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner ++StartOp; // Don't print this operand again! 2686a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner } 269b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner 27067f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng if (TID) 27167f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng OS << TID->Name; 272edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 2736a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) { 2745f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve const MachineOperand& mop = getOperand(i); 2756a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner if (i != StartOp) 2766a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << ","; 2776a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << " "; 2780742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner ::print(mop, OS, TM); 279edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 280438f7bc67cf235ccee7e6f7ac7f4ae2186eb8020Evan Cheng if (mop.isReg()) { 281d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng if (mop.isDef() || mop.isKill() || mop.isDead() || mop.isImplicit()) { 282d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng OS << "<"; 283d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng bool NeedComma = false; 284d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng if (mop.isImplicit()) { 285d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng OS << (mop.isDef() ? "imp-def" : "imp-use"); 286d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng NeedComma = true; 287d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng } else if (mop.isDef()) { 288d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng OS << "def"; 289d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng NeedComma = true; 290d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng } 291d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng if (mop.isKill() || mop.isDead()) { 292d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng if (NeedComma) 293d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng OS << ","; 294d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng if (mop.isKill()) 295d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng OS << "kill"; 296d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng if (mop.isDead()) 297d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng OS << "dead"; 298d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng } 299d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng OS << ">"; 300d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng } 301438f7bc67cf235ccee7e6f7ac7f4ae2186eb8020Evan Cheng } 3021049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 303edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 3041049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "\n"; 3051049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner} 3061049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 30734fb2cad46adb39f3c2cc705fbbf439a383d0f65Chris Lattnerstd::ostream &llvm::operator<<(std::ostream &os, const MachineInstr &MI) { 3088517e1f0beea9b5e47974f083396d53294c390adChris Lattner // If the instruction is embedded into a basic block, we can find the target 3098517e1f0beea9b5e47974f083396d53294c390adChris Lattner // info for the instruction. 3108517e1f0beea9b5e47974f083396d53294c390adChris Lattner if (const MachineBasicBlock *MBB = MI.getParent()) { 3118517e1f0beea9b5e47974f083396d53294c390adChris Lattner const MachineFunction *MF = MBB->getParent(); 312ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman if (MF) 313b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner MI.print(os, &MF->getTarget()); 314b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner else 315b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner MI.print(os, 0); 3168517e1f0beea9b5e47974f083396d53294c390adChris Lattner return os; 3178517e1f0beea9b5e47974f083396d53294c390adChris Lattner } 3188517e1f0beea9b5e47974f083396d53294c390adChris Lattner 3198517e1f0beea9b5e47974f083396d53294c390adChris Lattner // Otherwise, print it out in the "raw" format without symbolic register names 3208517e1f0beea9b5e47974f083396d53294c390adChris Lattner // and such. 32167f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng os << MI.getInstrDescriptor()->Name; 322edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 323ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman for (unsigned i = 0, N = MI.getNumOperands(); i < N; i++) { 3248d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner os << "\t" << MI.getOperand(i); 325d8f44e07b89e651b2f0e3b0d680a775f44e667daChris Lattner if (MI.getOperand(i).isReg() && MI.getOperand(i).isDef()) 326d8f44e07b89e651b2f0e3b0d680a775f44e667daChris Lattner os << "<d>"; 3278d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka } 328edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 329697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner return os << "\n"; 33070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 33170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 33234fb2cad46adb39f3c2cc705fbbf439a383d0f65Chris Lattnerstd::ostream &llvm::operator<<(std::ostream &OS, const MachineOperand &MO) { 333ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman switch (MO.getType()) { 3342d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner case MachineOperand::MO_Register: 3354efeab208cf0fe7ae2f68bcdd1264a8fdb18826cChris Lattner OutputReg(OS, MO.getReg()); 336ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 33763b3d7113d93fda622c4954c6b1d046ce029044eChris Lattner case MachineOperand::MO_Immediate: 338ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << (long)MO.getImmedValue(); 339ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 340ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman case MachineOperand::MO_MachineBasicBlock: 341ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << "<mbb:" 342ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName() 343ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman << "@" << (void*)MO.getMachineBasicBlock() << ">"; 344ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 345ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman case MachineOperand::MO_FrameIndex: 346ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << "<fi#" << MO.getFrameIndex() << ">"; 347ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 348ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman case MachineOperand::MO_ConstantPoolIndex: 349ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << "<cp#" << MO.getConstantPoolIndex() << ">"; 350ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 35137efe6764568a3829fee26aba532283131d1a104Nate Begeman case MachineOperand::MO_JumpTableIndex: 35237efe6764568a3829fee26aba532283131d1a104Nate Begeman OS << "<jt#" << MO.getJumpTableIndex() << ">"; 35337efe6764568a3829fee26aba532283131d1a104Nate Begeman break; 354ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman case MachineOperand::MO_GlobalAddress: 355ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">"; 356ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 357ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman case MachineOperand::MO_ExternalSymbol: 358ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << "<es:" << MO.getSymbolName() << ">"; 359ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 360ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman default: 361ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman assert(0 && "Unrecognized operand type"); 362ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 363ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman } 364edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 36510cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner return OS; 36670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 367c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen 368c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff CohenOStream& llvm::operator<<(OStream& os, const MachineInstr& minstr) { 369c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen if (os.stream()) *os.stream() << minstr; 370c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen return os; 371c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen} 372c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen 373c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff CohenOStream& llvm::operator<<(OStream& os, const MachineOperand& mop) { 374c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen if (os.stream()) *os.stream() << mop; 375c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen return os; 376c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen} 377c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen 378