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