xref: /freebsd-src/contrib/llvm-project/clang/lib/Basic/Targets/CSKY.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
181ad6265SDimitry Andric //===--- CSKY.cpp - Implement CSKY target feature support -----------------===//
281ad6265SDimitry Andric //
381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681ad6265SDimitry Andric //
781ad6265SDimitry Andric //===----------------------------------------------------------------------===//
881ad6265SDimitry Andric //
981ad6265SDimitry Andric // This file implements CSKY TargetInfo objects.
1081ad6265SDimitry Andric //
1181ad6265SDimitry Andric //===----------------------------------------------------------------------===//
1281ad6265SDimitry Andric 
1381ad6265SDimitry Andric #include "CSKY.h"
1481ad6265SDimitry Andric 
1581ad6265SDimitry Andric using namespace clang;
1681ad6265SDimitry Andric using namespace clang::targets;
1781ad6265SDimitry Andric 
1881ad6265SDimitry Andric bool CSKYTargetInfo::isValidCPUName(StringRef Name) const {
1981ad6265SDimitry Andric   return llvm::CSKY::parseCPUArch(Name) != llvm::CSKY::ArchKind::INVALID;
2081ad6265SDimitry Andric }
2181ad6265SDimitry Andric 
2281ad6265SDimitry Andric bool CSKYTargetInfo::setCPU(const std::string &Name) {
2381ad6265SDimitry Andric   llvm::CSKY::ArchKind archKind = llvm::CSKY::parseCPUArch(Name);
2481ad6265SDimitry Andric   bool isValid = (archKind != llvm::CSKY::ArchKind::INVALID);
2581ad6265SDimitry Andric 
2681ad6265SDimitry Andric   if (isValid) {
2781ad6265SDimitry Andric     CPU = Name;
2881ad6265SDimitry Andric     Arch = archKind;
2981ad6265SDimitry Andric   }
3081ad6265SDimitry Andric 
3181ad6265SDimitry Andric   return isValid;
3281ad6265SDimitry Andric }
3381ad6265SDimitry Andric 
3481ad6265SDimitry Andric void CSKYTargetInfo::getTargetDefines(const LangOptions &Opts,
3581ad6265SDimitry Andric                                       MacroBuilder &Builder) const {
3681ad6265SDimitry Andric   Builder.defineMacro("__ELF__");
3781ad6265SDimitry Andric   Builder.defineMacro("__csky__", "2");
3881ad6265SDimitry Andric   Builder.defineMacro("__CSKY__", "2");
3981ad6265SDimitry Andric   Builder.defineMacro("__ckcore__", "2");
4081ad6265SDimitry Andric   Builder.defineMacro("__CKCORE__", "2");
4181ad6265SDimitry Andric 
4281ad6265SDimitry Andric   Builder.defineMacro("__CSKYABI__", ABI == "abiv2" ? "2" : "1");
4381ad6265SDimitry Andric   Builder.defineMacro("__cskyabi__", ABI == "abiv2" ? "2" : "1");
4481ad6265SDimitry Andric 
4581ad6265SDimitry Andric   StringRef ArchName = "ck810";
4681ad6265SDimitry Andric   StringRef CPUName = "ck810";
4781ad6265SDimitry Andric 
4881ad6265SDimitry Andric   if (Arch != llvm::CSKY::ArchKind::INVALID) {
4981ad6265SDimitry Andric     ArchName = llvm::CSKY::getArchName(Arch);
5081ad6265SDimitry Andric     CPUName = CPU;
5181ad6265SDimitry Andric   }
5281ad6265SDimitry Andric 
5381ad6265SDimitry Andric   Builder.defineMacro("__" + ArchName.upper() + "__");
5481ad6265SDimitry Andric   Builder.defineMacro("__" + ArchName.lower() + "__");
5581ad6265SDimitry Andric   Builder.defineMacro("__" + CPUName.upper() + "__");
5681ad6265SDimitry Andric   Builder.defineMacro("__" + CPUName.lower() + "__");
5781ad6265SDimitry Andric 
5881ad6265SDimitry Andric   // TODO: Add support for BE if BE was supported later
5981ad6265SDimitry Andric   StringRef endian = "__cskyLE__";
6081ad6265SDimitry Andric 
6181ad6265SDimitry Andric   Builder.defineMacro(endian);
6281ad6265SDimitry Andric   Builder.defineMacro(endian.upper());
6381ad6265SDimitry Andric   Builder.defineMacro(endian.lower());
6481ad6265SDimitry Andric 
6581ad6265SDimitry Andric   if (DSPV2) {
6681ad6265SDimitry Andric     StringRef dspv2 = "__CSKY_DSPV2__";
6781ad6265SDimitry Andric     Builder.defineMacro(dspv2);
6881ad6265SDimitry Andric     Builder.defineMacro(dspv2.lower());
6981ad6265SDimitry Andric   }
7081ad6265SDimitry Andric 
7181ad6265SDimitry Andric   if (VDSPV2) {
7281ad6265SDimitry Andric     StringRef vdspv2 = "__CSKY_VDSPV2__";
7381ad6265SDimitry Andric     Builder.defineMacro(vdspv2);
7481ad6265SDimitry Andric     Builder.defineMacro(vdspv2.lower());
7581ad6265SDimitry Andric 
7681ad6265SDimitry Andric     if (HardFloat) {
7781ad6265SDimitry Andric       StringRef vdspv2_f = "__CSKY_VDSPV2_F__";
7881ad6265SDimitry Andric       Builder.defineMacro(vdspv2_f);
7981ad6265SDimitry Andric       Builder.defineMacro(vdspv2_f.lower());
8081ad6265SDimitry Andric     }
8181ad6265SDimitry Andric   }
8281ad6265SDimitry Andric   if (VDSPV1) {
8381ad6265SDimitry Andric     StringRef vdspv1_64 = "__CSKY_VDSP64__";
8481ad6265SDimitry Andric     StringRef vdspv1_128 = "__CSKY_VDSP128__";
8581ad6265SDimitry Andric 
8681ad6265SDimitry Andric     Builder.defineMacro(vdspv1_64);
8781ad6265SDimitry Andric     Builder.defineMacro(vdspv1_64.lower());
8881ad6265SDimitry Andric     Builder.defineMacro(vdspv1_128);
8981ad6265SDimitry Andric     Builder.defineMacro(vdspv1_128.lower());
9081ad6265SDimitry Andric   }
9181ad6265SDimitry Andric   if (is3E3R1) {
9281ad6265SDimitry Andric     StringRef is3e3r1 = "__CSKY_3E3R1__";
9381ad6265SDimitry Andric     Builder.defineMacro(is3e3r1);
9481ad6265SDimitry Andric     Builder.defineMacro(is3e3r1.lower());
9581ad6265SDimitry Andric   }
9681ad6265SDimitry Andric }
9781ad6265SDimitry Andric 
9881ad6265SDimitry Andric bool CSKYTargetInfo::hasFeature(StringRef Feature) const {
9981ad6265SDimitry Andric   return llvm::StringSwitch<bool>(Feature)
10081ad6265SDimitry Andric       .Case("hard-float", HardFloat)
10181ad6265SDimitry Andric       .Case("hard-float-abi", HardFloatABI)
10281ad6265SDimitry Andric       .Case("fpuv2_sf", FPUV2_SF)
10381ad6265SDimitry Andric       .Case("fpuv2_df", FPUV2_DF)
10481ad6265SDimitry Andric       .Case("fpuv3_sf", FPUV3_SF)
10581ad6265SDimitry Andric       .Case("fpuv3_df", FPUV3_DF)
10681ad6265SDimitry Andric       .Case("vdspv2", VDSPV2)
10781ad6265SDimitry Andric       .Case("dspv2", DSPV2)
10881ad6265SDimitry Andric       .Case("vdspv1", VDSPV1)
10981ad6265SDimitry Andric       .Case("3e3r1", is3E3R1)
11081ad6265SDimitry Andric       .Default(false);
11181ad6265SDimitry Andric }
11281ad6265SDimitry Andric 
11381ad6265SDimitry Andric bool CSKYTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
11481ad6265SDimitry Andric                                           DiagnosticsEngine &Diags) {
11581ad6265SDimitry Andric   for (const auto &Feature : Features) {
11681ad6265SDimitry Andric     if (Feature == "+hard-float")
11781ad6265SDimitry Andric       HardFloat = true;
11881ad6265SDimitry Andric     if (Feature == "+hard-float-abi")
11981ad6265SDimitry Andric       HardFloatABI = true;
12081ad6265SDimitry Andric     if (Feature == "+fpuv2_sf")
12181ad6265SDimitry Andric       FPUV2_SF = true;
12281ad6265SDimitry Andric     if (Feature == "+fpuv2_df")
12381ad6265SDimitry Andric       FPUV2_DF = true;
12481ad6265SDimitry Andric     if (Feature == "+fpuv3_sf")
12581ad6265SDimitry Andric       FPUV3_SF = true;
12681ad6265SDimitry Andric     if (Feature == "+fpuv3_df")
12781ad6265SDimitry Andric       FPUV3_DF = true;
12881ad6265SDimitry Andric     if (Feature == "+vdspv2")
12981ad6265SDimitry Andric       VDSPV2 = true;
13081ad6265SDimitry Andric     if (Feature == "+dspv2")
13181ad6265SDimitry Andric       DSPV2 = true;
13281ad6265SDimitry Andric     if (Feature == "+vdspv1")
13381ad6265SDimitry Andric       VDSPV1 = true;
13481ad6265SDimitry Andric     if (Feature == "+3e3r1")
13581ad6265SDimitry Andric       is3E3R1 = true;
13681ad6265SDimitry Andric   }
13781ad6265SDimitry Andric 
13881ad6265SDimitry Andric   return true;
13981ad6265SDimitry Andric }
14081ad6265SDimitry Andric 
14181ad6265SDimitry Andric ArrayRef<Builtin::Info> CSKYTargetInfo::getTargetBuiltins() const {
14281ad6265SDimitry Andric   return ArrayRef<Builtin::Info>();
14381ad6265SDimitry Andric }
14481ad6265SDimitry Andric 
14581ad6265SDimitry Andric ArrayRef<const char *> CSKYTargetInfo::getGCCRegNames() const {
14681ad6265SDimitry Andric   static const char *const GCCRegNames[] = {
14781ad6265SDimitry Andric       // Integer registers
14881ad6265SDimitry Andric       "r0",
14981ad6265SDimitry Andric       "r1",
15081ad6265SDimitry Andric       "r2",
15181ad6265SDimitry Andric       "r3",
15281ad6265SDimitry Andric       "r4",
15381ad6265SDimitry Andric       "r5",
15481ad6265SDimitry Andric       "r6",
15581ad6265SDimitry Andric       "r7",
15681ad6265SDimitry Andric       "r8",
15781ad6265SDimitry Andric       "r9",
15881ad6265SDimitry Andric       "r10",
15981ad6265SDimitry Andric       "r11",
16081ad6265SDimitry Andric       "r12",
16181ad6265SDimitry Andric       "r13",
16281ad6265SDimitry Andric       "r14",
16381ad6265SDimitry Andric       "r15",
16481ad6265SDimitry Andric       "r16",
16581ad6265SDimitry Andric       "r17",
16681ad6265SDimitry Andric       "r18",
16781ad6265SDimitry Andric       "r19",
16881ad6265SDimitry Andric       "r20",
16981ad6265SDimitry Andric       "r21",
17081ad6265SDimitry Andric       "r22",
17181ad6265SDimitry Andric       "r23",
17281ad6265SDimitry Andric       "r24",
17381ad6265SDimitry Andric       "r25",
17481ad6265SDimitry Andric       "r26",
17581ad6265SDimitry Andric       "r27",
17681ad6265SDimitry Andric       "r28",
17781ad6265SDimitry Andric       "r29",
17881ad6265SDimitry Andric       "r30",
17981ad6265SDimitry Andric       "r31",
18081ad6265SDimitry Andric 
18181ad6265SDimitry Andric       // Floating point registers
18281ad6265SDimitry Andric       "fr0",
18381ad6265SDimitry Andric       "fr1",
18481ad6265SDimitry Andric       "fr2",
18581ad6265SDimitry Andric       "fr3",
18681ad6265SDimitry Andric       "fr4",
18781ad6265SDimitry Andric       "fr5",
18881ad6265SDimitry Andric       "fr6",
18981ad6265SDimitry Andric       "fr7",
19081ad6265SDimitry Andric       "fr8",
19181ad6265SDimitry Andric       "fr9",
19281ad6265SDimitry Andric       "fr10",
19381ad6265SDimitry Andric       "fr11",
19481ad6265SDimitry Andric       "fr12",
19581ad6265SDimitry Andric       "fr13",
19681ad6265SDimitry Andric       "fr14",
19781ad6265SDimitry Andric       "fr15",
19881ad6265SDimitry Andric       "fr16",
19981ad6265SDimitry Andric       "fr17",
20081ad6265SDimitry Andric       "fr18",
20181ad6265SDimitry Andric       "fr19",
20281ad6265SDimitry Andric       "fr20",
20381ad6265SDimitry Andric       "fr21",
20481ad6265SDimitry Andric       "fr22",
20581ad6265SDimitry Andric       "fr23",
20681ad6265SDimitry Andric       "fr24",
20781ad6265SDimitry Andric       "fr25",
20881ad6265SDimitry Andric       "fr26",
20981ad6265SDimitry Andric       "fr27",
21081ad6265SDimitry Andric       "fr28",
21181ad6265SDimitry Andric       "fr29",
21281ad6265SDimitry Andric       "fr30",
21381ad6265SDimitry Andric       "fr31",
21481ad6265SDimitry Andric 
21581ad6265SDimitry Andric   };
216*bdd1243dSDimitry Andric   return llvm::ArrayRef(GCCRegNames);
21781ad6265SDimitry Andric }
21881ad6265SDimitry Andric 
21981ad6265SDimitry Andric ArrayRef<TargetInfo::GCCRegAlias> CSKYTargetInfo::getGCCRegAliases() const {
22081ad6265SDimitry Andric   static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
22181ad6265SDimitry Andric       {{"a0"}, "r0"},
22281ad6265SDimitry Andric       {{"a1"}, "r1"},
22381ad6265SDimitry Andric       {{"a2"}, "r2"},
22481ad6265SDimitry Andric       {{"a3"}, "r3"},
22581ad6265SDimitry Andric       {{"l0"}, "r4"},
22681ad6265SDimitry Andric       {{"l1"}, "r5"},
22781ad6265SDimitry Andric       {{"l2"}, "r6"},
22881ad6265SDimitry Andric       {{"l3"}, "r7"},
22981ad6265SDimitry Andric       {{"l4"}, "r8"},
23081ad6265SDimitry Andric       {{"l5"}, "r9"},
23181ad6265SDimitry Andric       {{"l6"}, "r10"},
23281ad6265SDimitry Andric       {{"l7"}, "r11"},
23381ad6265SDimitry Andric       {{"t0"}, "r12"},
23481ad6265SDimitry Andric       {{"t1"}, "r13"},
23581ad6265SDimitry Andric       {{"sp"}, "r14"},
23681ad6265SDimitry Andric       {{"lr"}, "r15"},
23781ad6265SDimitry Andric       {{"l8"}, "r16"},
23881ad6265SDimitry Andric       {{"l9"}, "r17"},
23981ad6265SDimitry Andric       {{"t2"}, "r18"},
24081ad6265SDimitry Andric       {{"t3"}, "r19"},
24181ad6265SDimitry Andric       {{"t4"}, "r20"},
24281ad6265SDimitry Andric       {{"t5"}, "r21"},
24381ad6265SDimitry Andric       {{"t6"}, "r22"},
24481ad6265SDimitry Andric       {{"t7", "fp"}, "r23"},
24581ad6265SDimitry Andric       {{"t8", "top"}, "r24"},
24681ad6265SDimitry Andric       {{"t9", "bsp"}, "r25"},
24781ad6265SDimitry Andric       {{"r26"}, "r26"},
24881ad6265SDimitry Andric       {{"r27"}, "r27"},
24981ad6265SDimitry Andric       {{"gb", "rgb", "rdb"}, "r28"},
25081ad6265SDimitry Andric       {{"tb", "rtb"}, "r29"},
25181ad6265SDimitry Andric       {{"svbr"}, "r30"},
25281ad6265SDimitry Andric       {{"tls"}, "r31"},
25381ad6265SDimitry Andric 
25481ad6265SDimitry Andric       {{"vr0"}, "fr0"},
25581ad6265SDimitry Andric       {{"vr1"}, "fr1"},
25681ad6265SDimitry Andric       {{"vr2"}, "fr2"},
25781ad6265SDimitry Andric       {{"vr3"}, "fr3"},
25881ad6265SDimitry Andric       {{"vr4"}, "fr4"},
25981ad6265SDimitry Andric       {{"vr5"}, "fr5"},
26081ad6265SDimitry Andric       {{"vr6"}, "fr6"},
26181ad6265SDimitry Andric       {{"vr7"}, "fr7"},
26281ad6265SDimitry Andric       {{"vr8"}, "fr8"},
26381ad6265SDimitry Andric       {{"vr9"}, "fr9"},
26481ad6265SDimitry Andric       {{"vr10"}, "fr10"},
26581ad6265SDimitry Andric       {{"vr11"}, "fr11"},
26681ad6265SDimitry Andric       {{"vr12"}, "fr12"},
26781ad6265SDimitry Andric       {{"vr13"}, "fr13"},
26881ad6265SDimitry Andric       {{"vr14"}, "fr14"},
26981ad6265SDimitry Andric       {{"vr15"}, "fr15"},
27081ad6265SDimitry Andric       {{"vr16"}, "fr16"},
27181ad6265SDimitry Andric       {{"vr17"}, "fr17"},
27281ad6265SDimitry Andric       {{"vr18"}, "fr18"},
27381ad6265SDimitry Andric       {{"vr19"}, "fr19"},
27481ad6265SDimitry Andric       {{"vr20"}, "fr20"},
27581ad6265SDimitry Andric       {{"vr21"}, "fr21"},
27681ad6265SDimitry Andric       {{"vr22"}, "fr22"},
27781ad6265SDimitry Andric       {{"vr23"}, "fr23"},
27881ad6265SDimitry Andric       {{"vr24"}, "fr24"},
27981ad6265SDimitry Andric       {{"vr25"}, "fr25"},
28081ad6265SDimitry Andric       {{"vr26"}, "fr26"},
28181ad6265SDimitry Andric       {{"vr27"}, "fr27"},
28281ad6265SDimitry Andric       {{"vr28"}, "fr28"},
28381ad6265SDimitry Andric       {{"vr29"}, "fr29"},
28481ad6265SDimitry Andric       {{"vr30"}, "fr30"},
28581ad6265SDimitry Andric       {{"vr31"}, "fr31"},
28681ad6265SDimitry Andric 
28781ad6265SDimitry Andric   };
288*bdd1243dSDimitry Andric   return llvm::ArrayRef(GCCRegAliases);
28981ad6265SDimitry Andric }
29081ad6265SDimitry Andric 
29181ad6265SDimitry Andric bool CSKYTargetInfo::validateAsmConstraint(
29281ad6265SDimitry Andric     const char *&Name, TargetInfo::ConstraintInfo &Info) const {
29381ad6265SDimitry Andric   switch (*Name) {
29481ad6265SDimitry Andric   default:
29581ad6265SDimitry Andric     return false;
29681ad6265SDimitry Andric   case 'a':
29781ad6265SDimitry Andric   case 'b':
29881ad6265SDimitry Andric   case 'c':
29981ad6265SDimitry Andric   case 'y':
30081ad6265SDimitry Andric   case 'l':
30181ad6265SDimitry Andric   case 'h':
30281ad6265SDimitry Andric   case 'w':
30381ad6265SDimitry Andric   case 'v': // A floating-point and vector register.
30481ad6265SDimitry Andric   case 'z':
30581ad6265SDimitry Andric     Info.setAllowsRegister();
30681ad6265SDimitry Andric     return true;
30781ad6265SDimitry Andric   }
30881ad6265SDimitry Andric }
30981ad6265SDimitry Andric 
31081ad6265SDimitry Andric unsigned CSKYTargetInfo::getMinGlobalAlign(uint64_t Size) const {
31181ad6265SDimitry Andric   if (Size >= 32)
31281ad6265SDimitry Andric     return 32;
31381ad6265SDimitry Andric   return 0;
31481ad6265SDimitry Andric }
315