xref: /freebsd-src/contrib/llvm-project/llvm/lib/TargetParser/TargetParser.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
1*bdd1243dSDimitry Andric //===-- TargetParser - Parser for target features ---------------*- C++ -*-===//
2*bdd1243dSDimitry Andric //
3*bdd1243dSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*bdd1243dSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*bdd1243dSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*bdd1243dSDimitry Andric //
7*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
8*bdd1243dSDimitry Andric //
9*bdd1243dSDimitry Andric // This file implements a target parser to recognise hardware features such as
10*bdd1243dSDimitry Andric // FPU/CPU/ARCH names as well as specific support such as HDIV, etc.
11*bdd1243dSDimitry Andric //
12*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
13*bdd1243dSDimitry Andric 
14*bdd1243dSDimitry Andric #include "llvm/TargetParser/TargetParser.h"
15*bdd1243dSDimitry Andric #include "llvm/ADT/ArrayRef.h"
16*bdd1243dSDimitry Andric #include "llvm/ADT/StringSwitch.h"
17*bdd1243dSDimitry Andric #include "llvm/TargetParser/Triple.h"
18*bdd1243dSDimitry Andric 
19*bdd1243dSDimitry Andric using namespace llvm;
20*bdd1243dSDimitry Andric using namespace AMDGPU;
21*bdd1243dSDimitry Andric 
22*bdd1243dSDimitry Andric namespace {
23*bdd1243dSDimitry Andric 
24*bdd1243dSDimitry Andric struct GPUInfo {
25*bdd1243dSDimitry Andric   StringLiteral Name;
26*bdd1243dSDimitry Andric   StringLiteral CanonicalName;
27*bdd1243dSDimitry Andric   AMDGPU::GPUKind Kind;
28*bdd1243dSDimitry Andric   unsigned Features;
29*bdd1243dSDimitry Andric };
30*bdd1243dSDimitry Andric 
31*bdd1243dSDimitry Andric constexpr GPUInfo R600GPUs[] = {
32*bdd1243dSDimitry Andric   // Name       Canonical    Kind        Features
33*bdd1243dSDimitry Andric   //            Name
34*bdd1243dSDimitry Andric   {{"r600"},    {"r600"},    GK_R600,    FEATURE_NONE },
35*bdd1243dSDimitry Andric   {{"rv630"},   {"r600"},    GK_R600,    FEATURE_NONE },
36*bdd1243dSDimitry Andric   {{"rv635"},   {"r600"},    GK_R600,    FEATURE_NONE },
37*bdd1243dSDimitry Andric   {{"r630"},    {"r630"},    GK_R630,    FEATURE_NONE },
38*bdd1243dSDimitry Andric   {{"rs780"},   {"rs880"},   GK_RS880,   FEATURE_NONE },
39*bdd1243dSDimitry Andric   {{"rs880"},   {"rs880"},   GK_RS880,   FEATURE_NONE },
40*bdd1243dSDimitry Andric   {{"rv610"},   {"rs880"},   GK_RS880,   FEATURE_NONE },
41*bdd1243dSDimitry Andric   {{"rv620"},   {"rs880"},   GK_RS880,   FEATURE_NONE },
42*bdd1243dSDimitry Andric   {{"rv670"},   {"rv670"},   GK_RV670,   FEATURE_NONE },
43*bdd1243dSDimitry Andric   {{"rv710"},   {"rv710"},   GK_RV710,   FEATURE_NONE },
44*bdd1243dSDimitry Andric   {{"rv730"},   {"rv730"},   GK_RV730,   FEATURE_NONE },
45*bdd1243dSDimitry Andric   {{"rv740"},   {"rv770"},   GK_RV770,   FEATURE_NONE },
46*bdd1243dSDimitry Andric   {{"rv770"},   {"rv770"},   GK_RV770,   FEATURE_NONE },
47*bdd1243dSDimitry Andric   {{"cedar"},   {"cedar"},   GK_CEDAR,   FEATURE_NONE },
48*bdd1243dSDimitry Andric   {{"palm"},    {"cedar"},   GK_CEDAR,   FEATURE_NONE },
49*bdd1243dSDimitry Andric   {{"cypress"}, {"cypress"}, GK_CYPRESS, FEATURE_FMA  },
50*bdd1243dSDimitry Andric   {{"hemlock"}, {"cypress"}, GK_CYPRESS, FEATURE_FMA  },
51*bdd1243dSDimitry Andric   {{"juniper"}, {"juniper"}, GK_JUNIPER, FEATURE_NONE },
52*bdd1243dSDimitry Andric   {{"redwood"}, {"redwood"}, GK_REDWOOD, FEATURE_NONE },
53*bdd1243dSDimitry Andric   {{"sumo"},    {"sumo"},    GK_SUMO,    FEATURE_NONE },
54*bdd1243dSDimitry Andric   {{"sumo2"},   {"sumo"},    GK_SUMO,    FEATURE_NONE },
55*bdd1243dSDimitry Andric   {{"barts"},   {"barts"},   GK_BARTS,   FEATURE_NONE },
56*bdd1243dSDimitry Andric   {{"caicos"},  {"caicos"},  GK_CAICOS,  FEATURE_NONE },
57*bdd1243dSDimitry Andric   {{"aruba"},   {"cayman"},  GK_CAYMAN,  FEATURE_FMA  },
58*bdd1243dSDimitry Andric   {{"cayman"},  {"cayman"},  GK_CAYMAN,  FEATURE_FMA  },
59*bdd1243dSDimitry Andric   {{"turks"},   {"turks"},   GK_TURKS,   FEATURE_NONE }
60*bdd1243dSDimitry Andric };
61*bdd1243dSDimitry Andric 
62*bdd1243dSDimitry Andric // This table should be sorted by the value of GPUKind
63*bdd1243dSDimitry Andric // Don't bother listing the implicitly true features
64*bdd1243dSDimitry Andric constexpr GPUInfo AMDGCNGPUs[] = {
65*bdd1243dSDimitry Andric   // Name         Canonical    Kind        Features
66*bdd1243dSDimitry Andric   //              Name
67*bdd1243dSDimitry Andric   {{"gfx600"},    {"gfx600"},  GK_GFX600,  FEATURE_FAST_FMA_F32},
68*bdd1243dSDimitry Andric   {{"tahiti"},    {"gfx600"},  GK_GFX600,  FEATURE_FAST_FMA_F32},
69*bdd1243dSDimitry Andric   {{"gfx601"},    {"gfx601"},  GK_GFX601,  FEATURE_NONE},
70*bdd1243dSDimitry Andric   {{"pitcairn"},  {"gfx601"},  GK_GFX601,  FEATURE_NONE},
71*bdd1243dSDimitry Andric   {{"verde"},     {"gfx601"},  GK_GFX601,  FEATURE_NONE},
72*bdd1243dSDimitry Andric   {{"gfx602"},    {"gfx602"},  GK_GFX602,  FEATURE_NONE},
73*bdd1243dSDimitry Andric   {{"hainan"},    {"gfx602"},  GK_GFX602,  FEATURE_NONE},
74*bdd1243dSDimitry Andric   {{"oland"},     {"gfx602"},  GK_GFX602,  FEATURE_NONE},
75*bdd1243dSDimitry Andric   {{"gfx700"},    {"gfx700"},  GK_GFX700,  FEATURE_NONE},
76*bdd1243dSDimitry Andric   {{"kaveri"},    {"gfx700"},  GK_GFX700,  FEATURE_NONE},
77*bdd1243dSDimitry Andric   {{"gfx701"},    {"gfx701"},  GK_GFX701,  FEATURE_FAST_FMA_F32},
78*bdd1243dSDimitry Andric   {{"hawaii"},    {"gfx701"},  GK_GFX701,  FEATURE_FAST_FMA_F32},
79*bdd1243dSDimitry Andric   {{"gfx702"},    {"gfx702"},  GK_GFX702,  FEATURE_FAST_FMA_F32},
80*bdd1243dSDimitry Andric   {{"gfx703"},    {"gfx703"},  GK_GFX703,  FEATURE_NONE},
81*bdd1243dSDimitry Andric   {{"kabini"},    {"gfx703"},  GK_GFX703,  FEATURE_NONE},
82*bdd1243dSDimitry Andric   {{"mullins"},   {"gfx703"},  GK_GFX703,  FEATURE_NONE},
83*bdd1243dSDimitry Andric   {{"gfx704"},    {"gfx704"},  GK_GFX704,  FEATURE_NONE},
84*bdd1243dSDimitry Andric   {{"bonaire"},   {"gfx704"},  GK_GFX704,  FEATURE_NONE},
85*bdd1243dSDimitry Andric   {{"gfx705"},    {"gfx705"},  GK_GFX705,  FEATURE_NONE},
86*bdd1243dSDimitry Andric   {{"gfx801"},    {"gfx801"},  GK_GFX801,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
87*bdd1243dSDimitry Andric   {{"carrizo"},   {"gfx801"},  GK_GFX801,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
88*bdd1243dSDimitry Andric   {{"gfx802"},    {"gfx802"},  GK_GFX802,  FEATURE_FAST_DENORMAL_F32},
89*bdd1243dSDimitry Andric   {{"iceland"},   {"gfx802"},  GK_GFX802,  FEATURE_FAST_DENORMAL_F32},
90*bdd1243dSDimitry Andric   {{"tonga"},     {"gfx802"},  GK_GFX802,  FEATURE_FAST_DENORMAL_F32},
91*bdd1243dSDimitry Andric   {{"gfx803"},    {"gfx803"},  GK_GFX803,  FEATURE_FAST_DENORMAL_F32},
92*bdd1243dSDimitry Andric   {{"fiji"},      {"gfx803"},  GK_GFX803,  FEATURE_FAST_DENORMAL_F32},
93*bdd1243dSDimitry Andric   {{"polaris10"}, {"gfx803"},  GK_GFX803,  FEATURE_FAST_DENORMAL_F32},
94*bdd1243dSDimitry Andric   {{"polaris11"}, {"gfx803"},  GK_GFX803,  FEATURE_FAST_DENORMAL_F32},
95*bdd1243dSDimitry Andric   {{"gfx805"},    {"gfx805"},  GK_GFX805,  FEATURE_FAST_DENORMAL_F32},
96*bdd1243dSDimitry Andric   {{"tongapro"},  {"gfx805"},  GK_GFX805,  FEATURE_FAST_DENORMAL_F32},
97*bdd1243dSDimitry Andric   {{"gfx810"},    {"gfx810"},  GK_GFX810,  FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
98*bdd1243dSDimitry Andric   {{"stoney"},    {"gfx810"},  GK_GFX810,  FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
99*bdd1243dSDimitry Andric   {{"gfx900"},    {"gfx900"},  GK_GFX900,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
100*bdd1243dSDimitry Andric   {{"gfx902"},    {"gfx902"},  GK_GFX902,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
101*bdd1243dSDimitry Andric   {{"gfx904"},    {"gfx904"},  GK_GFX904,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
102*bdd1243dSDimitry Andric   {{"gfx906"},    {"gfx906"},  GK_GFX906,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
103*bdd1243dSDimitry Andric   {{"gfx908"},    {"gfx908"},  GK_GFX908,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
104*bdd1243dSDimitry Andric   {{"gfx909"},    {"gfx909"},  GK_GFX909,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
105*bdd1243dSDimitry Andric   {{"gfx90a"},    {"gfx90a"},  GK_GFX90A,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
106*bdd1243dSDimitry Andric   {{"gfx90c"},    {"gfx90c"},  GK_GFX90C,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
107*bdd1243dSDimitry Andric   {{"gfx940"},    {"gfx940"},  GK_GFX940,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
108*bdd1243dSDimitry Andric   {{"gfx1010"},   {"gfx1010"}, GK_GFX1010, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK},
109*bdd1243dSDimitry Andric   {{"gfx1011"},   {"gfx1011"}, GK_GFX1011, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK},
110*bdd1243dSDimitry Andric   {{"gfx1012"},   {"gfx1012"}, GK_GFX1012, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK},
111*bdd1243dSDimitry Andric   {{"gfx1013"},   {"gfx1013"}, GK_GFX1013, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK},
112*bdd1243dSDimitry Andric   {{"gfx1030"},   {"gfx1030"}, GK_GFX1030, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32},
113*bdd1243dSDimitry Andric   {{"gfx1031"},   {"gfx1031"}, GK_GFX1031, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32},
114*bdd1243dSDimitry Andric   {{"gfx1032"},   {"gfx1032"}, GK_GFX1032, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32},
115*bdd1243dSDimitry Andric   {{"gfx1033"},   {"gfx1033"}, GK_GFX1033, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32},
116*bdd1243dSDimitry Andric   {{"gfx1034"},   {"gfx1034"}, GK_GFX1034, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32},
117*bdd1243dSDimitry Andric   {{"gfx1035"},   {"gfx1035"}, GK_GFX1035, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32},
118*bdd1243dSDimitry Andric   {{"gfx1036"},   {"gfx1036"}, GK_GFX1036, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32},
119*bdd1243dSDimitry Andric   {{"gfx1100"},   {"gfx1100"}, GK_GFX1100, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32},
120*bdd1243dSDimitry Andric   {{"gfx1101"},   {"gfx1101"}, GK_GFX1101, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32},
121*bdd1243dSDimitry Andric   {{"gfx1102"},   {"gfx1102"}, GK_GFX1102, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32},
122*bdd1243dSDimitry Andric   {{"gfx1103"},   {"gfx1103"}, GK_GFX1103, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32},
123*bdd1243dSDimitry Andric };
124*bdd1243dSDimitry Andric 
125*bdd1243dSDimitry Andric const GPUInfo *getArchEntry(AMDGPU::GPUKind AK, ArrayRef<GPUInfo> Table) {
126*bdd1243dSDimitry Andric   GPUInfo Search = { {""}, {""}, AK, AMDGPU::FEATURE_NONE };
127*bdd1243dSDimitry Andric 
128*bdd1243dSDimitry Andric   auto I =
129*bdd1243dSDimitry Andric       llvm::lower_bound(Table, Search, [](const GPUInfo &A, const GPUInfo &B) {
130*bdd1243dSDimitry Andric         return A.Kind < B.Kind;
131*bdd1243dSDimitry Andric       });
132*bdd1243dSDimitry Andric 
133*bdd1243dSDimitry Andric   if (I == Table.end())
134*bdd1243dSDimitry Andric     return nullptr;
135*bdd1243dSDimitry Andric   return I;
136*bdd1243dSDimitry Andric }
137*bdd1243dSDimitry Andric 
138*bdd1243dSDimitry Andric } // namespace
139*bdd1243dSDimitry Andric 
140*bdd1243dSDimitry Andric StringRef llvm::AMDGPU::getArchNameAMDGCN(GPUKind AK) {
141*bdd1243dSDimitry Andric   if (const auto *Entry = getArchEntry(AK, AMDGCNGPUs))
142*bdd1243dSDimitry Andric     return Entry->CanonicalName;
143*bdd1243dSDimitry Andric   return "";
144*bdd1243dSDimitry Andric }
145*bdd1243dSDimitry Andric 
146*bdd1243dSDimitry Andric StringRef llvm::AMDGPU::getArchNameR600(GPUKind AK) {
147*bdd1243dSDimitry Andric   if (const auto *Entry = getArchEntry(AK, R600GPUs))
148*bdd1243dSDimitry Andric     return Entry->CanonicalName;
149*bdd1243dSDimitry Andric   return "";
150*bdd1243dSDimitry Andric }
151*bdd1243dSDimitry Andric 
152*bdd1243dSDimitry Andric AMDGPU::GPUKind llvm::AMDGPU::parseArchAMDGCN(StringRef CPU) {
153*bdd1243dSDimitry Andric   for (const auto &C : AMDGCNGPUs) {
154*bdd1243dSDimitry Andric     if (CPU == C.Name)
155*bdd1243dSDimitry Andric       return C.Kind;
156*bdd1243dSDimitry Andric   }
157*bdd1243dSDimitry Andric 
158*bdd1243dSDimitry Andric   return AMDGPU::GPUKind::GK_NONE;
159*bdd1243dSDimitry Andric }
160*bdd1243dSDimitry Andric 
161*bdd1243dSDimitry Andric AMDGPU::GPUKind llvm::AMDGPU::parseArchR600(StringRef CPU) {
162*bdd1243dSDimitry Andric   for (const auto &C : R600GPUs) {
163*bdd1243dSDimitry Andric     if (CPU == C.Name)
164*bdd1243dSDimitry Andric       return C.Kind;
165*bdd1243dSDimitry Andric   }
166*bdd1243dSDimitry Andric 
167*bdd1243dSDimitry Andric   return AMDGPU::GPUKind::GK_NONE;
168*bdd1243dSDimitry Andric }
169*bdd1243dSDimitry Andric 
170*bdd1243dSDimitry Andric unsigned AMDGPU::getArchAttrAMDGCN(GPUKind AK) {
171*bdd1243dSDimitry Andric   if (const auto *Entry = getArchEntry(AK, AMDGCNGPUs))
172*bdd1243dSDimitry Andric     return Entry->Features;
173*bdd1243dSDimitry Andric   return FEATURE_NONE;
174*bdd1243dSDimitry Andric }
175*bdd1243dSDimitry Andric 
176*bdd1243dSDimitry Andric unsigned AMDGPU::getArchAttrR600(GPUKind AK) {
177*bdd1243dSDimitry Andric   if (const auto *Entry = getArchEntry(AK, R600GPUs))
178*bdd1243dSDimitry Andric     return Entry->Features;
179*bdd1243dSDimitry Andric   return FEATURE_NONE;
180*bdd1243dSDimitry Andric }
181*bdd1243dSDimitry Andric 
182*bdd1243dSDimitry Andric void AMDGPU::fillValidArchListAMDGCN(SmallVectorImpl<StringRef> &Values) {
183*bdd1243dSDimitry Andric   // XXX: Should this only report unique canonical names?
184*bdd1243dSDimitry Andric   for (const auto &C : AMDGCNGPUs)
185*bdd1243dSDimitry Andric     Values.push_back(C.Name);
186*bdd1243dSDimitry Andric }
187*bdd1243dSDimitry Andric 
188*bdd1243dSDimitry Andric void AMDGPU::fillValidArchListR600(SmallVectorImpl<StringRef> &Values) {
189*bdd1243dSDimitry Andric   for (const auto &C : R600GPUs)
190*bdd1243dSDimitry Andric     Values.push_back(C.Name);
191*bdd1243dSDimitry Andric }
192*bdd1243dSDimitry Andric 
193*bdd1243dSDimitry Andric AMDGPU::IsaVersion AMDGPU::getIsaVersion(StringRef GPU) {
194*bdd1243dSDimitry Andric   AMDGPU::GPUKind AK = parseArchAMDGCN(GPU);
195*bdd1243dSDimitry Andric   if (AK == AMDGPU::GPUKind::GK_NONE) {
196*bdd1243dSDimitry Andric     if (GPU == "generic-hsa")
197*bdd1243dSDimitry Andric       return {7, 0, 0};
198*bdd1243dSDimitry Andric     if (GPU == "generic")
199*bdd1243dSDimitry Andric       return {6, 0, 0};
200*bdd1243dSDimitry Andric     return {0, 0, 0};
201*bdd1243dSDimitry Andric   }
202*bdd1243dSDimitry Andric 
203*bdd1243dSDimitry Andric   switch (AK) {
204*bdd1243dSDimitry Andric   case GK_GFX600:  return {6, 0, 0};
205*bdd1243dSDimitry Andric   case GK_GFX601:  return {6, 0, 1};
206*bdd1243dSDimitry Andric   case GK_GFX602:  return {6, 0, 2};
207*bdd1243dSDimitry Andric   case GK_GFX700:  return {7, 0, 0};
208*bdd1243dSDimitry Andric   case GK_GFX701:  return {7, 0, 1};
209*bdd1243dSDimitry Andric   case GK_GFX702:  return {7, 0, 2};
210*bdd1243dSDimitry Andric   case GK_GFX703:  return {7, 0, 3};
211*bdd1243dSDimitry Andric   case GK_GFX704:  return {7, 0, 4};
212*bdd1243dSDimitry Andric   case GK_GFX705:  return {7, 0, 5};
213*bdd1243dSDimitry Andric   case GK_GFX801:  return {8, 0, 1};
214*bdd1243dSDimitry Andric   case GK_GFX802:  return {8, 0, 2};
215*bdd1243dSDimitry Andric   case GK_GFX803:  return {8, 0, 3};
216*bdd1243dSDimitry Andric   case GK_GFX805:  return {8, 0, 5};
217*bdd1243dSDimitry Andric   case GK_GFX810:  return {8, 1, 0};
218*bdd1243dSDimitry Andric   case GK_GFX900:  return {9, 0, 0};
219*bdd1243dSDimitry Andric   case GK_GFX902:  return {9, 0, 2};
220*bdd1243dSDimitry Andric   case GK_GFX904:  return {9, 0, 4};
221*bdd1243dSDimitry Andric   case GK_GFX906:  return {9, 0, 6};
222*bdd1243dSDimitry Andric   case GK_GFX908:  return {9, 0, 8};
223*bdd1243dSDimitry Andric   case GK_GFX909:  return {9, 0, 9};
224*bdd1243dSDimitry Andric   case GK_GFX90A:  return {9, 0, 10};
225*bdd1243dSDimitry Andric   case GK_GFX90C:  return {9, 0, 12};
226*bdd1243dSDimitry Andric   case GK_GFX940:  return {9, 4, 0};
227*bdd1243dSDimitry Andric   case GK_GFX1010: return {10, 1, 0};
228*bdd1243dSDimitry Andric   case GK_GFX1011: return {10, 1, 1};
229*bdd1243dSDimitry Andric   case GK_GFX1012: return {10, 1, 2};
230*bdd1243dSDimitry Andric   case GK_GFX1013: return {10, 1, 3};
231*bdd1243dSDimitry Andric   case GK_GFX1030: return {10, 3, 0};
232*bdd1243dSDimitry Andric   case GK_GFX1031: return {10, 3, 1};
233*bdd1243dSDimitry Andric   case GK_GFX1032: return {10, 3, 2};
234*bdd1243dSDimitry Andric   case GK_GFX1033: return {10, 3, 3};
235*bdd1243dSDimitry Andric   case GK_GFX1034: return {10, 3, 4};
236*bdd1243dSDimitry Andric   case GK_GFX1035: return {10, 3, 5};
237*bdd1243dSDimitry Andric   case GK_GFX1036: return {10, 3, 6};
238*bdd1243dSDimitry Andric   case GK_GFX1100: return {11, 0, 0};
239*bdd1243dSDimitry Andric   case GK_GFX1101: return {11, 0, 1};
240*bdd1243dSDimitry Andric   case GK_GFX1102: return {11, 0, 2};
241*bdd1243dSDimitry Andric   case GK_GFX1103: return {11, 0, 3};
242*bdd1243dSDimitry Andric   default:         return {0, 0, 0};
243*bdd1243dSDimitry Andric   }
244*bdd1243dSDimitry Andric }
245*bdd1243dSDimitry Andric 
246*bdd1243dSDimitry Andric StringRef AMDGPU::getCanonicalArchName(const Triple &T, StringRef Arch) {
247*bdd1243dSDimitry Andric   assert(T.isAMDGPU());
248*bdd1243dSDimitry Andric   auto ProcKind = T.isAMDGCN() ? parseArchAMDGCN(Arch) : parseArchR600(Arch);
249*bdd1243dSDimitry Andric   if (ProcKind == GK_NONE)
250*bdd1243dSDimitry Andric     return StringRef();
251*bdd1243dSDimitry Andric 
252*bdd1243dSDimitry Andric   return T.isAMDGCN() ? getArchNameAMDGCN(ProcKind) : getArchNameR600(ProcKind);
253*bdd1243dSDimitry Andric }
254