| //===-- CSKYSubtarget.h - Define Subtarget for the CSKY----------*- C++ -*-===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file declares the CSKY specific subclass of TargetSubtargetInfo. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_LIB_TARGET_CSKY_CSKYSUBTARGET_H | |
| #define LLVM_LIB_TARGET_CSKY_CSKYSUBTARGET_H | |
| #include "CSKYFrameLowering.h" | |
| #include "CSKYISelLowering.h" | |
| #include "CSKYInstrInfo.h" | |
| #include "CSKYRegisterInfo.h" | |
| #include "llvm/CodeGen/SelectionDAGTargetInfo.h" | |
| #include "llvm/CodeGen/TargetSubtargetInfo.h" | |
| #include "llvm/Target/TargetMachine.h" | |
| #define GET_SUBTARGETINFO_HEADER | |
| #include "CSKYGenSubtargetInfo.inc" | |
| namespace llvm { | |
| class StringRef; | |
| class CSKYSubtarget : public CSKYGenSubtargetInfo { | |
| virtual void anchor(); | |
| CSKYFrameLowering FrameLowering; | |
| CSKYInstrInfo InstrInfo; | |
| CSKYRegisterInfo RegInfo; | |
| CSKYTargetLowering TLInfo; | |
| SelectionDAGTargetInfo TSInfo; | |
| enum CSKYProcFamilyEnum { | |
| Others, | |
| CK801, | |
| CK802, | |
| CK803, | |
| CK803S, | |
| CK804, | |
| CK805, | |
| CK807, | |
| CK810, | |
| CK810V, | |
| CK860, | |
| CK860V | |
| }; | |
| /// CSKYProcFamily - CSKY processor family: CK801, CK802, and others. | |
| CSKYProcFamilyEnum CSKYProcFamily = Others; | |
| bool UseHardFloat; | |
| bool UseHardFloatABI; | |
| bool HasFPUv2SingleFloat; | |
| bool HasFPUv2DoubleFloat; | |
| bool HasFPUv3HalfWord; | |
| bool HasFPUv3HalfFloat; | |
| bool HasFPUv3SingleFloat; | |
| bool HasFPUv3DoubleFloat; | |
| bool HasFdivdu; | |
| bool HasFLOATE1; | |
| bool HasFLOAT1E2; | |
| bool HasFLOAT1E3; | |
| bool HasFLOAT3E4; | |
| bool HasFLOAT7E60; | |
| bool HasBTST16; | |
| bool HasExtendLrw; | |
| bool HasTrust; | |
| bool HasJAVA; | |
| bool HasCache; | |
| bool HasNVIC; | |
| bool HasDSP; | |
| bool HasDSP1E2; | |
| bool HasDSPE60; | |
| bool HasDSPV2; | |
| bool HasDSP_Silan; | |
| bool HasDoloop; | |
| bool HasHardwareDivide; | |
| bool HasHighRegisters; | |
| bool HasVDSPV2; | |
| bool HasVDSP2E3; | |
| bool HasVDSP2E60F; | |
| bool ReadTPHard; | |
| bool HasVDSPV1_128; | |
| bool UseCCRT; | |
| bool DumpConstPool; | |
| bool EnableInterruptAttribute; | |
| bool HasPushPop; | |
| bool HasSTM; | |
| bool SmartMode; | |
| bool EnableStackSize; | |
| bool HasE1; | |
| bool HasE2; | |
| bool Has2E3; | |
| bool HasMP; | |
| bool Has3E3r1; | |
| bool Has3r1E3r2; | |
| bool Has3r2E3r3; | |
| bool Has3E7; | |
| bool HasMP1E2; | |
| bool Has7E10; | |
| bool Has10E60; | |
| public: | |
| CSKYSubtarget(const Triple &TT, StringRef CPU, StringRef TuneCPU, | |
| StringRef FS, const TargetMachine &TM); | |
| const CSKYFrameLowering *getFrameLowering() const override { | |
| return &FrameLowering; | |
| } | |
| const CSKYInstrInfo *getInstrInfo() const override { return &InstrInfo; } | |
| const CSKYRegisterInfo *getRegisterInfo() const override { return &RegInfo; } | |
| const CSKYTargetLowering *getTargetLowering() const override { | |
| return &TLInfo; | |
| } | |
| const SelectionDAGTargetInfo *getSelectionDAGInfo() const override { | |
| return &TSInfo; | |
| } | |
| /// Initializes using the passed in CPU and feature strings so that we can | |
| /// use initializer lists for subtarget initialization. | |
| CSKYSubtarget &initializeSubtargetDependencies(const Triple &TT, | |
| StringRef CPU, | |
| StringRef TuneCPU, | |
| StringRef FS); | |
| // Generated by inc file | |
| void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS); | |
| bool useHardFloatABI() const; | |
| bool useHardFloat() const { return UseHardFloat; } | |
| bool hasFPUv2SingleFloat() const { return HasFPUv2SingleFloat; } | |
| bool hasFPUv2DoubleFloat() const { return HasFPUv2DoubleFloat; } | |
| bool hasFPUv2() const { return HasFPUv2SingleFloat || HasFPUv2DoubleFloat; } | |
| bool hasFPUv3HalfWord() const { return HasFPUv3HalfWord; } | |
| bool hasFPUv3HalfFloat() const { return HasFPUv3HalfFloat; } | |
| bool hasFPUv3SingleFloat() const { return HasFPUv3SingleFloat; } | |
| bool hasFPUv3DoubleFloat() const { return HasFPUv3DoubleFloat; } | |
| bool hasFPUv3() const { | |
| return HasFPUv3HalfFloat || HasFPUv3SingleFloat || HasFPUv3DoubleFloat; | |
| } | |
| bool hasAnyFloatExt() const { return hasFPUv2() || hasFPUv3(); }; | |
| bool hasFdivdu() const { return HasFdivdu; } | |
| bool hasFLOATE1() const { return HasFLOATE1; } | |
| bool hasFLOAT1E2() const { return HasFLOAT1E2; } | |
| bool hasFLOAT1E3() const { return HasFLOAT1E3; } | |
| bool hasFLOAT3E4() const { return HasFLOAT3E4; } | |
| bool hasFLOAT7E60() const { return HasFLOAT7E60; } | |
| bool hasExtendLrw() const { return HasExtendLrw; } | |
| bool hasBTST16() const { return HasBTST16; } | |
| bool hasTrust() const { return HasTrust; } | |
| bool hasJAVA() const { return HasJAVA; } | |
| bool hasCache() const { return HasCache; } | |
| bool hasNVIC() const { return HasNVIC; } | |
| bool hasDSP() const { return HasDSP; } | |
| bool hasDSP1E2() const { return HasDSP1E2; } | |
| bool hasDSPE60() const { return HasDSPE60; } | |
| bool hasDSPV2() const { return HasDSPV2; } | |
| bool hasDSP_Silan() const { return HasDSP_Silan; } | |
| bool hasDoloop() const { return HasDoloop; } | |
| bool hasHighRegisters() const { return HasHighRegisters; } | |
| bool hasVDSPV2() const { return HasVDSPV2; } | |
| bool hasVDSPV2_FLOAT() const { return HasVDSPV2 && UseHardFloat; } | |
| bool hasVDSPV2_HALF() const { | |
| return HasVDSPV2 && UseHardFloat && HasFPUv3HalfFloat; | |
| } | |
| bool hasVDSP2E3() const { return HasVDSP2E3; } | |
| bool hasVDSP2E60F() const { return HasVDSP2E60F; } | |
| bool readTPHard() const { return ReadTPHard; } | |
| bool hasVDSPV1_128() const { return HasVDSPV1_128; } | |
| bool useCCRT() const { return UseCCRT; } | |
| bool dumpConstPool() const { return DumpConstPool; } | |
| bool enableInterruptAttribute() const { return EnableInterruptAttribute; } | |
| bool hasPushPop() const { return HasPushPop; } | |
| bool hasSTM() const { return HasSTM; } | |
| bool smartMode() const { return SmartMode; } | |
| bool enableStackSize() const { return EnableStackSize; } | |
| bool hasE1() const { return HasE1; } | |
| bool hasE2() const { return HasE2; } | |
| bool has2E3() const { return Has2E3; } | |
| bool has3r1E3r2() const { return Has3r1E3r2; } | |
| bool has3r2E3r3() const { return Has3r2E3r3; } | |
| bool has3E3r1() const { return Has3E3r1; } | |
| bool has3E7() const { return Has3E7; } | |
| bool hasMP() const { return HasMP; } | |
| bool hasMP1E2() const { return HasMP1E2; } | |
| bool has7E10() const { return Has7E10; } | |
| bool has10E60() const { return Has10E60; } | |
| bool isCK801() const { return CSKYProcFamily == CK801; } | |
| bool isCK802() const { return CSKYProcFamily == CK802; } | |
| bool isCK803() const { return CSKYProcFamily == CK803; } | |
| bool isCK803S() const { return CSKYProcFamily == CK803S; } | |
| bool isCK804() const { return CSKYProcFamily == CK804; } | |
| bool isCK805() const { return CSKYProcFamily == CK805; } | |
| bool isCK807() const { return CSKYProcFamily == CK807; } | |
| bool isCK810() const { return CSKYProcFamily == CK810; } | |
| bool isCK810V() const { return CSKYProcFamily == CK810V; } | |
| bool isCK860() const { return CSKYProcFamily == CK860; } | |
| bool isCK860V() const { return CSKYProcFamily == CK860V; } | |
| }; | |
| } // namespace llvm | |
| #endif // LLVM_LIB_TARGET_CSKY_CSKYSUBTARGET_H |