MachineInstr.cpp revision f20c1a497fe3922ac718429d65a5fe396890575e
1035dfbe7f2d109008d2d62d9f2a67efb477a7ab6Chris Lattner//===-- MachineInstr.cpp --------------------------------------------------===//
2edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman//
3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//                     The LLVM Compiler Infrastructure
4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// 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"
1584bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner#include "llvm/Value.h"
168517e1f0beea9b5e47974f083396d53294c390adChris Lattner#include "llvm/CodeGen/MachineFunction.h"
171049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner#include "llvm/Target/TargetMachine.h"
183501feab811c86c9659248a4875fc31a3165f84dChris Lattner#include "llvm/Target/TargetInstrInfo.h"
192a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner#include "llvm/Target/MRegisterInfo.h"
20551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/LeakDetector.h"
21a09362eb975730ac624c0bd210a95655ee105296Bill Wendling#include "llvm/Support/Streams.h"
22c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen#include <ostream>
230742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattnerusing namespace llvm;
24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
25f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner//===----------------------------------------------------------------------===//
26f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner// MachineOperand Implementation
27f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner//===----------------------------------------------------------------------===//
28f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner
29f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner/// isIdenticalTo - Return true if this operand is identical to the specified
30f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner/// operand.
31f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattnerbool MachineOperand::isIdenticalTo(const MachineOperand &Other) const {
32f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  if (getType() != Other.getType()) return false;
33f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner
34f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  switch (getType()) {
35f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  default: assert(0 && "Unrecognized operand type");
36f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  case MachineOperand::MO_Register:
37f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    return getReg() == Other.getReg() && isDef() == Other.isDef() &&
38f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner           getSubReg() == Other.getSubReg();
39f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  case MachineOperand::MO_Immediate:
40f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    return getImm() == Other.getImm();
41f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  case MachineOperand::MO_MachineBasicBlock:
42f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    return getMBB() == Other.getMBB();
43f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  case MachineOperand::MO_FrameIndex:
448aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner    return getIndex() == Other.getIndex();
45f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  case MachineOperand::MO_ConstantPoolIndex:
468aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner    return getIndex() == Other.getIndex() && getOffset() == Other.getOffset();
47f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  case MachineOperand::MO_JumpTableIndex:
488aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner    return getIndex() == Other.getIndex();
49f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  case MachineOperand::MO_GlobalAddress:
50f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    return getGlobal() == Other.getGlobal() && getOffset() == Other.getOffset();
51f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  case MachineOperand::MO_ExternalSymbol:
52f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    return !strcmp(getSymbolName(), Other.getSymbolName()) &&
53f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner           getOffset() == Other.getOffset();
54f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  }
55f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner}
56f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner
57f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner/// print - Print the specified machine operand.
58f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner///
59f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattnervoid MachineOperand::print(std::ostream &OS, const TargetMachine *TM) const {
60f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  switch (getType()) {
61f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  case MachineOperand::MO_Register:
62f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    if (getReg() == 0 || MRegisterInfo::isVirtualRegister(getReg())) {
63f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner      OS << "%reg" << getReg();
64f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    } else {
65f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner      // If the instruction is embedded into a basic block, we can find the
66f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner      // target
67f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner      // info for the instruction.
68f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner      if (TM == 0)
69f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner        if (const MachineInstr *MI = getParent())
70f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner          if (const MachineBasicBlock *MBB = MI->getParent())
71f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner            if (const MachineFunction *MF = MBB->getParent())
72f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner              TM = &MF->getTarget();
73f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner
74f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner      if (TM)
75f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner        OS << "%" << TM->getRegisterInfo()->get(getReg()).Name;
76f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner      else
77f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner        OS << "%mreg" << getReg();
78f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    }
79f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner
80f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    if (isDef() || isKill() || isDead() || isImplicit()) {
81f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner      OS << "<";
82f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner      bool NeedComma = false;
83f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner      if (isImplicit()) {
84f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner        OS << (isDef() ? "imp-def" : "imp-use");
85f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner        NeedComma = true;
86f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner      } else if (isDef()) {
87f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner        OS << "def";
88f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner        NeedComma = true;
89f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner      }
90f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner      if (isKill() || isDead()) {
91f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner        if (NeedComma)    OS << ",";
92f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner        if (isKill()) OS << "kill";
93f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner        if (isDead()) OS << "dead";
94f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner      }
95f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner      OS << ">";
96f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    }
97f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    break;
98f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  case MachineOperand::MO_Immediate:
99f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    OS << getImm();
100f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    break;
101f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  case MachineOperand::MO_MachineBasicBlock:
102f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    OS << "mbb<"
1038aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner       << ((Value*)getMBB()->getBasicBlock())->getName()
1048aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner       << "," << (void*)getMBB() << ">";
105f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    break;
106f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  case MachineOperand::MO_FrameIndex:
1078aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner    OS << "<fi#" << getIndex() << ">";
108f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    break;
109f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  case MachineOperand::MO_ConstantPoolIndex:
1108aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner    OS << "<cp#" << getIndex();
111f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    if (getOffset()) OS << "+" << getOffset();
112f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    OS << ">";
113f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    break;
114f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  case MachineOperand::MO_JumpTableIndex:
1158aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner    OS << "<jt#" << getIndex() << ">";
116f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    break;
117f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  case MachineOperand::MO_GlobalAddress:
118f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    OS << "<ga:" << ((Value*)getGlobal())->getName();
119f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    if (getOffset()) OS << "+" << getOffset();
120f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    OS << ">";
121f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    break;
122f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  case MachineOperand::MO_ExternalSymbol:
123f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    OS << "<es:" << getSymbolName();
124f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    if (getOffset()) OS << "+" << getOffset();
125f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    OS << ">";
126f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    break;
127f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  default:
128f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    assert(0 && "Unrecognized operand type");
129f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner  }
130f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner}
131f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner
132f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner//===----------------------------------------------------------------------===//
133f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner// MachineInstr Implementation
134f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner//===----------------------------------------------------------------------===//
135f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner
136c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// MachineInstr ctor - This constructor creates a dummy MachineInstr with
13767f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng/// TID NULL and no operands.
138c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan ChengMachineInstr::MachineInstr()
139f20c1a497fe3922ac718429d65a5fe396890575eChris Lattner  : TID(0), NumImplicitOps(0), Parent(0) {
140aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  // Make sure that we get added to a machine basicblock
141aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  LeakDetector::addGarbageObject(this);
1427279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner}
1437279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner
14467f660cb080965ea93ed6d7265a67100f2fe38e4Evan Chengvoid MachineInstr::addImplicitDefUseOperands() {
14567f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  if (TID->ImplicitDefs)
146a4161ee99478e7f8f9e33481e1c0dc79f0b4bd7dChris Lattner    for (const unsigned *ImpDefs = TID->ImplicitDefs; *ImpDefs; ++ImpDefs)
1478019f41c0b7fda031d494e3900eada7d4e494772Chris Lattner      addOperand(MachineOperand::CreateReg(*ImpDefs, true, true));
14867f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  if (TID->ImplicitUses)
149a4161ee99478e7f8f9e33481e1c0dc79f0b4bd7dChris Lattner    for (const unsigned *ImpUses = TID->ImplicitUses; *ImpUses; ++ImpUses)
1508019f41c0b7fda031d494e3900eada7d4e494772Chris Lattner      addOperand(MachineOperand::CreateReg(*ImpUses, false, true));
151d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng}
152d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng
153d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng/// MachineInstr ctor - This constructor create a MachineInstr and add the
154c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// implicit operands. It reserves space for number of operands specified by
155c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// TargetInstrDescriptor or the numOperands if it is not zero. (for
156c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// instructions with variable number of operands).
157fa9457276a2174aaf302240dd32d89900ad021aeEvan ChengMachineInstr::MachineInstr(const TargetInstrDescriptor &tid, bool NoImp)
158f20c1a497fe3922ac718429d65a5fe396890575eChris Lattner  : TID(&tid), NumImplicitOps(0), Parent(0) {
159fa9457276a2174aaf302240dd32d89900ad021aeEvan Cheng  if (!NoImp && TID->ImplicitDefs)
16067f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng    for (const unsigned *ImpDefs = TID->ImplicitDefs; *ImpDefs; ++ImpDefs)
161d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      NumImplicitOps++;
162fa9457276a2174aaf302240dd32d89900ad021aeEvan Cheng  if (!NoImp && TID->ImplicitUses)
16367f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng    for (const unsigned *ImpUses = TID->ImplicitUses; *ImpUses; ++ImpUses)
164d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      NumImplicitOps++;
16567f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  Operands.reserve(NumImplicitOps + TID->numOperands);
166fa9457276a2174aaf302240dd32d89900ad021aeEvan Cheng  if (!NoImp)
167fa9457276a2174aaf302240dd32d89900ad021aeEvan Cheng    addImplicitDefUseOperands();
168d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  // Make sure that we get added to a machine basicblock
169d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng  LeakDetector::addGarbageObject(this);
170d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng}
171d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng
172ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - Work exactly the same as the ctor above, except that the
173ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr is created and added to the end of the specified basic block.
174ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner///
175c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan ChengMachineInstr::MachineInstr(MachineBasicBlock *MBB,
17667f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng                           const TargetInstrDescriptor &tid)
177f20c1a497fe3922ac718429d65a5fe396890575eChris Lattner  : TID(&tid), NumImplicitOps(0), Parent(0) {
178ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner  assert(MBB && "Cannot use inserting ctor with null basic block!");
17967f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  if (TID->ImplicitDefs)
18067f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng    for (const unsigned *ImpDefs = TID->ImplicitDefs; *ImpDefs; ++ImpDefs)
181d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      NumImplicitOps++;
18267f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  if (TID->ImplicitUses)
18367f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng    for (const unsigned *ImpUses = TID->ImplicitUses; *ImpUses; ++ImpUses)
184d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng      NumImplicitOps++;
18567f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  Operands.reserve(NumImplicitOps + TID->numOperands);
18667f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  addImplicitDefUseOperands();
187aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  // Make sure that we get added to a machine basicblock
188aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  LeakDetector::addGarbageObject(this);
189ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner  MBB->push_back(this);  // Add instruction to end of basic block!
190ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner}
191ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner
192ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman/// MachineInstr ctor - Copies MachineInstr arg exactly
193ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman///
194466b534a570f574ed485d875bbca8454f68dcb52Tanya LattnerMachineInstr::MachineInstr(const MachineInstr &MI) {
19567f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  TID = MI.getInstrDescriptor();
1966b2c05f3d3c7b44183c629485ade10c18b86828dEvan Cheng  NumImplicitOps = MI.NumImplicitOps;
197943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner  Operands.reserve(MI.getNumOperands());
198b5159ed0cb7943e5938782f7693beb18342165ceTanya Lattner
199ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  // Add operands
200e12d6abfdfc5141b2001f0c369a0e1525315b9c0Chris Lattner  for (unsigned i = 0; i != MI.getNumOperands(); ++i) {
201943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner    Operands.push_back(MI.getOperand(i));
202e12d6abfdfc5141b2001f0c369a0e1525315b9c0Chris Lattner    Operands.back().ParentMI = this;
203e12d6abfdfc5141b2001f0c369a0e1525315b9c0Chris Lattner  }
2040c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner
205ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman  // Set parent, next, and prev to null
206f20c1a497fe3922ac718429d65a5fe396890575eChris Lattner  Parent = 0;
207f20c1a497fe3922ac718429d65a5fe396890575eChris Lattner  Prev = 0;
208f20c1a497fe3922ac718429d65a5fe396890575eChris Lattner  Next = 0;
209466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner}
210466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner
211466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner
212ce22e76996d3ff0930716fa60c29df60a7e0481bMisha BrukmanMachineInstr::~MachineInstr() {
213aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos  LeakDetector::removeGarbageObject(this);
214e12d6abfdfc5141b2001f0c369a0e1525315b9c0Chris Lattner#ifndef NDEBUG
215e12d6abfdfc5141b2001f0c369a0e1525315b9c0Chris Lattner  for (unsigned i = 0, e = Operands.size(); i != e; ++i)
216e12d6abfdfc5141b2001f0c369a0e1525315b9c0Chris Lattner    assert(Operands[i].ParentMI == this && "ParentMI mismatch!");
217e12d6abfdfc5141b2001f0c369a0e1525315b9c0Chris Lattner#endif
218aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos}
219aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos
22067f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng/// getOpcode - Returns the opcode of this MachineInstr.
22167f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng///
222cb648f90a26eb05ae8d508d500ca12881df50824Dan Gohmanint MachineInstr::getOpcode() const {
22367f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  return TID->Opcode;
22467f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng}
22567f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng
22648d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner/// removeFromParent - This method unlinks 'this' from the containing basic
22748d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner/// block, and returns it, but does not delete it.
22848d7c069c76882475c23de153bda9483cd3c9bb4Chris LattnerMachineInstr *MachineInstr::removeFromParent() {
22948d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner  assert(getParent() && "Not embedded in a basic block!");
23048d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner  getParent()->remove(this);
23148d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner  return this;
23248d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner}
23348d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner
23448d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner
23521326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// OperandComplete - Return true if it's illegal to add a new operand
23621326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke///
2372a90ba60175f93e7438165d8423100aa573c16c5Chris Lattnerbool MachineInstr::OperandsComplete() const {
23867f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  unsigned short NumOperands = TID->numOperands;
23967f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng  if ((TID->Flags & M_VARIABLE_OPS) == 0 &&
2408bcb042f22f06d034f18aee8cb5dd0a04745fd97Evan Cheng      getNumOperands()-NumImplicitOps >= NumOperands)
2413497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve    return true;  // Broken: we have all the operands of this instruction!
242413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner  return false;
24370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
24470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
24519e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng/// getNumExplicitOperands - Returns the number of non-implicit operands.
24619e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng///
24719e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Chengunsigned MachineInstr::getNumExplicitOperands() const {
24819e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng  unsigned NumOperands = TID->numOperands;
24919e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng  if ((TID->Flags & M_VARIABLE_OPS) == 0)
25019e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng    return NumOperands;
25119e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng
25219e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng  for (unsigned e = getNumOperands(); NumOperands != e; ++NumOperands) {
25319e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng    const MachineOperand &MO = getOperand(NumOperands);
25419e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng    if (!MO.isRegister() || !MO.isImplicit())
25519e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng      NumOperands++;
25619e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng  }
25719e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng  return NumOperands;
25819e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng}
25919e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng
2608ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner
261faa510726f4b40aa4495e60e4d341c6467e3fb01Evan Cheng/// findRegisterUseOperandIdx() - Returns the MachineOperand that is a use of
26232eb1f1ca4220d2f24916e587ad7e8574d7d82a1Evan Cheng/// the specific register or -1 if it is not found. It further tightening
26376d7e76c15c258ec4a71fd75a2a32bca3a5e5e27Evan Cheng/// the search criteria to a use that kills the register if isKill is true.
264f277ee4be7edabb759a7f78138b693d72d0c263fEvan Chengint MachineInstr::findRegisterUseOperandIdx(unsigned Reg, bool isKill) const {
265576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng  for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
266f277ee4be7edabb759a7f78138b693d72d0c263fEvan Cheng    const MachineOperand &MO = getOperand(i);
26792dfe2001e96f6e2b6d327e8816f38033f88b295Dan Gohman    if (MO.isRegister() && MO.isUse() && MO.getReg() == Reg)
26876d7e76c15c258ec4a71fd75a2a32bca3a5e5e27Evan Cheng      if (!isKill || MO.isKill())
26932eb1f1ca4220d2f24916e587ad7e8574d7d82a1Evan Cheng        return i;
270b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  }
27132eb1f1ca4220d2f24916e587ad7e8574d7d82a1Evan Cheng  return -1;
272b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng}
273b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng
274b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng/// findRegisterDefOperand() - Returns the MachineOperand that is a def of
275b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng/// the specific register or NULL if it is not found.
276b371f457b0ea4a652a9f526ba4375c80ae542252Evan ChengMachineOperand *MachineInstr::findRegisterDefOperand(unsigned Reg) {
277b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng  for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
278b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng    MachineOperand &MO = getOperand(i);
27992dfe2001e96f6e2b6d327e8816f38033f88b295Dan Gohman    if (MO.isRegister() && MO.isDef() && MO.getReg() == Reg)
280576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng      return &MO;
281576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng  }
282576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng  return NULL;
283576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng}
28419e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng
285f277ee4be7edabb759a7f78138b693d72d0c263fEvan Cheng/// findFirstPredOperandIdx() - Find the index of the first operand in the
286f277ee4be7edabb759a7f78138b693d72d0c263fEvan Cheng/// operand list that is used to represent the predicate. It returns -1 if
287f277ee4be7edabb759a7f78138b693d72d0c263fEvan Cheng/// none is found.
288f277ee4be7edabb759a7f78138b693d72d0c263fEvan Chengint MachineInstr::findFirstPredOperandIdx() const {
28919e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng  const TargetInstrDescriptor *TID = getInstrDescriptor();
290c3a289c4b5a60a204363ba4ae9f017ba87b714f9Evan Cheng  if (TID->Flags & M_PREDICABLE) {
29119e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng    for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
29219e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng      if ((TID->OpInfo[i].Flags & M_PREDICATE_OPERAND))
293f277ee4be7edabb759a7f78138b693d72d0c263fEvan Cheng        return i;
29419e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng  }
29519e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng
296f277ee4be7edabb759a7f78138b693d72d0c263fEvan Cheng  return -1;
29719e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng}
298576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng
29932dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng/// isRegReDefinedByTwoAddr - Returns true if the Reg re-definition is due
30032dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng/// to two addr elimination.
30132dfbeada7292167bb488f36a71a5a6a519ddaffEvan Chengbool MachineInstr::isRegReDefinedByTwoAddr(unsigned Reg) const {
30232dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng  const TargetInstrDescriptor *TID = getInstrDescriptor();
30332dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng  for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
30432dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng    const MachineOperand &MO1 = getOperand(i);
30532dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng    if (MO1.isRegister() && MO1.isDef() && MO1.getReg() == Reg) {
30632dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng      for (unsigned j = i+1; j < e; ++j) {
30732dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng        const MachineOperand &MO2 = getOperand(j);
30832dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng        if (MO2.isRegister() && MO2.isUse() && MO2.getReg() == Reg &&
30932dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng            TID->getOperandConstraint(j, TOI::TIED_TO) == (int)i)
31032dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng          return true;
31132dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng      }
31232dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng    }
31332dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng  }
31432dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng  return false;
31532dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng}
31632dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng
317576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng/// copyKillDeadInfo - Copies kill / dead operand properties from MI.
318576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng///
319576d123e130a8291669dd2384a3735cc4933fd00Evan Chengvoid MachineInstr::copyKillDeadInfo(const MachineInstr *MI) {
320576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
321576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng    const MachineOperand &MO = MI->getOperand(i);
32292dfe2001e96f6e2b6d327e8816f38033f88b295Dan Gohman    if (!MO.isRegister() || (!MO.isKill() && !MO.isDead()))
323576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng      continue;
324576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng    for (unsigned j = 0, ee = getNumOperands(); j != ee; ++j) {
325576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng      MachineOperand &MOp = getOperand(j);
326576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng      if (!MOp.isIdenticalTo(MO))
327576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng        continue;
328576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng      if (MO.isKill())
329576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng        MOp.setIsKill();
330576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng      else
331576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng        MOp.setIsDead();
332576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng      break;
333576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng    }
334576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng  }
335576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng}
336576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng
33719e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng/// copyPredicates - Copies predicate operand(s) from MI.
33819e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Chengvoid MachineInstr::copyPredicates(const MachineInstr *MI) {
33919e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng  const TargetInstrDescriptor *TID = MI->getInstrDescriptor();
340c3a289c4b5a60a204363ba4ae9f017ba87b714f9Evan Cheng  if (TID->Flags & M_PREDICABLE) {
34119e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng    for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
34219e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng      if ((TID->OpInfo[i].Flags & M_PREDICATE_OPERAND)) {
34319e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng        // Predicated operands must be last operands.
3448019f41c0b7fda031d494e3900eada7d4e494772Chris Lattner        addOperand(MI->getOperand(i));
34519e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng      }
34619e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng    }
34719e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng  }
34819e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng}
34919e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng
35021326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaekevoid MachineInstr::dump() const {
351e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling  cerr << "  " << *this;
35270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve}
35370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve
354b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattnervoid MachineInstr::print(std::ostream &OS, const TargetMachine *TM) const {
355e3087890ac7f2fcf4697f8e09091e9a384311b9cChris Lattner  // Specialize printing if op#0 is definition
3566a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner  unsigned StartOp = 0;
35792dfe2001e96f6e2b6d327e8816f38033f88b295Dan Gohman  if (getNumOperands() && getOperand(0).isRegister() && getOperand(0).isDef()) {
358f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    getOperand(0).print(OS, TM);
3596a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    OS << " = ";
3606a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    ++StartOp;   // Don't print this operand again!
3616a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner  }
362b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner
363e3087890ac7f2fcf4697f8e09091e9a384311b9cChris Lattner  OS << getInstrDescriptor()->Name;
364edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
3656a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner  for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) {
3666a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    if (i != StartOp)
3676a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner      OS << ",";
3686a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner    OS << " ";
369f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner    getOperand(i).print(OS, TM);
3701049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  }
371edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
3721049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner  OS << "\n";
3731049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner}
3741049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner
375