215 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8//9// This file declares the CSKY specific subclass of TargetSubtargetInfo.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_LIB_TARGET_CSKY_CSKYSUBTARGET_H14#define LLVM_LIB_TARGET_CSKY_CSKYSUBTARGET_H15 16#include "CSKYFrameLowering.h"17#include "CSKYISelLowering.h"18#include "CSKYInstrInfo.h"19#include "CSKYRegisterInfo.h"20#include "llvm/CodeGen/TargetSubtargetInfo.h"21#include "llvm/Target/TargetMachine.h"22 23#define GET_SUBTARGETINFO_HEADER24#include "CSKYGenSubtargetInfo.inc"25 26namespace llvm {27class StringRef;28 29class CSKYSubtarget : public CSKYGenSubtargetInfo {30 virtual void anchor();31 32 CSKYFrameLowering FrameLowering;33 CSKYRegisterInfo RegInfo;34 CSKYInstrInfo InstrInfo;35 CSKYTargetLowering TLInfo;36 std::unique_ptr<const SelectionDAGTargetInfo> TSInfo;37 38 enum CSKYProcFamilyEnum {39 Others,40 41 CK801,42 CK802,43 CK803,44 CK803S,45 CK804,46 CK805,47 CK807,48 CK810,49 CK810V,50 CK860,51 CK860V52 };53 54 /// CSKYProcFamily - CSKY processor family: CK801, CK802, and others.55 CSKYProcFamilyEnum CSKYProcFamily = Others;56 57 bool UseHardFloat;58 bool UseHardFloatABI;59 bool HasFPUv2SingleFloat;60 bool HasFPUv2DoubleFloat;61 bool HasFPUv3HalfWord;62 bool HasFPUv3HalfFloat;63 bool HasFPUv3SingleFloat;64 bool HasFPUv3DoubleFloat;65 bool HasFdivdu;66 bool HasFLOATE1;67 bool HasFLOAT1E2;68 bool HasFLOAT1E3;69 bool HasFLOAT3E4;70 bool HasFLOAT7E60;71 bool HasBTST16;72 bool HasExtendLrw;73 bool HasTrust;74 bool HasJAVA;75 bool HasCache;76 bool HasNVIC;77 bool HasDSP;78 bool HasDSP1E2;79 bool HasDSPE60;80 bool HasDSPV2;81 bool HasDSP_Silan;82 bool HasDoloop;83 bool HasHardwareDivide;84 bool HasHighRegisters;85 bool HasVDSPV2;86 bool HasVDSP2E3;87 bool HasVDSP2E60F;88 bool ReadTPHard;89 bool HasVDSPV1_128;90 bool UseCCRT;91 bool DumpConstPool;92 bool EnableInterruptAttribute;93 bool HasPushPop;94 bool HasSTM;95 bool SmartMode;96 bool EnableStackSize;97 98 bool HasE1;99 bool HasE2;100 bool Has2E3;101 bool HasMP;102 bool Has3E3r1;103 bool Has3r1E3r2;104 bool Has3r2E3r3;105 bool Has3E7;106 bool HasMP1E2;107 bool Has7E10;108 bool Has10E60;109 110public:111 CSKYSubtarget(const Triple &TT, StringRef CPU, StringRef TuneCPU,112 StringRef FS, const TargetMachine &TM);113 114 ~CSKYSubtarget() override;115 116 const CSKYFrameLowering *getFrameLowering() const override {117 return &FrameLowering;118 }119 const CSKYInstrInfo *getInstrInfo() const override { return &InstrInfo; }120 const CSKYRegisterInfo *getRegisterInfo() const override { return &RegInfo; }121 const CSKYTargetLowering *getTargetLowering() const override {122 return &TLInfo;123 }124 125 const SelectionDAGTargetInfo *getSelectionDAGInfo() const override;126 127 /// Initializes using the passed in CPU and feature strings so that we can128 /// 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 file135 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 llvm213 214#endif // LLVM_LIB_TARGET_CSKY_CSKYSUBTARGET_H215