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