/Users/buildslave/jenkins/workspace/coverage/llvm-project/clang/lib/Basic/Targets/AMDGPU.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | //===--- AMDGPU.cpp - Implement AMDGPU 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 AMDGPU TargetInfo objects. |
10 | | // |
11 | | //===----------------------------------------------------------------------===// |
12 | | |
13 | | #include "AMDGPU.h" |
14 | | #include "clang/Basic/Builtins.h" |
15 | | #include "clang/Basic/CodeGenOptions.h" |
16 | | #include "clang/Basic/LangOptions.h" |
17 | | #include "clang/Basic/MacroBuilder.h" |
18 | | #include "clang/Basic/TargetBuiltins.h" |
19 | | #include "llvm/ADT/StringSwitch.h" |
20 | | |
21 | | using namespace clang; |
22 | | using namespace clang::targets; |
23 | | |
24 | | namespace clang { |
25 | | namespace targets { |
26 | | |
27 | | // If you edit the description strings, make sure you update |
28 | | // getPointerWidthV(). |
29 | | |
30 | | static const char *const DataLayoutStringR600 = |
31 | | "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128" |
32 | | "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1"; |
33 | | |
34 | | static const char *const DataLayoutStringAMDGCN = |
35 | | "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32" |
36 | | "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128" |
37 | | "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1" |
38 | | "-ni:7"; |
39 | | |
40 | | const LangASMap AMDGPUTargetInfo::AMDGPUDefIsGenMap = { |
41 | | Generic, // Default |
42 | | Global, // opencl_global |
43 | | Local, // opencl_local |
44 | | Constant, // opencl_constant |
45 | | Private, // opencl_private |
46 | | Generic, // opencl_generic |
47 | | Global, // opencl_global_device |
48 | | Global, // opencl_global_host |
49 | | Global, // cuda_device |
50 | | Constant, // cuda_constant |
51 | | Local, // cuda_shared |
52 | | Global, // sycl_global |
53 | | Global, // sycl_global_device |
54 | | Global, // sycl_global_host |
55 | | Local, // sycl_local |
56 | | Private, // sycl_private |
57 | | Generic, // ptr32_sptr |
58 | | Generic, // ptr32_uptr |
59 | | Generic // ptr64 |
60 | | }; |
61 | | |
62 | | const LangASMap AMDGPUTargetInfo::AMDGPUDefIsPrivMap = { |
63 | | Private, // Default |
64 | | Global, // opencl_global |
65 | | Local, // opencl_local |
66 | | Constant, // opencl_constant |
67 | | Private, // opencl_private |
68 | | Generic, // opencl_generic |
69 | | Global, // opencl_global_device |
70 | | Global, // opencl_global_host |
71 | | Global, // cuda_device |
72 | | Constant, // cuda_constant |
73 | | Local, // cuda_shared |
74 | | // SYCL address space values for this map are dummy |
75 | | Generic, // sycl_global |
76 | | Generic, // sycl_global_device |
77 | | Generic, // sycl_global_host |
78 | | Generic, // sycl_local |
79 | | Generic, // sycl_private |
80 | | Generic, // ptr32_sptr |
81 | | Generic, // ptr32_uptr |
82 | | Generic // ptr64 |
83 | | |
84 | | }; |
85 | | } // namespace targets |
86 | | } // namespace clang |
87 | | |
88 | | const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = { |
89 | | #define BUILTIN(ID, TYPE, ATTRS) \ |
90 | | {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr}, |
91 | | #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \ |
92 | | {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE}, |
93 | | #include "clang/Basic/BuiltinsAMDGPU.def" |
94 | | }; |
95 | | |
96 | | const char *const AMDGPUTargetInfo::GCCRegNames[] = { |
97 | | "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", |
98 | | "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", |
99 | | "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26", |
100 | | "v27", "v28", "v29", "v30", "v31", "v32", "v33", "v34", "v35", |
101 | | "v36", "v37", "v38", "v39", "v40", "v41", "v42", "v43", "v44", |
102 | | "v45", "v46", "v47", "v48", "v49", "v50", "v51", "v52", "v53", |
103 | | "v54", "v55", "v56", "v57", "v58", "v59", "v60", "v61", "v62", |
104 | | "v63", "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71", |
105 | | "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79", "v80", |
106 | | "v81", "v82", "v83", "v84", "v85", "v86", "v87", "v88", "v89", |
107 | | "v90", "v91", "v92", "v93", "v94", "v95", "v96", "v97", "v98", |
108 | | "v99", "v100", "v101", "v102", "v103", "v104", "v105", "v106", "v107", |
109 | | "v108", "v109", "v110", "v111", "v112", "v113", "v114", "v115", "v116", |
110 | | "v117", "v118", "v119", "v120", "v121", "v122", "v123", "v124", "v125", |
111 | | "v126", "v127", "v128", "v129", "v130", "v131", "v132", "v133", "v134", |
112 | | "v135", "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143", |
113 | | "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151", "v152", |
114 | | "v153", "v154", "v155", "v156", "v157", "v158", "v159", "v160", "v161", |
115 | | "v162", "v163", "v164", "v165", "v166", "v167", "v168", "v169", "v170", |
116 | | "v171", "v172", "v173", "v174", "v175", "v176", "v177", "v178", "v179", |
117 | | "v180", "v181", "v182", "v183", "v184", "v185", "v186", "v187", "v188", |
118 | | "v189", "v190", "v191", "v192", "v193", "v194", "v195", "v196", "v197", |
119 | | "v198", "v199", "v200", "v201", "v202", "v203", "v204", "v205", "v206", |
120 | | "v207", "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215", |
121 | | "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223", "v224", |
122 | | "v225", "v226", "v227", "v228", "v229", "v230", "v231", "v232", "v233", |
123 | | "v234", "v235", "v236", "v237", "v238", "v239", "v240", "v241", "v242", |
124 | | "v243", "v244", "v245", "v246", "v247", "v248", "v249", "v250", "v251", |
125 | | "v252", "v253", "v254", "v255", "s0", "s1", "s2", "s3", "s4", |
126 | | "s5", "s6", "s7", "s8", "s9", "s10", "s11", "s12", "s13", |
127 | | "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21", "s22", |
128 | | "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31", |
129 | | "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39", "s40", |
130 | | "s41", "s42", "s43", "s44", "s45", "s46", "s47", "s48", "s49", |
131 | | "s50", "s51", "s52", "s53", "s54", "s55", "s56", "s57", "s58", |
132 | | "s59", "s60", "s61", "s62", "s63", "s64", "s65", "s66", "s67", |
133 | | "s68", "s69", "s70", "s71", "s72", "s73", "s74", "s75", "s76", |
134 | | "s77", "s78", "s79", "s80", "s81", "s82", "s83", "s84", "s85", |
135 | | "s86", "s87", "s88", "s89", "s90", "s91", "s92", "s93", "s94", |
136 | | "s95", "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103", |
137 | | "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111", "s112", |
138 | | "s113", "s114", "s115", "s116", "s117", "s118", "s119", "s120", "s121", |
139 | | "s122", "s123", "s124", "s125", "s126", "s127", "exec", "vcc", "scc", |
140 | | "m0", "flat_scratch", "exec_lo", "exec_hi", "vcc_lo", "vcc_hi", |
141 | | "flat_scratch_lo", "flat_scratch_hi", |
142 | | "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", |
143 | | "a9", "a10", "a11", "a12", "a13", "a14", "a15", "a16", "a17", |
144 | | "a18", "a19", "a20", "a21", "a22", "a23", "a24", "a25", "a26", |
145 | | "a27", "a28", "a29", "a30", "a31", "a32", "a33", "a34", "a35", |
146 | | "a36", "a37", "a38", "a39", "a40", "a41", "a42", "a43", "a44", |
147 | | "a45", "a46", "a47", "a48", "a49", "a50", "a51", "a52", "a53", |
148 | | "a54", "a55", "a56", "a57", "a58", "a59", "a60", "a61", "a62", |
149 | | "a63", "a64", "a65", "a66", "a67", "a68", "a69", "a70", "a71", |
150 | | "a72", "a73", "a74", "a75", "a76", "a77", "a78", "a79", "a80", |
151 | | "a81", "a82", "a83", "a84", "a85", "a86", "a87", "a88", "a89", |
152 | | "a90", "a91", "a92", "a93", "a94", "a95", "a96", "a97", "a98", |
153 | | "a99", "a100", "a101", "a102", "a103", "a104", "a105", "a106", "a107", |
154 | | "a108", "a109", "a110", "a111", "a112", "a113", "a114", "a115", "a116", |
155 | | "a117", "a118", "a119", "a120", "a121", "a122", "a123", "a124", "a125", |
156 | | "a126", "a127", "a128", "a129", "a130", "a131", "a132", "a133", "a134", |
157 | | "a135", "a136", "a137", "a138", "a139", "a140", "a141", "a142", "a143", |
158 | | "a144", "a145", "a146", "a147", "a148", "a149", "a150", "a151", "a152", |
159 | | "a153", "a154", "a155", "a156", "a157", "a158", "a159", "a160", "a161", |
160 | | "a162", "a163", "a164", "a165", "a166", "a167", "a168", "a169", "a170", |
161 | | "a171", "a172", "a173", "a174", "a175", "a176", "a177", "a178", "a179", |
162 | | "a180", "a181", "a182", "a183", "a184", "a185", "a186", "a187", "a188", |
163 | | "a189", "a190", "a191", "a192", "a193", "a194", "a195", "a196", "a197", |
164 | | "a198", "a199", "a200", "a201", "a202", "a203", "a204", "a205", "a206", |
165 | | "a207", "a208", "a209", "a210", "a211", "a212", "a213", "a214", "a215", |
166 | | "a216", "a217", "a218", "a219", "a220", "a221", "a222", "a223", "a224", |
167 | | "a225", "a226", "a227", "a228", "a229", "a230", "a231", "a232", "a233", |
168 | | "a234", "a235", "a236", "a237", "a238", "a239", "a240", "a241", "a242", |
169 | | "a243", "a244", "a245", "a246", "a247", "a248", "a249", "a250", "a251", |
170 | | "a252", "a253", "a254", "a255" |
171 | | }; |
172 | | |
173 | 190 | ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const { |
174 | 190 | return llvm::makeArrayRef(GCCRegNames); |
175 | 190 | } |
176 | | |
177 | | bool AMDGPUTargetInfo::initFeatureMap( |
178 | | llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU, |
179 | 599 | const std::vector<std::string> &FeatureVec) const { |
180 | | |
181 | 599 | using namespace llvm::AMDGPU; |
182 | | |
183 | | // XXX - What does the member GPU mean if device name string passed here? |
184 | 599 | if (isAMDGCN(getTriple())) { |
185 | 523 | switch (llvm::AMDGPU::parseArchAMDGCN(CPU)) { |
186 | 2 | case GK_GFX1103: |
187 | 4 | case GK_GFX1102: |
188 | 6 | case GK_GFX1101: |
189 | 11 | case GK_GFX1100: |
190 | 11 | Features["ci-insts"] = true; |
191 | 11 | Features["dot1-insts"] = true; |
192 | 11 | Features["dot5-insts"] = true; |
193 | 11 | Features["dot6-insts"] = true; |
194 | 11 | Features["dot7-insts"] = true; |
195 | 11 | Features["dot8-insts"] = true; |
196 | 11 | Features["dl-insts"] = true; |
197 | 11 | Features["flat-address-space"] = true; |
198 | 11 | Features["16-bit-insts"] = true; |
199 | 11 | Features["dpp"] = true; |
200 | 11 | Features["gfx8-insts"] = true; |
201 | 11 | Features["gfx9-insts"] = true; |
202 | 11 | Features["gfx10-insts"] = true; |
203 | 11 | Features["gfx10-3-insts"] = true; |
204 | 11 | Features["gfx11-insts"] = true; |
205 | 11 | break; |
206 | 2 | case GK_GFX1036: |
207 | 4 | case GK_GFX1035: |
208 | 6 | case GK_GFX1034: |
209 | 8 | case GK_GFX1033: |
210 | 10 | case GK_GFX1032: |
211 | 12 | case GK_GFX1031: |
212 | 21 | case GK_GFX1030: |
213 | 21 | Features["ci-insts"] = true; |
214 | 21 | Features["dot1-insts"] = true; |
215 | 21 | Features["dot2-insts"] = true; |
216 | 21 | Features["dot5-insts"] = true; |
217 | 21 | Features["dot6-insts"] = true; |
218 | 21 | Features["dot7-insts"] = true; |
219 | 21 | Features["dl-insts"] = true; |
220 | 21 | Features["flat-address-space"] = true; |
221 | 21 | Features["16-bit-insts"] = true; |
222 | 21 | Features["dpp"] = true; |
223 | 21 | Features["gfx8-insts"] = true; |
224 | 21 | Features["gfx9-insts"] = true; |
225 | 21 | Features["gfx10-insts"] = true; |
226 | 21 | Features["gfx10-3-insts"] = true; |
227 | 21 | Features["s-memrealtime"] = true; |
228 | 21 | Features["s-memtime-inst"] = true; |
229 | 21 | break; |
230 | 5 | case GK_GFX1012: |
231 | 9 | case GK_GFX1011: |
232 | 9 | Features["dot1-insts"] = true; |
233 | 9 | Features["dot2-insts"] = true; |
234 | 9 | Features["dot5-insts"] = true; |
235 | 9 | Features["dot6-insts"] = true; |
236 | 9 | Features["dot7-insts"] = true; |
237 | 9 | LLVM_FALLTHROUGH; |
238 | 11 | case GK_GFX1013: |
239 | 26 | case GK_GFX1010: |
240 | 26 | Features["dl-insts"] = true; |
241 | 26 | Features["ci-insts"] = true; |
242 | 26 | Features["flat-address-space"] = true; |
243 | 26 | Features["16-bit-insts"] = true; |
244 | 26 | Features["dpp"] = true; |
245 | 26 | Features["gfx8-insts"] = true; |
246 | 26 | Features["gfx9-insts"] = true; |
247 | 26 | Features["gfx10-insts"] = true; |
248 | 26 | Features["s-memrealtime"] = true; |
249 | 26 | Features["s-memtime-inst"] = true; |
250 | 26 | break; |
251 | 6 | case GK_GFX940: |
252 | 6 | Features["gfx940-insts"] = true; |
253 | 6 | LLVM_FALLTHROUGH; |
254 | 20 | case GK_GFX90A: |
255 | 20 | Features["gfx90a-insts"] = true; |
256 | 20 | LLVM_FALLTHROUGH; |
257 | 33 | case GK_GFX908: |
258 | 33 | Features["dot3-insts"] = true; |
259 | 33 | Features["dot4-insts"] = true; |
260 | 33 | Features["dot5-insts"] = true; |
261 | 33 | Features["dot6-insts"] = true; |
262 | 33 | Features["mai-insts"] = true; |
263 | 33 | LLVM_FALLTHROUGH; |
264 | 71 | case GK_GFX906: |
265 | 71 | Features["dl-insts"] = true; |
266 | 71 | Features["dot1-insts"] = true; |
267 | 71 | Features["dot2-insts"] = true; |
268 | 71 | Features["dot7-insts"] = true; |
269 | 71 | LLVM_FALLTHROUGH; |
270 | 73 | case GK_GFX90C: |
271 | 75 | case GK_GFX909: |
272 | 77 | case GK_GFX904: |
273 | 79 | case GK_GFX902: |
274 | 92 | case GK_GFX900: |
275 | 92 | Features["gfx9-insts"] = true; |
276 | 92 | LLVM_FALLTHROUGH; |
277 | 97 | case GK_GFX810: |
278 | 100 | case GK_GFX805: |
279 | 114 | case GK_GFX803: |
280 | 120 | case GK_GFX802: |
281 | 123 | case GK_GFX801: |
282 | 123 | Features["gfx8-insts"] = true; |
283 | 123 | Features["16-bit-insts"] = true; |
284 | 123 | Features["dpp"] = true; |
285 | 123 | Features["s-memrealtime"] = true; |
286 | 123 | LLVM_FALLTHROUGH; |
287 | 125 | case GK_GFX705: |
288 | 128 | case GK_GFX704: |
289 | 132 | case GK_GFX703: |
290 | 134 | case GK_GFX702: |
291 | 142 | case GK_GFX701: |
292 | 146 | case GK_GFX700: |
293 | 146 | Features["ci-insts"] = true; |
294 | 146 | Features["flat-address-space"] = true; |
295 | 146 | LLVM_FALLTHROUGH; |
296 | 150 | case GK_GFX602: |
297 | 156 | case GK_GFX601: |
298 | 180 | case GK_GFX600: |
299 | 180 | Features["s-memtime-inst"] = true; |
300 | 180 | break; |
301 | 285 | case GK_NONE: |
302 | 285 | break; |
303 | 0 | default: |
304 | 0 | llvm_unreachable("Unhandled GPU!"); |
305 | 523 | } |
306 | 523 | } else { |
307 | 76 | if (CPU.empty()) |
308 | 16 | CPU = "r600"; |
309 | | |
310 | 76 | switch (llvm::AMDGPU::parseArchR600(CPU)) { |
311 | 9 | case GK_CAYMAN: |
312 | 19 | case GK_CYPRESS: |
313 | 21 | case GK_RV770: |
314 | 22 | case GK_RV670: |
315 | | // TODO: Add fp64 when implemented. |
316 | 22 | break; |
317 | 7 | case GK_TURKS: |
318 | 9 | case GK_CAICOS: |
319 | 10 | case GK_BARTS: |
320 | 12 | case GK_SUMO: |
321 | 13 | case GK_REDWOOD: |
322 | 14 | case GK_JUNIPER: |
323 | 16 | case GK_CEDAR: |
324 | 17 | case GK_RV730: |
325 | 18 | case GK_RV710: |
326 | 22 | case GK_RS880: |
327 | 23 | case GK_R630: |
328 | 54 | case GK_R600: |
329 | 54 | break; |
330 | 0 | default: |
331 | 0 | llvm_unreachable("Unhandled GPU!"); |
332 | 76 | } |
333 | 76 | } |
334 | | |
335 | 599 | return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec); |
336 | 599 | } |
337 | | |
338 | | void AMDGPUTargetInfo::fillValidCPUList( |
339 | 2 | SmallVectorImpl<StringRef> &Values) const { |
340 | 2 | if (isAMDGCN(getTriple())) |
341 | 1 | llvm::AMDGPU::fillValidArchListAMDGCN(Values); |
342 | 1 | else |
343 | 1 | llvm::AMDGPU::fillValidArchListR600(Values); |
344 | 2 | } |
345 | | |
346 | 1.54k | void AMDGPUTargetInfo::setAddressSpaceMap(bool DefaultIsPrivate) { |
347 | 1.54k | AddrSpaceMap = DefaultIsPrivate ? &AMDGPUDefIsPrivMap783 : &AMDGPUDefIsGenMap761 ; |
348 | 1.54k | } |
349 | | |
350 | | AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple &Triple, |
351 | | const TargetOptions &Opts) |
352 | | : TargetInfo(Triple), |
353 | | GPUKind(isAMDGCN(Triple) ? |
354 | | llvm::AMDGPU::parseArchAMDGCN(Opts.CPU) : |
355 | | llvm::AMDGPU::parseArchR600(Opts.CPU)), |
356 | | GPUFeatures(isAMDGCN(Triple) ? |
357 | | llvm::AMDGPU::getArchAttrAMDGCN(GPUKind) : |
358 | 528 | llvm::AMDGPU::getArchAttrR600(GPUKind)) { |
359 | 528 | resetDataLayout(isAMDGCN(getTriple()) ? DataLayoutStringAMDGCN451 |
360 | 528 | : DataLayoutStringR60077 ); |
361 | | |
362 | 528 | setAddressSpaceMap(Triple.getOS() == llvm::Triple::Mesa3D || |
363 | 528 | !isAMDGCN(Triple)521 ); |
364 | 528 | UseAddrSpaceMapMangling = true; |
365 | | |
366 | 528 | HasLegalHalfType = true; |
367 | 528 | HasFloat16 = true; |
368 | 528 | WavefrontSize = GPUFeatures & llvm::AMDGPU::FEATURE_WAVE32 ? 3258 : 64470 ; |
369 | 528 | AllowAMDGPUUnsafeFPAtomics = Opts.AllowAMDGPUUnsafeFPAtomics; |
370 | | |
371 | | // Set pointer width and alignment for target address space 0. |
372 | 528 | PointerWidth = PointerAlign = getPointerWidthV(Generic); |
373 | 528 | if (getMaxPointerWidth() == 64) { |
374 | 451 | LongWidth = LongAlign = 64; |
375 | 451 | SizeType = UnsignedLong; |
376 | 451 | PtrDiffType = SignedLong; |
377 | 451 | IntPtrType = SignedLong; |
378 | 451 | } |
379 | | |
380 | 528 | MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; |
381 | 528 | } Unexecuted instantiation: clang::targets::AMDGPUTargetInfo::AMDGPUTargetInfo(llvm::Triple const&, clang::TargetOptions const&) clang::targets::AMDGPUTargetInfo::AMDGPUTargetInfo(llvm::Triple const&, clang::TargetOptions const&) Line | Count | Source | 358 | 528 | llvm::AMDGPU::getArchAttrR600(GPUKind)) { | 359 | 528 | resetDataLayout(isAMDGCN(getTriple()) ? DataLayoutStringAMDGCN451 | 360 | 528 | : DataLayoutStringR60077 ); | 361 | | | 362 | 528 | setAddressSpaceMap(Triple.getOS() == llvm::Triple::Mesa3D || | 363 | 528 | !isAMDGCN(Triple)521 ); | 364 | 528 | UseAddrSpaceMapMangling = true; | 365 | | | 366 | 528 | HasLegalHalfType = true; | 367 | 528 | HasFloat16 = true; | 368 | 528 | WavefrontSize = GPUFeatures & llvm::AMDGPU::FEATURE_WAVE32 ? 3258 : 64470 ; | 369 | 528 | AllowAMDGPUUnsafeFPAtomics = Opts.AllowAMDGPUUnsafeFPAtomics; | 370 | | | 371 | | // Set pointer width and alignment for target address space 0. | 372 | 528 | PointerWidth = PointerAlign = getPointerWidthV(Generic); | 373 | 528 | if (getMaxPointerWidth() == 64) { | 374 | 451 | LongWidth = LongAlign = 64; | 375 | 451 | SizeType = UnsignedLong; | 376 | 451 | PtrDiffType = SignedLong; | 377 | 451 | IntPtrType = SignedLong; | 378 | 451 | } | 379 | | | 380 | 528 | MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; | 381 | 528 | } |
|
382 | | |
383 | 1.01k | void AMDGPUTargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts) { |
384 | 1.01k | TargetInfo::adjust(Diags, Opts); |
385 | | // ToDo: There are still a few places using default address space as private |
386 | | // address space in OpenCL, which needs to be cleaned up, then Opts.OpenCL |
387 | | // can be removed from the following line. |
388 | 1.01k | setAddressSpaceMap(/*DefaultIsPrivate=*/Opts.OpenCL || |
389 | 1.01k | !isAMDGCN(getTriple())330 ); |
390 | 1.01k | } |
391 | | |
392 | 522 | ArrayRef<Builtin::Info> AMDGPUTargetInfo::getTargetBuiltins() const { |
393 | 522 | return llvm::makeArrayRef(BuiltinInfo, clang::AMDGPU::LastTSBuiltin - |
394 | 522 | Builtin::FirstTSBuiltin); |
395 | 522 | } |
396 | | |
397 | | void AMDGPUTargetInfo::getTargetDefines(const LangOptions &Opts, |
398 | 522 | MacroBuilder &Builder) const { |
399 | 522 | Builder.defineMacro("__AMD__"); |
400 | 522 | Builder.defineMacro("__AMDGPU__"); |
401 | | |
402 | 522 | if (isAMDGCN(getTriple())) |
403 | 447 | Builder.defineMacro("__AMDGCN__"); |
404 | 75 | else |
405 | 75 | Builder.defineMacro("__R600__"); |
406 | | |
407 | 522 | if (GPUKind != llvm::AMDGPU::GK_NONE) { |
408 | 282 | StringRef CanonName = isAMDGCN(getTriple()) ? |
409 | 222 | getArchNameAMDGCN(GPUKind) : getArchNameR600(GPUKind)60 ; |
410 | 282 | Builder.defineMacro(Twine("__") + Twine(CanonName) + Twine("__")); |
411 | | // Emit macros for gfx family e.g. gfx906 -> __GFX9__, gfx1030 -> __GFX10___ |
412 | 282 | if (isAMDGCN(getTriple())) { |
413 | 222 | assert(CanonName.startswith("gfx") && "Invalid amdgcn canonical name"); |
414 | 0 | Builder.defineMacro(Twine("__") + Twine(CanonName.drop_back(2).upper()) + |
415 | 222 | Twine("__")); |
416 | 222 | } |
417 | 282 | if (isAMDGCN(getTriple())) { |
418 | 222 | Builder.defineMacro("__amdgcn_processor__", |
419 | 222 | Twine("\"") + Twine(CanonName) + Twine("\"")); |
420 | 222 | Builder.defineMacro("__amdgcn_target_id__", |
421 | 222 | Twine("\"") + Twine(*getTargetID()) + Twine("\"")); |
422 | 222 | for (auto F : getAllPossibleTargetIDFeatures(getTriple(), CanonName)) { |
423 | 193 | auto Loc = OffloadArchFeatures.find(F); |
424 | 193 | if (Loc != OffloadArchFeatures.end()) { |
425 | 8 | std::string NewF = F.str(); |
426 | 8 | std::replace(NewF.begin(), NewF.end(), '-', '_'); |
427 | 8 | Builder.defineMacro(Twine("__amdgcn_feature_") + Twine(NewF) + |
428 | 8 | Twine("__"), |
429 | 8 | Loc->second ? "1"4 : "0"4 ); |
430 | 8 | } |
431 | 193 | } |
432 | 222 | } |
433 | 282 | } |
434 | | |
435 | 522 | if (AllowAMDGPUUnsafeFPAtomics) |
436 | 5 | Builder.defineMacro("__AMDGCN_UNSAFE_FP_ATOMICS__"); |
437 | | |
438 | | // TODO: __HAS_FMAF__, __HAS_LDEXPF__, __HAS_FP64__ are deprecated and will be |
439 | | // removed in the near future. |
440 | 522 | if (hasFMAF()) |
441 | 466 | Builder.defineMacro("__HAS_FMAF__"); |
442 | 522 | if (hasFastFMAF()) |
443 | 396 | Builder.defineMacro("FP_FAST_FMAF"); |
444 | 522 | if (hasLDEXPF()) |
445 | 447 | Builder.defineMacro("__HAS_LDEXPF__"); |
446 | 522 | if (hasFP64()) |
447 | 447 | Builder.defineMacro("__HAS_FP64__"); |
448 | 522 | if (hasFastFMA()) |
449 | 447 | Builder.defineMacro("FP_FAST_FMA"); |
450 | | |
451 | 522 | Builder.defineMacro("__AMDGCN_WAVEFRONT_SIZE", Twine(WavefrontSize)); |
452 | 522 | } |
453 | | |
454 | 35 | void AMDGPUTargetInfo::setAuxTarget(const TargetInfo *Aux) { |
455 | 35 | assert(HalfFormat == Aux->HalfFormat); |
456 | 0 | assert(FloatFormat == Aux->FloatFormat); |
457 | 0 | assert(DoubleFormat == Aux->DoubleFormat); |
458 | | |
459 | | // On x86_64 long double is 80-bit extended precision format, which is |
460 | | // not supported by AMDGPU. 128-bit floating point format is also not |
461 | | // supported by AMDGPU. Therefore keep its own format for these two types. |
462 | 0 | auto SaveLongDoubleFormat = LongDoubleFormat; |
463 | 35 | auto SaveFloat128Format = Float128Format; |
464 | 35 | auto SaveLongDoubleWidth = LongDoubleWidth; |
465 | 35 | auto SaveLongDoubleAlign = LongDoubleAlign; |
466 | 35 | copyAuxTarget(Aux); |
467 | 35 | LongDoubleFormat = SaveLongDoubleFormat; |
468 | 35 | Float128Format = SaveFloat128Format; |
469 | 35 | LongDoubleWidth = SaveLongDoubleWidth; |
470 | 35 | LongDoubleAlign = SaveLongDoubleAlign; |
471 | | // For certain builtin types support on the host target, claim they are |
472 | | // support to pass the compilation of the host code during the device-side |
473 | | // compilation. |
474 | | // FIXME: As the side effect, we also accept `__float128` uses in the device |
475 | | // code. To rejct these builtin types supported in the host target but not in |
476 | | // the device target, one approach would support `device_builtin` attribute |
477 | | // so that we could tell the device builtin types from the host ones. The |
478 | | // also solves the different representations of the same builtin type, such |
479 | | // as `size_t` in the MSVC environment. |
480 | 35 | if (Aux->hasFloat128Type()) { |
481 | 11 | HasFloat128 = true; |
482 | 11 | Float128Format = DoubleFormat; |
483 | 11 | } |
484 | 35 | } |