1bdd1243dSDimitry Andric //===-- TargetParser - Parser for target features ---------------*- C++ -*-===// 2bdd1243dSDimitry Andric // 3bdd1243dSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4bdd1243dSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5bdd1243dSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6bdd1243dSDimitry Andric // 7bdd1243dSDimitry Andric //===----------------------------------------------------------------------===// 8bdd1243dSDimitry Andric // 9bdd1243dSDimitry Andric // This file implements a target parser to recognise hardware features such as 10bdd1243dSDimitry Andric // FPU/CPU/ARCH names as well as specific support such as HDIV, etc. 11bdd1243dSDimitry Andric // 12bdd1243dSDimitry Andric //===----------------------------------------------------------------------===// 13bdd1243dSDimitry Andric 14bdd1243dSDimitry Andric #include "llvm/TargetParser/TargetParser.h" 15bdd1243dSDimitry Andric #include "llvm/ADT/ArrayRef.h" 16bdd1243dSDimitry Andric #include "llvm/TargetParser/Triple.h" 17bdd1243dSDimitry Andric 18bdd1243dSDimitry Andric using namespace llvm; 19bdd1243dSDimitry Andric using namespace AMDGPU; 20bdd1243dSDimitry Andric 21bdd1243dSDimitry Andric namespace { 22bdd1243dSDimitry Andric 23bdd1243dSDimitry Andric struct GPUInfo { 24bdd1243dSDimitry Andric StringLiteral Name; 25bdd1243dSDimitry Andric StringLiteral CanonicalName; 26bdd1243dSDimitry Andric AMDGPU::GPUKind Kind; 27bdd1243dSDimitry Andric unsigned Features; 28bdd1243dSDimitry Andric }; 29bdd1243dSDimitry Andric 30bdd1243dSDimitry Andric constexpr GPUInfo R600GPUs[] = { 31bdd1243dSDimitry Andric // Name Canonical Kind Features 32bdd1243dSDimitry Andric // Name 33bdd1243dSDimitry Andric {{"r600"}, {"r600"}, GK_R600, FEATURE_NONE }, 34bdd1243dSDimitry Andric {{"rv630"}, {"r600"}, GK_R600, FEATURE_NONE }, 35bdd1243dSDimitry Andric {{"rv635"}, {"r600"}, GK_R600, FEATURE_NONE }, 36bdd1243dSDimitry Andric {{"r630"}, {"r630"}, GK_R630, FEATURE_NONE }, 37bdd1243dSDimitry Andric {{"rs780"}, {"rs880"}, GK_RS880, FEATURE_NONE }, 38bdd1243dSDimitry Andric {{"rs880"}, {"rs880"}, GK_RS880, FEATURE_NONE }, 39bdd1243dSDimitry Andric {{"rv610"}, {"rs880"}, GK_RS880, FEATURE_NONE }, 40bdd1243dSDimitry Andric {{"rv620"}, {"rs880"}, GK_RS880, FEATURE_NONE }, 41bdd1243dSDimitry Andric {{"rv670"}, {"rv670"}, GK_RV670, FEATURE_NONE }, 42bdd1243dSDimitry Andric {{"rv710"}, {"rv710"}, GK_RV710, FEATURE_NONE }, 43bdd1243dSDimitry Andric {{"rv730"}, {"rv730"}, GK_RV730, FEATURE_NONE }, 44bdd1243dSDimitry Andric {{"rv740"}, {"rv770"}, GK_RV770, FEATURE_NONE }, 45bdd1243dSDimitry Andric {{"rv770"}, {"rv770"}, GK_RV770, FEATURE_NONE }, 46bdd1243dSDimitry Andric {{"cedar"}, {"cedar"}, GK_CEDAR, FEATURE_NONE }, 47bdd1243dSDimitry Andric {{"palm"}, {"cedar"}, GK_CEDAR, FEATURE_NONE }, 48bdd1243dSDimitry Andric {{"cypress"}, {"cypress"}, GK_CYPRESS, FEATURE_FMA }, 49bdd1243dSDimitry Andric {{"hemlock"}, {"cypress"}, GK_CYPRESS, FEATURE_FMA }, 50bdd1243dSDimitry Andric {{"juniper"}, {"juniper"}, GK_JUNIPER, FEATURE_NONE }, 51bdd1243dSDimitry Andric {{"redwood"}, {"redwood"}, GK_REDWOOD, FEATURE_NONE }, 52bdd1243dSDimitry Andric {{"sumo"}, {"sumo"}, GK_SUMO, FEATURE_NONE }, 53bdd1243dSDimitry Andric {{"sumo2"}, {"sumo"}, GK_SUMO, FEATURE_NONE }, 54bdd1243dSDimitry Andric {{"barts"}, {"barts"}, GK_BARTS, FEATURE_NONE }, 55bdd1243dSDimitry Andric {{"caicos"}, {"caicos"}, GK_CAICOS, FEATURE_NONE }, 56bdd1243dSDimitry Andric {{"aruba"}, {"cayman"}, GK_CAYMAN, FEATURE_FMA }, 57bdd1243dSDimitry Andric {{"cayman"}, {"cayman"}, GK_CAYMAN, FEATURE_FMA }, 58bdd1243dSDimitry Andric {{"turks"}, {"turks"}, GK_TURKS, FEATURE_NONE } 59bdd1243dSDimitry Andric }; 60bdd1243dSDimitry Andric 61bdd1243dSDimitry Andric // This table should be sorted by the value of GPUKind 62bdd1243dSDimitry Andric // Don't bother listing the implicitly true features 63bdd1243dSDimitry Andric constexpr GPUInfo AMDGCNGPUs[] = { 64*5f757f3fSDimitry Andric // clang-format off 65bdd1243dSDimitry Andric // Name Canonical Kind Features 66bdd1243dSDimitry Andric // Name 67bdd1243dSDimitry Andric {{"gfx600"}, {"gfx600"}, GK_GFX600, FEATURE_FAST_FMA_F32}, 68bdd1243dSDimitry Andric {{"tahiti"}, {"gfx600"}, GK_GFX600, FEATURE_FAST_FMA_F32}, 69bdd1243dSDimitry Andric {{"gfx601"}, {"gfx601"}, GK_GFX601, FEATURE_NONE}, 70bdd1243dSDimitry Andric {{"pitcairn"}, {"gfx601"}, GK_GFX601, FEATURE_NONE}, 71bdd1243dSDimitry Andric {{"verde"}, {"gfx601"}, GK_GFX601, FEATURE_NONE}, 72bdd1243dSDimitry Andric {{"gfx602"}, {"gfx602"}, GK_GFX602, FEATURE_NONE}, 73bdd1243dSDimitry Andric {{"hainan"}, {"gfx602"}, GK_GFX602, FEATURE_NONE}, 74bdd1243dSDimitry Andric {{"oland"}, {"gfx602"}, GK_GFX602, FEATURE_NONE}, 75bdd1243dSDimitry Andric {{"gfx700"}, {"gfx700"}, GK_GFX700, FEATURE_NONE}, 76bdd1243dSDimitry Andric {{"kaveri"}, {"gfx700"}, GK_GFX700, FEATURE_NONE}, 77bdd1243dSDimitry Andric {{"gfx701"}, {"gfx701"}, GK_GFX701, FEATURE_FAST_FMA_F32}, 78bdd1243dSDimitry Andric {{"hawaii"}, {"gfx701"}, GK_GFX701, FEATURE_FAST_FMA_F32}, 79bdd1243dSDimitry Andric {{"gfx702"}, {"gfx702"}, GK_GFX702, FEATURE_FAST_FMA_F32}, 80bdd1243dSDimitry Andric {{"gfx703"}, {"gfx703"}, GK_GFX703, FEATURE_NONE}, 81bdd1243dSDimitry Andric {{"kabini"}, {"gfx703"}, GK_GFX703, FEATURE_NONE}, 82bdd1243dSDimitry Andric {{"mullins"}, {"gfx703"}, GK_GFX703, FEATURE_NONE}, 83bdd1243dSDimitry Andric {{"gfx704"}, {"gfx704"}, GK_GFX704, FEATURE_NONE}, 84bdd1243dSDimitry Andric {{"bonaire"}, {"gfx704"}, GK_GFX704, FEATURE_NONE}, 85bdd1243dSDimitry Andric {{"gfx705"}, {"gfx705"}, GK_GFX705, FEATURE_NONE}, 86bdd1243dSDimitry Andric {{"gfx801"}, {"gfx801"}, GK_GFX801, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK}, 87bdd1243dSDimitry Andric {{"carrizo"}, {"gfx801"}, GK_GFX801, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK}, 88bdd1243dSDimitry Andric {{"gfx802"}, {"gfx802"}, GK_GFX802, FEATURE_FAST_DENORMAL_F32}, 89bdd1243dSDimitry Andric {{"iceland"}, {"gfx802"}, GK_GFX802, FEATURE_FAST_DENORMAL_F32}, 90bdd1243dSDimitry Andric {{"tonga"}, {"gfx802"}, GK_GFX802, FEATURE_FAST_DENORMAL_F32}, 91bdd1243dSDimitry Andric {{"gfx803"}, {"gfx803"}, GK_GFX803, FEATURE_FAST_DENORMAL_F32}, 92bdd1243dSDimitry Andric {{"fiji"}, {"gfx803"}, GK_GFX803, FEATURE_FAST_DENORMAL_F32}, 93bdd1243dSDimitry Andric {{"polaris10"}, {"gfx803"}, GK_GFX803, FEATURE_FAST_DENORMAL_F32}, 94bdd1243dSDimitry Andric {{"polaris11"}, {"gfx803"}, GK_GFX803, FEATURE_FAST_DENORMAL_F32}, 95bdd1243dSDimitry Andric {{"gfx805"}, {"gfx805"}, GK_GFX805, FEATURE_FAST_DENORMAL_F32}, 96bdd1243dSDimitry Andric {{"tongapro"}, {"gfx805"}, GK_GFX805, FEATURE_FAST_DENORMAL_F32}, 97bdd1243dSDimitry Andric {{"gfx810"}, {"gfx810"}, GK_GFX810, FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK}, 98bdd1243dSDimitry Andric {{"stoney"}, {"gfx810"}, GK_GFX810, FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK}, 99bdd1243dSDimitry Andric {{"gfx900"}, {"gfx900"}, GK_GFX900, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK}, 100bdd1243dSDimitry Andric {{"gfx902"}, {"gfx902"}, GK_GFX902, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK}, 101bdd1243dSDimitry Andric {{"gfx904"}, {"gfx904"}, GK_GFX904, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK}, 102bdd1243dSDimitry Andric {{"gfx906"}, {"gfx906"}, GK_GFX906, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC}, 103bdd1243dSDimitry Andric {{"gfx908"}, {"gfx908"}, GK_GFX908, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC}, 104bdd1243dSDimitry Andric {{"gfx909"}, {"gfx909"}, GK_GFX909, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK}, 105bdd1243dSDimitry Andric {{"gfx90a"}, {"gfx90a"}, GK_GFX90A, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC}, 106bdd1243dSDimitry Andric {{"gfx90c"}, {"gfx90c"}, GK_GFX90C, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK}, 107bdd1243dSDimitry Andric {{"gfx940"}, {"gfx940"}, GK_GFX940, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC}, 10806c3fb27SDimitry Andric {{"gfx941"}, {"gfx941"}, GK_GFX941, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC}, 10906c3fb27SDimitry Andric {{"gfx942"}, {"gfx942"}, GK_GFX942, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC}, 11006c3fb27SDimitry Andric {{"gfx1010"}, {"gfx1010"}, GK_GFX1010, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP}, 11106c3fb27SDimitry Andric {{"gfx1011"}, {"gfx1011"}, GK_GFX1011, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP}, 11206c3fb27SDimitry Andric {{"gfx1012"}, {"gfx1012"}, GK_GFX1012, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP}, 11306c3fb27SDimitry Andric {{"gfx1013"}, {"gfx1013"}, GK_GFX1013, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP}, 11406c3fb27SDimitry Andric {{"gfx1030"}, {"gfx1030"}, GK_GFX1030, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 11506c3fb27SDimitry Andric {{"gfx1031"}, {"gfx1031"}, GK_GFX1031, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 11606c3fb27SDimitry Andric {{"gfx1032"}, {"gfx1032"}, GK_GFX1032, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 11706c3fb27SDimitry Andric {{"gfx1033"}, {"gfx1033"}, GK_GFX1033, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 11806c3fb27SDimitry Andric {{"gfx1034"}, {"gfx1034"}, GK_GFX1034, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 11906c3fb27SDimitry Andric {{"gfx1035"}, {"gfx1035"}, GK_GFX1035, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 12006c3fb27SDimitry Andric {{"gfx1036"}, {"gfx1036"}, GK_GFX1036, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 12106c3fb27SDimitry Andric {{"gfx1100"}, {"gfx1100"}, GK_GFX1100, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 12206c3fb27SDimitry Andric {{"gfx1101"}, {"gfx1101"}, GK_GFX1101, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 12306c3fb27SDimitry Andric {{"gfx1102"}, {"gfx1102"}, GK_GFX1102, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 12406c3fb27SDimitry Andric {{"gfx1103"}, {"gfx1103"}, GK_GFX1103, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 12506c3fb27SDimitry Andric {{"gfx1150"}, {"gfx1150"}, GK_GFX1150, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 12606c3fb27SDimitry Andric {{"gfx1151"}, {"gfx1151"}, GK_GFX1151, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 127*5f757f3fSDimitry Andric {{"gfx1200"}, {"gfx1200"}, GK_GFX1200, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 128*5f757f3fSDimitry Andric {{"gfx1201"}, {"gfx1201"}, GK_GFX1201, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 129*5f757f3fSDimitry Andric // clang-format on 130bdd1243dSDimitry Andric }; 131bdd1243dSDimitry Andric 132bdd1243dSDimitry Andric const GPUInfo *getArchEntry(AMDGPU::GPUKind AK, ArrayRef<GPUInfo> Table) { 133bdd1243dSDimitry Andric GPUInfo Search = { {""}, {""}, AK, AMDGPU::FEATURE_NONE }; 134bdd1243dSDimitry Andric 135bdd1243dSDimitry Andric auto I = 136bdd1243dSDimitry Andric llvm::lower_bound(Table, Search, [](const GPUInfo &A, const GPUInfo &B) { 137bdd1243dSDimitry Andric return A.Kind < B.Kind; 138bdd1243dSDimitry Andric }); 139bdd1243dSDimitry Andric 140*5f757f3fSDimitry Andric if (I == Table.end() || I->Kind != Search.Kind) 141bdd1243dSDimitry Andric return nullptr; 142bdd1243dSDimitry Andric return I; 143bdd1243dSDimitry Andric } 144bdd1243dSDimitry Andric 145bdd1243dSDimitry Andric } // namespace 146bdd1243dSDimitry Andric 147bdd1243dSDimitry Andric StringRef llvm::AMDGPU::getArchNameAMDGCN(GPUKind AK) { 148bdd1243dSDimitry Andric if (const auto *Entry = getArchEntry(AK, AMDGCNGPUs)) 149bdd1243dSDimitry Andric return Entry->CanonicalName; 150bdd1243dSDimitry Andric return ""; 151bdd1243dSDimitry Andric } 152bdd1243dSDimitry Andric 153bdd1243dSDimitry Andric StringRef llvm::AMDGPU::getArchNameR600(GPUKind AK) { 154bdd1243dSDimitry Andric if (const auto *Entry = getArchEntry(AK, R600GPUs)) 155bdd1243dSDimitry Andric return Entry->CanonicalName; 156bdd1243dSDimitry Andric return ""; 157bdd1243dSDimitry Andric } 158bdd1243dSDimitry Andric 159bdd1243dSDimitry Andric AMDGPU::GPUKind llvm::AMDGPU::parseArchAMDGCN(StringRef CPU) { 160bdd1243dSDimitry Andric for (const auto &C : AMDGCNGPUs) { 161bdd1243dSDimitry Andric if (CPU == C.Name) 162bdd1243dSDimitry Andric return C.Kind; 163bdd1243dSDimitry Andric } 164bdd1243dSDimitry Andric 165bdd1243dSDimitry Andric return AMDGPU::GPUKind::GK_NONE; 166bdd1243dSDimitry Andric } 167bdd1243dSDimitry Andric 168bdd1243dSDimitry Andric AMDGPU::GPUKind llvm::AMDGPU::parseArchR600(StringRef CPU) { 169bdd1243dSDimitry Andric for (const auto &C : R600GPUs) { 170bdd1243dSDimitry Andric if (CPU == C.Name) 171bdd1243dSDimitry Andric return C.Kind; 172bdd1243dSDimitry Andric } 173bdd1243dSDimitry Andric 174bdd1243dSDimitry Andric return AMDGPU::GPUKind::GK_NONE; 175bdd1243dSDimitry Andric } 176bdd1243dSDimitry Andric 177bdd1243dSDimitry Andric unsigned AMDGPU::getArchAttrAMDGCN(GPUKind AK) { 178bdd1243dSDimitry Andric if (const auto *Entry = getArchEntry(AK, AMDGCNGPUs)) 179bdd1243dSDimitry Andric return Entry->Features; 180bdd1243dSDimitry Andric return FEATURE_NONE; 181bdd1243dSDimitry Andric } 182bdd1243dSDimitry Andric 183bdd1243dSDimitry Andric unsigned AMDGPU::getArchAttrR600(GPUKind AK) { 184bdd1243dSDimitry Andric if (const auto *Entry = getArchEntry(AK, R600GPUs)) 185bdd1243dSDimitry Andric return Entry->Features; 186bdd1243dSDimitry Andric return FEATURE_NONE; 187bdd1243dSDimitry Andric } 188bdd1243dSDimitry Andric 189bdd1243dSDimitry Andric void AMDGPU::fillValidArchListAMDGCN(SmallVectorImpl<StringRef> &Values) { 190bdd1243dSDimitry Andric // XXX: Should this only report unique canonical names? 191bdd1243dSDimitry Andric for (const auto &C : AMDGCNGPUs) 192bdd1243dSDimitry Andric Values.push_back(C.Name); 193bdd1243dSDimitry Andric } 194bdd1243dSDimitry Andric 195bdd1243dSDimitry Andric void AMDGPU::fillValidArchListR600(SmallVectorImpl<StringRef> &Values) { 196bdd1243dSDimitry Andric for (const auto &C : R600GPUs) 197bdd1243dSDimitry Andric Values.push_back(C.Name); 198bdd1243dSDimitry Andric } 199bdd1243dSDimitry Andric 200bdd1243dSDimitry Andric AMDGPU::IsaVersion AMDGPU::getIsaVersion(StringRef GPU) { 201bdd1243dSDimitry Andric AMDGPU::GPUKind AK = parseArchAMDGCN(GPU); 202bdd1243dSDimitry Andric if (AK == AMDGPU::GPUKind::GK_NONE) { 203bdd1243dSDimitry Andric if (GPU == "generic-hsa") 204bdd1243dSDimitry Andric return {7, 0, 0}; 205bdd1243dSDimitry Andric if (GPU == "generic") 206bdd1243dSDimitry Andric return {6, 0, 0}; 207bdd1243dSDimitry Andric return {0, 0, 0}; 208bdd1243dSDimitry Andric } 209bdd1243dSDimitry Andric 210*5f757f3fSDimitry Andric // clang-format off 211bdd1243dSDimitry Andric switch (AK) { 212bdd1243dSDimitry Andric case GK_GFX600: return {6, 0, 0}; 213bdd1243dSDimitry Andric case GK_GFX601: return {6, 0, 1}; 214bdd1243dSDimitry Andric case GK_GFX602: return {6, 0, 2}; 215bdd1243dSDimitry Andric case GK_GFX700: return {7, 0, 0}; 216bdd1243dSDimitry Andric case GK_GFX701: return {7, 0, 1}; 217bdd1243dSDimitry Andric case GK_GFX702: return {7, 0, 2}; 218bdd1243dSDimitry Andric case GK_GFX703: return {7, 0, 3}; 219bdd1243dSDimitry Andric case GK_GFX704: return {7, 0, 4}; 220bdd1243dSDimitry Andric case GK_GFX705: return {7, 0, 5}; 221bdd1243dSDimitry Andric case GK_GFX801: return {8, 0, 1}; 222bdd1243dSDimitry Andric case GK_GFX802: return {8, 0, 2}; 223bdd1243dSDimitry Andric case GK_GFX803: return {8, 0, 3}; 224bdd1243dSDimitry Andric case GK_GFX805: return {8, 0, 5}; 225bdd1243dSDimitry Andric case GK_GFX810: return {8, 1, 0}; 226bdd1243dSDimitry Andric case GK_GFX900: return {9, 0, 0}; 227bdd1243dSDimitry Andric case GK_GFX902: return {9, 0, 2}; 228bdd1243dSDimitry Andric case GK_GFX904: return {9, 0, 4}; 229bdd1243dSDimitry Andric case GK_GFX906: return {9, 0, 6}; 230bdd1243dSDimitry Andric case GK_GFX908: return {9, 0, 8}; 231bdd1243dSDimitry Andric case GK_GFX909: return {9, 0, 9}; 232bdd1243dSDimitry Andric case GK_GFX90A: return {9, 0, 10}; 233bdd1243dSDimitry Andric case GK_GFX90C: return {9, 0, 12}; 234bdd1243dSDimitry Andric case GK_GFX940: return {9, 4, 0}; 23506c3fb27SDimitry Andric case GK_GFX941: return {9, 4, 1}; 23606c3fb27SDimitry Andric case GK_GFX942: return {9, 4, 2}; 237bdd1243dSDimitry Andric case GK_GFX1010: return {10, 1, 0}; 238bdd1243dSDimitry Andric case GK_GFX1011: return {10, 1, 1}; 239bdd1243dSDimitry Andric case GK_GFX1012: return {10, 1, 2}; 240bdd1243dSDimitry Andric case GK_GFX1013: return {10, 1, 3}; 241bdd1243dSDimitry Andric case GK_GFX1030: return {10, 3, 0}; 242bdd1243dSDimitry Andric case GK_GFX1031: return {10, 3, 1}; 243bdd1243dSDimitry Andric case GK_GFX1032: return {10, 3, 2}; 244bdd1243dSDimitry Andric case GK_GFX1033: return {10, 3, 3}; 245bdd1243dSDimitry Andric case GK_GFX1034: return {10, 3, 4}; 246bdd1243dSDimitry Andric case GK_GFX1035: return {10, 3, 5}; 247bdd1243dSDimitry Andric case GK_GFX1036: return {10, 3, 6}; 248bdd1243dSDimitry Andric case GK_GFX1100: return {11, 0, 0}; 249bdd1243dSDimitry Andric case GK_GFX1101: return {11, 0, 1}; 250bdd1243dSDimitry Andric case GK_GFX1102: return {11, 0, 2}; 251bdd1243dSDimitry Andric case GK_GFX1103: return {11, 0, 3}; 25206c3fb27SDimitry Andric case GK_GFX1150: return {11, 5, 0}; 25306c3fb27SDimitry Andric case GK_GFX1151: return {11, 5, 1}; 254*5f757f3fSDimitry Andric case GK_GFX1200: return {12, 0, 0}; 255*5f757f3fSDimitry Andric case GK_GFX1201: return {12, 0, 1}; 256bdd1243dSDimitry Andric default: return {0, 0, 0}; 257bdd1243dSDimitry Andric } 258*5f757f3fSDimitry Andric // clang-format on 259bdd1243dSDimitry Andric } 260bdd1243dSDimitry Andric 261bdd1243dSDimitry Andric StringRef AMDGPU::getCanonicalArchName(const Triple &T, StringRef Arch) { 262bdd1243dSDimitry Andric assert(T.isAMDGPU()); 263bdd1243dSDimitry Andric auto ProcKind = T.isAMDGCN() ? parseArchAMDGCN(Arch) : parseArchR600(Arch); 264bdd1243dSDimitry Andric if (ProcKind == GK_NONE) 265bdd1243dSDimitry Andric return StringRef(); 266bdd1243dSDimitry Andric 267bdd1243dSDimitry Andric return T.isAMDGCN() ? getArchNameAMDGCN(ProcKind) : getArchNameR600(ProcKind); 268bdd1243dSDimitry Andric } 26906c3fb27SDimitry Andric 27006c3fb27SDimitry Andric void AMDGPU::fillAMDGPUFeatureMap(StringRef GPU, const Triple &T, 27106c3fb27SDimitry Andric StringMap<bool> &Features) { 27206c3fb27SDimitry Andric // XXX - What does the member GPU mean if device name string passed here? 27306c3fb27SDimitry Andric if (T.isAMDGCN()) { 27406c3fb27SDimitry Andric switch (parseArchAMDGCN(GPU)) { 275*5f757f3fSDimitry Andric case GK_GFX1201: 276*5f757f3fSDimitry Andric case GK_GFX1200: 277*5f757f3fSDimitry Andric Features["ci-insts"] = true; 278*5f757f3fSDimitry Andric Features["dot5-insts"] = true; 279*5f757f3fSDimitry Andric Features["dot7-insts"] = true; 280*5f757f3fSDimitry Andric Features["dot8-insts"] = true; 281*5f757f3fSDimitry Andric Features["dot9-insts"] = true; 282*5f757f3fSDimitry Andric Features["dot10-insts"] = true; 283*5f757f3fSDimitry Andric Features["dl-insts"] = true; 284*5f757f3fSDimitry Andric Features["16-bit-insts"] = true; 285*5f757f3fSDimitry Andric Features["dpp"] = true; 286*5f757f3fSDimitry Andric Features["gfx8-insts"] = true; 287*5f757f3fSDimitry Andric Features["gfx9-insts"] = true; 288*5f757f3fSDimitry Andric Features["gfx10-insts"] = true; 289*5f757f3fSDimitry Andric Features["gfx10-3-insts"] = true; 290*5f757f3fSDimitry Andric Features["gfx11-insts"] = true; 291*5f757f3fSDimitry Andric Features["gfx12-insts"] = true; 292*5f757f3fSDimitry Andric Features["atomic-fadd-rtn-insts"] = true; 293*5f757f3fSDimitry Andric Features["image-insts"] = true; 294*5f757f3fSDimitry Andric Features["gws"] = true; 295*5f757f3fSDimitry Andric break; 29606c3fb27SDimitry Andric case GK_GFX1151: 29706c3fb27SDimitry Andric case GK_GFX1150: 29806c3fb27SDimitry Andric case GK_GFX1103: 29906c3fb27SDimitry Andric case GK_GFX1102: 30006c3fb27SDimitry Andric case GK_GFX1101: 30106c3fb27SDimitry Andric case GK_GFX1100: 30206c3fb27SDimitry Andric Features["ci-insts"] = true; 30306c3fb27SDimitry Andric Features["dot5-insts"] = true; 30406c3fb27SDimitry Andric Features["dot7-insts"] = true; 30506c3fb27SDimitry Andric Features["dot8-insts"] = true; 30606c3fb27SDimitry Andric Features["dot9-insts"] = true; 30706c3fb27SDimitry Andric Features["dot10-insts"] = true; 30806c3fb27SDimitry Andric Features["dl-insts"] = true; 30906c3fb27SDimitry Andric Features["16-bit-insts"] = true; 31006c3fb27SDimitry Andric Features["dpp"] = true; 31106c3fb27SDimitry Andric Features["gfx8-insts"] = true; 31206c3fb27SDimitry Andric Features["gfx9-insts"] = true; 31306c3fb27SDimitry Andric Features["gfx10-insts"] = true; 31406c3fb27SDimitry Andric Features["gfx10-3-insts"] = true; 31506c3fb27SDimitry Andric Features["gfx11-insts"] = true; 31606c3fb27SDimitry Andric Features["atomic-fadd-rtn-insts"] = true; 31706c3fb27SDimitry Andric Features["image-insts"] = true; 318*5f757f3fSDimitry Andric Features["gws"] = true; 31906c3fb27SDimitry Andric break; 32006c3fb27SDimitry Andric case GK_GFX1036: 32106c3fb27SDimitry Andric case GK_GFX1035: 32206c3fb27SDimitry Andric case GK_GFX1034: 32306c3fb27SDimitry Andric case GK_GFX1033: 32406c3fb27SDimitry Andric case GK_GFX1032: 32506c3fb27SDimitry Andric case GK_GFX1031: 32606c3fb27SDimitry Andric case GK_GFX1030: 32706c3fb27SDimitry Andric Features["ci-insts"] = true; 32806c3fb27SDimitry Andric Features["dot1-insts"] = true; 32906c3fb27SDimitry Andric Features["dot2-insts"] = true; 33006c3fb27SDimitry Andric Features["dot5-insts"] = true; 33106c3fb27SDimitry Andric Features["dot6-insts"] = true; 33206c3fb27SDimitry Andric Features["dot7-insts"] = true; 33306c3fb27SDimitry Andric Features["dot10-insts"] = true; 33406c3fb27SDimitry Andric Features["dl-insts"] = true; 33506c3fb27SDimitry Andric Features["16-bit-insts"] = true; 33606c3fb27SDimitry Andric Features["dpp"] = true; 33706c3fb27SDimitry Andric Features["gfx8-insts"] = true; 33806c3fb27SDimitry Andric Features["gfx9-insts"] = true; 33906c3fb27SDimitry Andric Features["gfx10-insts"] = true; 34006c3fb27SDimitry Andric Features["gfx10-3-insts"] = true; 34106c3fb27SDimitry Andric Features["image-insts"] = true; 34206c3fb27SDimitry Andric Features["s-memrealtime"] = true; 34306c3fb27SDimitry Andric Features["s-memtime-inst"] = true; 344*5f757f3fSDimitry Andric Features["gws"] = true; 34506c3fb27SDimitry Andric break; 34606c3fb27SDimitry Andric case GK_GFX1012: 34706c3fb27SDimitry Andric case GK_GFX1011: 34806c3fb27SDimitry Andric Features["dot1-insts"] = true; 34906c3fb27SDimitry Andric Features["dot2-insts"] = true; 35006c3fb27SDimitry Andric Features["dot5-insts"] = true; 35106c3fb27SDimitry Andric Features["dot6-insts"] = true; 35206c3fb27SDimitry Andric Features["dot7-insts"] = true; 35306c3fb27SDimitry Andric Features["dot10-insts"] = true; 35406c3fb27SDimitry Andric [[fallthrough]]; 35506c3fb27SDimitry Andric case GK_GFX1013: 35606c3fb27SDimitry Andric case GK_GFX1010: 35706c3fb27SDimitry Andric Features["dl-insts"] = true; 35806c3fb27SDimitry Andric Features["ci-insts"] = true; 35906c3fb27SDimitry Andric Features["16-bit-insts"] = true; 36006c3fb27SDimitry Andric Features["dpp"] = true; 36106c3fb27SDimitry Andric Features["gfx8-insts"] = true; 36206c3fb27SDimitry Andric Features["gfx9-insts"] = true; 36306c3fb27SDimitry Andric Features["gfx10-insts"] = true; 36406c3fb27SDimitry Andric Features["image-insts"] = true; 36506c3fb27SDimitry Andric Features["s-memrealtime"] = true; 36606c3fb27SDimitry Andric Features["s-memtime-inst"] = true; 367*5f757f3fSDimitry Andric Features["gws"] = true; 36806c3fb27SDimitry Andric break; 36906c3fb27SDimitry Andric case GK_GFX942: 37006c3fb27SDimitry Andric case GK_GFX941: 37106c3fb27SDimitry Andric case GK_GFX940: 37206c3fb27SDimitry Andric Features["gfx940-insts"] = true; 37306c3fb27SDimitry Andric Features["fp8-insts"] = true; 37406c3fb27SDimitry Andric Features["atomic-ds-pk-add-16-insts"] = true; 37506c3fb27SDimitry Andric Features["atomic-flat-pk-add-16-insts"] = true; 37606c3fb27SDimitry Andric Features["atomic-global-pk-add-bf16-inst"] = true; 37706c3fb27SDimitry Andric Features["gfx90a-insts"] = true; 37806c3fb27SDimitry Andric Features["atomic-buffer-global-pk-add-f16-insts"] = true; 37906c3fb27SDimitry Andric Features["atomic-fadd-rtn-insts"] = true; 38006c3fb27SDimitry Andric Features["dot3-insts"] = true; 38106c3fb27SDimitry Andric Features["dot4-insts"] = true; 38206c3fb27SDimitry Andric Features["dot5-insts"] = true; 38306c3fb27SDimitry Andric Features["dot6-insts"] = true; 38406c3fb27SDimitry Andric Features["mai-insts"] = true; 38506c3fb27SDimitry Andric Features["dl-insts"] = true; 38606c3fb27SDimitry Andric Features["dot1-insts"] = true; 38706c3fb27SDimitry Andric Features["dot2-insts"] = true; 38806c3fb27SDimitry Andric Features["dot7-insts"] = true; 38906c3fb27SDimitry Andric Features["dot10-insts"] = true; 39006c3fb27SDimitry Andric Features["gfx9-insts"] = true; 39106c3fb27SDimitry Andric Features["gfx8-insts"] = true; 39206c3fb27SDimitry Andric Features["16-bit-insts"] = true; 39306c3fb27SDimitry Andric Features["dpp"] = true; 39406c3fb27SDimitry Andric Features["s-memrealtime"] = true; 39506c3fb27SDimitry Andric Features["ci-insts"] = true; 39606c3fb27SDimitry Andric Features["s-memtime-inst"] = true; 397*5f757f3fSDimitry Andric Features["gws"] = true; 39806c3fb27SDimitry Andric break; 39906c3fb27SDimitry Andric case GK_GFX90A: 40006c3fb27SDimitry Andric Features["gfx90a-insts"] = true; 40106c3fb27SDimitry Andric Features["atomic-buffer-global-pk-add-f16-insts"] = true; 40206c3fb27SDimitry Andric Features["atomic-fadd-rtn-insts"] = true; 40306c3fb27SDimitry Andric [[fallthrough]]; 40406c3fb27SDimitry Andric case GK_GFX908: 40506c3fb27SDimitry Andric Features["dot3-insts"] = true; 40606c3fb27SDimitry Andric Features["dot4-insts"] = true; 40706c3fb27SDimitry Andric Features["dot5-insts"] = true; 40806c3fb27SDimitry Andric Features["dot6-insts"] = true; 40906c3fb27SDimitry Andric Features["mai-insts"] = true; 41006c3fb27SDimitry Andric [[fallthrough]]; 41106c3fb27SDimitry Andric case GK_GFX906: 41206c3fb27SDimitry Andric Features["dl-insts"] = true; 41306c3fb27SDimitry Andric Features["dot1-insts"] = true; 41406c3fb27SDimitry Andric Features["dot2-insts"] = true; 41506c3fb27SDimitry Andric Features["dot7-insts"] = true; 41606c3fb27SDimitry Andric Features["dot10-insts"] = true; 41706c3fb27SDimitry Andric [[fallthrough]]; 41806c3fb27SDimitry Andric case GK_GFX90C: 41906c3fb27SDimitry Andric case GK_GFX909: 42006c3fb27SDimitry Andric case GK_GFX904: 42106c3fb27SDimitry Andric case GK_GFX902: 42206c3fb27SDimitry Andric case GK_GFX900: 42306c3fb27SDimitry Andric Features["gfx9-insts"] = true; 42406c3fb27SDimitry Andric [[fallthrough]]; 42506c3fb27SDimitry Andric case GK_GFX810: 42606c3fb27SDimitry Andric case GK_GFX805: 42706c3fb27SDimitry Andric case GK_GFX803: 42806c3fb27SDimitry Andric case GK_GFX802: 42906c3fb27SDimitry Andric case GK_GFX801: 43006c3fb27SDimitry Andric Features["gfx8-insts"] = true; 43106c3fb27SDimitry Andric Features["16-bit-insts"] = true; 43206c3fb27SDimitry Andric Features["dpp"] = true; 43306c3fb27SDimitry Andric Features["s-memrealtime"] = true; 43406c3fb27SDimitry Andric [[fallthrough]]; 43506c3fb27SDimitry Andric case GK_GFX705: 43606c3fb27SDimitry Andric case GK_GFX704: 43706c3fb27SDimitry Andric case GK_GFX703: 43806c3fb27SDimitry Andric case GK_GFX702: 43906c3fb27SDimitry Andric case GK_GFX701: 44006c3fb27SDimitry Andric case GK_GFX700: 44106c3fb27SDimitry Andric Features["ci-insts"] = true; 44206c3fb27SDimitry Andric [[fallthrough]]; 44306c3fb27SDimitry Andric case GK_GFX602: 44406c3fb27SDimitry Andric case GK_GFX601: 44506c3fb27SDimitry Andric case GK_GFX600: 44606c3fb27SDimitry Andric Features["image-insts"] = true; 44706c3fb27SDimitry Andric Features["s-memtime-inst"] = true; 448*5f757f3fSDimitry Andric Features["gws"] = true; 44906c3fb27SDimitry Andric break; 45006c3fb27SDimitry Andric case GK_NONE: 45106c3fb27SDimitry Andric break; 45206c3fb27SDimitry Andric default: 45306c3fb27SDimitry Andric llvm_unreachable("Unhandled GPU!"); 45406c3fb27SDimitry Andric } 45506c3fb27SDimitry Andric } else { 45606c3fb27SDimitry Andric if (GPU.empty()) 45706c3fb27SDimitry Andric GPU = "r600"; 45806c3fb27SDimitry Andric 45906c3fb27SDimitry Andric switch (llvm::AMDGPU::parseArchR600(GPU)) { 46006c3fb27SDimitry Andric case GK_CAYMAN: 46106c3fb27SDimitry Andric case GK_CYPRESS: 46206c3fb27SDimitry Andric case GK_RV770: 46306c3fb27SDimitry Andric case GK_RV670: 46406c3fb27SDimitry Andric // TODO: Add fp64 when implemented. 46506c3fb27SDimitry Andric break; 46606c3fb27SDimitry Andric case GK_TURKS: 46706c3fb27SDimitry Andric case GK_CAICOS: 46806c3fb27SDimitry Andric case GK_BARTS: 46906c3fb27SDimitry Andric case GK_SUMO: 47006c3fb27SDimitry Andric case GK_REDWOOD: 47106c3fb27SDimitry Andric case GK_JUNIPER: 47206c3fb27SDimitry Andric case GK_CEDAR: 47306c3fb27SDimitry Andric case GK_RV730: 47406c3fb27SDimitry Andric case GK_RV710: 47506c3fb27SDimitry Andric case GK_RS880: 47606c3fb27SDimitry Andric case GK_R630: 47706c3fb27SDimitry Andric case GK_R600: 47806c3fb27SDimitry Andric break; 47906c3fb27SDimitry Andric default: 48006c3fb27SDimitry Andric llvm_unreachable("Unhandled GPU!"); 48106c3fb27SDimitry Andric } 48206c3fb27SDimitry Andric } 48306c3fb27SDimitry Andric } 48406c3fb27SDimitry Andric 48506c3fb27SDimitry Andric static bool isWave32Capable(StringRef GPU, const Triple &T) { 48606c3fb27SDimitry Andric bool IsWave32Capable = false; 48706c3fb27SDimitry Andric // XXX - What does the member GPU mean if device name string passed here? 48806c3fb27SDimitry Andric if (T.isAMDGCN()) { 48906c3fb27SDimitry Andric switch (parseArchAMDGCN(GPU)) { 490*5f757f3fSDimitry Andric case GK_GFX1201: 491*5f757f3fSDimitry Andric case GK_GFX1200: 49206c3fb27SDimitry Andric case GK_GFX1151: 49306c3fb27SDimitry Andric case GK_GFX1150: 49406c3fb27SDimitry Andric case GK_GFX1103: 49506c3fb27SDimitry Andric case GK_GFX1102: 49606c3fb27SDimitry Andric case GK_GFX1101: 49706c3fb27SDimitry Andric case GK_GFX1100: 49806c3fb27SDimitry Andric case GK_GFX1036: 49906c3fb27SDimitry Andric case GK_GFX1035: 50006c3fb27SDimitry Andric case GK_GFX1034: 50106c3fb27SDimitry Andric case GK_GFX1033: 50206c3fb27SDimitry Andric case GK_GFX1032: 50306c3fb27SDimitry Andric case GK_GFX1031: 50406c3fb27SDimitry Andric case GK_GFX1030: 50506c3fb27SDimitry Andric case GK_GFX1012: 50606c3fb27SDimitry Andric case GK_GFX1011: 50706c3fb27SDimitry Andric case GK_GFX1013: 50806c3fb27SDimitry Andric case GK_GFX1010: 50906c3fb27SDimitry Andric IsWave32Capable = true; 51006c3fb27SDimitry Andric break; 51106c3fb27SDimitry Andric default: 51206c3fb27SDimitry Andric break; 51306c3fb27SDimitry Andric } 51406c3fb27SDimitry Andric } 51506c3fb27SDimitry Andric return IsWave32Capable; 51606c3fb27SDimitry Andric } 51706c3fb27SDimitry Andric 51806c3fb27SDimitry Andric bool AMDGPU::insertWaveSizeFeature(StringRef GPU, const Triple &T, 51906c3fb27SDimitry Andric StringMap<bool> &Features, 52006c3fb27SDimitry Andric std::string &ErrorMsg) { 52106c3fb27SDimitry Andric bool IsWave32Capable = isWave32Capable(GPU, T); 52206c3fb27SDimitry Andric const bool IsNullGPU = GPU.empty(); 52306c3fb27SDimitry Andric // FIXME: Not diagnosing wavefrontsize32 on wave64 only targets. 52406c3fb27SDimitry Andric const bool HaveWave32 = 52506c3fb27SDimitry Andric (IsWave32Capable || IsNullGPU) && Features.count("wavefrontsize32"); 52606c3fb27SDimitry Andric const bool HaveWave64 = Features.count("wavefrontsize64"); 52706c3fb27SDimitry Andric if (HaveWave32 && HaveWave64) { 52806c3fb27SDimitry Andric ErrorMsg = "'wavefrontsize32' and 'wavefrontsize64' are mutually exclusive"; 52906c3fb27SDimitry Andric return false; 53006c3fb27SDimitry Andric } 53106c3fb27SDimitry Andric // Don't assume any wavesize with an unknown subtarget. 53206c3fb27SDimitry Andric if (!IsNullGPU) { 53306c3fb27SDimitry Andric // Default to wave32 if available, or wave64 if not 53406c3fb27SDimitry Andric if (!HaveWave32 && !HaveWave64) { 53506c3fb27SDimitry Andric StringRef DefaultWaveSizeFeature = 53606c3fb27SDimitry Andric IsWave32Capable ? "wavefrontsize32" : "wavefrontsize64"; 53706c3fb27SDimitry Andric Features.insert(std::make_pair(DefaultWaveSizeFeature, true)); 53806c3fb27SDimitry Andric } 53906c3fb27SDimitry Andric } 54006c3fb27SDimitry Andric return true; 54106c3fb27SDimitry Andric } 542