xref: /freebsd/contrib/llvm-project/clang/lib/Basic/Targets/AMDGPU.cpp (revision e8d8bef961a50d4dc22501cde4fb9fb0be1b2532)
10b57cec5SDimitry Andric //===--- AMDGPU.cpp - Implement AMDGPU target feature support -------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file implements AMDGPU TargetInfo objects.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #include "AMDGPU.h"
140b57cec5SDimitry Andric #include "clang/Basic/Builtins.h"
150b57cec5SDimitry Andric #include "clang/Basic/CodeGenOptions.h"
160b57cec5SDimitry Andric #include "clang/Basic/LangOptions.h"
170b57cec5SDimitry Andric #include "clang/Basic/MacroBuilder.h"
180b57cec5SDimitry Andric #include "clang/Basic/TargetBuiltins.h"
190b57cec5SDimitry Andric #include "llvm/ADT/StringSwitch.h"
205ffd83dbSDimitry Andric #include "llvm/Frontend/OpenMP/OMPGridValues.h"
21a7dea167SDimitry Andric #include "llvm/IR/DataLayout.h"
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric using namespace clang;
240b57cec5SDimitry Andric using namespace clang::targets;
250b57cec5SDimitry Andric 
260b57cec5SDimitry Andric namespace clang {
270b57cec5SDimitry Andric namespace targets {
280b57cec5SDimitry Andric 
290b57cec5SDimitry Andric // If you edit the description strings, make sure you update
300b57cec5SDimitry Andric // getPointerWidthV().
310b57cec5SDimitry Andric 
320b57cec5SDimitry Andric static const char *const DataLayoutStringR600 =
330b57cec5SDimitry Andric     "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
34*e8d8bef9SDimitry Andric     "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1";
350b57cec5SDimitry Andric 
360b57cec5SDimitry Andric static const char *const DataLayoutStringAMDGCN =
370b57cec5SDimitry Andric     "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32"
380b57cec5SDimitry Andric     "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
39*e8d8bef9SDimitry Andric     "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1"
400b57cec5SDimitry Andric     "-ni:7";
410b57cec5SDimitry Andric 
420b57cec5SDimitry Andric const LangASMap AMDGPUTargetInfo::AMDGPUDefIsGenMap = {
430b57cec5SDimitry Andric     Generic,  // Default
440b57cec5SDimitry Andric     Global,   // opencl_global
450b57cec5SDimitry Andric     Local,    // opencl_local
460b57cec5SDimitry Andric     Constant, // opencl_constant
470b57cec5SDimitry Andric     Private,  // opencl_private
480b57cec5SDimitry Andric     Generic,  // opencl_generic
49*e8d8bef9SDimitry Andric     Global,   // opencl_global_device
50*e8d8bef9SDimitry Andric     Global,   // opencl_global_host
510b57cec5SDimitry Andric     Global,   // cuda_device
520b57cec5SDimitry Andric     Constant, // cuda_constant
53480093f4SDimitry Andric     Local,    // cuda_shared
54480093f4SDimitry Andric     Generic,  // ptr32_sptr
55480093f4SDimitry Andric     Generic,  // ptr32_uptr
56480093f4SDimitry Andric     Generic   // ptr64
570b57cec5SDimitry Andric };
580b57cec5SDimitry Andric 
590b57cec5SDimitry Andric const LangASMap AMDGPUTargetInfo::AMDGPUDefIsPrivMap = {
600b57cec5SDimitry Andric     Private,  // Default
610b57cec5SDimitry Andric     Global,   // opencl_global
620b57cec5SDimitry Andric     Local,    // opencl_local
630b57cec5SDimitry Andric     Constant, // opencl_constant
640b57cec5SDimitry Andric     Private,  // opencl_private
650b57cec5SDimitry Andric     Generic,  // opencl_generic
66*e8d8bef9SDimitry Andric     Global,   // opencl_global_device
67*e8d8bef9SDimitry Andric     Global,   // opencl_global_host
680b57cec5SDimitry Andric     Global,   // cuda_device
690b57cec5SDimitry Andric     Constant, // cuda_constant
70480093f4SDimitry Andric     Local,    // cuda_shared
71480093f4SDimitry Andric     Generic,  // ptr32_sptr
72480093f4SDimitry Andric     Generic,  // ptr32_uptr
73480093f4SDimitry Andric     Generic   // ptr64
74480093f4SDimitry Andric 
750b57cec5SDimitry Andric };
760b57cec5SDimitry Andric } // namespace targets
770b57cec5SDimitry Andric } // namespace clang
780b57cec5SDimitry Andric 
790b57cec5SDimitry Andric const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
800b57cec5SDimitry Andric #define BUILTIN(ID, TYPE, ATTRS)                                               \
810b57cec5SDimitry Andric   {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
820b57cec5SDimitry Andric #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE)                               \
830b57cec5SDimitry Andric   {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE},
840b57cec5SDimitry Andric #include "clang/Basic/BuiltinsAMDGPU.def"
850b57cec5SDimitry Andric };
860b57cec5SDimitry Andric 
870b57cec5SDimitry Andric const char *const AMDGPUTargetInfo::GCCRegNames[] = {
880b57cec5SDimitry Andric   "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8",
890b57cec5SDimitry Andric   "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17",
900b57cec5SDimitry Andric   "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26",
910b57cec5SDimitry Andric   "v27", "v28", "v29", "v30", "v31", "v32", "v33", "v34", "v35",
920b57cec5SDimitry Andric   "v36", "v37", "v38", "v39", "v40", "v41", "v42", "v43", "v44",
930b57cec5SDimitry Andric   "v45", "v46", "v47", "v48", "v49", "v50", "v51", "v52", "v53",
940b57cec5SDimitry Andric   "v54", "v55", "v56", "v57", "v58", "v59", "v60", "v61", "v62",
950b57cec5SDimitry Andric   "v63", "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
960b57cec5SDimitry Andric   "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79", "v80",
970b57cec5SDimitry Andric   "v81", "v82", "v83", "v84", "v85", "v86", "v87", "v88", "v89",
980b57cec5SDimitry Andric   "v90", "v91", "v92", "v93", "v94", "v95", "v96", "v97", "v98",
990b57cec5SDimitry Andric   "v99", "v100", "v101", "v102", "v103", "v104", "v105", "v106", "v107",
1000b57cec5SDimitry Andric   "v108", "v109", "v110", "v111", "v112", "v113", "v114", "v115", "v116",
1010b57cec5SDimitry Andric   "v117", "v118", "v119", "v120", "v121", "v122", "v123", "v124", "v125",
1020b57cec5SDimitry Andric   "v126", "v127", "v128", "v129", "v130", "v131", "v132", "v133", "v134",
1030b57cec5SDimitry Andric   "v135", "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1040b57cec5SDimitry Andric   "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151", "v152",
1050b57cec5SDimitry Andric   "v153", "v154", "v155", "v156", "v157", "v158", "v159", "v160", "v161",
1060b57cec5SDimitry Andric   "v162", "v163", "v164", "v165", "v166", "v167", "v168", "v169", "v170",
1070b57cec5SDimitry Andric   "v171", "v172", "v173", "v174", "v175", "v176", "v177", "v178", "v179",
1080b57cec5SDimitry Andric   "v180", "v181", "v182", "v183", "v184", "v185", "v186", "v187", "v188",
1090b57cec5SDimitry Andric   "v189", "v190", "v191", "v192", "v193", "v194", "v195", "v196", "v197",
1100b57cec5SDimitry Andric   "v198", "v199", "v200", "v201", "v202", "v203", "v204", "v205", "v206",
1110b57cec5SDimitry Andric   "v207", "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1120b57cec5SDimitry Andric   "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223", "v224",
1130b57cec5SDimitry Andric   "v225", "v226", "v227", "v228", "v229", "v230", "v231", "v232", "v233",
1140b57cec5SDimitry Andric   "v234", "v235", "v236", "v237", "v238", "v239", "v240", "v241", "v242",
1150b57cec5SDimitry Andric   "v243", "v244", "v245", "v246", "v247", "v248", "v249", "v250", "v251",
1160b57cec5SDimitry Andric   "v252", "v253", "v254", "v255", "s0", "s1", "s2", "s3", "s4",
1170b57cec5SDimitry Andric   "s5", "s6", "s7", "s8", "s9", "s10", "s11", "s12", "s13",
1180b57cec5SDimitry Andric   "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21", "s22",
1190b57cec5SDimitry Andric   "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1200b57cec5SDimitry Andric   "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39", "s40",
1210b57cec5SDimitry Andric   "s41", "s42", "s43", "s44", "s45", "s46", "s47", "s48", "s49",
1220b57cec5SDimitry Andric   "s50", "s51", "s52", "s53", "s54", "s55", "s56", "s57", "s58",
1230b57cec5SDimitry Andric   "s59", "s60", "s61", "s62", "s63", "s64", "s65", "s66", "s67",
1240b57cec5SDimitry Andric   "s68", "s69", "s70", "s71", "s72", "s73", "s74", "s75", "s76",
1250b57cec5SDimitry Andric   "s77", "s78", "s79", "s80", "s81", "s82", "s83", "s84", "s85",
1260b57cec5SDimitry Andric   "s86", "s87", "s88", "s89", "s90", "s91", "s92", "s93", "s94",
1270b57cec5SDimitry Andric   "s95", "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
1280b57cec5SDimitry Andric   "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111", "s112",
1290b57cec5SDimitry Andric   "s113", "s114", "s115", "s116", "s117", "s118", "s119", "s120", "s121",
1300b57cec5SDimitry Andric   "s122", "s123", "s124", "s125", "s126", "s127", "exec", "vcc", "scc",
1310b57cec5SDimitry Andric   "m0", "flat_scratch", "exec_lo", "exec_hi", "vcc_lo", "vcc_hi",
1325ffd83dbSDimitry Andric   "flat_scratch_lo", "flat_scratch_hi",
1335ffd83dbSDimitry Andric   "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8",
1345ffd83dbSDimitry Andric   "a9", "a10", "a11", "a12", "a13", "a14", "a15", "a16", "a17",
1355ffd83dbSDimitry Andric   "a18", "a19", "a20", "a21", "a22", "a23", "a24", "a25", "a26",
1365ffd83dbSDimitry Andric   "a27", "a28", "a29", "a30", "a31", "a32", "a33", "a34", "a35",
1375ffd83dbSDimitry Andric   "a36", "a37", "a38", "a39", "a40", "a41", "a42", "a43", "a44",
1385ffd83dbSDimitry Andric   "a45", "a46", "a47", "a48", "a49", "a50", "a51", "a52", "a53",
1395ffd83dbSDimitry Andric   "a54", "a55", "a56", "a57", "a58", "a59", "a60", "a61", "a62",
1405ffd83dbSDimitry Andric   "a63", "a64", "a65", "a66", "a67", "a68", "a69", "a70", "a71",
1415ffd83dbSDimitry Andric   "a72", "a73", "a74", "a75", "a76", "a77", "a78", "a79", "a80",
1425ffd83dbSDimitry Andric   "a81", "a82", "a83", "a84", "a85", "a86", "a87", "a88", "a89",
1435ffd83dbSDimitry Andric   "a90", "a91", "a92", "a93", "a94", "a95", "a96", "a97", "a98",
1445ffd83dbSDimitry Andric   "a99", "a100", "a101", "a102", "a103", "a104", "a105", "a106", "a107",
1455ffd83dbSDimitry Andric   "a108", "a109", "a110", "a111", "a112", "a113", "a114", "a115", "a116",
1465ffd83dbSDimitry Andric   "a117", "a118", "a119", "a120", "a121", "a122", "a123", "a124", "a125",
1475ffd83dbSDimitry Andric   "a126", "a127", "a128", "a129", "a130", "a131", "a132", "a133", "a134",
1485ffd83dbSDimitry Andric   "a135", "a136", "a137", "a138", "a139", "a140", "a141", "a142", "a143",
1495ffd83dbSDimitry Andric   "a144", "a145", "a146", "a147", "a148", "a149", "a150", "a151", "a152",
1505ffd83dbSDimitry Andric   "a153", "a154", "a155", "a156", "a157", "a158", "a159", "a160", "a161",
1515ffd83dbSDimitry Andric   "a162", "a163", "a164", "a165", "a166", "a167", "a168", "a169", "a170",
1525ffd83dbSDimitry Andric   "a171", "a172", "a173", "a174", "a175", "a176", "a177", "a178", "a179",
1535ffd83dbSDimitry Andric   "a180", "a181", "a182", "a183", "a184", "a185", "a186", "a187", "a188",
1545ffd83dbSDimitry Andric   "a189", "a190", "a191", "a192", "a193", "a194", "a195", "a196", "a197",
1555ffd83dbSDimitry Andric   "a198", "a199", "a200", "a201", "a202", "a203", "a204", "a205", "a206",
1565ffd83dbSDimitry Andric   "a207", "a208", "a209", "a210", "a211", "a212", "a213", "a214", "a215",
1575ffd83dbSDimitry Andric   "a216", "a217", "a218", "a219", "a220", "a221", "a222", "a223", "a224",
1585ffd83dbSDimitry Andric   "a225", "a226", "a227", "a228", "a229", "a230", "a231", "a232", "a233",
1595ffd83dbSDimitry Andric   "a234", "a235", "a236", "a237", "a238", "a239", "a240", "a241", "a242",
1605ffd83dbSDimitry Andric   "a243", "a244", "a245", "a246", "a247", "a248", "a249", "a250", "a251",
1615ffd83dbSDimitry Andric   "a252", "a253", "a254", "a255"
1620b57cec5SDimitry Andric };
1630b57cec5SDimitry Andric 
1640b57cec5SDimitry Andric ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
1650b57cec5SDimitry Andric   return llvm::makeArrayRef(GCCRegNames);
1660b57cec5SDimitry Andric }
1670b57cec5SDimitry Andric 
1680b57cec5SDimitry Andric bool AMDGPUTargetInfo::initFeatureMap(
1690b57cec5SDimitry Andric     llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1700b57cec5SDimitry Andric     const std::vector<std::string> &FeatureVec) const {
1710b57cec5SDimitry Andric 
1720b57cec5SDimitry Andric   using namespace llvm::AMDGPU;
1730b57cec5SDimitry Andric 
1740b57cec5SDimitry Andric   // XXX - What does the member GPU mean if device name string passed here?
1750b57cec5SDimitry Andric   if (isAMDGCN(getTriple())) {
1760b57cec5SDimitry Andric     switch (llvm::AMDGPU::parseArchAMDGCN(CPU)) {
177*e8d8bef9SDimitry Andric     case GK_GFX1033:
178*e8d8bef9SDimitry Andric     case GK_GFX1032:
179*e8d8bef9SDimitry Andric     case GK_GFX1031:
1805ffd83dbSDimitry Andric     case GK_GFX1030:
1815ffd83dbSDimitry Andric       Features["ci-insts"] = true;
1825ffd83dbSDimitry Andric       Features["dot1-insts"] = true;
1835ffd83dbSDimitry Andric       Features["dot2-insts"] = true;
1845ffd83dbSDimitry Andric       Features["dot5-insts"] = true;
1855ffd83dbSDimitry Andric       Features["dot6-insts"] = true;
1865ffd83dbSDimitry Andric       Features["dl-insts"] = true;
1875ffd83dbSDimitry Andric       Features["flat-address-space"] = true;
1885ffd83dbSDimitry Andric       Features["16-bit-insts"] = true;
1895ffd83dbSDimitry Andric       Features["dpp"] = true;
1905ffd83dbSDimitry Andric       Features["gfx8-insts"] = true;
1915ffd83dbSDimitry Andric       Features["gfx9-insts"] = true;
1925ffd83dbSDimitry Andric       Features["gfx10-insts"] = true;
1935ffd83dbSDimitry Andric       Features["gfx10-3-insts"] = true;
1945ffd83dbSDimitry Andric       Features["s-memrealtime"] = true;
1955ffd83dbSDimitry Andric       break;
1960b57cec5SDimitry Andric     case GK_GFX1012:
1970b57cec5SDimitry Andric     case GK_GFX1011:
1980b57cec5SDimitry Andric       Features["dot1-insts"] = true;
1990b57cec5SDimitry Andric       Features["dot2-insts"] = true;
2000b57cec5SDimitry Andric       Features["dot5-insts"] = true;
2010b57cec5SDimitry Andric       Features["dot6-insts"] = true;
2020b57cec5SDimitry Andric       LLVM_FALLTHROUGH;
2030b57cec5SDimitry Andric     case GK_GFX1010:
2040b57cec5SDimitry Andric       Features["dl-insts"] = true;
2050b57cec5SDimitry Andric       Features["ci-insts"] = true;
206a7dea167SDimitry Andric       Features["flat-address-space"] = true;
2070b57cec5SDimitry Andric       Features["16-bit-insts"] = true;
2080b57cec5SDimitry Andric       Features["dpp"] = true;
2090b57cec5SDimitry Andric       Features["gfx8-insts"] = true;
2100b57cec5SDimitry Andric       Features["gfx9-insts"] = true;
2110b57cec5SDimitry Andric       Features["gfx10-insts"] = true;
2120b57cec5SDimitry Andric       Features["s-memrealtime"] = true;
2130b57cec5SDimitry Andric       break;
2140b57cec5SDimitry Andric     case GK_GFX908:
2150b57cec5SDimitry Andric       Features["dot3-insts"] = true;
2160b57cec5SDimitry Andric       Features["dot4-insts"] = true;
2170b57cec5SDimitry Andric       Features["dot5-insts"] = true;
2180b57cec5SDimitry Andric       Features["dot6-insts"] = true;
2195ffd83dbSDimitry Andric       Features["mai-insts"] = true;
2200b57cec5SDimitry Andric       LLVM_FALLTHROUGH;
2210b57cec5SDimitry Andric     case GK_GFX906:
2220b57cec5SDimitry Andric       Features["dl-insts"] = true;
2230b57cec5SDimitry Andric       Features["dot1-insts"] = true;
2240b57cec5SDimitry Andric       Features["dot2-insts"] = true;
2250b57cec5SDimitry Andric       LLVM_FALLTHROUGH;
226*e8d8bef9SDimitry Andric     case GK_GFX90C:
2270b57cec5SDimitry Andric     case GK_GFX909:
2280b57cec5SDimitry Andric     case GK_GFX904:
2290b57cec5SDimitry Andric     case GK_GFX902:
2300b57cec5SDimitry Andric     case GK_GFX900:
2310b57cec5SDimitry Andric       Features["gfx9-insts"] = true;
2320b57cec5SDimitry Andric       LLVM_FALLTHROUGH;
2330b57cec5SDimitry Andric     case GK_GFX810:
234*e8d8bef9SDimitry Andric     case GK_GFX805:
2350b57cec5SDimitry Andric     case GK_GFX803:
2360b57cec5SDimitry Andric     case GK_GFX802:
2370b57cec5SDimitry Andric     case GK_GFX801:
2380b57cec5SDimitry Andric       Features["gfx8-insts"] = true;
2390b57cec5SDimitry Andric       Features["16-bit-insts"] = true;
2400b57cec5SDimitry Andric       Features["dpp"] = true;
2410b57cec5SDimitry Andric       Features["s-memrealtime"] = true;
2420b57cec5SDimitry Andric       LLVM_FALLTHROUGH;
243*e8d8bef9SDimitry Andric     case GK_GFX705:
2440b57cec5SDimitry Andric     case GK_GFX704:
2450b57cec5SDimitry Andric     case GK_GFX703:
2460b57cec5SDimitry Andric     case GK_GFX702:
2470b57cec5SDimitry Andric     case GK_GFX701:
2480b57cec5SDimitry Andric     case GK_GFX700:
2490b57cec5SDimitry Andric       Features["ci-insts"] = true;
250a7dea167SDimitry Andric       Features["flat-address-space"] = true;
2510b57cec5SDimitry Andric       LLVM_FALLTHROUGH;
252*e8d8bef9SDimitry Andric     case GK_GFX602:
2530b57cec5SDimitry Andric     case GK_GFX601:
2540b57cec5SDimitry Andric     case GK_GFX600:
2550b57cec5SDimitry Andric       break;
2560b57cec5SDimitry Andric     case GK_NONE:
257a7dea167SDimitry Andric       break;
2580b57cec5SDimitry Andric     default:
2590b57cec5SDimitry Andric       llvm_unreachable("Unhandled GPU!");
2600b57cec5SDimitry Andric     }
2610b57cec5SDimitry Andric   } else {
2620b57cec5SDimitry Andric     if (CPU.empty())
2630b57cec5SDimitry Andric       CPU = "r600";
2640b57cec5SDimitry Andric 
2650b57cec5SDimitry Andric     switch (llvm::AMDGPU::parseArchR600(CPU)) {
2660b57cec5SDimitry Andric     case GK_CAYMAN:
2670b57cec5SDimitry Andric     case GK_CYPRESS:
2680b57cec5SDimitry Andric     case GK_RV770:
2690b57cec5SDimitry Andric     case GK_RV670:
2700b57cec5SDimitry Andric       // TODO: Add fp64 when implemented.
2710b57cec5SDimitry Andric       break;
2720b57cec5SDimitry Andric     case GK_TURKS:
2730b57cec5SDimitry Andric     case GK_CAICOS:
2740b57cec5SDimitry Andric     case GK_BARTS:
2750b57cec5SDimitry Andric     case GK_SUMO:
2760b57cec5SDimitry Andric     case GK_REDWOOD:
2770b57cec5SDimitry Andric     case GK_JUNIPER:
2780b57cec5SDimitry Andric     case GK_CEDAR:
2790b57cec5SDimitry Andric     case GK_RV730:
2800b57cec5SDimitry Andric     case GK_RV710:
2810b57cec5SDimitry Andric     case GK_RS880:
2820b57cec5SDimitry Andric     case GK_R630:
2830b57cec5SDimitry Andric     case GK_R600:
2840b57cec5SDimitry Andric       break;
2850b57cec5SDimitry Andric     default:
2860b57cec5SDimitry Andric       llvm_unreachable("Unhandled GPU!");
2870b57cec5SDimitry Andric     }
2880b57cec5SDimitry Andric   }
2890b57cec5SDimitry Andric 
2900b57cec5SDimitry Andric   return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2910b57cec5SDimitry Andric }
2920b57cec5SDimitry Andric 
2930b57cec5SDimitry Andric void AMDGPUTargetInfo::fillValidCPUList(
2940b57cec5SDimitry Andric     SmallVectorImpl<StringRef> &Values) const {
2950b57cec5SDimitry Andric   if (isAMDGCN(getTriple()))
2960b57cec5SDimitry Andric     llvm::AMDGPU::fillValidArchListAMDGCN(Values);
2970b57cec5SDimitry Andric   else
2980b57cec5SDimitry Andric     llvm::AMDGPU::fillValidArchListR600(Values);
2990b57cec5SDimitry Andric }
3000b57cec5SDimitry Andric 
3010b57cec5SDimitry Andric void AMDGPUTargetInfo::setAddressSpaceMap(bool DefaultIsPrivate) {
3020b57cec5SDimitry Andric   AddrSpaceMap = DefaultIsPrivate ? &AMDGPUDefIsPrivMap : &AMDGPUDefIsGenMap;
3030b57cec5SDimitry Andric }
3040b57cec5SDimitry Andric 
3050b57cec5SDimitry Andric AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple &Triple,
3060b57cec5SDimitry Andric                                    const TargetOptions &Opts)
3070b57cec5SDimitry Andric     : TargetInfo(Triple),
3080b57cec5SDimitry Andric       GPUKind(isAMDGCN(Triple) ?
3090b57cec5SDimitry Andric               llvm::AMDGPU::parseArchAMDGCN(Opts.CPU) :
3100b57cec5SDimitry Andric               llvm::AMDGPU::parseArchR600(Opts.CPU)),
3110b57cec5SDimitry Andric       GPUFeatures(isAMDGCN(Triple) ?
3120b57cec5SDimitry Andric                   llvm::AMDGPU::getArchAttrAMDGCN(GPUKind) :
3130b57cec5SDimitry Andric                   llvm::AMDGPU::getArchAttrR600(GPUKind)) {
3140b57cec5SDimitry Andric   resetDataLayout(isAMDGCN(getTriple()) ? DataLayoutStringAMDGCN
3150b57cec5SDimitry Andric                                         : DataLayoutStringR600);
3160b57cec5SDimitry Andric   assert(DataLayout->getAllocaAddrSpace() == Private);
3175ffd83dbSDimitry Andric   GridValues = llvm::omp::AMDGPUGpuGridValues;
3180b57cec5SDimitry Andric 
3190b57cec5SDimitry Andric   setAddressSpaceMap(Triple.getOS() == llvm::Triple::Mesa3D ||
3200b57cec5SDimitry Andric                      !isAMDGCN(Triple));
3210b57cec5SDimitry Andric   UseAddrSpaceMapMangling = true;
3220b57cec5SDimitry Andric 
3230b57cec5SDimitry Andric   HasLegalHalfType = true;
3240b57cec5SDimitry Andric   HasFloat16 = true;
325*e8d8bef9SDimitry Andric   WavefrontSize = GPUFeatures & llvm::AMDGPU::FEATURE_WAVE32 ? 32 : 64;
326*e8d8bef9SDimitry Andric   AllowAMDGPUUnsafeFPAtomics = Opts.AllowAMDGPUUnsafeFPAtomics;
3270b57cec5SDimitry Andric 
3280b57cec5SDimitry Andric   // Set pointer width and alignment for target address space 0.
3290b57cec5SDimitry Andric   PointerWidth = PointerAlign = DataLayout->getPointerSizeInBits();
3300b57cec5SDimitry Andric   if (getMaxPointerWidth() == 64) {
3310b57cec5SDimitry Andric     LongWidth = LongAlign = 64;
3320b57cec5SDimitry Andric     SizeType = UnsignedLong;
3330b57cec5SDimitry Andric     PtrDiffType = SignedLong;
3340b57cec5SDimitry Andric     IntPtrType = SignedLong;
3350b57cec5SDimitry Andric   }
3360b57cec5SDimitry Andric 
3370b57cec5SDimitry Andric   MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3380b57cec5SDimitry Andric }
3390b57cec5SDimitry Andric 
3400b57cec5SDimitry Andric void AMDGPUTargetInfo::adjust(LangOptions &Opts) {
3410b57cec5SDimitry Andric   TargetInfo::adjust(Opts);
3420b57cec5SDimitry Andric   // ToDo: There are still a few places using default address space as private
3430b57cec5SDimitry Andric   // address space in OpenCL, which needs to be cleaned up, then Opts.OpenCL
3440b57cec5SDimitry Andric   // can be removed from the following line.
3450b57cec5SDimitry Andric   setAddressSpaceMap(/*DefaultIsPrivate=*/Opts.OpenCL ||
3460b57cec5SDimitry Andric                      !isAMDGCN(getTriple()));
3470b57cec5SDimitry Andric }
3480b57cec5SDimitry Andric 
3490b57cec5SDimitry Andric ArrayRef<Builtin::Info> AMDGPUTargetInfo::getTargetBuiltins() const {
3500b57cec5SDimitry Andric   return llvm::makeArrayRef(BuiltinInfo, clang::AMDGPU::LastTSBuiltin -
3510b57cec5SDimitry Andric                                              Builtin::FirstTSBuiltin);
3520b57cec5SDimitry Andric }
3530b57cec5SDimitry Andric 
3540b57cec5SDimitry Andric void AMDGPUTargetInfo::getTargetDefines(const LangOptions &Opts,
3550b57cec5SDimitry Andric                                         MacroBuilder &Builder) const {
3560b57cec5SDimitry Andric   Builder.defineMacro("__AMD__");
3570b57cec5SDimitry Andric   Builder.defineMacro("__AMDGPU__");
3580b57cec5SDimitry Andric 
3590b57cec5SDimitry Andric   if (isAMDGCN(getTriple()))
3600b57cec5SDimitry Andric     Builder.defineMacro("__AMDGCN__");
3610b57cec5SDimitry Andric   else
3620b57cec5SDimitry Andric     Builder.defineMacro("__R600__");
3630b57cec5SDimitry Andric 
3640b57cec5SDimitry Andric   if (GPUKind != llvm::AMDGPU::GK_NONE) {
3650b57cec5SDimitry Andric     StringRef CanonName = isAMDGCN(getTriple()) ?
3660b57cec5SDimitry Andric       getArchNameAMDGCN(GPUKind) : getArchNameR600(GPUKind);
3670b57cec5SDimitry Andric     Builder.defineMacro(Twine("__") + Twine(CanonName) + Twine("__"));
368*e8d8bef9SDimitry Andric     if (isAMDGCN(getTriple())) {
369*e8d8bef9SDimitry Andric       Builder.defineMacro("__amdgcn_processor__",
370*e8d8bef9SDimitry Andric                           Twine("\"") + Twine(CanonName) + Twine("\""));
371*e8d8bef9SDimitry Andric       Builder.defineMacro("__amdgcn_target_id__",
372*e8d8bef9SDimitry Andric                           Twine("\"") + Twine(getTargetID().getValue()) +
373*e8d8bef9SDimitry Andric                               Twine("\""));
374*e8d8bef9SDimitry Andric       for (auto F : getAllPossibleTargetIDFeatures(getTriple(), CanonName)) {
375*e8d8bef9SDimitry Andric         auto Loc = OffloadArchFeatures.find(F);
376*e8d8bef9SDimitry Andric         if (Loc != OffloadArchFeatures.end()) {
377*e8d8bef9SDimitry Andric           std::string NewF = F.str();
378*e8d8bef9SDimitry Andric           std::replace(NewF.begin(), NewF.end(), '-', '_');
379*e8d8bef9SDimitry Andric           Builder.defineMacro(Twine("__amdgcn_feature_") + Twine(NewF) +
380*e8d8bef9SDimitry Andric                                   Twine("__"),
381*e8d8bef9SDimitry Andric                               Loc->second ? "1" : "0");
382*e8d8bef9SDimitry Andric         }
383*e8d8bef9SDimitry Andric       }
384*e8d8bef9SDimitry Andric     }
3850b57cec5SDimitry Andric   }
3860b57cec5SDimitry Andric 
3870b57cec5SDimitry Andric   // TODO: __HAS_FMAF__, __HAS_LDEXPF__, __HAS_FP64__ are deprecated and will be
3880b57cec5SDimitry Andric   // removed in the near future.
3890b57cec5SDimitry Andric   if (hasFMAF())
3900b57cec5SDimitry Andric     Builder.defineMacro("__HAS_FMAF__");
3910b57cec5SDimitry Andric   if (hasFastFMAF())
3920b57cec5SDimitry Andric     Builder.defineMacro("FP_FAST_FMAF");
3930b57cec5SDimitry Andric   if (hasLDEXPF())
3940b57cec5SDimitry Andric     Builder.defineMacro("__HAS_LDEXPF__");
3950b57cec5SDimitry Andric   if (hasFP64())
3960b57cec5SDimitry Andric     Builder.defineMacro("__HAS_FP64__");
3970b57cec5SDimitry Andric   if (hasFastFMA())
3980b57cec5SDimitry Andric     Builder.defineMacro("FP_FAST_FMA");
399*e8d8bef9SDimitry Andric 
400*e8d8bef9SDimitry Andric   Builder.defineMacro("__AMDGCN_WAVEFRONT_SIZE", Twine(WavefrontSize));
4010b57cec5SDimitry Andric }
4020b57cec5SDimitry Andric 
4030b57cec5SDimitry Andric void AMDGPUTargetInfo::setAuxTarget(const TargetInfo *Aux) {
4040b57cec5SDimitry Andric   assert(HalfFormat == Aux->HalfFormat);
4050b57cec5SDimitry Andric   assert(FloatFormat == Aux->FloatFormat);
4060b57cec5SDimitry Andric   assert(DoubleFormat == Aux->DoubleFormat);
4070b57cec5SDimitry Andric 
4080b57cec5SDimitry Andric   // On x86_64 long double is 80-bit extended precision format, which is
4090b57cec5SDimitry Andric   // not supported by AMDGPU. 128-bit floating point format is also not
4100b57cec5SDimitry Andric   // supported by AMDGPU. Therefore keep its own format for these two types.
4110b57cec5SDimitry Andric   auto SaveLongDoubleFormat = LongDoubleFormat;
4120b57cec5SDimitry Andric   auto SaveFloat128Format = Float128Format;
4130b57cec5SDimitry Andric   copyAuxTarget(Aux);
4140b57cec5SDimitry Andric   LongDoubleFormat = SaveLongDoubleFormat;
4150b57cec5SDimitry Andric   Float128Format = SaveFloat128Format;
4165ffd83dbSDimitry Andric   // For certain builtin types support on the host target, claim they are
4175ffd83dbSDimitry Andric   // support to pass the compilation of the host code during the device-side
4185ffd83dbSDimitry Andric   // compilation.
4195ffd83dbSDimitry Andric   // FIXME: As the side effect, we also accept `__float128` uses in the device
4205ffd83dbSDimitry Andric   // code. To rejct these builtin types supported in the host target but not in
4215ffd83dbSDimitry Andric   // the device target, one approach would support `device_builtin` attribute
4225ffd83dbSDimitry Andric   // so that we could tell the device builtin types from the host ones. The
4235ffd83dbSDimitry Andric   // also solves the different representations of the same builtin type, such
4245ffd83dbSDimitry Andric   // as `size_t` in the MSVC environment.
4255ffd83dbSDimitry Andric   if (Aux->hasFloat128Type()) {
4265ffd83dbSDimitry Andric     HasFloat128 = true;
4275ffd83dbSDimitry Andric     Float128Format = DoubleFormat;
4285ffd83dbSDimitry Andric   }
4290b57cec5SDimitry Andric }
430