blob: ed28bf2d435c650ade06d46ab2186396f619f585 [file] [log] [blame]
Erich Keaneebba5922017-07-21 22:37:03 +00001//===--- Sparc.cpp - Implement Sparc target feature support ---------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements Sparc TargetInfo objects.
11//
12//===----------------------------------------------------------------------===//
13
14#include "Sparc.h"
15#include "Targets.h"
16#include "clang/Basic/MacroBuilder.h"
17#include "llvm/ADT/StringSwitch.h"
18
19using namespace clang;
20using namespace clang::targets;
21
22const char *const SparcTargetInfo::GCCRegNames[] = {
23 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
24 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
25 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
26};
27
28ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
29 return llvm::makeArrayRef(GCCRegNames);
30}
31
32const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
33 {{"g0"}, "r0"}, {{"g1"}, "r1"}, {{"g2"}, "r2"}, {{"g3"}, "r3"},
34 {{"g4"}, "r4"}, {{"g5"}, "r5"}, {{"g6"}, "r6"}, {{"g7"}, "r7"},
35 {{"o0"}, "r8"}, {{"o1"}, "r9"}, {{"o2"}, "r10"}, {{"o3"}, "r11"},
36 {{"o4"}, "r12"}, {{"o5"}, "r13"}, {{"o6", "sp"}, "r14"}, {{"o7"}, "r15"},
37 {{"l0"}, "r16"}, {{"l1"}, "r17"}, {{"l2"}, "r18"}, {{"l3"}, "r19"},
38 {{"l4"}, "r20"}, {{"l5"}, "r21"}, {{"l6"}, "r22"}, {{"l7"}, "r23"},
39 {{"i0"}, "r24"}, {{"i1"}, "r25"}, {{"i2"}, "r26"}, {{"i3"}, "r27"},
40 {{"i4"}, "r28"}, {{"i5"}, "r29"}, {{"i6", "fp"}, "r30"}, {{"i7"}, "r31"},
41};
42
43ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
44 return llvm::makeArrayRef(GCCRegAliases);
45}
46
47bool SparcTargetInfo::hasFeature(StringRef Feature) const {
48 return llvm::StringSwitch<bool>(Feature)
49 .Case("softfloat", SoftFloat)
50 .Case("sparc", true)
51 .Default(false);
52}
53
54SparcTargetInfo::CPUKind SparcTargetInfo::getCPUKind(StringRef Name) const {
55 return llvm::StringSwitch<CPUKind>(Name)
56 .Case("v8", CK_V8)
57 .Case("supersparc", CK_SUPERSPARC)
58 .Case("sparclite", CK_SPARCLITE)
59 .Case("f934", CK_F934)
60 .Case("hypersparc", CK_HYPERSPARC)
61 .Case("sparclite86x", CK_SPARCLITE86X)
62 .Case("sparclet", CK_SPARCLET)
63 .Case("tsc701", CK_TSC701)
64 .Case("v9", CK_V9)
65 .Case("ultrasparc", CK_ULTRASPARC)
66 .Case("ultrasparc3", CK_ULTRASPARC3)
67 .Case("niagara", CK_NIAGARA)
68 .Case("niagara2", CK_NIAGARA2)
69 .Case("niagara3", CK_NIAGARA3)
70 .Case("niagara4", CK_NIAGARA4)
71 .Case("ma2100", CK_MYRIAD2100)
72 .Case("ma2150", CK_MYRIAD2150)
Walter Leefc7f8f22017-10-02 18:50:57 +000073 .Case("ma2155", CK_MYRIAD2155)
Erich Keaneebba5922017-07-21 22:37:03 +000074 .Case("ma2450", CK_MYRIAD2450)
Walter Leefc7f8f22017-10-02 18:50:57 +000075 .Case("ma2455", CK_MYRIAD2455)
76 .Case("ma2x5x", CK_MYRIAD2x5x)
77 .Case("ma2080", CK_MYRIAD2080)
78 .Case("ma2085", CK_MYRIAD2085)
79 .Case("ma2480", CK_MYRIAD2480)
80 .Case("ma2485", CK_MYRIAD2485)
81 .Case("ma2x8x", CK_MYRIAD2x8x)
Erich Keaneebba5922017-07-21 22:37:03 +000082 // FIXME: the myriad2[.n] spellings are obsolete,
83 // but a grace period is needed to allow updating dependent builds.
Walter Leefc7f8f22017-10-02 18:50:57 +000084 .Case("myriad2", CK_MYRIAD2x5x)
Erich Keaneebba5922017-07-21 22:37:03 +000085 .Case("myriad2.1", CK_MYRIAD2100)
Walter Leefc7f8f22017-10-02 18:50:57 +000086 .Case("myriad2.2", CK_MYRIAD2x5x)
87 .Case("myriad2.3", CK_MYRIAD2x8x)
Erich Keaneebba5922017-07-21 22:37:03 +000088 .Case("leon2", CK_LEON2)
89 .Case("at697e", CK_LEON2_AT697E)
90 .Case("at697f", CK_LEON2_AT697F)
91 .Case("leon3", CK_LEON3)
92 .Case("ut699", CK_LEON3_UT699)
93 .Case("gr712rc", CK_LEON3_GR712RC)
94 .Case("leon4", CK_LEON4)
95 .Case("gr740", CK_LEON4_GR740)
96 .Default(CK_GENERIC);
97}
98
99void SparcTargetInfo::getTargetDefines(const LangOptions &Opts,
100 MacroBuilder &Builder) const {
101 DefineStd(Builder, "sparc", Opts);
102 Builder.defineMacro("__REGISTER_PREFIX__", "");
103
104 if (SoftFloat)
105 Builder.defineMacro("SOFT_FLOAT", "1");
106}
107
108void SparcV8TargetInfo::getTargetDefines(const LangOptions &Opts,
109 MacroBuilder &Builder) const {
110 SparcTargetInfo::getTargetDefines(Opts, Builder);
111 switch (getCPUGeneration(CPU)) {
112 case CG_V8:
113 Builder.defineMacro("__sparcv8");
114 if (getTriple().getOS() != llvm::Triple::Solaris)
115 Builder.defineMacro("__sparcv8__");
116 break;
117 case CG_V9:
118 Builder.defineMacro("__sparcv9");
119 if (getTriple().getOS() != llvm::Triple::Solaris) {
120 Builder.defineMacro("__sparcv9__");
121 Builder.defineMacro("__sparc_v9__");
122 }
123 break;
124 }
125 if (getTriple().getVendor() == llvm::Triple::Myriad) {
126 std::string MyriadArchValue, Myriad2Value;
127 Builder.defineMacro("__sparc_v8__");
128 Builder.defineMacro("__leon__");
129 switch (CPU) {
Walter Leefc7f8f22017-10-02 18:50:57 +0000130 case CK_MYRIAD2100:
131 MyriadArchValue = "__ma2100";
132 Myriad2Value = "1";
133 break;
Erich Keaneebba5922017-07-21 22:37:03 +0000134 case CK_MYRIAD2150:
135 MyriadArchValue = "__ma2150";
136 Myriad2Value = "2";
137 break;
Walter Leefc7f8f22017-10-02 18:50:57 +0000138 case CK_MYRIAD2155:
139 MyriadArchValue = "__ma2155";
140 Myriad2Value = "2";
141 break;
Erich Keaneebba5922017-07-21 22:37:03 +0000142 case CK_MYRIAD2450:
143 MyriadArchValue = "__ma2450";
144 Myriad2Value = "2";
145 break;
Walter Leefc7f8f22017-10-02 18:50:57 +0000146 case CK_MYRIAD2455:
147 MyriadArchValue = "__ma2455";
148 Myriad2Value = "2";
149 break;
150 case CK_MYRIAD2x5x:
151 Myriad2Value = "2";
152 break;
153 case CK_MYRIAD2080:
154 MyriadArchValue = "__ma2080";
155 Myriad2Value = "3";
156 break;
157 case CK_MYRIAD2085:
158 MyriadArchValue = "__ma2085";
159 Myriad2Value = "3";
160 break;
161 case CK_MYRIAD2480:
162 MyriadArchValue = "__ma2480";
163 Myriad2Value = "3";
164 break;
165 case CK_MYRIAD2485:
166 MyriadArchValue = "__ma2485";
167 Myriad2Value = "3";
168 break;
169 case CK_MYRIAD2x8x:
170 Myriad2Value = "3";
171 break;
Erich Keaneebba5922017-07-21 22:37:03 +0000172 default:
173 MyriadArchValue = "__ma2100";
174 Myriad2Value = "1";
175 break;
176 }
Walter Leefc7f8f22017-10-02 18:50:57 +0000177 if (!MyriadArchValue.empty()) {
178 Builder.defineMacro(MyriadArchValue, "1");
179 Builder.defineMacro(MyriadArchValue + "__", "1");
180 }
Walter Lee637aafc2018-02-06 22:39:47 +0000181 if (Myriad2Value == "2") {
182 Builder.defineMacro("__ma2x5x", "1");
183 Builder.defineMacro("__ma2x5x__", "1");
184 } else if (Myriad2Value == "3") {
185 Builder.defineMacro("__ma2x8x", "1");
186 Builder.defineMacro("__ma2x8x__", "1");
187 }
Erich Keaneebba5922017-07-21 22:37:03 +0000188 Builder.defineMacro("__myriad2__", Myriad2Value);
189 Builder.defineMacro("__myriad2", Myriad2Value);
190 }
191}
192
193void SparcV9TargetInfo::getTargetDefines(const LangOptions &Opts,
194 MacroBuilder &Builder) const {
195 SparcTargetInfo::getTargetDefines(Opts, Builder);
196 Builder.defineMacro("__sparcv9");
197 Builder.defineMacro("__arch64__");
198 // Solaris doesn't need these variants, but the BSDs do.
199 if (getTriple().getOS() != llvm::Triple::Solaris) {
200 Builder.defineMacro("__sparc64__");
201 Builder.defineMacro("__sparc_v9__");
202 Builder.defineMacro("__sparcv9__");
203 }
204}