blob: 88a5f7743497bcb24a954e9e6c10e22d41fc71b4 [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"
16#include "clang/Basic/LangOptions.h"
17#include "clang/Basic/MacroBuilder.h"
18#include "clang/Basic/TargetBuiltins.h"
19#include "clang/Frontend/CodeGenOptions.h"
20#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
130 // XXX - What does the member GPU mean if device name string passed here?
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000131 if (isAMDGCN(getTriple())) {
Erich Keaneebba5922017-07-21 22:37:03 +0000132 if (CPU.empty())
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000133 CPU = "gfx600";
Erich Keaneebba5922017-07-21 22:37:03 +0000134
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000135 switch (parseAMDGCNName(CPU).Kind) {
Matt Arsenaultd2da3c22018-04-30 19:08:27 +0000136 case GK_GFX906:
137 Features["dl-insts"] = true;
138 LLVM_FALLTHROUGH;
139 case GK_GFX904:
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000140 case GK_GFX902:
141 case GK_GFX900:
Erich Keaneebba5922017-07-21 22:37:03 +0000142 Features["gfx9-insts"] = true;
143 LLVM_FALLTHROUGH;
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000144 case GK_GFX810:
145 case GK_GFX803:
146 case GK_GFX802:
147 case GK_GFX801:
Matt Arsenault31c895e2018-08-07 07:49:13 +0000148 Features["vi-insts"] = true;
Erich Keaneebba5922017-07-21 22:37:03 +0000149 Features["16-bit-insts"] = true;
150 Features["dpp"] = true;
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000151 Features["s-memrealtime"] = true;
Matt Arsenault24f39242018-08-07 07:49:04 +0000152 LLVM_FALLTHROUGH;
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000153 case GK_GFX704:
154 case GK_GFX703:
155 case GK_GFX702:
156 case GK_GFX701:
157 case GK_GFX700:
Matt Arsenault24f39242018-08-07 07:49:04 +0000158 Features["ci-insts"] = true;
159 LLVM_FALLTHROUGH;
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000160 case GK_GFX601:
161 case GK_GFX600:
162 break;
Erich Keaneebba5922017-07-21 22:37:03 +0000163 case GK_NONE:
164 return false;
165 default:
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000166 llvm_unreachable("Unhandled GPU!");
Erich Keaneebba5922017-07-21 22:37:03 +0000167 }
168 } else {
169 if (CPU.empty())
170 CPU = "r600";
171
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000172 switch (parseR600Name(CPU).Kind) {
Erich Keaneebba5922017-07-21 22:37:03 +0000173 case GK_CAYMAN:
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000174 case GK_CYPRESS:
175 case GK_RV770:
176 case GK_RV670:
Matt Arsenaulte4f62802017-12-05 03:51:26 +0000177 // TODO: Add fp64 when implemented.
Erich Keaneebba5922017-07-21 22:37:03 +0000178 break;
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000179 case GK_TURKS:
180 case GK_CAICOS:
181 case GK_BARTS:
182 case GK_SUMO:
183 case GK_REDWOOD:
184 case GK_JUNIPER:
185 case GK_CEDAR:
186 case GK_RV730:
187 case GK_RV710:
188 case GK_RS880:
189 case GK_R630:
190 case GK_R600:
191 break;
Erich Keaneebba5922017-07-21 22:37:03 +0000192 default:
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000193 llvm_unreachable("Unhandled GPU!");
Erich Keaneebba5922017-07-21 22:37:03 +0000194 }
195 }
196
197 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
198}
199
200void AMDGPUTargetInfo::adjustTargetOptions(const CodeGenOptions &CGOpts,
201 TargetOptions &TargetOpts) const {
202 bool hasFP32Denormals = false;
203 bool hasFP64Denormals = false;
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000204 GPUInfo CGOptsGPU = parseGPUName(TargetOpts.CPU);
Erich Keaneebba5922017-07-21 22:37:03 +0000205 for (auto &I : TargetOpts.FeaturesAsWritten) {
206 if (I == "+fp32-denormals" || I == "-fp32-denormals")
207 hasFP32Denormals = true;
208 if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals")
209 hasFP64Denormals = true;
210 }
211 if (!hasFP32Denormals)
212 TargetOpts.Features.push_back(
Matt Arsenault45bc1482018-08-08 17:48:37 +0000213 (Twine(CGOptsGPU.HasFastFMAF && CGOptsGPU.HasFullRateF32Denorms &&
214 !CGOpts.FlushDenorm
Erich Keaneebba5922017-07-21 22:37:03 +0000215 ? '+'
216 : '-') +
217 Twine("fp32-denormals"))
218 .str());
219 // Always do not flush fp64 or fp16 denorms.
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000220 if (!hasFP64Denormals && CGOptsGPU.HasFP64)
Erich Keaneebba5922017-07-21 22:37:03 +0000221 TargetOpts.Features.push_back("+fp64-fp16-denormals");
222}
223
Richard Smith47c9b5d2018-02-15 01:01:06 +0000224constexpr AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::InvalidGPU;
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000225constexpr AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::R600GPUs[];
226constexpr AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::AMDGCNGPUs[];
227
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000228AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::parseR600Name(StringRef Name) {
Erich Keanee44bdb32018-02-08 23:16:55 +0000229 const auto *Result = llvm::find_if(
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000230 R600GPUs, [Name](const GPUInfo &GPU) { return GPU.Name == Name; });
Erich Keanee44bdb32018-02-08 23:16:55 +0000231
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000232 if (Result == std::end(R600GPUs))
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000233 return InvalidGPU;
234 return *Result;
Erich Keaneebba5922017-07-21 22:37:03 +0000235}
236
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000237AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::parseAMDGCNName(StringRef Name) {
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000238 const auto *Result = llvm::find_if(
239 AMDGCNGPUs, [Name](const GPUInfo &GPU) { return GPU.Name == Name; });
Erich Keanee44bdb32018-02-08 23:16:55 +0000240
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000241 if (Result == std::end(AMDGCNGPUs))
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000242 return InvalidGPU;
243 return *Result;
Erich Keanee44bdb32018-02-08 23:16:55 +0000244}
245
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000246AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::parseGPUName(StringRef Name) const {
247 if (isAMDGCN(getTriple()))
248 return parseAMDGCNName(Name);
249 else
250 return parseR600Name(Name);
251}
252
Erich Keanee44bdb32018-02-08 23:16:55 +0000253void AMDGPUTargetInfo::fillValidCPUList(
254 SmallVectorImpl<StringRef> &Values) const {
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000255 if (isAMDGCN(getTriple()))
256 llvm::for_each(AMDGCNGPUs, [&Values](const GPUInfo &GPU) {
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000257 Values.emplace_back(GPU.Name);});
Erich Keanee44bdb32018-02-08 23:16:55 +0000258 else
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000259 llvm::for_each(R600GPUs, [&Values](const GPUInfo &GPU) {
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000260 Values.emplace_back(GPU.Name);});
Erich Keaneebba5922017-07-21 22:37:03 +0000261}
262
263void AMDGPUTargetInfo::setAddressSpaceMap(bool DefaultIsPrivate) {
Yaxun Liu1578a0a2018-03-05 17:50:10 +0000264 AddrSpaceMap = DefaultIsPrivate ? &AMDGPUDefIsPrivMap : &AMDGPUDefIsGenMap;
Erich Keaneebba5922017-07-21 22:37:03 +0000265}
266
267AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple &Triple,
268 const TargetOptions &Opts)
Yaxun Liu1578a0a2018-03-05 17:50:10 +0000269 : TargetInfo(Triple),
270 GPU(isAMDGCN(Triple) ? AMDGCNGPUs[0] : parseR600Name(Opts.CPU)) {
271 resetDataLayout(isAMDGCN(getTriple()) ? DataLayoutStringAMDGCN
272 : DataLayoutStringR600);
273 assert(DataLayout->getAllocaAddrSpace() == Private);
Erich Keaneebba5922017-07-21 22:37:03 +0000274
275 setAddressSpaceMap(Triple.getOS() == llvm::Triple::Mesa3D ||
Erich Keaneebba5922017-07-21 22:37:03 +0000276 !isAMDGCN(Triple));
277 UseAddrSpaceMapMangling = true;
278
279 // Set pointer width and alignment for target address space 0.
280 PointerWidth = PointerAlign = DataLayout->getPointerSizeInBits();
281 if (getMaxPointerWidth() == 64) {
282 LongWidth = LongAlign = 64;
283 SizeType = UnsignedLong;
284 PtrDiffType = SignedLong;
285 IntPtrType = SignedLong;
286 }
Yaxun Liu39195062017-08-04 18:16:31 +0000287
288 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Erich Keaneebba5922017-07-21 22:37:03 +0000289}
290
291void AMDGPUTargetInfo::adjust(LangOptions &Opts) {
292 TargetInfo::adjust(Opts);
Yaxun Liu1578a0a2018-03-05 17:50:10 +0000293 // ToDo: There are still a few places using default address space as private
294 // address space in OpenCL, which needs to be cleaned up, then Opts.OpenCL
295 // can be removed from the following line.
296 setAddressSpaceMap(/*DefaultIsPrivate=*/Opts.OpenCL ||
297 !isAMDGCN(getTriple()));
Erich Keaneebba5922017-07-21 22:37:03 +0000298}
299
300ArrayRef<Builtin::Info> AMDGPUTargetInfo::getTargetBuiltins() const {
301 return llvm::makeArrayRef(BuiltinInfo, clang::AMDGPU::LastTSBuiltin -
302 Builtin::FirstTSBuiltin);
303}
304
305void AMDGPUTargetInfo::getTargetDefines(const LangOptions &Opts,
306 MacroBuilder &Builder) const {
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000307 Builder.defineMacro("__AMD__");
308 Builder.defineMacro("__AMDGPU__");
309
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000310 if (isAMDGCN(getTriple()))
Erich Keaneebba5922017-07-21 22:37:03 +0000311 Builder.defineMacro("__AMDGCN__");
312 else
313 Builder.defineMacro("__R600__");
314
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000315 if (GPU.Kind != GK_NONE)
316 Builder.defineMacro(Twine("__") + Twine(GPU.CanonicalName) + Twine("__"));
317
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000318 // TODO: __HAS_FMAF__, __HAS_LDEXPF__, __HAS_FP64__ are deprecated and will be
319 // removed in the near future.
320 if (GPU.HasFMAF)
Erich Keaneebba5922017-07-21 22:37:03 +0000321 Builder.defineMacro("__HAS_FMAF__");
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000322 if (GPU.HasFastFMAF)
323 Builder.defineMacro("FP_FAST_FMAF");
324 if (GPU.HasLDEXPF)
Erich Keaneebba5922017-07-21 22:37:03 +0000325 Builder.defineMacro("__HAS_LDEXPF__");
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000326 if (GPU.HasFP64)
Erich Keaneebba5922017-07-21 22:37:03 +0000327 Builder.defineMacro("__HAS_FP64__");
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000328 if (GPU.HasFastFMA)
329 Builder.defineMacro("FP_FAST_FMA");
Erich Keaneebba5922017-07-21 22:37:03 +0000330}