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 115 const CSKYFrameLowering *getFrameLowering() const override { 116 return &FrameLowering; 117 } 118 const CSKYInstrInfo *getInstrInfo() const override { return &InstrInfo; } 119 const CSKYRegisterInfo *getRegisterInfo() const override { return &RegInfo; } 120 const CSKYTargetLowering *getTargetLowering() const override { 121 return &TLInfo; 122 } 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; 138 bool useHardFloat() const { return UseHardFloat; } 139 bool hasFPUv2SingleFloat() const { return HasFPUv2SingleFloat; } 140 bool hasFPUv2DoubleFloat() const { return HasFPUv2DoubleFloat; } 141 bool hasFPUv2() const { return HasFPUv2SingleFloat || HasFPUv2DoubleFloat; } 142 bool hasFPUv3HalfWord() const { return HasFPUv3HalfWord; } 143 bool hasFPUv3HalfFloat() const { return HasFPUv3HalfFloat; } 144 bool hasFPUv3SingleFloat() const { return HasFPUv3SingleFloat; } 145 bool hasFPUv3DoubleFloat() const { return HasFPUv3DoubleFloat; } 146 bool hasFPUv3() const { 147 return HasFPUv3HalfFloat || HasFPUv3SingleFloat || HasFPUv3DoubleFloat; 148 } 149 bool hasAnyFloatExt() const { return hasFPUv2() || hasFPUv3(); }; 150 bool hasFdivdu() const { return HasFdivdu; } 151 bool hasFLOATE1() const { return HasFLOATE1; } 152 bool hasFLOAT1E2() const { return HasFLOAT1E2; } 153 bool hasFLOAT1E3() const { return HasFLOAT1E3; } 154 bool hasFLOAT3E4() const { return HasFLOAT3E4; } 155 bool hasFLOAT7E60() const { return HasFLOAT7E60; } 156 bool hasExtendLrw() const { return HasExtendLrw; } 157 bool hasBTST16() const { return HasBTST16; } 158 bool hasTrust() const { return HasTrust; } 159 bool hasJAVA() const { return HasJAVA; } 160 bool hasCache() const { return HasCache; } 161 bool hasNVIC() const { return HasNVIC; } 162 bool hasDSP() const { return HasDSP; } 163 bool hasDSP1E2() const { return HasDSP1E2; } 164 bool hasDSPE60() const { return HasDSPE60; } 165 bool hasDSPV2() const { return HasDSPV2; } 166 bool hasDSP_Silan() const { return HasDSP_Silan; } 167 bool hasDoloop() const { return HasDoloop; } 168 bool hasHighRegisters() const { return HasHighRegisters; } 169 bool hasVDSPV2() const { return HasVDSPV2; } 170 bool hasVDSPV2_FLOAT() const { return HasVDSPV2 && UseHardFloat; } 171 bool hasVDSPV2_HALF() const { 172 return HasVDSPV2 && UseHardFloat && HasFPUv3HalfFloat; 173 } 174 bool hasVDSP2E3() const { return HasVDSP2E3; } 175 bool hasVDSP2E60F() const { return HasVDSP2E60F; } 176 bool readTPHard() const { return ReadTPHard; } 177 bool hasVDSPV1_128() const { return HasVDSPV1_128; } 178 bool useCCRT() const { return UseCCRT; } 179 bool dumpConstPool() const { return DumpConstPool; } 180 bool enableInterruptAttribute() const { return EnableInterruptAttribute; } 181 bool hasPushPop() const { return HasPushPop; } 182 bool hasSTM() const { return HasSTM; } 183 bool smartMode() const { return SmartMode; } 184 bool enableStackSize() const { return EnableStackSize; } 185 186 bool hasE1() const { return HasE1; } 187 bool hasE2() const { return HasE2; } 188 bool has2E3() const { return Has2E3; } 189 bool has3r1E3r2() const { return Has3r1E3r2; } 190 bool has3r2E3r3() const { return Has3r2E3r3; } 191 bool has3E3r1() const { return Has3E3r1; } 192 bool has3E7() const { return Has3E7; } 193 bool hasMP() const { return HasMP; } 194 bool hasMP1E2() const { return HasMP1E2; } 195 bool has7E10() const { return Has7E10; } 196 bool has10E60() const { return Has10E60; } 197 198 bool isCK801() const { return CSKYProcFamily == CK801; } 199 bool isCK802() const { return CSKYProcFamily == CK802; } 200 bool isCK803() const { return CSKYProcFamily == CK803; } 201 bool isCK803S() const { return CSKYProcFamily == CK803S; } 202 bool isCK804() const { return CSKYProcFamily == CK804; } 203 bool isCK805() const { return CSKYProcFamily == CK805; } 204 bool isCK807() const { return CSKYProcFamily == CK807; } 205 bool isCK810() const { return CSKYProcFamily == CK810; } 206 bool isCK810V() const { return CSKYProcFamily == CK810V; } 207 bool isCK860() const { return CSKYProcFamily == CK860; } 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