blob: 19dc05f5b0a255abc77d7e91e53cee3c4f4402b7 [file] [log] [blame]
Erich Keaneebba5922017-07-21 22:37:03 +00001//===--- AMDGPU.cpp - Implement AMDGPU target feature support -------------===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Erich Keaneebba5922017-07-21 22:37:03 +00006//
7//===----------------------------------------------------------------------===//
8//
9// This file implements AMDGPU TargetInfo objects.
10//
11//===----------------------------------------------------------------------===//
12
13#include "AMDGPU.h"
14#include "clang/Basic/Builtins.h"
Richard Trieu63688182018-12-11 03:18:39 +000015#include "clang/Basic/CodeGenOptions.h"
Erich Keaneebba5922017-07-21 22:37:03 +000016#include "clang/Basic/LangOptions.h"
17#include "clang/Basic/MacroBuilder.h"
18#include "clang/Basic/TargetBuiltins.h"
Erich Keaneebba5922017-07-21 22:37:03 +000019#include "llvm/ADT/StringSwitch.h"
20
21using namespace clang;
22using namespace clang::targets;
23
24namespace clang {
25namespace targets {
26
27// If you edit the description strings, make sure you update
28// getPointerWidthV().
29
30static const char *const DataLayoutStringR600 =
31 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
Matt Arsenaultb130ea52018-03-27 19:26:51 +000032 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5";
Erich Keaneebba5922017-07-21 22:37:03 +000033
Yaxun Liu1578a0a2018-03-05 17:50:10 +000034static const char *const DataLayoutStringAMDGCN =
Yaxun Liu651bd732018-02-13 18:01:21 +000035 "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32"
Erich Keaneebba5922017-07-21 22:37:03 +000036 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
Matt Arsenaultb130ea52018-03-27 19:26:51 +000037 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5";
Erich Keaneebba5922017-07-21 22:37:03 +000038
Yaxun Liu1578a0a2018-03-05 17:50:10 +000039const LangASMap AMDGPUTargetInfo::AMDGPUDefIsGenMap = {
40 Generic, // Default
41 Global, // opencl_global
42 Local, // opencl_local
43 Constant, // opencl_constant
44 Private, // opencl_private
45 Generic, // opencl_generic
46 Global, // cuda_device
47 Constant, // cuda_constant
48 Local // cuda_shared
Erich Keaneebba5922017-07-21 22:37:03 +000049};
50
Yaxun Liu1578a0a2018-03-05 17:50:10 +000051const LangASMap AMDGPUTargetInfo::AMDGPUDefIsPrivMap = {
52 Private, // Default
53 Global, // opencl_global
54 Local, // opencl_local
55 Constant, // opencl_constant
56 Private, // opencl_private
57 Generic, // opencl_generic
58 Global, // cuda_device
59 Constant, // cuda_constant
60 Local // cuda_shared
Erich Keaneebba5922017-07-21 22:37:03 +000061};
62} // namespace targets
63} // namespace clang
64
65const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
66#define BUILTIN(ID, TYPE, ATTRS) \
67 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
68#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
69 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE},
70#include "clang/Basic/BuiltinsAMDGPU.def"
71};
72
73const char *const AMDGPUTargetInfo::GCCRegNames[] = {
74 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8",
75 "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17",
76 "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26",
77 "v27", "v28", "v29", "v30", "v31", "v32", "v33", "v34", "v35",
78 "v36", "v37", "v38", "v39", "v40", "v41", "v42", "v43", "v44",
79 "v45", "v46", "v47", "v48", "v49", "v50", "v51", "v52", "v53",
80 "v54", "v55", "v56", "v57", "v58", "v59", "v60", "v61", "v62",
81 "v63", "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
82 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79", "v80",
83 "v81", "v82", "v83", "v84", "v85", "v86", "v87", "v88", "v89",
84 "v90", "v91", "v92", "v93", "v94", "v95", "v96", "v97", "v98",
85 "v99", "v100", "v101", "v102", "v103", "v104", "v105", "v106", "v107",
86 "v108", "v109", "v110", "v111", "v112", "v113", "v114", "v115", "v116",
87 "v117", "v118", "v119", "v120", "v121", "v122", "v123", "v124", "v125",
88 "v126", "v127", "v128", "v129", "v130", "v131", "v132", "v133", "v134",
89 "v135", "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
90 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151", "v152",
91 "v153", "v154", "v155", "v156", "v157", "v158", "v159", "v160", "v161",
92 "v162", "v163", "v164", "v165", "v166", "v167", "v168", "v169", "v170",
93 "v171", "v172", "v173", "v174", "v175", "v176", "v177", "v178", "v179",
94 "v180", "v181", "v182", "v183", "v184", "v185", "v186", "v187", "v188",
95 "v189", "v190", "v191", "v192", "v193", "v194", "v195", "v196", "v197",
96 "v198", "v199", "v200", "v201", "v202", "v203", "v204", "v205", "v206",
97 "v207", "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
98 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223", "v224",
99 "v225", "v226", "v227", "v228", "v229", "v230", "v231", "v232", "v233",
100 "v234", "v235", "v236", "v237", "v238", "v239", "v240", "v241", "v242",
101 "v243", "v244", "v245", "v246", "v247", "v248", "v249", "v250", "v251",
102 "v252", "v253", "v254", "v255", "s0", "s1", "s2", "s3", "s4",
103 "s5", "s6", "s7", "s8", "s9", "s10", "s11", "s12", "s13",
104 "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21", "s22",
105 "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
106 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39", "s40",
107 "s41", "s42", "s43", "s44", "s45", "s46", "s47", "s48", "s49",
108 "s50", "s51", "s52", "s53", "s54", "s55", "s56", "s57", "s58",
109 "s59", "s60", "s61", "s62", "s63", "s64", "s65", "s66", "s67",
110 "s68", "s69", "s70", "s71", "s72", "s73", "s74", "s75", "s76",
111 "s77", "s78", "s79", "s80", "s81", "s82", "s83", "s84", "s85",
112 "s86", "s87", "s88", "s89", "s90", "s91", "s92", "s93", "s94",
113 "s95", "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
114 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111", "s112",
115 "s113", "s114", "s115", "s116", "s117", "s118", "s119", "s120", "s121",
116 "s122", "s123", "s124", "s125", "s126", "s127", "exec", "vcc", "scc",
Matt Arsenaulte7da1362018-02-09 16:58:41 +0000117 "m0", "flat_scratch", "exec_lo", "exec_hi", "vcc_lo", "vcc_hi",
Erich Keaneebba5922017-07-21 22:37:03 +0000118 "flat_scratch_lo", "flat_scratch_hi"
119};
120
121ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
122 return llvm::makeArrayRef(GCCRegNames);
123}
124
125bool AMDGPUTargetInfo::initFeatureMap(
126 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
127 const std::vector<std::string> &FeatureVec) const {
128
Matt Arsenaultb666e732018-08-21 16:13:29 +0000129 using namespace llvm::AMDGPU;
130
Erich Keaneebba5922017-07-21 22:37:03 +0000131 // XXX - What does the member GPU mean if device name string passed here?
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000132 if (isAMDGCN(getTriple())) {
Erich Keaneebba5922017-07-21 22:37:03 +0000133 if (CPU.empty())
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000134 CPU = "gfx600";
Erich Keaneebba5922017-07-21 22:37:03 +0000135
Matt Arsenaultb666e732018-08-21 16:13:29 +0000136 switch (llvm::AMDGPU::parseArchAMDGCN(CPU)) {
Matt Arsenaultd2da3c22018-04-30 19:08:27 +0000137 case GK_GFX906:
138 Features["dl-insts"] = true;
Stanislav Mekhanoshin6332f4d2019-01-10 03:25:47 +0000139 Features["dot-insts"] = true;
Matt Arsenaultd2da3c22018-04-30 19:08:27 +0000140 LLVM_FALLTHROUGH;
Konstantin Zhuravlyov06570952018-10-24 19:07:56 +0000141 case GK_GFX909:
Matt Arsenaultd2da3c22018-04-30 19:08:27 +0000142 case GK_GFX904:
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000143 case GK_GFX902:
144 case GK_GFX900:
Erich Keaneebba5922017-07-21 22:37:03 +0000145 Features["gfx9-insts"] = true;
146 LLVM_FALLTHROUGH;
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000147 case GK_GFX810:
148 case GK_GFX803:
149 case GK_GFX802:
150 case GK_GFX801:
Matt Arsenault31c895e2018-08-07 07:49:13 +0000151 Features["vi-insts"] = true;
Erich Keaneebba5922017-07-21 22:37:03 +0000152 Features["16-bit-insts"] = true;
153 Features["dpp"] = true;
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000154 Features["s-memrealtime"] = true;
Matt Arsenault24f39242018-08-07 07:49:04 +0000155 LLVM_FALLTHROUGH;
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000156 case GK_GFX704:
157 case GK_GFX703:
158 case GK_GFX702:
159 case GK_GFX701:
160 case GK_GFX700:
Matt Arsenault24f39242018-08-07 07:49:04 +0000161 Features["ci-insts"] = true;
162 LLVM_FALLTHROUGH;
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000163 case GK_GFX601:
164 case GK_GFX600:
165 break;
Erich Keaneebba5922017-07-21 22:37:03 +0000166 case GK_NONE:
167 return false;
168 default:
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000169 llvm_unreachable("Unhandled GPU!");
Erich Keaneebba5922017-07-21 22:37:03 +0000170 }
171 } else {
172 if (CPU.empty())
173 CPU = "r600";
174
Matt Arsenaultb666e732018-08-21 16:13:29 +0000175 switch (llvm::AMDGPU::parseArchR600(CPU)) {
Erich Keaneebba5922017-07-21 22:37:03 +0000176 case GK_CAYMAN:
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000177 case GK_CYPRESS:
178 case GK_RV770:
179 case GK_RV670:
Matt Arsenaulte4f62802017-12-05 03:51:26 +0000180 // TODO: Add fp64 when implemented.
Erich Keaneebba5922017-07-21 22:37:03 +0000181 break;
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000182 case GK_TURKS:
183 case GK_CAICOS:
184 case GK_BARTS:
185 case GK_SUMO:
186 case GK_REDWOOD:
187 case GK_JUNIPER:
188 case GK_CEDAR:
189 case GK_RV730:
190 case GK_RV710:
191 case GK_RS880:
192 case GK_R630:
193 case GK_R600:
194 break;
Erich Keaneebba5922017-07-21 22:37:03 +0000195 default:
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000196 llvm_unreachable("Unhandled GPU!");
Erich Keaneebba5922017-07-21 22:37:03 +0000197 }
198 }
199
200 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
201}
202
203void AMDGPUTargetInfo::adjustTargetOptions(const CodeGenOptions &CGOpts,
204 TargetOptions &TargetOpts) const {
205 bool hasFP32Denormals = false;
206 bool hasFP64Denormals = false;
Matt Arsenaultb666e732018-08-21 16:13:29 +0000207
Erich Keaneebba5922017-07-21 22:37:03 +0000208 for (auto &I : TargetOpts.FeaturesAsWritten) {
209 if (I == "+fp32-denormals" || I == "-fp32-denormals")
210 hasFP32Denormals = true;
211 if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals")
212 hasFP64Denormals = true;
213 }
214 if (!hasFP32Denormals)
215 TargetOpts.Features.push_back(
Matt Arsenaultb666e732018-08-21 16:13:29 +0000216 (Twine(hasFastFMAF() && hasFullRateDenormalsF32() && !CGOpts.FlushDenorm
217 ? '+' : '-') + Twine("fp32-denormals"))
Erich Keaneebba5922017-07-21 22:37:03 +0000218 .str());
219 // Always do not flush fp64 or fp16 denorms.
Matt Arsenaultb666e732018-08-21 16:13:29 +0000220 if (!hasFP64Denormals && hasFP64())
Erich Keaneebba5922017-07-21 22:37:03 +0000221 TargetOpts.Features.push_back("+fp64-fp16-denormals");
222}
223
Erich Keanee44bdb32018-02-08 23:16:55 +0000224void AMDGPUTargetInfo::fillValidCPUList(
225 SmallVectorImpl<StringRef> &Values) const {
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000226 if (isAMDGCN(getTriple()))
Matt Arsenaultb666e732018-08-21 16:13:29 +0000227 llvm::AMDGPU::fillValidArchListAMDGCN(Values);
Erich Keanee44bdb32018-02-08 23:16:55 +0000228 else
Matt Arsenaultb666e732018-08-21 16:13:29 +0000229 llvm::AMDGPU::fillValidArchListR600(Values);
Erich Keaneebba5922017-07-21 22:37:03 +0000230}
231
232void AMDGPUTargetInfo::setAddressSpaceMap(bool DefaultIsPrivate) {
Yaxun Liu1578a0a2018-03-05 17:50:10 +0000233 AddrSpaceMap = DefaultIsPrivate ? &AMDGPUDefIsPrivMap : &AMDGPUDefIsGenMap;
Erich Keaneebba5922017-07-21 22:37:03 +0000234}
235
236AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple &Triple,
237 const TargetOptions &Opts)
Yaxun Liu1578a0a2018-03-05 17:50:10 +0000238 : TargetInfo(Triple),
Matt Arsenaultb666e732018-08-21 16:13:29 +0000239 GPUKind(isAMDGCN(Triple) ?
240 llvm::AMDGPU::parseArchAMDGCN(Opts.CPU) :
241 llvm::AMDGPU::parseArchR600(Opts.CPU)),
242 GPUFeatures(isAMDGCN(Triple) ?
243 llvm::AMDGPU::getArchAttrAMDGCN(GPUKind) :
244 llvm::AMDGPU::getArchAttrR600(GPUKind)) {
Yaxun Liu1578a0a2018-03-05 17:50:10 +0000245 resetDataLayout(isAMDGCN(getTriple()) ? DataLayoutStringAMDGCN
246 : DataLayoutStringR600);
247 assert(DataLayout->getAllocaAddrSpace() == Private);
Erich Keaneebba5922017-07-21 22:37:03 +0000248
249 setAddressSpaceMap(Triple.getOS() == llvm::Triple::Mesa3D ||
Erich Keaneebba5922017-07-21 22:37:03 +0000250 !isAMDGCN(Triple));
251 UseAddrSpaceMapMangling = true;
252
253 // Set pointer width and alignment for target address space 0.
254 PointerWidth = PointerAlign = DataLayout->getPointerSizeInBits();
255 if (getMaxPointerWidth() == 64) {
256 LongWidth = LongAlign = 64;
257 SizeType = UnsignedLong;
258 PtrDiffType = SignedLong;
259 IntPtrType = SignedLong;
260 }
Yaxun Liu39195062017-08-04 18:16:31 +0000261
262 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Erich Keaneebba5922017-07-21 22:37:03 +0000263}
264
265void AMDGPUTargetInfo::adjust(LangOptions &Opts) {
266 TargetInfo::adjust(Opts);
Yaxun Liu1578a0a2018-03-05 17:50:10 +0000267 // ToDo: There are still a few places using default address space as private
268 // address space in OpenCL, which needs to be cleaned up, then Opts.OpenCL
269 // can be removed from the following line.
270 setAddressSpaceMap(/*DefaultIsPrivate=*/Opts.OpenCL ||
271 !isAMDGCN(getTriple()));
Erich Keaneebba5922017-07-21 22:37:03 +0000272}
273
274ArrayRef<Builtin::Info> AMDGPUTargetInfo::getTargetBuiltins() const {
275 return llvm::makeArrayRef(BuiltinInfo, clang::AMDGPU::LastTSBuiltin -
276 Builtin::FirstTSBuiltin);
277}
278
279void AMDGPUTargetInfo::getTargetDefines(const LangOptions &Opts,
280 MacroBuilder &Builder) const {
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000281 Builder.defineMacro("__AMD__");
282 Builder.defineMacro("__AMDGPU__");
283
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000284 if (isAMDGCN(getTriple()))
Erich Keaneebba5922017-07-21 22:37:03 +0000285 Builder.defineMacro("__AMDGCN__");
286 else
287 Builder.defineMacro("__R600__");
288
Matt Arsenaultb666e732018-08-21 16:13:29 +0000289 if (GPUKind != llvm::AMDGPU::GK_NONE) {
290 StringRef CanonName = isAMDGCN(getTriple()) ?
291 getArchNameAMDGCN(GPUKind) : getArchNameR600(GPUKind);
292 Builder.defineMacro(Twine("__") + Twine(CanonName) + Twine("__"));
293 }
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000294
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000295 // TODO: __HAS_FMAF__, __HAS_LDEXPF__, __HAS_FP64__ are deprecated and will be
296 // removed in the near future.
Matt Arsenaultb666e732018-08-21 16:13:29 +0000297 if (hasFMAF())
Erich Keaneebba5922017-07-21 22:37:03 +0000298 Builder.defineMacro("__HAS_FMAF__");
Matt Arsenaultb666e732018-08-21 16:13:29 +0000299 if (hasFastFMAF())
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000300 Builder.defineMacro("FP_FAST_FMAF");
Matt Arsenaultb666e732018-08-21 16:13:29 +0000301 if (hasLDEXPF())
Erich Keaneebba5922017-07-21 22:37:03 +0000302 Builder.defineMacro("__HAS_LDEXPF__");
Matt Arsenaultb666e732018-08-21 16:13:29 +0000303 if (hasFP64())
Erich Keaneebba5922017-07-21 22:37:03 +0000304 Builder.defineMacro("__HAS_FP64__");
Matt Arsenaultb666e732018-08-21 16:13:29 +0000305 if (hasFastFMA())
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000306 Builder.defineMacro("FP_FAST_FMA");
Erich Keaneebba5922017-07-21 22:37:03 +0000307}
Yaxun Liu95f2ca52019-01-30 12:26:54 +0000308
309void AMDGPUTargetInfo::setAuxTarget(const TargetInfo *Aux) {
310 copyAuxTarget(Aux);
311}