xref: /freebsd-src/contrib/llvm-project/llvm/lib/TargetParser/TargetParser.cpp (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
1bdd1243dSDimitry Andric //===-- TargetParser - Parser for target features ---------------*- C++ -*-===//
2bdd1243dSDimitry Andric //
3bdd1243dSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4bdd1243dSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5bdd1243dSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6bdd1243dSDimitry Andric //
7bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
8bdd1243dSDimitry Andric //
9bdd1243dSDimitry Andric // This file implements a target parser to recognise hardware features such as
10bdd1243dSDimitry Andric // FPU/CPU/ARCH names as well as specific support such as HDIV, etc.
11bdd1243dSDimitry Andric //
12bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
13bdd1243dSDimitry Andric 
14bdd1243dSDimitry Andric #include "llvm/TargetParser/TargetParser.h"
15bdd1243dSDimitry Andric #include "llvm/ADT/ArrayRef.h"
16bdd1243dSDimitry Andric #include "llvm/TargetParser/Triple.h"
17bdd1243dSDimitry Andric 
18bdd1243dSDimitry Andric using namespace llvm;
19bdd1243dSDimitry Andric using namespace AMDGPU;
20bdd1243dSDimitry Andric 
21bdd1243dSDimitry Andric namespace {
22bdd1243dSDimitry Andric 
23bdd1243dSDimitry Andric struct GPUInfo {
24bdd1243dSDimitry Andric   StringLiteral Name;
25bdd1243dSDimitry Andric   StringLiteral CanonicalName;
26bdd1243dSDimitry Andric   AMDGPU::GPUKind Kind;
27bdd1243dSDimitry Andric   unsigned Features;
28bdd1243dSDimitry Andric };
29bdd1243dSDimitry Andric 
30bdd1243dSDimitry Andric constexpr GPUInfo R600GPUs[] = {
31bdd1243dSDimitry Andric   // Name       Canonical    Kind        Features
32bdd1243dSDimitry Andric   //            Name
33bdd1243dSDimitry Andric   {{"r600"},    {"r600"},    GK_R600,    FEATURE_NONE },
34bdd1243dSDimitry Andric   {{"rv630"},   {"r600"},    GK_R600,    FEATURE_NONE },
35bdd1243dSDimitry Andric   {{"rv635"},   {"r600"},    GK_R600,    FEATURE_NONE },
36bdd1243dSDimitry Andric   {{"r630"},    {"r630"},    GK_R630,    FEATURE_NONE },
37bdd1243dSDimitry Andric   {{"rs780"},   {"rs880"},   GK_RS880,   FEATURE_NONE },
38bdd1243dSDimitry Andric   {{"rs880"},   {"rs880"},   GK_RS880,   FEATURE_NONE },
39bdd1243dSDimitry Andric   {{"rv610"},   {"rs880"},   GK_RS880,   FEATURE_NONE },
40bdd1243dSDimitry Andric   {{"rv620"},   {"rs880"},   GK_RS880,   FEATURE_NONE },
41bdd1243dSDimitry Andric   {{"rv670"},   {"rv670"},   GK_RV670,   FEATURE_NONE },
42bdd1243dSDimitry Andric   {{"rv710"},   {"rv710"},   GK_RV710,   FEATURE_NONE },
43bdd1243dSDimitry Andric   {{"rv730"},   {"rv730"},   GK_RV730,   FEATURE_NONE },
44bdd1243dSDimitry Andric   {{"rv740"},   {"rv770"},   GK_RV770,   FEATURE_NONE },
45bdd1243dSDimitry Andric   {{"rv770"},   {"rv770"},   GK_RV770,   FEATURE_NONE },
46bdd1243dSDimitry Andric   {{"cedar"},   {"cedar"},   GK_CEDAR,   FEATURE_NONE },
47bdd1243dSDimitry Andric   {{"palm"},    {"cedar"},   GK_CEDAR,   FEATURE_NONE },
48bdd1243dSDimitry Andric   {{"cypress"}, {"cypress"}, GK_CYPRESS, FEATURE_FMA  },
49bdd1243dSDimitry Andric   {{"hemlock"}, {"cypress"}, GK_CYPRESS, FEATURE_FMA  },
50bdd1243dSDimitry Andric   {{"juniper"}, {"juniper"}, GK_JUNIPER, FEATURE_NONE },
51bdd1243dSDimitry Andric   {{"redwood"}, {"redwood"}, GK_REDWOOD, FEATURE_NONE },
52bdd1243dSDimitry Andric   {{"sumo"},    {"sumo"},    GK_SUMO,    FEATURE_NONE },
53bdd1243dSDimitry Andric   {{"sumo2"},   {"sumo"},    GK_SUMO,    FEATURE_NONE },
54bdd1243dSDimitry Andric   {{"barts"},   {"barts"},   GK_BARTS,   FEATURE_NONE },
55bdd1243dSDimitry Andric   {{"caicos"},  {"caicos"},  GK_CAICOS,  FEATURE_NONE },
56bdd1243dSDimitry Andric   {{"aruba"},   {"cayman"},  GK_CAYMAN,  FEATURE_FMA  },
57bdd1243dSDimitry Andric   {{"cayman"},  {"cayman"},  GK_CAYMAN,  FEATURE_FMA  },
58bdd1243dSDimitry Andric   {{"turks"},   {"turks"},   GK_TURKS,   FEATURE_NONE }
59bdd1243dSDimitry Andric };
60bdd1243dSDimitry Andric 
61bdd1243dSDimitry Andric // This table should be sorted by the value of GPUKind
62bdd1243dSDimitry Andric // Don't bother listing the implicitly true features
63bdd1243dSDimitry Andric constexpr GPUInfo AMDGCNGPUs[] = {
64bdd1243dSDimitry Andric   // Name         Canonical    Kind        Features
65bdd1243dSDimitry Andric   //              Name
66bdd1243dSDimitry Andric   {{"gfx600"},    {"gfx600"},  GK_GFX600,  FEATURE_FAST_FMA_F32},
67bdd1243dSDimitry Andric   {{"tahiti"},    {"gfx600"},  GK_GFX600,  FEATURE_FAST_FMA_F32},
68bdd1243dSDimitry Andric   {{"gfx601"},    {"gfx601"},  GK_GFX601,  FEATURE_NONE},
69bdd1243dSDimitry Andric   {{"pitcairn"},  {"gfx601"},  GK_GFX601,  FEATURE_NONE},
70bdd1243dSDimitry Andric   {{"verde"},     {"gfx601"},  GK_GFX601,  FEATURE_NONE},
71bdd1243dSDimitry Andric   {{"gfx602"},    {"gfx602"},  GK_GFX602,  FEATURE_NONE},
72bdd1243dSDimitry Andric   {{"hainan"},    {"gfx602"},  GK_GFX602,  FEATURE_NONE},
73bdd1243dSDimitry Andric   {{"oland"},     {"gfx602"},  GK_GFX602,  FEATURE_NONE},
74bdd1243dSDimitry Andric   {{"gfx700"},    {"gfx700"},  GK_GFX700,  FEATURE_NONE},
75bdd1243dSDimitry Andric   {{"kaveri"},    {"gfx700"},  GK_GFX700,  FEATURE_NONE},
76bdd1243dSDimitry Andric   {{"gfx701"},    {"gfx701"},  GK_GFX701,  FEATURE_FAST_FMA_F32},
77bdd1243dSDimitry Andric   {{"hawaii"},    {"gfx701"},  GK_GFX701,  FEATURE_FAST_FMA_F32},
78bdd1243dSDimitry Andric   {{"gfx702"},    {"gfx702"},  GK_GFX702,  FEATURE_FAST_FMA_F32},
79bdd1243dSDimitry Andric   {{"gfx703"},    {"gfx703"},  GK_GFX703,  FEATURE_NONE},
80bdd1243dSDimitry Andric   {{"kabini"},    {"gfx703"},  GK_GFX703,  FEATURE_NONE},
81bdd1243dSDimitry Andric   {{"mullins"},   {"gfx703"},  GK_GFX703,  FEATURE_NONE},
82bdd1243dSDimitry Andric   {{"gfx704"},    {"gfx704"},  GK_GFX704,  FEATURE_NONE},
83bdd1243dSDimitry Andric   {{"bonaire"},   {"gfx704"},  GK_GFX704,  FEATURE_NONE},
84bdd1243dSDimitry Andric   {{"gfx705"},    {"gfx705"},  GK_GFX705,  FEATURE_NONE},
85bdd1243dSDimitry Andric   {{"gfx801"},    {"gfx801"},  GK_GFX801,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
86bdd1243dSDimitry Andric   {{"carrizo"},   {"gfx801"},  GK_GFX801,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
87bdd1243dSDimitry Andric   {{"gfx802"},    {"gfx802"},  GK_GFX802,  FEATURE_FAST_DENORMAL_F32},
88bdd1243dSDimitry Andric   {{"iceland"},   {"gfx802"},  GK_GFX802,  FEATURE_FAST_DENORMAL_F32},
89bdd1243dSDimitry Andric   {{"tonga"},     {"gfx802"},  GK_GFX802,  FEATURE_FAST_DENORMAL_F32},
90bdd1243dSDimitry Andric   {{"gfx803"},    {"gfx803"},  GK_GFX803,  FEATURE_FAST_DENORMAL_F32},
91bdd1243dSDimitry Andric   {{"fiji"},      {"gfx803"},  GK_GFX803,  FEATURE_FAST_DENORMAL_F32},
92bdd1243dSDimitry Andric   {{"polaris10"}, {"gfx803"},  GK_GFX803,  FEATURE_FAST_DENORMAL_F32},
93bdd1243dSDimitry Andric   {{"polaris11"}, {"gfx803"},  GK_GFX803,  FEATURE_FAST_DENORMAL_F32},
94bdd1243dSDimitry Andric   {{"gfx805"},    {"gfx805"},  GK_GFX805,  FEATURE_FAST_DENORMAL_F32},
95bdd1243dSDimitry Andric   {{"tongapro"},  {"gfx805"},  GK_GFX805,  FEATURE_FAST_DENORMAL_F32},
96bdd1243dSDimitry Andric   {{"gfx810"},    {"gfx810"},  GK_GFX810,  FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
97bdd1243dSDimitry Andric   {{"stoney"},    {"gfx810"},  GK_GFX810,  FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
98bdd1243dSDimitry Andric   {{"gfx900"},    {"gfx900"},  GK_GFX900,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
99bdd1243dSDimitry Andric   {{"gfx902"},    {"gfx902"},  GK_GFX902,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
100bdd1243dSDimitry Andric   {{"gfx904"},    {"gfx904"},  GK_GFX904,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
101bdd1243dSDimitry Andric   {{"gfx906"},    {"gfx906"},  GK_GFX906,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
102bdd1243dSDimitry Andric   {{"gfx908"},    {"gfx908"},  GK_GFX908,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
103bdd1243dSDimitry Andric   {{"gfx909"},    {"gfx909"},  GK_GFX909,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
104bdd1243dSDimitry Andric   {{"gfx90a"},    {"gfx90a"},  GK_GFX90A,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
105bdd1243dSDimitry Andric   {{"gfx90c"},    {"gfx90c"},  GK_GFX90C,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
106bdd1243dSDimitry Andric   {{"gfx940"},    {"gfx940"},  GK_GFX940,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
107*06c3fb27SDimitry Andric   {{"gfx941"},    {"gfx941"},  GK_GFX941,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
108*06c3fb27SDimitry Andric   {{"gfx942"},    {"gfx942"},  GK_GFX942,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
109*06c3fb27SDimitry Andric   {{"gfx1010"},   {"gfx1010"}, GK_GFX1010, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
110*06c3fb27SDimitry Andric   {{"gfx1011"},   {"gfx1011"}, GK_GFX1011, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
111*06c3fb27SDimitry Andric   {{"gfx1012"},   {"gfx1012"}, GK_GFX1012, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
112*06c3fb27SDimitry Andric   {{"gfx1013"},   {"gfx1013"}, GK_GFX1013, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
113*06c3fb27SDimitry Andric   {{"gfx1030"},   {"gfx1030"}, GK_GFX1030, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
114*06c3fb27SDimitry Andric   {{"gfx1031"},   {"gfx1031"}, GK_GFX1031, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
115*06c3fb27SDimitry Andric   {{"gfx1032"},   {"gfx1032"}, GK_GFX1032, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
116*06c3fb27SDimitry Andric   {{"gfx1033"},   {"gfx1033"}, GK_GFX1033, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
117*06c3fb27SDimitry Andric   {{"gfx1034"},   {"gfx1034"}, GK_GFX1034, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
118*06c3fb27SDimitry Andric   {{"gfx1035"},   {"gfx1035"}, GK_GFX1035, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
119*06c3fb27SDimitry Andric   {{"gfx1036"},   {"gfx1036"}, GK_GFX1036, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
120*06c3fb27SDimitry Andric   {{"gfx1100"},   {"gfx1100"}, GK_GFX1100, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
121*06c3fb27SDimitry Andric   {{"gfx1101"},   {"gfx1101"}, GK_GFX1101, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
122*06c3fb27SDimitry Andric   {{"gfx1102"},   {"gfx1102"}, GK_GFX1102, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
123*06c3fb27SDimitry Andric   {{"gfx1103"},   {"gfx1103"}, GK_GFX1103, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
124*06c3fb27SDimitry Andric   {{"gfx1150"},   {"gfx1150"}, GK_GFX1150, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
125*06c3fb27SDimitry Andric   {{"gfx1151"},   {"gfx1151"}, GK_GFX1151, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
126bdd1243dSDimitry Andric };
127bdd1243dSDimitry Andric 
128bdd1243dSDimitry Andric const GPUInfo *getArchEntry(AMDGPU::GPUKind AK, ArrayRef<GPUInfo> Table) {
129bdd1243dSDimitry Andric   GPUInfo Search = { {""}, {""}, AK, AMDGPU::FEATURE_NONE };
130bdd1243dSDimitry Andric 
131bdd1243dSDimitry Andric   auto I =
132bdd1243dSDimitry Andric       llvm::lower_bound(Table, Search, [](const GPUInfo &A, const GPUInfo &B) {
133bdd1243dSDimitry Andric         return A.Kind < B.Kind;
134bdd1243dSDimitry Andric       });
135bdd1243dSDimitry Andric 
136bdd1243dSDimitry Andric   if (I == Table.end())
137bdd1243dSDimitry Andric     return nullptr;
138bdd1243dSDimitry Andric   return I;
139bdd1243dSDimitry Andric }
140bdd1243dSDimitry Andric 
141bdd1243dSDimitry Andric } // namespace
142bdd1243dSDimitry Andric 
143bdd1243dSDimitry Andric StringRef llvm::AMDGPU::getArchNameAMDGCN(GPUKind AK) {
144bdd1243dSDimitry Andric   if (const auto *Entry = getArchEntry(AK, AMDGCNGPUs))
145bdd1243dSDimitry Andric     return Entry->CanonicalName;
146bdd1243dSDimitry Andric   return "";
147bdd1243dSDimitry Andric }
148bdd1243dSDimitry Andric 
149bdd1243dSDimitry Andric StringRef llvm::AMDGPU::getArchNameR600(GPUKind AK) {
150bdd1243dSDimitry Andric   if (const auto *Entry = getArchEntry(AK, R600GPUs))
151bdd1243dSDimitry Andric     return Entry->CanonicalName;
152bdd1243dSDimitry Andric   return "";
153bdd1243dSDimitry Andric }
154bdd1243dSDimitry Andric 
155bdd1243dSDimitry Andric AMDGPU::GPUKind llvm::AMDGPU::parseArchAMDGCN(StringRef CPU) {
156bdd1243dSDimitry Andric   for (const auto &C : AMDGCNGPUs) {
157bdd1243dSDimitry Andric     if (CPU == C.Name)
158bdd1243dSDimitry Andric       return C.Kind;
159bdd1243dSDimitry Andric   }
160bdd1243dSDimitry Andric 
161bdd1243dSDimitry Andric   return AMDGPU::GPUKind::GK_NONE;
162bdd1243dSDimitry Andric }
163bdd1243dSDimitry Andric 
164bdd1243dSDimitry Andric AMDGPU::GPUKind llvm::AMDGPU::parseArchR600(StringRef CPU) {
165bdd1243dSDimitry Andric   for (const auto &C : R600GPUs) {
166bdd1243dSDimitry Andric     if (CPU == C.Name)
167bdd1243dSDimitry Andric       return C.Kind;
168bdd1243dSDimitry Andric   }
169bdd1243dSDimitry Andric 
170bdd1243dSDimitry Andric   return AMDGPU::GPUKind::GK_NONE;
171bdd1243dSDimitry Andric }
172bdd1243dSDimitry Andric 
173bdd1243dSDimitry Andric unsigned AMDGPU::getArchAttrAMDGCN(GPUKind AK) {
174bdd1243dSDimitry Andric   if (const auto *Entry = getArchEntry(AK, AMDGCNGPUs))
175bdd1243dSDimitry Andric     return Entry->Features;
176bdd1243dSDimitry Andric   return FEATURE_NONE;
177bdd1243dSDimitry Andric }
178bdd1243dSDimitry Andric 
179bdd1243dSDimitry Andric unsigned AMDGPU::getArchAttrR600(GPUKind AK) {
180bdd1243dSDimitry Andric   if (const auto *Entry = getArchEntry(AK, R600GPUs))
181bdd1243dSDimitry Andric     return Entry->Features;
182bdd1243dSDimitry Andric   return FEATURE_NONE;
183bdd1243dSDimitry Andric }
184bdd1243dSDimitry Andric 
185bdd1243dSDimitry Andric void AMDGPU::fillValidArchListAMDGCN(SmallVectorImpl<StringRef> &Values) {
186bdd1243dSDimitry Andric   // XXX: Should this only report unique canonical names?
187bdd1243dSDimitry Andric   for (const auto &C : AMDGCNGPUs)
188bdd1243dSDimitry Andric     Values.push_back(C.Name);
189bdd1243dSDimitry Andric }
190bdd1243dSDimitry Andric 
191bdd1243dSDimitry Andric void AMDGPU::fillValidArchListR600(SmallVectorImpl<StringRef> &Values) {
192bdd1243dSDimitry Andric   for (const auto &C : R600GPUs)
193bdd1243dSDimitry Andric     Values.push_back(C.Name);
194bdd1243dSDimitry Andric }
195bdd1243dSDimitry Andric 
196bdd1243dSDimitry Andric AMDGPU::IsaVersion AMDGPU::getIsaVersion(StringRef GPU) {
197bdd1243dSDimitry Andric   AMDGPU::GPUKind AK = parseArchAMDGCN(GPU);
198bdd1243dSDimitry Andric   if (AK == AMDGPU::GPUKind::GK_NONE) {
199bdd1243dSDimitry Andric     if (GPU == "generic-hsa")
200bdd1243dSDimitry Andric       return {7, 0, 0};
201bdd1243dSDimitry Andric     if (GPU == "generic")
202bdd1243dSDimitry Andric       return {6, 0, 0};
203bdd1243dSDimitry Andric     return {0, 0, 0};
204bdd1243dSDimitry Andric   }
205bdd1243dSDimitry Andric 
206bdd1243dSDimitry Andric   switch (AK) {
207bdd1243dSDimitry Andric   case GK_GFX600:  return {6, 0, 0};
208bdd1243dSDimitry Andric   case GK_GFX601:  return {6, 0, 1};
209bdd1243dSDimitry Andric   case GK_GFX602:  return {6, 0, 2};
210bdd1243dSDimitry Andric   case GK_GFX700:  return {7, 0, 0};
211bdd1243dSDimitry Andric   case GK_GFX701:  return {7, 0, 1};
212bdd1243dSDimitry Andric   case GK_GFX702:  return {7, 0, 2};
213bdd1243dSDimitry Andric   case GK_GFX703:  return {7, 0, 3};
214bdd1243dSDimitry Andric   case GK_GFX704:  return {7, 0, 4};
215bdd1243dSDimitry Andric   case GK_GFX705:  return {7, 0, 5};
216bdd1243dSDimitry Andric   case GK_GFX801:  return {8, 0, 1};
217bdd1243dSDimitry Andric   case GK_GFX802:  return {8, 0, 2};
218bdd1243dSDimitry Andric   case GK_GFX803:  return {8, 0, 3};
219bdd1243dSDimitry Andric   case GK_GFX805:  return {8, 0, 5};
220bdd1243dSDimitry Andric   case GK_GFX810:  return {8, 1, 0};
221bdd1243dSDimitry Andric   case GK_GFX900:  return {9, 0, 0};
222bdd1243dSDimitry Andric   case GK_GFX902:  return {9, 0, 2};
223bdd1243dSDimitry Andric   case GK_GFX904:  return {9, 0, 4};
224bdd1243dSDimitry Andric   case GK_GFX906:  return {9, 0, 6};
225bdd1243dSDimitry Andric   case GK_GFX908:  return {9, 0, 8};
226bdd1243dSDimitry Andric   case GK_GFX909:  return {9, 0, 9};
227bdd1243dSDimitry Andric   case GK_GFX90A:  return {9, 0, 10};
228bdd1243dSDimitry Andric   case GK_GFX90C:  return {9, 0, 12};
229bdd1243dSDimitry Andric   case GK_GFX940:  return {9, 4, 0};
230*06c3fb27SDimitry Andric   case GK_GFX941:  return {9, 4, 1};
231*06c3fb27SDimitry Andric   case GK_GFX942:  return {9, 4, 2};
232bdd1243dSDimitry Andric   case GK_GFX1010: return {10, 1, 0};
233bdd1243dSDimitry Andric   case GK_GFX1011: return {10, 1, 1};
234bdd1243dSDimitry Andric   case GK_GFX1012: return {10, 1, 2};
235bdd1243dSDimitry Andric   case GK_GFX1013: return {10, 1, 3};
236bdd1243dSDimitry Andric   case GK_GFX1030: return {10, 3, 0};
237bdd1243dSDimitry Andric   case GK_GFX1031: return {10, 3, 1};
238bdd1243dSDimitry Andric   case GK_GFX1032: return {10, 3, 2};
239bdd1243dSDimitry Andric   case GK_GFX1033: return {10, 3, 3};
240bdd1243dSDimitry Andric   case GK_GFX1034: return {10, 3, 4};
241bdd1243dSDimitry Andric   case GK_GFX1035: return {10, 3, 5};
242bdd1243dSDimitry Andric   case GK_GFX1036: return {10, 3, 6};
243bdd1243dSDimitry Andric   case GK_GFX1100: return {11, 0, 0};
244bdd1243dSDimitry Andric   case GK_GFX1101: return {11, 0, 1};
245bdd1243dSDimitry Andric   case GK_GFX1102: return {11, 0, 2};
246bdd1243dSDimitry Andric   case GK_GFX1103: return {11, 0, 3};
247*06c3fb27SDimitry Andric   case GK_GFX1150: return {11, 5, 0};
248*06c3fb27SDimitry Andric   case GK_GFX1151: return {11, 5, 1};
249bdd1243dSDimitry Andric   default:         return {0, 0, 0};
250bdd1243dSDimitry Andric   }
251bdd1243dSDimitry Andric }
252bdd1243dSDimitry Andric 
253bdd1243dSDimitry Andric StringRef AMDGPU::getCanonicalArchName(const Triple &T, StringRef Arch) {
254bdd1243dSDimitry Andric   assert(T.isAMDGPU());
255bdd1243dSDimitry Andric   auto ProcKind = T.isAMDGCN() ? parseArchAMDGCN(Arch) : parseArchR600(Arch);
256bdd1243dSDimitry Andric   if (ProcKind == GK_NONE)
257bdd1243dSDimitry Andric     return StringRef();
258bdd1243dSDimitry Andric 
259bdd1243dSDimitry Andric   return T.isAMDGCN() ? getArchNameAMDGCN(ProcKind) : getArchNameR600(ProcKind);
260bdd1243dSDimitry Andric }
261*06c3fb27SDimitry Andric 
262*06c3fb27SDimitry Andric void AMDGPU::fillAMDGPUFeatureMap(StringRef GPU, const Triple &T,
263*06c3fb27SDimitry Andric                                   StringMap<bool> &Features) {
264*06c3fb27SDimitry Andric   // XXX - What does the member GPU mean if device name string passed here?
265*06c3fb27SDimitry Andric   if (T.isAMDGCN()) {
266*06c3fb27SDimitry Andric     switch (parseArchAMDGCN(GPU)) {
267*06c3fb27SDimitry Andric     case GK_GFX1151:
268*06c3fb27SDimitry Andric     case GK_GFX1150:
269*06c3fb27SDimitry Andric     case GK_GFX1103:
270*06c3fb27SDimitry Andric     case GK_GFX1102:
271*06c3fb27SDimitry Andric     case GK_GFX1101:
272*06c3fb27SDimitry Andric     case GK_GFX1100:
273*06c3fb27SDimitry Andric       Features["ci-insts"] = true;
274*06c3fb27SDimitry Andric       Features["dot5-insts"] = true;
275*06c3fb27SDimitry Andric       Features["dot7-insts"] = true;
276*06c3fb27SDimitry Andric       Features["dot8-insts"] = true;
277*06c3fb27SDimitry Andric       Features["dot9-insts"] = true;
278*06c3fb27SDimitry Andric       Features["dot10-insts"] = true;
279*06c3fb27SDimitry Andric       Features["dl-insts"] = true;
280*06c3fb27SDimitry Andric       Features["16-bit-insts"] = true;
281*06c3fb27SDimitry Andric       Features["dpp"] = true;
282*06c3fb27SDimitry Andric       Features["gfx8-insts"] = true;
283*06c3fb27SDimitry Andric       Features["gfx9-insts"] = true;
284*06c3fb27SDimitry Andric       Features["gfx10-insts"] = true;
285*06c3fb27SDimitry Andric       Features["gfx10-3-insts"] = true;
286*06c3fb27SDimitry Andric       Features["gfx11-insts"] = true;
287*06c3fb27SDimitry Andric       Features["atomic-fadd-rtn-insts"] = true;
288*06c3fb27SDimitry Andric       Features["image-insts"] = true;
289*06c3fb27SDimitry Andric       break;
290*06c3fb27SDimitry Andric     case GK_GFX1036:
291*06c3fb27SDimitry Andric     case GK_GFX1035:
292*06c3fb27SDimitry Andric     case GK_GFX1034:
293*06c3fb27SDimitry Andric     case GK_GFX1033:
294*06c3fb27SDimitry Andric     case GK_GFX1032:
295*06c3fb27SDimitry Andric     case GK_GFX1031:
296*06c3fb27SDimitry Andric     case GK_GFX1030:
297*06c3fb27SDimitry Andric       Features["ci-insts"] = true;
298*06c3fb27SDimitry Andric       Features["dot1-insts"] = true;
299*06c3fb27SDimitry Andric       Features["dot2-insts"] = true;
300*06c3fb27SDimitry Andric       Features["dot5-insts"] = true;
301*06c3fb27SDimitry Andric       Features["dot6-insts"] = true;
302*06c3fb27SDimitry Andric       Features["dot7-insts"] = true;
303*06c3fb27SDimitry Andric       Features["dot10-insts"] = true;
304*06c3fb27SDimitry Andric       Features["dl-insts"] = true;
305*06c3fb27SDimitry Andric       Features["16-bit-insts"] = true;
306*06c3fb27SDimitry Andric       Features["dpp"] = true;
307*06c3fb27SDimitry Andric       Features["gfx8-insts"] = true;
308*06c3fb27SDimitry Andric       Features["gfx9-insts"] = true;
309*06c3fb27SDimitry Andric       Features["gfx10-insts"] = true;
310*06c3fb27SDimitry Andric       Features["gfx10-3-insts"] = true;
311*06c3fb27SDimitry Andric       Features["image-insts"] = true;
312*06c3fb27SDimitry Andric       Features["s-memrealtime"] = true;
313*06c3fb27SDimitry Andric       Features["s-memtime-inst"] = true;
314*06c3fb27SDimitry Andric       break;
315*06c3fb27SDimitry Andric     case GK_GFX1012:
316*06c3fb27SDimitry Andric     case GK_GFX1011:
317*06c3fb27SDimitry Andric       Features["dot1-insts"] = true;
318*06c3fb27SDimitry Andric       Features["dot2-insts"] = true;
319*06c3fb27SDimitry Andric       Features["dot5-insts"] = true;
320*06c3fb27SDimitry Andric       Features["dot6-insts"] = true;
321*06c3fb27SDimitry Andric       Features["dot7-insts"] = true;
322*06c3fb27SDimitry Andric       Features["dot10-insts"] = true;
323*06c3fb27SDimitry Andric       [[fallthrough]];
324*06c3fb27SDimitry Andric     case GK_GFX1013:
325*06c3fb27SDimitry Andric     case GK_GFX1010:
326*06c3fb27SDimitry Andric       Features["dl-insts"] = true;
327*06c3fb27SDimitry Andric       Features["ci-insts"] = true;
328*06c3fb27SDimitry Andric       Features["16-bit-insts"] = true;
329*06c3fb27SDimitry Andric       Features["dpp"] = true;
330*06c3fb27SDimitry Andric       Features["gfx8-insts"] = true;
331*06c3fb27SDimitry Andric       Features["gfx9-insts"] = true;
332*06c3fb27SDimitry Andric       Features["gfx10-insts"] = true;
333*06c3fb27SDimitry Andric       Features["image-insts"] = true;
334*06c3fb27SDimitry Andric       Features["s-memrealtime"] = true;
335*06c3fb27SDimitry Andric       Features["s-memtime-inst"] = true;
336*06c3fb27SDimitry Andric       break;
337*06c3fb27SDimitry Andric     case GK_GFX942:
338*06c3fb27SDimitry Andric     case GK_GFX941:
339*06c3fb27SDimitry Andric     case GK_GFX940:
340*06c3fb27SDimitry Andric       Features["gfx940-insts"] = true;
341*06c3fb27SDimitry Andric       Features["fp8-insts"] = true;
342*06c3fb27SDimitry Andric       Features["atomic-ds-pk-add-16-insts"] = true;
343*06c3fb27SDimitry Andric       Features["atomic-flat-pk-add-16-insts"] = true;
344*06c3fb27SDimitry Andric       Features["atomic-global-pk-add-bf16-inst"] = true;
345*06c3fb27SDimitry Andric       Features["gfx90a-insts"] = true;
346*06c3fb27SDimitry Andric       Features["atomic-buffer-global-pk-add-f16-insts"] = true;
347*06c3fb27SDimitry Andric       Features["atomic-fadd-rtn-insts"] = true;
348*06c3fb27SDimitry Andric       Features["dot3-insts"] = true;
349*06c3fb27SDimitry Andric       Features["dot4-insts"] = true;
350*06c3fb27SDimitry Andric       Features["dot5-insts"] = true;
351*06c3fb27SDimitry Andric       Features["dot6-insts"] = true;
352*06c3fb27SDimitry Andric       Features["mai-insts"] = true;
353*06c3fb27SDimitry Andric       Features["dl-insts"] = true;
354*06c3fb27SDimitry Andric       Features["dot1-insts"] = true;
355*06c3fb27SDimitry Andric       Features["dot2-insts"] = true;
356*06c3fb27SDimitry Andric       Features["dot7-insts"] = true;
357*06c3fb27SDimitry Andric       Features["dot10-insts"] = true;
358*06c3fb27SDimitry Andric       Features["gfx9-insts"] = true;
359*06c3fb27SDimitry Andric       Features["gfx8-insts"] = true;
360*06c3fb27SDimitry Andric       Features["16-bit-insts"] = true;
361*06c3fb27SDimitry Andric       Features["dpp"] = true;
362*06c3fb27SDimitry Andric       Features["s-memrealtime"] = true;
363*06c3fb27SDimitry Andric       Features["ci-insts"] = true;
364*06c3fb27SDimitry Andric       Features["s-memtime-inst"] = true;
365*06c3fb27SDimitry Andric       break;
366*06c3fb27SDimitry Andric     case GK_GFX90A:
367*06c3fb27SDimitry Andric       Features["gfx90a-insts"] = true;
368*06c3fb27SDimitry Andric       Features["atomic-buffer-global-pk-add-f16-insts"] = true;
369*06c3fb27SDimitry Andric       Features["atomic-fadd-rtn-insts"] = true;
370*06c3fb27SDimitry Andric       [[fallthrough]];
371*06c3fb27SDimitry Andric     case GK_GFX908:
372*06c3fb27SDimitry Andric       Features["dot3-insts"] = true;
373*06c3fb27SDimitry Andric       Features["dot4-insts"] = true;
374*06c3fb27SDimitry Andric       Features["dot5-insts"] = true;
375*06c3fb27SDimitry Andric       Features["dot6-insts"] = true;
376*06c3fb27SDimitry Andric       Features["mai-insts"] = true;
377*06c3fb27SDimitry Andric       [[fallthrough]];
378*06c3fb27SDimitry Andric     case GK_GFX906:
379*06c3fb27SDimitry Andric       Features["dl-insts"] = true;
380*06c3fb27SDimitry Andric       Features["dot1-insts"] = true;
381*06c3fb27SDimitry Andric       Features["dot2-insts"] = true;
382*06c3fb27SDimitry Andric       Features["dot7-insts"] = true;
383*06c3fb27SDimitry Andric       Features["dot10-insts"] = true;
384*06c3fb27SDimitry Andric       [[fallthrough]];
385*06c3fb27SDimitry Andric     case GK_GFX90C:
386*06c3fb27SDimitry Andric     case GK_GFX909:
387*06c3fb27SDimitry Andric     case GK_GFX904:
388*06c3fb27SDimitry Andric     case GK_GFX902:
389*06c3fb27SDimitry Andric     case GK_GFX900:
390*06c3fb27SDimitry Andric       Features["gfx9-insts"] = true;
391*06c3fb27SDimitry Andric       [[fallthrough]];
392*06c3fb27SDimitry Andric     case GK_GFX810:
393*06c3fb27SDimitry Andric     case GK_GFX805:
394*06c3fb27SDimitry Andric     case GK_GFX803:
395*06c3fb27SDimitry Andric     case GK_GFX802:
396*06c3fb27SDimitry Andric     case GK_GFX801:
397*06c3fb27SDimitry Andric       Features["gfx8-insts"] = true;
398*06c3fb27SDimitry Andric       Features["16-bit-insts"] = true;
399*06c3fb27SDimitry Andric       Features["dpp"] = true;
400*06c3fb27SDimitry Andric       Features["s-memrealtime"] = true;
401*06c3fb27SDimitry Andric       [[fallthrough]];
402*06c3fb27SDimitry Andric     case GK_GFX705:
403*06c3fb27SDimitry Andric     case GK_GFX704:
404*06c3fb27SDimitry Andric     case GK_GFX703:
405*06c3fb27SDimitry Andric     case GK_GFX702:
406*06c3fb27SDimitry Andric     case GK_GFX701:
407*06c3fb27SDimitry Andric     case GK_GFX700:
408*06c3fb27SDimitry Andric       Features["ci-insts"] = true;
409*06c3fb27SDimitry Andric       [[fallthrough]];
410*06c3fb27SDimitry Andric     case GK_GFX602:
411*06c3fb27SDimitry Andric     case GK_GFX601:
412*06c3fb27SDimitry Andric     case GK_GFX600:
413*06c3fb27SDimitry Andric       Features["image-insts"] = true;
414*06c3fb27SDimitry Andric       Features["s-memtime-inst"] = true;
415*06c3fb27SDimitry Andric       break;
416*06c3fb27SDimitry Andric     case GK_NONE:
417*06c3fb27SDimitry Andric       break;
418*06c3fb27SDimitry Andric     default:
419*06c3fb27SDimitry Andric       llvm_unreachable("Unhandled GPU!");
420*06c3fb27SDimitry Andric     }
421*06c3fb27SDimitry Andric   } else {
422*06c3fb27SDimitry Andric     if (GPU.empty())
423*06c3fb27SDimitry Andric       GPU = "r600";
424*06c3fb27SDimitry Andric 
425*06c3fb27SDimitry Andric     switch (llvm::AMDGPU::parseArchR600(GPU)) {
426*06c3fb27SDimitry Andric     case GK_CAYMAN:
427*06c3fb27SDimitry Andric     case GK_CYPRESS:
428*06c3fb27SDimitry Andric     case GK_RV770:
429*06c3fb27SDimitry Andric     case GK_RV670:
430*06c3fb27SDimitry Andric       // TODO: Add fp64 when implemented.
431*06c3fb27SDimitry Andric       break;
432*06c3fb27SDimitry Andric     case GK_TURKS:
433*06c3fb27SDimitry Andric     case GK_CAICOS:
434*06c3fb27SDimitry Andric     case GK_BARTS:
435*06c3fb27SDimitry Andric     case GK_SUMO:
436*06c3fb27SDimitry Andric     case GK_REDWOOD:
437*06c3fb27SDimitry Andric     case GK_JUNIPER:
438*06c3fb27SDimitry Andric     case GK_CEDAR:
439*06c3fb27SDimitry Andric     case GK_RV730:
440*06c3fb27SDimitry Andric     case GK_RV710:
441*06c3fb27SDimitry Andric     case GK_RS880:
442*06c3fb27SDimitry Andric     case GK_R630:
443*06c3fb27SDimitry Andric     case GK_R600:
444*06c3fb27SDimitry Andric       break;
445*06c3fb27SDimitry Andric     default:
446*06c3fb27SDimitry Andric       llvm_unreachable("Unhandled GPU!");
447*06c3fb27SDimitry Andric     }
448*06c3fb27SDimitry Andric   }
449*06c3fb27SDimitry Andric }
450*06c3fb27SDimitry Andric 
451*06c3fb27SDimitry Andric static bool isWave32Capable(StringRef GPU, const Triple &T) {
452*06c3fb27SDimitry Andric   bool IsWave32Capable = false;
453*06c3fb27SDimitry Andric   // XXX - What does the member GPU mean if device name string passed here?
454*06c3fb27SDimitry Andric   if (T.isAMDGCN()) {
455*06c3fb27SDimitry Andric     switch (parseArchAMDGCN(GPU)) {
456*06c3fb27SDimitry Andric     case GK_GFX1151:
457*06c3fb27SDimitry Andric     case GK_GFX1150:
458*06c3fb27SDimitry Andric     case GK_GFX1103:
459*06c3fb27SDimitry Andric     case GK_GFX1102:
460*06c3fb27SDimitry Andric     case GK_GFX1101:
461*06c3fb27SDimitry Andric     case GK_GFX1100:
462*06c3fb27SDimitry Andric     case GK_GFX1036:
463*06c3fb27SDimitry Andric     case GK_GFX1035:
464*06c3fb27SDimitry Andric     case GK_GFX1034:
465*06c3fb27SDimitry Andric     case GK_GFX1033:
466*06c3fb27SDimitry Andric     case GK_GFX1032:
467*06c3fb27SDimitry Andric     case GK_GFX1031:
468*06c3fb27SDimitry Andric     case GK_GFX1030:
469*06c3fb27SDimitry Andric     case GK_GFX1012:
470*06c3fb27SDimitry Andric     case GK_GFX1011:
471*06c3fb27SDimitry Andric     case GK_GFX1013:
472*06c3fb27SDimitry Andric     case GK_GFX1010:
473*06c3fb27SDimitry Andric       IsWave32Capable = true;
474*06c3fb27SDimitry Andric       break;
475*06c3fb27SDimitry Andric     default:
476*06c3fb27SDimitry Andric       break;
477*06c3fb27SDimitry Andric     }
478*06c3fb27SDimitry Andric   }
479*06c3fb27SDimitry Andric   return IsWave32Capable;
480*06c3fb27SDimitry Andric }
481*06c3fb27SDimitry Andric 
482*06c3fb27SDimitry Andric bool AMDGPU::insertWaveSizeFeature(StringRef GPU, const Triple &T,
483*06c3fb27SDimitry Andric                                    StringMap<bool> &Features,
484*06c3fb27SDimitry Andric                                    std::string &ErrorMsg) {
485*06c3fb27SDimitry Andric   bool IsWave32Capable = isWave32Capable(GPU, T);
486*06c3fb27SDimitry Andric   const bool IsNullGPU = GPU.empty();
487*06c3fb27SDimitry Andric   // FIXME: Not diagnosing wavefrontsize32 on wave64 only targets.
488*06c3fb27SDimitry Andric   const bool HaveWave32 =
489*06c3fb27SDimitry Andric       (IsWave32Capable || IsNullGPU) && Features.count("wavefrontsize32");
490*06c3fb27SDimitry Andric   const bool HaveWave64 = Features.count("wavefrontsize64");
491*06c3fb27SDimitry Andric   if (HaveWave32 && HaveWave64) {
492*06c3fb27SDimitry Andric     ErrorMsg = "'wavefrontsize32' and 'wavefrontsize64' are mutually exclusive";
493*06c3fb27SDimitry Andric     return false;
494*06c3fb27SDimitry Andric   }
495*06c3fb27SDimitry Andric   // Don't assume any wavesize with an unknown subtarget.
496*06c3fb27SDimitry Andric   if (!IsNullGPU) {
497*06c3fb27SDimitry Andric     // Default to wave32 if available, or wave64 if not
498*06c3fb27SDimitry Andric     if (!HaveWave32 && !HaveWave64) {
499*06c3fb27SDimitry Andric       StringRef DefaultWaveSizeFeature =
500*06c3fb27SDimitry Andric           IsWave32Capable ? "wavefrontsize32" : "wavefrontsize64";
501*06c3fb27SDimitry Andric       Features.insert(std::make_pair(DefaultWaveSizeFeature, true));
502*06c3fb27SDimitry Andric     }
503*06c3fb27SDimitry Andric   }
504*06c3fb27SDimitry Andric   return true;
505*06c3fb27SDimitry Andric }
506