xref: /freebsd/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYSubtarget.cpp (revision 770cf0a5f02dc8983a89c6568d741fbc25baa999)
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 
24 void CSKYSubtarget::anchor() {}
25 
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 
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 
101 const SelectionDAGTargetInfo *CSKYSubtarget::getSelectionDAGInfo() const {
102   return TSInfo.get();
103 }
104 
105 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