/src/llvm-project/clang/lib/Basic/Targets/CSKY.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | //===--- CSKY.cpp - Implement CSKY 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 CSKY TargetInfo objects. |
10 | | // |
11 | | //===----------------------------------------------------------------------===// |
12 | | |
13 | | #include "CSKY.h" |
14 | | |
15 | | using namespace clang; |
16 | | using namespace clang::targets; |
17 | | |
18 | 0 | bool CSKYTargetInfo::isValidCPUName(StringRef Name) const { |
19 | 0 | return llvm::CSKY::parseCPUArch(Name) != llvm::CSKY::ArchKind::INVALID; |
20 | 0 | } |
21 | | |
22 | 0 | bool CSKYTargetInfo::setCPU(const std::string &Name) { |
23 | 0 | llvm::CSKY::ArchKind archKind = llvm::CSKY::parseCPUArch(Name); |
24 | 0 | bool isValid = (archKind != llvm::CSKY::ArchKind::INVALID); |
25 | |
|
26 | 0 | if (isValid) { |
27 | 0 | CPU = Name; |
28 | 0 | Arch = archKind; |
29 | 0 | } |
30 | |
|
31 | 0 | return isValid; |
32 | 0 | } |
33 | | |
34 | | void CSKYTargetInfo::getTargetDefines(const LangOptions &Opts, |
35 | 0 | MacroBuilder &Builder) const { |
36 | 0 | Builder.defineMacro("__csky__", "2"); |
37 | 0 | Builder.defineMacro("__CSKY__", "2"); |
38 | 0 | Builder.defineMacro("__ckcore__", "2"); |
39 | 0 | Builder.defineMacro("__CKCORE__", "2"); |
40 | |
|
41 | 0 | Builder.defineMacro("__CSKYABI__", ABI == "abiv2" ? "2" : "1"); |
42 | 0 | Builder.defineMacro("__cskyabi__", ABI == "abiv2" ? "2" : "1"); |
43 | |
|
44 | 0 | StringRef ArchName = "ck810"; |
45 | 0 | StringRef CPUName = "ck810"; |
46 | |
|
47 | 0 | if (Arch != llvm::CSKY::ArchKind::INVALID) { |
48 | 0 | ArchName = llvm::CSKY::getArchName(Arch); |
49 | 0 | CPUName = CPU; |
50 | 0 | } |
51 | |
|
52 | 0 | Builder.defineMacro("__" + ArchName.upper() + "__"); |
53 | 0 | Builder.defineMacro("__" + ArchName.lower() + "__"); |
54 | 0 | if (ArchName != CPUName) { |
55 | 0 | Builder.defineMacro("__" + CPUName.upper() + "__"); |
56 | 0 | Builder.defineMacro("__" + CPUName.lower() + "__"); |
57 | 0 | } |
58 | | |
59 | | // TODO: Add support for BE if BE was supported later |
60 | 0 | StringRef endian = "__cskyLE__"; |
61 | |
|
62 | 0 | Builder.defineMacro(endian); |
63 | 0 | Builder.defineMacro(endian.upper()); |
64 | 0 | Builder.defineMacro(endian.lower()); |
65 | |
|
66 | 0 | if (DSPV2) { |
67 | 0 | StringRef dspv2 = "__CSKY_DSPV2__"; |
68 | 0 | Builder.defineMacro(dspv2); |
69 | 0 | Builder.defineMacro(dspv2.lower()); |
70 | 0 | } |
71 | |
|
72 | 0 | if (VDSPV2) { |
73 | 0 | StringRef vdspv2 = "__CSKY_VDSPV2__"; |
74 | 0 | Builder.defineMacro(vdspv2); |
75 | 0 | Builder.defineMacro(vdspv2.lower()); |
76 | |
|
77 | 0 | if (HardFloat) { |
78 | 0 | StringRef vdspv2_f = "__CSKY_VDSPV2_F__"; |
79 | 0 | Builder.defineMacro(vdspv2_f); |
80 | 0 | Builder.defineMacro(vdspv2_f.lower()); |
81 | 0 | } |
82 | 0 | } |
83 | 0 | if (VDSPV1) { |
84 | 0 | StringRef vdspv1_64 = "__CSKY_VDSP64__"; |
85 | 0 | StringRef vdspv1_128 = "__CSKY_VDSP128__"; |
86 | |
|
87 | 0 | Builder.defineMacro(vdspv1_64); |
88 | 0 | Builder.defineMacro(vdspv1_64.lower()); |
89 | 0 | Builder.defineMacro(vdspv1_128); |
90 | 0 | Builder.defineMacro(vdspv1_128.lower()); |
91 | 0 | } |
92 | 0 | if (is3E3R1) { |
93 | 0 | StringRef is3e3r1 = "__CSKY_3E3R1__"; |
94 | 0 | Builder.defineMacro(is3e3r1); |
95 | 0 | Builder.defineMacro(is3e3r1.lower()); |
96 | 0 | } |
97 | 0 | } |
98 | | |
99 | 0 | bool CSKYTargetInfo::hasFeature(StringRef Feature) const { |
100 | 0 | return llvm::StringSwitch<bool>(Feature) |
101 | 0 | .Case("hard-float", HardFloat) |
102 | 0 | .Case("hard-float-abi", HardFloatABI) |
103 | 0 | .Case("fpuv2_sf", FPUV2_SF) |
104 | 0 | .Case("fpuv2_df", FPUV2_DF) |
105 | 0 | .Case("fpuv3_sf", FPUV3_SF) |
106 | 0 | .Case("fpuv3_df", FPUV3_DF) |
107 | 0 | .Case("vdspv2", VDSPV2) |
108 | 0 | .Case("dspv2", DSPV2) |
109 | 0 | .Case("vdspv1", VDSPV1) |
110 | 0 | .Case("3e3r1", is3E3R1) |
111 | 0 | .Default(false); |
112 | 0 | } |
113 | | |
114 | | bool CSKYTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, |
115 | 0 | DiagnosticsEngine &Diags) { |
116 | 0 | for (const auto &Feature : Features) { |
117 | 0 | if (Feature == "+hard-float") |
118 | 0 | HardFloat = true; |
119 | 0 | if (Feature == "+hard-float-abi") |
120 | 0 | HardFloatABI = true; |
121 | 0 | if (Feature == "+fpuv2_sf") |
122 | 0 | FPUV2_SF = true; |
123 | 0 | if (Feature == "+fpuv2_df") |
124 | 0 | FPUV2_DF = true; |
125 | 0 | if (Feature == "+fpuv3_sf") |
126 | 0 | FPUV3_SF = true; |
127 | 0 | if (Feature == "+fpuv3_df") |
128 | 0 | FPUV3_DF = true; |
129 | 0 | if (Feature == "+vdspv2") |
130 | 0 | VDSPV2 = true; |
131 | 0 | if (Feature == "+dspv2") |
132 | 0 | DSPV2 = true; |
133 | 0 | if (Feature == "+vdspv1") |
134 | 0 | VDSPV1 = true; |
135 | 0 | if (Feature == "+3e3r1") |
136 | 0 | is3E3R1 = true; |
137 | 0 | } |
138 | |
|
139 | 0 | return true; |
140 | 0 | } |
141 | | |
142 | 0 | ArrayRef<Builtin::Info> CSKYTargetInfo::getTargetBuiltins() const { |
143 | 0 | return ArrayRef<Builtin::Info>(); |
144 | 0 | } |
145 | | |
146 | 0 | ArrayRef<const char *> CSKYTargetInfo::getGCCRegNames() const { |
147 | 0 | static const char *const GCCRegNames[] = { |
148 | | // Integer registers |
149 | 0 | "r0", |
150 | 0 | "r1", |
151 | 0 | "r2", |
152 | 0 | "r3", |
153 | 0 | "r4", |
154 | 0 | "r5", |
155 | 0 | "r6", |
156 | 0 | "r7", |
157 | 0 | "r8", |
158 | 0 | "r9", |
159 | 0 | "r10", |
160 | 0 | "r11", |
161 | 0 | "r12", |
162 | 0 | "r13", |
163 | 0 | "r14", |
164 | 0 | "r15", |
165 | 0 | "r16", |
166 | 0 | "r17", |
167 | 0 | "r18", |
168 | 0 | "r19", |
169 | 0 | "r20", |
170 | 0 | "r21", |
171 | 0 | "r22", |
172 | 0 | "r23", |
173 | 0 | "r24", |
174 | 0 | "r25", |
175 | 0 | "r26", |
176 | 0 | "r27", |
177 | 0 | "r28", |
178 | 0 | "r29", |
179 | 0 | "r30", |
180 | 0 | "r31", |
181 | | |
182 | | // Floating point registers |
183 | 0 | "fr0", |
184 | 0 | "fr1", |
185 | 0 | "fr2", |
186 | 0 | "fr3", |
187 | 0 | "fr4", |
188 | 0 | "fr5", |
189 | 0 | "fr6", |
190 | 0 | "fr7", |
191 | 0 | "fr8", |
192 | 0 | "fr9", |
193 | 0 | "fr10", |
194 | 0 | "fr11", |
195 | 0 | "fr12", |
196 | 0 | "fr13", |
197 | 0 | "fr14", |
198 | 0 | "fr15", |
199 | 0 | "fr16", |
200 | 0 | "fr17", |
201 | 0 | "fr18", |
202 | 0 | "fr19", |
203 | 0 | "fr20", |
204 | 0 | "fr21", |
205 | 0 | "fr22", |
206 | 0 | "fr23", |
207 | 0 | "fr24", |
208 | 0 | "fr25", |
209 | 0 | "fr26", |
210 | 0 | "fr27", |
211 | 0 | "fr28", |
212 | 0 | "fr29", |
213 | 0 | "fr30", |
214 | 0 | "fr31", |
215 | |
|
216 | 0 | }; |
217 | 0 | return llvm::ArrayRef(GCCRegNames); |
218 | 0 | } |
219 | | |
220 | 0 | ArrayRef<TargetInfo::GCCRegAlias> CSKYTargetInfo::getGCCRegAliases() const { |
221 | 0 | static const TargetInfo::GCCRegAlias GCCRegAliases[] = { |
222 | 0 | {{"a0"}, "r0"}, |
223 | 0 | {{"a1"}, "r1"}, |
224 | 0 | {{"a2"}, "r2"}, |
225 | 0 | {{"a3"}, "r3"}, |
226 | 0 | {{"l0"}, "r4"}, |
227 | 0 | {{"l1"}, "r5"}, |
228 | 0 | {{"l2"}, "r6"}, |
229 | 0 | {{"l3"}, "r7"}, |
230 | 0 | {{"l4"}, "r8"}, |
231 | 0 | {{"l5"}, "r9"}, |
232 | 0 | {{"l6"}, "r10"}, |
233 | 0 | {{"l7"}, "r11"}, |
234 | 0 | {{"t0"}, "r12"}, |
235 | 0 | {{"t1"}, "r13"}, |
236 | 0 | {{"sp"}, "r14"}, |
237 | 0 | {{"lr"}, "r15"}, |
238 | 0 | {{"l8"}, "r16"}, |
239 | 0 | {{"l9"}, "r17"}, |
240 | 0 | {{"t2"}, "r18"}, |
241 | 0 | {{"t3"}, "r19"}, |
242 | 0 | {{"t4"}, "r20"}, |
243 | 0 | {{"t5"}, "r21"}, |
244 | 0 | {{"t6"}, "r22"}, |
245 | 0 | {{"t7", "fp"}, "r23"}, |
246 | 0 | {{"t8", "top"}, "r24"}, |
247 | 0 | {{"t9", "bsp"}, "r25"}, |
248 | 0 | {{"r26"}, "r26"}, |
249 | 0 | {{"r27"}, "r27"}, |
250 | 0 | {{"gb", "rgb", "rdb"}, "r28"}, |
251 | 0 | {{"tb", "rtb"}, "r29"}, |
252 | 0 | {{"svbr"}, "r30"}, |
253 | 0 | {{"tls"}, "r31"}, |
254 | |
|
255 | 0 | {{"vr0"}, "fr0"}, |
256 | 0 | {{"vr1"}, "fr1"}, |
257 | 0 | {{"vr2"}, "fr2"}, |
258 | 0 | {{"vr3"}, "fr3"}, |
259 | 0 | {{"vr4"}, "fr4"}, |
260 | 0 | {{"vr5"}, "fr5"}, |
261 | 0 | {{"vr6"}, "fr6"}, |
262 | 0 | {{"vr7"}, "fr7"}, |
263 | 0 | {{"vr8"}, "fr8"}, |
264 | 0 | {{"vr9"}, "fr9"}, |
265 | 0 | {{"vr10"}, "fr10"}, |
266 | 0 | {{"vr11"}, "fr11"}, |
267 | 0 | {{"vr12"}, "fr12"}, |
268 | 0 | {{"vr13"}, "fr13"}, |
269 | 0 | {{"vr14"}, "fr14"}, |
270 | 0 | {{"vr15"}, "fr15"}, |
271 | 0 | {{"vr16"}, "fr16"}, |
272 | 0 | {{"vr17"}, "fr17"}, |
273 | 0 | {{"vr18"}, "fr18"}, |
274 | 0 | {{"vr19"}, "fr19"}, |
275 | 0 | {{"vr20"}, "fr20"}, |
276 | 0 | {{"vr21"}, "fr21"}, |
277 | 0 | {{"vr22"}, "fr22"}, |
278 | 0 | {{"vr23"}, "fr23"}, |
279 | 0 | {{"vr24"}, "fr24"}, |
280 | 0 | {{"vr25"}, "fr25"}, |
281 | 0 | {{"vr26"}, "fr26"}, |
282 | 0 | {{"vr27"}, "fr27"}, |
283 | 0 | {{"vr28"}, "fr28"}, |
284 | 0 | {{"vr29"}, "fr29"}, |
285 | 0 | {{"vr30"}, "fr30"}, |
286 | 0 | {{"vr31"}, "fr31"}, |
287 | |
|
288 | 0 | }; |
289 | 0 | return llvm::ArrayRef(GCCRegAliases); |
290 | 0 | } |
291 | | |
292 | | bool CSKYTargetInfo::validateAsmConstraint( |
293 | 0 | const char *&Name, TargetInfo::ConstraintInfo &Info) const { |
294 | 0 | switch (*Name) { |
295 | 0 | default: |
296 | 0 | return false; |
297 | 0 | case 'a': |
298 | 0 | case 'b': |
299 | 0 | case 'c': |
300 | 0 | case 'y': |
301 | 0 | case 'l': |
302 | 0 | case 'h': |
303 | 0 | case 'w': |
304 | 0 | case 'v': // A floating-point and vector register. |
305 | 0 | case 'z': |
306 | 0 | Info.setAllowsRegister(); |
307 | 0 | return true; |
308 | 0 | } |
309 | 0 | } |
310 | | |
311 | 0 | unsigned CSKYTargetInfo::getMinGlobalAlign(uint64_t Size) const { |
312 | 0 | if (Size >= 32) |
313 | 0 | return 32; |
314 | 0 | return 0; |
315 | 0 | } |