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