blob: 118afd48c9f62ebffa7fbba25bdc98615206c750 [file] [log] [blame]
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001//===-- TargetInstrInfo.cpp - Target Instruction Information --------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner081ce942007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Dan Gohmanf17a25c2007-07-18 16:29:46 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the TargetInstrInfo class.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm/Target/TargetInstrInfo.h"
Chris Lattner621c44d2009-08-22 20:48:53 +000015#include "llvm/MC/MCAsmInfo.h"
Evan Cheng9a374df2010-09-09 18:18:55 +000016#include "llvm/Target/TargetInstrItineraries.h"
Evan Cheng8058d702009-05-05 00:30:09 +000017#include "llvm/Target/TargetRegisterInfo.h"
Chris Lattner1a6ef242009-08-02 04:58:19 +000018#include "llvm/Support/ErrorHandling.h"
Dan Gohmanf17a25c2007-07-18 16:29:46 +000019using namespace llvm;
20
Chris Lattner5f1fdb32009-08-02 05:20:37 +000021//===----------------------------------------------------------------------===//
22// TargetOperandInfo
23//===----------------------------------------------------------------------===//
24
25/// getRegClass - Get the register class for the operand, handling resolution
26/// of "symbolic" pointer register classes etc. If this is not a register
27/// operand, this returns null.
28const TargetRegisterClass *
29TargetOperandInfo::getRegClass(const TargetRegisterInfo *TRI) const {
30 if (isLookupPtrRegClass())
31 return TRI->getPointerRegClass(RegClass);
Dan Gohman05bf7d12010-06-18 18:13:55 +000032 // Instructions like INSERT_SUBREG do not have fixed register classes.
33 if (RegClass < 0)
34 return 0;
35 // Otherwise just look it up normally.
Chris Lattner5f1fdb32009-08-02 05:20:37 +000036 return TRI->getRegClass(RegClass);
37}
38
39//===----------------------------------------------------------------------===//
40// TargetInstrInfo
41//===----------------------------------------------------------------------===//
42
Chris Lattner5b930372008-01-07 07:27:27 +000043TargetInstrInfo::TargetInstrInfo(const TargetInstrDesc* Desc,
Dan Gohmanf17a25c2007-07-18 16:29:46 +000044 unsigned numOpcodes)
Chris Lattner5b930372008-01-07 07:27:27 +000045 : Descriptors(Desc), NumOpcodes(numOpcodes) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +000046}
47
48TargetInstrInfo::~TargetInstrInfo() {
49}
50
Evan Cheng9a374df2010-09-09 18:18:55 +000051unsigned
52TargetInstrInfo::getNumMicroOps(const MachineInstr *MI,
53 const InstrItineraryData &ItinData) const {
54 if (ItinData.isEmpty())
55 return 1;
56
57 unsigned Class = MI->getDesc().getSchedClass();
58 unsigned UOps = ItinData.Itineratries[Class].NumMicroOps;
59 if (UOps)
60 return UOps;
61
62 // The # of u-ops is dynamically determined. The specific target should
63 // override this function to return the right number.
64 return 1;
65}
66
Chris Lattner1a6ef242009-08-02 04:58:19 +000067/// insertNoop - Insert a noop into the instruction stream at the specified
68/// point.
69void TargetInstrInfo::insertNoop(MachineBasicBlock &MBB,
70 MachineBasicBlock::iterator MI) const {
71 llvm_unreachable("Target didn't implement insertNoop!");
72}
73
74
Dan Gohmanf17a25c2007-07-18 16:29:46 +000075bool TargetInstrInfo::isUnpredicatedTerminator(const MachineInstr *MI) const {
Chris Lattner5b930372008-01-07 07:27:27 +000076 const TargetInstrDesc &TID = MI->getDesc();
77 if (!TID.isTerminator()) return false;
Chris Lattner62327602008-01-07 01:56:04 +000078
79 // Conditional branch is a special case.
Chris Lattner5b930372008-01-07 07:27:27 +000080 if (TID.isBranch() && !TID.isBarrier())
Chris Lattner62327602008-01-07 01:56:04 +000081 return true;
Chris Lattner5b930372008-01-07 07:27:27 +000082 if (!TID.isPredicable())
Chris Lattner62327602008-01-07 01:56:04 +000083 return true;
84 return !isPredicated(MI);
Dan Gohmanf17a25c2007-07-18 16:29:46 +000085}
Evan Cheng8058d702009-05-05 00:30:09 +000086
Chris Lattner6a66b292009-07-29 21:10:12 +000087
Chris Lattner5f1fdb32009-08-02 05:20:37 +000088/// Measure the specified inline asm to determine an approximation of its
89/// length.
90/// Comments (which run till the next SeparatorChar or newline) do not
91/// count as an instruction.
92/// Any other non-whitespace text is considered an instruction, with
93/// multiple instructions separated by SeparatorChar or newlines.
94/// Variable-length instructions are not handled here; this function
95/// may be overloaded in the target code to do that.
96unsigned TargetInstrInfo::getInlineAsmLength(const char *Str,
Chris Lattnera5ef4d32009-08-22 21:43:10 +000097 const MCAsmInfo &MAI) const {
Chris Lattner5f1fdb32009-08-02 05:20:37 +000098
99
100 // Count the number of instructions in the asm.
101 bool atInsnStart = true;
102 unsigned Length = 0;
103 for (; *Str; ++Str) {
Chris Lattnera5ef4d32009-08-22 21:43:10 +0000104 if (*Str == '\n' || *Str == MAI.getSeparatorChar())
Chris Lattner5f1fdb32009-08-02 05:20:37 +0000105 atInsnStart = true;
106 if (atInsnStart && !isspace(*Str)) {
Chris Lattnera5ef4d32009-08-22 21:43:10 +0000107 Length += MAI.getMaxInstLength();
Chris Lattner5f1fdb32009-08-02 05:20:37 +0000108 atInsnStart = false;
109 }
Chris Lattnera5ef4d32009-08-22 21:43:10 +0000110 if (atInsnStart && strncmp(Str, MAI.getCommentString(),
111 strlen(MAI.getCommentString())) == 0)
Chris Lattner5f1fdb32009-08-02 05:20:37 +0000112 atInsnStart = false;
113 }
114
115 return Length;
116}