xref: /freebsd/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYSubtarget.h (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
1 //===-- CSKYSubtarget.h - Define Subtarget for the CSKY----------*- 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 CSKY specific subclass of TargetSubtargetInfo.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_LIB_TARGET_CSKY_CSKYSUBTARGET_H
14 #define LLVM_LIB_TARGET_CSKY_CSKYSUBTARGET_H
15 
16 #include "CSKYFrameLowering.h"
17 #include "CSKYISelLowering.h"
18 #include "CSKYInstrInfo.h"
19 #include "CSKYRegisterInfo.h"
20 #include "llvm/CodeGen/SelectionDAGTargetInfo.h"
21 #include "llvm/CodeGen/TargetSubtargetInfo.h"
22 #include "llvm/Target/TargetMachine.h"
23 
24 #define GET_SUBTARGETINFO_HEADER
25 #include "CSKYGenSubtargetInfo.inc"
26 
27 namespace llvm {
28 class StringRef;
29 
30 class CSKYSubtarget : public CSKYGenSubtargetInfo {
31   virtual void anchor();
32 
33   CSKYFrameLowering FrameLowering;
34   CSKYInstrInfo InstrInfo;
35   CSKYRegisterInfo RegInfo;
36   CSKYTargetLowering TLInfo;
37   SelectionDAGTargetInfo TSInfo;
38 
39   enum CSKYProcFamilyEnum {
40     Others,
41 
42     CK801,
43     CK802,
44     CK803,
45     CK803S,
46     CK804,
47     CK805,
48     CK807,
49     CK810,
50     CK810V,
51     CK860,
52     CK860V
53   };
54 
55   /// CSKYProcFamily - CSKY processor family: CK801, CK802, and others.
56   CSKYProcFamilyEnum CSKYProcFamily = Others;
57 
58   bool UseHardFloat;
59   bool UseHardFloatABI;
60   bool HasFPUv2SingleFloat;
61   bool HasFPUv2DoubleFloat;
62   bool HasFPUv3HalfWord;
63   bool HasFPUv3HalfFloat;
64   bool HasFPUv3SingleFloat;
65   bool HasFPUv3DoubleFloat;
66   bool HasFdivdu;
67   bool HasFLOATE1;
68   bool HasFLOAT1E2;
69   bool HasFLOAT1E3;
70   bool HasFLOAT3E4;
71   bool HasFLOAT7E60;
72   bool HasBTST16;
73   bool HasExtendLrw;
74   bool HasTrust;
75   bool HasJAVA;
76   bool HasCache;
77   bool HasNVIC;
78   bool HasDSP;
79   bool HasDSP1E2;
80   bool HasDSPE60;
81   bool HasDSPV2;
82   bool HasDSP_Silan;
83   bool HasDoloop;
84   bool HasHardwareDivide;
85   bool HasHighRegisters;
86   bool HasVDSPV2;
87   bool HasVDSP2E3;
88   bool HasVDSP2E60F;
89   bool ReadTPHard;
90   bool HasVDSPV1_128;
91   bool UseCCRT;
92   bool DumpConstPool;
93   bool EnableInterruptAttribute;
94   bool HasPushPop;
95   bool HasSTM;
96   bool SmartMode;
97   bool EnableStackSize;
98 
99   bool HasE1;
100   bool HasE2;
101   bool Has2E3;
102   bool HasMP;
103   bool Has3E3r1;
104   bool Has3r1E3r2;
105   bool Has3r2E3r3;
106   bool Has3E7;
107   bool HasMP1E2;
108   bool Has7E10;
109   bool Has10E60;
110 
111 public:
112   CSKYSubtarget(const Triple &TT, StringRef CPU, StringRef TuneCPU,
113                 StringRef FS, const TargetMachine &TM);
114 
getFrameLowering()115   const CSKYFrameLowering *getFrameLowering() const override {
116     return &FrameLowering;
117   }
getInstrInfo()118   const CSKYInstrInfo *getInstrInfo() const override { return &InstrInfo; }
getRegisterInfo()119   const CSKYRegisterInfo *getRegisterInfo() const override { return &RegInfo; }
getTargetLowering()120   const CSKYTargetLowering *getTargetLowering() const override {
121     return &TLInfo;
122   }
getSelectionDAGInfo()123   const SelectionDAGTargetInfo *getSelectionDAGInfo() const override {
124     return &TSInfo;
125   }
126 
127   /// Initializes using the passed in CPU and feature strings so that we can
128   /// use initializer lists for subtarget initialization.
129   CSKYSubtarget &initializeSubtargetDependencies(const Triple &TT,
130                                                  StringRef CPU,
131                                                  StringRef TuneCPU,
132                                                  StringRef FS);
133 
134   // Generated by inc file
135   void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS);
136 
137   bool useHardFloatABI() const;
useHardFloat()138   bool useHardFloat() const { return UseHardFloat; }
hasFPUv2SingleFloat()139   bool hasFPUv2SingleFloat() const { return HasFPUv2SingleFloat; }
hasFPUv2DoubleFloat()140   bool hasFPUv2DoubleFloat() const { return HasFPUv2DoubleFloat; }
hasFPUv2()141   bool hasFPUv2() const { return HasFPUv2SingleFloat || HasFPUv2DoubleFloat; }
hasFPUv3HalfWord()142   bool hasFPUv3HalfWord() const { return HasFPUv3HalfWord; }
hasFPUv3HalfFloat()143   bool hasFPUv3HalfFloat() const { return HasFPUv3HalfFloat; }
hasFPUv3SingleFloat()144   bool hasFPUv3SingleFloat() const { return HasFPUv3SingleFloat; }
hasFPUv3DoubleFloat()145   bool hasFPUv3DoubleFloat() const { return HasFPUv3DoubleFloat; }
hasFPUv3()146   bool hasFPUv3() const {
147     return HasFPUv3HalfFloat || HasFPUv3SingleFloat || HasFPUv3DoubleFloat;
148   }
hasAnyFloatExt()149   bool hasAnyFloatExt() const { return hasFPUv2() || hasFPUv3(); };
hasFdivdu()150   bool hasFdivdu() const { return HasFdivdu; }
hasFLOATE1()151   bool hasFLOATE1() const { return HasFLOATE1; }
hasFLOAT1E2()152   bool hasFLOAT1E2() const { return HasFLOAT1E2; }
hasFLOAT1E3()153   bool hasFLOAT1E3() const { return HasFLOAT1E3; }
hasFLOAT3E4()154   bool hasFLOAT3E4() const { return HasFLOAT3E4; }
hasFLOAT7E60()155   bool hasFLOAT7E60() const { return HasFLOAT7E60; }
hasExtendLrw()156   bool hasExtendLrw() const { return HasExtendLrw; }
hasBTST16()157   bool hasBTST16() const { return HasBTST16; }
hasTrust()158   bool hasTrust() const { return HasTrust; }
hasJAVA()159   bool hasJAVA() const { return HasJAVA; }
hasCache()160   bool hasCache() const { return HasCache; }
hasNVIC()161   bool hasNVIC() const { return HasNVIC; }
hasDSP()162   bool hasDSP() const { return HasDSP; }
hasDSP1E2()163   bool hasDSP1E2() const { return HasDSP1E2; }
hasDSPE60()164   bool hasDSPE60() const { return HasDSPE60; }
hasDSPV2()165   bool hasDSPV2() const { return HasDSPV2; }
hasDSP_Silan()166   bool hasDSP_Silan() const { return HasDSP_Silan; }
hasDoloop()167   bool hasDoloop() const { return HasDoloop; }
hasHighRegisters()168   bool hasHighRegisters() const { return HasHighRegisters; }
hasVDSPV2()169   bool hasVDSPV2() const { return HasVDSPV2; }
hasVDSPV2_FLOAT()170   bool hasVDSPV2_FLOAT() const { return HasVDSPV2 && UseHardFloat; }
hasVDSPV2_HALF()171   bool hasVDSPV2_HALF() const {
172     return HasVDSPV2 && UseHardFloat && HasFPUv3HalfFloat;
173   }
hasVDSP2E3()174   bool hasVDSP2E3() const { return HasVDSP2E3; }
hasVDSP2E60F()175   bool hasVDSP2E60F() const { return HasVDSP2E60F; }
readTPHard()176   bool readTPHard() const { return ReadTPHard; }
hasVDSPV1_128()177   bool hasVDSPV1_128() const { return HasVDSPV1_128; }
useCCRT()178   bool useCCRT() const { return UseCCRT; }
dumpConstPool()179   bool dumpConstPool() const { return DumpConstPool; }
enableInterruptAttribute()180   bool enableInterruptAttribute() const { return EnableInterruptAttribute; }
hasPushPop()181   bool hasPushPop() const { return HasPushPop; }
hasSTM()182   bool hasSTM() const { return HasSTM; }
smartMode()183   bool smartMode() const { return SmartMode; }
enableStackSize()184   bool enableStackSize() const { return EnableStackSize; }
185 
hasE1()186   bool hasE1() const { return HasE1; }
hasE2()187   bool hasE2() const { return HasE2; }
has2E3()188   bool has2E3() const { return Has2E3; }
has3r1E3r2()189   bool has3r1E3r2() const { return Has3r1E3r2; }
has3r2E3r3()190   bool has3r2E3r3() const { return Has3r2E3r3; }
has3E3r1()191   bool has3E3r1() const { return Has3E3r1; }
has3E7()192   bool has3E7() const { return Has3E7; }
hasMP()193   bool hasMP() const { return HasMP; }
hasMP1E2()194   bool hasMP1E2() const { return HasMP1E2; }
has7E10()195   bool has7E10() const { return Has7E10; }
has10E60()196   bool has10E60() const { return Has10E60; }
197 
isCK801()198   bool isCK801() const { return CSKYProcFamily == CK801; }
isCK802()199   bool isCK802() const { return CSKYProcFamily == CK802; }
isCK803()200   bool isCK803() const { return CSKYProcFamily == CK803; }
isCK803S()201   bool isCK803S() const { return CSKYProcFamily == CK803S; }
isCK804()202   bool isCK804() const { return CSKYProcFamily == CK804; }
isCK805()203   bool isCK805() const { return CSKYProcFamily == CK805; }
isCK807()204   bool isCK807() const { return CSKYProcFamily == CK807; }
isCK810()205   bool isCK810() const { return CSKYProcFamily == CK810; }
isCK810V()206   bool isCK810V() const { return CSKYProcFamily == CK810V; }
isCK860()207   bool isCK860() const { return CSKYProcFamily == CK860; }
isCK860V()208   bool isCK860V() const { return CSKYProcFamily == CK860V; }
209 
210   const unsigned XLen = 32;
211 };
212 } // namespace llvm
213 
214 #endif // LLVM_LIB_TARGET_CSKY_CSKYSUBTARGET_H
215