LLVM 22.0.0git
MipsSubtarget.h
Go to the documentation of this file.
1//===-- MipsSubtarget.h - Define Subtarget for the Mips ---------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file declares the Mips specific subclass of TargetSubtargetInfo.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_LIB_TARGET_MIPS_MIPSSUBTARGET_H
14#define LLVM_LIB_TARGET_MIPS_MIPSSUBTARGET_H
15
17#include "MipsFrameLowering.h"
18#include "MipsISelLowering.h"
19#include "MipsInstrInfo.h"
25#include "llvm/IR/DataLayout.h"
28
29#define GET_SUBTARGETINFO_HEADER
30#include "MipsGenSubtargetInfo.inc"
31
32namespace llvm {
33class StringRef;
34
36 CB_Never, ///< The policy 'never' may in some circumstances or for some
37 ///< ISAs not be absolutely adhered to.
38 CB_Optimal, ///< Optimal is the default and will produce compact branches
39 ///< when appropriate.
40 CB_Always ///< 'always' may in some circumstances may not be
41 ///< absolutely adhered to, there may not be a corresponding
42 ///< compact form of a branch.
43};
44
45class MipsTargetMachine;
46
48 virtual void anchor();
49
50 enum MipsArchEnum {
51 MipsDefault,
52 Mips1, Mips2, Mips32, Mips32r2, Mips32r3, Mips32r5, Mips32r6, Mips32Max,
53 Mips3, Mips4, Mips5, Mips64, Mips64r2, Mips64r3, Mips64r5, Mips64r6
54 };
55
56 enum class CPU { Others, P5600, I6400, I6500 };
57
58 // Used to avoid printing dsp warnings multiple times.
59 static bool DspWarningPrinted;
60
61 // Used to avoid printing msa warnings multiple times.
62 static bool MSAWarningPrinted;
63
64 // Used to avoid printing crc warnings multiple times.
65 static bool CRCWarningPrinted;
66
67 // Used to avoid printing ginv warnings multiple times.
68 static bool GINVWarningPrinted;
69
70 // Used to avoid printing Mips1 warnings multiple times.
71 static bool MIPS1WarningPrinted;
72
73 // Used to avoid printing virt warnings multiple times.
74 static bool VirtWarningPrinted;
75
76 // Mips architecture version
77 MipsArchEnum MipsArchVersion;
78
79 // Processor implementation
80 CPU ProcImpl = CPU::Others;
81
82 // IsLittle - The target is Little Endian
83 bool IsLittle;
84
85 // IsSoftFloat - The target does not support any floating point instructions.
86 bool IsSoftFloat;
87
88 // IsSingleFloat - The target only supports single precision float
89 // point operations. This enable the target to use all 32 32-bit
90 // floating point registers instead of only using even ones.
91 bool IsSingleFloat;
92
93 // IsFPXX - MIPS O32 modeless ABI.
94 bool IsFPXX;
95
96 // NoABICalls - Disable SVR4-style position-independent code.
97 bool NoABICalls;
98
99 // Abs2008 - Use IEEE 754-2008 abs.fmt instruction.
100 bool Abs2008;
101
102 // IsFP64bit - The target processor has 64-bit floating point registers.
103 bool IsFP64bit;
104
105 /// Are odd single-precision registers permitted?
106 /// This corresponds to -modd-spreg and -mno-odd-spreg
107 bool UseOddSPReg;
108
109 // IsNan2008 - IEEE 754-2008 NaN encoding.
110 bool IsNaN2008bit;
111
112 // IsGP64bit - General-purpose registers are 64 bits wide
113 bool IsGP64bit;
114
115 // IsPTR64bit - Pointers are 64 bit wide
116 bool IsPTR64bit;
117
118 // HasVFPU - Processor has a vector floating point unit.
119 bool HasVFPU;
120
121 // CPU supports cnMIPS (Cavium Networks Octeon CPU).
122 bool HasCnMips;
123
124 // CPU supports cnMIPSP (Cavium Networks Octeon+ CPU).
125 bool HasCnMipsP;
126
127 // isLinux - Target system is Linux. Is false we consider ELFOS for now.
128 bool IsLinux;
129
130 // UseSmallSection - Small section is used.
131 bool UseSmallSection;
132
133 /// Features related to the presence of specific instructions.
134
135 // HasMips3_32 - The subset of MIPS-III instructions added to MIPS32
136 bool HasMips3_32;
137
138 // HasMips3_32r2 - The subset of MIPS-III instructions added to MIPS32r2
139 bool HasMips3_32r2;
140
141 // HasMips4_32 - Has the subset of MIPS-IV present in MIPS32
142 bool HasMips4_32;
143
144 // HasMips4_32r2 - Has the subset of MIPS-IV present in MIPS32r2
145 bool HasMips4_32r2;
146
147 // HasMips5_32r2 - Has the subset of MIPS-V present in MIPS32r2
148 bool HasMips5_32r2;
149
150 // InMips16 -- can process Mips16 instructions
151 bool InMips16Mode;
152
153 // Mips16 hard float
154 bool InMips16HardFloat;
155
156 // InMicroMips -- can process MicroMips instructions
157 bool InMicroMipsMode;
158
159 // HasDSP, HasDSPR2, HasDSPR3 -- supports DSP ASE.
160 bool HasDSP, HasDSPR2, HasDSPR3;
161
162 // Has3D -- Supports Mips3D ASE.
163 bool Has3D;
164
165 // Allow mixed Mips16 and Mips32 in one source file
166 bool AllowMixed16_32;
167
168 // Optimize for space by compiling all functions as Mips 16 unless
169 // it needs floating point. Functions needing floating point are
170 // compiled as Mips32
171 bool Os16;
172
173 // HasMSA -- supports MSA ASE.
174 bool HasMSA;
175
176 // UseTCCInDIV -- Enables the use of trapping in the assembler.
177 bool UseTCCInDIV;
178
179 // Sym32 -- On Mips64 symbols are 32 bits.
180 bool HasSym32;
181
182 // HasEVA -- supports EVA ASE.
183 bool HasEVA;
184
185 // nomadd4 - disables generation of 4-operand madd.s, madd.d and
186 // related instructions.
187 bool DisableMadd4;
188
189 // HasMT -- support MT ASE.
190 bool HasMT;
191
192 // HasCRC -- supports R6 CRC ASE
193 bool HasCRC;
194
195 // HasVirt -- supports Virtualization ASE
196 bool HasVirt;
197
198 // HasGINV -- supports R6 Global INValidate ASE
199 bool HasGINV;
200
201 // Use hazard variants of the jump register instructions for indirect
202 // function calls and jump tables.
203 bool UseIndirectJumpsHazard;
204
205 // Disable use of the `jal` instruction.
206 bool UseLongCalls = false;
207
208 // Assume 32-bit GOT.
209 bool UseXGOT = false;
210
211 // Disable unaligned load store for r6.
212 bool StrictAlign;
213
214 // Use compact branch instructions for R6.
215 bool UseCompactBranches = true;
216
217 /// The minimum alignment known to hold of the stack frame on
218 /// entry to the function and which must be maintained by every function.
219 Align stackAlignment;
220
221 /// The overridden stack alignment.
222 MaybeAlign StackAlignOverride;
223
224 InstrItineraryData InstrItins;
225
226 // We can override the determination of whether we are in mips16 mode
227 // as from the command line
228 enum {NoOverride, Mips16Override, NoMips16Override} OverrideMode;
229
230 const MipsTargetMachine &TM;
231
232 Triple TargetTriple;
233
234 std::unique_ptr<const SelectionDAGTargetInfo> TSInfo;
235 std::unique_ptr<const MipsInstrInfo> InstrInfo;
236 std::unique_ptr<const MipsFrameLowering> FrameLowering;
237 std::unique_ptr<const MipsTargetLowering> TLInfo;
238
239public:
240 bool isPositionIndependent() const;
241 /// This overrides the PostRAScheduler bit in the SchedModel for each CPU.
242 bool enablePostRAScheduler() const override;
243 void getCriticalPathRCs(RegClassVector &CriticalPathRCs) const override;
245
246 bool isABI_N64() const;
247 bool isABI_N32() const;
248 bool isABI_O32() const;
249 const MipsABIInfo &getABI() const;
250 bool isABI_FPXX() const { return isABI_O32() && IsFPXX; }
251
252 /// This constructor initializes the data members to match that
253 /// of the specified triple.
254 MipsSubtarget(const Triple &TT, StringRef CPU, StringRef FS, bool little,
255 const MipsTargetMachine &TM, MaybeAlign StackAlignOverride);
256
257 ~MipsSubtarget() override;
258
259 /// ParseSubtargetFeatures - Parses features string setting specified
260 /// subtarget options. Definition of function is auto generated by tblgen.
262
263 static const RTLIB::LibcallImpl HardFloatLibCalls[34];
264
265 bool hasMips1() const { return MipsArchVersion >= Mips1; }
266 bool hasMips2() const { return MipsArchVersion >= Mips2; }
267 bool hasMips3() const { return MipsArchVersion >= Mips3; }
268 bool hasMips4() const { return MipsArchVersion >= Mips4; }
269 bool hasMips5() const { return MipsArchVersion >= Mips5; }
270 bool hasMips4_32() const { return HasMips4_32; }
271 bool hasMips4_32r2() const { return HasMips4_32r2; }
272 bool hasMips32() const {
273 return (MipsArchVersion >= Mips32 && MipsArchVersion < Mips32Max) ||
274 hasMips64();
275 }
276 bool hasMips32r2() const {
277 return (MipsArchVersion >= Mips32r2 && MipsArchVersion < Mips32Max) ||
278 hasMips64r2();
279 }
280 bool hasMips32r3() const {
281 return (MipsArchVersion >= Mips32r3 && MipsArchVersion < Mips32Max) ||
282 hasMips64r2();
283 }
284 bool hasMips32r5() const {
285 return (MipsArchVersion >= Mips32r5 && MipsArchVersion < Mips32Max) ||
286 hasMips64r5();
287 }
288 bool hasMips32r6() const {
289 return (MipsArchVersion >= Mips32r6 && MipsArchVersion < Mips32Max) ||
290 hasMips64r6();
291 }
292 bool hasMips64() const { return MipsArchVersion >= Mips64; }
293 bool hasMips64r2() const { return MipsArchVersion >= Mips64r2; }
294 bool hasMips64r3() const { return MipsArchVersion >= Mips64r3; }
295 bool hasMips64r5() const { return MipsArchVersion >= Mips64r5; }
296 bool hasMips64r6() const { return MipsArchVersion >= Mips64r6; }
297
298 bool hasCnMips() const { return HasCnMips; }
299 bool hasCnMipsP() const { return HasCnMipsP; }
300
301 bool isLittle() const { return IsLittle; }
302 bool isABICalls() const { return !NoABICalls; }
303 bool isFPXX() const { return IsFPXX; }
304 bool isFP64bit() const { return IsFP64bit; }
305 bool useOddSPReg() const { return UseOddSPReg; }
306 bool noOddSPReg() const { return !UseOddSPReg; }
307 bool isNaN2008() const { return IsNaN2008bit; }
308 bool inAbs2008Mode() const { return Abs2008; }
309 bool isGP64bit() const { return IsGP64bit; }
310 bool isGP32bit() const { return !IsGP64bit; }
311 unsigned getGPRSizeInBytes() const { return isGP64bit() ? 8 : 4; }
312 bool isPTR64bit() const { return IsPTR64bit; }
313 bool isPTR32bit() const { return !IsPTR64bit; }
314 bool hasSym32() const {
315 return (HasSym32 && isABI_N64()) || isABI_N32() || isABI_O32();
316 }
317 bool isSingleFloat() const { return IsSingleFloat; }
318 bool isTargetCOFF() const { return TargetTriple.isOSBinFormatCOFF(); }
319 bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); }
320 bool hasVFPU() const { return HasVFPU; }
321 bool inMips16Mode() const { return InMips16Mode; }
322 bool inMips16ModeDefault() const {
323 return InMips16Mode;
324 }
325 // Hard float for mips16 means essentially to compile as soft float
326 // but to use a runtime library for soft float that is written with
327 // native mips32 floating point instructions (those runtime routines
328 // run in mips32 hard float mode).
329 bool inMips16HardFloat() const {
330 return inMips16Mode() && InMips16HardFloat;
331 }
332 bool inMicroMipsMode() const { return InMicroMipsMode && !InMips16Mode; }
333 bool inMicroMips32r6Mode() const {
334 return inMicroMipsMode() && hasMips32r6();
335 }
336 bool hasDSP() const { return HasDSP; }
337 bool hasDSPR2() const { return HasDSPR2; }
338 bool hasDSPR3() const { return HasDSPR3; }
339 bool has3D() const { return Has3D; }
340 bool hasMSA() const { return HasMSA; }
341 bool disableMadd4() const { return DisableMadd4; }
342 bool hasEVA() const { return HasEVA; }
343 bool hasMT() const { return HasMT; }
344 bool hasCRC() const { return HasCRC; }
345 bool hasVirt() const { return HasVirt; }
346 bool hasGINV() const { return HasGINV; }
348 return UseIndirectJumpsHazard && hasMips32r2();
349 }
350 bool useSmallSection() const { return UseSmallSection; }
351
352 bool useCompactBranches() const {
353 return UseCompactBranches && hasMips32r6();
354 }
355
356 bool hasStandardEncoding() const { return !InMips16Mode && !InMicroMipsMode; }
357
358 bool useSoftFloat() const { return IsSoftFloat; }
359
360 bool useLongCalls() const { return UseLongCalls; }
361
362 bool useXGOT() const { return UseXGOT; }
363
364 bool enableLongBranchPass() const {
366 }
367
368 /// Features related to the presence of specific instructions.
369 bool hasExtractInsert() const { return !inMips16Mode() && hasMips32r2(); }
370 bool hasMTHC1() const { return hasMips32r2(); }
371
372 bool allowMixed16_32() const { return inMips16ModeDefault() |
373 AllowMixed16_32; }
374
375 bool os16() const { return Os16; }
376
377 bool isTargetWindows() const { return TargetTriple.isOSWindows(); }
378
379 bool isXRaySupported() const override { return true; }
380
381 // for now constant islands are on for the whole compilation unit but we only
382 // really use them if in addition we are in mips16 mode
383 static bool useConstantIslands();
384
385 Align getStackAlignment() const { return stackAlignment; }
386
387 // Grab relocation model
389
391 const TargetMachine &TM);
392
393 /// Does the system support unaligned memory access.
394 ///
395 /// MIPS32r6/MIPS64r6 require full unaligned access support but does not
396 /// specify which component of the system provides it. Hardware, software, and
397 /// hybrid implementations are all valid.
399 return hasMips32r6() && !StrictAlign;
400 }
401
402 // Set helper classes
405
406 const SelectionDAGTargetInfo *getSelectionDAGInfo() const override;
407
408 const MipsInstrInfo *getInstrInfo() const override { return InstrInfo.get(); }
409 const TargetFrameLowering *getFrameLowering() const override {
410 return FrameLowering.get();
411 }
412 const MipsRegisterInfo *getRegisterInfo() const override {
413 return &InstrInfo->getRegisterInfo();
414 }
415 const MipsTargetLowering *getTargetLowering() const override {
416 return TLInfo.get();
417 }
419 return &InstrItins;
420 }
421
423
424protected:
425 // GlobalISel related APIs.
426 std::unique_ptr<CallLowering> CallLoweringInfo;
427 std::unique_ptr<LegalizerInfo> Legalizer;
428 std::unique_ptr<RegisterBankInfo> RegBankInfo;
429 std::unique_ptr<InstructionSelector> InstSelector;
430
431public:
432 const CallLowering *getCallLowering() const override;
433 const LegalizerInfo *getLegalizerInfo() const override;
434 const RegisterBankInfo *getRegBankInfo() const override;
436};
437} // End llvm namespace
438
439#endif
Analysis containing CSE Info
Definition CSEInfo.cpp:27
This file describes how to lower LLVM calls to machine code calls.
Interface for Targets to specify which operations they can successfully select and how the others sho...
Itinerary data supplied by a subtarget to be used by a target.
Tracks which library functions to use for a particular subtarget.
bool hasMips32r6() const
void initLibcallLoweringInfo(LibcallLoweringInfo &Info) const override
bool isXRaySupported() const override
const LegalizerInfo * getLegalizerInfo() const override
static bool useConstantIslands()
bool hasMips4() const
bool hasMips64r2() const
bool isFP64bit() const
bool isTargetELF() const
bool enablePostRAScheduler() const override
This overrides the PostRAScheduler bit in the SchedModel for each CPU.
bool isLittle() const
bool inMicroMipsMode() const
bool hasMips32r5() const
bool hasMips4_32() const
bool isGP32bit() const
std::unique_ptr< InstructionSelector > InstSelector
bool hasMips32r3() const
bool useSoftFloat() const
bool hasDSPR2() const
const MipsInstrInfo * getInstrInfo() const override
bool useIndirectJumpsHazard() const
bool hasMips64r6() const
bool isNaN2008() const
bool useOddSPReg() const
MipsSubtarget & initializeSubtargetDependencies(StringRef CPU, StringRef FS, const TargetMachine &TM)
const CallLowering * getCallLowering() const override
std::unique_ptr< RegisterBankInfo > RegBankInfo
bool allowMixed16_32() const
bool inMips16Mode() const
bool hasMips5() const
bool hasMips64() const
~MipsSubtarget() override
bool hasMips32() const
bool useCompactBranches() const
bool isPTR32bit() const
bool hasSym32() const
bool isABI_FPXX() const
bool inAbs2008Mode() const
std::unique_ptr< CallLowering > CallLoweringInfo
void setHelperClassesMips16()
bool noOddSPReg() const
const MipsRegisterInfo * getRegisterInfo() const override
bool isABICalls() const
void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS)
ParseSubtargetFeatures - Parses features string setting specified subtarget options.
bool disableMadd4() const
const RegisterBankInfo * getRegBankInfo() const override
bool hasCnMips() const
static const RTLIB::LibcallImpl HardFloatLibCalls[34]
bool systemSupportsUnalignedAccess() const
Does the system support unaligned memory access.
bool isPositionIndependent() const
bool isGP64bit() const
bool hasExtractInsert() const
Features related to the presence of specific instructions.
bool enableLongBranchPass() const
void setHelperClassesMipsSE()
bool inMicroMips32r6Mode() const
bool hasMips32r2() const
bool isTargetCOFF() const
bool hasMips4_32r2() const
Align getStackAlignment() const
bool isTargetWindows() const
const InstrItineraryData * getInstrItineraryData() const override
InstructionSelector * getInstructionSelector() const override
const SelectionDAGTargetInfo * getSelectionDAGInfo() const override
bool isSingleFloat() const
std::unique_ptr< LegalizerInfo > Legalizer
bool inMips16ModeDefault() const
bool useLongCalls() const
unsigned getGPRSizeInBytes() const
bool useSmallSection() const
const MipsTargetLowering * getTargetLowering() const override
bool inMips16HardFloat() const
bool hasCnMipsP() const
bool hasMTHC1() const
bool hasStandardEncoding() const
void getCriticalPathRCs(RegClassVector &CriticalPathRCs) const override
bool hasMips64r5() const
MipsSubtarget(const Triple &TT, StringRef CPU, StringRef FS, bool little, const MipsTargetMachine &TM, MaybeAlign StackAlignOverride)
This constructor initializes the data members to match that of the specified triple.
bool hasMips3() const
bool hasMips1() const
Reloc::Model getRelocationModel() const
bool isPTR64bit() const
bool hasMips2() const
bool hasMips64r3() const
bool hasDSPR3() const
CodeGenOptLevel getOptLevelToEnablePostRAScheduler() const override
const MipsABIInfo & getABI() const
const TargetFrameLowering * getFrameLowering() const override
Holds all the information related to register banks.
Targets can subclass this to parameterize the SelectionDAG lowering and instruction selection process...
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
Information about stack frame layout on the target.
Primary interface to the complete machine description for the target machine.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:47
This is an optimization pass for GlobalISel generic memory operations.
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:82
CompactBranchPolicy
@ CB_Never
The policy 'never' may in some circumstances or for some ISAs not be absolutely adhered to.
@ CB_Always
'always' may in some circumstances may not be absolutely adhered to, there may not be a corresponding...
@ CB_Optimal
Optimal is the default and will produce compact branches when appropriate.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition Alignment.h:106