// Copyright (c) 2015 The Khronos Group Inc. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and/or associated documentation files (the // "Materials"), to deal in the Materials without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Materials, and to // permit persons to whom the Materials are furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Materials. // // MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS // KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS // SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT // https://www.khronos.org/registry/ // // THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. #include #include "binary.h" #include "opcode.h" #include #include // Opcode API const char *spvGeneratorStr(uint32_t generator) { switch (generator) { case SPV_GENERATOR_KHRONOS: return "Khronos"; case SPV_GENERATOR_VALVE: return "Valve"; case SPV_GENERATOR_LUNARG: return "LunarG"; case SPV_GENERATOR_CODEPLAY: return "Codeplay Software Ltd."; default: return "Unknown"; } } uint32_t spvOpcodeMake(uint16_t wordCount, Op opcode) { return ((uint32_t)opcode) | (((uint32_t)wordCount) << 16); } void spvOpcodeSplit(const uint32_t word, uint16_t *pWordCount, Op *pOpcode) { if (pWordCount) { *pWordCount = (uint16_t)((0xffff0000 & word) >> 16); } if (pOpcode) { *pOpcode = (Op)(0x0000ffff & word); } } static const spv_opcode_desc_t opcodeTableEntries[] = { {"Nop", 1, OpNop, SPV_OPCODE_FLAGS_NONE, 0, {}}, {"Undef", 3, OpUndef, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}}, { "Source", 3, OpSource, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_SOURCE_LANGUAGE, SPV_OPERAND_TYPE_LITERAL_NUMBER}, }, {"SourceExtension", 1, OpSourceExtension, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_LITERAL_STRING}}, {"Name", 2, OpName, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_STRING}}, {"MemberName", 3, OpMemberName, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_LITERAL_STRING}}, {"String", 2, OpString, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL_STRING}}, {"Line", 5, OpLine, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_LITERAL_NUMBER}}, {"DecorationGroup", 2, OpDecorationGroup, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_RESULT_ID}}, {"Decorate", 3, OpDecorate, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_DECORATION, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_ELLIPSIS}}, {"MemberDecorate", 4, OpMemberDecorate, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_DECORATION, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_ELLIPSIS}}, {"GroupDecorate", 2, OpGroupDecorate, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}}, {"GroupMemberDecorate", 2, OpGroupMemberDecorate, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}}, {"Extension", 1, OpExtension, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_LITERAL_STRING}}, {"ExtInstImport", 2, OpExtInstImport, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL_STRING}}, {"ExtInst", 5, OpExtInst, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}}, {"MemoryModel", 3, OpMemoryModel, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ADDRESSING_MODEL, SPV_OPERAND_TYPE_MEMORY_MODEL}}, {"EntryPoint", 3, OpEntryPoint, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_EXECUTION_MODEL, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_STRING}}, {"ExecutionMode", 3, OpExecutionMode, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_MODE, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_ELLIPSIS}}, {"Capability", 2, OpCapability, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_CAPABILITY}}, {"TypeVoid", 2, OpTypeVoid, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_RESULT_ID}}, {"TypeBool", 2, OpTypeBool, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_RESULT_ID}}, {"TypeInt", 4, OpTypeInt, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_LITERAL_NUMBER}}, {"TypeFloat", 3, OpTypeFloat, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER}}, {"TypeVector", 4, OpTypeVector, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER}}, {"TypeMatrix", 4, OpTypeMatrix, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityMatrix, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER}}, {"TypeSampler", 8, OpTypeSampler, SPV_OPCODE_FLAGS_VARIABLE, 0, { SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_DIMENSIONALITY, SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_ID // TODO: See Khronos bug 13755 }}, {"TypeArray", 4, OpTypeArray, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"TypeRuntimeArray", 3, OpTypeRuntimeArray, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"TypeStruct", 2, OpTypeStruct, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}}, {"TypeOpaque", 2, OpTypeOpaque, SPV_OPCODE_FLAGS_VARIABLE | SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL_STRING}}, {"TypePointer", 4, OpTypePointer, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_STORAGE_CLASS, SPV_OPERAND_TYPE_ID}}, {"TypeFunction", 3, OpTypeFunction, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}}, {"TypeEvent", 2, OpTypeEvent, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {SPV_OPERAND_TYPE_RESULT_ID}}, {"TypeDeviceEvent", 2, OpTypeDeviceEvent, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {SPV_OPERAND_TYPE_RESULT_ID}}, {"TypeReserveId", 2, OpTypeReserveId, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {SPV_OPERAND_TYPE_RESULT_ID}}, {"TypeQueue", 2, OpTypeQueue, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {SPV_OPERAND_TYPE_RESULT_ID}}, {"TypePipe", 4, OpTypePipe, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityPipes, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ACCESS_QUALIFIER}}, {"ConstantTrue", 3, OpConstantTrue, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}}, {"ConstantFalse", 3, OpConstantFalse, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}}, {"Constant", 3, OpConstant, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_ELLIPSIS}}, {"ConstantComposite", 3, OpConstantComposite, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}}, {"ConstantSampler", 6, OpConstantSampler, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE, SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE}}, {"ConstantNull", 3, OpConstantNull, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}}, {"SpecConstantTrue", 3, OpSpecConstantTrue, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}}, {"SpecConstantFalse", 3, OpSpecConstantFalse, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}}, {"SpecConstant", 3, OpSpecConstant, SPV_OPCODE_FLAGS_VARIABLE | SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_ELLIPSIS}}, {"SpecConstantComposite", 3, OpSpecConstantComposite, SPV_OPCODE_FLAGS_VARIABLE | SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}}, { "SpecConstantOp", 4, OpSpecConstantOp, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}, }, {"Variable", 4, OpVariable, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_STORAGE_CLASS, SPV_OPERAND_TYPE_ID}}, {"Load", 4, OpLoad, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_MEMORY_ACCESS, SPV_OPERAND_TYPE_MEMORY_ACCESS, SPV_OPERAND_TYPE_ELLIPSIS}}, {"Store", 3, OpStore, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_MEMORY_ACCESS, SPV_OPERAND_TYPE_MEMORY_ACCESS, SPV_OPERAND_TYPE_ELLIPSIS}}, {"CopyMemory", 3, OpCopyMemory, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_MEMORY_ACCESS, SPV_OPERAND_TYPE_MEMORY_ACCESS, SPV_OPERAND_TYPE_ELLIPSIS}}, {"CopyMemorySized", 4, OpCopyMemorySized, SPV_OPCODE_FLAGS_VARIABLE | SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityAddresses, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_MEMORY_ACCESS, SPV_OPERAND_TYPE_MEMORY_ACCESS, SPV_OPERAND_TYPE_ELLIPSIS}}, {"AccessChain", 4, OpAccessChain, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}}, {"InBoundsAccessChain", 4, OpInBoundsAccessChain, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}}, {"ArrayLength", 5, OpArrayLength, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER}}, {"GenericPtrMemSemantics", 4, OpGenericPtrMemSemantics, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"Function", 5, OpFunction, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_FUNCTION_CONTROL, SPV_OPERAND_TYPE_ID}}, {"FunctionParameter", 3, OpFunctionParameter, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}}, {"FunctionEnd", 1, OpFunctionEnd, SPV_OPCODE_FLAGS_NONE, 0, {}}, {"FunctionCall", 4, OpFunctionCall, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}}, {"ConvertFToU", 4, OpConvertFToU, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"ConvertFToS", 4, OpConvertFToS, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"ConvertSToF", 4, OpConvertSToF, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"ConvertUToF", 4, OpConvertUToF, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"UConvert", 4, OpUConvert, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"SConvert", 4, OpSConvert, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"FConvert", 4, OpFConvert, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"ConvertPtrToU", 4, OpConvertPtrToU, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityAddresses, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"ConvertUToPtr", 4, OpConvertUToPtr, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityAddresses, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"PtrCastToGeneric", 4, OpPtrCastToGeneric, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"GenericCastToPtr", 4, OpGenericCastToPtr, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"Bitcast", 4, OpBitcast, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"GenericCastToPtrExplicit", 5, OpGenericCastToPtrExplicit, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_STORAGE_CLASS}}, {"SatConvertSToU", 4, OpSatConvertSToU, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"SatConvertUToS", 4, OpSatConvertUToS, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"VectorExtractDynamic", 5, OpVectorExtractDynamic, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"VectorInsertDynamic", 6, OpVectorInsertDynamic, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"VectorShuffle", 5, OpVectorShuffle, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_ELLIPSIS}}, {"CompositeConstruct", 3, OpCompositeConstruct, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}}, {"CompositeExtract", 4, OpCompositeExtract, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_ELLIPSIS}}, {"CompositeInsert", 5, OpCompositeInsert, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_ELLIPSIS}}, {"CopyObject", 4, OpCopyObject, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"Transpose", 4, OpTranspose, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityMatrix, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"SNegate", 4, OpSNegate, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"FNegate", 4, OpFNegate, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"Not", 4, OpNot, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"IAdd", 5, OpIAdd, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"FAdd", 5, OpFAdd, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"ISub", 5, OpISub, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"FSub", 5, OpFSub, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"IMul", 5, OpIMul, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"FMul", 5, OpFMul, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"UDiv", 5, OpUDiv, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"SDiv", 5, OpSDiv, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"FDiv", 5, OpFDiv, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"UMod", 5, OpUMod, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"SRem", 5, OpSRem, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"SMod", 5, OpSMod, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"FRem", 5, OpFRem, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"FMod", 5, OpFMod, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"VectorTimesScalar", 5, OpVectorTimesScalar, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"MatrixTimesScalar", 5, OpMatrixTimesScalar, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityMatrix, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"VectorTimesMatrix", 5, OpVectorTimesMatrix, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityMatrix, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"MatrixTimesVector", 5, OpMatrixTimesVector, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityMatrix, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"MatrixTimesMatrix", 5, OpMatrixTimesMatrix, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityMatrix, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"OuterProduct", 5, OpOuterProduct, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityMatrix, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"Dot", 5, OpDot, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"ShiftRightLogical", 5, OpShiftRightLogical, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"ShiftRightArithmetic", 5, OpShiftRightArithmetic, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"ShiftLeftLogical", 5, OpShiftLeftLogical, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"BitwiseOr", 5, OpBitwiseOr, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"BitwiseXor", 5, OpBitwiseXor, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"BitwiseAnd", 5, OpBitwiseAnd, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"Any", 4, OpAny, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"All", 4, OpAll, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"IsNan", 4, OpIsNan, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"IsInf", 4, OpIsInf, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"IsFinite", 4, OpIsFinite, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"IsNormal", 4, OpIsNormal, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"SignBitSet", 4, OpSignBitSet, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"LessOrGreater", 5, OpLessOrGreater, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"Ordered", 5, OpOrdered, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"Unordered", 5, OpUnordered, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"LogicalOr", 5, OpLogicalOr, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"LogicalAnd", 5, OpLogicalAnd, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"Select", 6, OpSelect, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"IEqual", 5, OpIEqual, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"FOrdEqual", 5, OpFOrdEqual, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"FUnordEqual", 5, OpFUnordEqual, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"INotEqual", 5, OpINotEqual, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"FOrdNotEqual", 5, OpFOrdNotEqual, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"FUnordNotEqual", 5, OpFUnordNotEqual, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"ULessThan", 5, OpULessThan, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"SLessThan", 5, OpSLessThan, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"FOrdLessThan", 5, OpFOrdLessThan, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"FUnordLessThan", 5, OpFUnordLessThan, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"UGreaterThan", 5, OpUGreaterThan, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"SGreaterThan", 5, OpSGreaterThan, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"FOrdGreaterThan", 5, OpFOrdGreaterThan, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"FUnordGreaterThan", 5, OpFUnordGreaterThan, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"ULessThanEqual", 5, OpULessThanEqual, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"SLessThanEqual", 5, OpSLessThanEqual, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"FOrdLessThanEqual", 5, OpFOrdLessThanEqual, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"FUnordLessThanEqual", 5, OpFUnordLessThanEqual, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"UGreaterThanEqual", 5, OpUGreaterThanEqual, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"SGreaterThanEqual", 5, OpSGreaterThanEqual, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"FOrdGreaterThanEqual", 5, OpFOrdGreaterThanEqual, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"FUnordGreaterThanEqual", 5, OpFUnordGreaterThanEqual, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"DPdx", 4, OpDPdx, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"DPdy", 4, OpDPdy, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, { "Fwidth", 4, OpFwidth, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, }, {"DPdxFine", 4, OpDPdxFine, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"DPdyFine", 4, OpDPdyFine, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, { "FwidthFine", 4, OpFwidthFine, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, }, {"DPdxCoarse", 4, OpDPdxCoarse, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"DPdyCoarse", 4, OpDPdyCoarse, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, { "FwidthCoarse", 4, OpFwidthCoarse, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, }, {"Phi", 3, OpPhi, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"LoopMerge", 3, OpLoopMerge, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LOOP_CONTROL}}, {"SelectionMerge", 3, OpSelectionMerge, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SELECTION_CONTROL}}, {"Label", 2, OpLabel, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_RESULT_ID}}, {"Branch", 2, OpBranch, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID}}, {"BranchConditional", 4, OpBranchConditional, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_ELLIPSIS}}, {"Switch", 3, OpSwitch, SPV_OPCODE_FLAGS_VARIABLE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL, SPV_OPERAND_TYPE_ID}}, {"Kill", 1, OpKill, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityShader, {}}, {"Return", 1, OpReturn, SPV_OPCODE_FLAGS_NONE, 0, {}}, {"ReturnValue", 2, OpReturnValue, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID}}, {"Unreachable", 1, OpUnreachable, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {}}, {"LifetimeStart", 3, OpLifetimeStart, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER}}, {"LifetimeStop", 3, OpLifetimeStop, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_NUMBER}}, {"AtomicLoad", 6, OpAtomicLoad, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS}}, {"AtomicStore", 5, OpAtomicStore, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS, SPV_OPERAND_TYPE_ID}}, {"AtomicExchange", 7, OpAtomicExchange, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS, SPV_OPERAND_TYPE_ID}}, {"AtomicCompareExchange", 8, OpAtomicCompareExchange, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"AtomicCompareExchangeWeak", 8, OpAtomicCompareExchangeWeak, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"AtomicIIncrement", 6, OpAtomicIIncrement, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS}}, {"AtomicIDecrement", 6, OpAtomicIDecrement, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS}}, {"AtomicIAdd", 7, OpAtomicIAdd, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS, SPV_OPERAND_TYPE_ID}}, {"AtomicISub", 7, OpAtomicISub, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS, SPV_OPERAND_TYPE_ID}}, {"AtomicUMin", 7, OpAtomicUMin, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS, SPV_OPERAND_TYPE_ID}}, {"AtomicUMax", 7, OpAtomicUMax, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS, SPV_OPERAND_TYPE_ID}}, {"AtomicAnd", 7, OpAtomicAnd, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS, SPV_OPERAND_TYPE_ID}}, {"AtomicOr", 7, OpAtomicOr, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS, SPV_OPERAND_TYPE_ID}}, {"AtomicXor", 7, OpAtomicXor, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS, SPV_OPERAND_TYPE_ID}}, {"AtomicSMin", 7, OpAtomicSMin, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS, SPV_OPERAND_TYPE_ID}}, {"AtomicUMin", 7, OpAtomicUMin, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS, SPV_OPERAND_TYPE_ID}}, {"AtomicSMax", 7, OpAtomicSMax, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS, SPV_OPERAND_TYPE_ID}}, {"AtomicUMax", 7, OpAtomicUMax, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS, SPV_OPERAND_TYPE_ID}}, {"EmitVertex", 1, OpEmitVertex, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityGeometry, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_STRING}}, {"EndPrimitive", 1, OpEndPrimitive, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityGeometry, {}}, {"EmitStreamVertex", 2, OpEmitStreamVertex, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityGeometry, {SPV_OPERAND_TYPE_ID}}, {"EndStreamPrimitive", 2, OpEndStreamPrimitive, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityGeometry, {SPV_OPERAND_TYPE_ID}}, {"ControlBarrier", 2, OpControlBarrier, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_EXECUTION_SCOPE}}, {"MemoryBarrier", 3, OpMemoryBarrier, SPV_OPCODE_FLAGS_NONE, 0, {SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_MEMORY_SEMANTICS}}, {"AsyncGroupCopy", 9, OpAsyncGroupCopy, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"WaitGroupEvents", 6, OpWaitGroupEvents, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityKernel, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"GroupAll", 5, OpGroupAll, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityGroups, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID}}, {"GroupAny", 5, OpGroupAny, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityGroups, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID}}, {"GroupBroadcast", 6, OpGroupBroadcast, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityGroups, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"GroupIAdd", 6, OpGroupIAdd, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityGroups, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}}, {"GroupFAdd", 6, OpGroupFAdd, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityGroups, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}}, {"GroupFMin", 6, OpGroupFMin, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityGroups, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}}, {"GroupUMin", 6, OpGroupUMin, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityGroups, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}}, {"GroupSMin", 6, OpGroupSMin, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityGroups, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}}, {"GroupFMax", 6, OpGroupFMax, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityGroups, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}}, {"GroupUMax", 6, OpGroupUMax, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityGroups, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}}, {"GroupSMax", 6, OpGroupSMax, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityGroups, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}}, {"EnqueueMarker", 7, OpEnqueueMarker, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityDeviceEnqueue, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"EnqueueKernel", 13, OpEnqueueKernel, SPV_OPCODE_FLAGS_VARIABLE | SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityDeviceEnqueue, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ELLIPSIS}}, {"GetKernelNDrangeSubGroupCount", 5, OpGetKernelNDrangeSubGroupCount, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityDeviceEnqueue, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"GetKernelNDrangeMaxSubGroupSize", 5, OpGetKernelNDrangeMaxSubGroupSize, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityDeviceEnqueue, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"GetKernelWorkGroupSize", 4, OpGetKernelWorkGroupSize, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityDeviceEnqueue, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"GetKernelPreferredWorkGroupSizeMultiple", 4, OpGetKernelPreferredWorkGroupSizeMultiple, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityDeviceEnqueue, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"RetainEvent", 2, OpRetainEvent, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityDeviceEnqueue, {SPV_OPERAND_TYPE_ID}}, {"ReleaseEvent", 2, OpRetainEvent, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityDeviceEnqueue, {SPV_OPERAND_TYPE_ID}}, {"CreateUserEvent", 3, OpCreateUserEvent, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityDeviceEnqueue, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}}, {"IsValidEvent", 4, OpIsValidEvent, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityDeviceEnqueue, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"SetUserEventStatus", 3, OpSetUserEventStatus, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityDeviceEnqueue, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"CapabilitytureEventProfilingInfo", 4, OpCaptureEventProfilingInfo, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityDeviceEnqueue, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_KERENL_PROFILING_INFO, SPV_OPERAND_TYPE_ID}}, {"GetDefaultQueue", 3, OpGetDefaultQueue, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityDeviceEnqueue, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}}, {"BuildNDRange", 6, OpBuildNDRange, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityDeviceEnqueue, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"ReadPipe", 5, OpReadPipe, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityPipes, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"WritePipe", 5, OpWritePipe, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityPipes, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"ReservedReadPipe", 7, OpReservedReadPipe, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityPipes, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"ReservedWritePipe", 7, OpReservedWritePipe, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityPipes, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"ReserveReadPipePackets", 5, OpReserveReadPipePackets, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityPipes, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"ReserveWritePipePackets", 5, OpReserveWritePipePackets, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityPipes, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"CommitReadPipe", 3, OpCommitReadPipe, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityPipes, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"CommitWritePipe", 3, OpCommitWritePipe, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityPipes, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"IsValidReserveId", 4, OpIsValidReserveId, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityPipes, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"GetNumPipePackets", 4, OpGetNumPipePackets, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityPipes, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"GetMaxPipePackets", 4, OpGetMaxPipePackets, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityPipes, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}}, {"GroupReserveReadPipePackets", 6, OpGroupReserveReadPipePackets, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityPipes, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"GroupReserveWritePipePackets", 6, OpGroupReserveWritePipePackets, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityPipes, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"GroupCommitReadPipe", 4, OpGroupCommitReadPipe, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityPipes, {SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}, {"GroupCommitWritePipe", 4, OpGroupCommitWritePipe, SPV_OPCODE_FLAGS_CAPABILITIES, CapabilityPipes, {SPV_OPERAND_TYPE_EXECUTION_SCOPE, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}}}; spv_result_t spvOpcodeTableGet(spv_opcode_table *pInstTable) { spvCheck(!pInstTable, return SPV_ERROR_INVALID_POINTER); static const spv_opcode_table_t table = { sizeof(opcodeTableEntries) / sizeof(spv_opcode_desc_t), opcodeTableEntries}; *pInstTable = &table; return SPV_SUCCESS; } spv_result_t spvOpcodeTableNameLookup(const spv_opcode_table table, const char *name, spv_opcode_desc *pEntry) { spvCheck(!name || !pEntry, return SPV_ERROR_INVALID_POINTER); spvCheck(!table, return SPV_ERROR_INVALID_TABLE); // TODO: This lookup of the Opcode table is suboptimal! Binary sort would be // preferable but the table requires sorting on the Opcode name, but it's // static // const initialized and matches the order of the spec. const size_t nameLength = strlen(name); for (uint64_t opcodeIndex = 0; opcodeIndex < table->count; ++opcodeIndex) { if (nameLength == strlen(table->entries[opcodeIndex].name) && !strncmp(name, table->entries[opcodeIndex].name, nameLength)) { // NOTE: Found out Opcode! *pEntry = &table->entries[opcodeIndex]; return SPV_SUCCESS; } } return SPV_ERROR_INVALID_LOOKUP; } spv_result_t spvOpcodeTableValueLookup(const spv_opcode_table table, const Op opcode, spv_opcode_desc *pEntry) { spvCheck(!table, return SPV_ERROR_INVALID_TABLE); spvCheck(!pEntry, return SPV_ERROR_INVALID_POINTER); // TODO: As above this lookup is not optimal. for (uint64_t opcodeIndex = 0; opcodeIndex < table->count; ++opcodeIndex) { if (opcode == table->entries[opcodeIndex].opcode) { // NOTE: Found the Opcode! *pEntry = &table->entries[opcodeIndex]; return SPV_SUCCESS; } } return SPV_ERROR_INVALID_LOOKUP; } int32_t spvOpcodeIsVariable(spv_opcode_desc entry) { return SPV_OPCODE_FLAGS_VARIABLE == (SPV_OPCODE_FLAGS_VARIABLE & entry->flags); } int16_t spvOpcodeResultIdIndex(spv_opcode_desc entry) { for (int16_t i = 0; i < entry->wordCount; ++i) { if (SPV_OPERAND_TYPE_RESULT_ID == entry->operandTypes[i]) return i; } return SPV_OPERAND_INVALID_RESULT_ID_INDEX; } int32_t spvOpcodeRequiresCapabilities(spv_opcode_desc entry) { return SPV_OPCODE_FLAGS_CAPABILITIES == (SPV_OPCODE_FLAGS_CAPABILITIES & entry->flags); } void spvInstructionCopy(const uint32_t *words, const Op opcode, const uint16_t wordCount, const spv_endianness_t endian, spv_instruction_t *pInst) { pInst->opcode = opcode; pInst->wordCount = wordCount; for (uint16_t wordIndex = 0; wordIndex < wordCount; ++wordIndex) { pInst->words[wordIndex] = spvFixWord(words[wordIndex], endian); if (!wordIndex) { uint16_t thisWordCount; Op thisOpcode; spvOpcodeSplit(pInst->words[wordIndex], &thisWordCount, &thisOpcode); assert(opcode == thisOpcode && wordCount == thisWordCount && "Endianness failed!"); } } } const char *spvOpcodeString(const Op opcode) { #define CASE(OPCODE) \ case OPCODE: \ return #OPCODE; switch (opcode) { CASE(OpNop) CASE(OpSource) CASE(OpSourceExtension) CASE(OpExtension) CASE(OpExtInstImport) CASE(OpMemoryModel) CASE(OpEntryPoint) CASE(OpExecutionMode) CASE(OpTypeVoid) CASE(OpTypeBool) CASE(OpTypeInt) CASE(OpTypeFloat) CASE(OpTypeVector) CASE(OpTypeMatrix) CASE(OpTypeSampler) CASE(OpTypeArray) CASE(OpTypeRuntimeArray) CASE(OpTypeStruct) CASE(OpTypeOpaque) CASE(OpTypePointer) CASE(OpTypeFunction) CASE(OpTypeEvent) CASE(OpTypeDeviceEvent) CASE(OpTypeReserveId) CASE(OpTypeQueue) CASE(OpTypePipe) CASE(OpConstantTrue) CASE(OpConstantFalse) CASE(OpConstant) CASE(OpConstantComposite) CASE(OpConstantSampler) CASE(OpConstantNull) CASE(OpSpecConstantTrue) CASE(OpSpecConstantFalse) CASE(OpSpecConstant) CASE(OpSpecConstantComposite) CASE(OpVariable) CASE(OpFunction) CASE(OpFunctionParameter) CASE(OpFunctionEnd) CASE(OpFunctionCall) CASE(OpExtInst) CASE(OpUndef) CASE(OpLoad) CASE(OpStore) CASE(OpPhi) CASE(OpDecorationGroup) CASE(OpDecorate) CASE(OpMemberDecorate) CASE(OpGroupDecorate) CASE(OpGroupMemberDecorate) CASE(OpName) CASE(OpMemberName) CASE(OpString) CASE(OpLine) CASE(OpVectorExtractDynamic) CASE(OpVectorInsertDynamic) CASE(OpVectorShuffle) CASE(OpCompositeConstruct) CASE(OpCompositeExtract) CASE(OpCompositeInsert) CASE(OpCopyObject) CASE(OpCopyMemory) CASE(OpCopyMemorySized) CASE(OpAccessChain) CASE(OpInBoundsAccessChain) CASE(OpSNegate) CASE(OpFNegate) CASE(OpNot) CASE(OpAny) CASE(OpAll) CASE(OpConvertFToU) CASE(OpConvertFToS) CASE(OpConvertSToF) CASE(OpConvertUToF) CASE(OpUConvert) CASE(OpSConvert) CASE(OpFConvert) CASE(OpConvertPtrToU) CASE(OpConvertUToPtr) CASE(OpPtrCastToGeneric) CASE(OpGenericCastToPtr) CASE(OpBitcast) CASE(OpTranspose) CASE(OpIsNan) CASE(OpIsInf) CASE(OpIsFinite) CASE(OpIsNormal) CASE(OpSignBitSet) CASE(OpLessOrGreater) CASE(OpOrdered) CASE(OpUnordered) CASE(OpArrayLength) CASE(OpIAdd) CASE(OpFAdd) CASE(OpISub) CASE(OpFSub) CASE(OpIMul) CASE(OpFMul) CASE(OpUDiv) CASE(OpSDiv) CASE(OpFDiv) CASE(OpUMod) CASE(OpSRem) CASE(OpSMod) CASE(OpFRem) CASE(OpFMod) CASE(OpVectorTimesScalar) CASE(OpMatrixTimesScalar) CASE(OpVectorTimesMatrix) CASE(OpMatrixTimesVector) CASE(OpMatrixTimesMatrix) CASE(OpOuterProduct) CASE(OpDot) CASE(OpShiftRightLogical) CASE(OpShiftRightArithmetic) CASE(OpShiftLeftLogical) CASE(OpLogicalOr) CASE(OpLogicalAnd) CASE(OpBitwiseOr) CASE(OpBitwiseXor) CASE(OpBitwiseAnd) CASE(OpSelect) CASE(OpIEqual) CASE(OpFOrdEqual) CASE(OpFUnordEqual) CASE(OpINotEqual) CASE(OpFOrdNotEqual) CASE(OpFUnordNotEqual) CASE(OpULessThan) CASE(OpSLessThan) CASE(OpFOrdLessThan) CASE(OpFUnordLessThan) CASE(OpUGreaterThan) CASE(OpSGreaterThan) CASE(OpFOrdGreaterThan) CASE(OpFUnordGreaterThan) CASE(OpULessThanEqual) CASE(OpSLessThanEqual) CASE(OpFOrdLessThanEqual) CASE(OpFUnordLessThanEqual) CASE(OpUGreaterThanEqual) CASE(OpSGreaterThanEqual) CASE(OpFOrdGreaterThanEqual) CASE(OpFUnordGreaterThanEqual) CASE(OpDPdx) CASE(OpDPdy) CASE(OpFwidth) CASE(OpDPdxFine) CASE(OpDPdyFine) CASE(OpFwidthFine) CASE(OpDPdxCoarse) CASE(OpDPdyCoarse) CASE(OpFwidthCoarse) CASE(OpEmitVertex) CASE(OpEndPrimitive) CASE(OpEmitStreamVertex) CASE(OpEndStreamPrimitive) CASE(OpControlBarrier) CASE(OpMemoryBarrier) CASE(OpAtomicLoad) CASE(OpAtomicStore) CASE(OpAtomicExchange) CASE(OpAtomicCompareExchange) CASE(OpAtomicCompareExchangeWeak) CASE(OpAtomicIIncrement) CASE(OpAtomicIDecrement) CASE(OpAtomicIAdd) CASE(OpAtomicISub) CASE(OpAtomicUMin) CASE(OpAtomicUMax) CASE(OpAtomicAnd) CASE(OpAtomicOr) CASE(OpAtomicXor) CASE(OpLoopMerge) CASE(OpSelectionMerge) CASE(OpLabel) CASE(OpBranch) CASE(OpBranchConditional) CASE(OpSwitch) CASE(OpKill) CASE(OpReturn) CASE(OpReturnValue) CASE(OpUnreachable) CASE(OpLifetimeStart) CASE(OpLifetimeStop) CASE(OpAsyncGroupCopy) CASE(OpWaitGroupEvents) CASE(OpGroupAll) CASE(OpGroupAny) CASE(OpGroupBroadcast) CASE(OpGroupIAdd) CASE(OpGroupFAdd) CASE(OpGroupFMin) CASE(OpGroupUMin) CASE(OpGroupSMin) CASE(OpGroupFMax) CASE(OpGroupUMax) CASE(OpGroupSMax) CASE(OpGenericCastToPtrExplicit) CASE(OpGenericPtrMemSemantics) CASE(OpReadPipe) CASE(OpWritePipe) CASE(OpReservedReadPipe) CASE(OpReservedWritePipe) CASE(OpReserveReadPipePackets) CASE(OpReserveWritePipePackets) CASE(OpCommitReadPipe) CASE(OpCommitWritePipe) CASE(OpIsValidReserveId) CASE(OpGetNumPipePackets) CASE(OpGetMaxPipePackets) CASE(OpGroupReserveReadPipePackets) CASE(OpGroupReserveWritePipePackets) CASE(OpGroupCommitReadPipe) CASE(OpGroupCommitWritePipe) CASE(OpEnqueueMarker) CASE(OpEnqueueKernel) CASE(OpGetKernelNDrangeSubGroupCount) CASE(OpGetKernelNDrangeMaxSubGroupSize) CASE(OpGetKernelWorkGroupSize) CASE(OpGetKernelPreferredWorkGroupSizeMultiple) CASE(OpRetainEvent) CASE(OpReleaseEvent) CASE(OpCreateUserEvent) CASE(OpIsValidEvent) CASE(OpSetUserEventStatus) CASE(OpCaptureEventProfilingInfo) CASE(OpGetDefaultQueue) CASE(OpBuildNDRange) default: assert(0 && "Unreachable!"); } #undef CASE return "unknown"; } int32_t spvOpcodeIsType(const Op opcode) { switch (opcode) { case OpTypeVoid: case OpTypeBool: case OpTypeInt: case OpTypeFloat: case OpTypeVector: case OpTypeMatrix: case OpTypeSampler: case OpTypeArray: case OpTypeRuntimeArray: case OpTypeStruct: case OpTypeOpaque: case OpTypePointer: case OpTypeFunction: case OpTypeEvent: case OpTypeDeviceEvent: case OpTypeReserveId: case OpTypeQueue: case OpTypePipe: return true; default: return false; } } int32_t spvOpcodeIsScalarType(const Op opcode) { switch (opcode) { case OpTypeInt: case OpTypeFloat: return true; default: return false; } } int32_t spvOpcodeIsConstant(const Op opcode) { switch (opcode) { case OpConstantTrue: case OpConstantFalse: case OpConstant: case OpConstantComposite: case OpConstantSampler: // case OpConstantNull: case OpConstantNull: case OpSpecConstantTrue: case OpSpecConstantFalse: case OpSpecConstant: case OpSpecConstantComposite: // case OpSpecConstantOp: return true; default: return false; } } int32_t spvOpcodeIsComposite(const Op opcode) { switch (opcode) { case OpTypeVector: case OpTypeMatrix: case OpTypeArray: case OpTypeStruct: return true; default: return false; } } int32_t spvOpcodeAreTypesEqual(const spv_instruction_t *pTypeInst0, const spv_instruction_t *pTypeInst1) { spvCheck(pTypeInst0->opcode != pTypeInst1->opcode, return false); spvCheck(pTypeInst0->words[1] != pTypeInst1->words[1], return false); return true; } int32_t spvOpcodeIsPointer(const Op opcode) { switch (opcode) { case OpVariable: case OpAccessChain: case OpInBoundsAccessChain: case OpFunctionParameter: return true; default: return false; } } int32_t spvOpcodeIsObject(const Op opcode) { switch (opcode) { case OpConstantTrue: case OpConstantFalse: case OpConstant: case OpConstantComposite: // TODO: case OpConstantSampler: case OpConstantNull: case OpSpecConstantTrue: case OpSpecConstantFalse: case OpSpecConstant: case OpSpecConstantComposite: // TODO: case OpSpecConstantOp: case OpVariable: case OpAccessChain: case OpInBoundsAccessChain: case OpConvertFToU: case OpConvertFToS: case OpConvertSToF: case OpConvertUToF: case OpUConvert: case OpSConvert: case OpFConvert: case OpConvertPtrToU: // TODO: case OpConvertUToPtr: case OpPtrCastToGeneric: // TODO: case OpGenericCastToPtr: case OpBitcast: // TODO: case OpGenericCastToPtrExplicit: case OpSatConvertSToU: case OpSatConvertUToS: case OpVectorExtractDynamic: case OpCompositeConstruct: case OpCompositeExtract: case OpCopyObject: case OpTranspose: case OpSNegate: case OpFNegate: case OpNot: case OpIAdd: case OpFAdd: case OpISub: case OpFSub: case OpIMul: case OpFMul: case OpUDiv: case OpSDiv: case OpFDiv: case OpUMod: case OpSRem: case OpSMod: case OpVectorTimesScalar: case OpMatrixTimesScalar: case OpVectorTimesMatrix: case OpMatrixTimesVector: case OpMatrixTimesMatrix: case OpOuterProduct: case OpDot: case OpShiftRightLogical: case OpShiftRightArithmetic: case OpShiftLeftLogical: case OpBitwiseOr: case OpBitwiseXor: case OpBitwiseAnd: case OpAny: case OpAll: case OpIsNan: case OpIsInf: case OpIsFinite: case OpIsNormal: case OpSignBitSet: case OpLessOrGreater: case OpOrdered: case OpUnordered: case OpLogicalOr: case OpLogicalAnd: case OpSelect: case OpIEqual: case OpFOrdEqual: case OpFUnordEqual: case OpINotEqual: case OpFOrdNotEqual: case OpFUnordNotEqual: case OpULessThan: case OpSLessThan: case OpFOrdLessThan: case OpFUnordLessThan: case OpUGreaterThan: case OpSGreaterThan: case OpFOrdGreaterThan: case OpFUnordGreaterThan: case OpULessThanEqual: case OpSLessThanEqual: case OpFOrdLessThanEqual: case OpFUnordLessThanEqual: case OpUGreaterThanEqual: case OpSGreaterThanEqual: case OpFOrdGreaterThanEqual: case OpFUnordGreaterThanEqual: case OpDPdx: case OpDPdy: case OpFwidth: case OpDPdxFine: case OpDPdyFine: case OpFwidthFine: case OpDPdxCoarse: case OpDPdyCoarse: case OpFwidthCoarse: case OpReturnValue: return true; default: return false; } } int32_t spvOpcodeIsBasicTypeNullable(Op opcode) { switch (opcode) { case OpTypeBool: case OpTypeInt: case OpTypeFloat: case OpTypePointer: case OpTypeEvent: case OpTypeDeviceEvent: case OpTypeReserveId: case OpTypeQueue: return true; default: return false; } } int32_t spvInstructionIsInBasicBlock(const spv_instruction_t *pFirstInst, const spv_instruction_t *pInst) { while (pFirstInst != pInst) { spvCheck(OpFunction == pInst->opcode, break); pInst--; } spvCheck(OpFunction != pInst->opcode, return false); return true; } int32_t spvOpcodeIsValue(Op opcode) { spvCheck(spvOpcodeIsPointer(opcode), return true); spvCheck(spvOpcodeIsConstant(opcode), return true); switch (opcode) { case OpLoad: // TODO: Other Opcode's resulting in a value return true; default: return false; } }