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