xref: /llvm-project/llvm/lib/TargetParser/TargetParser.cpp (revision b08b56381cb4c24f37afba793dc872b6d721d9f7)
1f09cf34dSArchibald Elliott //===-- TargetParser - Parser for target features ---------------*- C++ -*-===//
2f09cf34dSArchibald Elliott //
3f09cf34dSArchibald Elliott // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4f09cf34dSArchibald Elliott // See https://llvm.org/LICENSE.txt for license information.
5f09cf34dSArchibald Elliott // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f09cf34dSArchibald Elliott //
7f09cf34dSArchibald Elliott //===----------------------------------------------------------------------===//
8f09cf34dSArchibald Elliott //
9f09cf34dSArchibald Elliott // This file implements a target parser to recognise hardware features such as
10f09cf34dSArchibald Elliott // FPU/CPU/ARCH names as well as specific support such as HDIV, etc.
11f09cf34dSArchibald Elliott //
12f09cf34dSArchibald Elliott //===----------------------------------------------------------------------===//
13f09cf34dSArchibald Elliott 
14f09cf34dSArchibald Elliott #include "llvm/TargetParser/TargetParser.h"
15f09cf34dSArchibald Elliott #include "llvm/ADT/ArrayRef.h"
16f09cf34dSArchibald Elliott #include "llvm/TargetParser/Triple.h"
17f09cf34dSArchibald Elliott 
18f09cf34dSArchibald Elliott using namespace llvm;
19f09cf34dSArchibald Elliott using namespace AMDGPU;
20f09cf34dSArchibald Elliott 
21f09cf34dSArchibald Elliott namespace {
22f09cf34dSArchibald Elliott 
23f09cf34dSArchibald Elliott struct GPUInfo {
24f09cf34dSArchibald Elliott   StringLiteral Name;
25f09cf34dSArchibald Elliott   StringLiteral CanonicalName;
26f09cf34dSArchibald Elliott   AMDGPU::GPUKind Kind;
27f09cf34dSArchibald Elliott   unsigned Features;
28f09cf34dSArchibald Elliott };
29f09cf34dSArchibald Elliott 
30f09cf34dSArchibald Elliott constexpr GPUInfo R600GPUs[] = {
31f09cf34dSArchibald Elliott   // Name       Canonical    Kind        Features
32f09cf34dSArchibald Elliott   //            Name
33f09cf34dSArchibald Elliott   {{"r600"},    {"r600"},    GK_R600,    FEATURE_NONE },
34f09cf34dSArchibald Elliott   {{"rv630"},   {"r600"},    GK_R600,    FEATURE_NONE },
35f09cf34dSArchibald Elliott   {{"rv635"},   {"r600"},    GK_R600,    FEATURE_NONE },
36f09cf34dSArchibald Elliott   {{"r630"},    {"r630"},    GK_R630,    FEATURE_NONE },
37f09cf34dSArchibald Elliott   {{"rs780"},   {"rs880"},   GK_RS880,   FEATURE_NONE },
38f09cf34dSArchibald Elliott   {{"rs880"},   {"rs880"},   GK_RS880,   FEATURE_NONE },
39f09cf34dSArchibald Elliott   {{"rv610"},   {"rs880"},   GK_RS880,   FEATURE_NONE },
40f09cf34dSArchibald Elliott   {{"rv620"},   {"rs880"},   GK_RS880,   FEATURE_NONE },
41f09cf34dSArchibald Elliott   {{"rv670"},   {"rv670"},   GK_RV670,   FEATURE_NONE },
42f09cf34dSArchibald Elliott   {{"rv710"},   {"rv710"},   GK_RV710,   FEATURE_NONE },
43f09cf34dSArchibald Elliott   {{"rv730"},   {"rv730"},   GK_RV730,   FEATURE_NONE },
44f09cf34dSArchibald Elliott   {{"rv740"},   {"rv770"},   GK_RV770,   FEATURE_NONE },
45f09cf34dSArchibald Elliott   {{"rv770"},   {"rv770"},   GK_RV770,   FEATURE_NONE },
46f09cf34dSArchibald Elliott   {{"cedar"},   {"cedar"},   GK_CEDAR,   FEATURE_NONE },
47f09cf34dSArchibald Elliott   {{"palm"},    {"cedar"},   GK_CEDAR,   FEATURE_NONE },
48f09cf34dSArchibald Elliott   {{"cypress"}, {"cypress"}, GK_CYPRESS, FEATURE_FMA  },
49f09cf34dSArchibald Elliott   {{"hemlock"}, {"cypress"}, GK_CYPRESS, FEATURE_FMA  },
50f09cf34dSArchibald Elliott   {{"juniper"}, {"juniper"}, GK_JUNIPER, FEATURE_NONE },
51f09cf34dSArchibald Elliott   {{"redwood"}, {"redwood"}, GK_REDWOOD, FEATURE_NONE },
52f09cf34dSArchibald Elliott   {{"sumo"},    {"sumo"},    GK_SUMO,    FEATURE_NONE },
53f09cf34dSArchibald Elliott   {{"sumo2"},   {"sumo"},    GK_SUMO,    FEATURE_NONE },
54f09cf34dSArchibald Elliott   {{"barts"},   {"barts"},   GK_BARTS,   FEATURE_NONE },
55f09cf34dSArchibald Elliott   {{"caicos"},  {"caicos"},  GK_CAICOS,  FEATURE_NONE },
56f09cf34dSArchibald Elliott   {{"aruba"},   {"cayman"},  GK_CAYMAN,  FEATURE_FMA  },
57f09cf34dSArchibald Elliott   {{"cayman"},  {"cayman"},  GK_CAYMAN,  FEATURE_FMA  },
58f09cf34dSArchibald Elliott   {{"turks"},   {"turks"},   GK_TURKS,   FEATURE_NONE }
59f09cf34dSArchibald Elliott };
60f09cf34dSArchibald Elliott 
61f09cf34dSArchibald Elliott // This table should be sorted by the value of GPUKind
62f09cf34dSArchibald Elliott // Don't bother listing the implicitly true features
63f09cf34dSArchibald Elliott constexpr GPUInfo AMDGCNGPUs[] = {
649b374a80SJay Foad     // clang-format off
65f09cf34dSArchibald Elliott     // Name         Canonical    Kind        Features
66f09cf34dSArchibald Elliott     //              Name
67f09cf34dSArchibald Elliott     {{"gfx600"},    {"gfx600"},  GK_GFX600,  FEATURE_FAST_FMA_F32},
68f09cf34dSArchibald Elliott     {{"tahiti"},    {"gfx600"},  GK_GFX600,  FEATURE_FAST_FMA_F32},
69f09cf34dSArchibald Elliott     {{"gfx601"},    {"gfx601"},  GK_GFX601,  FEATURE_NONE},
70f09cf34dSArchibald Elliott     {{"pitcairn"},  {"gfx601"},  GK_GFX601,  FEATURE_NONE},
71f09cf34dSArchibald Elliott     {{"verde"},     {"gfx601"},  GK_GFX601,  FEATURE_NONE},
72f09cf34dSArchibald Elliott     {{"gfx602"},    {"gfx602"},  GK_GFX602,  FEATURE_NONE},
73f09cf34dSArchibald Elliott     {{"hainan"},    {"gfx602"},  GK_GFX602,  FEATURE_NONE},
74f09cf34dSArchibald Elliott     {{"oland"},     {"gfx602"},  GK_GFX602,  FEATURE_NONE},
75f09cf34dSArchibald Elliott     {{"gfx700"},    {"gfx700"},  GK_GFX700,  FEATURE_NONE},
76f09cf34dSArchibald Elliott     {{"kaveri"},    {"gfx700"},  GK_GFX700,  FEATURE_NONE},
77f09cf34dSArchibald Elliott     {{"gfx701"},    {"gfx701"},  GK_GFX701,  FEATURE_FAST_FMA_F32},
78f09cf34dSArchibald Elliott     {{"hawaii"},    {"gfx701"},  GK_GFX701,  FEATURE_FAST_FMA_F32},
79f09cf34dSArchibald Elliott     {{"gfx702"},    {"gfx702"},  GK_GFX702,  FEATURE_FAST_FMA_F32},
80f09cf34dSArchibald Elliott     {{"gfx703"},    {"gfx703"},  GK_GFX703,  FEATURE_NONE},
81f09cf34dSArchibald Elliott     {{"kabini"},    {"gfx703"},  GK_GFX703,  FEATURE_NONE},
82f09cf34dSArchibald Elliott     {{"mullins"},   {"gfx703"},  GK_GFX703,  FEATURE_NONE},
83f09cf34dSArchibald Elliott     {{"gfx704"},    {"gfx704"},  GK_GFX704,  FEATURE_NONE},
84f09cf34dSArchibald Elliott     {{"bonaire"},   {"gfx704"},  GK_GFX704,  FEATURE_NONE},
85f09cf34dSArchibald Elliott     {{"gfx705"},    {"gfx705"},  GK_GFX705,  FEATURE_NONE},
86f09cf34dSArchibald Elliott     {{"gfx801"},    {"gfx801"},  GK_GFX801,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
87f09cf34dSArchibald Elliott     {{"carrizo"},   {"gfx801"},  GK_GFX801,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
88f09cf34dSArchibald Elliott     {{"gfx802"},    {"gfx802"},  GK_GFX802,  FEATURE_FAST_DENORMAL_F32},
89f09cf34dSArchibald Elliott     {{"iceland"},   {"gfx802"},  GK_GFX802,  FEATURE_FAST_DENORMAL_F32},
90f09cf34dSArchibald Elliott     {{"tonga"},     {"gfx802"},  GK_GFX802,  FEATURE_FAST_DENORMAL_F32},
91f09cf34dSArchibald Elliott     {{"gfx803"},    {"gfx803"},  GK_GFX803,  FEATURE_FAST_DENORMAL_F32},
92f09cf34dSArchibald Elliott     {{"fiji"},      {"gfx803"},  GK_GFX803,  FEATURE_FAST_DENORMAL_F32},
93f09cf34dSArchibald Elliott     {{"polaris10"}, {"gfx803"},  GK_GFX803,  FEATURE_FAST_DENORMAL_F32},
94f09cf34dSArchibald Elliott     {{"polaris11"}, {"gfx803"},  GK_GFX803,  FEATURE_FAST_DENORMAL_F32},
95f09cf34dSArchibald Elliott     {{"gfx805"},    {"gfx805"},  GK_GFX805,  FEATURE_FAST_DENORMAL_F32},
96f09cf34dSArchibald Elliott     {{"tongapro"},  {"gfx805"},  GK_GFX805,  FEATURE_FAST_DENORMAL_F32},
97f09cf34dSArchibald Elliott     {{"gfx810"},    {"gfx810"},  GK_GFX810,  FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
98f09cf34dSArchibald Elliott     {{"stoney"},    {"gfx810"},  GK_GFX810,  FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
99f09cf34dSArchibald Elliott     {{"gfx900"},    {"gfx900"},  GK_GFX900,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
100f09cf34dSArchibald Elliott     {{"gfx902"},    {"gfx902"},  GK_GFX902,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
101f09cf34dSArchibald Elliott     {{"gfx904"},    {"gfx904"},  GK_GFX904,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
102f09cf34dSArchibald Elliott     {{"gfx906"},    {"gfx906"},  GK_GFX906,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
103f09cf34dSArchibald Elliott     {{"gfx908"},    {"gfx908"},  GK_GFX908,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
104f09cf34dSArchibald Elliott     {{"gfx909"},    {"gfx909"},  GK_GFX909,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
105f09cf34dSArchibald Elliott     {{"gfx90a"},    {"gfx90a"},  GK_GFX90A,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
106f09cf34dSArchibald Elliott     {{"gfx90c"},    {"gfx90c"},  GK_GFX90C,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
107f09cf34dSArchibald Elliott     {{"gfx940"},    {"gfx940"},  GK_GFX940,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
1081fc70210SKonstantin Zhuravlyov     {{"gfx941"},    {"gfx941"},  GK_GFX941,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
1099d057279SKonstantin Zhuravlyov     {{"gfx942"},    {"gfx942"},  GK_GFX942,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
110a6fc489bSMatt Arsenault     {{"gfx950"},    {"gfx950"},  GK_GFX950,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
1116adb9a06SYaxun (Sam) Liu     {{"gfx1010"},   {"gfx1010"}, GK_GFX1010, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
1126adb9a06SYaxun (Sam) Liu     {{"gfx1011"},   {"gfx1011"}, GK_GFX1011, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
1136adb9a06SYaxun (Sam) Liu     {{"gfx1012"},   {"gfx1012"}, GK_GFX1012, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
1146adb9a06SYaxun (Sam) Liu     {{"gfx1013"},   {"gfx1013"}, GK_GFX1013, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
1156adb9a06SYaxun (Sam) Liu     {{"gfx1030"},   {"gfx1030"}, GK_GFX1030, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1166adb9a06SYaxun (Sam) Liu     {{"gfx1031"},   {"gfx1031"}, GK_GFX1031, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1176adb9a06SYaxun (Sam) Liu     {{"gfx1032"},   {"gfx1032"}, GK_GFX1032, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1186adb9a06SYaxun (Sam) Liu     {{"gfx1033"},   {"gfx1033"}, GK_GFX1033, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1196adb9a06SYaxun (Sam) Liu     {{"gfx1034"},   {"gfx1034"}, GK_GFX1034, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1206adb9a06SYaxun (Sam) Liu     {{"gfx1035"},   {"gfx1035"}, GK_GFX1035, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1216adb9a06SYaxun (Sam) Liu     {{"gfx1036"},   {"gfx1036"}, GK_GFX1036, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1226adb9a06SYaxun (Sam) Liu     {{"gfx1100"},   {"gfx1100"}, GK_GFX1100, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1236adb9a06SYaxun (Sam) Liu     {{"gfx1101"},   {"gfx1101"}, GK_GFX1101, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1246adb9a06SYaxun (Sam) Liu     {{"gfx1102"},   {"gfx1102"}, GK_GFX1102, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1256adb9a06SYaxun (Sam) Liu     {{"gfx1103"},   {"gfx1103"}, GK_GFX1103, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
12692542f2aSJay Foad     {{"gfx1150"},   {"gfx1150"}, GK_GFX1150, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
12792542f2aSJay Foad     {{"gfx1151"},   {"gfx1151"}, GK_GFX1151, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
1281ca0055fSShilei Tian     {{"gfx1152"},   {"gfx1152"}, GK_GFX1152, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
129076aac59SCarl Ritson     {{"gfx1153"},   {"gfx1153"}, GK_GFX1153, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
130cf1e0c0bSJay Foad     {{"gfx1200"},   {"gfx1200"}, GK_GFX1200, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
131cf1e0c0bSJay Foad     {{"gfx1201"},   {"gfx1201"}, GK_GFX1201, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
132f93aa515SPierre van Houtryve 
133f93aa515SPierre van Houtryve     {{"gfx9-generic"},      {"gfx9-generic"},    GK_GFX9_GENERIC,    FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
13443c7eb5dSPierre van Houtryve     {{"gfx10-1-generic"},   {"gfx10-1-generic"}, GK_GFX10_1_GENERIC, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
13543c7eb5dSPierre van Houtryve     {{"gfx10-3-generic"},   {"gfx10-3-generic"}, GK_GFX10_3_GENERIC, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
136f93aa515SPierre van Houtryve     {{"gfx11-generic"},     {"gfx11-generic"},   GK_GFX11_GENERIC,   FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
137775f1cd3SKonstantin Zhuravlyov     {{"gfx12-generic"},     {"gfx12-generic"},   GK_GFX12_GENERIC,   FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
138de0fd64bSShilei Tian     {{"gfx9-4-generic"},    {"gfx9-4-generic"},  GK_GFX9_4_GENERIC,  FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
1399b374a80SJay Foad     // clang-format on
140f09cf34dSArchibald Elliott };
141f09cf34dSArchibald Elliott 
142f09cf34dSArchibald Elliott const GPUInfo *getArchEntry(AMDGPU::GPUKind AK, ArrayRef<GPUInfo> Table) {
143f09cf34dSArchibald Elliott   GPUInfo Search = { {""}, {""}, AK, AMDGPU::FEATURE_NONE };
144f09cf34dSArchibald Elliott 
145f09cf34dSArchibald Elliott   auto I =
146f09cf34dSArchibald Elliott       llvm::lower_bound(Table, Search, [](const GPUInfo &A, const GPUInfo &B) {
147f09cf34dSArchibald Elliott         return A.Kind < B.Kind;
148f09cf34dSArchibald Elliott       });
149f09cf34dSArchibald Elliott 
150096eba14SIvan Kosarev   if (I == Table.end() || I->Kind != Search.Kind)
151f09cf34dSArchibald Elliott     return nullptr;
152f09cf34dSArchibald Elliott   return I;
153f09cf34dSArchibald Elliott }
154f09cf34dSArchibald Elliott 
155f09cf34dSArchibald Elliott } // namespace
156f09cf34dSArchibald Elliott 
157f93aa515SPierre van Houtryve StringRef llvm::AMDGPU::getArchFamilyNameAMDGCN(GPUKind AK) {
158f93aa515SPierre van Houtryve   switch (AK) {
159f93aa515SPierre van Houtryve   case AMDGPU::GK_GFX9_GENERIC:
160de0fd64bSShilei Tian   case AMDGPU::GK_GFX9_4_GENERIC:
161f93aa515SPierre van Houtryve     return "gfx9";
162f93aa515SPierre van Houtryve   case AMDGPU::GK_GFX10_1_GENERIC:
163f93aa515SPierre van Houtryve   case AMDGPU::GK_GFX10_3_GENERIC:
164f93aa515SPierre van Houtryve     return "gfx10";
165f93aa515SPierre van Houtryve   case AMDGPU::GK_GFX11_GENERIC:
166f93aa515SPierre van Houtryve     return "gfx11";
167775f1cd3SKonstantin Zhuravlyov   case AMDGPU::GK_GFX12_GENERIC:
168775f1cd3SKonstantin Zhuravlyov     return "gfx12";
169f93aa515SPierre van Houtryve   default: {
170f93aa515SPierre van Houtryve     StringRef ArchName = getArchNameAMDGCN(AK);
171f93aa515SPierre van Houtryve     return ArchName.empty() ? "" : ArchName.drop_back(2);
172f93aa515SPierre van Houtryve   }
173f93aa515SPierre van Houtryve   }
174f93aa515SPierre van Houtryve }
175f93aa515SPierre van Houtryve 
176f09cf34dSArchibald Elliott StringRef llvm::AMDGPU::getArchNameAMDGCN(GPUKind AK) {
177f09cf34dSArchibald Elliott   if (const auto *Entry = getArchEntry(AK, AMDGCNGPUs))
178f09cf34dSArchibald Elliott     return Entry->CanonicalName;
179f09cf34dSArchibald Elliott   return "";
180f09cf34dSArchibald Elliott }
181f09cf34dSArchibald Elliott 
182f09cf34dSArchibald Elliott StringRef llvm::AMDGPU::getArchNameR600(GPUKind AK) {
183f09cf34dSArchibald Elliott   if (const auto *Entry = getArchEntry(AK, R600GPUs))
184f09cf34dSArchibald Elliott     return Entry->CanonicalName;
185f09cf34dSArchibald Elliott   return "";
186f09cf34dSArchibald Elliott }
187f09cf34dSArchibald Elliott 
188f09cf34dSArchibald Elliott AMDGPU::GPUKind llvm::AMDGPU::parseArchAMDGCN(StringRef CPU) {
189f09cf34dSArchibald Elliott   for (const auto &C : AMDGCNGPUs) {
190f09cf34dSArchibald Elliott     if (CPU == C.Name)
191f09cf34dSArchibald Elliott       return C.Kind;
192f09cf34dSArchibald Elliott   }
193f09cf34dSArchibald Elliott 
194f09cf34dSArchibald Elliott   return AMDGPU::GPUKind::GK_NONE;
195f09cf34dSArchibald Elliott }
196f09cf34dSArchibald Elliott 
197f09cf34dSArchibald Elliott AMDGPU::GPUKind llvm::AMDGPU::parseArchR600(StringRef CPU) {
198f09cf34dSArchibald Elliott   for (const auto &C : R600GPUs) {
199f09cf34dSArchibald Elliott     if (CPU == C.Name)
200f09cf34dSArchibald Elliott       return C.Kind;
201f09cf34dSArchibald Elliott   }
202f09cf34dSArchibald Elliott 
203f09cf34dSArchibald Elliott   return AMDGPU::GPUKind::GK_NONE;
204f09cf34dSArchibald Elliott }
205f09cf34dSArchibald Elliott 
206f09cf34dSArchibald Elliott unsigned AMDGPU::getArchAttrAMDGCN(GPUKind AK) {
207f09cf34dSArchibald Elliott   if (const auto *Entry = getArchEntry(AK, AMDGCNGPUs))
208f09cf34dSArchibald Elliott     return Entry->Features;
209f09cf34dSArchibald Elliott   return FEATURE_NONE;
210f09cf34dSArchibald Elliott }
211f09cf34dSArchibald Elliott 
212f09cf34dSArchibald Elliott unsigned AMDGPU::getArchAttrR600(GPUKind AK) {
213f09cf34dSArchibald Elliott   if (const auto *Entry = getArchEntry(AK, R600GPUs))
214f09cf34dSArchibald Elliott     return Entry->Features;
215f09cf34dSArchibald Elliott   return FEATURE_NONE;
216f09cf34dSArchibald Elliott }
217f09cf34dSArchibald Elliott 
218f09cf34dSArchibald Elliott void AMDGPU::fillValidArchListAMDGCN(SmallVectorImpl<StringRef> &Values) {
219f09cf34dSArchibald Elliott   // XXX: Should this only report unique canonical names?
220f09cf34dSArchibald Elliott   for (const auto &C : AMDGCNGPUs)
221f09cf34dSArchibald Elliott     Values.push_back(C.Name);
222f09cf34dSArchibald Elliott }
223f09cf34dSArchibald Elliott 
224f09cf34dSArchibald Elliott void AMDGPU::fillValidArchListR600(SmallVectorImpl<StringRef> &Values) {
225f09cf34dSArchibald Elliott   for (const auto &C : R600GPUs)
226f09cf34dSArchibald Elliott     Values.push_back(C.Name);
227f09cf34dSArchibald Elliott }
228f09cf34dSArchibald Elliott 
229f09cf34dSArchibald Elliott AMDGPU::IsaVersion AMDGPU::getIsaVersion(StringRef GPU) {
230f09cf34dSArchibald Elliott   AMDGPU::GPUKind AK = parseArchAMDGCN(GPU);
231f09cf34dSArchibald Elliott   if (AK == AMDGPU::GPUKind::GK_NONE) {
232f09cf34dSArchibald Elliott     if (GPU == "generic-hsa")
233f09cf34dSArchibald Elliott       return {7, 0, 0};
234f09cf34dSArchibald Elliott     if (GPU == "generic")
235f09cf34dSArchibald Elliott       return {6, 0, 0};
236f09cf34dSArchibald Elliott     return {0, 0, 0};
237f09cf34dSArchibald Elliott   }
238f09cf34dSArchibald Elliott 
2399b374a80SJay Foad   // clang-format off
240f09cf34dSArchibald Elliott   switch (AK) {
241f09cf34dSArchibald Elliott   case GK_GFX600:  return {6, 0, 0};
242f09cf34dSArchibald Elliott   case GK_GFX601:  return {6, 0, 1};
243f09cf34dSArchibald Elliott   case GK_GFX602:  return {6, 0, 2};
244f09cf34dSArchibald Elliott   case GK_GFX700:  return {7, 0, 0};
245f09cf34dSArchibald Elliott   case GK_GFX701:  return {7, 0, 1};
246f09cf34dSArchibald Elliott   case GK_GFX702:  return {7, 0, 2};
247f09cf34dSArchibald Elliott   case GK_GFX703:  return {7, 0, 3};
248f09cf34dSArchibald Elliott   case GK_GFX704:  return {7, 0, 4};
249f09cf34dSArchibald Elliott   case GK_GFX705:  return {7, 0, 5};
250f09cf34dSArchibald Elliott   case GK_GFX801:  return {8, 0, 1};
251f09cf34dSArchibald Elliott   case GK_GFX802:  return {8, 0, 2};
252f09cf34dSArchibald Elliott   case GK_GFX803:  return {8, 0, 3};
253f09cf34dSArchibald Elliott   case GK_GFX805:  return {8, 0, 5};
254f09cf34dSArchibald Elliott   case GK_GFX810:  return {8, 1, 0};
255f09cf34dSArchibald Elliott   case GK_GFX900:  return {9, 0, 0};
256f09cf34dSArchibald Elliott   case GK_GFX902:  return {9, 0, 2};
257f09cf34dSArchibald Elliott   case GK_GFX904:  return {9, 0, 4};
258f09cf34dSArchibald Elliott   case GK_GFX906:  return {9, 0, 6};
259f09cf34dSArchibald Elliott   case GK_GFX908:  return {9, 0, 8};
260f09cf34dSArchibald Elliott   case GK_GFX909:  return {9, 0, 9};
261f09cf34dSArchibald Elliott   case GK_GFX90A:  return {9, 0, 10};
262f09cf34dSArchibald Elliott   case GK_GFX90C:  return {9, 0, 12};
263f09cf34dSArchibald Elliott   case GK_GFX940:  return {9, 4, 0};
2641fc70210SKonstantin Zhuravlyov   case GK_GFX941:  return {9, 4, 1};
2659d057279SKonstantin Zhuravlyov   case GK_GFX942:  return {9, 4, 2};
266a6fc489bSMatt Arsenault   case GK_GFX950:  return {9, 5, 0};
267f09cf34dSArchibald Elliott   case GK_GFX1010: return {10, 1, 0};
268f09cf34dSArchibald Elliott   case GK_GFX1011: return {10, 1, 1};
269f09cf34dSArchibald Elliott   case GK_GFX1012: return {10, 1, 2};
270f09cf34dSArchibald Elliott   case GK_GFX1013: return {10, 1, 3};
271f09cf34dSArchibald Elliott   case GK_GFX1030: return {10, 3, 0};
272f09cf34dSArchibald Elliott   case GK_GFX1031: return {10, 3, 1};
273f09cf34dSArchibald Elliott   case GK_GFX1032: return {10, 3, 2};
274f09cf34dSArchibald Elliott   case GK_GFX1033: return {10, 3, 3};
275f09cf34dSArchibald Elliott   case GK_GFX1034: return {10, 3, 4};
276f09cf34dSArchibald Elliott   case GK_GFX1035: return {10, 3, 5};
277f09cf34dSArchibald Elliott   case GK_GFX1036: return {10, 3, 6};
278f09cf34dSArchibald Elliott   case GK_GFX1100: return {11, 0, 0};
279f09cf34dSArchibald Elliott   case GK_GFX1101: return {11, 0, 1};
280f09cf34dSArchibald Elliott   case GK_GFX1102: return {11, 0, 2};
281f09cf34dSArchibald Elliott   case GK_GFX1103: return {11, 0, 3};
28292542f2aSJay Foad   case GK_GFX1150: return {11, 5, 0};
28392542f2aSJay Foad   case GK_GFX1151: return {11, 5, 1};
2841ca0055fSShilei Tian   case GK_GFX1152: return {11, 5, 2};
285076aac59SCarl Ritson   case GK_GFX1153: return {11, 5, 3};
286cf1e0c0bSJay Foad   case GK_GFX1200: return {12, 0, 0};
287cf1e0c0bSJay Foad   case GK_GFX1201: return {12, 0, 1};
288f93aa515SPierre van Houtryve 
289f93aa515SPierre van Houtryve   // Generic targets return the lowest common denominator
290f93aa515SPierre van Houtryve   // within their family. That is, the ISA that is the most
291f93aa515SPierre van Houtryve   // restricted in terms of features.
292f93aa515SPierre van Houtryve   //
293f93aa515SPierre van Houtryve   // gfx9-generic is tricky because there is no lowest
294f93aa515SPierre van Houtryve   // common denominator, so we return gfx900 which has mad-mix
295f93aa515SPierre van Houtryve   // but this family doesn't have it.
296f93aa515SPierre van Houtryve   //
297f93aa515SPierre van Houtryve   // This API should never be used to check for a particular
298f93aa515SPierre van Houtryve   // feature anyway.
299f93aa515SPierre van Houtryve   //
300f93aa515SPierre van Houtryve   // TODO: Split up this API depending on its caller so
301f93aa515SPierre van Houtryve   // generic target handling is more obvious and less risky.
302f93aa515SPierre van Houtryve   case GK_GFX9_GENERIC:    return {9, 0, 0};
303de0fd64bSShilei Tian   case GK_GFX9_4_GENERIC:  return {9, 4, 0};
304f93aa515SPierre van Houtryve   case GK_GFX10_1_GENERIC: return {10, 1, 0};
305f93aa515SPierre van Houtryve   case GK_GFX10_3_GENERIC: return {10, 3, 0};
306f93aa515SPierre van Houtryve   case GK_GFX11_GENERIC:   return {11, 0, 3};
307775f1cd3SKonstantin Zhuravlyov   case GK_GFX12_GENERIC:   return {12, 0, 0};
308f09cf34dSArchibald Elliott   default:         return {0, 0, 0};
309f09cf34dSArchibald Elliott   }
3109b374a80SJay Foad   // clang-format on
311f09cf34dSArchibald Elliott }
312f09cf34dSArchibald Elliott 
313f09cf34dSArchibald Elliott StringRef AMDGPU::getCanonicalArchName(const Triple &T, StringRef Arch) {
314f09cf34dSArchibald Elliott   assert(T.isAMDGPU());
315f09cf34dSArchibald Elliott   auto ProcKind = T.isAMDGCN() ? parseArchAMDGCN(Arch) : parseArchR600(Arch);
316f09cf34dSArchibald Elliott   if (ProcKind == GK_NONE)
317f09cf34dSArchibald Elliott     return StringRef();
318f09cf34dSArchibald Elliott 
319f09cf34dSArchibald Elliott   return T.isAMDGCN() ? getArchNameAMDGCN(ProcKind) : getArchNameR600(ProcKind);
320f09cf34dSArchibald Elliott }
321e43247ddSDominik Adamski 
322e43247ddSDominik Adamski void AMDGPU::fillAMDGPUFeatureMap(StringRef GPU, const Triple &T,
323e43247ddSDominik Adamski                                   StringMap<bool> &Features) {
324e43247ddSDominik Adamski   // XXX - What does the member GPU mean if device name string passed here?
32588e2bb40SAlex Voicu   if (T.isSPIRV() && T.getOS() == Triple::OSType::AMDHSA) {
326*b08b5638SAlex Voicu     // AMDGCN SPIRV must support the union of all AMDGCN features. This list
327*b08b5638SAlex Voicu     // should be kept in sorted order and updated whenever new features are
328*b08b5638SAlex Voicu     // added.
329*b08b5638SAlex Voicu     Features["16-bit-insts"] = true;
330*b08b5638SAlex Voicu     Features["ashr-pk-insts"] = true;
331*b08b5638SAlex Voicu     Features["atomic-buffer-pk-add-bf16-inst"] = true;
33288e2bb40SAlex Voicu     Features["atomic-buffer-global-pk-add-f16-insts"] = true;
333*b08b5638SAlex Voicu     Features["atomic-ds-pk-add-16-insts"] = true;
33488e2bb40SAlex Voicu     Features["atomic-fadd-rtn-insts"] = true;
335*b08b5638SAlex Voicu     Features["atomic-flat-pk-add-16-insts"] = true;
336*b08b5638SAlex Voicu     Features["atomic-global-pk-add-bf16-inst"] = true;
337*b08b5638SAlex Voicu     Features["bf8-cvt-scale-insts"] = true;
338*b08b5638SAlex Voicu     Features["bitop3-insts"] = true;
33988e2bb40SAlex Voicu     Features["ci-insts"] = true;
340*b08b5638SAlex Voicu     Features["dl-insts"] = true;
34188e2bb40SAlex Voicu     Features["dot1-insts"] = true;
34288e2bb40SAlex Voicu     Features["dot2-insts"] = true;
34388e2bb40SAlex Voicu     Features["dot3-insts"] = true;
34488e2bb40SAlex Voicu     Features["dot4-insts"] = true;
34588e2bb40SAlex Voicu     Features["dot5-insts"] = true;
346*b08b5638SAlex Voicu     Features["dot6-insts"] = true;
34788e2bb40SAlex Voicu     Features["dot7-insts"] = true;
34888e2bb40SAlex Voicu     Features["dot8-insts"] = true;
34988e2bb40SAlex Voicu     Features["dot9-insts"] = true;
35088e2bb40SAlex Voicu     Features["dot10-insts"] = true;
35188e2bb40SAlex Voicu     Features["dot11-insts"] = true;
352*b08b5638SAlex Voicu     Features["dot12-insts"] = true;
353*b08b5638SAlex Voicu     Features["dot13-insts"] = true;
35488e2bb40SAlex Voicu     Features["dpp"] = true;
355*b08b5638SAlex Voicu     Features["f16bf16-to-fp6bf6-cvt-scale-insts"] = true;
356*b08b5638SAlex Voicu     Features["f32-to-f16bf16-cvt-sr-insts"] = true;
357*b08b5638SAlex Voicu     Features["fp4-cvt-scale-insts"] = true;
358*b08b5638SAlex Voicu     Features["fp6bf6-cvt-scale-insts"] = true;
359*b08b5638SAlex Voicu     Features["fp8-insts"] = true;
360*b08b5638SAlex Voicu     Features["fp8-conversion-insts"] = true;
361*b08b5638SAlex Voicu     Features["fp8-cvt-scale-insts"] = true;
36288e2bb40SAlex Voicu     Features["gfx8-insts"] = true;
36388e2bb40SAlex Voicu     Features["gfx9-insts"] = true;
36488e2bb40SAlex Voicu     Features["gfx90a-insts"] = true;
36588e2bb40SAlex Voicu     Features["gfx940-insts"] = true;
366*b08b5638SAlex Voicu     Features["gfx950-insts"] = true;
36788e2bb40SAlex Voicu     Features["gfx10-insts"] = true;
36888e2bb40SAlex Voicu     Features["gfx10-3-insts"] = true;
36988e2bb40SAlex Voicu     Features["gfx11-insts"] = true;
37088e2bb40SAlex Voicu     Features["gfx12-insts"] = true;
371*b08b5638SAlex Voicu     Features["gws"] = true;
37288e2bb40SAlex Voicu     Features["image-insts"] = true;
37388e2bb40SAlex Voicu     Features["s-memrealtime"] = true;
37488e2bb40SAlex Voicu     Features["s-memtime-inst"] = true;
37588e2bb40SAlex Voicu     Features["mai-insts"] = true;
376*b08b5638SAlex Voicu     Features["permlane16-swap"] = true;
377*b08b5638SAlex Voicu     Features["permlane32-swap"] = true;
378*b08b5638SAlex Voicu     Features["prng-inst"] = true;
37988e2bb40SAlex Voicu     Features["wavefrontsize32"] = true;
38088e2bb40SAlex Voicu     Features["wavefrontsize64"] = true;
38188e2bb40SAlex Voicu   } else if (T.isAMDGCN()) {
382a6fc489bSMatt Arsenault     AMDGPU::GPUKind Kind = parseArchAMDGCN(GPU);
383a6fc489bSMatt Arsenault     switch (Kind) {
384cf1e0c0bSJay Foad     case GK_GFX1201:
385cf1e0c0bSJay Foad     case GK_GFX1200:
386775f1cd3SKonstantin Zhuravlyov     case GK_GFX12_GENERIC:
387cf1e0c0bSJay Foad       Features["ci-insts"] = true;
388cf1e0c0bSJay Foad       Features["dot7-insts"] = true;
389cf1e0c0bSJay Foad       Features["dot8-insts"] = true;
390cf1e0c0bSJay Foad       Features["dot9-insts"] = true;
391cf1e0c0bSJay Foad       Features["dot10-insts"] = true;
39296813de5SChangpeng Fang       Features["dot11-insts"] = true;
393aa7eb572SMatt Arsenault       Features["dot12-insts"] = true;
394cf1e0c0bSJay Foad       Features["dl-insts"] = true;
3953e6589f2SMariusz Sikora       Features["atomic-ds-pk-add-16-insts"] = true;
3963e6589f2SMariusz Sikora       Features["atomic-flat-pk-add-16-insts"] = true;
3973e6589f2SMariusz Sikora       Features["atomic-buffer-global-pk-add-f16-insts"] = true;
3987fc71f79SMatt Arsenault       Features["atomic-buffer-pk-add-bf16-inst"] = true;
3993e6589f2SMariusz Sikora       Features["atomic-global-pk-add-bf16-inst"] = true;
400cf1e0c0bSJay Foad       Features["16-bit-insts"] = true;
401cf1e0c0bSJay Foad       Features["dpp"] = true;
402cf1e0c0bSJay Foad       Features["gfx8-insts"] = true;
403cf1e0c0bSJay Foad       Features["gfx9-insts"] = true;
404cf1e0c0bSJay Foad       Features["gfx10-insts"] = true;
405cf1e0c0bSJay Foad       Features["gfx10-3-insts"] = true;
406cf1e0c0bSJay Foad       Features["gfx11-insts"] = true;
407cf1e0c0bSJay Foad       Features["gfx12-insts"] = true;
408cf1e0c0bSJay Foad       Features["atomic-fadd-rtn-insts"] = true;
409cf1e0c0bSJay Foad       Features["image-insts"] = true;
410cfddb59bSMariusz Sikora       Features["fp8-conversion-insts"] = true;
411cf1e0c0bSJay Foad       break;
412076aac59SCarl Ritson     case GK_GFX1153:
4131ca0055fSShilei Tian     case GK_GFX1152:
41492542f2aSJay Foad     case GK_GFX1151:
41592542f2aSJay Foad     case GK_GFX1150:
416e43247ddSDominik Adamski     case GK_GFX1103:
417e43247ddSDominik Adamski     case GK_GFX1102:
418e43247ddSDominik Adamski     case GK_GFX1101:
419e43247ddSDominik Adamski     case GK_GFX1100:
420f93aa515SPierre van Houtryve     case GK_GFX11_GENERIC:
421e43247ddSDominik Adamski       Features["ci-insts"] = true;
422e43247ddSDominik Adamski       Features["dot5-insts"] = true;
423e43247ddSDominik Adamski       Features["dot7-insts"] = true;
424e43247ddSDominik Adamski       Features["dot8-insts"] = true;
425e43247ddSDominik Adamski       Features["dot9-insts"] = true;
426e43247ddSDominik Adamski       Features["dot10-insts"] = true;
427aa7eb572SMatt Arsenault       Features["dot12-insts"] = true;
428e43247ddSDominik Adamski       Features["dl-insts"] = true;
429e43247ddSDominik Adamski       Features["16-bit-insts"] = true;
430e43247ddSDominik Adamski       Features["dpp"] = true;
431e43247ddSDominik Adamski       Features["gfx8-insts"] = true;
432e43247ddSDominik Adamski       Features["gfx9-insts"] = true;
433e43247ddSDominik Adamski       Features["gfx10-insts"] = true;
434e43247ddSDominik Adamski       Features["gfx10-3-insts"] = true;
435e43247ddSDominik Adamski       Features["gfx11-insts"] = true;
436e43247ddSDominik Adamski       Features["atomic-fadd-rtn-insts"] = true;
437c0f0d506SYaxun (Sam) Liu       Features["image-insts"] = true;
438b8a9c50fSYaxun (Sam) Liu       Features["gws"] = true;
439e43247ddSDominik Adamski       break;
440e43247ddSDominik Adamski     case GK_GFX1036:
441e43247ddSDominik Adamski     case GK_GFX1035:
442e43247ddSDominik Adamski     case GK_GFX1034:
443e43247ddSDominik Adamski     case GK_GFX1033:
444e43247ddSDominik Adamski     case GK_GFX1032:
445e43247ddSDominik Adamski     case GK_GFX1031:
446e43247ddSDominik Adamski     case GK_GFX1030:
447f93aa515SPierre van Houtryve     case GK_GFX10_3_GENERIC:
448e43247ddSDominik Adamski       Features["ci-insts"] = true;
449e43247ddSDominik Adamski       Features["dot1-insts"] = true;
450e43247ddSDominik Adamski       Features["dot2-insts"] = true;
451e43247ddSDominik Adamski       Features["dot5-insts"] = true;
452e43247ddSDominik Adamski       Features["dot6-insts"] = true;
453e43247ddSDominik Adamski       Features["dot7-insts"] = true;
454e43247ddSDominik Adamski       Features["dot10-insts"] = true;
455e43247ddSDominik Adamski       Features["dl-insts"] = true;
456e43247ddSDominik Adamski       Features["16-bit-insts"] = true;
457e43247ddSDominik Adamski       Features["dpp"] = true;
458e43247ddSDominik Adamski       Features["gfx8-insts"] = true;
459e43247ddSDominik Adamski       Features["gfx9-insts"] = true;
460e43247ddSDominik Adamski       Features["gfx10-insts"] = true;
461e43247ddSDominik Adamski       Features["gfx10-3-insts"] = true;
462c0f0d506SYaxun (Sam) Liu       Features["image-insts"] = true;
463e43247ddSDominik Adamski       Features["s-memrealtime"] = true;
464e43247ddSDominik Adamski       Features["s-memtime-inst"] = true;
465b8a9c50fSYaxun (Sam) Liu       Features["gws"] = true;
466e43247ddSDominik Adamski       break;
467e43247ddSDominik Adamski     case GK_GFX1012:
468e43247ddSDominik Adamski     case GK_GFX1011:
469e43247ddSDominik Adamski       Features["dot1-insts"] = true;
470e43247ddSDominik Adamski       Features["dot2-insts"] = true;
471e43247ddSDominik Adamski       Features["dot5-insts"] = true;
472e43247ddSDominik Adamski       Features["dot6-insts"] = true;
473e43247ddSDominik Adamski       Features["dot7-insts"] = true;
474e43247ddSDominik Adamski       Features["dot10-insts"] = true;
475e43247ddSDominik Adamski       [[fallthrough]];
476e43247ddSDominik Adamski     case GK_GFX1013:
477e43247ddSDominik Adamski     case GK_GFX1010:
478f93aa515SPierre van Houtryve     case GK_GFX10_1_GENERIC:
479e43247ddSDominik Adamski       Features["dl-insts"] = true;
480e43247ddSDominik Adamski       Features["ci-insts"] = true;
481e43247ddSDominik Adamski       Features["16-bit-insts"] = true;
482e43247ddSDominik Adamski       Features["dpp"] = true;
483e43247ddSDominik Adamski       Features["gfx8-insts"] = true;
484e43247ddSDominik Adamski       Features["gfx9-insts"] = true;
485e43247ddSDominik Adamski       Features["gfx10-insts"] = true;
486c0f0d506SYaxun (Sam) Liu       Features["image-insts"] = true;
487e43247ddSDominik Adamski       Features["s-memrealtime"] = true;
488e43247ddSDominik Adamski       Features["s-memtime-inst"] = true;
489b8a9c50fSYaxun (Sam) Liu       Features["gws"] = true;
490e43247ddSDominik Adamski       break;
491a6fc489bSMatt Arsenault     case GK_GFX950:
49262dc8f30SMatt Arsenault       Features["bitop3-insts"] = true;
4930f4fcca5SMatt Arsenault       Features["fp6bf6-cvt-scale-insts"] = true;
4942b9e947dSMatt Arsenault       Features["fp4-cvt-scale-insts"] = true;
495815069c7SMatt Arsenault       Features["bf8-cvt-scale-insts"] = true;
496815069c7SMatt Arsenault       Features["fp8-cvt-scale-insts"] = true;
49722503a9dSMatt Arsenault       Features["f16bf16-to-fp6bf6-cvt-scale-insts"] = true;
49856156572SMatt Arsenault       Features["f32-to-f16bf16-cvt-sr-insts"] = true;
499ca1b35a6SMatt Arsenault       Features["prng-inst"] = true;
500d1cca313SMatt Arsenault       Features["permlane16-swap"] = true;
501d1cca313SMatt Arsenault       Features["permlane32-swap"] = true;
5025d650a62SMatt Arsenault       Features["ashr-pk-insts"] = true;
503aa7eb572SMatt Arsenault       Features["dot12-insts"] = true;
504716364ebSMatt Arsenault       Features["dot13-insts"] = true;
5057fc71f79SMatt Arsenault       Features["atomic-buffer-pk-add-bf16-inst"] = true;
506a6fc489bSMatt Arsenault       Features["gfx950-insts"] = true;
507a6fc489bSMatt Arsenault       [[fallthrough]];
5089d057279SKonstantin Zhuravlyov     case GK_GFX942:
5091fc70210SKonstantin Zhuravlyov     case GK_GFX941:
510e43247ddSDominik Adamski     case GK_GFX940:
511e43247ddSDominik Adamski       Features["fp8-insts"] = true;
512264fd9e1SMariusz Sikora       Features["fp8-conversion-insts"] = true;
513a6fc489bSMatt Arsenault       if (Kind != GK_GFX950)
514de0fd64bSShilei Tian         Features["xf32-insts"] = true;
515de0fd64bSShilei Tian       [[fallthrough]];
516de0fd64bSShilei Tian     case GK_GFX9_4_GENERIC:
517de0fd64bSShilei Tian       Features["gfx940-insts"] = true;
518e43247ddSDominik Adamski       Features["atomic-ds-pk-add-16-insts"] = true;
519e43247ddSDominik Adamski       Features["atomic-flat-pk-add-16-insts"] = true;
520e43247ddSDominik Adamski       Features["atomic-global-pk-add-bf16-inst"] = true;
521c0f0d506SYaxun (Sam) Liu       Features["gfx90a-insts"] = true;
522c0f0d506SYaxun (Sam) Liu       Features["atomic-buffer-global-pk-add-f16-insts"] = true;
523c0f0d506SYaxun (Sam) Liu       Features["atomic-fadd-rtn-insts"] = true;
524c0f0d506SYaxun (Sam) Liu       Features["dot3-insts"] = true;
525c0f0d506SYaxun (Sam) Liu       Features["dot4-insts"] = true;
526c0f0d506SYaxun (Sam) Liu       Features["dot5-insts"] = true;
527c0f0d506SYaxun (Sam) Liu       Features["dot6-insts"] = true;
528c0f0d506SYaxun (Sam) Liu       Features["mai-insts"] = true;
529c0f0d506SYaxun (Sam) Liu       Features["dl-insts"] = true;
530c0f0d506SYaxun (Sam) Liu       Features["dot1-insts"] = true;
531c0f0d506SYaxun (Sam) Liu       Features["dot2-insts"] = true;
532c0f0d506SYaxun (Sam) Liu       Features["dot7-insts"] = true;
533c0f0d506SYaxun (Sam) Liu       Features["dot10-insts"] = true;
534c0f0d506SYaxun (Sam) Liu       Features["gfx9-insts"] = true;
535c0f0d506SYaxun (Sam) Liu       Features["gfx8-insts"] = true;
536c0f0d506SYaxun (Sam) Liu       Features["16-bit-insts"] = true;
537c0f0d506SYaxun (Sam) Liu       Features["dpp"] = true;
538c0f0d506SYaxun (Sam) Liu       Features["s-memrealtime"] = true;
539c0f0d506SYaxun (Sam) Liu       Features["ci-insts"] = true;
540c0f0d506SYaxun (Sam) Liu       Features["s-memtime-inst"] = true;
541b8a9c50fSYaxun (Sam) Liu       Features["gws"] = true;
542c0f0d506SYaxun (Sam) Liu       break;
543e43247ddSDominik Adamski     case GK_GFX90A:
544e43247ddSDominik Adamski       Features["gfx90a-insts"] = true;
545e43247ddSDominik Adamski       Features["atomic-buffer-global-pk-add-f16-insts"] = true;
546e43247ddSDominik Adamski       Features["atomic-fadd-rtn-insts"] = true;
547e43247ddSDominik Adamski       [[fallthrough]];
548e43247ddSDominik Adamski     case GK_GFX908:
549e43247ddSDominik Adamski       Features["dot3-insts"] = true;
550e43247ddSDominik Adamski       Features["dot4-insts"] = true;
551e43247ddSDominik Adamski       Features["dot5-insts"] = true;
552e43247ddSDominik Adamski       Features["dot6-insts"] = true;
553e43247ddSDominik Adamski       Features["mai-insts"] = true;
554e43247ddSDominik Adamski       [[fallthrough]];
555e43247ddSDominik Adamski     case GK_GFX906:
556e43247ddSDominik Adamski       Features["dl-insts"] = true;
557e43247ddSDominik Adamski       Features["dot1-insts"] = true;
558e43247ddSDominik Adamski       Features["dot2-insts"] = true;
559e43247ddSDominik Adamski       Features["dot7-insts"] = true;
560e43247ddSDominik Adamski       Features["dot10-insts"] = true;
561e43247ddSDominik Adamski       [[fallthrough]];
562e43247ddSDominik Adamski     case GK_GFX90C:
563e43247ddSDominik Adamski     case GK_GFX909:
564e43247ddSDominik Adamski     case GK_GFX904:
565e43247ddSDominik Adamski     case GK_GFX902:
566e43247ddSDominik Adamski     case GK_GFX900:
567f93aa515SPierre van Houtryve     case GK_GFX9_GENERIC:
568e43247ddSDominik Adamski       Features["gfx9-insts"] = true;
569e43247ddSDominik Adamski       [[fallthrough]];
570e43247ddSDominik Adamski     case GK_GFX810:
571e43247ddSDominik Adamski     case GK_GFX805:
572e43247ddSDominik Adamski     case GK_GFX803:
573e43247ddSDominik Adamski     case GK_GFX802:
574e43247ddSDominik Adamski     case GK_GFX801:
575e43247ddSDominik Adamski       Features["gfx8-insts"] = true;
576e43247ddSDominik Adamski       Features["16-bit-insts"] = true;
577e43247ddSDominik Adamski       Features["dpp"] = true;
578e43247ddSDominik Adamski       Features["s-memrealtime"] = true;
579e43247ddSDominik Adamski       [[fallthrough]];
580e43247ddSDominik Adamski     case GK_GFX705:
581e43247ddSDominik Adamski     case GK_GFX704:
582e43247ddSDominik Adamski     case GK_GFX703:
583e43247ddSDominik Adamski     case GK_GFX702:
584e43247ddSDominik Adamski     case GK_GFX701:
585e43247ddSDominik Adamski     case GK_GFX700:
586e43247ddSDominik Adamski       Features["ci-insts"] = true;
587e43247ddSDominik Adamski       [[fallthrough]];
588e43247ddSDominik Adamski     case GK_GFX602:
589e43247ddSDominik Adamski     case GK_GFX601:
590e43247ddSDominik Adamski     case GK_GFX600:
591c0f0d506SYaxun (Sam) Liu       Features["image-insts"] = true;
592e43247ddSDominik Adamski       Features["s-memtime-inst"] = true;
593b8a9c50fSYaxun (Sam) Liu       Features["gws"] = true;
594e43247ddSDominik Adamski       break;
595e43247ddSDominik Adamski     case GK_NONE:
596e43247ddSDominik Adamski       break;
597e43247ddSDominik Adamski     default:
598e43247ddSDominik Adamski       llvm_unreachable("Unhandled GPU!");
599e43247ddSDominik Adamski     }
600e43247ddSDominik Adamski   } else {
601e43247ddSDominik Adamski     if (GPU.empty())
602e43247ddSDominik Adamski       GPU = "r600";
603e43247ddSDominik Adamski 
604e43247ddSDominik Adamski     switch (llvm::AMDGPU::parseArchR600(GPU)) {
605e43247ddSDominik Adamski     case GK_CAYMAN:
606e43247ddSDominik Adamski     case GK_CYPRESS:
607e43247ddSDominik Adamski     case GK_RV770:
608e43247ddSDominik Adamski     case GK_RV670:
609e43247ddSDominik Adamski       // TODO: Add fp64 when implemented.
610e43247ddSDominik Adamski       break;
611e43247ddSDominik Adamski     case GK_TURKS:
612e43247ddSDominik Adamski     case GK_CAICOS:
613e43247ddSDominik Adamski     case GK_BARTS:
614e43247ddSDominik Adamski     case GK_SUMO:
615e43247ddSDominik Adamski     case GK_REDWOOD:
616e43247ddSDominik Adamski     case GK_JUNIPER:
617e43247ddSDominik Adamski     case GK_CEDAR:
618e43247ddSDominik Adamski     case GK_RV730:
619e43247ddSDominik Adamski     case GK_RV710:
620e43247ddSDominik Adamski     case GK_RS880:
621e43247ddSDominik Adamski     case GK_R630:
622e43247ddSDominik Adamski     case GK_R600:
623e43247ddSDominik Adamski       break;
624e43247ddSDominik Adamski     default:
625e43247ddSDominik Adamski       llvm_unreachable("Unhandled GPU!");
626e43247ddSDominik Adamski     }
627e43247ddSDominik Adamski   }
628e43247ddSDominik Adamski }
629e43247ddSDominik Adamski 
630e43247ddSDominik Adamski static bool isWave32Capable(StringRef GPU, const Triple &T) {
631e43247ddSDominik Adamski   bool IsWave32Capable = false;
632e43247ddSDominik Adamski   // XXX - What does the member GPU mean if device name string passed here?
633e43247ddSDominik Adamski   if (T.isAMDGCN()) {
634e43247ddSDominik Adamski     switch (parseArchAMDGCN(GPU)) {
635cf1e0c0bSJay Foad     case GK_GFX1201:
636cf1e0c0bSJay Foad     case GK_GFX1200:
637076aac59SCarl Ritson     case GK_GFX1153:
6381ca0055fSShilei Tian     case GK_GFX1152:
63992542f2aSJay Foad     case GK_GFX1151:
64092542f2aSJay Foad     case GK_GFX1150:
641e43247ddSDominik Adamski     case GK_GFX1103:
642e43247ddSDominik Adamski     case GK_GFX1102:
643e43247ddSDominik Adamski     case GK_GFX1101:
644e43247ddSDominik Adamski     case GK_GFX1100:
645e43247ddSDominik Adamski     case GK_GFX1036:
646e43247ddSDominik Adamski     case GK_GFX1035:
647e43247ddSDominik Adamski     case GK_GFX1034:
648e43247ddSDominik Adamski     case GK_GFX1033:
649e43247ddSDominik Adamski     case GK_GFX1032:
650e43247ddSDominik Adamski     case GK_GFX1031:
651e43247ddSDominik Adamski     case GK_GFX1030:
652e43247ddSDominik Adamski     case GK_GFX1012:
653e43247ddSDominik Adamski     case GK_GFX1011:
654e43247ddSDominik Adamski     case GK_GFX1013:
655e43247ddSDominik Adamski     case GK_GFX1010:
656775f1cd3SKonstantin Zhuravlyov     case GK_GFX12_GENERIC:
657f93aa515SPierre van Houtryve     case GK_GFX11_GENERIC:
658f93aa515SPierre van Houtryve     case GK_GFX10_3_GENERIC:
659f93aa515SPierre van Houtryve     case GK_GFX10_1_GENERIC:
660e43247ddSDominik Adamski       IsWave32Capable = true;
661e43247ddSDominik Adamski       break;
662e43247ddSDominik Adamski     default:
663e43247ddSDominik Adamski       break;
664e43247ddSDominik Adamski     }
665e43247ddSDominik Adamski   }
666e43247ddSDominik Adamski   return IsWave32Capable;
667e43247ddSDominik Adamski }
668e43247ddSDominik Adamski 
669f363e30fSStanislav Mekhanoshin std::pair<FeatureError, StringRef>
670f363e30fSStanislav Mekhanoshin AMDGPU::insertWaveSizeFeature(StringRef GPU, const Triple &T,
671f363e30fSStanislav Mekhanoshin                               StringMap<bool> &Features) {
672e43247ddSDominik Adamski   bool IsWave32Capable = isWave32Capable(GPU, T);
673e43247ddSDominik Adamski   const bool IsNullGPU = GPU.empty();
674f363e30fSStanislav Mekhanoshin   const bool HaveWave32 = Features.count("wavefrontsize32");
675e43247ddSDominik Adamski   const bool HaveWave64 = Features.count("wavefrontsize64");
676e43247ddSDominik Adamski   if (HaveWave32 && HaveWave64) {
677f363e30fSStanislav Mekhanoshin     return {AMDGPU::INVALID_FEATURE_COMBINATION,
678f363e30fSStanislav Mekhanoshin             "'wavefrontsize32' and 'wavefrontsize64' are mutually exclusive"};
679f363e30fSStanislav Mekhanoshin   }
680f363e30fSStanislav Mekhanoshin   if (HaveWave32 && !IsNullGPU && !IsWave32Capable) {
681f363e30fSStanislav Mekhanoshin     return {AMDGPU::UNSUPPORTED_TARGET_FEATURE, "wavefrontsize32"};
682e43247ddSDominik Adamski   }
683e43247ddSDominik Adamski   // Don't assume any wavesize with an unknown subtarget.
684e43247ddSDominik Adamski   if (!IsNullGPU) {
685e43247ddSDominik Adamski     // Default to wave32 if available, or wave64 if not
686e43247ddSDominik Adamski     if (!HaveWave32 && !HaveWave64) {
687e43247ddSDominik Adamski       StringRef DefaultWaveSizeFeature =
688e43247ddSDominik Adamski           IsWave32Capable ? "wavefrontsize32" : "wavefrontsize64";
689e43247ddSDominik Adamski       Features.insert(std::make_pair(DefaultWaveSizeFeature, true));
690e43247ddSDominik Adamski     }
691e43247ddSDominik Adamski   }
692f363e30fSStanislav Mekhanoshin   return {NO_ERROR, StringRef()};
693e43247ddSDominik Adamski }
694