[llvm] [TargetParser] Introduce AMDGPUTargetParser.def. NFCI. (PR #186137)
Jay Foad via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 12 08:08:31 PDT 2026
https://github.com/jayfoad created https://github.com/llvm/llvm-project/pull/186137
Define AMDGPU GPUs in a separate .def file similar to other targets, so
they are listed in just one place instead of three.
>From daf1d2b2a0699b56e0a26cc466e3bce9e6e29a86 Mon Sep 17 00:00:00 2001
From: Jay Foad <jay.foad at amd.com>
Date: Thu, 12 Mar 2026 12:32:11 +0000
Subject: [PATCH] [TargetParser] Introduce AMDGPUTargetParser.def. NFCI.
Define AMDGPU GPUs in a separate .def file similar to other targets, so
they are listed in just one place instead of three.
---
.../llvm/TargetParser/AMDGPUTargetParser.def | 150 +++++++++
llvm/include/llvm/TargetParser/TargetParser.h | 93 +-----
llvm/lib/TargetParser/TargetParser.cpp | 301 ++++--------------
3 files changed, 214 insertions(+), 330 deletions(-)
create mode 100644 llvm/include/llvm/TargetParser/AMDGPUTargetParser.def
diff --git a/llvm/include/llvm/TargetParser/AMDGPUTargetParser.def b/llvm/include/llvm/TargetParser/AMDGPUTargetParser.def
new file mode 100644
index 0000000000000..babb815c28dee
--- /dev/null
+++ b/llvm/include/llvm/TargetParser/AMDGPUTargetParser.def
@@ -0,0 +1,150 @@
+//===- AMDGPUTargetParser.def - AMDGPU target parsing defines ---*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file provides defines to build up the AMDGPU target parser's logic.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef R600_GPU
+#define R600_GPU(NAME, ENUM, FEATURES)
+#endif
+
+#ifndef R600_GPU_ALIAS
+#define R600_GPU_ALIAS(NAME, ENUM)
+#endif
+
+R600_GPU ("r600", GK_R600, FEATURE_NONE)
+R600_GPU_ALIAS("rv630", GK_R600)
+R600_GPU_ALIAS("rv635", GK_R600)
+R600_GPU ("r630", GK_R630, FEATURE_NONE)
+R600_GPU_ALIAS("rs780", GK_RS880)
+R600_GPU ("rs880", GK_RS880, FEATURE_NONE)
+R600_GPU_ALIAS("rv610", GK_RS880)
+R600_GPU_ALIAS("rv620", GK_RS880)
+R600_GPU ("rv670", GK_RV670, FEATURE_NONE)
+R600_GPU ("rv710", GK_RV710, FEATURE_NONE)
+R600_GPU ("rv730", GK_RV730, FEATURE_NONE)
+R600_GPU_ALIAS("rv740", GK_RV770)
+R600_GPU ("rv770", GK_RV770, FEATURE_NONE)
+R600_GPU ("cedar", GK_CEDAR, FEATURE_NONE)
+R600_GPU_ALIAS("palm", GK_CEDAR)
+R600_GPU ("cypress", GK_CYPRESS, FEATURE_FMA)
+R600_GPU_ALIAS("hemlock", GK_CYPRESS)
+R600_GPU ("juniper", GK_JUNIPER, FEATURE_NONE)
+R600_GPU ("redwood", GK_REDWOOD, FEATURE_NONE)
+R600_GPU ("sumo", GK_SUMO, FEATURE_NONE)
+R600_GPU_ALIAS("sumo2", GK_SUMO)
+R600_GPU ("barts", GK_BARTS, FEATURE_NONE)
+R600_GPU ("caicos", GK_CAICOS, FEATURE_NONE)
+R600_GPU_ALIAS("aruba", GK_CAYMAN)
+R600_GPU ("cayman", GK_CAYMAN, FEATURE_FMA)
+R600_GPU ("turks", GK_TURKS, FEATURE_NONE)
+
+#undef R600_GPU
+#undef R600_GPU_ALIAS
+
+#ifndef AMDGCN_GPU
+#define AMDGCN_GPU(NAME, ENUM, ISAVERSION, FEATURES)
+#endif
+
+#ifndef AMDGCN_GPU_ALIAS
+#define AMDGCN_GPU_ALIAS(NAME, ENUM)
+#endif
+
+// Don't bother listing the implicitly true features
+AMDGCN_GPU ("gfx600", GK_GFX600, ( 6, 0, 0), FEATURE_FAST_FMA_F32)
+AMDGCN_GPU_ALIAS("tahiti", GK_GFX600)
+AMDGCN_GPU ("gfx601", GK_GFX601, ( 6, 0, 1), FEATURE_NONE)
+AMDGCN_GPU_ALIAS("pitcairn", GK_GFX601)
+AMDGCN_GPU_ALIAS("verde", GK_GFX601)
+AMDGCN_GPU ("gfx602", GK_GFX602, ( 6, 0, 2), FEATURE_NONE)
+AMDGCN_GPU_ALIAS("hainan", GK_GFX602)
+AMDGCN_GPU_ALIAS("oland", GK_GFX602)
+AMDGCN_GPU ("gfx700", GK_GFX700, ( 7, 0, 0), FEATURE_NONE)
+AMDGCN_GPU_ALIAS("kaveri", GK_GFX700)
+AMDGCN_GPU ("gfx701", GK_GFX701, ( 7, 0, 1), FEATURE_FAST_FMA_F32)
+AMDGCN_GPU_ALIAS("hawaii", GK_GFX701)
+AMDGCN_GPU ("gfx702", GK_GFX702, ( 7, 0, 2), FEATURE_FAST_FMA_F32)
+AMDGCN_GPU ("gfx703", GK_GFX703, ( 7, 0, 3), FEATURE_NONE)
+AMDGCN_GPU_ALIAS("kabini", GK_GFX703)
+AMDGCN_GPU_ALIAS("mullins", GK_GFX703)
+AMDGCN_GPU ("gfx704", GK_GFX704, ( 7, 0, 4), FEATURE_NONE)
+AMDGCN_GPU_ALIAS("bonaire", GK_GFX704)
+AMDGCN_GPU ("gfx705", GK_GFX705, ( 7, 0, 5), FEATURE_NONE)
+AMDGCN_GPU ("gfx801", GK_GFX801, ( 8, 0, 1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK)
+AMDGCN_GPU_ALIAS("carrizo", GK_GFX801)
+AMDGCN_GPU ("gfx802", GK_GFX802, ( 8, 0, 2), FEATURE_FAST_DENORMAL_F32)
+AMDGCN_GPU_ALIAS("iceland", GK_GFX802)
+AMDGCN_GPU_ALIAS("tonga", GK_GFX802)
+AMDGCN_GPU ("gfx803", GK_GFX803, ( 8, 0, 3), FEATURE_FAST_DENORMAL_F32)
+AMDGCN_GPU_ALIAS("fiji", GK_GFX803)
+AMDGCN_GPU_ALIAS("polaris10", GK_GFX803)
+AMDGCN_GPU_ALIAS("polaris11", GK_GFX803)
+AMDGCN_GPU ("gfx805", GK_GFX805, ( 8, 0, 5), FEATURE_FAST_DENORMAL_F32)
+AMDGCN_GPU_ALIAS("tongapro", GK_GFX805)
+AMDGCN_GPU ("gfx810", GK_GFX810, ( 8, 1, 0), FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK)
+AMDGCN_GPU_ALIAS("stoney", GK_GFX810)
+AMDGCN_GPU ("gfx900", GK_GFX900, ( 9, 0, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK)
+AMDGCN_GPU ("gfx902", GK_GFX902, ( 9, 0, 2), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK)
+AMDGCN_GPU ("gfx904", GK_GFX904, ( 9, 0, 4), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK)
+AMDGCN_GPU ("gfx906", GK_GFX906, ( 9, 0, 6), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC)
+AMDGCN_GPU ("gfx908", GK_GFX908, ( 9, 0, 8), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC)
+AMDGCN_GPU ("gfx909", GK_GFX909, ( 9, 0, 9), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK)
+AMDGCN_GPU ("gfx90a", GK_GFX90A, ( 9, 0, 10), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC)
+AMDGCN_GPU ("gfx90c", GK_GFX90C, ( 9, 0, 12), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK)
+AMDGCN_GPU ("gfx942", GK_GFX942, ( 9, 4, 2), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC)
+AMDGCN_GPU ("gfx950", GK_GFX950, ( 9, 5, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC)
+AMDGCN_GPU ("gfx1010", GK_GFX1010, (10, 1, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP)
+AMDGCN_GPU ("gfx1011", GK_GFX1011, (10, 1, 1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP)
+AMDGCN_GPU ("gfx1012", GK_GFX1012, (10, 1, 2), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP)
+AMDGCN_GPU ("gfx1013", GK_GFX1013, (10, 1, 3), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP)
+AMDGCN_GPU ("gfx1030", GK_GFX1030, (10, 3, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU ("gfx1031", GK_GFX1031, (10, 3, 1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU ("gfx1032", GK_GFX1032, (10, 3, 2), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU ("gfx1033", GK_GFX1033, (10, 3, 3), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU ("gfx1034", GK_GFX1034, (10, 3, 4), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU ("gfx1035", GK_GFX1035, (10, 3, 5), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU ("gfx1036", GK_GFX1036, (10, 3, 6), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU ("gfx1100", GK_GFX1100, (11, 0, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU ("gfx1101", GK_GFX1101, (11, 0, 1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU ("gfx1102", GK_GFX1102, (11, 0, 2), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU ("gfx1103", GK_GFX1103, (11, 0, 3), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU ("gfx1150", GK_GFX1150, (11, 5, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU ("gfx1151", GK_GFX1151, (11, 5, 1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU ("gfx1152", GK_GFX1152, (11, 5, 2), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU ("gfx1153", GK_GFX1153, (11, 5, 3), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU ("gfx1170", GK_GFX1170, (11, 7, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU ("gfx1200", GK_GFX1200, (12, 0, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU ("gfx1201", GK_GFX1201, (12, 0, 1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU ("gfx1250", GK_GFX1250, (12, 5, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK_ALWAYS)
+AMDGCN_GPU ("gfx1251", GK_GFX1251, (12, 5, 1), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK_ALWAYS)
+AMDGCN_GPU ("gfx1310", GK_GFX1310, (13, 1, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+
+// Generic targets return the lowest common denominator
+// within their family. That is, the ISA that is the most
+// restricted in terms of features.
+//
+// gfx9-generic is tricky because there is no lowest
+// common denominator, so we return gfx900 which has mad-mix
+// but this family doesn't have it.
+//
+// This API should never be used to check for a particular
+// feature anyway.
+//
+// TODO: Split up this API depending on its caller so
+// generic target handling is more obvious and less risky.
+AMDGCN_GPU ("gfx9-generic", GK_GFX9_GENERIC, ( 9, 0, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK)
+AMDGCN_GPU ("gfx10-1-generic", GK_GFX10_1_GENERIC, (10, 1, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP)
+AMDGCN_GPU ("gfx10-3-generic", GK_GFX10_3_GENERIC, (10, 3, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU ("gfx11-generic", GK_GFX11_GENERIC, (11, 0, 3), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU ("gfx12-generic", GK_GFX12_GENERIC, (12, 0, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP)
+AMDGCN_GPU ("gfx9-4-generic", GK_GFX9_4_GENERIC, ( 9, 4, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC)
+AMDGCN_GPU ("gfx12-5-generic", GK_GFX12_5_GENERIC, (12, 5, 0), FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32)
+
+#undef AMDGCN_GPU
+#undef AMDGCN_GPU_ALIAS
diff --git a/llvm/include/llvm/TargetParser/TargetParser.h b/llvm/include/llvm/TargetParser/TargetParser.h
index 068374683e0ac..caf57c804db46 100644
--- a/llvm/include/llvm/TargetParser/TargetParser.h
+++ b/llvm/include/llvm/TargetParser/TargetParser.h
@@ -39,96 +39,9 @@ enum GPUKind : uint32_t {
// Not specified processor.
GK_NONE = 0,
- // R600-based processors.
- GK_R600,
- GK_R630,
- GK_RS880,
- GK_RV670,
- GK_RV710,
- GK_RV730,
- GK_RV770,
- GK_CEDAR,
- GK_CYPRESS,
- GK_JUNIPER,
- GK_REDWOOD,
- GK_SUMO,
- GK_BARTS,
- GK_CAICOS,
- GK_CAYMAN,
- GK_TURKS,
-
- GK_R600_FIRST = GK_R600,
- GK_R600_LAST = GK_TURKS,
-
- // AMDGCN-based processors.
- GK_GFX600,
- GK_GFX601,
- GK_GFX602,
-
- GK_GFX700,
- GK_GFX701,
- GK_GFX702,
- GK_GFX703,
- GK_GFX704,
- GK_GFX705,
-
- GK_GFX801,
- GK_GFX802,
- GK_GFX803,
- GK_GFX805,
- GK_GFX810,
-
- GK_GFX900,
- GK_GFX902,
- GK_GFX904,
- GK_GFX906,
- GK_GFX908,
- GK_GFX909,
- GK_GFX90A,
- GK_GFX90C,
- GK_GFX942,
- GK_GFX950,
-
- GK_GFX1010,
- GK_GFX1011,
- GK_GFX1012,
- GK_GFX1013,
- GK_GFX1030,
- GK_GFX1031,
- GK_GFX1032,
- GK_GFX1033,
- GK_GFX1034,
- GK_GFX1035,
- GK_GFX1036,
-
- GK_GFX1100,
- GK_GFX1101,
- GK_GFX1102,
- GK_GFX1103,
- GK_GFX1150,
- GK_GFX1151,
- GK_GFX1152,
- GK_GFX1153,
-
- GK_GFX1170,
-
- GK_GFX1200,
- GK_GFX1201,
- GK_GFX1250,
- GK_GFX1251,
-
- GK_GFX1310,
-
- GK_AMDGCN_FIRST = GK_GFX600,
- GK_AMDGCN_LAST = GK_GFX1310,
-
- GK_GFX9_GENERIC,
- GK_GFX10_1_GENERIC,
- GK_GFX10_3_GENERIC,
- GK_GFX11_GENERIC,
- GK_GFX12_GENERIC,
- GK_GFX9_4_GENERIC,
- GK_GFX12_5_GENERIC,
+#define R600_GPU(NAME, ENUM, FEATURES) ENUM,
+#define AMDGCN_GPU(NAME, ENUM, ISAVERSION, FEATURES) ENUM,
+#include "AMDGPUTargetParser.def"
GK_AMDGCN_GENERIC_FIRST = GK_GFX9_GENERIC,
GK_AMDGCN_GENERIC_LAST = GK_GFX12_5_GENERIC,
diff --git a/llvm/lib/TargetParser/TargetParser.cpp b/llvm/lib/TargetParser/TargetParser.cpp
index 3dcd0e9990021..b2ae5e0a5b84b 100644
--- a/llvm/lib/TargetParser/TargetParser.cpp
+++ b/llvm/lib/TargetParser/TargetParser.cpp
@@ -13,6 +13,7 @@
#include "llvm/TargetParser/TargetParser.h"
#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/StringSwitch.h"
#include "llvm/TargetParser/Triple.h"
using namespace llvm;
@@ -65,145 +66,6 @@ std::optional<llvm::StringMap<bool>> llvm::getCPUDefaultTargetFeatures(
return DefaultFeatures;
}
-namespace {
-
-struct GPUInfo {
- StringLiteral Name;
- StringLiteral CanonicalName;
- AMDGPU::GPUKind Kind;
- unsigned Features;
-};
-
-constexpr GPUInfo R600GPUs[] = {
- // Name Canonical Kind Features
- // Name
- {{"r600"}, {"r600"}, GK_R600, FEATURE_NONE },
- {{"rv630"}, {"r600"}, GK_R600, FEATURE_NONE },
- {{"rv635"}, {"r600"}, GK_R600, FEATURE_NONE },
- {{"r630"}, {"r630"}, GK_R630, FEATURE_NONE },
- {{"rs780"}, {"rs880"}, GK_RS880, FEATURE_NONE },
- {{"rs880"}, {"rs880"}, GK_RS880, FEATURE_NONE },
- {{"rv610"}, {"rs880"}, GK_RS880, FEATURE_NONE },
- {{"rv620"}, {"rs880"}, GK_RS880, FEATURE_NONE },
- {{"rv670"}, {"rv670"}, GK_RV670, FEATURE_NONE },
- {{"rv710"}, {"rv710"}, GK_RV710, FEATURE_NONE },
- {{"rv730"}, {"rv730"}, GK_RV730, FEATURE_NONE },
- {{"rv740"}, {"rv770"}, GK_RV770, FEATURE_NONE },
- {{"rv770"}, {"rv770"}, GK_RV770, FEATURE_NONE },
- {{"cedar"}, {"cedar"}, GK_CEDAR, FEATURE_NONE },
- {{"palm"}, {"cedar"}, GK_CEDAR, FEATURE_NONE },
- {{"cypress"}, {"cypress"}, GK_CYPRESS, FEATURE_FMA },
- {{"hemlock"}, {"cypress"}, GK_CYPRESS, FEATURE_FMA },
- {{"juniper"}, {"juniper"}, GK_JUNIPER, FEATURE_NONE },
- {{"redwood"}, {"redwood"}, GK_REDWOOD, FEATURE_NONE },
- {{"sumo"}, {"sumo"}, GK_SUMO, FEATURE_NONE },
- {{"sumo2"}, {"sumo"}, GK_SUMO, FEATURE_NONE },
- {{"barts"}, {"barts"}, GK_BARTS, FEATURE_NONE },
- {{"caicos"}, {"caicos"}, GK_CAICOS, FEATURE_NONE },
- {{"aruba"}, {"cayman"}, GK_CAYMAN, FEATURE_FMA },
- {{"cayman"}, {"cayman"}, GK_CAYMAN, FEATURE_FMA },
- {{"turks"}, {"turks"}, GK_TURKS, FEATURE_NONE }
-};
-
-// This table should be sorted by the value of GPUKind
-// Don't bother listing the implicitly true features
-constexpr GPUInfo AMDGCNGPUs[] = {
- // clang-format off
- // Name Canonical Kind Features
- // Name
- {{"gfx600"}, {"gfx600"}, GK_GFX600, FEATURE_FAST_FMA_F32},
- {{"tahiti"}, {"gfx600"}, GK_GFX600, FEATURE_FAST_FMA_F32},
- {{"gfx601"}, {"gfx601"}, GK_GFX601, FEATURE_NONE},
- {{"pitcairn"}, {"gfx601"}, GK_GFX601, FEATURE_NONE},
- {{"verde"}, {"gfx601"}, GK_GFX601, FEATURE_NONE},
- {{"gfx602"}, {"gfx602"}, GK_GFX602, FEATURE_NONE},
- {{"hainan"}, {"gfx602"}, GK_GFX602, FEATURE_NONE},
- {{"oland"}, {"gfx602"}, GK_GFX602, FEATURE_NONE},
- {{"gfx700"}, {"gfx700"}, GK_GFX700, FEATURE_NONE},
- {{"kaveri"}, {"gfx700"}, GK_GFX700, FEATURE_NONE},
- {{"gfx701"}, {"gfx701"}, GK_GFX701, FEATURE_FAST_FMA_F32},
- {{"hawaii"}, {"gfx701"}, GK_GFX701, FEATURE_FAST_FMA_F32},
- {{"gfx702"}, {"gfx702"}, GK_GFX702, FEATURE_FAST_FMA_F32},
- {{"gfx703"}, {"gfx703"}, GK_GFX703, FEATURE_NONE},
- {{"kabini"}, {"gfx703"}, GK_GFX703, FEATURE_NONE},
- {{"mullins"}, {"gfx703"}, GK_GFX703, FEATURE_NONE},
- {{"gfx704"}, {"gfx704"}, GK_GFX704, FEATURE_NONE},
- {{"bonaire"}, {"gfx704"}, GK_GFX704, FEATURE_NONE},
- {{"gfx705"}, {"gfx705"}, GK_GFX705, FEATURE_NONE},
- {{"gfx801"}, {"gfx801"}, GK_GFX801, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
- {{"carrizo"}, {"gfx801"}, GK_GFX801, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
- {{"gfx802"}, {"gfx802"}, GK_GFX802, FEATURE_FAST_DENORMAL_F32},
- {{"iceland"}, {"gfx802"}, GK_GFX802, FEATURE_FAST_DENORMAL_F32},
- {{"tonga"}, {"gfx802"}, GK_GFX802, FEATURE_FAST_DENORMAL_F32},
- {{"gfx803"}, {"gfx803"}, GK_GFX803, FEATURE_FAST_DENORMAL_F32},
- {{"fiji"}, {"gfx803"}, GK_GFX803, FEATURE_FAST_DENORMAL_F32},
- {{"polaris10"}, {"gfx803"}, GK_GFX803, FEATURE_FAST_DENORMAL_F32},
- {{"polaris11"}, {"gfx803"}, GK_GFX803, FEATURE_FAST_DENORMAL_F32},
- {{"gfx805"}, {"gfx805"}, GK_GFX805, FEATURE_FAST_DENORMAL_F32},
- {{"tongapro"}, {"gfx805"}, GK_GFX805, FEATURE_FAST_DENORMAL_F32},
- {{"gfx810"}, {"gfx810"}, GK_GFX810, FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
- {{"stoney"}, {"gfx810"}, GK_GFX810, FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
- {{"gfx900"}, {"gfx900"}, GK_GFX900, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
- {{"gfx902"}, {"gfx902"}, GK_GFX902, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
- {{"gfx904"}, {"gfx904"}, GK_GFX904, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
- {{"gfx906"}, {"gfx906"}, GK_GFX906, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
- {{"gfx908"}, {"gfx908"}, GK_GFX908, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
- {{"gfx909"}, {"gfx909"}, GK_GFX909, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
- {{"gfx90a"}, {"gfx90a"}, GK_GFX90A, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
- {{"gfx90c"}, {"gfx90c"}, GK_GFX90C, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
- {{"gfx942"}, {"gfx942"}, GK_GFX942, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
- {{"gfx950"}, {"gfx950"}, GK_GFX950, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
- {{"gfx1010"}, {"gfx1010"}, GK_GFX1010, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
- {{"gfx1011"}, {"gfx1011"}, GK_GFX1011, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
- {{"gfx1012"}, {"gfx1012"}, GK_GFX1012, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
- {{"gfx1013"}, {"gfx1013"}, GK_GFX1013, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
- {{"gfx1030"}, {"gfx1030"}, GK_GFX1030, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
- {{"gfx1031"}, {"gfx1031"}, GK_GFX1031, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
- {{"gfx1032"}, {"gfx1032"}, GK_GFX1032, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
- {{"gfx1033"}, {"gfx1033"}, GK_GFX1033, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
- {{"gfx1034"}, {"gfx1034"}, GK_GFX1034, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
- {{"gfx1035"}, {"gfx1035"}, GK_GFX1035, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
- {{"gfx1036"}, {"gfx1036"}, GK_GFX1036, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
- {{"gfx1100"}, {"gfx1100"}, GK_GFX1100, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
- {{"gfx1101"}, {"gfx1101"}, GK_GFX1101, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
- {{"gfx1102"}, {"gfx1102"}, GK_GFX1102, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
- {{"gfx1103"}, {"gfx1103"}, GK_GFX1103, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
- {{"gfx1150"}, {"gfx1150"}, GK_GFX1150, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
- {{"gfx1151"}, {"gfx1151"}, GK_GFX1151, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
- {{"gfx1152"}, {"gfx1152"}, GK_GFX1152, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
- {{"gfx1153"}, {"gfx1153"}, GK_GFX1153, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
- {{"gfx1170"}, {"gfx1170"}, GK_GFX1170, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
- {{"gfx1200"}, {"gfx1200"}, GK_GFX1200, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
- {{"gfx1201"}, {"gfx1201"}, GK_GFX1201, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
- {{"gfx1250"}, {"gfx1250"}, GK_GFX1250, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK_ALWAYS},
- {{"gfx1251"}, {"gfx1251"}, GK_GFX1251, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK_ALWAYS},
- {{"gfx1310"}, {"gfx1310"}, GK_GFX1310, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
-
- {{"gfx9-generic"}, {"gfx9-generic"}, GK_GFX9_GENERIC, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},
- {{"gfx10-1-generic"}, {"gfx10-1-generic"}, GK_GFX10_1_GENERIC, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},
- {{"gfx10-3-generic"}, {"gfx10-3-generic"}, GK_GFX10_3_GENERIC, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
- {{"gfx11-generic"}, {"gfx11-generic"}, GK_GFX11_GENERIC, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
- {{"gfx12-generic"}, {"gfx12-generic"}, GK_GFX12_GENERIC, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},
- {{"gfx9-4-generic"}, {"gfx9-4-generic"}, GK_GFX9_4_GENERIC, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},
- {{"gfx12-5-generic"}, {"gfx12-5-generic"}, GK_GFX12_5_GENERIC, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32},
- // clang-format on
-};
-
-const GPUInfo *getArchEntry(AMDGPU::GPUKind AK, ArrayRef<GPUInfo> Table) {
- GPUInfo Search = { {""}, {""}, AK, AMDGPU::FEATURE_NONE };
-
- auto I =
- llvm::lower_bound(Table, Search, [](const GPUInfo &A, const GPUInfo &B) {
- return A.Kind < B.Kind;
- });
-
- if (I == Table.end() || I->Kind != Search.Kind)
- return nullptr;
- return I;
-}
-
-} // namespace
-
StringRef llvm::AMDGPU::getArchFamilyNameAMDGCN(GPUKind AK) {
switch (AK) {
case AMDGPU::GK_GFX9_GENERIC:
@@ -225,56 +87,80 @@ StringRef llvm::AMDGPU::getArchFamilyNameAMDGCN(GPUKind AK) {
}
StringRef llvm::AMDGPU::getArchNameAMDGCN(GPUKind AK) {
- if (const auto *Entry = getArchEntry(AK, AMDGCNGPUs))
- return Entry->CanonicalName;
- return "";
+ switch (AK) {
+#define AMDGCN_GPU(NAME, ENUM, ISAVERSION, FEATURES) \
+ case ENUM: \
+ return NAME;
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+ default:
+ return "";
+ }
}
StringRef llvm::AMDGPU::getArchNameR600(GPUKind AK) {
- if (const auto *Entry = getArchEntry(AK, R600GPUs))
- return Entry->CanonicalName;
- return "";
+ switch (AK) {
+#define R600_GPU(NAME, ENUM, FEATURES) \
+ case ENUM: \
+ return NAME;
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+ default:
+ return "";
+ }
}
AMDGPU::GPUKind llvm::AMDGPU::parseArchAMDGCN(StringRef CPU) {
- for (const auto &C : AMDGCNGPUs) {
- if (CPU == C.Name)
- return C.Kind;
- }
-
- return AMDGPU::GPUKind::GK_NONE;
+ return StringSwitch<AMDGPU::GPUKind>(CPU)
+#define AMDGCN_GPU(NAME, ENUM, ISAVERSION, FEATURES) .Case(NAME, ENUM)
+#define AMDGCN_GPU_ALIAS(NAME, ENUM) .Case(NAME, ENUM)
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+ .Default(AMDGPU::GPUKind::GK_NONE);
}
AMDGPU::GPUKind llvm::AMDGPU::parseArchR600(StringRef CPU) {
- for (const auto &C : R600GPUs) {
- if (CPU == C.Name)
- return C.Kind;
- }
-
- return AMDGPU::GPUKind::GK_NONE;
+ return StringSwitch<AMDGPU::GPUKind>(CPU)
+#define R600_GPU(NAME, ENUM, FEATURES) .Case(NAME, ENUM)
+#define R600_GPU_ALIAS(NAME, ENUM) .Case(NAME, ENUM)
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+ .Default(AMDGPU::GPUKind::GK_NONE);
}
unsigned AMDGPU::getArchAttrAMDGCN(GPUKind AK) {
- if (const auto *Entry = getArchEntry(AK, AMDGCNGPUs))
- return Entry->Features;
- return FEATURE_NONE;
+ switch (AK) {
+#define AMDGCN_GPU(NAME, ENUM, ISAVERSION, FEATURES) \
+ case ENUM: \
+ return FEATURES;
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+ default:
+ return FEATURE_NONE;
+ }
}
unsigned AMDGPU::getArchAttrR600(GPUKind AK) {
- if (const auto *Entry = getArchEntry(AK, R600GPUs))
- return Entry->Features;
- return FEATURE_NONE;
+ switch (AK) {
+#define R600_GPU(NAME, ENUM, FEATURES) \
+ case ENUM: \
+ return FEATURES;
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+ default:
+ return FEATURE_NONE;
+ }
}
void AMDGPU::fillValidArchListAMDGCN(SmallVectorImpl<StringRef> &Values) {
// XXX: Should this only report unique canonical names?
- for (const auto &C : AMDGCNGPUs)
- Values.push_back(C.Name);
+ Values.append({
+#define AMDGCN_GPU(NAME, ENUM, ISAVERSION, FEATURES) NAME,
+#define AMDGCN_GPU_ALIAS(NAME, ENUM) NAME,
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+ });
}
void AMDGPU::fillValidArchListR600(SmallVectorImpl<StringRef> &Values) {
- for (const auto &C : R600GPUs)
- Values.push_back(C.Name);
+ Values.append({
+#define R600_GPU(NAME, ENUM, FEATURES) NAME,
+#define R600_GPU_ALIAS(NAME, ENUM) NAME,
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+ });
}
AMDGPU::IsaVersion AMDGPU::getIsaVersion(StringRef GPU) {
@@ -287,81 +173,16 @@ AMDGPU::IsaVersion AMDGPU::getIsaVersion(StringRef GPU) {
return {0, 0, 0};
}
- // clang-format off
switch (AK) {
- case GK_GFX600: return {6, 0, 0};
- case GK_GFX601: return {6, 0, 1};
- case GK_GFX602: return {6, 0, 2};
- case GK_GFX700: return {7, 0, 0};
- case GK_GFX701: return {7, 0, 1};
- case GK_GFX702: return {7, 0, 2};
- case GK_GFX703: return {7, 0, 3};
- case GK_GFX704: return {7, 0, 4};
- case GK_GFX705: return {7, 0, 5};
- case GK_GFX801: return {8, 0, 1};
- case GK_GFX802: return {8, 0, 2};
- case GK_GFX803: return {8, 0, 3};
- case GK_GFX805: return {8, 0, 5};
- case GK_GFX810: return {8, 1, 0};
- case GK_GFX900: return {9, 0, 0};
- case GK_GFX902: return {9, 0, 2};
- case GK_GFX904: return {9, 0, 4};
- case GK_GFX906: return {9, 0, 6};
- case GK_GFX908: return {9, 0, 8};
- case GK_GFX909: return {9, 0, 9};
- case GK_GFX90A: return {9, 0, 10};
- case GK_GFX90C: return {9, 0, 12};
- case GK_GFX942: return {9, 4, 2};
- case GK_GFX950: return {9, 5, 0};
- case GK_GFX1010: return {10, 1, 0};
- case GK_GFX1011: return {10, 1, 1};
- case GK_GFX1012: return {10, 1, 2};
- case GK_GFX1013: return {10, 1, 3};
- case GK_GFX1030: return {10, 3, 0};
- case GK_GFX1031: return {10, 3, 1};
- case GK_GFX1032: return {10, 3, 2};
- case GK_GFX1033: return {10, 3, 3};
- case GK_GFX1034: return {10, 3, 4};
- case GK_GFX1035: return {10, 3, 5};
- case GK_GFX1036: return {10, 3, 6};
- case GK_GFX1100: return {11, 0, 0};
- case GK_GFX1101: return {11, 0, 1};
- case GK_GFX1102: return {11, 0, 2};
- case GK_GFX1103: return {11, 0, 3};
- case GK_GFX1150: return {11, 5, 0};
- case GK_GFX1151: return {11, 5, 1};
- case GK_GFX1152: return {11, 5, 2};
- case GK_GFX1153: return {11, 5, 3};
- case GK_GFX1170: return {11, 7, 0};
- case GK_GFX1200: return {12, 0, 0};
- case GK_GFX1201: return {12, 0, 1};
- case GK_GFX1250: return {12, 5, 0};
- case GK_GFX1251: return {12, 5, 1};
- case GK_GFX1310: return {13, 1, 0};
-
- // Generic targets return the lowest common denominator
- // within their family. That is, the ISA that is the most
- // restricted in terms of features.
- //
- // gfx9-generic is tricky because there is no lowest
- // common denominator, so we return gfx900 which has mad-mix
- // but this family doesn't have it.
- //
- // This API should never be used to check for a particular
- // feature anyway.
- //
- // TODO: Split up this API depending on its caller so
- // generic target handling is more obvious and less risky.
- case GK_GFX9_GENERIC: return {9, 0, 0};
- case GK_GFX9_4_GENERIC: return {9, 4, 0};
- case GK_GFX10_1_GENERIC: return {10, 1, 0};
- case GK_GFX10_3_GENERIC: return {10, 3, 0};
- case GK_GFX11_GENERIC: return {11, 0, 3};
- case GK_GFX12_GENERIC: return {12, 0, 0};
- case GK_GFX12_5_GENERIC: return {12, 5, 0};
- default: return {0, 0, 0};
+#define MAKE_ISAVERSION(A, B, C) {A, B, C}
+#define AMDGCN_GPU(NAME, ENUM, ISAVERSION, FEATURES) \
+ case ENUM: \
+ return MAKE_ISAVERSION ISAVERSION;
+#include "llvm/TargetParser/AMDGPUTargetParser.def"
+#undef MAKE_ISAVERSION
+ default:
+ return {0, 0, 0};
}
- // clang-format on
}
StringRef AMDGPU::getCanonicalArchName(const Triple &T, StringRef Arch) {
More information about the llvm-commits
mailing list