1 //===-- RISCVSubtarget.h - Define Subtarget for the RISC-V ------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This file declares the RISC-V specific subclass of TargetSubtargetInfo.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_LIB_TARGET_RISCV_RISCVSUBTARGET_H
14 #define LLVM_LIB_TARGET_RISCV_RISCVSUBTARGET_H
16 #include "MCTargetDesc/RISCVBaseInfo.h"
17 #include "RISCVFrameLowering.h"
18 #include "RISCVISelLowering.h"
19 #include "RISCVInstrInfo.h"
20 #include "llvm/CodeGen/GlobalISel/CallLowering.h"
21 #include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
22 #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
23 #include "llvm/CodeGen/RegisterBankInfo.h"
24 #include "llvm/CodeGen/SelectionDAGTargetInfo.h"
25 #include "llvm/CodeGen/TargetSubtargetInfo.h"
26 #include "llvm/IR/DataLayout.h"
27 #include "llvm/Target/TargetMachine.h"
30 #define GET_RISCV_MACRO_FUSION_PRED_DECL
31 #include "RISCVGenMacroFusion.inc"
33 #define GET_SUBTARGETINFO_HEADER
34 #include "RISCVGenSubtargetInfo.inc"
39 namespace RISCVTuneInfoTable
{
41 struct RISCVTuneInfo
{
43 uint8_t PrefFunctionAlignment
;
44 uint8_t PrefLoopAlignment
;
46 // Information needed by LoopDataPrefetch.
47 uint16_t CacheLineSize
;
48 uint16_t PrefetchDistance
;
49 uint16_t MinPrefetchStride
;
50 unsigned MaxPrefetchIterationsAhead
;
52 unsigned MinimumJumpTableEntries
;
55 #define GET_RISCVTuneInfoTable_DECL
56 #include "RISCVGenSearchableTables.inc"
57 } // namespace RISCVTuneInfoTable
59 class RISCVSubtarget
: public RISCVGenSubtargetInfo
{
62 enum RISCVProcFamilyEnum
: uint8_t {
69 virtual void anchor();
71 RISCVProcFamilyEnum RISCVProcFamily
= Others
;
73 #define GET_SUBTARGETINFO_MACRO(ATTRIBUTE, DEFAULT, GETTER) \
74 bool ATTRIBUTE = DEFAULT;
75 #include "RISCVGenSubtargetInfo.inc"
78 unsigned RVVVectorBitsMin
;
79 unsigned RVVVectorBitsMax
;
80 uint8_t MaxInterleaveFactor
= 2;
81 RISCVABI::ABI TargetABI
= RISCVABI::ABI_Unknown
;
82 std::bitset
<RISCV::NUM_TARGET_REGS
> UserReservedRegister
;
83 const RISCVTuneInfoTable::RISCVTuneInfo
*TuneInfo
;
85 RISCVFrameLowering FrameLowering
;
86 RISCVInstrInfo InstrInfo
;
87 RISCVRegisterInfo RegInfo
;
88 RISCVTargetLowering TLInfo
;
89 SelectionDAGTargetInfo TSInfo
;
91 /// Initializes using the passed in CPU and feature strings so that we can
92 /// use initializer lists for subtarget initialization.
93 RISCVSubtarget
&initializeSubtargetDependencies(const Triple
&TT
,
100 // Initializes the data members to match that of the specified triple.
101 RISCVSubtarget(const Triple
&TT
, StringRef CPU
, StringRef TuneCPU
,
102 StringRef FS
, StringRef ABIName
, unsigned RVVVectorBitsMin
,
103 unsigned RVVVectorLMULMax
, const TargetMachine
&TM
);
105 // Parses features string setting specified subtarget options. The
106 // definition of this function is auto-generated by tblgen.
107 void ParseSubtargetFeatures(StringRef CPU
, StringRef TuneCPU
, StringRef FS
);
109 const RISCVFrameLowering
*getFrameLowering() const override
{
110 return &FrameLowering
;
112 const RISCVInstrInfo
*getInstrInfo() const override
{ return &InstrInfo
; }
113 const RISCVRegisterInfo
*getRegisterInfo() const override
{
116 const RISCVTargetLowering
*getTargetLowering() const override
{
119 const SelectionDAGTargetInfo
*getSelectionDAGInfo() const override
{
122 bool enableMachineScheduler() const override
{ return true; }
124 bool enablePostRAScheduler() const override
{
125 return getSchedModel().PostRAScheduler
|| UsePostRAScheduler
;
128 Align
getPrefFunctionAlignment() const {
129 return Align(TuneInfo
->PrefFunctionAlignment
);
131 Align
getPrefLoopAlignment() const {
132 return Align(TuneInfo
->PrefLoopAlignment
);
135 /// Returns RISC-V processor family.
136 /// Avoid this function! CPU specifics should be kept local to this class
137 /// and preferably modeled with SubtargetFeatures or properties in
138 /// initializeProperties().
139 RISCVProcFamilyEnum
getProcFamily() const { return RISCVProcFamily
; }
141 #define GET_SUBTARGETINFO_MACRO(ATTRIBUTE, DEFAULT, GETTER) \
142 bool GETTER() const { return ATTRIBUTE; }
143 #include "RISCVGenSubtargetInfo.inc"
145 bool hasStdExtCOrZca() const { return HasStdExtC
|| HasStdExtZca
; }
146 bool hasStdExtZvl() const { return ZvlLen
!= 0; }
147 bool hasStdExtFOrZfinx() const { return HasStdExtF
|| HasStdExtZfinx
; }
148 bool hasStdExtDOrZdinx() const { return HasStdExtD
|| HasStdExtZdinx
; }
149 bool hasStdExtZfhOrZhinx() const { return HasStdExtZfh
|| HasStdExtZhinx
; }
150 bool hasStdExtZfhminOrZhinxmin() const {
151 return HasStdExtZfhmin
|| HasStdExtZhinxmin
;
153 bool hasHalfFPLoadStoreMove() const {
154 return HasStdExtZfhmin
|| HasStdExtZfbfmin
;
157 bool hasConditionalMoveFusion() const {
158 // Do we support fusing a branch+mv or branch+c.mv as a conditional move.
159 return (hasConditionalCompressedMoveFusion() && hasStdExtCOrZca()) ||
160 hasShortForwardBranchOpt();
163 bool is64Bit() const { return IsRV64
; }
164 MVT
getXLenVT() const {
165 return is64Bit() ? MVT::i64
: MVT::i32
;
167 unsigned getXLen() const {
168 return is64Bit() ? 64 : 32;
170 unsigned getFLen() const {
179 unsigned getELen() const {
180 assert(hasVInstructions() && "Expected V extension");
181 return hasVInstructionsI64() ? 64 : 32;
183 unsigned getRealMinVLen() const {
184 unsigned VLen
= getMinRVVVectorSizeInBits();
185 return VLen
== 0 ? ZvlLen
: VLen
;
187 unsigned getRealMaxVLen() const {
188 unsigned VLen
= getMaxRVVVectorSizeInBits();
189 return VLen
== 0 ? 65536 : VLen
;
191 RISCVABI::ABI
getTargetABI() const { return TargetABI
; }
192 bool isSoftFPABI() const {
193 return TargetABI
== RISCVABI::ABI_LP64
||
194 TargetABI
== RISCVABI::ABI_ILP32
||
195 TargetABI
== RISCVABI::ABI_ILP32E
;
197 bool isRegisterReservedByUser(Register i
) const {
198 assert(i
< RISCV::NUM_TARGET_REGS
&& "Register out of range");
199 return UserReservedRegister
[i
];
202 // Vector codegen related methods.
203 bool hasVInstructions() const { return HasStdExtZve32x
; }
204 bool hasVInstructionsI64() const { return HasStdExtZve64x
; }
205 bool hasVInstructionsF16Minimal() const { return HasStdExtZvfhmin
; }
206 bool hasVInstructionsF16() const { return HasStdExtZvfh
; }
207 bool hasVInstructionsBF16() const { return HasStdExtZvfbfmin
; }
208 bool hasVInstructionsF32() const { return HasStdExtZve32f
; }
209 bool hasVInstructionsF64() const { return HasStdExtZve64d
; }
210 // F16 and F64 both require F32.
211 bool hasVInstructionsAnyF() const { return hasVInstructionsF32(); }
212 bool hasVInstructionsFullMultiply() const { return HasStdExtV
; }
213 unsigned getMaxInterleaveFactor() const {
214 return hasVInstructions() ? MaxInterleaveFactor
: 1;
217 // Returns VLEN divided by DLEN. Where DLEN is the datapath width of the
218 // vector hardware implementation which may be less than VLEN.
219 unsigned getDLenFactor() const {
226 // GlobalISel related APIs.
227 std::unique_ptr
<CallLowering
> CallLoweringInfo
;
228 std::unique_ptr
<InstructionSelector
> InstSelector
;
229 std::unique_ptr
<LegalizerInfo
> Legalizer
;
230 std::unique_ptr
<RegisterBankInfo
> RegBankInfo
;
232 // Return the known range for the bit length of RVV data registers as set
233 // at the command line. A value of 0 means nothing is known about that particular
234 // limit beyond what's implied by the architecture.
235 // NOTE: Please use getRealMinVLen and getRealMaxVLen instead!
236 unsigned getMaxRVVVectorSizeInBits() const;
237 unsigned getMinRVVVectorSizeInBits() const;
240 const CallLowering
*getCallLowering() const override
;
241 InstructionSelector
*getInstructionSelector() const override
;
242 const LegalizerInfo
*getLegalizerInfo() const override
;
243 const RegisterBankInfo
*getRegBankInfo() const override
;
245 bool isTargetFuchsia() const { return getTargetTriple().isOSFuchsia(); }
247 bool useConstantPoolForLargeInts() const;
249 // Maximum cost used for building integers, integers will be put into constant
251 unsigned getMaxBuildIntsCost() const;
253 unsigned getMaxLMULForFixedLengthVectors() const;
254 bool useRVVForFixedLengthVectors() const;
256 bool enableSubRegLiveness() const override
;
258 void getPostRAMutations(std::vector
<std::unique_ptr
<ScheduleDAGMutation
>>
259 &Mutations
) const override
;
261 bool useAA() const override
;
263 unsigned getCacheLineSize() const override
{
264 return TuneInfo
->CacheLineSize
;
266 unsigned getPrefetchDistance() const override
{
267 return TuneInfo
->PrefetchDistance
;
269 unsigned getMinPrefetchStride(unsigned NumMemAccesses
,
270 unsigned NumStridedMemAccesses
,
271 unsigned NumPrefetches
,
272 bool HasCall
) const override
{
273 return TuneInfo
->MinPrefetchStride
;
275 unsigned getMaxPrefetchIterationsAhead() const override
{
276 return TuneInfo
->MaxPrefetchIterationsAhead
;
279 unsigned getMinimumJumpTableEntries() const;
281 } // End llvm namespace