blob: 51943c737a101d93ac3743bab6e75c252ed35055 [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"
Yaxun Liu8a5fc152018-04-04 21:19:27 +000015#include "Targets.h"
Erich Keaneebba5922017-07-21 22:37:03 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/LangOptions.h"
18#include "clang/Basic/MacroBuilder.h"
19#include "clang/Basic/TargetBuiltins.h"
20#include "clang/Frontend/CodeGenOptions.h"
21#include "llvm/ADT/StringSwitch.h"
22
23using namespace clang;
24using namespace clang::targets;
25
26namespace clang {
27namespace targets {
28
29// If you edit the description strings, make sure you update
30// getPointerWidthV().
31
32static const char *const DataLayoutStringR600 =
33 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
Matt Arsenaultb130ea52018-03-27 19:26:51 +000034 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5";
Erich Keaneebba5922017-07-21 22:37:03 +000035
Yaxun Liu1578a0a2018-03-05 17:50:10 +000036static const char *const DataLayoutStringAMDGCN =
Yaxun Liu651bd732018-02-13 18:01:21 +000037 "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 +000038 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
Matt Arsenaultb130ea52018-03-27 19:26:51 +000039 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5";
Erich Keaneebba5922017-07-21 22:37:03 +000040
Yaxun Liu1578a0a2018-03-05 17:50:10 +000041const LangASMap AMDGPUTargetInfo::AMDGPUDefIsGenMap = {
42 Generic, // Default
43 Global, // opencl_global
44 Local, // opencl_local
45 Constant, // opencl_constant
46 Private, // opencl_private
47 Generic, // opencl_generic
48 Global, // cuda_device
49 Constant, // cuda_constant
50 Local // cuda_shared
Erich Keaneebba5922017-07-21 22:37:03 +000051};
52
Yaxun Liu1578a0a2018-03-05 17:50:10 +000053const LangASMap AMDGPUTargetInfo::AMDGPUDefIsPrivMap = {
54 Private, // Default
55 Global, // opencl_global
56 Local, // opencl_local
57 Constant, // opencl_constant
58 Private, // opencl_private
59 Generic, // opencl_generic
60 Global, // cuda_device
61 Constant, // cuda_constant
62 Local // cuda_shared
Erich Keaneebba5922017-07-21 22:37:03 +000063};
64} // namespace targets
65} // namespace clang
66
67const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
68#define BUILTIN(ID, TYPE, ATTRS) \
69 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
70#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
71 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE},
72#include "clang/Basic/BuiltinsAMDGPU.def"
73};
74
75const char *const AMDGPUTargetInfo::GCCRegNames[] = {
76 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8",
77 "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17",
78 "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26",
79 "v27", "v28", "v29", "v30", "v31", "v32", "v33", "v34", "v35",
80 "v36", "v37", "v38", "v39", "v40", "v41", "v42", "v43", "v44",
81 "v45", "v46", "v47", "v48", "v49", "v50", "v51", "v52", "v53",
82 "v54", "v55", "v56", "v57", "v58", "v59", "v60", "v61", "v62",
83 "v63", "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
84 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79", "v80",
85 "v81", "v82", "v83", "v84", "v85", "v86", "v87", "v88", "v89",
86 "v90", "v91", "v92", "v93", "v94", "v95", "v96", "v97", "v98",
87 "v99", "v100", "v101", "v102", "v103", "v104", "v105", "v106", "v107",
88 "v108", "v109", "v110", "v111", "v112", "v113", "v114", "v115", "v116",
89 "v117", "v118", "v119", "v120", "v121", "v122", "v123", "v124", "v125",
90 "v126", "v127", "v128", "v129", "v130", "v131", "v132", "v133", "v134",
91 "v135", "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
92 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151", "v152",
93 "v153", "v154", "v155", "v156", "v157", "v158", "v159", "v160", "v161",
94 "v162", "v163", "v164", "v165", "v166", "v167", "v168", "v169", "v170",
95 "v171", "v172", "v173", "v174", "v175", "v176", "v177", "v178", "v179",
96 "v180", "v181", "v182", "v183", "v184", "v185", "v186", "v187", "v188",
97 "v189", "v190", "v191", "v192", "v193", "v194", "v195", "v196", "v197",
98 "v198", "v199", "v200", "v201", "v202", "v203", "v204", "v205", "v206",
99 "v207", "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
100 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223", "v224",
101 "v225", "v226", "v227", "v228", "v229", "v230", "v231", "v232", "v233",
102 "v234", "v235", "v236", "v237", "v238", "v239", "v240", "v241", "v242",
103 "v243", "v244", "v245", "v246", "v247", "v248", "v249", "v250", "v251",
104 "v252", "v253", "v254", "v255", "s0", "s1", "s2", "s3", "s4",
105 "s5", "s6", "s7", "s8", "s9", "s10", "s11", "s12", "s13",
106 "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21", "s22",
107 "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
108 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39", "s40",
109 "s41", "s42", "s43", "s44", "s45", "s46", "s47", "s48", "s49",
110 "s50", "s51", "s52", "s53", "s54", "s55", "s56", "s57", "s58",
111 "s59", "s60", "s61", "s62", "s63", "s64", "s65", "s66", "s67",
112 "s68", "s69", "s70", "s71", "s72", "s73", "s74", "s75", "s76",
113 "s77", "s78", "s79", "s80", "s81", "s82", "s83", "s84", "s85",
114 "s86", "s87", "s88", "s89", "s90", "s91", "s92", "s93", "s94",
115 "s95", "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
116 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111", "s112",
117 "s113", "s114", "s115", "s116", "s117", "s118", "s119", "s120", "s121",
118 "s122", "s123", "s124", "s125", "s126", "s127", "exec", "vcc", "scc",
Matt Arsenaulte7da1362018-02-09 16:58:41 +0000119 "m0", "flat_scratch", "exec_lo", "exec_hi", "vcc_lo", "vcc_hi",
Erich Keaneebba5922017-07-21 22:37:03 +0000120 "flat_scratch_lo", "flat_scratch_hi"
121};
122
123ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
124 return llvm::makeArrayRef(GCCRegNames);
125}
126
127bool AMDGPUTargetInfo::initFeatureMap(
128 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
129 const std::vector<std::string> &FeatureVec) const {
130
131 // 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
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000136 switch (parseAMDGCNName(CPU).Kind) {
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000137 case GK_GFX902:
138 case GK_GFX900:
Erich Keaneebba5922017-07-21 22:37:03 +0000139 Features["gfx9-insts"] = true;
140 LLVM_FALLTHROUGH;
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000141 case GK_GFX810:
142 case GK_GFX803:
143 case GK_GFX802:
144 case GK_GFX801:
Erich Keaneebba5922017-07-21 22:37:03 +0000145 Features["16-bit-insts"] = true;
146 Features["dpp"] = true;
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000147 Features["s-memrealtime"] = true;
Erich Keaneebba5922017-07-21 22:37:03 +0000148 break;
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000149 case GK_GFX704:
150 case GK_GFX703:
151 case GK_GFX702:
152 case GK_GFX701:
153 case GK_GFX700:
154 case GK_GFX601:
155 case GK_GFX600:
156 break;
Erich Keaneebba5922017-07-21 22:37:03 +0000157 case GK_NONE:
158 return false;
159 default:
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000160 llvm_unreachable("Unhandled GPU!");
Erich Keaneebba5922017-07-21 22:37:03 +0000161 }
162 } else {
163 if (CPU.empty())
164 CPU = "r600";
165
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000166 switch (parseR600Name(CPU).Kind) {
Erich Keaneebba5922017-07-21 22:37:03 +0000167 case GK_CAYMAN:
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000168 case GK_CYPRESS:
169 case GK_RV770:
170 case GK_RV670:
Matt Arsenaulte4f62802017-12-05 03:51:26 +0000171 // TODO: Add fp64 when implemented.
Erich Keaneebba5922017-07-21 22:37:03 +0000172 break;
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000173 case GK_TURKS:
174 case GK_CAICOS:
175 case GK_BARTS:
176 case GK_SUMO:
177 case GK_REDWOOD:
178 case GK_JUNIPER:
179 case GK_CEDAR:
180 case GK_RV730:
181 case GK_RV710:
182 case GK_RS880:
183 case GK_R630:
184 case GK_R600:
185 break;
Erich Keaneebba5922017-07-21 22:37:03 +0000186 default:
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000187 llvm_unreachable("Unhandled GPU!");
Erich Keaneebba5922017-07-21 22:37:03 +0000188 }
189 }
190
191 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
192}
193
194void AMDGPUTargetInfo::adjustTargetOptions(const CodeGenOptions &CGOpts,
195 TargetOptions &TargetOpts) const {
196 bool hasFP32Denormals = false;
197 bool hasFP64Denormals = false;
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000198 GPUInfo CGOptsGPU = parseGPUName(TargetOpts.CPU);
Erich Keaneebba5922017-07-21 22:37:03 +0000199 for (auto &I : TargetOpts.FeaturesAsWritten) {
200 if (I == "+fp32-denormals" || I == "-fp32-denormals")
201 hasFP32Denormals = true;
202 if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals")
203 hasFP64Denormals = true;
204 }
205 if (!hasFP32Denormals)
206 TargetOpts.Features.push_back(
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000207 (Twine(CGOptsGPU.HasFastFMAF && !CGOpts.FlushDenorm
Erich Keaneebba5922017-07-21 22:37:03 +0000208 ? '+'
209 : '-') +
210 Twine("fp32-denormals"))
211 .str());
212 // Always do not flush fp64 or fp16 denorms.
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000213 if (!hasFP64Denormals && CGOptsGPU.HasFP64)
Erich Keaneebba5922017-07-21 22:37:03 +0000214 TargetOpts.Features.push_back("+fp64-fp16-denormals");
215}
216
Richard Smith47c9b5d2018-02-15 01:01:06 +0000217constexpr AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::InvalidGPU;
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000218constexpr AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::R600GPUs[];
219constexpr AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::AMDGCNGPUs[];
220
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000221AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::parseR600Name(StringRef Name) {
Erich Keanee44bdb32018-02-08 23:16:55 +0000222 const auto *Result = llvm::find_if(
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000223 R600GPUs, [Name](const GPUInfo &GPU) { return GPU.Name == Name; });
Erich Keanee44bdb32018-02-08 23:16:55 +0000224
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000225 if (Result == std::end(R600GPUs))
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000226 return InvalidGPU;
227 return *Result;
Erich Keaneebba5922017-07-21 22:37:03 +0000228}
229
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000230AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::parseAMDGCNName(StringRef Name) {
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000231 const auto *Result = llvm::find_if(
232 AMDGCNGPUs, [Name](const GPUInfo &GPU) { return GPU.Name == Name; });
Erich Keanee44bdb32018-02-08 23:16:55 +0000233
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000234 if (Result == std::end(AMDGCNGPUs))
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000235 return InvalidGPU;
236 return *Result;
Erich Keanee44bdb32018-02-08 23:16:55 +0000237}
238
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000239AMDGPUTargetInfo::GPUInfo AMDGPUTargetInfo::parseGPUName(StringRef Name) const {
240 if (isAMDGCN(getTriple()))
241 return parseAMDGCNName(Name);
242 else
243 return parseR600Name(Name);
244}
245
Erich Keanee44bdb32018-02-08 23:16:55 +0000246void AMDGPUTargetInfo::fillValidCPUList(
247 SmallVectorImpl<StringRef> &Values) const {
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000248 if (isAMDGCN(getTriple()))
249 llvm::for_each(AMDGCNGPUs, [&Values](const GPUInfo &GPU) {
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000250 Values.emplace_back(GPU.Name);});
Erich Keanee44bdb32018-02-08 23:16:55 +0000251 else
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000252 llvm::for_each(R600GPUs, [&Values](const GPUInfo &GPU) {
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000253 Values.emplace_back(GPU.Name);});
Erich Keaneebba5922017-07-21 22:37:03 +0000254}
255
256void AMDGPUTargetInfo::setAddressSpaceMap(bool DefaultIsPrivate) {
Yaxun Liu1578a0a2018-03-05 17:50:10 +0000257 AddrSpaceMap = DefaultIsPrivate ? &AMDGPUDefIsPrivMap : &AMDGPUDefIsGenMap;
Erich Keaneebba5922017-07-21 22:37:03 +0000258}
259
260AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple &Triple,
261 const TargetOptions &Opts)
Yaxun Liu1578a0a2018-03-05 17:50:10 +0000262 : TargetInfo(Triple),
263 GPU(isAMDGCN(Triple) ? AMDGCNGPUs[0] : parseR600Name(Opts.CPU)) {
264 resetDataLayout(isAMDGCN(getTriple()) ? DataLayoutStringAMDGCN
265 : DataLayoutStringR600);
266 assert(DataLayout->getAllocaAddrSpace() == Private);
Yaxun Liu8a5fc152018-04-04 21:19:27 +0000267 GCN_Subarch = CudaArch::GFX803; // Default to fiji
Erich Keaneebba5922017-07-21 22:37:03 +0000268
269 setAddressSpaceMap(Triple.getOS() == llvm::Triple::Mesa3D ||
Erich Keaneebba5922017-07-21 22:37:03 +0000270 !isAMDGCN(Triple));
271 UseAddrSpaceMapMangling = true;
272
273 // Set pointer width and alignment for target address space 0.
274 PointerWidth = PointerAlign = DataLayout->getPointerSizeInBits();
275 if (getMaxPointerWidth() == 64) {
276 LongWidth = LongAlign = 64;
277 SizeType = UnsignedLong;
278 PtrDiffType = SignedLong;
279 IntPtrType = SignedLong;
280 }
Yaxun Liu39195062017-08-04 18:16:31 +0000281
282 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Erich Keaneebba5922017-07-21 22:37:03 +0000283}
284
285void AMDGPUTargetInfo::adjust(LangOptions &Opts) {
286 TargetInfo::adjust(Opts);
Yaxun Liu1578a0a2018-03-05 17:50:10 +0000287 // ToDo: There are still a few places using default address space as private
288 // address space in OpenCL, which needs to be cleaned up, then Opts.OpenCL
289 // can be removed from the following line.
290 setAddressSpaceMap(/*DefaultIsPrivate=*/Opts.OpenCL ||
291 !isAMDGCN(getTriple()));
Erich Keaneebba5922017-07-21 22:37:03 +0000292}
293
294ArrayRef<Builtin::Info> AMDGPUTargetInfo::getTargetBuiltins() const {
295 return llvm::makeArrayRef(BuiltinInfo, clang::AMDGPU::LastTSBuiltin -
296 Builtin::FirstTSBuiltin);
297}
298
299void AMDGPUTargetInfo::getTargetDefines(const LangOptions &Opts,
300 MacroBuilder &Builder) const {
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000301 Builder.defineMacro("__AMD__");
302 Builder.defineMacro("__AMDGPU__");
303
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000304 if (isAMDGCN(getTriple()))
Erich Keaneebba5922017-07-21 22:37:03 +0000305 Builder.defineMacro("__AMDGCN__");
306 else
307 Builder.defineMacro("__R600__");
308
Konstantin Zhuravlyovcf717612018-02-15 02:37:04 +0000309 if (GPU.Kind != GK_NONE)
310 Builder.defineMacro(Twine("__") + Twine(GPU.CanonicalName) + Twine("__"));
311
Yaxun Liu8a5fc152018-04-04 21:19:27 +0000312 if (Opts.CUDAIsDevice)
313 defineCudaArchMacro(GCN_Subarch, Builder);
314
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000315 // TODO: __HAS_FMAF__, __HAS_LDEXPF__, __HAS_FP64__ are deprecated and will be
316 // removed in the near future.
317 if (GPU.HasFMAF)
Erich Keaneebba5922017-07-21 22:37:03 +0000318 Builder.defineMacro("__HAS_FMAF__");
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000319 if (GPU.HasFastFMAF)
320 Builder.defineMacro("FP_FAST_FMAF");
321 if (GPU.HasLDEXPF)
Erich Keaneebba5922017-07-21 22:37:03 +0000322 Builder.defineMacro("__HAS_LDEXPF__");
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000323 if (GPU.HasFP64)
Erich Keaneebba5922017-07-21 22:37:03 +0000324 Builder.defineMacro("__HAS_FP64__");
Konstantin Zhuravlyovd6b34532018-02-27 21:48:05 +0000325 if (GPU.HasFastFMA)
326 Builder.defineMacro("FP_FAST_FMA");
Erich Keaneebba5922017-07-21 22:37:03 +0000327}