1 //===-- MachineInstr.cpp --------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // Methods common to all machine instructions.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/CodeGen/MachineInstr.h"
15 #include "llvm/CodeGen/MachineFunction.h"
16 #include "llvm/Target/TargetMachine.h"
17 #include "llvm/Target/TargetInstrInfo.h"
18 #include "llvm/Target/MRegisterInfo.h"
19 #include "llvm/Support/LeakDetector.h"
24 // Global variable holding an array of descriptors for machine instructions.
25 // The actual object needs to be created separately for each target machine.
26 // This variable is initialized and reset by class TargetInstrInfo.
28 // FIXME: This should be a property of the target so that more than one target
29 // at a time can be active...
32 extern const TargetInstrDescriptor
*TargetInstrDescriptors
;
35 /// MachineInstr ctor - This constructor only does a _reserve_ of the operands,
36 /// not a resize for them. It is expected that if you use this that you call
37 /// add* methods below to fill up the operands, instead of the Set methods.
38 /// Eventually, the "resizing" ctors will be phased out.
40 MachineInstr::MachineInstr(short opcode
, unsigned numOperands
)
41 : Opcode(opcode
), parent(0) {
42 Operands
.reserve(numOperands
);
43 // Make sure that we get added to a machine basicblock
44 LeakDetector::addGarbageObject(this);
47 /// MachineInstr ctor - Work exactly the same as the ctor above, except that the
48 /// MachineInstr is created and added to the end of the specified basic block.
50 MachineInstr::MachineInstr(MachineBasicBlock
*MBB
, short opcode
,
52 : Opcode(opcode
), parent(0) {
53 assert(MBB
&& "Cannot use inserting ctor with null basic block!");
54 Operands
.reserve(numOperands
);
55 // Make sure that we get added to a machine basicblock
56 LeakDetector::addGarbageObject(this);
57 MBB
->push_back(this); // Add instruction to end of basic block!
60 /// MachineInstr ctor - Copies MachineInstr arg exactly
62 MachineInstr::MachineInstr(const MachineInstr
&MI
) {
63 Opcode
= MI
.getOpcode();
64 Operands
.reserve(MI
.getNumOperands());
67 for (unsigned i
= 0; i
!= MI
.getNumOperands(); ++i
)
68 Operands
.push_back(MI
.getOperand(i
));
70 // Set parent, next, and prev to null
77 MachineInstr::~MachineInstr() {
78 LeakDetector::removeGarbageObject(this);
81 /// removeFromParent - This method unlinks 'this' from the containing basic
82 /// block, and returns it, but does not delete it.
83 MachineInstr
*MachineInstr::removeFromParent() {
84 assert(getParent() && "Not embedded in a basic block!");
85 getParent()->remove(this);
90 /// OperandComplete - Return true if it's illegal to add a new operand
92 bool MachineInstr::OperandsComplete() const {
93 int NumOperands
= TargetInstrDescriptors
[Opcode
].numOperands
;
94 if ((TargetInstrDescriptors
[Opcode
].Flags
& M_VARIABLE_OPS
) == 0 &&
95 getNumOperands() >= (unsigned)NumOperands
)
96 return true; // Broken: we have all the operands of this instruction!
100 void MachineInstr::dump() const {
101 std::cerr
<< " " << *this;
104 static inline void OutputReg(std::ostream
&os
, unsigned RegNo
,
105 const MRegisterInfo
*MRI
= 0) {
106 if (!RegNo
|| MRegisterInfo::isPhysicalRegister(RegNo
)) {
108 os
<< "%" << MRI
->get(RegNo
).Name
;
110 os
<< "%mreg(" << RegNo
<< ")";
112 os
<< "%reg" << RegNo
;
115 static void print(const MachineOperand
&MO
, std::ostream
&OS
,
116 const TargetMachine
*TM
) {
117 const MRegisterInfo
*MRI
= 0;
119 if (TM
) MRI
= TM
->getRegisterInfo();
121 switch (MO
.getType()) {
122 case MachineOperand::MO_Register
:
123 OutputReg(OS
, MO
.getReg(), MRI
);
125 case MachineOperand::MO_Immediate
:
126 OS
<< MO
.getImmedValue();
128 case MachineOperand::MO_MachineBasicBlock
:
130 << ((Value
*)MO
.getMachineBasicBlock()->getBasicBlock())->getName()
131 << "," << (void*)MO
.getMachineBasicBlock() << ">";
133 case MachineOperand::MO_FrameIndex
:
134 OS
<< "<fi#" << MO
.getFrameIndex() << ">";
136 case MachineOperand::MO_ConstantPoolIndex
:
137 OS
<< "<cp#" << MO
.getConstantPoolIndex() << ">";
139 case MachineOperand::MO_JumpTableIndex
:
140 OS
<< "<jt#" << MO
.getJumpTableIndex() << ">";
142 case MachineOperand::MO_GlobalAddress
:
143 OS
<< "<ga:" << ((Value
*)MO
.getGlobal())->getName();
144 if (MO
.getOffset()) OS
<< "+" << MO
.getOffset();
147 case MachineOperand::MO_ExternalSymbol
:
148 OS
<< "<es:" << MO
.getSymbolName();
149 if (MO
.getOffset()) OS
<< "+" << MO
.getOffset();
153 assert(0 && "Unrecognized operand type");
157 void MachineInstr::print(std::ostream
&OS
, const TargetMachine
*TM
) const {
158 unsigned StartOp
= 0;
160 // Specialize printing if op#0 is definition
161 if (getNumOperands() && getOperand(0).isDef() && !getOperand(0).isUse()) {
162 ::print(getOperand(0), OS
, TM
);
164 ++StartOp
; // Don't print this operand again!
167 // Must check if Target machine is not null because machine BB could not
168 // be attached to a Machine function yet
170 OS
<< TM
->getInstrInfo()->getName(getOpcode());
172 for (unsigned i
= StartOp
, e
= getNumOperands(); i
!= e
; ++i
) {
173 const MachineOperand
& mop
= getOperand(i
);
177 ::print(mop
, OS
, TM
);
189 std::ostream
&llvm::operator<<(std::ostream
&os
, const MachineInstr
&MI
) {
190 // If the instruction is embedded into a basic block, we can find the target
191 // info for the instruction.
192 if (const MachineBasicBlock
*MBB
= MI
.getParent()) {
193 const MachineFunction
*MF
= MBB
->getParent();
195 MI
.print(os
, &MF
->getTarget());
201 // Otherwise, print it out in the "raw" format without symbolic register names
203 os
<< TargetInstrDescriptors
[MI
.getOpcode()].Name
;
205 for (unsigned i
= 0, N
= MI
.getNumOperands(); i
< N
; i
++) {
206 os
<< "\t" << MI
.getOperand(i
);
207 if (MI
.getOperand(i
).isDef())
208 if (MI
.getOperand(i
).isUse())
217 std::ostream
&llvm::operator<<(std::ostream
&OS
, const MachineOperand
&MO
) {
218 switch (MO
.getType()) {
219 case MachineOperand::MO_Register
:
220 OutputReg(OS
, MO
.getReg());
222 case MachineOperand::MO_Immediate
:
223 OS
<< (long)MO
.getImmedValue();
225 case MachineOperand::MO_MachineBasicBlock
:
227 << ((Value
*)MO
.getMachineBasicBlock()->getBasicBlock())->getName()
228 << "@" << (void*)MO
.getMachineBasicBlock() << ">";
230 case MachineOperand::MO_FrameIndex
:
231 OS
<< "<fi#" << MO
.getFrameIndex() << ">";
233 case MachineOperand::MO_ConstantPoolIndex
:
234 OS
<< "<cp#" << MO
.getConstantPoolIndex() << ">";
236 case MachineOperand::MO_JumpTableIndex
:
237 OS
<< "<jt#" << MO
.getJumpTableIndex() << ">";
239 case MachineOperand::MO_GlobalAddress
:
240 OS
<< "<ga:" << ((Value
*)MO
.getGlobal())->getName() << ">";
242 case MachineOperand::MO_ExternalSymbol
:
243 OS
<< "<es:" << MO
.getSymbolName() << ">";
246 assert(0 && "Unrecognized operand type");