clang 24.0.0git
Sparc.cpp
Go to the documentation of this file.
1//===--- Sparc.cpp - Implement Sparc target feature support ---------------===//
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 implements Sparc TargetInfo objects.
10//
11//===----------------------------------------------------------------------===//
12
13#include "Sparc.h"
14#include "Targets.h"
16#include "llvm/ADT/StringSwitch.h"
17
18using namespace clang;
19using namespace clang::targets;
20
21const char *const SparcTargetInfo::GCCRegNames[] = {
22 // clang-format off
23 // Integer registers
24 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
25 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
26 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
27
28 // Floating-point registers
29 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10",
30 "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21",
31 "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", "f32",
32 "f34", "f36", "f38", "f40", "f42", "f44", "f46", "f48", "f50", "f52", "f54",
33 "f56", "f58", "f60", "f62",
34
35 // Condition code registers
36 "icc", "fcc0", "fcc1", "fcc2", "fcc3",
37 // clang-format on
38};
39
43
44const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
45 {{"g0"}, "r0"}, {{"g1"}, "r1"}, {{"g2"}, "r2"}, {{"g3"}, "r3"},
46 {{"g4"}, "r4"}, {{"g5"}, "r5"}, {{"g6"}, "r6"}, {{"g7"}, "r7"},
47 {{"o0"}, "r8"}, {{"o1"}, "r9"}, {{"o2"}, "r10"}, {{"o3"}, "r11"},
48 {{"o4"}, "r12"}, {{"o5"}, "r13"}, {{"o6", "sp"}, "r14"}, {{"o7"}, "r15"},
49 {{"l0"}, "r16"}, {{"l1"}, "r17"}, {{"l2"}, "r18"}, {{"l3"}, "r19"},
50 {{"l4"}, "r20"}, {{"l5"}, "r21"}, {{"l6"}, "r22"}, {{"l7"}, "r23"},
51 {{"i0"}, "r24"}, {{"i1"}, "r25"}, {{"i2"}, "r26"}, {{"i3"}, "r27"},
52 {{"i4"}, "r28"}, {{"i5"}, "r29"}, {{"i6", "fp"}, "r30"}, {{"i7"}, "r31"},
53};
54
58
59bool SparcTargetInfo::hasFeature(StringRef Feature) const {
60 return llvm::StringSwitch<bool>(Feature)
61 .Case("softfloat", SoftFloat)
62 .Case("sparc", true)
63 .Default(false);
64}
65
72
73static constexpr SparcCPUInfo CPUInfo[] = {
79 {{"sparclite86x"},
102 {{"leon2"},
106 {{"at697e"},
110 {{"at697f"},
114 {{"leon3"},
118 {{"ut699"},
122 {{"gr712rc"},
126 {{"leon4"},
130 {{"gr740"},
134 {{"leon5"},
138};
139
142 if (Kind == CK_GENERIC)
143 return CG_V8;
144 const SparcCPUInfo *Item = llvm::find_if(
145 CPUInfo, [Kind](const SparcCPUInfo &Info) { return Info.Kind == Kind; });
146 if (Item == std::end(CPUInfo))
147 llvm_unreachable("Unexpected CPU kind");
148 return Item->Generation;
149}
150
152 const SparcCPUInfo *Item = llvm::find_if(
153 CPUInfo, [Kind](const SparcCPUInfo &Info) { return Info.Kind == Kind; });
154 if (Item == std::end(CPUInfo))
155 return CF_NONE;
156 return Item->Family;
157}
158
160 const SparcCPUInfo *Item = llvm::find_if(
161 CPUInfo, [Name](const SparcCPUInfo &Info) { return Info.Name == Name; });
162
163 if (Item == std::end(CPUInfo))
164 return CK_GENERIC;
165 return Item->Kind;
166}
167
169 SmallVectorImpl<StringRef> &Values) const {
170 for (const SparcCPUInfo &Info : CPUInfo)
171 Values.push_back(Info.Name);
172}
173
175 MacroBuilder &Builder) const {
176 DefineStd(Builder, "sparc", Opts);
177 Builder.defineMacro("__REGISTER_PREFIX__", "");
178
179 if (SoftFloat)
180 Builder.defineMacro("SOFT_FLOAT", "1");
181}
182
184 MacroBuilder &Builder) const {
186 if (getTriple().isOSSolaris())
187 Builder.defineMacro("__sparcv8");
188 else {
189 switch (getCPUGeneration(CPU)) {
190 case CG_V8:
191 Builder.defineMacro("__sparcv8");
192 Builder.defineMacro("__sparcv8__");
193 Builder.defineMacro("__sparc_v8__");
194 break;
195 case CG_V9:
196 Builder.defineMacro("__sparc_v9__");
197 break;
198 }
199 }
200 if (getCPUFamily(CPU) == CF_LEON)
201 Builder.defineMacro("__leon__");
202 if (getCPUGeneration(CPU) == CG_V9) {
203 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
204 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
205 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
206 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
207 }
208 if (LongDoubleWidth == 128)
209 Builder.defineMacro("__LONG_DOUBLE_128__");
210}
211
213 MacroBuilder &Builder) const {
215 Builder.defineMacro("__sparcv9");
216 Builder.defineMacro("__arch64__");
217 // Solaris doesn't need these variants, but the BSDs do.
218 if (!getTriple().isOSSolaris()) {
219 Builder.defineMacro("__sparc64__");
220 Builder.defineMacro("__sparc_v9__");
221 Builder.defineMacro("__sparcv9__");
222 }
223
224 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
225 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
226 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
227 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
228}
229
231 SmallVectorImpl<StringRef> &Values) const {
232 for (const SparcCPUInfo &Info : CPUInfo)
233 if (Info.Generation == CG_V9)
234 Values.push_back(Info.Name);
235}
static constexpr SparcCPUInfo CPUInfo[]
Definition Sparc.cpp:73
Defines the clang::MacroBuilder utility class.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
CPUFamily getCPUFamily(CPUKind Kind) const
Definition Sparc.cpp:151
bool hasFeature(StringRef Feature) const override
Determine whether the given target has the given feature.
Definition Sparc.cpp:59
ArrayRef< const char * > getGCCRegNames() const override
Definition Sparc.cpp:40
CPUGeneration getCPUGeneration(CPUKind Kind) const
Definition Sparc.cpp:141
CPUKind getCPUKind(StringRef Name) const
Definition Sparc.cpp:159
ArrayRef< TargetInfo::GCCRegAlias > getGCCRegAliases() const override
Definition Sparc.cpp:55
enum clang::targets::SparcTargetInfo::CPUKind CPU
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
Definition Sparc.cpp:168
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
Definition Sparc.cpp:174
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
Definition Sparc.cpp:183
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
Definition Sparc.cpp:212
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
Definition Sparc.cpp:230
LLVM_LIBRARY_VISIBILITY void DefineStd(clang::MacroBuilder &Builder, llvm::StringRef MacroName, const clang::LangOptions &Opts)
Define a macro name and standard variants.
Top level wrappers for InstallAPI frontend operations.
SparcTargetInfo::CPUKind Kind
Definition Sparc.cpp:68
SparcTargetInfo::CPUFamily Family
Definition Sparc.cpp:70
llvm::StringLiteral Name
Definition Sparc.cpp:67
SparcTargetInfo::CPUGeneration Generation
Definition Sparc.cpp:69