xref: /src/contrib/llvm-project/llvm/lib/TargetParser/TargetParser.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
15a5ac124SDimitry Andric //===-- TargetParser - Parser for target features ---------------*- C++ -*-===//
25a5ac124SDimitry Andric //
3e6d15924SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e6d15924SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5e6d15924SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a5ac124SDimitry Andric //
75a5ac124SDimitry Andric //===----------------------------------------------------------------------===//
85a5ac124SDimitry Andric //
95a5ac124SDimitry Andric // This file implements a target parser to recognise hardware features such as
105a5ac124SDimitry Andric // FPU/CPU/ARCH names as well as specific support such as HDIV, etc.
115a5ac124SDimitry Andric //
125a5ac124SDimitry Andric //===----------------------------------------------------------------------===//
135a5ac124SDimitry Andric 
14e3b55780SDimitry Andric #include "llvm/TargetParser/TargetParser.h"
15d8e91e46SDimitry Andric #include "llvm/ADT/ArrayRef.h"
16e3b55780SDimitry Andric #include "llvm/TargetParser/Triple.h"
175a5ac124SDimitry Andric 
185a5ac124SDimitry Andric using namespace llvm;
19d8e91e46SDimitry Andric using namespace AMDGPU;
205a5ac124SDimitry Andric 
215a5ac124SDimitry Andric namespace {
225a5ac124SDimitry Andric 
23d8e91e46SDimitry Andric struct GPUInfo {
24d8e91e46SDimitry Andric   StringLiteral Name;
25d8e91e46SDimitry Andric   StringLiteral CanonicalName;
26d8e91e46SDimitry Andric   AMDGPU::GPUKind Kind;
27d8e91e46SDimitry Andric   unsigned Features;
285a5ac124SDimitry Andric };
2985d8b2bbSDimitry Andric 
30b60736ecSDimitry Andric constexpr GPUInfo R600GPUs[] = {
31d8e91e46SDimitry Andric   // Name       Canonical    Kind        Features
32d8e91e46SDimitry Andric   //            Name
33d8e91e46SDimitry Andric   {{"r600"},    {"r600"},    GK_R600,    FEATURE_NONE },
34d8e91e46SDimitry Andric   {{"rv630"},   {"r600"},    GK_R600,    FEATURE_NONE },
35d8e91e46SDimitry Andric   {{"rv635"},   {"r600"},    GK_R600,    FEATURE_NONE },
36d8e91e46SDimitry Andric   {{"r630"},    {"r630"},    GK_R630,    FEATURE_NONE },
37d8e91e46SDimitry Andric   {{"rs780"},   {"rs880"},   GK_RS880,   FEATURE_NONE },
38d8e91e46SDimitry Andric   {{"rs880"},   {"rs880"},   GK_RS880,   FEATURE_NONE },
39d8e91e46SDimitry Andric   {{"rv610"},   {"rs880"},   GK_RS880,   FEATURE_NONE },
40d8e91e46SDimitry Andric   {{"rv620"},   {"rs880"},   GK_RS880,   FEATURE_NONE },
41d8e91e46SDimitry Andric   {{"rv670"},   {"rv670"},   GK_RV670,   FEATURE_NONE },
42d8e91e46SDimitry Andric   {{"rv710"},   {"rv710"},   GK_RV710,   FEATURE_NONE },
43d8e91e46SDimitry Andric   {{"rv730"},   {"rv730"},   GK_RV730,   FEATURE_NONE },
44d8e91e46SDimitry Andric   {{"rv740"},   {"rv770"},   GK_RV770,   FEATURE_NONE },
45d8e91e46SDimitry Andric   {{"rv770"},   {"rv770"},   GK_RV770,   FEATURE_NONE },
46d8e91e46SDimitry Andric   {{"cedar"},   {"cedar"},   GK_CEDAR,   FEATURE_NONE },
47d8e91e46SDimitry Andric   {{"palm"},    {"cedar"},   GK_CEDAR,   FEATURE_NONE },
48d8e91e46SDimitry Andric   {{"cypress"}, {"cypress"}, GK_CYPRESS, FEATURE_FMA  },
49d8e91e46SDimitry Andric   {{"hemlock"}, {"cypress"}, GK_CYPRESS, FEATURE_FMA  },
50d8e91e46SDimitry Andric   {{"juniper"}, {"juniper"}, GK_JUNIPER, FEATURE_NONE },
51d8e91e46SDimitry Andric   {{"redwood"}, {"redwood"}, GK_REDWOOD, FEATURE_NONE },
52d8e91e46SDimitry Andric   {{"sumo"},    {"sumo"},    GK_SUMO,    FEATURE_NONE },
53d8e91e46SDimitry Andric   {{"sumo2"},   {"sumo"},    GK_SUMO,    FEATURE_NONE },
54d8e91e46SDimitry Andric   {{"barts"},   {"barts"},   GK_BARTS,   FEATURE_NONE },
55d8e91e46SDimitry Andric   {{"caicos"},  {"caicos"},  GK_CAICOS,  FEATURE_NONE },
56d8e91e46SDimitry Andric   {{"aruba"},   {"cayman"},  GK_CAYMAN,  FEATURE_FMA  },
57d8e91e46SDimitry Andric   {{"cayman"},  {"cayman"},  GK_CAYMAN,  FEATURE_FMA  },
58d8e91e46SDimitry Andric   {{"turks"},   {"turks"},   GK_TURKS,   FEATURE_NONE }
59b915e9e0SDimitry Andric };
60b915e9e0SDimitry Andric 
61d8e91e46SDimitry Andric // This table should be sorted by the value of GPUKind
62d8e91e46SDimitry Andric // Don't bother listing the implicitly true features
63b60736ecSDimitry Andric constexpr GPUInfo AMDGCNGPUs[] = {
64b1c73532SDimitry Andric     // clang-format off
65d8e91e46SDimitry Andric     // Name         Canonical    Kind        Features
66d8e91e46SDimitry Andric     //              Name
67d8e91e46SDimitry Andric     {{"gfx600"},    {"gfx600"},  GK_GFX600,  FEATURE_FAST_FMA_F32},
68d8e91e46SDimitry Andric     {{"tahiti"},    {"gfx600"},  GK_GFX600,  FEATURE_FAST_FMA_F32},
69d8e91e46SDimitry Andric     {{"gfx601"},    {"gfx601"},  GK_GFX601,  FEATURE_NONE},
70d8e91e46SDimitry Andric     {{"pitcairn"},  {"gfx601"},  GK_GFX601,  FEATURE_NONE},
71d8e91e46SDimitry Andric     {{"verde"},     {"gfx601"},  GK_GFX601,  FEATURE_NONE},
72b60736ecSDimitry Andric     {{"gfx602"},    {"gfx602"},  GK_GFX602,  FEATURE_NONE},
73b60736ecSDimitry Andric     {{"hainan"},    {"gfx602"},  GK_GFX602,  FEATURE_NONE},
74b60736ecSDimitry Andric     {{"oland"},     {"gfx602"},  GK_GFX602,  FEATURE_NONE},
75d8e91e46SDimitry Andric     {{"gfx700"},    {"gfx700"},  GK_GFX700,  FEATURE_NONE},
76d8e91e46SDimitry Andric     {{"kaveri"},    {"gfx700"},  GK_GFX700,  FEATURE_NONE},
77d8e91e46SDimitry Andric     {{"gfx701"},    {"gfx701"},  GK_GFX701,  FEATURE_FAST_FMA_F32},
78d8e91e46SDimitry Andric     {{"hawaii"},    {"gfx701"},  GK_GFX701,  FEATURE_FAST_FMA_F32},
79d8e91e46SDimitry Andric     {{"gfx702"},    {"gfx702"},  GK_GFX702,  FEATURE_FAST_FMA_F32},
80d8e91e46SDimitry Andric     {{"gfx703"},    {"gfx703"},  GK_GFX703,  FEATURE_NONE},
81d8e91e46SDimitry Andric     {{"kabini"},    {"gfx703"},  GK_GFX703,  FEATURE_NONE},
82d8e91e46SDimitry Andric     {{"mullins"},   {"gfx703"},  GK_GFX703,  FEATURE_NONE},
83d8e91e46SDimitry Andric     {{"gfx704"},    {"gfx704"},  GK_GFX704,  FEATURE_NONE},
84d8e91e46SDimitry Andric     {{"bonaire"},   {"gfx704"},  GK_GFX704,  FEATURE_NONE},
85b60736ecSDimitry Andric     {{"gfx705"},    {"gfx705"},  GK_GFX705,  FEATURE_NONE},
86b60736ecSDimitry Andric     {{"gfx801"},    {"gfx801"},  GK_GFX801,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
87b60736ecSDimitry Andric     {{"carrizo"},   {"gfx801"},  GK_GFX801,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
88344a3780SDimitry Andric     {{"gfx802"},    {"gfx802"},  GK_GFX802,  FEATURE_FAST_DENORMAL_F32},
89344a3780SDimitry Andric     {{"iceland"},   {"gfx802"},  GK_GFX802,  FEATURE_FAST_DENORMAL_F32},
90344a3780SDimitry Andric     {{"tonga"},     {"gfx802"},  GK_GFX802,  FEATURE_FAST_DENORMAL_F32},
91344a3780SDimitry Andric     {{"gfx803"},    {"gfx803"},  GK_GFX803,  FEATURE_FAST_DENORMAL_F32},
92344a3780SDimitry Andric     {{"fiji"},      {"gfx803"},  GK_GFX803,  FEATURE_FAST_DENORMAL_F32},
93344a3780SDimitry Andric     {{"polaris10"}, {"gfx803"},  GK_GFX803,  FEATURE_FAST_DENORMAL_F32},
94344a3780SDimitry Andric     {{"polaris11"}, {"gfx803"},  GK_GFX803,  FEATURE_FAST_DENORMAL_F32},
95344a3780SDimitry Andric     {{"gfx805"},    {"gfx805"},  GK_GFX805,  FEATURE_FAST_DENORMAL_F32},
96344a3780SDimitry Andric     {{"tongapro"},  {"gfx805"},  GK_GFX805,  FEATURE_FAST_DENORMAL_F32},
97b60736ecSDimitry Andric     {{"gfx810"},    {"gfx810"},  GK_GFX810,  FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
98b60736ecSDimitry Andric     {{"stoney"},    {"gfx810"},  GK_GFX810,  FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
99b60736ecSDimitry Andric     {{"gfx900"},    {"gfx900"},  GK_GFX900,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
100b60736ecSDimitry Andric     {{"gfx902"},    {"gfx902"},  GK_GFX902,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
101b60736ecSDimitry Andric     {{"gfx904"},    {"gfx904"},  GK_GFX904,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
102b60736ecSDimitry Andric     {{"gfx906"},    {"gfx906"},  GK_GFX906,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
103b60736ecSDimitry Andric     {{"gfx908"},    {"gfx908"},  GK_GFX908,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
104b60736ecSDimitry Andric     {{"gfx909"},    {"gfx909"},  GK_GFX909,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
105344a3780SDimitry Andric     {{"gfx90a"},    {"gfx90a"},  GK_GFX90A,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
106b60736ecSDimitry Andric     {{"gfx90c"},    {"gfx90c"},  GK_GFX90C,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
107145449b1SDimitry Andric     {{"gfx940"},    {"gfx940"},  GK_GFX940,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
1087fa27ce4SDimitry Andric     {{"gfx941"},    {"gfx941"},  GK_GFX941,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
1097fa27ce4SDimitry Andric     {{"gfx942"},    {"gfx942"},  GK_GFX942,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
1107fa27ce4SDimitry Andric     {{"gfx1010"},   {"gfx1010"}, GK_GFX1010, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
1117fa27ce4SDimitry Andric     {{"gfx1011"},   {"gfx1011"}, GK_GFX1011, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
1127fa27ce4SDimitry Andric     {{"gfx1012"},   {"gfx1012"}, GK_GFX1012, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
1137fa27ce4SDimitry Andric     {{"gfx1013"},   {"gfx1013"}, GK_GFX1013, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
1147fa27ce4SDimitry Andric     {{"gfx1030"},   {"gfx1030"}, GK_GFX1030, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1157fa27ce4SDimitry Andric     {{"gfx1031"},   {"gfx1031"}, GK_GFX1031, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1167fa27ce4SDimitry Andric     {{"gfx1032"},   {"gfx1032"}, GK_GFX1032, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1177fa27ce4SDimitry Andric     {{"gfx1033"},   {"gfx1033"}, GK_GFX1033, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1187fa27ce4SDimitry Andric     {{"gfx1034"},   {"gfx1034"}, GK_GFX1034, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1197fa27ce4SDimitry Andric     {{"gfx1035"},   {"gfx1035"}, GK_GFX1035, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1207fa27ce4SDimitry Andric     {{"gfx1036"},   {"gfx1036"}, GK_GFX1036, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1217fa27ce4SDimitry Andric     {{"gfx1100"},   {"gfx1100"}, GK_GFX1100, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1227fa27ce4SDimitry Andric     {{"gfx1101"},   {"gfx1101"}, GK_GFX1101, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1237fa27ce4SDimitry Andric     {{"gfx1102"},   {"gfx1102"}, GK_GFX1102, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1247fa27ce4SDimitry Andric     {{"gfx1103"},   {"gfx1103"}, GK_GFX1103, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1257fa27ce4SDimitry Andric     {{"gfx1150"},   {"gfx1150"}, GK_GFX1150, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1267fa27ce4SDimitry Andric     {{"gfx1151"},   {"gfx1151"}, GK_GFX1151, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
127ac9a064cSDimitry Andric     {{"gfx1152"},   {"gfx1152"}, GK_GFX1152, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
128b1c73532SDimitry Andric     {{"gfx1200"},   {"gfx1200"}, GK_GFX1200, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
129b1c73532SDimitry Andric     {{"gfx1201"},   {"gfx1201"}, GK_GFX1201, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
130ac9a064cSDimitry Andric 
131ac9a064cSDimitry Andric     {{"gfx9-generic"},      {"gfx9-generic"},    GK_GFX9_GENERIC,    FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
132ac9a064cSDimitry Andric     {{"gfx10-1-generic"},   {"gfx10-1-generic"}, GK_GFX10_1_GENERIC, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
133ac9a064cSDimitry Andric     {{"gfx10-3-generic"},   {"gfx10-3-generic"}, GK_GFX10_3_GENERIC, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
134ac9a064cSDimitry Andric     {{"gfx11-generic"},     {"gfx11-generic"},   GK_GFX11_GENERIC,   FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
135ac9a064cSDimitry Andric     {{"gfx12-generic"},     {"gfx12-generic"},   GK_GFX12_GENERIC,   FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
136b1c73532SDimitry Andric     // clang-format on
1375a5ac124SDimitry Andric };
138dd58ef01SDimitry Andric 
getArchEntry(AMDGPU::GPUKind AK,ArrayRef<GPUInfo> Table)139d8e91e46SDimitry Andric const GPUInfo *getArchEntry(AMDGPU::GPUKind AK, ArrayRef<GPUInfo> Table) {
140d8e91e46SDimitry Andric   GPUInfo Search = { {""}, {""}, AK, AMDGPU::FEATURE_NONE };
141b915e9e0SDimitry Andric 
142b60736ecSDimitry Andric   auto I =
143b60736ecSDimitry Andric       llvm::lower_bound(Table, Search, [](const GPUInfo &A, const GPUInfo &B) {
144d8e91e46SDimitry Andric         return A.Kind < B.Kind;
145d8e91e46SDimitry Andric       });
146dd58ef01SDimitry Andric 
147b1c73532SDimitry Andric   if (I == Table.end() || I->Kind != Search.Kind)
148d8e91e46SDimitry Andric     return nullptr;
149d8e91e46SDimitry Andric   return I;
150d8e91e46SDimitry Andric }
1515a5ac124SDimitry Andric 
1525a5ac124SDimitry Andric } // namespace
1535a5ac124SDimitry Andric 
getArchFamilyNameAMDGCN(GPUKind AK)154ac9a064cSDimitry Andric StringRef llvm::AMDGPU::getArchFamilyNameAMDGCN(GPUKind AK) {
155ac9a064cSDimitry Andric   switch (AK) {
156ac9a064cSDimitry Andric   case AMDGPU::GK_GFX9_GENERIC:
157ac9a064cSDimitry Andric     return "gfx9";
158ac9a064cSDimitry Andric   case AMDGPU::GK_GFX10_1_GENERIC:
159ac9a064cSDimitry Andric   case AMDGPU::GK_GFX10_3_GENERIC:
160ac9a064cSDimitry Andric     return "gfx10";
161ac9a064cSDimitry Andric   case AMDGPU::GK_GFX11_GENERIC:
162ac9a064cSDimitry Andric     return "gfx11";
163ac9a064cSDimitry Andric   case AMDGPU::GK_GFX12_GENERIC:
164ac9a064cSDimitry Andric     return "gfx12";
165ac9a064cSDimitry Andric   default: {
166ac9a064cSDimitry Andric     StringRef ArchName = getArchNameAMDGCN(AK);
167ac9a064cSDimitry Andric     return ArchName.empty() ? "" : ArchName.drop_back(2);
168ac9a064cSDimitry Andric   }
169ac9a064cSDimitry Andric   }
170ac9a064cSDimitry Andric }
171ac9a064cSDimitry Andric 
getArchNameAMDGCN(GPUKind AK)172d8e91e46SDimitry Andric StringRef llvm::AMDGPU::getArchNameAMDGCN(GPUKind AK) {
173d8e91e46SDimitry Andric   if (const auto *Entry = getArchEntry(AK, AMDGCNGPUs))
174d8e91e46SDimitry Andric     return Entry->CanonicalName;
175d8e91e46SDimitry Andric   return "";
1765a5ac124SDimitry Andric }
1775a5ac124SDimitry Andric 
getArchNameR600(GPUKind AK)178d8e91e46SDimitry Andric StringRef llvm::AMDGPU::getArchNameR600(GPUKind AK) {
179d8e91e46SDimitry Andric   if (const auto *Entry = getArchEntry(AK, R600GPUs))
180d8e91e46SDimitry Andric     return Entry->CanonicalName;
181d8e91e46SDimitry Andric   return "";
18285d8b2bbSDimitry Andric }
18385d8b2bbSDimitry Andric 
parseArchAMDGCN(StringRef CPU)184d8e91e46SDimitry Andric AMDGPU::GPUKind llvm::AMDGPU::parseArchAMDGCN(StringRef CPU) {
185706b4fc4SDimitry Andric   for (const auto &C : AMDGCNGPUs) {
186d8e91e46SDimitry Andric     if (CPU == C.Name)
187d8e91e46SDimitry Andric       return C.Kind;
18885d8b2bbSDimitry Andric   }
18985d8b2bbSDimitry Andric 
190d8e91e46SDimitry Andric   return AMDGPU::GPUKind::GK_NONE;
19185d8b2bbSDimitry Andric }
19285d8b2bbSDimitry Andric 
parseArchR600(StringRef CPU)193d8e91e46SDimitry Andric AMDGPU::GPUKind llvm::AMDGPU::parseArchR600(StringRef CPU) {
194706b4fc4SDimitry Andric   for (const auto &C : R600GPUs) {
195d8e91e46SDimitry Andric     if (CPU == C.Name)
196d8e91e46SDimitry Andric       return C.Kind;
197dd58ef01SDimitry Andric   }
198dd58ef01SDimitry Andric 
199d8e91e46SDimitry Andric   return AMDGPU::GPUKind::GK_NONE;
200dd58ef01SDimitry Andric }
201dd58ef01SDimitry Andric 
getArchAttrAMDGCN(GPUKind AK)202d8e91e46SDimitry Andric unsigned AMDGPU::getArchAttrAMDGCN(GPUKind AK) {
203d8e91e46SDimitry Andric   if (const auto *Entry = getArchEntry(AK, AMDGCNGPUs))
204d8e91e46SDimitry Andric     return Entry->Features;
205d8e91e46SDimitry Andric   return FEATURE_NONE;
206dd58ef01SDimitry Andric }
207dd58ef01SDimitry Andric 
getArchAttrR600(GPUKind AK)208d8e91e46SDimitry Andric unsigned AMDGPU::getArchAttrR600(GPUKind AK) {
209d8e91e46SDimitry Andric   if (const auto *Entry = getArchEntry(AK, R600GPUs))
210d8e91e46SDimitry Andric     return Entry->Features;
211d8e91e46SDimitry Andric   return FEATURE_NONE;
212dd58ef01SDimitry Andric }
213dd58ef01SDimitry Andric 
fillValidArchListAMDGCN(SmallVectorImpl<StringRef> & Values)214d8e91e46SDimitry Andric void AMDGPU::fillValidArchListAMDGCN(SmallVectorImpl<StringRef> &Values) {
215d8e91e46SDimitry Andric   // XXX: Should this only report unique canonical names?
216706b4fc4SDimitry Andric   for (const auto &C : AMDGCNGPUs)
217d8e91e46SDimitry Andric     Values.push_back(C.Name);
21885d8b2bbSDimitry Andric }
21985d8b2bbSDimitry Andric 
fillValidArchListR600(SmallVectorImpl<StringRef> & Values)220d8e91e46SDimitry Andric void AMDGPU::fillValidArchListR600(SmallVectorImpl<StringRef> &Values) {
221706b4fc4SDimitry Andric   for (const auto &C : R600GPUs)
222d8e91e46SDimitry Andric     Values.push_back(C.Name);
22385d8b2bbSDimitry Andric }
22485d8b2bbSDimitry Andric 
getIsaVersion(StringRef GPU)225d8e91e46SDimitry Andric AMDGPU::IsaVersion AMDGPU::getIsaVersion(StringRef GPU) {
226d8e91e46SDimitry Andric   AMDGPU::GPUKind AK = parseArchAMDGCN(GPU);
227e6d15924SDimitry Andric   if (AK == AMDGPU::GPUKind::GK_NONE) {
228e6d15924SDimitry Andric     if (GPU == "generic-hsa")
229e6d15924SDimitry Andric       return {7, 0, 0};
230e6d15924SDimitry Andric     if (GPU == "generic")
231e6d15924SDimitry Andric       return {6, 0, 0};
232d8e91e46SDimitry Andric     return {0, 0, 0};
233e6d15924SDimitry Andric   }
23485d8b2bbSDimitry Andric 
235b1c73532SDimitry Andric   // clang-format off
236d8e91e46SDimitry Andric   switch (AK) {
237d8e91e46SDimitry Andric   case GK_GFX600:  return {6, 0, 0};
238d8e91e46SDimitry Andric   case GK_GFX601:  return {6, 0, 1};
239b60736ecSDimitry Andric   case GK_GFX602:  return {6, 0, 2};
240d8e91e46SDimitry Andric   case GK_GFX700:  return {7, 0, 0};
241d8e91e46SDimitry Andric   case GK_GFX701:  return {7, 0, 1};
242d8e91e46SDimitry Andric   case GK_GFX702:  return {7, 0, 2};
243d8e91e46SDimitry Andric   case GK_GFX703:  return {7, 0, 3};
244d8e91e46SDimitry Andric   case GK_GFX704:  return {7, 0, 4};
245b60736ecSDimitry Andric   case GK_GFX705:  return {7, 0, 5};
246d8e91e46SDimitry Andric   case GK_GFX801:  return {8, 0, 1};
247d8e91e46SDimitry Andric   case GK_GFX802:  return {8, 0, 2};
248d8e91e46SDimitry Andric   case GK_GFX803:  return {8, 0, 3};
249b60736ecSDimitry Andric   case GK_GFX805:  return {8, 0, 5};
250d8e91e46SDimitry Andric   case GK_GFX810:  return {8, 1, 0};
251d8e91e46SDimitry Andric   case GK_GFX900:  return {9, 0, 0};
252d8e91e46SDimitry Andric   case GK_GFX902:  return {9, 0, 2};
253d8e91e46SDimitry Andric   case GK_GFX904:  return {9, 0, 4};
254d8e91e46SDimitry Andric   case GK_GFX906:  return {9, 0, 6};
255e6d15924SDimitry Andric   case GK_GFX908:  return {9, 0, 8};
256d8e91e46SDimitry Andric   case GK_GFX909:  return {9, 0, 9};
257344a3780SDimitry Andric   case GK_GFX90A:  return {9, 0, 10};
258b60736ecSDimitry Andric   case GK_GFX90C:  return {9, 0, 12};
259145449b1SDimitry Andric   case GK_GFX940:  return {9, 4, 0};
2607fa27ce4SDimitry Andric   case GK_GFX941:  return {9, 4, 1};
2617fa27ce4SDimitry Andric   case GK_GFX942:  return {9, 4, 2};
262e6d15924SDimitry Andric   case GK_GFX1010: return {10, 1, 0};
263e6d15924SDimitry Andric   case GK_GFX1011: return {10, 1, 1};
264e6d15924SDimitry Andric   case GK_GFX1012: return {10, 1, 2};
265344a3780SDimitry Andric   case GK_GFX1013: return {10, 1, 3};
266cfca06d7SDimitry Andric   case GK_GFX1030: return {10, 3, 0};
267b60736ecSDimitry Andric   case GK_GFX1031: return {10, 3, 1};
268b60736ecSDimitry Andric   case GK_GFX1032: return {10, 3, 2};
269b60736ecSDimitry Andric   case GK_GFX1033: return {10, 3, 3};
270344a3780SDimitry Andric   case GK_GFX1034: return {10, 3, 4};
271344a3780SDimitry Andric   case GK_GFX1035: return {10, 3, 5};
272145449b1SDimitry Andric   case GK_GFX1036: return {10, 3, 6};
273145449b1SDimitry Andric   case GK_GFX1100: return {11, 0, 0};
274145449b1SDimitry Andric   case GK_GFX1101: return {11, 0, 1};
275145449b1SDimitry Andric   case GK_GFX1102: return {11, 0, 2};
276145449b1SDimitry Andric   case GK_GFX1103: return {11, 0, 3};
2777fa27ce4SDimitry Andric   case GK_GFX1150: return {11, 5, 0};
2787fa27ce4SDimitry Andric   case GK_GFX1151: return {11, 5, 1};
279ac9a064cSDimitry Andric   case GK_GFX1152: return {11, 5, 2};
280b1c73532SDimitry Andric   case GK_GFX1200: return {12, 0, 0};
281b1c73532SDimitry Andric   case GK_GFX1201: return {12, 0, 1};
282ac9a064cSDimitry Andric 
283ac9a064cSDimitry Andric   // Generic targets return the lowest common denominator
284ac9a064cSDimitry Andric   // within their family. That is, the ISA that is the most
285ac9a064cSDimitry Andric   // restricted in terms of features.
286ac9a064cSDimitry Andric   //
287ac9a064cSDimitry Andric   // gfx9-generic is tricky because there is no lowest
288ac9a064cSDimitry Andric   // common denominator, so we return gfx900 which has mad-mix
289ac9a064cSDimitry Andric   // but this family doesn't have it.
290ac9a064cSDimitry Andric   //
291ac9a064cSDimitry Andric   // This API should never be used to check for a particular
292ac9a064cSDimitry Andric   // feature anyway.
293ac9a064cSDimitry Andric   //
294ac9a064cSDimitry Andric   // TODO: Split up this API depending on its caller so
295ac9a064cSDimitry Andric   // generic target handling is more obvious and less risky.
296ac9a064cSDimitry Andric   case GK_GFX9_GENERIC:    return {9, 0, 0};
297ac9a064cSDimitry Andric   case GK_GFX10_1_GENERIC: return {10, 1, 0};
298ac9a064cSDimitry Andric   case GK_GFX10_3_GENERIC: return {10, 3, 0};
299ac9a064cSDimitry Andric   case GK_GFX11_GENERIC:   return {11, 0, 3};
300ac9a064cSDimitry Andric   case GK_GFX12_GENERIC:   return {12, 0, 0};
301d8e91e46SDimitry Andric   default:         return {0, 0, 0};
30201095a5dSDimitry Andric   }
303b1c73532SDimitry Andric   // clang-format on
304eb11fae6SDimitry Andric }
305b60736ecSDimitry Andric 
getCanonicalArchName(const Triple & T,StringRef Arch)306b60736ecSDimitry Andric StringRef AMDGPU::getCanonicalArchName(const Triple &T, StringRef Arch) {
307b60736ecSDimitry Andric   assert(T.isAMDGPU());
308b60736ecSDimitry Andric   auto ProcKind = T.isAMDGCN() ? parseArchAMDGCN(Arch) : parseArchR600(Arch);
309b60736ecSDimitry Andric   if (ProcKind == GK_NONE)
310b60736ecSDimitry Andric     return StringRef();
311b60736ecSDimitry Andric 
312b60736ecSDimitry Andric   return T.isAMDGCN() ? getArchNameAMDGCN(ProcKind) : getArchNameR600(ProcKind);
313b60736ecSDimitry Andric }
3147fa27ce4SDimitry Andric 
fillAMDGPUFeatureMap(StringRef GPU,const Triple & T,StringMap<bool> & Features)3157fa27ce4SDimitry Andric void AMDGPU::fillAMDGPUFeatureMap(StringRef GPU, const Triple &T,
3167fa27ce4SDimitry Andric                                   StringMap<bool> &Features) {
3177fa27ce4SDimitry Andric   // XXX - What does the member GPU mean if device name string passed here?
318ac9a064cSDimitry Andric   if (T.isSPIRV() && T.getOS() == Triple::OSType::AMDHSA) {
319ac9a064cSDimitry Andric     // AMDGCN SPIRV must support the union of all AMDGCN features.
320ac9a064cSDimitry Andric     Features["atomic-ds-pk-add-16-insts"] = true;
321ac9a064cSDimitry Andric     Features["atomic-flat-pk-add-16-insts"] = true;
322ac9a064cSDimitry Andric     Features["atomic-buffer-global-pk-add-f16-insts"] = true;
323ac9a064cSDimitry Andric     Features["atomic-global-pk-add-bf16-inst"] = true;
324ac9a064cSDimitry Andric     Features["atomic-fadd-rtn-insts"] = true;
325ac9a064cSDimitry Andric     Features["ci-insts"] = true;
326ac9a064cSDimitry Andric     Features["dot1-insts"] = true;
327ac9a064cSDimitry Andric     Features["dot2-insts"] = true;
328ac9a064cSDimitry Andric     Features["dot3-insts"] = true;
329ac9a064cSDimitry Andric     Features["dot4-insts"] = true;
330ac9a064cSDimitry Andric     Features["dot5-insts"] = true;
331ac9a064cSDimitry Andric     Features["dot7-insts"] = true;
332ac9a064cSDimitry Andric     Features["dot8-insts"] = true;
333ac9a064cSDimitry Andric     Features["dot9-insts"] = true;
334ac9a064cSDimitry Andric     Features["dot10-insts"] = true;
335ac9a064cSDimitry Andric     Features["dot11-insts"] = true;
336ac9a064cSDimitry Andric     Features["dl-insts"] = true;
337ac9a064cSDimitry Andric     Features["16-bit-insts"] = true;
338ac9a064cSDimitry Andric     Features["dpp"] = true;
339ac9a064cSDimitry Andric     Features["gfx8-insts"] = true;
340ac9a064cSDimitry Andric     Features["gfx9-insts"] = true;
341ac9a064cSDimitry Andric     Features["gfx90a-insts"] = true;
342ac9a064cSDimitry Andric     Features["gfx940-insts"] = true;
343ac9a064cSDimitry Andric     Features["gfx10-insts"] = true;
344ac9a064cSDimitry Andric     Features["gfx10-3-insts"] = true;
345ac9a064cSDimitry Andric     Features["gfx11-insts"] = true;
346ac9a064cSDimitry Andric     Features["gfx12-insts"] = true;
347ac9a064cSDimitry Andric     Features["image-insts"] = true;
348ac9a064cSDimitry Andric     Features["fp8-conversion-insts"] = true;
349ac9a064cSDimitry Andric     Features["s-memrealtime"] = true;
350ac9a064cSDimitry Andric     Features["s-memtime-inst"] = true;
351ac9a064cSDimitry Andric     Features["gws"] = true;
352ac9a064cSDimitry Andric     Features["fp8-insts"] = true;
353ac9a064cSDimitry Andric     Features["fp8-conversion-insts"] = true;
354ac9a064cSDimitry Andric     Features["atomic-ds-pk-add-16-insts"] = true;
355ac9a064cSDimitry Andric     Features["mai-insts"] = true;
356ac9a064cSDimitry Andric     Features["wavefrontsize32"] = true;
357ac9a064cSDimitry Andric     Features["wavefrontsize64"] = true;
358ac9a064cSDimitry Andric   } else if (T.isAMDGCN()) {
3597fa27ce4SDimitry Andric     switch (parseArchAMDGCN(GPU)) {
360b1c73532SDimitry Andric     case GK_GFX1201:
361b1c73532SDimitry Andric     case GK_GFX1200:
362ac9a064cSDimitry Andric     case GK_GFX12_GENERIC:
363b1c73532SDimitry Andric       Features["ci-insts"] = true;
364b1c73532SDimitry Andric       Features["dot7-insts"] = true;
365b1c73532SDimitry Andric       Features["dot8-insts"] = true;
366b1c73532SDimitry Andric       Features["dot9-insts"] = true;
367b1c73532SDimitry Andric       Features["dot10-insts"] = true;
368ac9a064cSDimitry Andric       Features["dot11-insts"] = true;
369b1c73532SDimitry Andric       Features["dl-insts"] = true;
3704df029ccSDimitry Andric       Features["atomic-ds-pk-add-16-insts"] = true;
3714df029ccSDimitry Andric       Features["atomic-flat-pk-add-16-insts"] = true;
3724df029ccSDimitry Andric       Features["atomic-buffer-global-pk-add-f16-insts"] = true;
3734df029ccSDimitry Andric       Features["atomic-global-pk-add-bf16-inst"] = true;
374b1c73532SDimitry Andric       Features["16-bit-insts"] = true;
375b1c73532SDimitry Andric       Features["dpp"] = true;
376b1c73532SDimitry Andric       Features["gfx8-insts"] = true;
377b1c73532SDimitry Andric       Features["gfx9-insts"] = true;
378b1c73532SDimitry Andric       Features["gfx10-insts"] = true;
379b1c73532SDimitry Andric       Features["gfx10-3-insts"] = true;
380b1c73532SDimitry Andric       Features["gfx11-insts"] = true;
381b1c73532SDimitry Andric       Features["gfx12-insts"] = true;
382b1c73532SDimitry Andric       Features["atomic-fadd-rtn-insts"] = true;
383b1c73532SDimitry Andric       Features["image-insts"] = true;
384ac9a064cSDimitry Andric       Features["fp8-conversion-insts"] = true;
385b1c73532SDimitry Andric       break;
386ac9a064cSDimitry Andric     case GK_GFX1152:
3877fa27ce4SDimitry Andric     case GK_GFX1151:
3887fa27ce4SDimitry Andric     case GK_GFX1150:
3897fa27ce4SDimitry Andric     case GK_GFX1103:
3907fa27ce4SDimitry Andric     case GK_GFX1102:
3917fa27ce4SDimitry Andric     case GK_GFX1101:
3927fa27ce4SDimitry Andric     case GK_GFX1100:
393ac9a064cSDimitry Andric     case GK_GFX11_GENERIC:
3947fa27ce4SDimitry Andric       Features["ci-insts"] = true;
3957fa27ce4SDimitry Andric       Features["dot5-insts"] = true;
3967fa27ce4SDimitry Andric       Features["dot7-insts"] = true;
3977fa27ce4SDimitry Andric       Features["dot8-insts"] = true;
3987fa27ce4SDimitry Andric       Features["dot9-insts"] = true;
3997fa27ce4SDimitry Andric       Features["dot10-insts"] = true;
4007fa27ce4SDimitry Andric       Features["dl-insts"] = true;
4017fa27ce4SDimitry Andric       Features["16-bit-insts"] = true;
4027fa27ce4SDimitry Andric       Features["dpp"] = true;
4037fa27ce4SDimitry Andric       Features["gfx8-insts"] = true;
4047fa27ce4SDimitry Andric       Features["gfx9-insts"] = true;
4057fa27ce4SDimitry Andric       Features["gfx10-insts"] = true;
4067fa27ce4SDimitry Andric       Features["gfx10-3-insts"] = true;
4077fa27ce4SDimitry Andric       Features["gfx11-insts"] = true;
4087fa27ce4SDimitry Andric       Features["atomic-fadd-rtn-insts"] = true;
4097fa27ce4SDimitry Andric       Features["image-insts"] = true;
410b1c73532SDimitry Andric       Features["gws"] = true;
4117fa27ce4SDimitry Andric       break;
4127fa27ce4SDimitry Andric     case GK_GFX1036:
4137fa27ce4SDimitry Andric     case GK_GFX1035:
4147fa27ce4SDimitry Andric     case GK_GFX1034:
4157fa27ce4SDimitry Andric     case GK_GFX1033:
4167fa27ce4SDimitry Andric     case GK_GFX1032:
4177fa27ce4SDimitry Andric     case GK_GFX1031:
4187fa27ce4SDimitry Andric     case GK_GFX1030:
419ac9a064cSDimitry Andric     case GK_GFX10_3_GENERIC:
4207fa27ce4SDimitry Andric       Features["ci-insts"] = true;
4217fa27ce4SDimitry Andric       Features["dot1-insts"] = true;
4227fa27ce4SDimitry Andric       Features["dot2-insts"] = true;
4237fa27ce4SDimitry Andric       Features["dot5-insts"] = true;
4247fa27ce4SDimitry Andric       Features["dot6-insts"] = true;
4257fa27ce4SDimitry Andric       Features["dot7-insts"] = true;
4267fa27ce4SDimitry Andric       Features["dot10-insts"] = true;
4277fa27ce4SDimitry Andric       Features["dl-insts"] = true;
4287fa27ce4SDimitry Andric       Features["16-bit-insts"] = true;
4297fa27ce4SDimitry Andric       Features["dpp"] = true;
4307fa27ce4SDimitry Andric       Features["gfx8-insts"] = true;
4317fa27ce4SDimitry Andric       Features["gfx9-insts"] = true;
4327fa27ce4SDimitry Andric       Features["gfx10-insts"] = true;
4337fa27ce4SDimitry Andric       Features["gfx10-3-insts"] = true;
4347fa27ce4SDimitry Andric       Features["image-insts"] = true;
4357fa27ce4SDimitry Andric       Features["s-memrealtime"] = true;
4367fa27ce4SDimitry Andric       Features["s-memtime-inst"] = true;
437b1c73532SDimitry Andric       Features["gws"] = true;
4387fa27ce4SDimitry Andric       break;
4397fa27ce4SDimitry Andric     case GK_GFX1012:
4407fa27ce4SDimitry Andric     case GK_GFX1011:
4417fa27ce4SDimitry Andric       Features["dot1-insts"] = true;
4427fa27ce4SDimitry Andric       Features["dot2-insts"] = true;
4437fa27ce4SDimitry Andric       Features["dot5-insts"] = true;
4447fa27ce4SDimitry Andric       Features["dot6-insts"] = true;
4457fa27ce4SDimitry Andric       Features["dot7-insts"] = true;
4467fa27ce4SDimitry Andric       Features["dot10-insts"] = true;
4477fa27ce4SDimitry Andric       [[fallthrough]];
4487fa27ce4SDimitry Andric     case GK_GFX1013:
4497fa27ce4SDimitry Andric     case GK_GFX1010:
450ac9a064cSDimitry Andric     case GK_GFX10_1_GENERIC:
4517fa27ce4SDimitry Andric       Features["dl-insts"] = true;
4527fa27ce4SDimitry Andric       Features["ci-insts"] = true;
4537fa27ce4SDimitry Andric       Features["16-bit-insts"] = true;
4547fa27ce4SDimitry Andric       Features["dpp"] = true;
4557fa27ce4SDimitry Andric       Features["gfx8-insts"] = true;
4567fa27ce4SDimitry Andric       Features["gfx9-insts"] = true;
4577fa27ce4SDimitry Andric       Features["gfx10-insts"] = true;
4587fa27ce4SDimitry Andric       Features["image-insts"] = true;
4597fa27ce4SDimitry Andric       Features["s-memrealtime"] = true;
4607fa27ce4SDimitry Andric       Features["s-memtime-inst"] = true;
461b1c73532SDimitry Andric       Features["gws"] = true;
4627fa27ce4SDimitry Andric       break;
4637fa27ce4SDimitry Andric     case GK_GFX942:
4647fa27ce4SDimitry Andric     case GK_GFX941:
4657fa27ce4SDimitry Andric     case GK_GFX940:
4667fa27ce4SDimitry Andric       Features["gfx940-insts"] = true;
4677fa27ce4SDimitry Andric       Features["fp8-insts"] = true;
4684df029ccSDimitry Andric       Features["fp8-conversion-insts"] = true;
4697fa27ce4SDimitry Andric       Features["atomic-ds-pk-add-16-insts"] = true;
4707fa27ce4SDimitry Andric       Features["atomic-flat-pk-add-16-insts"] = true;
4717fa27ce4SDimitry Andric       Features["atomic-global-pk-add-bf16-inst"] = true;
4727fa27ce4SDimitry Andric       Features["gfx90a-insts"] = true;
4737fa27ce4SDimitry Andric       Features["atomic-buffer-global-pk-add-f16-insts"] = true;
4747fa27ce4SDimitry Andric       Features["atomic-fadd-rtn-insts"] = true;
4757fa27ce4SDimitry Andric       Features["dot3-insts"] = true;
4767fa27ce4SDimitry Andric       Features["dot4-insts"] = true;
4777fa27ce4SDimitry Andric       Features["dot5-insts"] = true;
4787fa27ce4SDimitry Andric       Features["dot6-insts"] = true;
4797fa27ce4SDimitry Andric       Features["mai-insts"] = true;
4807fa27ce4SDimitry Andric       Features["dl-insts"] = true;
4817fa27ce4SDimitry Andric       Features["dot1-insts"] = true;
4827fa27ce4SDimitry Andric       Features["dot2-insts"] = true;
4837fa27ce4SDimitry Andric       Features["dot7-insts"] = true;
4847fa27ce4SDimitry Andric       Features["dot10-insts"] = true;
4857fa27ce4SDimitry Andric       Features["gfx9-insts"] = true;
4867fa27ce4SDimitry Andric       Features["gfx8-insts"] = true;
4877fa27ce4SDimitry Andric       Features["16-bit-insts"] = true;
4887fa27ce4SDimitry Andric       Features["dpp"] = true;
4897fa27ce4SDimitry Andric       Features["s-memrealtime"] = true;
4907fa27ce4SDimitry Andric       Features["ci-insts"] = true;
4917fa27ce4SDimitry Andric       Features["s-memtime-inst"] = true;
492b1c73532SDimitry Andric       Features["gws"] = true;
4937fa27ce4SDimitry Andric       break;
4947fa27ce4SDimitry Andric     case GK_GFX90A:
4957fa27ce4SDimitry Andric       Features["gfx90a-insts"] = true;
4967fa27ce4SDimitry Andric       Features["atomic-buffer-global-pk-add-f16-insts"] = true;
4977fa27ce4SDimitry Andric       Features["atomic-fadd-rtn-insts"] = true;
4987fa27ce4SDimitry Andric       [[fallthrough]];
4997fa27ce4SDimitry Andric     case GK_GFX908:
5007fa27ce4SDimitry Andric       Features["dot3-insts"] = true;
5017fa27ce4SDimitry Andric       Features["dot4-insts"] = true;
5027fa27ce4SDimitry Andric       Features["dot5-insts"] = true;
5037fa27ce4SDimitry Andric       Features["dot6-insts"] = true;
5047fa27ce4SDimitry Andric       Features["mai-insts"] = true;
5057fa27ce4SDimitry Andric       [[fallthrough]];
5067fa27ce4SDimitry Andric     case GK_GFX906:
5077fa27ce4SDimitry Andric       Features["dl-insts"] = true;
5087fa27ce4SDimitry Andric       Features["dot1-insts"] = true;
5097fa27ce4SDimitry Andric       Features["dot2-insts"] = true;
5107fa27ce4SDimitry Andric       Features["dot7-insts"] = true;
5117fa27ce4SDimitry Andric       Features["dot10-insts"] = true;
5127fa27ce4SDimitry Andric       [[fallthrough]];
5137fa27ce4SDimitry Andric     case GK_GFX90C:
5147fa27ce4SDimitry Andric     case GK_GFX909:
5157fa27ce4SDimitry Andric     case GK_GFX904:
5167fa27ce4SDimitry Andric     case GK_GFX902:
5177fa27ce4SDimitry Andric     case GK_GFX900:
518ac9a064cSDimitry Andric     case GK_GFX9_GENERIC:
5197fa27ce4SDimitry Andric       Features["gfx9-insts"] = true;
5207fa27ce4SDimitry Andric       [[fallthrough]];
5217fa27ce4SDimitry Andric     case GK_GFX810:
5227fa27ce4SDimitry Andric     case GK_GFX805:
5237fa27ce4SDimitry Andric     case GK_GFX803:
5247fa27ce4SDimitry Andric     case GK_GFX802:
5257fa27ce4SDimitry Andric     case GK_GFX801:
5267fa27ce4SDimitry Andric       Features["gfx8-insts"] = true;
5277fa27ce4SDimitry Andric       Features["16-bit-insts"] = true;
5287fa27ce4SDimitry Andric       Features["dpp"] = true;
5297fa27ce4SDimitry Andric       Features["s-memrealtime"] = true;
5307fa27ce4SDimitry Andric       [[fallthrough]];
5317fa27ce4SDimitry Andric     case GK_GFX705:
5327fa27ce4SDimitry Andric     case GK_GFX704:
5337fa27ce4SDimitry Andric     case GK_GFX703:
5347fa27ce4SDimitry Andric     case GK_GFX702:
5357fa27ce4SDimitry Andric     case GK_GFX701:
5367fa27ce4SDimitry Andric     case GK_GFX700:
5377fa27ce4SDimitry Andric       Features["ci-insts"] = true;
5387fa27ce4SDimitry Andric       [[fallthrough]];
5397fa27ce4SDimitry Andric     case GK_GFX602:
5407fa27ce4SDimitry Andric     case GK_GFX601:
5417fa27ce4SDimitry Andric     case GK_GFX600:
5427fa27ce4SDimitry Andric       Features["image-insts"] = true;
5437fa27ce4SDimitry Andric       Features["s-memtime-inst"] = true;
544b1c73532SDimitry Andric       Features["gws"] = true;
5457fa27ce4SDimitry Andric       break;
5467fa27ce4SDimitry Andric     case GK_NONE:
5477fa27ce4SDimitry Andric       break;
5487fa27ce4SDimitry Andric     default:
5497fa27ce4SDimitry Andric       llvm_unreachable("Unhandled GPU!");
5507fa27ce4SDimitry Andric     }
5517fa27ce4SDimitry Andric   } else {
5527fa27ce4SDimitry Andric     if (GPU.empty())
5537fa27ce4SDimitry Andric       GPU = "r600";
5547fa27ce4SDimitry Andric 
5557fa27ce4SDimitry Andric     switch (llvm::AMDGPU::parseArchR600(GPU)) {
5567fa27ce4SDimitry Andric     case GK_CAYMAN:
5577fa27ce4SDimitry Andric     case GK_CYPRESS:
5587fa27ce4SDimitry Andric     case GK_RV770:
5597fa27ce4SDimitry Andric     case GK_RV670:
5607fa27ce4SDimitry Andric       // TODO: Add fp64 when implemented.
5617fa27ce4SDimitry Andric       break;
5627fa27ce4SDimitry Andric     case GK_TURKS:
5637fa27ce4SDimitry Andric     case GK_CAICOS:
5647fa27ce4SDimitry Andric     case GK_BARTS:
5657fa27ce4SDimitry Andric     case GK_SUMO:
5667fa27ce4SDimitry Andric     case GK_REDWOOD:
5677fa27ce4SDimitry Andric     case GK_JUNIPER:
5687fa27ce4SDimitry Andric     case GK_CEDAR:
5697fa27ce4SDimitry Andric     case GK_RV730:
5707fa27ce4SDimitry Andric     case GK_RV710:
5717fa27ce4SDimitry Andric     case GK_RS880:
5727fa27ce4SDimitry Andric     case GK_R630:
5737fa27ce4SDimitry Andric     case GK_R600:
5747fa27ce4SDimitry Andric       break;
5757fa27ce4SDimitry Andric     default:
5767fa27ce4SDimitry Andric       llvm_unreachable("Unhandled GPU!");
5777fa27ce4SDimitry Andric     }
5787fa27ce4SDimitry Andric   }
5797fa27ce4SDimitry Andric }
5807fa27ce4SDimitry Andric 
isWave32Capable(StringRef GPU,const Triple & T)5817fa27ce4SDimitry Andric static bool isWave32Capable(StringRef GPU, const Triple &T) {
5827fa27ce4SDimitry Andric   bool IsWave32Capable = false;
5837fa27ce4SDimitry Andric   // XXX - What does the member GPU mean if device name string passed here?
5847fa27ce4SDimitry Andric   if (T.isAMDGCN()) {
5857fa27ce4SDimitry Andric     switch (parseArchAMDGCN(GPU)) {
586b1c73532SDimitry Andric     case GK_GFX1201:
587b1c73532SDimitry Andric     case GK_GFX1200:
588ac9a064cSDimitry Andric     case GK_GFX1152:
5897fa27ce4SDimitry Andric     case GK_GFX1151:
5907fa27ce4SDimitry Andric     case GK_GFX1150:
5917fa27ce4SDimitry Andric     case GK_GFX1103:
5927fa27ce4SDimitry Andric     case GK_GFX1102:
5937fa27ce4SDimitry Andric     case GK_GFX1101:
5947fa27ce4SDimitry Andric     case GK_GFX1100:
5957fa27ce4SDimitry Andric     case GK_GFX1036:
5967fa27ce4SDimitry Andric     case GK_GFX1035:
5977fa27ce4SDimitry Andric     case GK_GFX1034:
5987fa27ce4SDimitry Andric     case GK_GFX1033:
5997fa27ce4SDimitry Andric     case GK_GFX1032:
6007fa27ce4SDimitry Andric     case GK_GFX1031:
6017fa27ce4SDimitry Andric     case GK_GFX1030:
6027fa27ce4SDimitry Andric     case GK_GFX1012:
6037fa27ce4SDimitry Andric     case GK_GFX1011:
6047fa27ce4SDimitry Andric     case GK_GFX1013:
6057fa27ce4SDimitry Andric     case GK_GFX1010:
606ac9a064cSDimitry Andric     case GK_GFX12_GENERIC:
607ac9a064cSDimitry Andric     case GK_GFX11_GENERIC:
608ac9a064cSDimitry Andric     case GK_GFX10_3_GENERIC:
609ac9a064cSDimitry Andric     case GK_GFX10_1_GENERIC:
6107fa27ce4SDimitry Andric       IsWave32Capable = true;
6117fa27ce4SDimitry Andric       break;
6127fa27ce4SDimitry Andric     default:
6137fa27ce4SDimitry Andric       break;
6147fa27ce4SDimitry Andric     }
6157fa27ce4SDimitry Andric   }
6167fa27ce4SDimitry Andric   return IsWave32Capable;
6177fa27ce4SDimitry Andric }
6187fa27ce4SDimitry Andric 
619ac9a064cSDimitry Andric std::pair<FeatureError, StringRef>
insertWaveSizeFeature(StringRef GPU,const Triple & T,StringMap<bool> & Features)620ac9a064cSDimitry Andric AMDGPU::insertWaveSizeFeature(StringRef GPU, const Triple &T,
621ac9a064cSDimitry Andric                               StringMap<bool> &Features) {
6227fa27ce4SDimitry Andric   bool IsWave32Capable = isWave32Capable(GPU, T);
6237fa27ce4SDimitry Andric   const bool IsNullGPU = GPU.empty();
624ac9a064cSDimitry Andric   const bool HaveWave32 = Features.count("wavefrontsize32");
6257fa27ce4SDimitry Andric   const bool HaveWave64 = Features.count("wavefrontsize64");
6267fa27ce4SDimitry Andric   if (HaveWave32 && HaveWave64) {
627ac9a064cSDimitry Andric     return {AMDGPU::INVALID_FEATURE_COMBINATION,
628ac9a064cSDimitry Andric             "'wavefrontsize32' and 'wavefrontsize64' are mutually exclusive"};
629ac9a064cSDimitry Andric   }
630ac9a064cSDimitry Andric   if (HaveWave32 && !IsNullGPU && !IsWave32Capable) {
631ac9a064cSDimitry Andric     return {AMDGPU::UNSUPPORTED_TARGET_FEATURE, "wavefrontsize32"};
6327fa27ce4SDimitry Andric   }
6337fa27ce4SDimitry Andric   // Don't assume any wavesize with an unknown subtarget.
6347fa27ce4SDimitry Andric   if (!IsNullGPU) {
6357fa27ce4SDimitry Andric     // Default to wave32 if available, or wave64 if not
6367fa27ce4SDimitry Andric     if (!HaveWave32 && !HaveWave64) {
6377fa27ce4SDimitry Andric       StringRef DefaultWaveSizeFeature =
6387fa27ce4SDimitry Andric           IsWave32Capable ? "wavefrontsize32" : "wavefrontsize64";
6397fa27ce4SDimitry Andric       Features.insert(std::make_pair(DefaultWaveSizeFeature, true));
6407fa27ce4SDimitry Andric     }
6417fa27ce4SDimitry Andric   }
642ac9a064cSDimitry Andric   return {NO_ERROR, StringRef()};
6437fa27ce4SDimitry Andric }
644