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" 20*0fca6ea1SDimitry Andric #include "llvm/Support/VersionTuple.h" 2181ad6265SDimitry Andric #include <string> 2281ad6265SDimitry Andric 2381ad6265SDimitry Andric namespace llvm { 2481ad6265SDimitry Andric namespace SPIRV { 25bdd1243dSDimitry Andric namespace OperandCategory { 26bdd1243dSDimitry Andric #define GET_OperandCategory_DECL 27bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 28bdd1243dSDimitry Andric } // namespace OperandCategory 2981ad6265SDimitry Andric 30bdd1243dSDimitry Andric namespace Extension { 31bdd1243dSDimitry Andric #define GET_Extension_DECL 32bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 33bdd1243dSDimitry Andric } // namespace Extension 3481ad6265SDimitry Andric 35bdd1243dSDimitry Andric namespace Capability { 36bdd1243dSDimitry Andric #define GET_Capability_DECL 37bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 38bdd1243dSDimitry Andric } // namespace Capability 3981ad6265SDimitry Andric 40bdd1243dSDimitry Andric namespace SourceLanguage { 41bdd1243dSDimitry Andric #define GET_SourceLanguage_DECL 42bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 43bdd1243dSDimitry Andric } // namespace SourceLanguage 4481ad6265SDimitry Andric 45bdd1243dSDimitry Andric namespace AddressingModel { 46bdd1243dSDimitry Andric #define GET_AddressingModel_DECL 47bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 48bdd1243dSDimitry Andric } // namespace AddressingModel 4981ad6265SDimitry Andric 50bdd1243dSDimitry Andric namespace ExecutionModel { 51bdd1243dSDimitry Andric #define GET_ExecutionModel_DECL 52bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 53bdd1243dSDimitry Andric } // namespace ExecutionModel 5481ad6265SDimitry Andric 55bdd1243dSDimitry Andric namespace MemoryModel { 56bdd1243dSDimitry Andric #define GET_MemoryModel_DECL 57bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 58bdd1243dSDimitry Andric } // namespace MemoryModel 5981ad6265SDimitry Andric 60bdd1243dSDimitry Andric namespace ExecutionMode { 61bdd1243dSDimitry Andric #define GET_ExecutionMode_DECL 62bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 63bdd1243dSDimitry Andric } // namespace ExecutionMode 6481ad6265SDimitry Andric 65bdd1243dSDimitry Andric namespace StorageClass { 66bdd1243dSDimitry Andric #define GET_StorageClass_DECL 67bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 68bdd1243dSDimitry Andric } // namespace StorageClass 6981ad6265SDimitry Andric 70bdd1243dSDimitry Andric namespace Dim { 71bdd1243dSDimitry Andric #define GET_Dim_DECL 72bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 73bdd1243dSDimitry Andric } // namespace Dim 7481ad6265SDimitry Andric 75bdd1243dSDimitry Andric namespace SamplerAddressingMode { 76bdd1243dSDimitry Andric #define GET_SamplerAddressingMode_DECL 77bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 78bdd1243dSDimitry Andric } // namespace SamplerAddressingMode 7981ad6265SDimitry Andric 80bdd1243dSDimitry Andric namespace SamplerFilterMode { 81bdd1243dSDimitry Andric #define GET_SamplerFilterMode_DECL 82bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 83bdd1243dSDimitry Andric } // namespace SamplerFilterMode 8481ad6265SDimitry Andric 85bdd1243dSDimitry Andric namespace ImageFormat { 86bdd1243dSDimitry Andric #define GET_ImageFormat_DECL 87bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 88bdd1243dSDimitry Andric } // namespace ImageFormat 8981ad6265SDimitry Andric 90bdd1243dSDimitry Andric namespace ImageChannelOrder { 91bdd1243dSDimitry Andric #define GET_ImageChannelOrder_DECL 92bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 93bdd1243dSDimitry Andric } // namespace ImageChannelOrder 9481ad6265SDimitry Andric 95bdd1243dSDimitry Andric namespace ImageChannelDataType { 96bdd1243dSDimitry Andric #define GET_ImageChannelDataType_DECL 97bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 98bdd1243dSDimitry Andric } // namespace ImageChannelDataType 9981ad6265SDimitry Andric 100bdd1243dSDimitry Andric namespace ImageOperand { 101bdd1243dSDimitry Andric #define GET_ImageOperand_DECL 102bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 103bdd1243dSDimitry Andric } // namespace ImageOperand 10481ad6265SDimitry Andric 105bdd1243dSDimitry Andric namespace FPFastMathMode { 106bdd1243dSDimitry Andric #define GET_FPFastMathMode_DECL 107bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 108bdd1243dSDimitry Andric } // namespace FPFastMathMode 10981ad6265SDimitry Andric 110bdd1243dSDimitry Andric namespace FPRoundingMode { 111bdd1243dSDimitry Andric #define GET_FPRoundingMode_DECL 112bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 113bdd1243dSDimitry Andric } // namespace FPRoundingMode 11481ad6265SDimitry Andric 115bdd1243dSDimitry Andric namespace LinkageType { 116bdd1243dSDimitry Andric #define GET_LinkageType_DECL 117bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 118bdd1243dSDimitry Andric } // namespace LinkageType 11981ad6265SDimitry Andric 120bdd1243dSDimitry Andric namespace AccessQualifier { 121bdd1243dSDimitry Andric #define GET_AccessQualifier_DECL 122bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 123bdd1243dSDimitry Andric } // namespace AccessQualifier 12481ad6265SDimitry Andric 125bdd1243dSDimitry Andric namespace FunctionParameterAttribute { 126bdd1243dSDimitry Andric #define GET_FunctionParameterAttribute_DECL 127bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 128bdd1243dSDimitry Andric } // namespace FunctionParameterAttribute 12981ad6265SDimitry Andric 130bdd1243dSDimitry Andric namespace Decoration { 131bdd1243dSDimitry Andric #define GET_Decoration_DECL 132bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 133bdd1243dSDimitry Andric } // namespace Decoration 13481ad6265SDimitry Andric 135bdd1243dSDimitry Andric namespace BuiltIn { 136bdd1243dSDimitry Andric #define GET_BuiltIn_DECL 137bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 138bdd1243dSDimitry Andric } // namespace BuiltIn 13981ad6265SDimitry Andric 140bdd1243dSDimitry Andric namespace SelectionControl { 141bdd1243dSDimitry Andric #define GET_SelectionControl_DECL 142bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 143bdd1243dSDimitry Andric } // namespace SelectionControl 14481ad6265SDimitry Andric 145bdd1243dSDimitry Andric namespace LoopControl { 146bdd1243dSDimitry Andric #define GET_LoopControl_DECL 147bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 148bdd1243dSDimitry Andric } // namespace LoopControl 14981ad6265SDimitry Andric 150bdd1243dSDimitry Andric namespace FunctionControl { 151bdd1243dSDimitry Andric #define GET_FunctionControl_DECL 152bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 153bdd1243dSDimitry Andric } // namespace FunctionControl 15481ad6265SDimitry Andric 155bdd1243dSDimitry Andric namespace MemorySemantics { 156bdd1243dSDimitry Andric #define GET_MemorySemantics_DECL 157bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 158bdd1243dSDimitry Andric } // namespace MemorySemantics 15981ad6265SDimitry Andric 160bdd1243dSDimitry Andric namespace MemoryOperand { 161bdd1243dSDimitry Andric #define GET_MemoryOperand_DECL 162bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 163bdd1243dSDimitry Andric } // namespace MemoryOperand 16481ad6265SDimitry Andric 165bdd1243dSDimitry Andric namespace Scope { 166bdd1243dSDimitry Andric #define GET_Scope_DECL 167bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 168bdd1243dSDimitry Andric } // namespace Scope 16981ad6265SDimitry Andric 170bdd1243dSDimitry Andric namespace GroupOperation { 171bdd1243dSDimitry Andric #define GET_GroupOperation_DECL 172bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 173bdd1243dSDimitry Andric } // namespace GroupOperation 174fcaf7f86SDimitry Andric 175bdd1243dSDimitry Andric namespace KernelEnqueueFlags { 176bdd1243dSDimitry Andric #define GET_KernelEnqueueFlags_DECL 177bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 178bdd1243dSDimitry Andric } // namespace KernelEnqueueFlags 179fcaf7f86SDimitry Andric 180bdd1243dSDimitry Andric namespace KernelProfilingInfo { 181bdd1243dSDimitry Andric #define GET_KernelProfilingInfo_DECL 182bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 183bdd1243dSDimitry Andric } // namespace KernelProfilingInfo 184bdd1243dSDimitry Andric 185bdd1243dSDimitry Andric namespace InstructionSet { 186bdd1243dSDimitry Andric #define GET_InstructionSet_DECL 187bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 188bdd1243dSDimitry Andric } // namespace InstructionSet 189bdd1243dSDimitry Andric 190bdd1243dSDimitry Andric namespace OpenCLExtInst { 191bdd1243dSDimitry Andric #define GET_OpenCLExtInst_DECL 192bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 193bdd1243dSDimitry Andric } // namespace OpenCLExtInst 194bdd1243dSDimitry Andric 195bdd1243dSDimitry Andric namespace GLSLExtInst { 196bdd1243dSDimitry Andric #define GET_GLSLExtInst_DECL 197bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 198bdd1243dSDimitry Andric } // namespace GLSLExtInst 199bdd1243dSDimitry Andric 200*0fca6ea1SDimitry Andric namespace NonSemanticExtInst { 201*0fca6ea1SDimitry Andric #define GET_NonSemanticExtInst_DECL 202*0fca6ea1SDimitry Andric #include "SPIRVGenTables.inc" 203*0fca6ea1SDimitry Andric } // namespace NonSemanticExtInst 204*0fca6ea1SDimitry Andric 205bdd1243dSDimitry Andric namespace Opcode { 206bdd1243dSDimitry Andric #define GET_Opcode_DECL 207bdd1243dSDimitry Andric #include "SPIRVGenTables.inc" 208bdd1243dSDimitry Andric } // namespace Opcode 209bdd1243dSDimitry Andric 210bdd1243dSDimitry Andric struct ExtendedBuiltin { 211bdd1243dSDimitry Andric StringRef Name; 212bdd1243dSDimitry Andric InstructionSet::InstructionSet Set; 213bdd1243dSDimitry Andric uint32_t Number; 214fcaf7f86SDimitry Andric }; 21581ad6265SDimitry Andric } // namespace SPIRV 216bdd1243dSDimitry Andric 217bdd1243dSDimitry Andric using CapabilityList = SmallVector<SPIRV::Capability::Capability, 8>; 218bdd1243dSDimitry Andric using ExtensionList = SmallVector<SPIRV::Extension::Extension, 8>; 219bdd1243dSDimitry Andric 220bdd1243dSDimitry Andric std::string 221bdd1243dSDimitry Andric getSymbolicOperandMnemonic(SPIRV::OperandCategory::OperandCategory Category, 222bdd1243dSDimitry Andric int32_t Value); 223*0fca6ea1SDimitry Andric VersionTuple 224bdd1243dSDimitry Andric getSymbolicOperandMinVersion(SPIRV::OperandCategory::OperandCategory Category, 225bdd1243dSDimitry Andric uint32_t Value); 226*0fca6ea1SDimitry Andric VersionTuple 227bdd1243dSDimitry Andric getSymbolicOperandMaxVersion(SPIRV::OperandCategory::OperandCategory Category, 228bdd1243dSDimitry Andric uint32_t Value); 229bdd1243dSDimitry Andric CapabilityList 230bdd1243dSDimitry Andric getSymbolicOperandCapabilities(SPIRV::OperandCategory::OperandCategory Category, 231bdd1243dSDimitry Andric uint32_t Value); 2325f757f3fSDimitry Andric CapabilityList 2335f757f3fSDimitry Andric getCapabilitiesEnabledByExtension(SPIRV::Extension::Extension Extension); 234bdd1243dSDimitry Andric ExtensionList 235bdd1243dSDimitry Andric getSymbolicOperandExtensions(SPIRV::OperandCategory::OperandCategory Category, 236bdd1243dSDimitry Andric uint32_t Value); 237bdd1243dSDimitry Andric std::string getLinkStringForBuiltIn(SPIRV::BuiltIn::BuiltIn BuiltInValue); 238bdd1243dSDimitry Andric 239bdd1243dSDimitry Andric bool getSpirvBuiltInIdByName(StringRef Name, SPIRV::BuiltIn::BuiltIn &BI); 240bdd1243dSDimitry Andric 241bdd1243dSDimitry Andric std::string getExtInstSetName(SPIRV::InstructionSet::InstructionSet Set); 242bdd1243dSDimitry Andric SPIRV::InstructionSet::InstructionSet 243bdd1243dSDimitry Andric getExtInstSetFromString(std::string SetName); 244bdd1243dSDimitry Andric std::string getExtInstName(SPIRV::InstructionSet::InstructionSet Set, 245bdd1243dSDimitry Andric uint32_t InstructionNumber); 24681ad6265SDimitry Andric 24781ad6265SDimitry Andric // Return a string representation of the operands from startIndex onwards. 24881ad6265SDimitry Andric // Templated to allow both MachineInstr and MCInst to use the same logic. 24981ad6265SDimitry Andric template <class InstType> 25081ad6265SDimitry Andric std::string getSPIRVStringOperand(const InstType &MI, unsigned StartIndex) { 25181ad6265SDimitry Andric std::string s; // Iteratively append to this string. 25281ad6265SDimitry Andric 25381ad6265SDimitry Andric const unsigned NumOps = MI.getNumOperands(); 25481ad6265SDimitry Andric bool IsFinished = false; 25581ad6265SDimitry Andric for (unsigned i = StartIndex; i < NumOps && !IsFinished; ++i) { 25681ad6265SDimitry Andric const auto &Op = MI.getOperand(i); 25781ad6265SDimitry Andric if (!Op.isImm()) // Stop if we hit a register operand. 25881ad6265SDimitry Andric break; 25981ad6265SDimitry Andric assert((Op.getImm() >> 32) == 0 && "Imm operand should be i32 word"); 26081ad6265SDimitry Andric const uint32_t Imm = Op.getImm(); // Each i32 word is up to 4 characters. 26181ad6265SDimitry Andric for (unsigned ShiftAmount = 0; ShiftAmount < 32; ShiftAmount += 8) { 26281ad6265SDimitry Andric char c = (Imm >> ShiftAmount) & 0xff; 26381ad6265SDimitry Andric if (c == 0) { // Stop if we hit a null-terminator character. 26481ad6265SDimitry Andric IsFinished = true; 26581ad6265SDimitry Andric break; 26681ad6265SDimitry Andric } 267bdd1243dSDimitry Andric s += c; // Otherwise, append the character to the result string. 26881ad6265SDimitry Andric } 26981ad6265SDimitry Andric } 27081ad6265SDimitry Andric return s; 27181ad6265SDimitry Andric } 272bdd1243dSDimitry Andric } // namespace llvm 273bdd1243dSDimitry Andric #endif // LLVM_LIB_TARGET_SPIRV_SPIRVSYMBOLICOPERANDS_H 274