1bdd1243dSDimitry Andric //===-- SPIRVBaseInfo.h - Top level SPIRV definitions -----------*- C++ -*-===// 281ad6265SDimitry Andric // 381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 681ad6265SDimitry Andric // 781ad6265SDimitry Andric //===----------------------------------------------------------------------===// 881ad6265SDimitry Andric // 9bdd1243dSDimitry Andric // This file contains TableGen generated enum definitions, mnemonic lookup 10bdd1243dSDimitry Andric // functions, versioning/capabilities/extensions getters for symbolic/named 11bdd1243dSDimitry Andric // operands for various SPIR-V instructions. 1281ad6265SDimitry Andric // 1381ad6265SDimitry Andric //===----------------------------------------------------------------------===// 1481ad6265SDimitry Andric 15bdd1243dSDimitry Andric #ifndef LLVM_LIB_TARGET_SPIRV_SPIRVSYMBOLICOPERANDS_H 16bdd1243dSDimitry Andric #define LLVM_LIB_TARGET_SPIRV_SPIRVSYMBOLICOPERANDS_H 1781ad6265SDimitry Andric 18bdd1243dSDimitry Andric #include "llvm/ADT/SmallVector.h" 1981ad6265SDimitry Andric #include "llvm/ADT/StringRef.h" 2081ad6265SDimitry Andric #include <string> 2181ad6265SDimitry Andric 2281ad6265SDimitry Andric namespace llvm { 2381ad6265SDimitry Andric namespace SPIRV { 24bdd1243dSDimitry Andric namespace OperandCategory { 25bdd1243dSDimitry Andric #define GET_OperandCategory_DECL 26bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 27bdd1243dSDimitry Andric } // namespace OperandCategory 2881ad6265SDimitry Andric 29bdd1243dSDimitry Andric namespace Extension { 30bdd1243dSDimitry Andric #define GET_Extension_DECL 31bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 32bdd1243dSDimitry Andric } // namespace Extension 3381ad6265SDimitry Andric 34bdd1243dSDimitry Andric namespace Capability { 35bdd1243dSDimitry Andric #define GET_Capability_DECL 36bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 37bdd1243dSDimitry Andric } // namespace Capability 3881ad6265SDimitry Andric 39bdd1243dSDimitry Andric namespace SourceLanguage { 40bdd1243dSDimitry Andric #define GET_SourceLanguage_DECL 41bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 42bdd1243dSDimitry Andric } // namespace SourceLanguage 4381ad6265SDimitry Andric 44bdd1243dSDimitry Andric namespace AddressingModel { 45bdd1243dSDimitry Andric #define GET_AddressingModel_DECL 46bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 47bdd1243dSDimitry Andric } // namespace AddressingModel 4881ad6265SDimitry Andric 49bdd1243dSDimitry Andric namespace ExecutionModel { 50bdd1243dSDimitry Andric #define GET_ExecutionModel_DECL 51bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 52bdd1243dSDimitry Andric } // namespace ExecutionModel 5381ad6265SDimitry Andric 54bdd1243dSDimitry Andric namespace MemoryModel { 55bdd1243dSDimitry Andric #define GET_MemoryModel_DECL 56bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 57bdd1243dSDimitry Andric } // namespace MemoryModel 5881ad6265SDimitry Andric 59bdd1243dSDimitry Andric namespace ExecutionMode { 60bdd1243dSDimitry Andric #define GET_ExecutionMode_DECL 61bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 62bdd1243dSDimitry Andric } // namespace ExecutionMode 6381ad6265SDimitry Andric 64bdd1243dSDimitry Andric namespace StorageClass { 65bdd1243dSDimitry Andric #define GET_StorageClass_DECL 66bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 67bdd1243dSDimitry Andric } // namespace StorageClass 6881ad6265SDimitry Andric 69bdd1243dSDimitry Andric namespace Dim { 70bdd1243dSDimitry Andric #define GET_Dim_DECL 71bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 72bdd1243dSDimitry Andric } // namespace Dim 7381ad6265SDimitry Andric 74bdd1243dSDimitry Andric namespace SamplerAddressingMode { 75bdd1243dSDimitry Andric #define GET_SamplerAddressingMode_DECL 76bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 77bdd1243dSDimitry Andric } // namespace SamplerAddressingMode 7881ad6265SDimitry Andric 79bdd1243dSDimitry Andric namespace SamplerFilterMode { 80bdd1243dSDimitry Andric #define GET_SamplerFilterMode_DECL 81bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 82bdd1243dSDimitry Andric } // namespace SamplerFilterMode 8381ad6265SDimitry Andric 84bdd1243dSDimitry Andric namespace ImageFormat { 85bdd1243dSDimitry Andric #define GET_ImageFormat_DECL 86bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 87bdd1243dSDimitry Andric } // namespace ImageFormat 8881ad6265SDimitry Andric 89bdd1243dSDimitry Andric namespace ImageChannelOrder { 90bdd1243dSDimitry Andric #define GET_ImageChannelOrder_DECL 91bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 92bdd1243dSDimitry Andric } // namespace ImageChannelOrder 9381ad6265SDimitry Andric 94bdd1243dSDimitry Andric namespace ImageChannelDataType { 95bdd1243dSDimitry Andric #define GET_ImageChannelDataType_DECL 96bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 97bdd1243dSDimitry Andric } // namespace ImageChannelDataType 9881ad6265SDimitry Andric 99bdd1243dSDimitry Andric namespace ImageOperand { 100bdd1243dSDimitry Andric #define GET_ImageOperand_DECL 101bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 102bdd1243dSDimitry Andric } // namespace ImageOperand 10381ad6265SDimitry Andric 104bdd1243dSDimitry Andric namespace FPFastMathMode { 105bdd1243dSDimitry Andric #define GET_FPFastMathMode_DECL 106bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 107bdd1243dSDimitry Andric } // namespace FPFastMathMode 10881ad6265SDimitry Andric 109bdd1243dSDimitry Andric namespace FPRoundingMode { 110bdd1243dSDimitry Andric #define GET_FPRoundingMode_DECL 111bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 112bdd1243dSDimitry Andric } // namespace FPRoundingMode 11381ad6265SDimitry Andric 114bdd1243dSDimitry Andric namespace LinkageType { 115bdd1243dSDimitry Andric #define GET_LinkageType_DECL 116bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 117bdd1243dSDimitry Andric } // namespace LinkageType 11881ad6265SDimitry Andric 119bdd1243dSDimitry Andric namespace AccessQualifier { 120bdd1243dSDimitry Andric #define GET_AccessQualifier_DECL 121bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 122bdd1243dSDimitry Andric } // namespace AccessQualifier 12381ad6265SDimitry Andric 124bdd1243dSDimitry Andric namespace FunctionParameterAttribute { 125bdd1243dSDimitry Andric #define GET_FunctionParameterAttribute_DECL 126bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 127bdd1243dSDimitry Andric } // namespace FunctionParameterAttribute 12881ad6265SDimitry Andric 129bdd1243dSDimitry Andric namespace Decoration { 130bdd1243dSDimitry Andric #define GET_Decoration_DECL 131bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 132bdd1243dSDimitry Andric } // namespace Decoration 13381ad6265SDimitry Andric 134bdd1243dSDimitry Andric namespace BuiltIn { 135bdd1243dSDimitry Andric #define GET_BuiltIn_DECL 136bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 137bdd1243dSDimitry Andric } // namespace BuiltIn 13881ad6265SDimitry Andric 139bdd1243dSDimitry Andric namespace SelectionControl { 140bdd1243dSDimitry Andric #define GET_SelectionControl_DECL 141bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 142bdd1243dSDimitry Andric } // namespace SelectionControl 14381ad6265SDimitry Andric 144bdd1243dSDimitry Andric namespace LoopControl { 145bdd1243dSDimitry Andric #define GET_LoopControl_DECL 146bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 147bdd1243dSDimitry Andric } // namespace LoopControl 14881ad6265SDimitry Andric 149bdd1243dSDimitry Andric namespace FunctionControl { 150bdd1243dSDimitry Andric #define GET_FunctionControl_DECL 151bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 152bdd1243dSDimitry Andric } // namespace FunctionControl 15381ad6265SDimitry Andric 154bdd1243dSDimitry Andric namespace MemorySemantics { 155bdd1243dSDimitry Andric #define GET_MemorySemantics_DECL 156bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 157bdd1243dSDimitry Andric } // namespace MemorySemantics 15881ad6265SDimitry Andric 159bdd1243dSDimitry Andric namespace MemoryOperand { 160bdd1243dSDimitry Andric #define GET_MemoryOperand_DECL 161bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 162bdd1243dSDimitry Andric } // namespace MemoryOperand 16381ad6265SDimitry Andric 164bdd1243dSDimitry Andric namespace Scope { 165bdd1243dSDimitry Andric #define GET_Scope_DECL 166bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 167bdd1243dSDimitry Andric } // namespace Scope 16881ad6265SDimitry Andric 169bdd1243dSDimitry Andric namespace GroupOperation { 170bdd1243dSDimitry Andric #define GET_GroupOperation_DECL 171bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 172bdd1243dSDimitry Andric } // namespace GroupOperation 173fcaf7f86SDimitry Andric 174bdd1243dSDimitry Andric namespace KernelEnqueueFlags { 175bdd1243dSDimitry Andric #define GET_KernelEnqueueFlags_DECL 176bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 177bdd1243dSDimitry Andric } // namespace KernelEnqueueFlags 178fcaf7f86SDimitry Andric 179bdd1243dSDimitry Andric namespace KernelProfilingInfo { 180bdd1243dSDimitry Andric #define GET_KernelProfilingInfo_DECL 181bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 182bdd1243dSDimitry Andric } // namespace KernelProfilingInfo 183bdd1243dSDimitry Andric 184bdd1243dSDimitry Andric namespace InstructionSet { 185bdd1243dSDimitry Andric #define GET_InstructionSet_DECL 186bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 187bdd1243dSDimitry Andric } // namespace InstructionSet 188bdd1243dSDimitry Andric 189bdd1243dSDimitry Andric namespace OpenCLExtInst { 190bdd1243dSDimitry Andric #define GET_OpenCLExtInst_DECL 191bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 192bdd1243dSDimitry Andric } // namespace OpenCLExtInst 193bdd1243dSDimitry Andric 194bdd1243dSDimitry Andric namespace GLSLExtInst { 195bdd1243dSDimitry Andric #define GET_GLSLExtInst_DECL 196bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 197bdd1243dSDimitry Andric } // namespace GLSLExtInst 198bdd1243dSDimitry Andric 199bdd1243dSDimitry Andric namespace Opcode { 200bdd1243dSDimitry Andric #define GET_Opcode_DECL 201bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 202bdd1243dSDimitry Andric } // namespace Opcode 203bdd1243dSDimitry Andric 204bdd1243dSDimitry Andric struct ExtendedBuiltin { 205bdd1243dSDimitry Andric StringRef Name; 206bdd1243dSDimitry Andric InstructionSet::InstructionSet Set; 207bdd1243dSDimitry Andric uint32_t Number; 208fcaf7f86SDimitry Andric }; 20981ad6265SDimitry Andric } // namespace SPIRV 210bdd1243dSDimitry Andric 211bdd1243dSDimitry Andric using CapabilityList = SmallVector<SPIRV::Capability::Capability, 8>; 212bdd1243dSDimitry Andric using ExtensionList = SmallVector<SPIRV::Extension::Extension, 8>; 213bdd1243dSDimitry Andric 214bdd1243dSDimitry Andric std::string 215bdd1243dSDimitry Andric getSymbolicOperandMnemonic(SPIRV::OperandCategory::OperandCategory Category, 216bdd1243dSDimitry Andric int32_t Value); 217bdd1243dSDimitry Andric uint32_t 218bdd1243dSDimitry Andric getSymbolicOperandMinVersion(SPIRV::OperandCategory::OperandCategory Category, 219bdd1243dSDimitry Andric uint32_t Value); 220bdd1243dSDimitry Andric uint32_t 221bdd1243dSDimitry Andric getSymbolicOperandMaxVersion(SPIRV::OperandCategory::OperandCategory Category, 222bdd1243dSDimitry Andric uint32_t Value); 223bdd1243dSDimitry Andric CapabilityList 224bdd1243dSDimitry Andric getSymbolicOperandCapabilities(SPIRV::OperandCategory::OperandCategory Category, 225bdd1243dSDimitry Andric uint32_t Value); 226*5f757f3fSDimitry Andric CapabilityList 227*5f757f3fSDimitry Andric getCapabilitiesEnabledByExtension(SPIRV::Extension::Extension Extension); 228bdd1243dSDimitry Andric ExtensionList 229bdd1243dSDimitry Andric getSymbolicOperandExtensions(SPIRV::OperandCategory::OperandCategory Category, 230bdd1243dSDimitry Andric uint32_t Value); 231bdd1243dSDimitry Andric std::string getLinkStringForBuiltIn(SPIRV::BuiltIn::BuiltIn BuiltInValue); 232bdd1243dSDimitry Andric 233bdd1243dSDimitry Andric bool getSpirvBuiltInIdByName(StringRef Name, SPIRV::BuiltIn::BuiltIn &BI); 234bdd1243dSDimitry Andric 235bdd1243dSDimitry Andric std::string getExtInstSetName(SPIRV::InstructionSet::InstructionSet Set); 236bdd1243dSDimitry Andric SPIRV::InstructionSet::InstructionSet 237bdd1243dSDimitry Andric getExtInstSetFromString(std::string SetName); 238bdd1243dSDimitry Andric std::string getExtInstName(SPIRV::InstructionSet::InstructionSet Set, 239bdd1243dSDimitry Andric uint32_t InstructionNumber); 24081ad6265SDimitry Andric 24181ad6265SDimitry Andric // Return a string representation of the operands from startIndex onwards. 24281ad6265SDimitry Andric // Templated to allow both MachineInstr and MCInst to use the same logic. 24381ad6265SDimitry Andric template <class InstType> 24481ad6265SDimitry Andric std::string getSPIRVStringOperand(const InstType &MI, unsigned StartIndex) { 24581ad6265SDimitry Andric std::string s; // Iteratively append to this string. 24681ad6265SDimitry Andric 24781ad6265SDimitry Andric const unsigned NumOps = MI.getNumOperands(); 24881ad6265SDimitry Andric bool IsFinished = false; 24981ad6265SDimitry Andric for (unsigned i = StartIndex; i < NumOps && !IsFinished; ++i) { 25081ad6265SDimitry Andric const auto &Op = MI.getOperand(i); 25181ad6265SDimitry Andric if (!Op.isImm()) // Stop if we hit a register operand. 25281ad6265SDimitry Andric break; 25381ad6265SDimitry Andric assert((Op.getImm() >> 32) == 0 && "Imm operand should be i32 word"); 25481ad6265SDimitry Andric const uint32_t Imm = Op.getImm(); // Each i32 word is up to 4 characters. 25581ad6265SDimitry Andric for (unsigned ShiftAmount = 0; ShiftAmount < 32; ShiftAmount += 8) { 25681ad6265SDimitry Andric char c = (Imm >> ShiftAmount) & 0xff; 25781ad6265SDimitry Andric if (c == 0) { // Stop if we hit a null-terminator character. 25881ad6265SDimitry Andric IsFinished = true; 25981ad6265SDimitry Andric break; 26081ad6265SDimitry Andric } 261bdd1243dSDimitry Andric s += c; // Otherwise, append the character to the result string. 26281ad6265SDimitry Andric } 26381ad6265SDimitry Andric } 26481ad6265SDimitry Andric return s; 26581ad6265SDimitry Andric } 266bdd1243dSDimitry Andric } // namespace llvm 267bdd1243dSDimitry Andric #endif // LLVM_LIB_TARGET_SPIRV_SPIRVSYMBOLICOPERANDS_H 268