xref: /openbsd-src/gnu/llvm/clang/lib/Basic/Targets/CSKY.cpp (revision 12c855180aad702bbcca06e0398d774beeafb155)
1*12c85518Srobert //===--- CSKY.cpp - Implement CSKY target feature support -----------------===//
2*12c85518Srobert //
3*12c85518Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*12c85518Srobert // See https://llvm.org/LICENSE.txt for license information.
5*12c85518Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*12c85518Srobert //
7*12c85518Srobert //===----------------------------------------------------------------------===//
8*12c85518Srobert //
9*12c85518Srobert // This file implements CSKY TargetInfo objects.
10*12c85518Srobert //
11*12c85518Srobert //===----------------------------------------------------------------------===//
12*12c85518Srobert 
13*12c85518Srobert #include "CSKY.h"
14*12c85518Srobert 
15*12c85518Srobert using namespace clang;
16*12c85518Srobert using namespace clang::targets;
17*12c85518Srobert 
isValidCPUName(StringRef Name) const18*12c85518Srobert bool CSKYTargetInfo::isValidCPUName(StringRef Name) const {
19*12c85518Srobert   return llvm::CSKY::parseCPUArch(Name) != llvm::CSKY::ArchKind::INVALID;
20*12c85518Srobert }
21*12c85518Srobert 
setCPU(const std::string & Name)22*12c85518Srobert bool CSKYTargetInfo::setCPU(const std::string &Name) {
23*12c85518Srobert   llvm::CSKY::ArchKind archKind = llvm::CSKY::parseCPUArch(Name);
24*12c85518Srobert   bool isValid = (archKind != llvm::CSKY::ArchKind::INVALID);
25*12c85518Srobert 
26*12c85518Srobert   if (isValid) {
27*12c85518Srobert     CPU = Name;
28*12c85518Srobert     Arch = archKind;
29*12c85518Srobert   }
30*12c85518Srobert 
31*12c85518Srobert   return isValid;
32*12c85518Srobert }
33*12c85518Srobert 
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const34*12c85518Srobert void CSKYTargetInfo::getTargetDefines(const LangOptions &Opts,
35*12c85518Srobert                                       MacroBuilder &Builder) const {
36*12c85518Srobert   Builder.defineMacro("__ELF__");
37*12c85518Srobert   Builder.defineMacro("__csky__", "2");
38*12c85518Srobert   Builder.defineMacro("__CSKY__", "2");
39*12c85518Srobert   Builder.defineMacro("__ckcore__", "2");
40*12c85518Srobert   Builder.defineMacro("__CKCORE__", "2");
41*12c85518Srobert 
42*12c85518Srobert   Builder.defineMacro("__CSKYABI__", ABI == "abiv2" ? "2" : "1");
43*12c85518Srobert   Builder.defineMacro("__cskyabi__", ABI == "abiv2" ? "2" : "1");
44*12c85518Srobert 
45*12c85518Srobert   StringRef ArchName = "ck810";
46*12c85518Srobert   StringRef CPUName = "ck810";
47*12c85518Srobert 
48*12c85518Srobert   if (Arch != llvm::CSKY::ArchKind::INVALID) {
49*12c85518Srobert     ArchName = llvm::CSKY::getArchName(Arch);
50*12c85518Srobert     CPUName = CPU;
51*12c85518Srobert   }
52*12c85518Srobert 
53*12c85518Srobert   Builder.defineMacro("__" + ArchName.upper() + "__");
54*12c85518Srobert   Builder.defineMacro("__" + ArchName.lower() + "__");
55*12c85518Srobert   Builder.defineMacro("__" + CPUName.upper() + "__");
56*12c85518Srobert   Builder.defineMacro("__" + CPUName.lower() + "__");
57*12c85518Srobert 
58*12c85518Srobert   // TODO: Add support for BE if BE was supported later
59*12c85518Srobert   StringRef endian = "__cskyLE__";
60*12c85518Srobert 
61*12c85518Srobert   Builder.defineMacro(endian);
62*12c85518Srobert   Builder.defineMacro(endian.upper());
63*12c85518Srobert   Builder.defineMacro(endian.lower());
64*12c85518Srobert 
65*12c85518Srobert   if (DSPV2) {
66*12c85518Srobert     StringRef dspv2 = "__CSKY_DSPV2__";
67*12c85518Srobert     Builder.defineMacro(dspv2);
68*12c85518Srobert     Builder.defineMacro(dspv2.lower());
69*12c85518Srobert   }
70*12c85518Srobert 
71*12c85518Srobert   if (VDSPV2) {
72*12c85518Srobert     StringRef vdspv2 = "__CSKY_VDSPV2__";
73*12c85518Srobert     Builder.defineMacro(vdspv2);
74*12c85518Srobert     Builder.defineMacro(vdspv2.lower());
75*12c85518Srobert 
76*12c85518Srobert     if (HardFloat) {
77*12c85518Srobert       StringRef vdspv2_f = "__CSKY_VDSPV2_F__";
78*12c85518Srobert       Builder.defineMacro(vdspv2_f);
79*12c85518Srobert       Builder.defineMacro(vdspv2_f.lower());
80*12c85518Srobert     }
81*12c85518Srobert   }
82*12c85518Srobert   if (VDSPV1) {
83*12c85518Srobert     StringRef vdspv1_64 = "__CSKY_VDSP64__";
84*12c85518Srobert     StringRef vdspv1_128 = "__CSKY_VDSP128__";
85*12c85518Srobert 
86*12c85518Srobert     Builder.defineMacro(vdspv1_64);
87*12c85518Srobert     Builder.defineMacro(vdspv1_64.lower());
88*12c85518Srobert     Builder.defineMacro(vdspv1_128);
89*12c85518Srobert     Builder.defineMacro(vdspv1_128.lower());
90*12c85518Srobert   }
91*12c85518Srobert   if (is3E3R1) {
92*12c85518Srobert     StringRef is3e3r1 = "__CSKY_3E3R1__";
93*12c85518Srobert     Builder.defineMacro(is3e3r1);
94*12c85518Srobert     Builder.defineMacro(is3e3r1.lower());
95*12c85518Srobert   }
96*12c85518Srobert }
97*12c85518Srobert 
hasFeature(StringRef Feature) const98*12c85518Srobert bool CSKYTargetInfo::hasFeature(StringRef Feature) const {
99*12c85518Srobert   return llvm::StringSwitch<bool>(Feature)
100*12c85518Srobert       .Case("hard-float", HardFloat)
101*12c85518Srobert       .Case("hard-float-abi", HardFloatABI)
102*12c85518Srobert       .Case("fpuv2_sf", FPUV2_SF)
103*12c85518Srobert       .Case("fpuv2_df", FPUV2_DF)
104*12c85518Srobert       .Case("fpuv3_sf", FPUV3_SF)
105*12c85518Srobert       .Case("fpuv3_df", FPUV3_DF)
106*12c85518Srobert       .Case("vdspv2", VDSPV2)
107*12c85518Srobert       .Case("dspv2", DSPV2)
108*12c85518Srobert       .Case("vdspv1", VDSPV1)
109*12c85518Srobert       .Case("3e3r1", is3E3R1)
110*12c85518Srobert       .Default(false);
111*12c85518Srobert }
112*12c85518Srobert 
handleTargetFeatures(std::vector<std::string> & Features,DiagnosticsEngine & Diags)113*12c85518Srobert bool CSKYTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
114*12c85518Srobert                                           DiagnosticsEngine &Diags) {
115*12c85518Srobert   for (const auto &Feature : Features) {
116*12c85518Srobert     if (Feature == "+hard-float")
117*12c85518Srobert       HardFloat = true;
118*12c85518Srobert     if (Feature == "+hard-float-abi")
119*12c85518Srobert       HardFloatABI = true;
120*12c85518Srobert     if (Feature == "+fpuv2_sf")
121*12c85518Srobert       FPUV2_SF = true;
122*12c85518Srobert     if (Feature == "+fpuv2_df")
123*12c85518Srobert       FPUV2_DF = true;
124*12c85518Srobert     if (Feature == "+fpuv3_sf")
125*12c85518Srobert       FPUV3_SF = true;
126*12c85518Srobert     if (Feature == "+fpuv3_df")
127*12c85518Srobert       FPUV3_DF = true;
128*12c85518Srobert     if (Feature == "+vdspv2")
129*12c85518Srobert       VDSPV2 = true;
130*12c85518Srobert     if (Feature == "+dspv2")
131*12c85518Srobert       DSPV2 = true;
132*12c85518Srobert     if (Feature == "+vdspv1")
133*12c85518Srobert       VDSPV1 = true;
134*12c85518Srobert     if (Feature == "+3e3r1")
135*12c85518Srobert       is3E3R1 = true;
136*12c85518Srobert   }
137*12c85518Srobert 
138*12c85518Srobert   return true;
139*12c85518Srobert }
140*12c85518Srobert 
getTargetBuiltins() const141*12c85518Srobert ArrayRef<Builtin::Info> CSKYTargetInfo::getTargetBuiltins() const {
142*12c85518Srobert   return ArrayRef<Builtin::Info>();
143*12c85518Srobert }
144*12c85518Srobert 
getGCCRegNames() const145*12c85518Srobert ArrayRef<const char *> CSKYTargetInfo::getGCCRegNames() const {
146*12c85518Srobert   static const char *const GCCRegNames[] = {
147*12c85518Srobert       // Integer registers
148*12c85518Srobert       "r0",
149*12c85518Srobert       "r1",
150*12c85518Srobert       "r2",
151*12c85518Srobert       "r3",
152*12c85518Srobert       "r4",
153*12c85518Srobert       "r5",
154*12c85518Srobert       "r6",
155*12c85518Srobert       "r7",
156*12c85518Srobert       "r8",
157*12c85518Srobert       "r9",
158*12c85518Srobert       "r10",
159*12c85518Srobert       "r11",
160*12c85518Srobert       "r12",
161*12c85518Srobert       "r13",
162*12c85518Srobert       "r14",
163*12c85518Srobert       "r15",
164*12c85518Srobert       "r16",
165*12c85518Srobert       "r17",
166*12c85518Srobert       "r18",
167*12c85518Srobert       "r19",
168*12c85518Srobert       "r20",
169*12c85518Srobert       "r21",
170*12c85518Srobert       "r22",
171*12c85518Srobert       "r23",
172*12c85518Srobert       "r24",
173*12c85518Srobert       "r25",
174*12c85518Srobert       "r26",
175*12c85518Srobert       "r27",
176*12c85518Srobert       "r28",
177*12c85518Srobert       "r29",
178*12c85518Srobert       "r30",
179*12c85518Srobert       "r31",
180*12c85518Srobert 
181*12c85518Srobert       // Floating point registers
182*12c85518Srobert       "fr0",
183*12c85518Srobert       "fr1",
184*12c85518Srobert       "fr2",
185*12c85518Srobert       "fr3",
186*12c85518Srobert       "fr4",
187*12c85518Srobert       "fr5",
188*12c85518Srobert       "fr6",
189*12c85518Srobert       "fr7",
190*12c85518Srobert       "fr8",
191*12c85518Srobert       "fr9",
192*12c85518Srobert       "fr10",
193*12c85518Srobert       "fr11",
194*12c85518Srobert       "fr12",
195*12c85518Srobert       "fr13",
196*12c85518Srobert       "fr14",
197*12c85518Srobert       "fr15",
198*12c85518Srobert       "fr16",
199*12c85518Srobert       "fr17",
200*12c85518Srobert       "fr18",
201*12c85518Srobert       "fr19",
202*12c85518Srobert       "fr20",
203*12c85518Srobert       "fr21",
204*12c85518Srobert       "fr22",
205*12c85518Srobert       "fr23",
206*12c85518Srobert       "fr24",
207*12c85518Srobert       "fr25",
208*12c85518Srobert       "fr26",
209*12c85518Srobert       "fr27",
210*12c85518Srobert       "fr28",
211*12c85518Srobert       "fr29",
212*12c85518Srobert       "fr30",
213*12c85518Srobert       "fr31",
214*12c85518Srobert 
215*12c85518Srobert   };
216*12c85518Srobert   return llvm::ArrayRef(GCCRegNames);
217*12c85518Srobert }
218*12c85518Srobert 
getGCCRegAliases() const219*12c85518Srobert ArrayRef<TargetInfo::GCCRegAlias> CSKYTargetInfo::getGCCRegAliases() const {
220*12c85518Srobert   static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
221*12c85518Srobert       {{"a0"}, "r0"},
222*12c85518Srobert       {{"a1"}, "r1"},
223*12c85518Srobert       {{"a2"}, "r2"},
224*12c85518Srobert       {{"a3"}, "r3"},
225*12c85518Srobert       {{"l0"}, "r4"},
226*12c85518Srobert       {{"l1"}, "r5"},
227*12c85518Srobert       {{"l2"}, "r6"},
228*12c85518Srobert       {{"l3"}, "r7"},
229*12c85518Srobert       {{"l4"}, "r8"},
230*12c85518Srobert       {{"l5"}, "r9"},
231*12c85518Srobert       {{"l6"}, "r10"},
232*12c85518Srobert       {{"l7"}, "r11"},
233*12c85518Srobert       {{"t0"}, "r12"},
234*12c85518Srobert       {{"t1"}, "r13"},
235*12c85518Srobert       {{"sp"}, "r14"},
236*12c85518Srobert       {{"lr"}, "r15"},
237*12c85518Srobert       {{"l8"}, "r16"},
238*12c85518Srobert       {{"l9"}, "r17"},
239*12c85518Srobert       {{"t2"}, "r18"},
240*12c85518Srobert       {{"t3"}, "r19"},
241*12c85518Srobert       {{"t4"}, "r20"},
242*12c85518Srobert       {{"t5"}, "r21"},
243*12c85518Srobert       {{"t6"}, "r22"},
244*12c85518Srobert       {{"t7", "fp"}, "r23"},
245*12c85518Srobert       {{"t8", "top"}, "r24"},
246*12c85518Srobert       {{"t9", "bsp"}, "r25"},
247*12c85518Srobert       {{"r26"}, "r26"},
248*12c85518Srobert       {{"r27"}, "r27"},
249*12c85518Srobert       {{"gb", "rgb", "rdb"}, "r28"},
250*12c85518Srobert       {{"tb", "rtb"}, "r29"},
251*12c85518Srobert       {{"svbr"}, "r30"},
252*12c85518Srobert       {{"tls"}, "r31"},
253*12c85518Srobert 
254*12c85518Srobert       {{"vr0"}, "fr0"},
255*12c85518Srobert       {{"vr1"}, "fr1"},
256*12c85518Srobert       {{"vr2"}, "fr2"},
257*12c85518Srobert       {{"vr3"}, "fr3"},
258*12c85518Srobert       {{"vr4"}, "fr4"},
259*12c85518Srobert       {{"vr5"}, "fr5"},
260*12c85518Srobert       {{"vr6"}, "fr6"},
261*12c85518Srobert       {{"vr7"}, "fr7"},
262*12c85518Srobert       {{"vr8"}, "fr8"},
263*12c85518Srobert       {{"vr9"}, "fr9"},
264*12c85518Srobert       {{"vr10"}, "fr10"},
265*12c85518Srobert       {{"vr11"}, "fr11"},
266*12c85518Srobert       {{"vr12"}, "fr12"},
267*12c85518Srobert       {{"vr13"}, "fr13"},
268*12c85518Srobert       {{"vr14"}, "fr14"},
269*12c85518Srobert       {{"vr15"}, "fr15"},
270*12c85518Srobert       {{"vr16"}, "fr16"},
271*12c85518Srobert       {{"vr17"}, "fr17"},
272*12c85518Srobert       {{"vr18"}, "fr18"},
273*12c85518Srobert       {{"vr19"}, "fr19"},
274*12c85518Srobert       {{"vr20"}, "fr20"},
275*12c85518Srobert       {{"vr21"}, "fr21"},
276*12c85518Srobert       {{"vr22"}, "fr22"},
277*12c85518Srobert       {{"vr23"}, "fr23"},
278*12c85518Srobert       {{"vr24"}, "fr24"},
279*12c85518Srobert       {{"vr25"}, "fr25"},
280*12c85518Srobert       {{"vr26"}, "fr26"},
281*12c85518Srobert       {{"vr27"}, "fr27"},
282*12c85518Srobert       {{"vr28"}, "fr28"},
283*12c85518Srobert       {{"vr29"}, "fr29"},
284*12c85518Srobert       {{"vr30"}, "fr30"},
285*12c85518Srobert       {{"vr31"}, "fr31"},
286*12c85518Srobert 
287*12c85518Srobert   };
288*12c85518Srobert   return llvm::ArrayRef(GCCRegAliases);
289*12c85518Srobert }
290*12c85518Srobert 
validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & Info) const291*12c85518Srobert bool CSKYTargetInfo::validateAsmConstraint(
292*12c85518Srobert     const char *&Name, TargetInfo::ConstraintInfo &Info) const {
293*12c85518Srobert   switch (*Name) {
294*12c85518Srobert   default:
295*12c85518Srobert     return false;
296*12c85518Srobert   case 'a':
297*12c85518Srobert   case 'b':
298*12c85518Srobert   case 'c':
299*12c85518Srobert   case 'y':
300*12c85518Srobert   case 'l':
301*12c85518Srobert   case 'h':
302*12c85518Srobert   case 'w':
303*12c85518Srobert   case 'v': // A floating-point and vector register.
304*12c85518Srobert   case 'z':
305*12c85518Srobert     Info.setAllowsRegister();
306*12c85518Srobert     return true;
307*12c85518Srobert   }
308*12c85518Srobert }
309*12c85518Srobert 
getMinGlobalAlign(uint64_t Size) const310*12c85518Srobert unsigned CSKYTargetInfo::getMinGlobalAlign(uint64_t Size) const {
311*12c85518Srobert   if (Size >= 32)
312*12c85518Srobert     return 32;
313*12c85518Srobert   return 0;
314*12c85518Srobert }
315