| //===-- SPIRVBaseInfo.h - Top level SPIRV definitions -----------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file contains TableGen generated enum definitions, mnemonic lookup |
| // functions, versioning/capabilities/extensions getters for symbolic/named |
| // operands for various SPIR-V instructions. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_LIB_TARGET_SPIRV_SPIRVSYMBOLICOPERANDS_H |
| #define LLVM_LIB_TARGET_SPIRV_SPIRVSYMBOLICOPERANDS_H |
| |
| #include "llvm/ADT/SmallVector.h" |
| #include "llvm/ADT/StringRef.h" |
| #include <string> |
| |
| namespace llvm { |
| namespace SPIRV { |
| namespace OperandCategory { |
| #define GET_OperandCategory_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace OperandCategory |
| |
| namespace Extension { |
| #define GET_Extension_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace Extension |
| |
| namespace Capability { |
| #define GET_Capability_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace Capability |
| |
| namespace SourceLanguage { |
| #define GET_SourceLanguage_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace SourceLanguage |
| |
| namespace AddressingModel { |
| #define GET_AddressingModel_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace AddressingModel |
| |
| namespace ExecutionModel { |
| #define GET_ExecutionModel_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace ExecutionModel |
| |
| namespace MemoryModel { |
| #define GET_MemoryModel_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace MemoryModel |
| |
| namespace ExecutionMode { |
| #define GET_ExecutionMode_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace ExecutionMode |
| |
| namespace StorageClass { |
| #define GET_StorageClass_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace StorageClass |
| |
| namespace Dim { |
| #define GET_Dim_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace Dim |
| |
| namespace SamplerAddressingMode { |
| #define GET_SamplerAddressingMode_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace SamplerAddressingMode |
| |
| namespace SamplerFilterMode { |
| #define GET_SamplerFilterMode_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace SamplerFilterMode |
| |
| namespace ImageFormat { |
| #define GET_ImageFormat_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace ImageFormat |
| |
| namespace ImageChannelOrder { |
| #define GET_ImageChannelOrder_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace ImageChannelOrder |
| |
| namespace ImageChannelDataType { |
| #define GET_ImageChannelDataType_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace ImageChannelDataType |
| |
| namespace ImageOperand { |
| #define GET_ImageOperand_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace ImageOperand |
| |
| namespace FPFastMathMode { |
| #define GET_FPFastMathMode_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace FPFastMathMode |
| |
| namespace FPRoundingMode { |
| #define GET_FPRoundingMode_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace FPRoundingMode |
| |
| namespace LinkageType { |
| #define GET_LinkageType_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace LinkageType |
| |
| namespace AccessQualifier { |
| #define GET_AccessQualifier_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace AccessQualifier |
| |
| namespace FunctionParameterAttribute { |
| #define GET_FunctionParameterAttribute_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace FunctionParameterAttribute |
| |
| namespace Decoration { |
| #define GET_Decoration_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace Decoration |
| |
| namespace BuiltIn { |
| #define GET_BuiltIn_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace BuiltIn |
| |
| namespace SelectionControl { |
| #define GET_SelectionControl_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace SelectionControl |
| |
| namespace LoopControl { |
| #define GET_LoopControl_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace LoopControl |
| |
| namespace FunctionControl { |
| #define GET_FunctionControl_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace FunctionControl |
| |
| namespace MemorySemantics { |
| #define GET_MemorySemantics_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace MemorySemantics |
| |
| namespace MemoryOperand { |
| #define GET_MemoryOperand_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace MemoryOperand |
| |
| namespace Scope { |
| #define GET_Scope_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace Scope |
| |
| namespace GroupOperation { |
| #define GET_GroupOperation_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace GroupOperation |
| |
| namespace KernelEnqueueFlags { |
| #define GET_KernelEnqueueFlags_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace KernelEnqueueFlags |
| |
| namespace KernelProfilingInfo { |
| #define GET_KernelProfilingInfo_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace KernelProfilingInfo |
| |
| namespace InstructionSet { |
| #define GET_InstructionSet_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace InstructionSet |
| |
| namespace OpenCLExtInst { |
| #define GET_OpenCLExtInst_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace OpenCLExtInst |
| |
| namespace GLSLExtInst { |
| #define GET_GLSLExtInst_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace GLSLExtInst |
| |
| namespace Opcode { |
| #define GET_Opcode_DECL |
| #include "SPIRVGenTables.inc" |
| } // namespace Opcode |
| |
| struct ExtendedBuiltin { |
| StringRef Name; |
| InstructionSet::InstructionSet Set; |
| uint32_t Number; |
| }; |
| } // namespace SPIRV |
| |
| using CapabilityList = SmallVector<SPIRV::Capability::Capability, 8>; |
| using ExtensionList = SmallVector<SPIRV::Extension::Extension, 8>; |
| |
| std::string |
| getSymbolicOperandMnemonic(SPIRV::OperandCategory::OperandCategory Category, |
| int32_t Value); |
| uint32_t |
| getSymbolicOperandMinVersion(SPIRV::OperandCategory::OperandCategory Category, |
| uint32_t Value); |
| uint32_t |
| getSymbolicOperandMaxVersion(SPIRV::OperandCategory::OperandCategory Category, |
| uint32_t Value); |
| CapabilityList |
| getSymbolicOperandCapabilities(SPIRV::OperandCategory::OperandCategory Category, |
| uint32_t Value); |
| ExtensionList |
| getSymbolicOperandExtensions(SPIRV::OperandCategory::OperandCategory Category, |
| uint32_t Value); |
| std::string getLinkStringForBuiltIn(SPIRV::BuiltIn::BuiltIn BuiltInValue); |
| |
| bool getSpirvBuiltInIdByName(StringRef Name, SPIRV::BuiltIn::BuiltIn &BI); |
| |
| std::string getExtInstSetName(SPIRV::InstructionSet::InstructionSet Set); |
| SPIRV::InstructionSet::InstructionSet |
| getExtInstSetFromString(std::string SetName); |
| std::string getExtInstName(SPIRV::InstructionSet::InstructionSet Set, |
| uint32_t InstructionNumber); |
| |
| // Return a string representation of the operands from startIndex onwards. |
| // Templated to allow both MachineInstr and MCInst to use the same logic. |
| template <class InstType> |
| std::string getSPIRVStringOperand(const InstType &MI, unsigned StartIndex) { |
| std::string s; // Iteratively append to this string. |
| |
| const unsigned NumOps = MI.getNumOperands(); |
| bool IsFinished = false; |
| for (unsigned i = StartIndex; i < NumOps && !IsFinished; ++i) { |
| const auto &Op = MI.getOperand(i); |
| if (!Op.isImm()) // Stop if we hit a register operand. |
| break; |
| assert((Op.getImm() >> 32) == 0 && "Imm operand should be i32 word"); |
| const uint32_t Imm = Op.getImm(); // Each i32 word is up to 4 characters. |
| for (unsigned ShiftAmount = 0; ShiftAmount < 32; ShiftAmount += 8) { |
| char c = (Imm >> ShiftAmount) & 0xff; |
| if (c == 0) { // Stop if we hit a null-terminator character. |
| IsFinished = true; |
| break; |
| } |
| s += c; // Otherwise, append the character to the result string. |
| } |
| } |
| return s; |
| } |
| } // namespace llvm |
| #endif // LLVM_LIB_TARGET_SPIRV_SPIRVSYMBOLICOPERANDS_H |