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