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[] = { 64bdd1243dSDimitry Andric // Name Canonical Kind Features 65bdd1243dSDimitry Andric // Name 66bdd1243dSDimitry Andric {{"gfx600"}, {"gfx600"}, GK_GFX600, FEATURE_FAST_FMA_F32}, 67bdd1243dSDimitry Andric {{"tahiti"}, {"gfx600"}, GK_GFX600, FEATURE_FAST_FMA_F32}, 68bdd1243dSDimitry Andric {{"gfx601"}, {"gfx601"}, GK_GFX601, FEATURE_NONE}, 69bdd1243dSDimitry Andric {{"pitcairn"}, {"gfx601"}, GK_GFX601, FEATURE_NONE}, 70bdd1243dSDimitry Andric {{"verde"}, {"gfx601"}, GK_GFX601, FEATURE_NONE}, 71bdd1243dSDimitry Andric {{"gfx602"}, {"gfx602"}, GK_GFX602, FEATURE_NONE}, 72bdd1243dSDimitry Andric {{"hainan"}, {"gfx602"}, GK_GFX602, FEATURE_NONE}, 73bdd1243dSDimitry Andric {{"oland"}, {"gfx602"}, GK_GFX602, FEATURE_NONE}, 74bdd1243dSDimitry Andric {{"gfx700"}, {"gfx700"}, GK_GFX700, FEATURE_NONE}, 75bdd1243dSDimitry Andric {{"kaveri"}, {"gfx700"}, GK_GFX700, FEATURE_NONE}, 76bdd1243dSDimitry Andric {{"gfx701"}, {"gfx701"}, GK_GFX701, FEATURE_FAST_FMA_F32}, 77bdd1243dSDimitry Andric {{"hawaii"}, {"gfx701"}, GK_GFX701, FEATURE_FAST_FMA_F32}, 78bdd1243dSDimitry Andric {{"gfx702"}, {"gfx702"}, GK_GFX702, FEATURE_FAST_FMA_F32}, 79bdd1243dSDimitry Andric {{"gfx703"}, {"gfx703"}, GK_GFX703, FEATURE_NONE}, 80bdd1243dSDimitry Andric {{"kabini"}, {"gfx703"}, GK_GFX703, FEATURE_NONE}, 81bdd1243dSDimitry Andric {{"mullins"}, {"gfx703"}, GK_GFX703, FEATURE_NONE}, 82bdd1243dSDimitry Andric {{"gfx704"}, {"gfx704"}, GK_GFX704, FEATURE_NONE}, 83bdd1243dSDimitry Andric {{"bonaire"}, {"gfx704"}, GK_GFX704, FEATURE_NONE}, 84bdd1243dSDimitry Andric {{"gfx705"}, {"gfx705"}, GK_GFX705, FEATURE_NONE}, 85bdd1243dSDimitry Andric {{"gfx801"}, {"gfx801"}, GK_GFX801, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK}, 86bdd1243dSDimitry Andric {{"carrizo"}, {"gfx801"}, GK_GFX801, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK}, 87bdd1243dSDimitry Andric {{"gfx802"}, {"gfx802"}, GK_GFX802, FEATURE_FAST_DENORMAL_F32}, 88bdd1243dSDimitry Andric {{"iceland"}, {"gfx802"}, GK_GFX802, FEATURE_FAST_DENORMAL_F32}, 89bdd1243dSDimitry Andric {{"tonga"}, {"gfx802"}, GK_GFX802, FEATURE_FAST_DENORMAL_F32}, 90bdd1243dSDimitry Andric {{"gfx803"}, {"gfx803"}, GK_GFX803, FEATURE_FAST_DENORMAL_F32}, 91bdd1243dSDimitry Andric {{"fiji"}, {"gfx803"}, GK_GFX803, FEATURE_FAST_DENORMAL_F32}, 92bdd1243dSDimitry Andric {{"polaris10"}, {"gfx803"}, GK_GFX803, FEATURE_FAST_DENORMAL_F32}, 93bdd1243dSDimitry Andric {{"polaris11"}, {"gfx803"}, GK_GFX803, FEATURE_FAST_DENORMAL_F32}, 94bdd1243dSDimitry Andric {{"gfx805"}, {"gfx805"}, GK_GFX805, FEATURE_FAST_DENORMAL_F32}, 95bdd1243dSDimitry Andric {{"tongapro"}, {"gfx805"}, GK_GFX805, FEATURE_FAST_DENORMAL_F32}, 96bdd1243dSDimitry Andric {{"gfx810"}, {"gfx810"}, GK_GFX810, FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK}, 97bdd1243dSDimitry Andric {{"stoney"}, {"gfx810"}, GK_GFX810, FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK}, 98bdd1243dSDimitry Andric {{"gfx900"}, {"gfx900"}, GK_GFX900, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK}, 99bdd1243dSDimitry Andric {{"gfx902"}, {"gfx902"}, GK_GFX902, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK}, 100bdd1243dSDimitry Andric {{"gfx904"}, {"gfx904"}, GK_GFX904, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK}, 101bdd1243dSDimitry Andric {{"gfx906"}, {"gfx906"}, GK_GFX906, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC}, 102bdd1243dSDimitry Andric {{"gfx908"}, {"gfx908"}, GK_GFX908, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC}, 103bdd1243dSDimitry Andric {{"gfx909"}, {"gfx909"}, GK_GFX909, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK}, 104bdd1243dSDimitry Andric {{"gfx90a"}, {"gfx90a"}, GK_GFX90A, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC}, 105bdd1243dSDimitry Andric {{"gfx90c"}, {"gfx90c"}, GK_GFX90C, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK}, 106bdd1243dSDimitry Andric {{"gfx940"}, {"gfx940"}, GK_GFX940, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC}, 107*06c3fb27SDimitry Andric {{"gfx941"}, {"gfx941"}, GK_GFX941, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC}, 108*06c3fb27SDimitry Andric {{"gfx942"}, {"gfx942"}, GK_GFX942, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC}, 109*06c3fb27SDimitry Andric {{"gfx1010"}, {"gfx1010"}, GK_GFX1010, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP}, 110*06c3fb27SDimitry Andric {{"gfx1011"}, {"gfx1011"}, GK_GFX1011, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP}, 111*06c3fb27SDimitry Andric {{"gfx1012"}, {"gfx1012"}, GK_GFX1012, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP}, 112*06c3fb27SDimitry Andric {{"gfx1013"}, {"gfx1013"}, GK_GFX1013, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP}, 113*06c3fb27SDimitry Andric {{"gfx1030"}, {"gfx1030"}, GK_GFX1030, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 114*06c3fb27SDimitry Andric {{"gfx1031"}, {"gfx1031"}, GK_GFX1031, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 115*06c3fb27SDimitry Andric {{"gfx1032"}, {"gfx1032"}, GK_GFX1032, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 116*06c3fb27SDimitry Andric {{"gfx1033"}, {"gfx1033"}, GK_GFX1033, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 117*06c3fb27SDimitry Andric {{"gfx1034"}, {"gfx1034"}, GK_GFX1034, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 118*06c3fb27SDimitry Andric {{"gfx1035"}, {"gfx1035"}, GK_GFX1035, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 119*06c3fb27SDimitry Andric {{"gfx1036"}, {"gfx1036"}, GK_GFX1036, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 120*06c3fb27SDimitry Andric {{"gfx1100"}, {"gfx1100"}, GK_GFX1100, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 121*06c3fb27SDimitry Andric {{"gfx1101"}, {"gfx1101"}, GK_GFX1101, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 122*06c3fb27SDimitry Andric {{"gfx1102"}, {"gfx1102"}, GK_GFX1102, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 123*06c3fb27SDimitry Andric {{"gfx1103"}, {"gfx1103"}, GK_GFX1103, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 124*06c3fb27SDimitry Andric {{"gfx1150"}, {"gfx1150"}, GK_GFX1150, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 125*06c3fb27SDimitry Andric {{"gfx1151"}, {"gfx1151"}, GK_GFX1151, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP}, 126bdd1243dSDimitry Andric }; 127bdd1243dSDimitry Andric 128bdd1243dSDimitry Andric const GPUInfo *getArchEntry(AMDGPU::GPUKind AK, ArrayRef<GPUInfo> Table) { 129bdd1243dSDimitry Andric GPUInfo Search = { {""}, {""}, AK, AMDGPU::FEATURE_NONE }; 130bdd1243dSDimitry Andric 131bdd1243dSDimitry Andric auto I = 132bdd1243dSDimitry Andric llvm::lower_bound(Table, Search, [](const GPUInfo &A, const GPUInfo &B) { 133bdd1243dSDimitry Andric return A.Kind < B.Kind; 134bdd1243dSDimitry Andric }); 135bdd1243dSDimitry Andric 136bdd1243dSDimitry Andric if (I == Table.end()) 137bdd1243dSDimitry Andric return nullptr; 138bdd1243dSDimitry Andric return I; 139bdd1243dSDimitry Andric } 140bdd1243dSDimitry Andric 141bdd1243dSDimitry Andric } // namespace 142bdd1243dSDimitry Andric 143bdd1243dSDimitry Andric StringRef llvm::AMDGPU::getArchNameAMDGCN(GPUKind AK) { 144bdd1243dSDimitry Andric if (const auto *Entry = getArchEntry(AK, AMDGCNGPUs)) 145bdd1243dSDimitry Andric return Entry->CanonicalName; 146bdd1243dSDimitry Andric return ""; 147bdd1243dSDimitry Andric } 148bdd1243dSDimitry Andric 149bdd1243dSDimitry Andric StringRef llvm::AMDGPU::getArchNameR600(GPUKind AK) { 150bdd1243dSDimitry Andric if (const auto *Entry = getArchEntry(AK, R600GPUs)) 151bdd1243dSDimitry Andric return Entry->CanonicalName; 152bdd1243dSDimitry Andric return ""; 153bdd1243dSDimitry Andric } 154bdd1243dSDimitry Andric 155bdd1243dSDimitry Andric AMDGPU::GPUKind llvm::AMDGPU::parseArchAMDGCN(StringRef CPU) { 156bdd1243dSDimitry Andric for (const auto &C : AMDGCNGPUs) { 157bdd1243dSDimitry Andric if (CPU == C.Name) 158bdd1243dSDimitry Andric return C.Kind; 159bdd1243dSDimitry Andric } 160bdd1243dSDimitry Andric 161bdd1243dSDimitry Andric return AMDGPU::GPUKind::GK_NONE; 162bdd1243dSDimitry Andric } 163bdd1243dSDimitry Andric 164bdd1243dSDimitry Andric AMDGPU::GPUKind llvm::AMDGPU::parseArchR600(StringRef CPU) { 165bdd1243dSDimitry Andric for (const auto &C : R600GPUs) { 166bdd1243dSDimitry Andric if (CPU == C.Name) 167bdd1243dSDimitry Andric return C.Kind; 168bdd1243dSDimitry Andric } 169bdd1243dSDimitry Andric 170bdd1243dSDimitry Andric return AMDGPU::GPUKind::GK_NONE; 171bdd1243dSDimitry Andric } 172bdd1243dSDimitry Andric 173bdd1243dSDimitry Andric unsigned AMDGPU::getArchAttrAMDGCN(GPUKind AK) { 174bdd1243dSDimitry Andric if (const auto *Entry = getArchEntry(AK, AMDGCNGPUs)) 175bdd1243dSDimitry Andric return Entry->Features; 176bdd1243dSDimitry Andric return FEATURE_NONE; 177bdd1243dSDimitry Andric } 178bdd1243dSDimitry Andric 179bdd1243dSDimitry Andric unsigned AMDGPU::getArchAttrR600(GPUKind AK) { 180bdd1243dSDimitry Andric if (const auto *Entry = getArchEntry(AK, R600GPUs)) 181bdd1243dSDimitry Andric return Entry->Features; 182bdd1243dSDimitry Andric return FEATURE_NONE; 183bdd1243dSDimitry Andric } 184bdd1243dSDimitry Andric 185bdd1243dSDimitry Andric void AMDGPU::fillValidArchListAMDGCN(SmallVectorImpl<StringRef> &Values) { 186bdd1243dSDimitry Andric // XXX: Should this only report unique canonical names? 187bdd1243dSDimitry Andric for (const auto &C : AMDGCNGPUs) 188bdd1243dSDimitry Andric Values.push_back(C.Name); 189bdd1243dSDimitry Andric } 190bdd1243dSDimitry Andric 191bdd1243dSDimitry Andric void AMDGPU::fillValidArchListR600(SmallVectorImpl<StringRef> &Values) { 192bdd1243dSDimitry Andric for (const auto &C : R600GPUs) 193bdd1243dSDimitry Andric Values.push_back(C.Name); 194bdd1243dSDimitry Andric } 195bdd1243dSDimitry Andric 196bdd1243dSDimitry Andric AMDGPU::IsaVersion AMDGPU::getIsaVersion(StringRef GPU) { 197bdd1243dSDimitry Andric AMDGPU::GPUKind AK = parseArchAMDGCN(GPU); 198bdd1243dSDimitry Andric if (AK == AMDGPU::GPUKind::GK_NONE) { 199bdd1243dSDimitry Andric if (GPU == "generic-hsa") 200bdd1243dSDimitry Andric return {7, 0, 0}; 201bdd1243dSDimitry Andric if (GPU == "generic") 202bdd1243dSDimitry Andric return {6, 0, 0}; 203bdd1243dSDimitry Andric return {0, 0, 0}; 204bdd1243dSDimitry Andric } 205bdd1243dSDimitry Andric 206bdd1243dSDimitry Andric switch (AK) { 207bdd1243dSDimitry Andric case GK_GFX600: return {6, 0, 0}; 208bdd1243dSDimitry Andric case GK_GFX601: return {6, 0, 1}; 209bdd1243dSDimitry Andric case GK_GFX602: return {6, 0, 2}; 210bdd1243dSDimitry Andric case GK_GFX700: return {7, 0, 0}; 211bdd1243dSDimitry Andric case GK_GFX701: return {7, 0, 1}; 212bdd1243dSDimitry Andric case GK_GFX702: return {7, 0, 2}; 213bdd1243dSDimitry Andric case GK_GFX703: return {7, 0, 3}; 214bdd1243dSDimitry Andric case GK_GFX704: return {7, 0, 4}; 215bdd1243dSDimitry Andric case GK_GFX705: return {7, 0, 5}; 216bdd1243dSDimitry Andric case GK_GFX801: return {8, 0, 1}; 217bdd1243dSDimitry Andric case GK_GFX802: return {8, 0, 2}; 218bdd1243dSDimitry Andric case GK_GFX803: return {8, 0, 3}; 219bdd1243dSDimitry Andric case GK_GFX805: return {8, 0, 5}; 220bdd1243dSDimitry Andric case GK_GFX810: return {8, 1, 0}; 221bdd1243dSDimitry Andric case GK_GFX900: return {9, 0, 0}; 222bdd1243dSDimitry Andric case GK_GFX902: return {9, 0, 2}; 223bdd1243dSDimitry Andric case GK_GFX904: return {9, 0, 4}; 224bdd1243dSDimitry Andric case GK_GFX906: return {9, 0, 6}; 225bdd1243dSDimitry Andric case GK_GFX908: return {9, 0, 8}; 226bdd1243dSDimitry Andric case GK_GFX909: return {9, 0, 9}; 227bdd1243dSDimitry Andric case GK_GFX90A: return {9, 0, 10}; 228bdd1243dSDimitry Andric case GK_GFX90C: return {9, 0, 12}; 229bdd1243dSDimitry Andric case GK_GFX940: return {9, 4, 0}; 230*06c3fb27SDimitry Andric case GK_GFX941: return {9, 4, 1}; 231*06c3fb27SDimitry Andric case GK_GFX942: return {9, 4, 2}; 232bdd1243dSDimitry Andric case GK_GFX1010: return {10, 1, 0}; 233bdd1243dSDimitry Andric case GK_GFX1011: return {10, 1, 1}; 234bdd1243dSDimitry Andric case GK_GFX1012: return {10, 1, 2}; 235bdd1243dSDimitry Andric case GK_GFX1013: return {10, 1, 3}; 236bdd1243dSDimitry Andric case GK_GFX1030: return {10, 3, 0}; 237bdd1243dSDimitry Andric case GK_GFX1031: return {10, 3, 1}; 238bdd1243dSDimitry Andric case GK_GFX1032: return {10, 3, 2}; 239bdd1243dSDimitry Andric case GK_GFX1033: return {10, 3, 3}; 240bdd1243dSDimitry Andric case GK_GFX1034: return {10, 3, 4}; 241bdd1243dSDimitry Andric case GK_GFX1035: return {10, 3, 5}; 242bdd1243dSDimitry Andric case GK_GFX1036: return {10, 3, 6}; 243bdd1243dSDimitry Andric case GK_GFX1100: return {11, 0, 0}; 244bdd1243dSDimitry Andric case GK_GFX1101: return {11, 0, 1}; 245bdd1243dSDimitry Andric case GK_GFX1102: return {11, 0, 2}; 246bdd1243dSDimitry Andric case GK_GFX1103: return {11, 0, 3}; 247*06c3fb27SDimitry Andric case GK_GFX1150: return {11, 5, 0}; 248*06c3fb27SDimitry Andric case GK_GFX1151: return {11, 5, 1}; 249bdd1243dSDimitry Andric default: return {0, 0, 0}; 250bdd1243dSDimitry Andric } 251bdd1243dSDimitry Andric } 252bdd1243dSDimitry Andric 253bdd1243dSDimitry Andric StringRef AMDGPU::getCanonicalArchName(const Triple &T, StringRef Arch) { 254bdd1243dSDimitry Andric assert(T.isAMDGPU()); 255bdd1243dSDimitry Andric auto ProcKind = T.isAMDGCN() ? parseArchAMDGCN(Arch) : parseArchR600(Arch); 256bdd1243dSDimitry Andric if (ProcKind == GK_NONE) 257bdd1243dSDimitry Andric return StringRef(); 258bdd1243dSDimitry Andric 259bdd1243dSDimitry Andric return T.isAMDGCN() ? getArchNameAMDGCN(ProcKind) : getArchNameR600(ProcKind); 260bdd1243dSDimitry Andric } 261*06c3fb27SDimitry Andric 262*06c3fb27SDimitry Andric void AMDGPU::fillAMDGPUFeatureMap(StringRef GPU, const Triple &T, 263*06c3fb27SDimitry Andric StringMap<bool> &Features) { 264*06c3fb27SDimitry Andric // XXX - What does the member GPU mean if device name string passed here? 265*06c3fb27SDimitry Andric if (T.isAMDGCN()) { 266*06c3fb27SDimitry Andric switch (parseArchAMDGCN(GPU)) { 267*06c3fb27SDimitry Andric case GK_GFX1151: 268*06c3fb27SDimitry Andric case GK_GFX1150: 269*06c3fb27SDimitry Andric case GK_GFX1103: 270*06c3fb27SDimitry Andric case GK_GFX1102: 271*06c3fb27SDimitry Andric case GK_GFX1101: 272*06c3fb27SDimitry Andric case GK_GFX1100: 273*06c3fb27SDimitry Andric Features["ci-insts"] = true; 274*06c3fb27SDimitry Andric Features["dot5-insts"] = true; 275*06c3fb27SDimitry Andric Features["dot7-insts"] = true; 276*06c3fb27SDimitry Andric Features["dot8-insts"] = true; 277*06c3fb27SDimitry Andric Features["dot9-insts"] = true; 278*06c3fb27SDimitry Andric Features["dot10-insts"] = true; 279*06c3fb27SDimitry Andric Features["dl-insts"] = true; 280*06c3fb27SDimitry Andric Features["16-bit-insts"] = true; 281*06c3fb27SDimitry Andric Features["dpp"] = true; 282*06c3fb27SDimitry Andric Features["gfx8-insts"] = true; 283*06c3fb27SDimitry Andric Features["gfx9-insts"] = true; 284*06c3fb27SDimitry Andric Features["gfx10-insts"] = true; 285*06c3fb27SDimitry Andric Features["gfx10-3-insts"] = true; 286*06c3fb27SDimitry Andric Features["gfx11-insts"] = true; 287*06c3fb27SDimitry Andric Features["atomic-fadd-rtn-insts"] = true; 288*06c3fb27SDimitry Andric Features["image-insts"] = true; 289*06c3fb27SDimitry Andric break; 290*06c3fb27SDimitry Andric case GK_GFX1036: 291*06c3fb27SDimitry Andric case GK_GFX1035: 292*06c3fb27SDimitry Andric case GK_GFX1034: 293*06c3fb27SDimitry Andric case GK_GFX1033: 294*06c3fb27SDimitry Andric case GK_GFX1032: 295*06c3fb27SDimitry Andric case GK_GFX1031: 296*06c3fb27SDimitry Andric case GK_GFX1030: 297*06c3fb27SDimitry Andric Features["ci-insts"] = true; 298*06c3fb27SDimitry Andric Features["dot1-insts"] = true; 299*06c3fb27SDimitry Andric Features["dot2-insts"] = true; 300*06c3fb27SDimitry Andric Features["dot5-insts"] = true; 301*06c3fb27SDimitry Andric Features["dot6-insts"] = true; 302*06c3fb27SDimitry Andric Features["dot7-insts"] = true; 303*06c3fb27SDimitry Andric Features["dot10-insts"] = true; 304*06c3fb27SDimitry Andric Features["dl-insts"] = true; 305*06c3fb27SDimitry Andric Features["16-bit-insts"] = true; 306*06c3fb27SDimitry Andric Features["dpp"] = true; 307*06c3fb27SDimitry Andric Features["gfx8-insts"] = true; 308*06c3fb27SDimitry Andric Features["gfx9-insts"] = true; 309*06c3fb27SDimitry Andric Features["gfx10-insts"] = true; 310*06c3fb27SDimitry Andric Features["gfx10-3-insts"] = true; 311*06c3fb27SDimitry Andric Features["image-insts"] = true; 312*06c3fb27SDimitry Andric Features["s-memrealtime"] = true; 313*06c3fb27SDimitry Andric Features["s-memtime-inst"] = true; 314*06c3fb27SDimitry Andric break; 315*06c3fb27SDimitry Andric case GK_GFX1012: 316*06c3fb27SDimitry Andric case GK_GFX1011: 317*06c3fb27SDimitry Andric Features["dot1-insts"] = true; 318*06c3fb27SDimitry Andric Features["dot2-insts"] = true; 319*06c3fb27SDimitry Andric Features["dot5-insts"] = true; 320*06c3fb27SDimitry Andric Features["dot6-insts"] = true; 321*06c3fb27SDimitry Andric Features["dot7-insts"] = true; 322*06c3fb27SDimitry Andric Features["dot10-insts"] = true; 323*06c3fb27SDimitry Andric [[fallthrough]]; 324*06c3fb27SDimitry Andric case GK_GFX1013: 325*06c3fb27SDimitry Andric case GK_GFX1010: 326*06c3fb27SDimitry Andric Features["dl-insts"] = true; 327*06c3fb27SDimitry Andric Features["ci-insts"] = true; 328*06c3fb27SDimitry Andric Features["16-bit-insts"] = true; 329*06c3fb27SDimitry Andric Features["dpp"] = true; 330*06c3fb27SDimitry Andric Features["gfx8-insts"] = true; 331*06c3fb27SDimitry Andric Features["gfx9-insts"] = true; 332*06c3fb27SDimitry Andric Features["gfx10-insts"] = true; 333*06c3fb27SDimitry Andric Features["image-insts"] = true; 334*06c3fb27SDimitry Andric Features["s-memrealtime"] = true; 335*06c3fb27SDimitry Andric Features["s-memtime-inst"] = true; 336*06c3fb27SDimitry Andric break; 337*06c3fb27SDimitry Andric case GK_GFX942: 338*06c3fb27SDimitry Andric case GK_GFX941: 339*06c3fb27SDimitry Andric case GK_GFX940: 340*06c3fb27SDimitry Andric Features["gfx940-insts"] = true; 341*06c3fb27SDimitry Andric Features["fp8-insts"] = true; 342*06c3fb27SDimitry Andric Features["atomic-ds-pk-add-16-insts"] = true; 343*06c3fb27SDimitry Andric Features["atomic-flat-pk-add-16-insts"] = true; 344*06c3fb27SDimitry Andric Features["atomic-global-pk-add-bf16-inst"] = true; 345*06c3fb27SDimitry Andric Features["gfx90a-insts"] = true; 346*06c3fb27SDimitry Andric Features["atomic-buffer-global-pk-add-f16-insts"] = true; 347*06c3fb27SDimitry Andric Features["atomic-fadd-rtn-insts"] = true; 348*06c3fb27SDimitry Andric Features["dot3-insts"] = true; 349*06c3fb27SDimitry Andric Features["dot4-insts"] = true; 350*06c3fb27SDimitry Andric Features["dot5-insts"] = true; 351*06c3fb27SDimitry Andric Features["dot6-insts"] = true; 352*06c3fb27SDimitry Andric Features["mai-insts"] = true; 353*06c3fb27SDimitry Andric Features["dl-insts"] = true; 354*06c3fb27SDimitry Andric Features["dot1-insts"] = true; 355*06c3fb27SDimitry Andric Features["dot2-insts"] = true; 356*06c3fb27SDimitry Andric Features["dot7-insts"] = true; 357*06c3fb27SDimitry Andric Features["dot10-insts"] = true; 358*06c3fb27SDimitry Andric Features["gfx9-insts"] = true; 359*06c3fb27SDimitry Andric Features["gfx8-insts"] = true; 360*06c3fb27SDimitry Andric Features["16-bit-insts"] = true; 361*06c3fb27SDimitry Andric Features["dpp"] = true; 362*06c3fb27SDimitry Andric Features["s-memrealtime"] = true; 363*06c3fb27SDimitry Andric Features["ci-insts"] = true; 364*06c3fb27SDimitry Andric Features["s-memtime-inst"] = true; 365*06c3fb27SDimitry Andric break; 366*06c3fb27SDimitry Andric case GK_GFX90A: 367*06c3fb27SDimitry Andric Features["gfx90a-insts"] = true; 368*06c3fb27SDimitry Andric Features["atomic-buffer-global-pk-add-f16-insts"] = true; 369*06c3fb27SDimitry Andric Features["atomic-fadd-rtn-insts"] = true; 370*06c3fb27SDimitry Andric [[fallthrough]]; 371*06c3fb27SDimitry Andric case GK_GFX908: 372*06c3fb27SDimitry Andric Features["dot3-insts"] = true; 373*06c3fb27SDimitry Andric Features["dot4-insts"] = true; 374*06c3fb27SDimitry Andric Features["dot5-insts"] = true; 375*06c3fb27SDimitry Andric Features["dot6-insts"] = true; 376*06c3fb27SDimitry Andric Features["mai-insts"] = true; 377*06c3fb27SDimitry Andric [[fallthrough]]; 378*06c3fb27SDimitry Andric case GK_GFX906: 379*06c3fb27SDimitry Andric Features["dl-insts"] = true; 380*06c3fb27SDimitry Andric Features["dot1-insts"] = true; 381*06c3fb27SDimitry Andric Features["dot2-insts"] = true; 382*06c3fb27SDimitry Andric Features["dot7-insts"] = true; 383*06c3fb27SDimitry Andric Features["dot10-insts"] = true; 384*06c3fb27SDimitry Andric [[fallthrough]]; 385*06c3fb27SDimitry Andric case GK_GFX90C: 386*06c3fb27SDimitry Andric case GK_GFX909: 387*06c3fb27SDimitry Andric case GK_GFX904: 388*06c3fb27SDimitry Andric case GK_GFX902: 389*06c3fb27SDimitry Andric case GK_GFX900: 390*06c3fb27SDimitry Andric Features["gfx9-insts"] = true; 391*06c3fb27SDimitry Andric [[fallthrough]]; 392*06c3fb27SDimitry Andric case GK_GFX810: 393*06c3fb27SDimitry Andric case GK_GFX805: 394*06c3fb27SDimitry Andric case GK_GFX803: 395*06c3fb27SDimitry Andric case GK_GFX802: 396*06c3fb27SDimitry Andric case GK_GFX801: 397*06c3fb27SDimitry Andric Features["gfx8-insts"] = true; 398*06c3fb27SDimitry Andric Features["16-bit-insts"] = true; 399*06c3fb27SDimitry Andric Features["dpp"] = true; 400*06c3fb27SDimitry Andric Features["s-memrealtime"] = true; 401*06c3fb27SDimitry Andric [[fallthrough]]; 402*06c3fb27SDimitry Andric case GK_GFX705: 403*06c3fb27SDimitry Andric case GK_GFX704: 404*06c3fb27SDimitry Andric case GK_GFX703: 405*06c3fb27SDimitry Andric case GK_GFX702: 406*06c3fb27SDimitry Andric case GK_GFX701: 407*06c3fb27SDimitry Andric case GK_GFX700: 408*06c3fb27SDimitry Andric Features["ci-insts"] = true; 409*06c3fb27SDimitry Andric [[fallthrough]]; 410*06c3fb27SDimitry Andric case GK_GFX602: 411*06c3fb27SDimitry Andric case GK_GFX601: 412*06c3fb27SDimitry Andric case GK_GFX600: 413*06c3fb27SDimitry Andric Features["image-insts"] = true; 414*06c3fb27SDimitry Andric Features["s-memtime-inst"] = true; 415*06c3fb27SDimitry Andric break; 416*06c3fb27SDimitry Andric case GK_NONE: 417*06c3fb27SDimitry Andric break; 418*06c3fb27SDimitry Andric default: 419*06c3fb27SDimitry Andric llvm_unreachable("Unhandled GPU!"); 420*06c3fb27SDimitry Andric } 421*06c3fb27SDimitry Andric } else { 422*06c3fb27SDimitry Andric if (GPU.empty()) 423*06c3fb27SDimitry Andric GPU = "r600"; 424*06c3fb27SDimitry Andric 425*06c3fb27SDimitry Andric switch (llvm::AMDGPU::parseArchR600(GPU)) { 426*06c3fb27SDimitry Andric case GK_CAYMAN: 427*06c3fb27SDimitry Andric case GK_CYPRESS: 428*06c3fb27SDimitry Andric case GK_RV770: 429*06c3fb27SDimitry Andric case GK_RV670: 430*06c3fb27SDimitry Andric // TODO: Add fp64 when implemented. 431*06c3fb27SDimitry Andric break; 432*06c3fb27SDimitry Andric case GK_TURKS: 433*06c3fb27SDimitry Andric case GK_CAICOS: 434*06c3fb27SDimitry Andric case GK_BARTS: 435*06c3fb27SDimitry Andric case GK_SUMO: 436*06c3fb27SDimitry Andric case GK_REDWOOD: 437*06c3fb27SDimitry Andric case GK_JUNIPER: 438*06c3fb27SDimitry Andric case GK_CEDAR: 439*06c3fb27SDimitry Andric case GK_RV730: 440*06c3fb27SDimitry Andric case GK_RV710: 441*06c3fb27SDimitry Andric case GK_RS880: 442*06c3fb27SDimitry Andric case GK_R630: 443*06c3fb27SDimitry Andric case GK_R600: 444*06c3fb27SDimitry Andric break; 445*06c3fb27SDimitry Andric default: 446*06c3fb27SDimitry Andric llvm_unreachable("Unhandled GPU!"); 447*06c3fb27SDimitry Andric } 448*06c3fb27SDimitry Andric } 449*06c3fb27SDimitry Andric } 450*06c3fb27SDimitry Andric 451*06c3fb27SDimitry Andric static bool isWave32Capable(StringRef GPU, const Triple &T) { 452*06c3fb27SDimitry Andric bool IsWave32Capable = false; 453*06c3fb27SDimitry Andric // XXX - What does the member GPU mean if device name string passed here? 454*06c3fb27SDimitry Andric if (T.isAMDGCN()) { 455*06c3fb27SDimitry Andric switch (parseArchAMDGCN(GPU)) { 456*06c3fb27SDimitry Andric case GK_GFX1151: 457*06c3fb27SDimitry Andric case GK_GFX1150: 458*06c3fb27SDimitry Andric case GK_GFX1103: 459*06c3fb27SDimitry Andric case GK_GFX1102: 460*06c3fb27SDimitry Andric case GK_GFX1101: 461*06c3fb27SDimitry Andric case GK_GFX1100: 462*06c3fb27SDimitry Andric case GK_GFX1036: 463*06c3fb27SDimitry Andric case GK_GFX1035: 464*06c3fb27SDimitry Andric case GK_GFX1034: 465*06c3fb27SDimitry Andric case GK_GFX1033: 466*06c3fb27SDimitry Andric case GK_GFX1032: 467*06c3fb27SDimitry Andric case GK_GFX1031: 468*06c3fb27SDimitry Andric case GK_GFX1030: 469*06c3fb27SDimitry Andric case GK_GFX1012: 470*06c3fb27SDimitry Andric case GK_GFX1011: 471*06c3fb27SDimitry Andric case GK_GFX1013: 472*06c3fb27SDimitry Andric case GK_GFX1010: 473*06c3fb27SDimitry Andric IsWave32Capable = true; 474*06c3fb27SDimitry Andric break; 475*06c3fb27SDimitry Andric default: 476*06c3fb27SDimitry Andric break; 477*06c3fb27SDimitry Andric } 478*06c3fb27SDimitry Andric } 479*06c3fb27SDimitry Andric return IsWave32Capable; 480*06c3fb27SDimitry Andric } 481*06c3fb27SDimitry Andric 482*06c3fb27SDimitry Andric bool AMDGPU::insertWaveSizeFeature(StringRef GPU, const Triple &T, 483*06c3fb27SDimitry Andric StringMap<bool> &Features, 484*06c3fb27SDimitry Andric std::string &ErrorMsg) { 485*06c3fb27SDimitry Andric bool IsWave32Capable = isWave32Capable(GPU, T); 486*06c3fb27SDimitry Andric const bool IsNullGPU = GPU.empty(); 487*06c3fb27SDimitry Andric // FIXME: Not diagnosing wavefrontsize32 on wave64 only targets. 488*06c3fb27SDimitry Andric const bool HaveWave32 = 489*06c3fb27SDimitry Andric (IsWave32Capable || IsNullGPU) && Features.count("wavefrontsize32"); 490*06c3fb27SDimitry Andric const bool HaveWave64 = Features.count("wavefrontsize64"); 491*06c3fb27SDimitry Andric if (HaveWave32 && HaveWave64) { 492*06c3fb27SDimitry Andric ErrorMsg = "'wavefrontsize32' and 'wavefrontsize64' are mutually exclusive"; 493*06c3fb27SDimitry Andric return false; 494*06c3fb27SDimitry Andric } 495*06c3fb27SDimitry Andric // Don't assume any wavesize with an unknown subtarget. 496*06c3fb27SDimitry Andric if (!IsNullGPU) { 497*06c3fb27SDimitry Andric // Default to wave32 if available, or wave64 if not 498*06c3fb27SDimitry Andric if (!HaveWave32 && !HaveWave64) { 499*06c3fb27SDimitry Andric StringRef DefaultWaveSizeFeature = 500*06c3fb27SDimitry Andric IsWave32Capable ? "wavefrontsize32" : "wavefrontsize64"; 501*06c3fb27SDimitry Andric Features.insert(std::make_pair(DefaultWaveSizeFeature, true)); 502*06c3fb27SDimitry Andric } 503*06c3fb27SDimitry Andric } 504*06c3fb27SDimitry Andric return true; 505*06c3fb27SDimitry Andric } 506