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 #include "CSKYSubtarget.h"
14 #include "CSKYSelectionDAGInfo.h"
15 #include "llvm/CodeGen/MachineFrameInfo.h"
16
17 using namespace llvm;
18
19 #define DEBUG_TYPE "csky-subtarget"
20 #define GET_SUBTARGETINFO_TARGET_DESC
21 #define GET_SUBTARGETINFO_CTOR
22 #include "CSKYGenSubtargetInfo.inc"
23
anchor()24 void CSKYSubtarget::anchor() {}
25
initializeSubtargetDependencies(const Triple & TT,StringRef CPUName,StringRef TuneCPUName,StringRef FS)26 CSKYSubtarget &CSKYSubtarget::initializeSubtargetDependencies(
27 const Triple &TT, StringRef CPUName, StringRef TuneCPUName, StringRef FS) {
28
29 if (CPUName.empty())
30 CPUName = "generic";
31 if (TuneCPUName.empty())
32 TuneCPUName = CPUName;
33
34 UseHardFloat = false;
35 UseHardFloatABI = false;
36 HasFPUv2SingleFloat = false;
37 HasFPUv2DoubleFloat = false;
38 HasFPUv3HalfWord = false;
39 HasFPUv3HalfFloat = false;
40 HasFPUv3SingleFloat = false;
41 HasFPUv3DoubleFloat = false;
42 HasFdivdu = false;
43 HasFLOATE1 = false;
44 HasFLOAT1E2 = false;
45 HasFLOAT1E3 = false;
46 HasFLOAT3E4 = false;
47 HasFLOAT7E60 = false;
48 HasExtendLrw = false;
49 HasBTST16 = false;
50 HasTrust = false;
51 HasJAVA = false;
52 HasCache = false;
53 HasNVIC = false;
54 HasDSP = false;
55 HasDSP1E2 = false;
56 HasDSPE60 = false;
57 HasDSPV2 = false;
58 HasDSP_Silan = false;
59 HasDoloop = false;
60 HasHardwareDivide = false;
61 HasHighRegisters = false;
62 HasVDSPV2 = false;
63 HasVDSP2E3 = false;
64 HasVDSP2E60F = false;
65 ReadTPHard = false;
66 HasVDSPV1_128 = false;
67 UseCCRT = false;
68 DumpConstPool = false;
69 EnableInterruptAttribute = false;
70 HasPushPop = false;
71 HasSTM = false;
72 SmartMode = false;
73 EnableStackSize = false;
74
75 HasE1 = false;
76 HasE2 = false;
77 Has2E3 = false;
78 HasMP = false;
79 Has3E3r1 = false;
80 Has3r1E3r2 = false;
81 Has3r2E3r3 = false;
82 Has3E7 = false;
83 HasMP1E2 = false;
84 Has7E10 = false;
85 Has10E60 = false;
86
87 ParseSubtargetFeatures(CPUName, TuneCPUName, FS);
88 return *this;
89 }
90
CSKYSubtarget(const Triple & TT,StringRef CPU,StringRef TuneCPU,StringRef FS,const TargetMachine & TM)91 CSKYSubtarget::CSKYSubtarget(const Triple &TT, StringRef CPU, StringRef TuneCPU,
92 StringRef FS, const TargetMachine &TM)
93 : CSKYGenSubtargetInfo(TT, CPU, TuneCPU, FS),
94 FrameLowering(initializeSubtargetDependencies(TT, CPU, TuneCPU, FS)),
95 InstrInfo(*this), RegInfo(), TLInfo(TM, *this) {
96 TSInfo = std::make_unique<CSKYSelectionDAGInfo>();
97 }
98
99 CSKYSubtarget::~CSKYSubtarget() = default;
100
getSelectionDAGInfo() const101 const SelectionDAGTargetInfo *CSKYSubtarget::getSelectionDAGInfo() const {
102 return TSInfo.get();
103 }
104
useHardFloatABI() const105 bool CSKYSubtarget::useHardFloatABI() const {
106 auto FloatABI = getTargetLowering()->getTargetMachine().Options.FloatABIType;
107
108 if (FloatABI == FloatABI::Default)
109 return UseHardFloatABI;
110 else
111 return FloatABI == FloatABI::Hard;
112 }
113