OpenASIP 2.2
Loading...
Searching...
No Matches
TCEInstrInfo.hh
Go to the documentation of this file.
1/*
2 Copyright (c) 2002-2009 Tampere University.
3
4 This file is part of TTA-Based Codesign Environment (TCE).
5
6 Permission is hereby granted, free of charge, to any person obtaining a
7 copy of this software and associated documentation files (the "Software"),
8 to deal in the Software without restriction, including without limitation
9 the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 and/or sell copies of the Software, and to permit persons to whom the
11 Software is furnished to do so, subject to the following conditions:
12
13 The above copyright notice and this permission notice shall be included in
14 all copies or substantial portions of the Software.
15
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 DEALINGS IN THE SOFTWARE.
23 */
24/**
25 * @file TCEInstrInfo.h
26 *
27 * Declaration of TCEInstrInfo class.
28 *
29 * @author Veli-Pekka Jaaskelainen 2007 (vjaaskel-no.spam-cs.tut.fi)
30 * @author Heikki Kultala 2011 (heikki.kultala-no.spam-tut.fi)
31 */
32
33#ifndef TCE_INSTR_INFO_H
34#define TCE_INSTR_INFO_H
35
36#include <llvm/Support/ErrorHandling.h>
37#include "tce_config.h"
38#include <llvm/CodeGen/TargetInstrInfo.h>
39#include "TCERegisterInfo.hh"
40
41#define GET_INSTRINFO_HEADER
42#include "TCEGenInstrInfo.inc"
43
44namespace llvm {
45
46 class TCETargetMachine;
47 class TCETargetMachinePlugin;
48 /** !! Important !! *************
49 * ON EVERY LLVM UPDATE CHECK THESE INTERFACES VERY CAREFULLY
50 * FROM include/llvm/Target/TargetInstrInfo.h
51 *
52 * Compiler doesn warn or give error if parameter lists are changed.
53 * Many times also base class implementation works, but does not do
54 * very good job.
55 */
56
57 class TCEInstrInfo : public TCEGenInstrInfo {
58 public:
60 virtual ~TCEInstrInfo();
61
62 const InstrItineraryData *
64 return &InstrItins;
65 }
66
67 virtual const TargetRegisterInfo& getRegisterInfo() const {
68 return ri_;
69 }
70
71 virtual unsigned insertBranch(
72 MachineBasicBlock &MBB, MachineBasicBlock *TBB,
73 MachineBasicBlock *FBB,
74 ArrayRef<MachineOperand> Cond,
75 const DebugLoc& DL
76 , int *BytesAdded = nullptr) const override;
77 unsigned removeBranch(
78 MachineBasicBlock &mbb,
79 int *BytesRemoved = nullptr) const override;
80
81 virtual bool BlockHasNoFallThrough(
82 const MachineBasicBlock &MBB) const;
83
84 virtual void storeRegToStackSlot(
85 MachineBasicBlock& mbb,
86 MachineBasicBlock::iterator mbbi,
87 unsigned srcReg, bool isKill, int frameIndex,
88 #ifdef LLVM_OLDER_THAN_16
89 const TargetRegisterClass* rc) const;
90 #else
91 const TargetRegisterClass* rc, Register vReg) const;
92 #endif
93
94 // changed in LLVM 2.8:
95 virtual void storeRegToStackSlot(
96 MachineBasicBlock& mbb,
97 MachineBasicBlock::iterator mbbi,
98 Register srcReg, bool isKill, int frameIndex,
99 #ifdef LLVM_OLDER_THAN_16
100 const TargetRegisterClass* rc, const TargetRegisterInfo*) const override {
101 storeRegToStackSlot(mbb, mbbi, srcReg, isKill, frameIndex, rc);
102 #else
103 const TargetRegisterClass* rc, const TargetRegisterInfo*,
104 Register vReg) const override {
105 storeRegToStackSlot(mbb, mbbi, srcReg, isKill, frameIndex, rc, 0);
106 #endif
107 }
108
109 // TODO: this is in the form of the llvm 2.7 version of this method.
110 // this is however called by the newer version of the function.
111 virtual void loadRegFromStackSlot(
112 MachineBasicBlock& mbb,
113 MachineBasicBlock::iterator mbbi,
114 unsigned destReg, int frameIndex,
115 #ifdef LLVM_OLDER_THAN_16
116 const TargetRegisterClass* rc) const;
117 #else
118 const TargetRegisterClass* rc, Register vReg) const;
119 #endif
120
121 // changed in LLVM 2.8:
123 MachineBasicBlock& mbb,
124 MachineBasicBlock::iterator mbbi,
125 Register destReg, int frameIndex,
126 #ifdef LLVM_OLDER_THAN_16
127 const TargetRegisterClass* rc, const TargetRegisterInfo*) const override {
128 loadRegFromStackSlot(mbb, mbbi, destReg, frameIndex, rc);
129 #else
130 const TargetRegisterClass* rc, const TargetRegisterInfo*,
131 Register vReg) const override {
132 loadRegFromStackSlot(mbb, mbbi, destReg, frameIndex, rc, 0);
133 #endif
134 }
135
136 virtual void copyPhysReg(
137 MachineBasicBlock& mbb,
138 MachineBasicBlock::iterator mbbi,
139 const DebugLoc& DL,
140 MCRegister destReg, MCRegister srcReg,
141 bool KillSrc) const override;
142
143 virtual bool reverseBranchCondition(
144 llvm::SmallVectorImpl<llvm::MachineOperand>& cond) const override;
145
146 virtual bool analyzeBranch(
147 MachineBasicBlock &MBB, MachineBasicBlock *&TBB,
148 MachineBasicBlock *&FBB,
149 llvm::SmallVectorImpl<llvm::MachineOperand>& cond,
150 bool allowModify = false)
151 const override;
152
153 /// Analyze loop L, which must be a single-basic-block loop, and if
154 /// the conditions can be understood enough produce a
155 /// PipelinerLoopInfo object.
156 std::unique_ptr<PipelinerLoopInfo> analyzeLoopForPipelining(
157 MachineBasicBlock *LoopBB) const override;
158
159 virtual bool isPredicated(const MachineInstr& MI) const override;
160 virtual bool isPredicable(const MachineInstr& MI) const override;
161
162 virtual bool PredicateInstruction(
163 MachineInstr &mi,
164 ArrayRef<MachineOperand> cond) const override;
165
166 virtual bool ClobbersPredicate(
167 MachineInstr& MI, std::vector<MachineOperand>& Pred,
168 bool SkipDead) const override;
169
170 virtual bool
172 ArrayRef<MachineOperand> Pred1,
173 ArrayRef<MachineOperand> Pred2) const override {
174 return false;
175 }
176
177 virtual void insertCCBranch(
178 MachineBasicBlock& mbb,
179 MachineBasicBlock& tbb,
180 ArrayRef<MachineOperand> cond,
181 const DebugLoc& dl) const;
182
183 virtual bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumCycles,
184 unsigned ExtraPredCycles,
185 BranchProbability Probability) const override;
186
187 virtual bool isProfitableToIfCvt(MachineBasicBlock &TMBB,
188 unsigned NumTCycles, unsigned ExtraTCycles,
189 MachineBasicBlock &FMBB,
190 unsigned NumFCycles, unsigned ExtraFCycles,
191 BranchProbability Probability) const override;
192
193 /**
194 * Return opcode for pointer adjustment and new offset.
195 *
196 * Returns opcode available or suitable for pointer adjustment with
197 * constant offset value.
198 *
199 * @param offset The offset for the pointer.
200 * @return (opcode, new offset) tuple.
201 */
202 std::tuple<int, int> getPointerAdjustment(int offset) const;
203
204 virtual DFAPacketizer *CreateTargetScheduleState(
205 const TargetSubtargetInfo &) const override;
206
207private:
208 InstrItineraryData InstrItins;
209
210 int getMatchingCondBranchOpcode(int Opc, bool inverted) const;
211
214
215 // implementation generated to Backend.inc from TDGen.cc
217 MachineBasicBlock& mbb,
218 MachineBasicBlock::iterator mbbi,
219 const DebugLoc& DL,
220 MCRegister destReg, MCRegister srcReg,
221 bool killSrc) const;
222 };
223}
224
225#endif
int getMatchingCondBranchOpcode(int Opc, bool inverted) const
const TCERegisterInfo ri_
virtual void storeRegToStackSlot(MachineBasicBlock &mbb, MachineBasicBlock::iterator mbbi, unsigned srcReg, bool isKill, int frameIndex, const TargetRegisterClass *rc, Register vReg) const
virtual bool isPredicated(const MachineInstr &MI) const override
unsigned removeBranch(MachineBasicBlock &mbb, int *BytesRemoved=nullptr) const override
virtual bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, llvm::SmallVectorImpl< llvm::MachineOperand > &cond, bool allowModify=false) const override
virtual void copyPhysReg(MachineBasicBlock &mbb, MachineBasicBlock::iterator mbbi, const DebugLoc &DL, MCRegister destReg, MCRegister srcReg, bool KillSrc) const override
std::tuple< int, int > getPointerAdjustment(int offset) const
virtual bool reverseBranchCondition(llvm::SmallVectorImpl< llvm::MachineOperand > &cond) const override
virtual bool SubsumesPredicate(ArrayRef< MachineOperand > Pred1, ArrayRef< MachineOperand > Pred2) const override
virtual ~TCEInstrInfo()
virtual bool isPredicable(const MachineInstr &MI) const override
virtual bool BlockHasNoFallThrough(const MachineBasicBlock &MBB) const
const InstrItineraryData * getInstrItineraryData() const
virtual void loadRegFromStackSlot(MachineBasicBlock &mbb, MachineBasicBlock::iterator mbbi, unsigned destReg, int frameIndex, const TargetRegisterClass *rc, Register vReg) const
virtual DFAPacketizer * CreateTargetScheduleState(const TargetSubtargetInfo &) const override
virtual bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumCycles, unsigned ExtraPredCycles, BranchProbability Probability) const override
virtual void storeRegToStackSlot(MachineBasicBlock &mbb, MachineBasicBlock::iterator mbbi, Register srcReg, bool isKill, int frameIndex, const TargetRegisterClass *rc, const TargetRegisterInfo *, Register vReg) const override
bool copyPhysVectorReg(MachineBasicBlock &mbb, MachineBasicBlock::iterator mbbi, const DebugLoc &DL, MCRegister destReg, MCRegister srcReg, bool killSrc) const
InstrItineraryData InstrItins
virtual bool PredicateInstruction(MachineInstr &mi, ArrayRef< MachineOperand > cond) const override
virtual const TargetRegisterInfo & getRegisterInfo() const
virtual void loadRegFromStackSlot(MachineBasicBlock &mbb, MachineBasicBlock::iterator mbbi, Register destReg, int frameIndex, const TargetRegisterClass *rc, const TargetRegisterInfo *, Register vReg) const override
virtual unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded=nullptr) const override
const TCETargetMachinePlugin * plugin_
virtual void insertCCBranch(MachineBasicBlock &mbb, MachineBasicBlock &tbb, ArrayRef< MachineOperand > cond, const DebugLoc &dl) const
std::unique_ptr< PipelinerLoopInfo > analyzeLoopForPipelining(MachineBasicBlock *LoopBB) const override
Analyze loop L, which must be a single-basic-block loop, and if the conditions can be understood enou...
virtual bool ClobbersPredicate(MachineInstr &MI, std::vector< MachineOperand > &Pred, bool SkipDead) const override