blob: c3e6f4326e0671ca44013a0a25de68202f8e0e0c [file] [log] [blame]
Chris Lattner08084142003-01-13 00:26:36 +00001//===-- TargetInstrInfo.cpp - Target Instruction Information --------------===//
Misha Brukmanf976c852005-04-21 22:55:34 +00002//
John Criswellb576c942003-10-20 19:43:21 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Misha Brukmanf976c852005-04-21 22:55:34 +00007//
John Criswellb576c942003-10-20 19:43:21 +00008//===----------------------------------------------------------------------===//
Chris Lattner93fa7052002-10-28 23:55:33 +00009//
Chris Lattner167b10c2005-01-19 06:53:34 +000010// This file implements the TargetInstrInfo class.
Chris Lattner93fa7052002-10-28 23:55:33 +000011//
12//===----------------------------------------------------------------------===//
13
Chris Lattner3501fea2003-01-14 22:00:31 +000014#include "llvm/Target/TargetInstrInfo.h"
Chris Lattnerd90183d2009-08-02 05:20:37 +000015#include "llvm/Target/TargetAsmInfo.h"
Evan Chengd923fc62009-05-05 00:30:09 +000016#include "llvm/Target/TargetRegisterInfo.h"
Chris Lattnerb6bbfebd2009-08-02 04:58:19 +000017#include "llvm/Support/ErrorHandling.h"
Chris Lattner167b10c2005-01-19 06:53:34 +000018using namespace llvm;
Chris Lattner93fa7052002-10-28 23:55:33 +000019
Chris Lattnerd90183d2009-08-02 05:20:37 +000020//===----------------------------------------------------------------------===//
21// TargetOperandInfo
22//===----------------------------------------------------------------------===//
23
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.
27const TargetRegisterClass *
28TargetOperandInfo::getRegClass(const TargetRegisterInfo *TRI) const {
29 if (isLookupPtrRegClass())
30 return TRI->getPointerRegClass(RegClass);
31 return TRI->getRegClass(RegClass);
32}
33
34//===----------------------------------------------------------------------===//
35// TargetInstrInfo
36//===----------------------------------------------------------------------===//
37
Chris Lattner749c6f62008-01-07 07:27:27 +000038TargetInstrInfo::TargetInstrInfo(const TargetInstrDesc* Desc,
Misha Brukman7847fca2005-04-22 17:54:37 +000039 unsigned numOpcodes)
Chris Lattner749c6f62008-01-07 07:27:27 +000040 : Descriptors(Desc), NumOpcodes(numOpcodes) {
Chris Lattner93fa7052002-10-28 23:55:33 +000041}
42
Chris Lattner08084142003-01-13 00:26:36 +000043TargetInstrInfo::~TargetInstrInfo() {
Chris Lattner93fa7052002-10-28 23:55:33 +000044}
45
Chris Lattnerb6bbfebd2009-08-02 04:58:19 +000046/// insertNoop - Insert a noop into the instruction stream at the specified
47/// point.
48void TargetInstrInfo::insertNoop(MachineBasicBlock &MBB,
49 MachineBasicBlock::iterator MI) const {
50 llvm_unreachable("Target didn't implement insertNoop!");
51}
52
53
Evan Chengbfd2ec42007-06-08 21:59:56 +000054bool TargetInstrInfo::isUnpredicatedTerminator(const MachineInstr *MI) const {
Chris Lattner749c6f62008-01-07 07:27:27 +000055 const TargetInstrDesc &TID = MI->getDesc();
56 if (!TID.isTerminator()) return false;
Chris Lattner69244302008-01-07 01:56:04 +000057
58 // Conditional branch is a special case.
Chris Lattner749c6f62008-01-07 07:27:27 +000059 if (TID.isBranch() && !TID.isBarrier())
Chris Lattner69244302008-01-07 01:56:04 +000060 return true;
Chris Lattner749c6f62008-01-07 07:27:27 +000061 if (!TID.isPredicable())
Chris Lattner69244302008-01-07 01:56:04 +000062 return true;
63 return !isPredicated(MI);
Evan Chengbfd2ec42007-06-08 21:59:56 +000064}
Evan Chengd923fc62009-05-05 00:30:09 +000065
Chris Lattnercb778a82009-07-29 21:10:12 +000066
Chris Lattnerd90183d2009-08-02 05:20:37 +000067/// Measure the specified inline asm to determine an approximation of its
68/// length.
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.
75unsigned TargetInstrInfo::getInlineAsmLength(const char *Str,
76 const TargetAsmInfo &TAI) const {
77
78
79 // Count the number of instructions in the asm.
80 bool atInsnStart = true;
81 unsigned Length = 0;
82 for (; *Str; ++Str) {
83 if (*Str == '\n' || *Str == TAI.getSeparatorChar())
84 atInsnStart = true;
85 if (atInsnStart && !isspace(*Str)) {
86 Length += TAI.getMaxInstLength();
87 atInsnStart = false;
88 }
89 if (atInsnStart && strncmp(Str, TAI.getCommentString(),
90 strlen(TAI.getCommentString())) == 0)
91 atInsnStart = false;
92 }
93
94 return Length;
95}