Path: blob/main/contrib/llvm-project/clang/lib/Basic/Targets/Sparc.cpp
35266 views
//===--- Sparc.cpp - Implement Sparc 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 Sparc TargetInfo objects.9//10//===----------------------------------------------------------------------===//1112#include "Sparc.h"13#include "Targets.h"14#include "clang/Basic/MacroBuilder.h"15#include "llvm/ADT/StringSwitch.h"1617using namespace clang;18using namespace clang::targets;1920const char *const SparcTargetInfo::GCCRegNames[] = {21// Integer registers22"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",23"r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",24"r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",2526// Floating-point registers27"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10",28"f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21",29"f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", "f32",30"f34", "f36", "f38", "f40", "f42", "f44", "f46", "f48", "f50", "f52", "f54",31"f56", "f58", "f60", "f62",32};3334ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {35return llvm::ArrayRef(GCCRegNames);36}3738const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {39{{"g0"}, "r0"}, {{"g1"}, "r1"}, {{"g2"}, "r2"}, {{"g3"}, "r3"},40{{"g4"}, "r4"}, {{"g5"}, "r5"}, {{"g6"}, "r6"}, {{"g7"}, "r7"},41{{"o0"}, "r8"}, {{"o1"}, "r9"}, {{"o2"}, "r10"}, {{"o3"}, "r11"},42{{"o4"}, "r12"}, {{"o5"}, "r13"}, {{"o6", "sp"}, "r14"}, {{"o7"}, "r15"},43{{"l0"}, "r16"}, {{"l1"}, "r17"}, {{"l2"}, "r18"}, {{"l3"}, "r19"},44{{"l4"}, "r20"}, {{"l5"}, "r21"}, {{"l6"}, "r22"}, {{"l7"}, "r23"},45{{"i0"}, "r24"}, {{"i1"}, "r25"}, {{"i2"}, "r26"}, {{"i3"}, "r27"},46{{"i4"}, "r28"}, {{"i5"}, "r29"}, {{"i6", "fp"}, "r30"}, {{"i7"}, "r31"},47};4849ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {50return llvm::ArrayRef(GCCRegAliases);51}5253bool SparcTargetInfo::hasFeature(StringRef Feature) const {54return llvm::StringSwitch<bool>(Feature)55.Case("softfloat", SoftFloat)56.Case("sparc", true)57.Default(false);58}5960struct SparcCPUInfo {61llvm::StringLiteral Name;62SparcTargetInfo::CPUKind Kind;63SparcTargetInfo::CPUGeneration Generation;64};6566static constexpr SparcCPUInfo CPUInfo[] = {67{{"v8"}, SparcTargetInfo::CK_V8, SparcTargetInfo::CG_V8},68{{"supersparc"}, SparcTargetInfo::CK_SUPERSPARC, SparcTargetInfo::CG_V8},69{{"sparclite"}, SparcTargetInfo::CK_SPARCLITE, SparcTargetInfo::CG_V8},70{{"f934"}, SparcTargetInfo::CK_F934, SparcTargetInfo::CG_V8},71{{"hypersparc"}, SparcTargetInfo::CK_HYPERSPARC, SparcTargetInfo::CG_V8},72{{"sparclite86x"},73SparcTargetInfo::CK_SPARCLITE86X,74SparcTargetInfo::CG_V8},75{{"sparclet"}, SparcTargetInfo::CK_SPARCLET, SparcTargetInfo::CG_V8},76{{"tsc701"}, SparcTargetInfo::CK_TSC701, SparcTargetInfo::CG_V8},77{{"v9"}, SparcTargetInfo::CK_V9, SparcTargetInfo::CG_V9},78{{"ultrasparc"}, SparcTargetInfo::CK_ULTRASPARC, SparcTargetInfo::CG_V9},79{{"ultrasparc3"}, SparcTargetInfo::CK_ULTRASPARC3, SparcTargetInfo::CG_V9},80{{"niagara"}, SparcTargetInfo::CK_NIAGARA, SparcTargetInfo::CG_V9},81{{"niagara2"}, SparcTargetInfo::CK_NIAGARA2, SparcTargetInfo::CG_V9},82{{"niagara3"}, SparcTargetInfo::CK_NIAGARA3, SparcTargetInfo::CG_V9},83{{"niagara4"}, SparcTargetInfo::CK_NIAGARA4, SparcTargetInfo::CG_V9},84{{"ma2100"}, SparcTargetInfo::CK_MYRIAD2100, SparcTargetInfo::CG_V8},85{{"ma2150"}, SparcTargetInfo::CK_MYRIAD2150, SparcTargetInfo::CG_V8},86{{"ma2155"}, SparcTargetInfo::CK_MYRIAD2155, SparcTargetInfo::CG_V8},87{{"ma2450"}, SparcTargetInfo::CK_MYRIAD2450, SparcTargetInfo::CG_V8},88{{"ma2455"}, SparcTargetInfo::CK_MYRIAD2455, SparcTargetInfo::CG_V8},89{{"ma2x5x"}, SparcTargetInfo::CK_MYRIAD2x5x, SparcTargetInfo::CG_V8},90{{"ma2080"}, SparcTargetInfo::CK_MYRIAD2080, SparcTargetInfo::CG_V8},91{{"ma2085"}, SparcTargetInfo::CK_MYRIAD2085, SparcTargetInfo::CG_V8},92{{"ma2480"}, SparcTargetInfo::CK_MYRIAD2480, SparcTargetInfo::CG_V8},93{{"ma2485"}, SparcTargetInfo::CK_MYRIAD2485, SparcTargetInfo::CG_V8},94{{"ma2x8x"}, SparcTargetInfo::CK_MYRIAD2x8x, SparcTargetInfo::CG_V8},95{{"leon2"}, SparcTargetInfo::CK_LEON2, SparcTargetInfo::CG_V8},96{{"at697e"}, SparcTargetInfo::CK_LEON2_AT697E, SparcTargetInfo::CG_V8},97{{"at697f"}, SparcTargetInfo::CK_LEON2_AT697F, SparcTargetInfo::CG_V8},98{{"leon3"}, SparcTargetInfo::CK_LEON3, SparcTargetInfo::CG_V8},99{{"ut699"}, SparcTargetInfo::CK_LEON3_UT699, SparcTargetInfo::CG_V8},100{{"gr712rc"}, SparcTargetInfo::CK_LEON3_GR712RC, SparcTargetInfo::CG_V8},101{{"leon4"}, SparcTargetInfo::CK_LEON4, SparcTargetInfo::CG_V8},102{{"gr740"}, SparcTargetInfo::CK_LEON4_GR740, SparcTargetInfo::CG_V8},103};104105SparcTargetInfo::CPUGeneration106SparcTargetInfo::getCPUGeneration(CPUKind Kind) const {107if (Kind == CK_GENERIC)108return CG_V8;109const SparcCPUInfo *Item = llvm::find_if(110CPUInfo, [Kind](const SparcCPUInfo &Info) { return Info.Kind == Kind; });111if (Item == std::end(CPUInfo))112llvm_unreachable("Unexpected CPU kind");113return Item->Generation;114}115116SparcTargetInfo::CPUKind SparcTargetInfo::getCPUKind(StringRef Name) const {117const SparcCPUInfo *Item = llvm::find_if(118CPUInfo, [Name](const SparcCPUInfo &Info) { return Info.Name == Name; });119120if (Item == std::end(CPUInfo))121return CK_GENERIC;122return Item->Kind;123}124125void SparcTargetInfo::fillValidCPUList(126SmallVectorImpl<StringRef> &Values) const {127for (const SparcCPUInfo &Info : CPUInfo)128Values.push_back(Info.Name);129}130131void SparcTargetInfo::getTargetDefines(const LangOptions &Opts,132MacroBuilder &Builder) const {133DefineStd(Builder, "sparc", Opts);134Builder.defineMacro("__REGISTER_PREFIX__", "");135136if (SoftFloat)137Builder.defineMacro("SOFT_FLOAT", "1");138}139140void SparcV8TargetInfo::getTargetDefines(const LangOptions &Opts,141MacroBuilder &Builder) const {142SparcTargetInfo::getTargetDefines(Opts, Builder);143if (getTriple().isOSSolaris())144Builder.defineMacro("__sparcv8");145else {146switch (getCPUGeneration(CPU)) {147case CG_V8:148Builder.defineMacro("__sparcv8");149Builder.defineMacro("__sparcv8__");150break;151case CG_V9:152Builder.defineMacro("__sparc_v9__");153break;154}155}156if (getCPUGeneration(CPU) == CG_V9) {157Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");158Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");159Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");160Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");161}162}163164void SparcV9TargetInfo::getTargetDefines(const LangOptions &Opts,165MacroBuilder &Builder) const {166SparcTargetInfo::getTargetDefines(Opts, Builder);167Builder.defineMacro("__sparcv9");168Builder.defineMacro("__arch64__");169// Solaris doesn't need these variants, but the BSDs do.170if (!getTriple().isOSSolaris()) {171Builder.defineMacro("__sparc64__");172Builder.defineMacro("__sparc_v9__");173Builder.defineMacro("__sparcv9__");174}175176Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");177Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");178Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");179Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");180}181182void SparcV9TargetInfo::fillValidCPUList(183SmallVectorImpl<StringRef> &Values) const {184for (const SparcCPUInfo &Info : CPUInfo)185if (Info.Generation == CG_V9)186Values.push_back(Info.Name);187}188189190