1 //===-- TargetInstrInfo.cpp - Target Instruction Information --------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the TargetInstrInfo class.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/Target/TargetInstrInfo.h"
15 #include "llvm/Target/TargetAsmInfo.h"
16 #include "llvm/Target/TargetRegisterInfo.h"
17 #include "llvm/Support/ErrorHandling.h"
20 //===----------------------------------------------------------------------===//
22 //===----------------------------------------------------------------------===//
24 /// getRegClass - Get the register class for the operand, handling resolution
25 /// of "symbolic" pointer register classes etc. If this is not a register
26 /// operand, this returns null.
27 const TargetRegisterClass
*
28 TargetOperandInfo::getRegClass(const TargetRegisterInfo
*TRI
) const {
29 if (isLookupPtrRegClass())
30 return TRI
->getPointerRegClass(RegClass
);
31 return TRI
->getRegClass(RegClass
);
34 //===----------------------------------------------------------------------===//
36 //===----------------------------------------------------------------------===//
38 TargetInstrInfo::TargetInstrInfo(const TargetInstrDesc
* Desc
,
40 : Descriptors(Desc
), NumOpcodes(numOpcodes
) {
43 TargetInstrInfo::~TargetInstrInfo() {
46 /// insertNoop - Insert a noop into the instruction stream at the specified
48 void TargetInstrInfo::insertNoop(MachineBasicBlock
&MBB
,
49 MachineBasicBlock::iterator MI
) const {
50 llvm_unreachable("Target didn't implement insertNoop!");
54 bool TargetInstrInfo::isUnpredicatedTerminator(const MachineInstr
*MI
) const {
55 const TargetInstrDesc
&TID
= MI
->getDesc();
56 if (!TID
.isTerminator()) return false;
58 // Conditional branch is a special case.
59 if (TID
.isBranch() && !TID
.isBarrier())
61 if (!TID
.isPredicable())
63 return !isPredicated(MI
);
67 /// Measure the specified inline asm to determine an approximation of its
69 /// Comments (which run till the next SeparatorChar or newline) do not
70 /// count as an instruction.
71 /// Any other non-whitespace text is considered an instruction, with
72 /// multiple instructions separated by SeparatorChar or newlines.
73 /// Variable-length instructions are not handled here; this function
74 /// may be overloaded in the target code to do that.
75 unsigned TargetInstrInfo::getInlineAsmLength(const char *Str
,
76 const TargetAsmInfo
&TAI
) const {
79 // Count the number of instructions in the asm.
80 bool atInsnStart
= true;
83 if (*Str
== '\n' || *Str
== TAI
.getSeparatorChar())
85 if (atInsnStart
&& !isspace(*Str
)) {
86 Length
+= TAI
.getMaxInstLength();
89 if (atInsnStart
&& strncmp(Str
, TAI
.getCommentString(),
90 strlen(TAI
.getCommentString())) == 0)