Path: blob/main/contrib/llvm-project/llvm/lib/Target/SPIRV/MCTargetDesc/SPIRVBaseInfo.cpp
35294 views
//===-- SPIRVBaseInfo.cpp - Top level SPIRV definitions ---------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file contains the implementation for helper mnemonic lookup functions,9// versioning/capabilities/extensions getters for symbolic/named operands used10// in various SPIR-V instructions.11//12//===----------------------------------------------------------------------===//1314#include "SPIRVBaseInfo.h"15#include "llvm/ADT/ArrayRef.h"16#include "llvm/ADT/StringRef.h"1718namespace llvm {19namespace SPIRV {20struct SymbolicOperand {21OperandCategory::OperandCategory Category;22uint32_t Value;23StringRef Mnemonic;24uint32_t MinVersion;25uint32_t MaxVersion;26};2728struct ExtensionEntry {29OperandCategory::OperandCategory Category;30uint32_t Value;31Extension::Extension ReqExtension;32};3334struct CapabilityEntry {35OperandCategory::OperandCategory Category;36uint32_t Value;37Capability::Capability ReqCapability;38};3940using namespace OperandCategory;41using namespace Extension;42using namespace Capability;43using namespace InstructionSet;44#define GET_SymbolicOperands_DECL45#define GET_SymbolicOperands_IMPL46#define GET_ExtensionEntries_DECL47#define GET_ExtensionEntries_IMPL48#define GET_CapabilityEntries_DECL49#define GET_CapabilityEntries_IMPL50#define GET_ExtendedBuiltins_DECL51#define GET_ExtendedBuiltins_IMPL52#include "SPIRVGenTables.inc"53} // namespace SPIRV5455std::string56getSymbolicOperandMnemonic(SPIRV::OperandCategory::OperandCategory Category,57int32_t Value) {58const SPIRV::SymbolicOperand *Lookup =59SPIRV::lookupSymbolicOperandByCategoryAndValue(Category, Value);60// Value that encodes just one enum value.61if (Lookup)62return Lookup->Mnemonic.str();63if (Category != SPIRV::OperandCategory::ImageOperandOperand &&64Category != SPIRV::OperandCategory::FPFastMathModeOperand &&65Category != SPIRV::OperandCategory::SelectionControlOperand &&66Category != SPIRV::OperandCategory::LoopControlOperand &&67Category != SPIRV::OperandCategory::FunctionControlOperand &&68Category != SPIRV::OperandCategory::MemorySemanticsOperand &&69Category != SPIRV::OperandCategory::MemoryOperandOperand &&70Category != SPIRV::OperandCategory::KernelProfilingInfoOperand)71return "UNKNOWN";72// Value that encodes many enum values (one bit per enum value).73std::string Name;74std::string Separator;75const SPIRV::SymbolicOperand *EnumValueInCategory =76SPIRV::lookupSymbolicOperandByCategory(Category);7778while (EnumValueInCategory && EnumValueInCategory->Category == Category) {79if ((EnumValueInCategory->Value != 0) &&80(Value & EnumValueInCategory->Value)) {81Name += Separator + EnumValueInCategory->Mnemonic.str();82Separator = "|";83}84++EnumValueInCategory;85}8687return Name;88}8990VersionTuple91getSymbolicOperandMinVersion(SPIRV::OperandCategory::OperandCategory Category,92uint32_t Value) {93const SPIRV::SymbolicOperand *Lookup =94SPIRV::lookupSymbolicOperandByCategoryAndValue(Category, Value);9596if (Lookup)97return VersionTuple(Lookup->MinVersion / 10, Lookup->MinVersion % 10);9899return VersionTuple(0);100}101102VersionTuple103getSymbolicOperandMaxVersion(SPIRV::OperandCategory::OperandCategory Category,104uint32_t Value) {105const SPIRV::SymbolicOperand *Lookup =106SPIRV::lookupSymbolicOperandByCategoryAndValue(Category, Value);107108if (Lookup)109return VersionTuple(Lookup->MaxVersion / 10, Lookup->MaxVersion % 10);110111return VersionTuple();112}113114CapabilityList115getSymbolicOperandCapabilities(SPIRV::OperandCategory::OperandCategory Category,116uint32_t Value) {117const SPIRV::CapabilityEntry *Capability =118SPIRV::lookupCapabilityByCategoryAndValue(Category, Value);119120CapabilityList Capabilities;121while (Capability && Capability->Category == Category &&122Capability->Value == Value) {123Capabilities.push_back(124static_cast<SPIRV::Capability::Capability>(Capability->ReqCapability));125++Capability;126}127128return Capabilities;129}130131CapabilityList132getCapabilitiesEnabledByExtension(SPIRV::Extension::Extension Extension) {133const SPIRV::ExtensionEntry *Entry =134SPIRV::lookupSymbolicOperandsEnabledByExtension(135Extension, SPIRV::OperandCategory::CapabilityOperand);136137CapabilityList Capabilities;138while (Entry &&139Entry->Category == SPIRV::OperandCategory::CapabilityOperand &&140Entry->ReqExtension == Extension) {141Capabilities.push_back(142static_cast<SPIRV::Capability::Capability>(Entry->Value));143++Entry;144}145146return Capabilities;147}148149ExtensionList150getSymbolicOperandExtensions(SPIRV::OperandCategory::OperandCategory Category,151uint32_t Value) {152const SPIRV::ExtensionEntry *Extension =153SPIRV::lookupExtensionByCategoryAndValue(Category, Value);154155ExtensionList Extensions;156while (Extension && Extension->Category == Category &&157Extension->Value == Value) {158Extensions.push_back(159static_cast<SPIRV::Extension::Extension>(Extension->ReqExtension));160++Extension;161}162163return Extensions;164}165166std::string getLinkStringForBuiltIn(SPIRV::BuiltIn::BuiltIn BuiltInValue) {167const SPIRV::SymbolicOperand *Lookup =168SPIRV::lookupSymbolicOperandByCategoryAndValue(169SPIRV::OperandCategory::BuiltInOperand, BuiltInValue);170171if (Lookup)172return "__spirv_BuiltIn" + Lookup->Mnemonic.str();173return "UNKNOWN_BUILTIN";174}175176bool getSpirvBuiltInIdByName(llvm::StringRef Name,177SPIRV::BuiltIn::BuiltIn &BI) {178const std::string Prefix = "__spirv_BuiltIn";179if (!Name.starts_with(Prefix))180return false;181182const SPIRV::SymbolicOperand *Lookup =183SPIRV::lookupSymbolicOperandByCategoryAndMnemonic(184SPIRV::OperandCategory::BuiltInOperand,185Name.drop_front(Prefix.length()));186187if (!Lookup)188return false;189190BI = static_cast<SPIRV::BuiltIn::BuiltIn>(Lookup->Value);191return true;192}193194std::string getExtInstSetName(SPIRV::InstructionSet::InstructionSet Set) {195switch (Set) {196case SPIRV::InstructionSet::OpenCL_std:197return "OpenCL.std";198case SPIRV::InstructionSet::GLSL_std_450:199return "GLSL.std.450";200case SPIRV::InstructionSet::NonSemantic_Shader_DebugInfo_100:201return "NonSemantic.Shader.DebugInfo.100";202case SPIRV::InstructionSet::SPV_AMD_shader_trinary_minmax:203return "SPV_AMD_shader_trinary_minmax";204}205return "UNKNOWN_EXT_INST_SET";206}207208SPIRV::InstructionSet::InstructionSet209getExtInstSetFromString(std::string SetName) {210for (auto Set :211{SPIRV::InstructionSet::GLSL_std_450, SPIRV::InstructionSet::OpenCL_std,212SPIRV::InstructionSet::NonSemantic_Shader_DebugInfo_100}) {213if (SetName == getExtInstSetName(Set))214return Set;215}216llvm_unreachable("UNKNOWN_EXT_INST_SET");217}218219std::string getExtInstName(SPIRV::InstructionSet::InstructionSet Set,220uint32_t InstructionNumber) {221const SPIRV::ExtendedBuiltin *Lookup =222SPIRV::lookupExtendedBuiltinBySetAndNumber(Set, InstructionNumber);223224if (!Lookup)225return "UNKNOWN_EXT_INST";226227return Lookup->Name.str();228}229} // namespace llvm230231232