diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/CSKY/CSKYSubtarget.h')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Target/CSKY/CSKYSubtarget.h | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYSubtarget.h b/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYSubtarget.h new file mode 100644 index 000000000000..9e7ad00c0a50 --- /dev/null +++ b/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYSubtarget.h @@ -0,0 +1,212 @@ +//===-- 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 |
