845 lines · cpp
1//===-- TargetParser - Parser for target features ---------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements a target parser to recognise hardware features such as10// FPU/CPU/ARCH names as well as specific support such as HDIV, etc.11//12//===----------------------------------------------------------------------===//13 14#include "llvm/TargetParser/TargetParser.h"15#include "llvm/ADT/ArrayRef.h"16#include "llvm/TargetParser/Triple.h"17 18using namespace llvm;19using namespace AMDGPU;20 21/// Find KV in array using binary search.22static const BasicSubtargetSubTypeKV *23find(StringRef S, ArrayRef<BasicSubtargetSubTypeKV> A) {24 // Binary search the array25 auto F = llvm::lower_bound(A, S);26 // If not found then return NULL27 if (F == A.end() || StringRef(F->Key) != S)28 return nullptr;29 // Return the found array item30 return F;31}32 33/// For each feature that is (transitively) implied by this feature, set it.34static void setImpliedBits(FeatureBitset &Bits, const FeatureBitset &Implies,35 ArrayRef<BasicSubtargetFeatureKV> FeatureTable) {36 // OR the Implies bits in outside the loop. This allows the Implies for CPUs37 // which might imply features not in FeatureTable to use this.38 Bits |= Implies;39 for (const auto &FE : FeatureTable)40 if (Implies.test(FE.Value))41 setImpliedBits(Bits, FE.Implies.getAsBitset(), FeatureTable);42}43 44std::optional<llvm::StringMap<bool>> llvm::getCPUDefaultTargetFeatures(45 StringRef CPU, ArrayRef<BasicSubtargetSubTypeKV> ProcDesc,46 ArrayRef<BasicSubtargetFeatureKV> ProcFeatures) {47 if (CPU.empty())48 return std::nullopt;49 50 const BasicSubtargetSubTypeKV *CPUEntry = ::find(CPU, ProcDesc);51 if (!CPUEntry)52 return std::nullopt;53 54 // Set the features implied by this CPU feature if there is a match.55 FeatureBitset Bits;56 llvm::StringMap<bool> DefaultFeatures;57 setImpliedBits(Bits, CPUEntry->Implies.getAsBitset(), ProcFeatures);58 59 [[maybe_unused]] unsigned BitSize = Bits.size();60 for (const BasicSubtargetFeatureKV &FE : ProcFeatures) {61 assert(FE.Value < BitSize && "Target Feature is out of range");62 if (Bits[FE.Value])63 DefaultFeatures[FE.Key] = true;64 }65 return DefaultFeatures;66}67 68namespace {69 70struct GPUInfo {71 StringLiteral Name;72 StringLiteral CanonicalName;73 AMDGPU::GPUKind Kind;74 unsigned Features;75};76 77constexpr GPUInfo R600GPUs[] = {78 // Name Canonical Kind Features79 // Name80 {{"r600"}, {"r600"}, GK_R600, FEATURE_NONE },81 {{"rv630"}, {"r600"}, GK_R600, FEATURE_NONE },82 {{"rv635"}, {"r600"}, GK_R600, FEATURE_NONE },83 {{"r630"}, {"r630"}, GK_R630, FEATURE_NONE },84 {{"rs780"}, {"rs880"}, GK_RS880, FEATURE_NONE },85 {{"rs880"}, {"rs880"}, GK_RS880, FEATURE_NONE },86 {{"rv610"}, {"rs880"}, GK_RS880, FEATURE_NONE },87 {{"rv620"}, {"rs880"}, GK_RS880, FEATURE_NONE },88 {{"rv670"}, {"rv670"}, GK_RV670, FEATURE_NONE },89 {{"rv710"}, {"rv710"}, GK_RV710, FEATURE_NONE },90 {{"rv730"}, {"rv730"}, GK_RV730, FEATURE_NONE },91 {{"rv740"}, {"rv770"}, GK_RV770, FEATURE_NONE },92 {{"rv770"}, {"rv770"}, GK_RV770, FEATURE_NONE },93 {{"cedar"}, {"cedar"}, GK_CEDAR, FEATURE_NONE },94 {{"palm"}, {"cedar"}, GK_CEDAR, FEATURE_NONE },95 {{"cypress"}, {"cypress"}, GK_CYPRESS, FEATURE_FMA },96 {{"hemlock"}, {"cypress"}, GK_CYPRESS, FEATURE_FMA },97 {{"juniper"}, {"juniper"}, GK_JUNIPER, FEATURE_NONE },98 {{"redwood"}, {"redwood"}, GK_REDWOOD, FEATURE_NONE },99 {{"sumo"}, {"sumo"}, GK_SUMO, FEATURE_NONE },100 {{"sumo2"}, {"sumo"}, GK_SUMO, FEATURE_NONE },101 {{"barts"}, {"barts"}, GK_BARTS, FEATURE_NONE },102 {{"caicos"}, {"caicos"}, GK_CAICOS, FEATURE_NONE },103 {{"aruba"}, {"cayman"}, GK_CAYMAN, FEATURE_FMA },104 {{"cayman"}, {"cayman"}, GK_CAYMAN, FEATURE_FMA },105 {{"turks"}, {"turks"}, GK_TURKS, FEATURE_NONE }106};107 108// This table should be sorted by the value of GPUKind109// Don't bother listing the implicitly true features110constexpr GPUInfo AMDGCNGPUs[] = {111 // clang-format off112 // Name Canonical Kind Features113 // Name114 {{"gfx600"}, {"gfx600"}, GK_GFX600, FEATURE_FAST_FMA_F32},115 {{"tahiti"}, {"gfx600"}, GK_GFX600, FEATURE_FAST_FMA_F32},116 {{"gfx601"}, {"gfx601"}, GK_GFX601, FEATURE_NONE},117 {{"pitcairn"}, {"gfx601"}, GK_GFX601, FEATURE_NONE},118 {{"verde"}, {"gfx601"}, GK_GFX601, FEATURE_NONE},119 {{"gfx602"}, {"gfx602"}, GK_GFX602, FEATURE_NONE},120 {{"hainan"}, {"gfx602"}, GK_GFX602, FEATURE_NONE},121 {{"oland"}, {"gfx602"}, GK_GFX602, FEATURE_NONE},122 {{"gfx700"}, {"gfx700"}, GK_GFX700, FEATURE_NONE},123 {{"kaveri"}, {"gfx700"}, GK_GFX700, FEATURE_NONE},124 {{"gfx701"}, {"gfx701"}, GK_GFX701, FEATURE_FAST_FMA_F32},125 {{"hawaii"}, {"gfx701"}, GK_GFX701, FEATURE_FAST_FMA_F32},126 {{"gfx702"}, {"gfx702"}, GK_GFX702, FEATURE_FAST_FMA_F32},127 {{"gfx703"}, {"gfx703"}, GK_GFX703, FEATURE_NONE},128 {{"kabini"}, {"gfx703"}, GK_GFX703, FEATURE_NONE},129 {{"mullins"}, {"gfx703"}, GK_GFX703, FEATURE_NONE},130 {{"gfx704"}, {"gfx704"}, GK_GFX704, FEATURE_NONE},131 {{"bonaire"}, {"gfx704"}, GK_GFX704, FEATURE_NONE},132 {{"gfx705"}, {"gfx705"}, GK_GFX705, FEATURE_NONE},133 {{"gfx801"}, {"gfx801"}, GK_GFX801, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},134 {{"carrizo"}, {"gfx801"}, GK_GFX801, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},135 {{"gfx802"}, {"gfx802"}, GK_GFX802, FEATURE_FAST_DENORMAL_F32},136 {{"iceland"}, {"gfx802"}, GK_GFX802, FEATURE_FAST_DENORMAL_F32},137 {{"tonga"}, {"gfx802"}, GK_GFX802, FEATURE_FAST_DENORMAL_F32},138 {{"gfx803"}, {"gfx803"}, GK_GFX803, FEATURE_FAST_DENORMAL_F32},139 {{"fiji"}, {"gfx803"}, GK_GFX803, FEATURE_FAST_DENORMAL_F32},140 {{"polaris10"}, {"gfx803"}, GK_GFX803, FEATURE_FAST_DENORMAL_F32},141 {{"polaris11"}, {"gfx803"}, GK_GFX803, FEATURE_FAST_DENORMAL_F32},142 {{"gfx805"}, {"gfx805"}, GK_GFX805, FEATURE_FAST_DENORMAL_F32},143 {{"tongapro"}, {"gfx805"}, GK_GFX805, FEATURE_FAST_DENORMAL_F32},144 {{"gfx810"}, {"gfx810"}, GK_GFX810, FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},145 {{"stoney"}, {"gfx810"}, GK_GFX810, FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},146 {{"gfx900"}, {"gfx900"}, GK_GFX900, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},147 {{"gfx902"}, {"gfx902"}, GK_GFX902, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},148 {{"gfx904"}, {"gfx904"}, GK_GFX904, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},149 {{"gfx906"}, {"gfx906"}, GK_GFX906, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},150 {{"gfx908"}, {"gfx908"}, GK_GFX908, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},151 {{"gfx909"}, {"gfx909"}, GK_GFX909, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},152 {{"gfx90a"}, {"gfx90a"}, GK_GFX90A, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},153 {{"gfx90c"}, {"gfx90c"}, GK_GFX90C, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},154 {{"gfx942"}, {"gfx942"}, GK_GFX942, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},155 {{"gfx950"}, {"gfx950"}, GK_GFX950, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},156 {{"gfx1010"}, {"gfx1010"}, GK_GFX1010, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},157 {{"gfx1011"}, {"gfx1011"}, GK_GFX1011, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},158 {{"gfx1012"}, {"gfx1012"}, GK_GFX1012, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},159 {{"gfx1013"}, {"gfx1013"}, GK_GFX1013, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},160 {{"gfx1030"}, {"gfx1030"}, GK_GFX1030, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},161 {{"gfx1031"}, {"gfx1031"}, GK_GFX1031, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},162 {{"gfx1032"}, {"gfx1032"}, GK_GFX1032, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},163 {{"gfx1033"}, {"gfx1033"}, GK_GFX1033, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},164 {{"gfx1034"}, {"gfx1034"}, GK_GFX1034, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},165 {{"gfx1035"}, {"gfx1035"}, GK_GFX1035, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},166 {{"gfx1036"}, {"gfx1036"}, GK_GFX1036, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},167 {{"gfx1100"}, {"gfx1100"}, GK_GFX1100, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},168 {{"gfx1101"}, {"gfx1101"}, GK_GFX1101, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},169 {{"gfx1102"}, {"gfx1102"}, GK_GFX1102, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},170 {{"gfx1103"}, {"gfx1103"}, GK_GFX1103, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},171 {{"gfx1150"}, {"gfx1150"}, GK_GFX1150, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},172 {{"gfx1151"}, {"gfx1151"}, GK_GFX1151, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},173 {{"gfx1152"}, {"gfx1152"}, GK_GFX1152, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},174 {{"gfx1153"}, {"gfx1153"}, GK_GFX1153, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},175 {{"gfx1200"}, {"gfx1200"}, GK_GFX1200, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},176 {{"gfx1201"}, {"gfx1201"}, GK_GFX1201, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},177 {{"gfx1250"}, {"gfx1250"}, GK_GFX1250, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK_ALWAYS},178 {{"gfx1251"}, {"gfx1251"}, GK_GFX1251, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK_ALWAYS},179 180 {{"gfx9-generic"}, {"gfx9-generic"}, GK_GFX9_GENERIC, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK},181 {{"gfx10-1-generic"}, {"gfx10-1-generic"}, GK_GFX10_1_GENERIC, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_XNACK|FEATURE_WGP},182 {{"gfx10-3-generic"}, {"gfx10-3-generic"}, GK_GFX10_3_GENERIC, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},183 {{"gfx11-generic"}, {"gfx11-generic"}, GK_GFX11_GENERIC, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},184 {{"gfx12-generic"}, {"gfx12-generic"}, GK_GFX12_GENERIC, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_WAVE32|FEATURE_WGP},185 {{"gfx9-4-generic"}, {"gfx9-4-generic"}, GK_GFX9_4_GENERIC, FEATURE_FAST_FMA_F32|FEATURE_FAST_DENORMAL_F32|FEATURE_XNACK|FEATURE_SRAMECC},186 // clang-format on187};188 189const GPUInfo *getArchEntry(AMDGPU::GPUKind AK, ArrayRef<GPUInfo> Table) {190 GPUInfo Search = { {""}, {""}, AK, AMDGPU::FEATURE_NONE };191 192 auto I =193 llvm::lower_bound(Table, Search, [](const GPUInfo &A, const GPUInfo &B) {194 return A.Kind < B.Kind;195 });196 197 if (I == Table.end() || I->Kind != Search.Kind)198 return nullptr;199 return I;200}201 202} // namespace203 204StringRef llvm::AMDGPU::getArchFamilyNameAMDGCN(GPUKind AK) {205 switch (AK) {206 case AMDGPU::GK_GFX9_GENERIC:207 case AMDGPU::GK_GFX9_4_GENERIC:208 return "gfx9";209 case AMDGPU::GK_GFX10_1_GENERIC:210 case AMDGPU::GK_GFX10_3_GENERIC:211 return "gfx10";212 case AMDGPU::GK_GFX11_GENERIC:213 return "gfx11";214 case AMDGPU::GK_GFX12_GENERIC:215 return "gfx12";216 default: {217 StringRef ArchName = getArchNameAMDGCN(AK);218 return ArchName.empty() ? "" : ArchName.drop_back(2);219 }220 }221}222 223StringRef llvm::AMDGPU::getArchNameAMDGCN(GPUKind AK) {224 if (const auto *Entry = getArchEntry(AK, AMDGCNGPUs))225 return Entry->CanonicalName;226 return "";227}228 229StringRef llvm::AMDGPU::getArchNameR600(GPUKind AK) {230 if (const auto *Entry = getArchEntry(AK, R600GPUs))231 return Entry->CanonicalName;232 return "";233}234 235AMDGPU::GPUKind llvm::AMDGPU::parseArchAMDGCN(StringRef CPU) {236 for (const auto &C : AMDGCNGPUs) {237 if (CPU == C.Name)238 return C.Kind;239 }240 241 return AMDGPU::GPUKind::GK_NONE;242}243 244AMDGPU::GPUKind llvm::AMDGPU::parseArchR600(StringRef CPU) {245 for (const auto &C : R600GPUs) {246 if (CPU == C.Name)247 return C.Kind;248 }249 250 return AMDGPU::GPUKind::GK_NONE;251}252 253unsigned AMDGPU::getArchAttrAMDGCN(GPUKind AK) {254 if (const auto *Entry = getArchEntry(AK, AMDGCNGPUs))255 return Entry->Features;256 return FEATURE_NONE;257}258 259unsigned AMDGPU::getArchAttrR600(GPUKind AK) {260 if (const auto *Entry = getArchEntry(AK, R600GPUs))261 return Entry->Features;262 return FEATURE_NONE;263}264 265void AMDGPU::fillValidArchListAMDGCN(SmallVectorImpl<StringRef> &Values) {266 // XXX: Should this only report unique canonical names?267 for (const auto &C : AMDGCNGPUs)268 Values.push_back(C.Name);269}270 271void AMDGPU::fillValidArchListR600(SmallVectorImpl<StringRef> &Values) {272 for (const auto &C : R600GPUs)273 Values.push_back(C.Name);274}275 276AMDGPU::IsaVersion AMDGPU::getIsaVersion(StringRef GPU) {277 AMDGPU::GPUKind AK = parseArchAMDGCN(GPU);278 if (AK == AMDGPU::GPUKind::GK_NONE) {279 if (GPU == "generic-hsa")280 return {7, 0, 0};281 if (GPU == "generic")282 return {6, 0, 0};283 return {0, 0, 0};284 }285 286 // clang-format off287 switch (AK) {288 case GK_GFX600: return {6, 0, 0};289 case GK_GFX601: return {6, 0, 1};290 case GK_GFX602: return {6, 0, 2};291 case GK_GFX700: return {7, 0, 0};292 case GK_GFX701: return {7, 0, 1};293 case GK_GFX702: return {7, 0, 2};294 case GK_GFX703: return {7, 0, 3};295 case GK_GFX704: return {7, 0, 4};296 case GK_GFX705: return {7, 0, 5};297 case GK_GFX801: return {8, 0, 1};298 case GK_GFX802: return {8, 0, 2};299 case GK_GFX803: return {8, 0, 3};300 case GK_GFX805: return {8, 0, 5};301 case GK_GFX810: return {8, 1, 0};302 case GK_GFX900: return {9, 0, 0};303 case GK_GFX902: return {9, 0, 2};304 case GK_GFX904: return {9, 0, 4};305 case GK_GFX906: return {9, 0, 6};306 case GK_GFX908: return {9, 0, 8};307 case GK_GFX909: return {9, 0, 9};308 case GK_GFX90A: return {9, 0, 10};309 case GK_GFX90C: return {9, 0, 12};310 case GK_GFX942: return {9, 4, 2};311 case GK_GFX950: return {9, 5, 0};312 case GK_GFX1010: return {10, 1, 0};313 case GK_GFX1011: return {10, 1, 1};314 case GK_GFX1012: return {10, 1, 2};315 case GK_GFX1013: return {10, 1, 3};316 case GK_GFX1030: return {10, 3, 0};317 case GK_GFX1031: return {10, 3, 1};318 case GK_GFX1032: return {10, 3, 2};319 case GK_GFX1033: return {10, 3, 3};320 case GK_GFX1034: return {10, 3, 4};321 case GK_GFX1035: return {10, 3, 5};322 case GK_GFX1036: return {10, 3, 6};323 case GK_GFX1100: return {11, 0, 0};324 case GK_GFX1101: return {11, 0, 1};325 case GK_GFX1102: return {11, 0, 2};326 case GK_GFX1103: return {11, 0, 3};327 case GK_GFX1150: return {11, 5, 0};328 case GK_GFX1151: return {11, 5, 1};329 case GK_GFX1152: return {11, 5, 2};330 case GK_GFX1153: return {11, 5, 3};331 case GK_GFX1200: return {12, 0, 0};332 case GK_GFX1201: return {12, 0, 1};333 case GK_GFX1250: return {12, 5, 0};334 case GK_GFX1251: return {12, 5, 1};335 336 // Generic targets return the lowest common denominator337 // within their family. That is, the ISA that is the most338 // restricted in terms of features.339 //340 // gfx9-generic is tricky because there is no lowest341 // common denominator, so we return gfx900 which has mad-mix342 // but this family doesn't have it.343 //344 // This API should never be used to check for a particular345 // feature anyway.346 //347 // TODO: Split up this API depending on its caller so348 // generic target handling is more obvious and less risky.349 case GK_GFX9_GENERIC: return {9, 0, 0};350 case GK_GFX9_4_GENERIC: return {9, 4, 0};351 case GK_GFX10_1_GENERIC: return {10, 1, 0};352 case GK_GFX10_3_GENERIC: return {10, 3, 0};353 case GK_GFX11_GENERIC: return {11, 0, 3};354 case GK_GFX12_GENERIC: return {12, 0, 0};355 default: return {0, 0, 0};356 }357 // clang-format on358}359 360StringRef AMDGPU::getCanonicalArchName(const Triple &T, StringRef Arch) {361 assert(T.isAMDGPU());362 auto ProcKind = T.isAMDGCN() ? parseArchAMDGCN(Arch) : parseArchR600(Arch);363 if (ProcKind == GK_NONE)364 return StringRef();365 366 return T.isAMDGCN() ? getArchNameAMDGCN(ProcKind) : getArchNameR600(ProcKind);367}368 369static std::pair<FeatureError, StringRef>370insertWaveSizeFeature(StringRef GPU, const Triple &T,371 const StringMap<bool> &DefaultFeatures,372 StringMap<bool> &Features) {373 const bool IsNullGPU = GPU.empty();374 const bool TargetHasWave32 = DefaultFeatures.count("wavefrontsize32");375 const bool TargetHasWave64 = DefaultFeatures.count("wavefrontsize64");376 const bool HaveWave32 = Features.count("wavefrontsize32");377 const bool HaveWave64 = Features.count("wavefrontsize64");378 if (HaveWave32 && HaveWave64)379 return {AMDGPU::INVALID_FEATURE_COMBINATION,380 "'wavefrontsize32' and 'wavefrontsize64' are mutually exclusive"};381 382 if (HaveWave32 && !IsNullGPU && TargetHasWave64)383 return {AMDGPU::UNSUPPORTED_TARGET_FEATURE, "wavefrontsize32"};384 385 if (HaveWave64 && !IsNullGPU && TargetHasWave32)386 return {AMDGPU::UNSUPPORTED_TARGET_FEATURE, "wavefrontsize64"};387 388 // Don't assume any wavesize with an unknown subtarget.389 // Default to wave32 if target supports both.390 if (!IsNullGPU && !HaveWave32 && !HaveWave64 && !TargetHasWave32 &&391 !TargetHasWave64)392 Features.insert(std::make_pair("wavefrontsize32", true));393 394 for (const auto &Entry : DefaultFeatures) {395 if (!Features.count(Entry.getKey()))396 Features[Entry.getKey()] = Entry.getValue();397 }398 399 return {NO_ERROR, StringRef()};400}401 402/// Fills Features map with default values for given target GPU.403/// \p Features contains overriding target features and this function returns404/// default target features with entries overridden by \p Features.405static void fillAMDGCNFeatureMap(StringRef GPU, const Triple &T,406 StringMap<bool> &Features) {407 AMDGPU::GPUKind Kind = parseArchAMDGCN(GPU);408 switch (Kind) {409 case GK_GFX1251:410 case GK_GFX1250:411 Features["ci-insts"] = true;412 Features["dot7-insts"] = true;413 Features["dot8-insts"] = true;414 Features["dl-insts"] = true;415 Features["16-bit-insts"] = true;416 Features["dpp"] = true;417 Features["gfx8-insts"] = true;418 Features["gfx9-insts"] = true;419 Features["gfx10-insts"] = true;420 Features["gfx10-3-insts"] = true;421 Features["gfx11-insts"] = true;422 Features["gfx12-insts"] = true;423 Features["gfx1250-insts"] = true;424 Features["bitop3-insts"] = true;425 Features["prng-inst"] = true;426 Features["tanh-insts"] = true;427 Features["tensor-cvt-lut-insts"] = true;428 Features["transpose-load-f4f6-insts"] = true;429 Features["bf16-trans-insts"] = true;430 Features["bf16-cvt-insts"] = true;431 Features["bf16-pk-insts"] = true;432 Features["fp8-conversion-insts"] = true;433 Features["fp8e5m3-insts"] = true;434 Features["permlane16-swap"] = true;435 Features["ashr-pk-insts"] = true;436 Features["add-min-max-insts"] = true;437 Features["pk-add-min-max-insts"] = true;438 Features["atomic-buffer-pk-add-bf16-inst"] = true;439 Features["vmem-pref-insts"] = true;440 Features["atomic-fadd-rtn-insts"] = true;441 Features["atomic-buffer-global-pk-add-f16-insts"] = true;442 Features["atomic-flat-pk-add-16-insts"] = true;443 Features["atomic-global-pk-add-bf16-inst"] = true;444 Features["atomic-ds-pk-add-16-insts"] = true;445 Features["setprio-inc-wg-inst"] = true;446 Features["atomic-fmin-fmax-global-f32"] = true;447 Features["atomic-fmin-fmax-global-f64"] = true;448 Features["wavefrontsize32"] = true;449 Features["clusters"] = true;450 Features["cube-insts"] = true;451 Features["lerp-inst"] = true;452 Features["sad-insts"] = true;453 Features["qsad-insts"] = true;454 Features["cvt-pknorm-vop2-insts"] = true;455 break;456 case GK_GFX1201:457 case GK_GFX1200:458 case GK_GFX12_GENERIC:459 Features["ci-insts"] = true;460 Features["dot7-insts"] = true;461 Features["dot8-insts"] = true;462 Features["dot9-insts"] = true;463 Features["dot10-insts"] = true;464 Features["dot11-insts"] = true;465 Features["dot12-insts"] = true;466 Features["dl-insts"] = true;467 Features["atomic-ds-pk-add-16-insts"] = true;468 Features["atomic-flat-pk-add-16-insts"] = true;469 Features["atomic-buffer-global-pk-add-f16-insts"] = true;470 Features["atomic-buffer-pk-add-bf16-inst"] = true;471 Features["atomic-global-pk-add-bf16-inst"] = true;472 Features["16-bit-insts"] = true;473 Features["dpp"] = true;474 Features["gfx8-insts"] = true;475 Features["gfx9-insts"] = true;476 Features["gfx10-insts"] = true;477 Features["gfx10-3-insts"] = true;478 Features["gfx11-insts"] = true;479 Features["gfx12-insts"] = true;480 Features["atomic-fadd-rtn-insts"] = true;481 Features["image-insts"] = true;482 Features["cube-insts"] = true;483 Features["lerp-inst"] = true;484 Features["sad-insts"] = true;485 Features["qsad-insts"] = true;486 Features["cvt-pknorm-vop2-insts"] = true;487 Features["fp8-conversion-insts"] = true;488 Features["atomic-fmin-fmax-global-f32"] = true;489 break;490 case GK_GFX1153:491 case GK_GFX1152:492 case GK_GFX1151:493 case GK_GFX1150:494 case GK_GFX1103:495 case GK_GFX1102:496 case GK_GFX1101:497 case GK_GFX1100:498 case GK_GFX11_GENERIC:499 Features["ci-insts"] = true;500 Features["dot5-insts"] = true;501 Features["dot7-insts"] = true;502 Features["dot8-insts"] = true;503 Features["dot9-insts"] = true;504 Features["dot10-insts"] = true;505 Features["dot12-insts"] = true;506 Features["dl-insts"] = true;507 Features["16-bit-insts"] = true;508 Features["dpp"] = true;509 Features["gfx8-insts"] = true;510 Features["gfx9-insts"] = true;511 Features["gfx10-insts"] = true;512 Features["gfx10-3-insts"] = true;513 Features["gfx11-insts"] = true;514 Features["atomic-fadd-rtn-insts"] = true;515 Features["image-insts"] = true;516 Features["cube-insts"] = true;517 Features["lerp-inst"] = true;518 Features["sad-insts"] = true;519 Features["qsad-insts"] = true;520 Features["cvt-pknorm-vop2-insts"] = true;521 Features["gws"] = true;522 Features["atomic-fmin-fmax-global-f32"] = true;523 break;524 case GK_GFX1036:525 case GK_GFX1035:526 case GK_GFX1034:527 case GK_GFX1033:528 case GK_GFX1032:529 case GK_GFX1031:530 case GK_GFX1030:531 case GK_GFX10_3_GENERIC:532 Features["ci-insts"] = true;533 Features["dot1-insts"] = true;534 Features["dot2-insts"] = true;535 Features["dot5-insts"] = true;536 Features["dot6-insts"] = true;537 Features["dot7-insts"] = true;538 Features["dot10-insts"] = true;539 Features["dl-insts"] = true;540 Features["16-bit-insts"] = true;541 Features["dpp"] = true;542 Features["gfx8-insts"] = true;543 Features["gfx9-insts"] = true;544 Features["gfx10-insts"] = true;545 Features["gfx10-3-insts"] = true;546 Features["image-insts"] = true;547 Features["s-memrealtime"] = true;548 Features["s-memtime-inst"] = true;549 Features["gws"] = true;550 Features["vmem-to-lds-load-insts"] = true;551 Features["atomic-fmin-fmax-global-f32"] = true;552 Features["atomic-fmin-fmax-global-f64"] = true;553 Features["cube-insts"] = true;554 Features["lerp-inst"] = true;555 Features["sad-insts"] = true;556 Features["qsad-insts"] = true;557 Features["cvt-pknorm-vop2-insts"] = true;558 break;559 case GK_GFX1012:560 case GK_GFX1011:561 Features["dot1-insts"] = true;562 Features["dot2-insts"] = true;563 Features["dot5-insts"] = true;564 Features["dot6-insts"] = true;565 Features["dot7-insts"] = true;566 Features["dot10-insts"] = true;567 [[fallthrough]];568 case GK_GFX1013:569 case GK_GFX1010:570 case GK_GFX10_1_GENERIC:571 Features["dl-insts"] = true;572 Features["ci-insts"] = true;573 Features["16-bit-insts"] = true;574 Features["dpp"] = true;575 Features["gfx8-insts"] = true;576 Features["gfx9-insts"] = true;577 Features["gfx10-insts"] = true;578 Features["image-insts"] = true;579 Features["s-memrealtime"] = true;580 Features["s-memtime-inst"] = true;581 Features["gws"] = true;582 Features["vmem-to-lds-load-insts"] = true;583 Features["atomic-fmin-fmax-global-f32"] = true;584 Features["atomic-fmin-fmax-global-f64"] = true;585 Features["cube-insts"] = true;586 Features["lerp-inst"] = true;587 Features["sad-insts"] = true;588 Features["qsad-insts"] = true;589 Features["cvt-pknorm-vop2-insts"] = true;590 break;591 case GK_GFX950:592 Features["bitop3-insts"] = true;593 Features["fp6bf6-cvt-scale-insts"] = true;594 Features["fp4-cvt-scale-insts"] = true;595 Features["bf8-cvt-scale-insts"] = true;596 Features["fp8-cvt-scale-insts"] = true;597 Features["f16bf16-to-fp6bf6-cvt-scale-insts"] = true;598 Features["f32-to-f16bf16-cvt-sr-insts"] = true;599 Features["prng-inst"] = true;600 Features["permlane16-swap"] = true;601 Features["permlane32-swap"] = true;602 Features["ashr-pk-insts"] = true;603 Features["dot12-insts"] = true;604 Features["dot13-insts"] = true;605 Features["atomic-buffer-pk-add-bf16-inst"] = true;606 Features["gfx950-insts"] = true;607 [[fallthrough]];608 case GK_GFX942:609 Features["fp8-insts"] = true;610 Features["fp8-conversion-insts"] = true;611 if (Kind != GK_GFX950)612 Features["xf32-insts"] = true;613 [[fallthrough]];614 case GK_GFX9_4_GENERIC:615 Features["gfx940-insts"] = true;616 Features["atomic-ds-pk-add-16-insts"] = true;617 Features["atomic-flat-pk-add-16-insts"] = true;618 Features["atomic-global-pk-add-bf16-inst"] = true;619 Features["gfx90a-insts"] = true;620 Features["atomic-buffer-global-pk-add-f16-insts"] = true;621 Features["atomic-fadd-rtn-insts"] = true;622 Features["dot3-insts"] = true;623 Features["dot4-insts"] = true;624 Features["dot5-insts"] = true;625 Features["dot6-insts"] = true;626 Features["mai-insts"] = true;627 Features["dl-insts"] = true;628 Features["dot1-insts"] = true;629 Features["dot2-insts"] = true;630 Features["dot7-insts"] = true;631 Features["dot10-insts"] = true;632 Features["gfx9-insts"] = true;633 Features["gfx8-insts"] = true;634 Features["16-bit-insts"] = true;635 Features["dpp"] = true;636 Features["s-memrealtime"] = true;637 Features["ci-insts"] = true;638 Features["s-memtime-inst"] = true;639 Features["gws"] = true;640 Features["vmem-to-lds-load-insts"] = true;641 Features["atomic-fmin-fmax-global-f64"] = true;642 Features["wavefrontsize64"] = true;643 Features["cube-insts"] = true;644 Features["lerp-inst"] = true;645 Features["sad-insts"] = true;646 Features["qsad-insts"] = true;647 Features["cvt-pknorm-vop2-insts"] = true;648 break;649 case GK_GFX90A:650 Features["gfx90a-insts"] = true;651 Features["atomic-buffer-global-pk-add-f16-insts"] = true;652 Features["atomic-fadd-rtn-insts"] = true;653 Features["atomic-fmin-fmax-global-f64"] = true;654 [[fallthrough]];655 case GK_GFX908:656 Features["dot3-insts"] = true;657 Features["dot4-insts"] = true;658 Features["dot5-insts"] = true;659 Features["dot6-insts"] = true;660 Features["mai-insts"] = true;661 [[fallthrough]];662 case GK_GFX906:663 Features["dl-insts"] = true;664 Features["dot1-insts"] = true;665 Features["dot2-insts"] = true;666 Features["dot7-insts"] = true;667 Features["dot10-insts"] = true;668 [[fallthrough]];669 case GK_GFX90C:670 case GK_GFX909:671 case GK_GFX904:672 case GK_GFX902:673 case GK_GFX900:674 case GK_GFX9_GENERIC:675 Features["gfx9-insts"] = true;676 Features["vmem-to-lds-load-insts"] = true;677 [[fallthrough]];678 case GK_GFX810:679 case GK_GFX805:680 case GK_GFX803:681 case GK_GFX802:682 case GK_GFX801:683 Features["gfx8-insts"] = true;684 Features["16-bit-insts"] = true;685 Features["dpp"] = true;686 Features["s-memrealtime"] = true;687 Features["ci-insts"] = true;688 Features["image-insts"] = true;689 Features["s-memtime-inst"] = true;690 Features["gws"] = true;691 Features["wavefrontsize64"] = true;692 Features["cube-insts"] = true;693 Features["lerp-inst"] = true;694 Features["sad-insts"] = true;695 Features["qsad-insts"] = true;696 Features["cvt-pknorm-vop2-insts"] = true;697 break;698 case GK_GFX705:699 case GK_GFX704:700 case GK_GFX703:701 case GK_GFX702:702 case GK_GFX701:703 case GK_GFX700:704 Features["ci-insts"] = true;705 Features["cube-insts"] = true;706 Features["lerp-inst"] = true;707 Features["sad-insts"] = true;708 Features["qsad-insts"] = true;709 Features["cvt-pknorm-vop2-insts"] = true;710 Features["image-insts"] = true;711 Features["s-memtime-inst"] = true;712 Features["gws"] = true;713 Features["atomic-fmin-fmax-global-f32"] = true;714 Features["atomic-fmin-fmax-global-f64"] = true;715 Features["wavefrontsize64"] = true;716 break;717 case GK_GFX602:718 case GK_GFX601:719 case GK_GFX600:720 Features["image-insts"] = true;721 Features["s-memtime-inst"] = true;722 Features["gws"] = true;723 Features["atomic-fmin-fmax-global-f32"] = true;724 Features["atomic-fmin-fmax-global-f64"] = true;725 Features["wavefrontsize64"] = true;726 Features["cube-insts"] = true;727 Features["lerp-inst"] = true;728 Features["sad-insts"] = true;729 Features["cvt-pknorm-vop2-insts"] = true;730 break;731 case GK_NONE:732 break;733 default:734 llvm_unreachable("Unhandled GPU!");735 }736}737 738/// Fills Features map with default values for given target GPU.739/// \p Features contains overriding target features and this function returns740/// default target features with entries overridden by \p Features.741std::pair<FeatureError, StringRef>742AMDGPU::fillAMDGPUFeatureMap(StringRef GPU, const Triple &T,743 StringMap<bool> &Features) {744 // XXX - What does the member GPU mean if device name string passed here?745 if (T.isSPIRV() && T.getOS() == Triple::OSType::AMDHSA) {746 // AMDGCN SPIRV must support the union of all AMDGCN features. This list747 // should be kept in sorted order and updated whenever new features are748 // added.749 Features["16-bit-insts"] = true;750 Features["ashr-pk-insts"] = true;751 Features["atomic-buffer-pk-add-bf16-inst"] = true;752 Features["atomic-buffer-global-pk-add-f16-insts"] = true;753 Features["atomic-ds-pk-add-16-insts"] = true;754 Features["atomic-fadd-rtn-insts"] = true;755 Features["atomic-flat-pk-add-16-insts"] = true;756 Features["atomic-global-pk-add-bf16-inst"] = true;757 Features["bf16-trans-insts"] = true;758 Features["bf16-cvt-insts"] = true;759 Features["bf8-cvt-scale-insts"] = true;760 Features["bitop3-insts"] = true;761 Features["ci-insts"] = true;762 Features["dl-insts"] = true;763 Features["dot1-insts"] = true;764 Features["dot2-insts"] = true;765 Features["dot3-insts"] = true;766 Features["dot4-insts"] = true;767 Features["dot5-insts"] = true;768 Features["dot6-insts"] = true;769 Features["dot7-insts"] = true;770 Features["dot8-insts"] = true;771 Features["dot9-insts"] = true;772 Features["dot10-insts"] = true;773 Features["dot11-insts"] = true;774 Features["dot12-insts"] = true;775 Features["dot13-insts"] = true;776 Features["dpp"] = true;777 Features["f16bf16-to-fp6bf6-cvt-scale-insts"] = true;778 Features["f32-to-f16bf16-cvt-sr-insts"] = true;779 Features["fp4-cvt-scale-insts"] = true;780 Features["fp6bf6-cvt-scale-insts"] = true;781 Features["fp8e5m3-insts"] = true;782 Features["fp8-conversion-insts"] = true;783 Features["fp8-cvt-scale-insts"] = true;784 Features["fp8-insts"] = true;785 Features["gfx8-insts"] = true;786 Features["gfx9-insts"] = true;787 Features["gfx90a-insts"] = true;788 Features["gfx940-insts"] = true;789 Features["gfx950-insts"] = true;790 Features["gfx10-insts"] = true;791 Features["gfx10-3-insts"] = true;792 Features["gfx11-insts"] = true;793 Features["gfx12-insts"] = true;794 Features["gfx1250-insts"] = true;795 Features["gws"] = true;796 Features["image-insts"] = true;797 Features["mai-insts"] = true;798 Features["permlane16-swap"] = true;799 Features["permlane32-swap"] = true;800 Features["prng-inst"] = true;801 Features["setprio-inc-wg-inst"] = true;802 Features["s-memrealtime"] = true;803 Features["s-memtime-inst"] = true;804 Features["tanh-insts"] = true;805 Features["tensor-cvt-lut-insts"] = true;806 Features["transpose-load-f4f6-insts"] = true;807 Features["vmem-pref-insts"] = true;808 Features["vmem-to-lds-load-insts"] = true;809 Features["wavefrontsize32"] = true;810 Features["wavefrontsize64"] = true;811 } else if (T.isAMDGCN()) {812 StringMap<bool> DefaultFeatures;813 fillAMDGCNFeatureMap(GPU, T, DefaultFeatures);814 return insertWaveSizeFeature(GPU, T, DefaultFeatures, Features);815 } else {816 if (GPU.empty())817 GPU = "r600";818 819 switch (llvm::AMDGPU::parseArchR600(GPU)) {820 case GK_CAYMAN:821 case GK_CYPRESS:822 case GK_RV770:823 case GK_RV670:824 // TODO: Add fp64 when implemented.825 break;826 case GK_TURKS:827 case GK_CAICOS:828 case GK_BARTS:829 case GK_SUMO:830 case GK_REDWOOD:831 case GK_JUNIPER:832 case GK_CEDAR:833 case GK_RV730:834 case GK_RV710:835 case GK_RS880:836 case GK_R630:837 case GK_R600:838 break;839 default:840 llvm_unreachable("Unhandled GPU!");841 }842 }843 return {NO_ERROR, StringRef()};844}845