1ebba5926SErich Keane //===--- AMDGPU.cpp - Implement AMDGPU target feature support -------------===//
2ebba5926SErich Keane //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ebba5926SErich Keane //
7ebba5926SErich Keane //===----------------------------------------------------------------------===//
8ebba5926SErich Keane //
9ebba5926SErich Keane // This file implements AMDGPU TargetInfo objects.
10ebba5926SErich Keane //
11ebba5926SErich Keane //===----------------------------------------------------------------------===//
12ebba5926SErich Keane 
13ebba5926SErich Keane #include "AMDGPU.h"
14ebba5926SErich Keane #include "clang/Basic/Builtins.h"
156368818fSRichard Trieu #include "clang/Basic/CodeGenOptions.h"
16ebba5926SErich Keane #include "clang/Basic/LangOptions.h"
17ebba5926SErich Keane #include "clang/Basic/MacroBuilder.h"
18ebba5926SErich Keane #include "clang/Basic/TargetBuiltins.h"
19ebba5926SErich Keane #include "llvm/ADT/StringSwitch.h"
20ebba5926SErich Keane 
21ebba5926SErich Keane using namespace clang;
22ebba5926SErich Keane using namespace clang::targets;
23ebba5926SErich Keane 
24ebba5926SErich Keane namespace clang {
25ebba5926SErich Keane namespace targets {
26ebba5926SErich Keane 
27ebba5926SErich Keane // If you edit the description strings, make sure you update
28ebba5926SErich Keane // getPointerWidthV().
29ebba5926SErich Keane 
30ebba5926SErich Keane static const char *const DataLayoutStringR600 =
31ebba5926SErich Keane     "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
3251e09e1dSAlex Richardson     "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1";
33ebba5926SErich Keane 
341578a0a5SYaxun Liu static const char *const DataLayoutStringAMDGCN =
35651bd73cSYaxun Liu     "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32"
36ebba5926SErich Keane     "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
3751e09e1dSAlex Richardson     "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1"
383c2aadbeSMichael Liao     "-ni:7";
39ebba5926SErich Keane 
401578a0a5SYaxun Liu const LangASMap AMDGPUTargetInfo::AMDGPUDefIsGenMap = {
411578a0a5SYaxun Liu     Generic,  // Default
421578a0a5SYaxun Liu     Global,   // opencl_global
431578a0a5SYaxun Liu     Local,    // opencl_local
441578a0a5SYaxun Liu     Constant, // opencl_constant
451578a0a5SYaxun Liu     Private,  // opencl_private
461578a0a5SYaxun Liu     Generic,  // opencl_generic
478d27be8dSAlexey Bader     Global,   // opencl_global_device
488d27be8dSAlexey Bader     Global,   // opencl_global_host
491578a0a5SYaxun Liu     Global,   // cuda_device
501578a0a5SYaxun Liu     Constant, // cuda_constant
51a85f5efdSAmy Huang     Local,    // cuda_shared
527818906cSAlexey Bader     Global,   // sycl_global
532ab513cdSAlexey Bader     Global,   // sycl_global_device
542ab513cdSAlexey Bader     Global,   // sycl_global_host
557818906cSAlexey Bader     Local,    // sycl_local
567818906cSAlexey Bader     Private,  // sycl_private
57a85f5efdSAmy Huang     Generic,  // ptr32_sptr
58a85f5efdSAmy Huang     Generic,  // ptr32_uptr
59a85f5efdSAmy Huang     Generic   // ptr64
60ebba5926SErich Keane };
61ebba5926SErich Keane 
621578a0a5SYaxun Liu const LangASMap AMDGPUTargetInfo::AMDGPUDefIsPrivMap = {
631578a0a5SYaxun Liu     Private,  // Default
641578a0a5SYaxun Liu     Global,   // opencl_global
651578a0a5SYaxun Liu     Local,    // opencl_local
661578a0a5SYaxun Liu     Constant, // opencl_constant
671578a0a5SYaxun Liu     Private,  // opencl_private
681578a0a5SYaxun Liu     Generic,  // opencl_generic
698d27be8dSAlexey Bader     Global,   // opencl_global_device
708d27be8dSAlexey Bader     Global,   // opencl_global_host
711578a0a5SYaxun Liu     Global,   // cuda_device
721578a0a5SYaxun Liu     Constant, // cuda_constant
73a85f5efdSAmy Huang     Local,    // cuda_shared
747818906cSAlexey Bader     // SYCL address space values for this map are dummy
757818906cSAlexey Bader     Generic,  // sycl_global
762ab513cdSAlexey Bader     Generic,  // sycl_global_device
772ab513cdSAlexey Bader     Generic,  // sycl_global_host
787818906cSAlexey Bader     Generic,  // sycl_local
797818906cSAlexey Bader     Generic,  // sycl_private
80a85f5efdSAmy Huang     Generic,  // ptr32_sptr
81a85f5efdSAmy Huang     Generic,  // ptr32_uptr
82a85f5efdSAmy Huang     Generic   // ptr64
83a85f5efdSAmy Huang 
84ebba5926SErich Keane };
85ebba5926SErich Keane } // namespace targets
86ebba5926SErich Keane } // namespace clang
87ebba5926SErich Keane 
88ebba5926SErich Keane const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
89ebba5926SErich Keane #define BUILTIN(ID, TYPE, ATTRS)                                               \
90ebba5926SErich Keane   {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
91ebba5926SErich Keane #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE)                               \
92ebba5926SErich Keane   {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE},
93ebba5926SErich Keane #include "clang/Basic/BuiltinsAMDGPU.def"
94ebba5926SErich Keane };
95ebba5926SErich Keane 
96ebba5926SErich Keane const char *const AMDGPUTargetInfo::GCCRegNames[] = {
97ebba5926SErich Keane   "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8",
98ebba5926SErich Keane   "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17",
99ebba5926SErich Keane   "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26",
100ebba5926SErich Keane   "v27", "v28", "v29", "v30", "v31", "v32", "v33", "v34", "v35",
101ebba5926SErich Keane   "v36", "v37", "v38", "v39", "v40", "v41", "v42", "v43", "v44",
102ebba5926SErich Keane   "v45", "v46", "v47", "v48", "v49", "v50", "v51", "v52", "v53",
103ebba5926SErich Keane   "v54", "v55", "v56", "v57", "v58", "v59", "v60", "v61", "v62",
104ebba5926SErich Keane   "v63", "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
105ebba5926SErich Keane   "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79", "v80",
106ebba5926SErich Keane   "v81", "v82", "v83", "v84", "v85", "v86", "v87", "v88", "v89",
107ebba5926SErich Keane   "v90", "v91", "v92", "v93", "v94", "v95", "v96", "v97", "v98",
108ebba5926SErich Keane   "v99", "v100", "v101", "v102", "v103", "v104", "v105", "v106", "v107",
109ebba5926SErich Keane   "v108", "v109", "v110", "v111", "v112", "v113", "v114", "v115", "v116",
110ebba5926SErich Keane   "v117", "v118", "v119", "v120", "v121", "v122", "v123", "v124", "v125",
111ebba5926SErich Keane   "v126", "v127", "v128", "v129", "v130", "v131", "v132", "v133", "v134",
112ebba5926SErich Keane   "v135", "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
113ebba5926SErich Keane   "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151", "v152",
114ebba5926SErich Keane   "v153", "v154", "v155", "v156", "v157", "v158", "v159", "v160", "v161",
115ebba5926SErich Keane   "v162", "v163", "v164", "v165", "v166", "v167", "v168", "v169", "v170",
116ebba5926SErich Keane   "v171", "v172", "v173", "v174", "v175", "v176", "v177", "v178", "v179",
117ebba5926SErich Keane   "v180", "v181", "v182", "v183", "v184", "v185", "v186", "v187", "v188",
118ebba5926SErich Keane   "v189", "v190", "v191", "v192", "v193", "v194", "v195", "v196", "v197",
119ebba5926SErich Keane   "v198", "v199", "v200", "v201", "v202", "v203", "v204", "v205", "v206",
120ebba5926SErich Keane   "v207", "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
121ebba5926SErich Keane   "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223", "v224",
122ebba5926SErich Keane   "v225", "v226", "v227", "v228", "v229", "v230", "v231", "v232", "v233",
123ebba5926SErich Keane   "v234", "v235", "v236", "v237", "v238", "v239", "v240", "v241", "v242",
124ebba5926SErich Keane   "v243", "v244", "v245", "v246", "v247", "v248", "v249", "v250", "v251",
125ebba5926SErich Keane   "v252", "v253", "v254", "v255", "s0", "s1", "s2", "s3", "s4",
126ebba5926SErich Keane   "s5", "s6", "s7", "s8", "s9", "s10", "s11", "s12", "s13",
127ebba5926SErich Keane   "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21", "s22",
128ebba5926SErich Keane   "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
129ebba5926SErich Keane   "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39", "s40",
130ebba5926SErich Keane   "s41", "s42", "s43", "s44", "s45", "s46", "s47", "s48", "s49",
131ebba5926SErich Keane   "s50", "s51", "s52", "s53", "s54", "s55", "s56", "s57", "s58",
132ebba5926SErich Keane   "s59", "s60", "s61", "s62", "s63", "s64", "s65", "s66", "s67",
133ebba5926SErich Keane   "s68", "s69", "s70", "s71", "s72", "s73", "s74", "s75", "s76",
134ebba5926SErich Keane   "s77", "s78", "s79", "s80", "s81", "s82", "s83", "s84", "s85",
135ebba5926SErich Keane   "s86", "s87", "s88", "s89", "s90", "s91", "s92", "s93", "s94",
136ebba5926SErich Keane   "s95", "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
137ebba5926SErich Keane   "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111", "s112",
138ebba5926SErich Keane   "s113", "s114", "s115", "s116", "s117", "s118", "s119", "s120", "s121",
139ebba5926SErich Keane   "s122", "s123", "s124", "s125", "s126", "s127", "exec", "vcc", "scc",
140ebba5926SErich Keane   "m0", "flat_scratch", "exec_lo", "exec_hi", "vcc_lo", "vcc_hi",
141a46e7d7aSYaxun (Sam) Liu   "flat_scratch_lo", "flat_scratch_hi",
142a46e7d7aSYaxun (Sam) Liu   "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8",
143a46e7d7aSYaxun (Sam) Liu   "a9", "a10", "a11", "a12", "a13", "a14", "a15", "a16", "a17",
144a46e7d7aSYaxun (Sam) Liu   "a18", "a19", "a20", "a21", "a22", "a23", "a24", "a25", "a26",
145a46e7d7aSYaxun (Sam) Liu   "a27", "a28", "a29", "a30", "a31", "a32", "a33", "a34", "a35",
146a46e7d7aSYaxun (Sam) Liu   "a36", "a37", "a38", "a39", "a40", "a41", "a42", "a43", "a44",
147a46e7d7aSYaxun (Sam) Liu   "a45", "a46", "a47", "a48", "a49", "a50", "a51", "a52", "a53",
148a46e7d7aSYaxun (Sam) Liu   "a54", "a55", "a56", "a57", "a58", "a59", "a60", "a61", "a62",
149a46e7d7aSYaxun (Sam) Liu   "a63", "a64", "a65", "a66", "a67", "a68", "a69", "a70", "a71",
150a46e7d7aSYaxun (Sam) Liu   "a72", "a73", "a74", "a75", "a76", "a77", "a78", "a79", "a80",
151a46e7d7aSYaxun (Sam) Liu   "a81", "a82", "a83", "a84", "a85", "a86", "a87", "a88", "a89",
152a46e7d7aSYaxun (Sam) Liu   "a90", "a91", "a92", "a93", "a94", "a95", "a96", "a97", "a98",
153a46e7d7aSYaxun (Sam) Liu   "a99", "a100", "a101", "a102", "a103", "a104", "a105", "a106", "a107",
154a46e7d7aSYaxun (Sam) Liu   "a108", "a109", "a110", "a111", "a112", "a113", "a114", "a115", "a116",
155a46e7d7aSYaxun (Sam) Liu   "a117", "a118", "a119", "a120", "a121", "a122", "a123", "a124", "a125",
156a46e7d7aSYaxun (Sam) Liu   "a126", "a127", "a128", "a129", "a130", "a131", "a132", "a133", "a134",
157a46e7d7aSYaxun (Sam) Liu   "a135", "a136", "a137", "a138", "a139", "a140", "a141", "a142", "a143",
158a46e7d7aSYaxun (Sam) Liu   "a144", "a145", "a146", "a147", "a148", "a149", "a150", "a151", "a152",
159a46e7d7aSYaxun (Sam) Liu   "a153", "a154", "a155", "a156", "a157", "a158", "a159", "a160", "a161",
160a46e7d7aSYaxun (Sam) Liu   "a162", "a163", "a164", "a165", "a166", "a167", "a168", "a169", "a170",
161a46e7d7aSYaxun (Sam) Liu   "a171", "a172", "a173", "a174", "a175", "a176", "a177", "a178", "a179",
162a46e7d7aSYaxun (Sam) Liu   "a180", "a181", "a182", "a183", "a184", "a185", "a186", "a187", "a188",
163a46e7d7aSYaxun (Sam) Liu   "a189", "a190", "a191", "a192", "a193", "a194", "a195", "a196", "a197",
164a46e7d7aSYaxun (Sam) Liu   "a198", "a199", "a200", "a201", "a202", "a203", "a204", "a205", "a206",
165a46e7d7aSYaxun (Sam) Liu   "a207", "a208", "a209", "a210", "a211", "a212", "a213", "a214", "a215",
166a46e7d7aSYaxun (Sam) Liu   "a216", "a217", "a218", "a219", "a220", "a221", "a222", "a223", "a224",
167a46e7d7aSYaxun (Sam) Liu   "a225", "a226", "a227", "a228", "a229", "a230", "a231", "a232", "a233",
168a46e7d7aSYaxun (Sam) Liu   "a234", "a235", "a236", "a237", "a238", "a239", "a240", "a241", "a242",
169a46e7d7aSYaxun (Sam) Liu   "a243", "a244", "a245", "a246", "a247", "a248", "a249", "a250", "a251",
170a46e7d7aSYaxun (Sam) Liu   "a252", "a253", "a254", "a255"
171ebba5926SErich Keane };
172ebba5926SErich Keane 
getGCCRegNames() const173ebba5926SErich Keane ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
174ebba5926SErich Keane   return llvm::makeArrayRef(GCCRegNames);
175ebba5926SErich Keane }
176ebba5926SErich Keane 
initFeatureMap(llvm::StringMap<bool> & Features,DiagnosticsEngine & Diags,StringRef CPU,const std::vector<std::string> & FeatureVec) const177ebba5926SErich Keane bool AMDGPUTargetInfo::initFeatureMap(
178ebba5926SErich Keane     llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
179ebba5926SErich Keane     const std::vector<std::string> &FeatureVec) const {
180ebba5926SErich Keane 
181b666e73dSMatt Arsenault   using namespace llvm::AMDGPU;
182b666e73dSMatt Arsenault 
183ebba5926SErich Keane   // XXX - What does the member GPU mean if device name string passed here?
184d6b3453bSKonstantin Zhuravlyov   if (isAMDGCN(getTriple())) {
185b666e73dSMatt Arsenault     switch (llvm::AMDGPU::parseArchAMDGCN(CPU)) {
1868bdfc73fSJoe Nash     case GK_GFX1103:
1878bdfc73fSJoe Nash     case GK_GFX1102:
1888bdfc73fSJoe Nash     case GK_GFX1101:
1898bdfc73fSJoe Nash     case GK_GFX1100:
1908bdfc73fSJoe Nash       Features["ci-insts"] = true;
1918bdfc73fSJoe Nash       Features["dot1-insts"] = true;
1928bdfc73fSJoe Nash       Features["dot5-insts"] = true;
1938bdfc73fSJoe Nash       Features["dot6-insts"] = true;
1948bdfc73fSJoe Nash       Features["dot7-insts"] = true;
1958bdfc73fSJoe Nash       Features["dot8-insts"] = true;
1968bdfc73fSJoe Nash       Features["dl-insts"] = true;
1978bdfc73fSJoe Nash       Features["flat-address-space"] = true;
1988bdfc73fSJoe Nash       Features["16-bit-insts"] = true;
1998bdfc73fSJoe Nash       Features["dpp"] = true;
2008bdfc73fSJoe Nash       Features["gfx8-insts"] = true;
2018bdfc73fSJoe Nash       Features["gfx9-insts"] = true;
2028bdfc73fSJoe Nash       Features["gfx10-insts"] = true;
2038bdfc73fSJoe Nash       Features["gfx10-3-insts"] = true;
2048bdfc73fSJoe Nash       Features["gfx11-insts"] = true;
2058bdfc73fSJoe Nash       break;
20684069581SAakanksha     case GK_GFX1036:
2073453f3ddSAakanksha Patil     case GK_GFX1035:
208464e4dc5SAakanksha Patil     case GK_GFX1034:
20989d41f3aSTim Renouf     case GK_GFX1033:
210d1beb95dSStanislav Mekhanoshin     case GK_GFX1032:
211ea7d0e29SStanislav Mekhanoshin     case GK_GFX1031:
2129ee272f1SStanislav Mekhanoshin     case GK_GFX1030:
2139ee272f1SStanislav Mekhanoshin       Features["ci-insts"] = true;
2149ee272f1SStanislav Mekhanoshin       Features["dot1-insts"] = true;
2159ee272f1SStanislav Mekhanoshin       Features["dot2-insts"] = true;
2169ee272f1SStanislav Mekhanoshin       Features["dot5-insts"] = true;
2179ee272f1SStanislav Mekhanoshin       Features["dot6-insts"] = true;
218967b64beSJay Foad       Features["dot7-insts"] = true;
2199ee272f1SStanislav Mekhanoshin       Features["dl-insts"] = true;
2209ee272f1SStanislav Mekhanoshin       Features["flat-address-space"] = true;
2219ee272f1SStanislav Mekhanoshin       Features["16-bit-insts"] = true;
2229ee272f1SStanislav Mekhanoshin       Features["dpp"] = true;
2239ee272f1SStanislav Mekhanoshin       Features["gfx8-insts"] = true;
2249ee272f1SStanislav Mekhanoshin       Features["gfx9-insts"] = true;
2259ee272f1SStanislav Mekhanoshin       Features["gfx10-insts"] = true;
2269ee272f1SStanislav Mekhanoshin       Features["gfx10-3-insts"] = true;
2279ee272f1SStanislav Mekhanoshin       Features["s-memrealtime"] = true;
22899682bc0SJay Foad       Features["s-memtime-inst"] = true;
2299ee272f1SStanislav Mekhanoshin       break;
230cafccd7aSStanislav Mekhanoshin     case GK_GFX1012:
231cafccd7aSStanislav Mekhanoshin     case GK_GFX1011:
232cafccd7aSStanislav Mekhanoshin       Features["dot1-insts"] = true;
233cafccd7aSStanislav Mekhanoshin       Features["dot2-insts"] = true;
234cafccd7aSStanislav Mekhanoshin       Features["dot5-insts"] = true;
235cafccd7aSStanislav Mekhanoshin       Features["dot6-insts"] = true;
236967b64beSJay Foad       Features["dot7-insts"] = true;
237cafccd7aSStanislav Mekhanoshin       LLVM_FALLTHROUGH;
238294efbbdSBrendon Cahoon     case GK_GFX1013:
23991792f1bSStanislav Mekhanoshin     case GK_GFX1010:
24091792f1bSStanislav Mekhanoshin       Features["dl-insts"] = true;
241fc849252SMatt Arsenault       Features["ci-insts"] = true;
242281f2e2cSMatt Arsenault       Features["flat-address-space"] = true;
24391792f1bSStanislav Mekhanoshin       Features["16-bit-insts"] = true;
24491792f1bSStanislav Mekhanoshin       Features["dpp"] = true;
245fc849252SMatt Arsenault       Features["gfx8-insts"] = true;
24691792f1bSStanislav Mekhanoshin       Features["gfx9-insts"] = true;
24791792f1bSStanislav Mekhanoshin       Features["gfx10-insts"] = true;
24891792f1bSStanislav Mekhanoshin       Features["s-memrealtime"] = true;
2498e661d3dSStanislav Mekhanoshin       Features["s-memtime-inst"] = true;
25091792f1bSStanislav Mekhanoshin       break;
2512e2e64dfSStanislav Mekhanoshin     case GK_GFX940:
2522e2e64dfSStanislav Mekhanoshin       Features["gfx940-insts"] = true;
253*9fa5a6b7SStanislav Mekhanoshin       Features["fp8-insts"] = true;
2542e2e64dfSStanislav Mekhanoshin       LLVM_FALLTHROUGH;
255a8d9d507SStanislav Mekhanoshin     case GK_GFX90A:
256a8d9d507SStanislav Mekhanoshin       Features["gfx90a-insts"] = true;
257a8d9d507SStanislav Mekhanoshin       LLVM_FALLTHROUGH;
2580cfd75a0SStanislav Mekhanoshin     case GK_GFX908:
2590cfd75a0SStanislav Mekhanoshin       Features["dot3-insts"] = true;
2600cfd75a0SStanislav Mekhanoshin       Features["dot4-insts"] = true;
2610cfd75a0SStanislav Mekhanoshin       Features["dot5-insts"] = true;
2620cfd75a0SStanislav Mekhanoshin       Features["dot6-insts"] = true;
2636d614a82SKonstantin Pyzhov       Features["mai-insts"] = true;
2640cfd75a0SStanislav Mekhanoshin       LLVM_FALLTHROUGH;
265d2da3c20SMatt Arsenault     case GK_GFX906:
266d2da3c20SMatt Arsenault       Features["dl-insts"] = true;
2671607a373SStanislav Mekhanoshin       Features["dot1-insts"] = true;
2681607a373SStanislav Mekhanoshin       Features["dot2-insts"] = true;
269967b64beSJay Foad       Features["dot7-insts"] = true;
270d2da3c20SMatt Arsenault       LLVM_FALLTHROUGH;
271ee3e6426STim Renouf     case GK_GFX90C:
27206570954SKonstantin Zhuravlyov     case GK_GFX909:
273d2da3c20SMatt Arsenault     case GK_GFX904:
274d6b3453bSKonstantin Zhuravlyov     case GK_GFX902:
275d6b3453bSKonstantin Zhuravlyov     case GK_GFX900:
276ebba5926SErich Keane       Features["gfx9-insts"] = true;
277ebba5926SErich Keane       LLVM_FALLTHROUGH;
278d6b3453bSKonstantin Zhuravlyov     case GK_GFX810:
279666ef0dbSTim Renouf     case GK_GFX805:
280d6b3453bSKonstantin Zhuravlyov     case GK_GFX803:
281d6b3453bSKonstantin Zhuravlyov     case GK_GFX802:
282d6b3453bSKonstantin Zhuravlyov     case GK_GFX801:
2831d9f286eSStanislav Mekhanoshin       Features["gfx8-insts"] = true;
284ebba5926SErich Keane       Features["16-bit-insts"] = true;
285ebba5926SErich Keane       Features["dpp"] = true;
286d6b3453bSKonstantin Zhuravlyov       Features["s-memrealtime"] = true;
28724f39247SMatt Arsenault       LLVM_FALLTHROUGH;
288666ef0dbSTim Renouf     case GK_GFX705:
289d6b3453bSKonstantin Zhuravlyov     case GK_GFX704:
290d6b3453bSKonstantin Zhuravlyov     case GK_GFX703:
291d6b3453bSKonstantin Zhuravlyov     case GK_GFX702:
292d6b3453bSKonstantin Zhuravlyov     case GK_GFX701:
293d6b3453bSKonstantin Zhuravlyov     case GK_GFX700:
29424f39247SMatt Arsenault       Features["ci-insts"] = true;
295281f2e2cSMatt Arsenault       Features["flat-address-space"] = true;
29624f39247SMatt Arsenault       LLVM_FALLTHROUGH;
297666ef0dbSTim Renouf     case GK_GFX602:
298d6b3453bSKonstantin Zhuravlyov     case GK_GFX601:
299d6b3453bSKonstantin Zhuravlyov     case GK_GFX600:
3008e661d3dSStanislav Mekhanoshin       Features["s-memtime-inst"] = true;
301d6b3453bSKonstantin Zhuravlyov       break;
302ebba5926SErich Keane     case GK_NONE:
303c17705b7SStanislav Mekhanoshin       break;
304ebba5926SErich Keane     default:
305d6b3453bSKonstantin Zhuravlyov       llvm_unreachable("Unhandled GPU!");
306ebba5926SErich Keane     }
307ebba5926SErich Keane   } else {
308ebba5926SErich Keane     if (CPU.empty())
309ebba5926SErich Keane       CPU = "r600";
310ebba5926SErich Keane 
311b666e73dSMatt Arsenault     switch (llvm::AMDGPU::parseArchR600(CPU)) {
312ebba5926SErich Keane     case GK_CAYMAN:
313d6b3453bSKonstantin Zhuravlyov     case GK_CYPRESS:
314d6b3453bSKonstantin Zhuravlyov     case GK_RV770:
315d6b3453bSKonstantin Zhuravlyov     case GK_RV670:
316e4f6280aSMatt Arsenault       // TODO: Add fp64 when implemented.
317ebba5926SErich Keane       break;
318d6b3453bSKonstantin Zhuravlyov     case GK_TURKS:
319d6b3453bSKonstantin Zhuravlyov     case GK_CAICOS:
320d6b3453bSKonstantin Zhuravlyov     case GK_BARTS:
321d6b3453bSKonstantin Zhuravlyov     case GK_SUMO:
322d6b3453bSKonstantin Zhuravlyov     case GK_REDWOOD:
323d6b3453bSKonstantin Zhuravlyov     case GK_JUNIPER:
324d6b3453bSKonstantin Zhuravlyov     case GK_CEDAR:
325d6b3453bSKonstantin Zhuravlyov     case GK_RV730:
326d6b3453bSKonstantin Zhuravlyov     case GK_RV710:
327d6b3453bSKonstantin Zhuravlyov     case GK_RS880:
328d6b3453bSKonstantin Zhuravlyov     case GK_R630:
329d6b3453bSKonstantin Zhuravlyov     case GK_R600:
330d6b3453bSKonstantin Zhuravlyov       break;
331ebba5926SErich Keane     default:
332d6b3453bSKonstantin Zhuravlyov       llvm_unreachable("Unhandled GPU!");
333ebba5926SErich Keane     }
334ebba5926SErich Keane   }
335ebba5926SErich Keane 
336ebba5926SErich Keane   return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
337ebba5926SErich Keane }
338ebba5926SErich Keane 
fillValidCPUList(SmallVectorImpl<StringRef> & Values) const339e44bdb3fSErich Keane void AMDGPUTargetInfo::fillValidCPUList(
340e44bdb3fSErich Keane     SmallVectorImpl<StringRef> &Values) const {
341d6b3453bSKonstantin Zhuravlyov   if (isAMDGCN(getTriple()))
342b666e73dSMatt Arsenault     llvm::AMDGPU::fillValidArchListAMDGCN(Values);
343e44bdb3fSErich Keane   else
344b666e73dSMatt Arsenault     llvm::AMDGPU::fillValidArchListR600(Values);
345ebba5926SErich Keane }
346ebba5926SErich Keane 
setAddressSpaceMap(bool DefaultIsPrivate)347ebba5926SErich Keane void AMDGPUTargetInfo::setAddressSpaceMap(bool DefaultIsPrivate) {
3481578a0a5SYaxun Liu   AddrSpaceMap = DefaultIsPrivate ? &AMDGPUDefIsPrivMap : &AMDGPUDefIsGenMap;
349ebba5926SErich Keane }
350ebba5926SErich Keane 
AMDGPUTargetInfo(const llvm::Triple & Triple,const TargetOptions & Opts)351ebba5926SErich Keane AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple &Triple,
352ebba5926SErich Keane                                    const TargetOptions &Opts)
3531578a0a5SYaxun Liu     : TargetInfo(Triple),
354b666e73dSMatt Arsenault       GPUKind(isAMDGCN(Triple) ?
355b666e73dSMatt Arsenault               llvm::AMDGPU::parseArchAMDGCN(Opts.CPU) :
356b666e73dSMatt Arsenault               llvm::AMDGPU::parseArchR600(Opts.CPU)),
357b666e73dSMatt Arsenault       GPUFeatures(isAMDGCN(Triple) ?
358b666e73dSMatt Arsenault                   llvm::AMDGPU::getArchAttrAMDGCN(GPUKind) :
359b666e73dSMatt Arsenault                   llvm::AMDGPU::getArchAttrR600(GPUKind)) {
3601578a0a5SYaxun Liu   resetDataLayout(isAMDGCN(getTriple()) ? DataLayoutStringAMDGCN
361ebba5926SErich Keane                                         : DataLayoutStringR600);
362ebba5926SErich Keane 
363ebba5926SErich Keane   setAddressSpaceMap(Triple.getOS() == llvm::Triple::Mesa3D ||
364ebba5926SErich Keane                      !isAMDGCN(Triple));
365ebba5926SErich Keane   UseAddrSpaceMapMangling = true;
366ebba5926SErich Keane 
36744697012SYaxun Liu   HasLegalHalfType = true;
36844697012SYaxun Liu   HasFloat16 = true;
36936501b18SYaxun (Sam) Liu   WavefrontSize = GPUFeatures & llvm::AMDGPU::FEATURE_WAVE32 ? 32 : 64;
3703f4b5893SYaxun (Sam) Liu   AllowAMDGPUUnsafeFPAtomics = Opts.AllowAMDGPUUnsafeFPAtomics;
37144697012SYaxun Liu 
372ebba5926SErich Keane   // Set pointer width and alignment for target address space 0.
3730f1137baSNico Weber   PointerWidth = PointerAlign = getPointerWidthV(Generic);
374ebba5926SErich Keane   if (getMaxPointerWidth() == 64) {
375ebba5926SErich Keane     LongWidth = LongAlign = 64;
376ebba5926SErich Keane     SizeType = UnsignedLong;
377ebba5926SErich Keane     PtrDiffType = SignedLong;
378ebba5926SErich Keane     IntPtrType = SignedLong;
379ebba5926SErich Keane   }
38039195062SYaxun Liu 
38139195062SYaxun Liu   MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
382ebba5926SErich Keane }
383ebba5926SErich Keane 
adjust(DiagnosticsEngine & Diags,LangOptions & Opts)384aaba3718SMelanie Blower void AMDGPUTargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts) {
385aaba3718SMelanie Blower   TargetInfo::adjust(Diags, Opts);
3861578a0a5SYaxun Liu   // ToDo: There are still a few places using default address space as private
3871578a0a5SYaxun Liu   // address space in OpenCL, which needs to be cleaned up, then Opts.OpenCL
3881578a0a5SYaxun Liu   // can be removed from the following line.
3891578a0a5SYaxun Liu   setAddressSpaceMap(/*DefaultIsPrivate=*/Opts.OpenCL ||
3901578a0a5SYaxun Liu                      !isAMDGCN(getTriple()));
391ebba5926SErich Keane }
392ebba5926SErich Keane 
getTargetBuiltins() const393ebba5926SErich Keane ArrayRef<Builtin::Info> AMDGPUTargetInfo::getTargetBuiltins() const {
394ebba5926SErich Keane   return llvm::makeArrayRef(BuiltinInfo, clang::AMDGPU::LastTSBuiltin -
395ebba5926SErich Keane                                              Builtin::FirstTSBuiltin);
396ebba5926SErich Keane }
397ebba5926SErich Keane 
getTargetDefines(const LangOptions & Opts,MacroBuilder & Builder) const398ebba5926SErich Keane void AMDGPUTargetInfo::getTargetDefines(const LangOptions &Opts,
399ebba5926SErich Keane                                         MacroBuilder &Builder) const {
400cf717614SKonstantin Zhuravlyov   Builder.defineMacro("__AMD__");
401cf717614SKonstantin Zhuravlyov   Builder.defineMacro("__AMDGPU__");
402cf717614SKonstantin Zhuravlyov 
403d6b3453bSKonstantin Zhuravlyov   if (isAMDGCN(getTriple()))
404ebba5926SErich Keane     Builder.defineMacro("__AMDGCN__");
405ebba5926SErich Keane   else
406ebba5926SErich Keane     Builder.defineMacro("__R600__");
407ebba5926SErich Keane 
408b666e73dSMatt Arsenault   if (GPUKind != llvm::AMDGPU::GK_NONE) {
409b666e73dSMatt Arsenault     StringRef CanonName = isAMDGCN(getTriple()) ?
410b666e73dSMatt Arsenault       getArchNameAMDGCN(GPUKind) : getArchNameR600(GPUKind);
411b666e73dSMatt Arsenault     Builder.defineMacro(Twine("__") + Twine(CanonName) + Twine("__"));
412559b8fc1SYaxun (Sam) Liu     // Emit macros for gfx family e.g. gfx906 -> __GFX9__, gfx1030 -> __GFX10___
413559b8fc1SYaxun (Sam) Liu     if (isAMDGCN(getTriple())) {
414559b8fc1SYaxun (Sam) Liu       assert(CanonName.startswith("gfx") && "Invalid amdgcn canonical name");
415559b8fc1SYaxun (Sam) Liu       Builder.defineMacro(Twine("__") + Twine(CanonName.drop_back(2).upper()) +
416559b8fc1SYaxun (Sam) Liu                           Twine("__"));
417559b8fc1SYaxun (Sam) Liu     }
4187546b29eSYaxun (Sam) Liu     if (isAMDGCN(getTriple())) {
4197546b29eSYaxun (Sam) Liu       Builder.defineMacro("__amdgcn_processor__",
4207546b29eSYaxun (Sam) Liu                           Twine("\"") + Twine(CanonName) + Twine("\""));
4217546b29eSYaxun (Sam) Liu       Builder.defineMacro("__amdgcn_target_id__",
422ca4af13eSKazu Hirata                           Twine("\"") + Twine(*getTargetID()) + Twine("\""));
4237546b29eSYaxun (Sam) Liu       for (auto F : getAllPossibleTargetIDFeatures(getTriple(), CanonName)) {
4247546b29eSYaxun (Sam) Liu         auto Loc = OffloadArchFeatures.find(F);
4257546b29eSYaxun (Sam) Liu         if (Loc != OffloadArchFeatures.end()) {
4267546b29eSYaxun (Sam) Liu           std::string NewF = F.str();
4277546b29eSYaxun (Sam) Liu           std::replace(NewF.begin(), NewF.end(), '-', '_');
4287546b29eSYaxun (Sam) Liu           Builder.defineMacro(Twine("__amdgcn_feature_") + Twine(NewF) +
4297546b29eSYaxun (Sam) Liu                                   Twine("__"),
4307546b29eSYaxun (Sam) Liu                               Loc->second ? "1" : "0");
4317546b29eSYaxun (Sam) Liu         }
4327546b29eSYaxun (Sam) Liu       }
4337546b29eSYaxun (Sam) Liu     }
434b666e73dSMatt Arsenault   }
435cf717614SKonstantin Zhuravlyov 
436a1303b23SMatt Arsenault   if (AllowAMDGPUUnsafeFPAtomics)
437a1303b23SMatt Arsenault     Builder.defineMacro("__AMDGCN_UNSAFE_FP_ATOMICS__");
438a1303b23SMatt Arsenault 
439d6b3453bSKonstantin Zhuravlyov   // TODO: __HAS_FMAF__, __HAS_LDEXPF__, __HAS_FP64__ are deprecated and will be
440d6b3453bSKonstantin Zhuravlyov   // removed in the near future.
441b666e73dSMatt Arsenault   if (hasFMAF())
442ebba5926SErich Keane     Builder.defineMacro("__HAS_FMAF__");
443b666e73dSMatt Arsenault   if (hasFastFMAF())
444d6b3453bSKonstantin Zhuravlyov     Builder.defineMacro("FP_FAST_FMAF");
445b666e73dSMatt Arsenault   if (hasLDEXPF())
446ebba5926SErich Keane     Builder.defineMacro("__HAS_LDEXPF__");
447b666e73dSMatt Arsenault   if (hasFP64())
448ebba5926SErich Keane     Builder.defineMacro("__HAS_FP64__");
449b666e73dSMatt Arsenault   if (hasFastFMA())
450d6b3453bSKonstantin Zhuravlyov     Builder.defineMacro("FP_FAST_FMA");
45136501b18SYaxun (Sam) Liu 
45236501b18SYaxun (Sam) Liu   Builder.defineMacro("__AMDGCN_WAVEFRONT_SIZE", Twine(WavefrontSize));
453ebba5926SErich Keane }
45495f2ca54SYaxun Liu 
setAuxTarget(const TargetInfo * Aux)45595f2ca54SYaxun Liu void AMDGPUTargetInfo::setAuxTarget(const TargetInfo *Aux) {
456277e064bSYaxun Liu   assert(HalfFormat == Aux->HalfFormat);
457277e064bSYaxun Liu   assert(FloatFormat == Aux->FloatFormat);
458277e064bSYaxun Liu   assert(DoubleFormat == Aux->DoubleFormat);
459277e064bSYaxun Liu 
460277e064bSYaxun Liu   // On x86_64 long double is 80-bit extended precision format, which is
461277e064bSYaxun Liu   // not supported by AMDGPU. 128-bit floating point format is also not
462277e064bSYaxun Liu   // supported by AMDGPU. Therefore keep its own format for these two types.
463277e064bSYaxun Liu   auto SaveLongDoubleFormat = LongDoubleFormat;
464277e064bSYaxun Liu   auto SaveFloat128Format = Float128Format;
465af9ee335SYaxun (Sam) Liu   auto SaveLongDoubleWidth = LongDoubleWidth;
466af9ee335SYaxun (Sam) Liu   auto SaveLongDoubleAlign = LongDoubleAlign;
46795f2ca54SYaxun Liu   copyAuxTarget(Aux);
468277e064bSYaxun Liu   LongDoubleFormat = SaveLongDoubleFormat;
469277e064bSYaxun Liu   Float128Format = SaveFloat128Format;
470af9ee335SYaxun (Sam) Liu   LongDoubleWidth = SaveLongDoubleWidth;
471af9ee335SYaxun (Sam) Liu   LongDoubleAlign = SaveLongDoubleAlign;
47286e3b735SMichael Liao   // For certain builtin types support on the host target, claim they are
47386e3b735SMichael Liao   // support to pass the compilation of the host code during the device-side
47486e3b735SMichael Liao   // compilation.
47586e3b735SMichael Liao   // FIXME: As the side effect, we also accept `__float128` uses in the device
47686e3b735SMichael Liao   // code. To rejct these builtin types supported in the host target but not in
47786e3b735SMichael Liao   // the device target, one approach would support `device_builtin` attribute
47886e3b735SMichael Liao   // so that we could tell the device builtin types from the host ones. The
47986e3b735SMichael Liao   // also solves the different representations of the same builtin type, such
48086e3b735SMichael Liao   // as `size_t` in the MSVC environment.
48186e3b735SMichael Liao   if (Aux->hasFloat128Type()) {
48286e3b735SMichael Liao     HasFloat128 = true;
48386e3b735SMichael Liao     Float128Format = DoubleFormat;
48486e3b735SMichael Liao   }
48595f2ca54SYaxun Liu }
486