MachineInstr.cpp revision 19e3f31f6acd9f5ce3cdd8372d4cb598ed921f95
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; 427bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman Op.auxInfo.subReg = 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; 547bf1c272ab27297a7bbab329de3f17ddb26e02a3Nate Begeman Op.auxInfo.subReg = 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 14419e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng/// getNumExplicitOperands - Returns the number of non-implicit operands. 14519e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng/// 14619e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Chengunsigned MachineInstr::getNumExplicitOperands() const { 14719e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng unsigned NumOperands = TID->numOperands; 14819e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng if ((TID->Flags & M_VARIABLE_OPS) == 0) 14919e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng return NumOperands; 15019e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng 15119e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng for (unsigned e = getNumOperands(); NumOperands != e; ++NumOperands) { 15219e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng const MachineOperand &MO = getOperand(NumOperands); 15319e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng if (!MO.isRegister() || !MO.isImplicit()) 15419e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng NumOperands++; 15519e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng } 15619e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng return NumOperands; 15719e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng} 15819e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng 1598ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner/// isIdenticalTo - Return true if this operand is identical to the specified 1608ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner/// operand. 1618ace2cd034be10c09be51daf08c3dda327f54262Chris Lattnerbool MachineOperand::isIdenticalTo(const MachineOperand &Other) const { 1628ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner if (getType() != Other.getType()) return false; 1638ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner 1648ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner switch (getType()) { 1658ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner default: assert(0 && "Unrecognized operand type"); 1668ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner case MachineOperand::MO_Register: 1678ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner return getReg() == Other.getReg() && isDef() == Other.isDef(); 1688ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner case MachineOperand::MO_Immediate: 1698ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner return getImm() == Other.getImm(); 1708ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner case MachineOperand::MO_MachineBasicBlock: 1718ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner return getMBB() == Other.getMBB(); 1728ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner case MachineOperand::MO_FrameIndex: 1738ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner return getFrameIndex() == Other.getFrameIndex(); 1748ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner case MachineOperand::MO_ConstantPoolIndex: 1758ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner return getConstantPoolIndex() == Other.getConstantPoolIndex() && 1768ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner getOffset() == Other.getOffset(); 1778ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner case MachineOperand::MO_JumpTableIndex: 1788ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner return getJumpTableIndex() == Other.getJumpTableIndex(); 1798ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner case MachineOperand::MO_GlobalAddress: 1808ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner return getGlobal() == Other.getGlobal() && getOffset() == Other.getOffset(); 1818ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner case MachineOperand::MO_ExternalSymbol: 18213a04125df039d118c688df26998343a00d8a749Chris Lattner return !strcmp(getSymbolName(), Other.getSymbolName()) && 1838ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner getOffset() == Other.getOffset(); 1848ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner } 1858ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner} 1868ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner 187faa510726f4b40aa4495e60e4d341c6467e3fb01Evan Cheng/// findRegisterUseOperandIdx() - Returns the MachineOperand that is a use of 18832eb1f1ca4220d2f24916e587ad7e8574d7d82a1Evan Cheng/// the specific register or -1 if it is not found. It further tightening 18976d7e76c15c258ec4a71fd75a2a32bca3a5e5e27Evan Cheng/// the search criteria to a use that kills the register if isKill is true. 190faa510726f4b40aa4495e60e4d341c6467e3fb01Evan Chengint MachineInstr::findRegisterUseOperandIdx(unsigned Reg, bool isKill) { 191576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { 192576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng MachineOperand &MO = getOperand(i); 193576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng if (MO.isReg() && MO.isUse() && MO.getReg() == Reg) 19476d7e76c15c258ec4a71fd75a2a32bca3a5e5e27Evan Cheng if (!isKill || MO.isKill()) 19532eb1f1ca4220d2f24916e587ad7e8574d7d82a1Evan Cheng return i; 196b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng } 19732eb1f1ca4220d2f24916e587ad7e8574d7d82a1Evan Cheng return -1; 198b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng} 199b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng 200b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng/// findRegisterDefOperand() - Returns the MachineOperand that is a def of 201b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng/// the specific register or NULL if it is not found. 202b371f457b0ea4a652a9f526ba4375c80ae542252Evan ChengMachineOperand *MachineInstr::findRegisterDefOperand(unsigned Reg) { 203b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { 204b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng MachineOperand &MO = getOperand(i); 205b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng if (MO.isReg() && MO.isDef() && MO.getReg() == Reg) 206576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng return &MO; 207576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng } 208576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng return NULL; 209576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng} 21019e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng 21119e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng/// findFirstPredOperand() - Find the first operand in the operand list that 21219e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng// is used to represent the predicate. 21319e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan ChengMachineOperand *MachineInstr::findFirstPredOperand() { 21419e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng const TargetInstrDescriptor *TID = getInstrDescriptor(); 21519e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng if (TID->Flags & M_PREDICATED) { 21619e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng for (unsigned i = 0, e = getNumOperands(); i != e; ++i) 21719e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng if ((TID->OpInfo[i].Flags & M_PREDICATE_OPERAND)) 21819e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng return &getOperand(i); 21919e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng } 22019e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng 22119e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng return NULL; 22219e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng} 223576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng 224576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng/// copyKillDeadInfo - Copies kill / dead operand properties from MI. 225576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng/// 226576d123e130a8291669dd2384a3735cc4933fd00Evan Chengvoid MachineInstr::copyKillDeadInfo(const MachineInstr *MI) { 227576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 228576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng const MachineOperand &MO = MI->getOperand(i); 229576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng if (!MO.isReg() || (!MO.isKill() && !MO.isDead())) 230576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng continue; 231576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng for (unsigned j = 0, ee = getNumOperands(); j != ee; ++j) { 232576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng MachineOperand &MOp = getOperand(j); 233576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng if (!MOp.isIdenticalTo(MO)) 234576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng continue; 235576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng if (MO.isKill()) 236576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng MOp.setIsKill(); 237576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng else 238576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng MOp.setIsDead(); 239576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng break; 240576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng } 241576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng } 242576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng} 243576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng 24419e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng/// copyPredicates - Copies predicate operand(s) from MI. 24519e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Chengvoid MachineInstr::copyPredicates(const MachineInstr *MI) { 24619e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng const TargetInstrDescriptor *TID = MI->getInstrDescriptor(); 24719e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng if (TID->Flags & M_PREDICATED) { 24819e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 24919e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng if ((TID->OpInfo[i].Flags & M_PREDICATE_OPERAND)) { 25019e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng const MachineOperand &MO = MI->getOperand(i); 25119e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng // Predicated operands must be last operands. 25219e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng if (MO.isReg()) 25319e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng addRegOperand(MO.getReg(), false); 25419e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng else { 25519e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng addImmOperand(MO.getImm()); 25619e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng } 25719e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng } 25819e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng } 25919e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng } 26019e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng} 26119e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng 26221326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaekevoid MachineInstr::dump() const { 263e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling cerr << " " << *this; 26470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 26570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 2662a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattnerstatic inline void OutputReg(std::ostream &os, unsigned RegNo, 2672a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner const MRegisterInfo *MRI = 0) { 268ddcfd9e6fafdbbe5c973477e537119e73c115ee4Alkis Evlogimenos if (!RegNo || MRegisterInfo::isPhysicalRegister(RegNo)) { 2698517e1f0beea9b5e47974f083396d53294c390adChris Lattner if (MRI) 2702a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner os << "%" << MRI->get(RegNo).Name; 2712a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner else 2728517e1f0beea9b5e47974f083396d53294c390adChris Lattner os << "%mreg(" << RegNo << ")"; 2732a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner } else 2748517e1f0beea9b5e47974f083396d53294c390adChris Lattner os << "%reg" << RegNo; 2758c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve} 2768c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve 2771049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattnerstatic void print(const MachineOperand &MO, std::ostream &OS, 278b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner const TargetMachine *TM) { 279ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman const MRegisterInfo *MRI = 0; 280edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 281ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman if (TM) MRI = TM->getRegisterInfo(); 282b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner 2831049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner switch (MO.getType()) { 2842d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner case MachineOperand::MO_Register: 2854efeab208cf0fe7ae2f68bcdd1264a8fdb18826cChris Lattner OutputReg(OS, MO.getReg(), MRI); 2861049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 28763b3d7113d93fda622c4954c6b1d046ce029044eChris Lattner case MachineOperand::MO_Immediate: 28800aff7d9772e4945e3a946e70a3ef9998006b8deEvan Cheng OS << MO.getImmedValue(); 2891049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2902109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner case MachineOperand::MO_MachineBasicBlock: 291988b7ba5bad830379a7108c1f9ea36fb29073245Brian Gaeke OS << "mbb<" 2922109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName() 293988b7ba5bad830379a7108c1f9ea36fb29073245Brian Gaeke << "," << (void*)MO.getMachineBasicBlock() << ">"; 2942109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner break; 29510cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner case MachineOperand::MO_FrameIndex: 29610cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "<fi#" << MO.getFrameIndex() << ">"; 29710cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner break; 2988d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_ConstantPoolIndex: 2998d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<cp#" << MO.getConstantPoolIndex() << ">"; 3008d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 30137efe6764568a3829fee26aba532283131d1a104Nate Begeman case MachineOperand::MO_JumpTableIndex: 30237efe6764568a3829fee26aba532283131d1a104Nate Begeman OS << "<jt#" << MO.getJumpTableIndex() << ">"; 30337efe6764568a3829fee26aba532283131d1a104Nate Begeman break; 3048d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_GlobalAddress: 305ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner OS << "<ga:" << ((Value*)MO.getGlobal())->getName(); 306ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner if (MO.getOffset()) OS << "+" << MO.getOffset(); 307ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner OS << ">"; 3088d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 3098d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_ExternalSymbol: 310ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner OS << "<es:" << MO.getSymbolName(); 311ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner if (MO.getOffset()) OS << "+" << MO.getOffset(); 312ca4f6ebefc4dc55d13a0182a0be5b02e92fc63eaChris Lattner OS << ">"; 3138d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 3141049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner default: 3151049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner assert(0 && "Unrecognized operand type"); 3161049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 3171049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner} 3181049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 319b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattnervoid MachineInstr::print(std::ostream &OS, const TargetMachine *TM) const { 3206a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner unsigned StartOp = 0; 3216a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner 3226a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner // Specialize printing if op#0 is definition 323d8f44e07b89e651b2f0e3b0d680a775f44e667daChris Lattner if (getNumOperands() && getOperand(0).isReg() && getOperand(0).isDef()) { 3240742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner ::print(getOperand(0), OS, TM); 325bdf44b929f6bd0983b0f0df0d2ae66610e81e149Evan Cheng if (getOperand(0).isDead()) 326bdf44b929f6bd0983b0f0df0d2ae66610e81e149Evan Cheng OS << "<dead>"; 3276a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << " = "; 3286a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner ++StartOp; // Don't print this operand again! 3296a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner } 330b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner 33167f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng if (TID) 33267f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng OS << TID->Name; 333edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 3346a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) { 3355f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve const MachineOperand& mop = getOperand(i); 3366a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner if (i != StartOp) 3376a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << ","; 3386a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << " "; 3390742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattner ::print(mop, OS, TM); 340edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 341438f7bc67cf235ccee7e6f7ac7f4ae2186eb8020Evan Cheng if (mop.isReg()) { 342d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng if (mop.isDef() || mop.isKill() || mop.isDead() || mop.isImplicit()) { 343d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng OS << "<"; 344d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng bool NeedComma = false; 345d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng if (mop.isImplicit()) { 346d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng OS << (mop.isDef() ? "imp-def" : "imp-use"); 347d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng NeedComma = true; 348d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng } else if (mop.isDef()) { 349d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng OS << "def"; 350d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng NeedComma = true; 351d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng } 352d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng if (mop.isKill() || mop.isDead()) { 353d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng if (NeedComma) 354d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng OS << ","; 355d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng if (mop.isKill()) 356d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng OS << "kill"; 357d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng if (mop.isDead()) 358d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng OS << "dead"; 359d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng } 360d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng OS << ">"; 361d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng } 362438f7bc67cf235ccee7e6f7ac7f4ae2186eb8020Evan Cheng } 3631049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 364edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 3651049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "\n"; 3661049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner} 3671049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 3684b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohenvoid MachineInstr::print(std::ostream &os) const { 3698517e1f0beea9b5e47974f083396d53294c390adChris Lattner // If the instruction is embedded into a basic block, we can find the target 3708517e1f0beea9b5e47974f083396d53294c390adChris Lattner // info for the instruction. 3714b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen if (const MachineBasicBlock *MBB = getParent()) { 3728517e1f0beea9b5e47974f083396d53294c390adChris Lattner const MachineFunction *MF = MBB->getParent(); 373ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman if (MF) 3744b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen print(os, &MF->getTarget()); 375b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner else 3764b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen print(os, 0); 3778517e1f0beea9b5e47974f083396d53294c390adChris Lattner } 3788517e1f0beea9b5e47974f083396d53294c390adChris Lattner 3798517e1f0beea9b5e47974f083396d53294c390adChris Lattner // Otherwise, print it out in the "raw" format without symbolic register names 3808517e1f0beea9b5e47974f083396d53294c390adChris Lattner // and such. 3814b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen os << getInstrDescriptor()->Name; 382edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 3834b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen for (unsigned i = 0, N = getNumOperands(); i < N; i++) { 3844b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen os << "\t" << getOperand(i); 3854b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen if (getOperand(i).isReg() && getOperand(i).isDef()) 386d8f44e07b89e651b2f0e3b0d680a775f44e667daChris Lattner os << "<d>"; 3878d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka } 388edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 3894b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen os << "\n"; 39070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 39170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 3924b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohenvoid MachineOperand::print(std::ostream &OS) const { 3934b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen switch (getType()) { 3944b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen case MO_Register: 3954b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen OutputReg(OS, getReg()); 396ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 3974b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen case MO_Immediate: 3984b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen OS << (long)getImmedValue(); 399ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 4004b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen case MO_MachineBasicBlock: 401ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman OS << "<mbb:" 4024b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen << ((Value*)getMachineBasicBlock()->getBasicBlock())->getName() 4034b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen << "@" << (void*)getMachineBasicBlock() << ">"; 404ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 4054b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen case MO_FrameIndex: 4064b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen OS << "<fi#" << getFrameIndex() << ">"; 407ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 4084b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen case MO_ConstantPoolIndex: 4094b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen OS << "<cp#" << getConstantPoolIndex() << ">"; 410ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 4114b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen case MO_JumpTableIndex: 4124b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen OS << "<jt#" << getJumpTableIndex() << ">"; 41337efe6764568a3829fee26aba532283131d1a104Nate Begeman break; 4144b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen case MO_GlobalAddress: 4154b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen OS << "<ga:" << ((Value*)getGlobal())->getName() << ">"; 416ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 4174b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen case MO_ExternalSymbol: 4184b607748d86b44cc59e5cf3eee194dfd9b0fcd86Jeff Cohen OS << "<es:" << getSymbolName() << ">"; 419ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 420ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman default: 421ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman assert(0 && "Unrecognized operand type"); 422ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman break; 423ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman } 424c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen} 425c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen 426