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