xref: /openbsd-src/gnu/llvm/clang/lib/Basic/Targets/AMDGPU.cpp (revision 12c855180aad702bbcca06e0398d774beeafb155)
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