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