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