// *** THIS FILE IS GENERATED - DO NOT EDIT ***
// See spirv_grammar_generator.py for modifications

/***************************************************************************
 *
 * Copyright (c) 2021-2024 The Khronos Group Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * This file is related to anything that is found in the SPIR-V grammar
 * file found in the SPIRV-Headers. Mainly used for SPIR-V util functions.
 *
 ****************************************************************************/

// NOLINTBEGIN

#include "containers/custom_containers.h"
#include "spirv_grammar_helper.h"

const char* string_SpvOpcode(uint32_t opcode) {
    switch (opcode) {
        case spv::OpNop:
            return "OpNop";
        case spv::OpUndef:
            return "OpUndef";
        case spv::OpSourceContinued:
            return "OpSourceContinued";
        case spv::OpSource:
            return "OpSource";
        case spv::OpSourceExtension:
            return "OpSourceExtension";
        case spv::OpName:
            return "OpName";
        case spv::OpMemberName:
            return "OpMemberName";
        case spv::OpString:
            return "OpString";
        case spv::OpLine:
            return "OpLine";
        case spv::OpExtension:
            return "OpExtension";
        case spv::OpExtInstImport:
            return "OpExtInstImport";
        case spv::OpExtInst:
            return "OpExtInst";
        case spv::OpMemoryModel:
            return "OpMemoryModel";
        case spv::OpEntryPoint:
            return "OpEntryPoint";
        case spv::OpExecutionMode:
            return "OpExecutionMode";
        case spv::OpCapability:
            return "OpCapability";
        case spv::OpTypeVoid:
            return "OpTypeVoid";
        case spv::OpTypeBool:
            return "OpTypeBool";
        case spv::OpTypeInt:
            return "OpTypeInt";
        case spv::OpTypeFloat:
            return "OpTypeFloat";
        case spv::OpTypeVector:
            return "OpTypeVector";
        case spv::OpTypeMatrix:
            return "OpTypeMatrix";
        case spv::OpTypeImage:
            return "OpTypeImage";
        case spv::OpTypeSampler:
            return "OpTypeSampler";
        case spv::OpTypeSampledImage:
            return "OpTypeSampledImage";
        case spv::OpTypeArray:
            return "OpTypeArray";
        case spv::OpTypeRuntimeArray:
            return "OpTypeRuntimeArray";
        case spv::OpTypeStruct:
            return "OpTypeStruct";
        case spv::OpTypePointer:
            return "OpTypePointer";
        case spv::OpTypeFunction:
            return "OpTypeFunction";
        case spv::OpTypeForwardPointer:
            return "OpTypeForwardPointer";
        case spv::OpConstantTrue:
            return "OpConstantTrue";
        case spv::OpConstantFalse:
            return "OpConstantFalse";
        case spv::OpConstant:
            return "OpConstant";
        case spv::OpConstantComposite:
            return "OpConstantComposite";
        case spv::OpConstantNull:
            return "OpConstantNull";
        case spv::OpSpecConstantTrue:
            return "OpSpecConstantTrue";
        case spv::OpSpecConstantFalse:
            return "OpSpecConstantFalse";
        case spv::OpSpecConstant:
            return "OpSpecConstant";
        case spv::OpSpecConstantComposite:
            return "OpSpecConstantComposite";
        case spv::OpSpecConstantOp:
            return "OpSpecConstantOp";
        case spv::OpFunction:
            return "OpFunction";
        case spv::OpFunctionParameter:
            return "OpFunctionParameter";
        case spv::OpFunctionEnd:
            return "OpFunctionEnd";
        case spv::OpFunctionCall:
            return "OpFunctionCall";
        case spv::OpVariable:
            return "OpVariable";
        case spv::OpImageTexelPointer:
            return "OpImageTexelPointer";
        case spv::OpLoad:
            return "OpLoad";
        case spv::OpStore:
            return "OpStore";
        case spv::OpCopyMemory:
            return "OpCopyMemory";
        case spv::OpCopyMemorySized:
            return "OpCopyMemorySized";
        case spv::OpAccessChain:
            return "OpAccessChain";
        case spv::OpInBoundsAccessChain:
            return "OpInBoundsAccessChain";
        case spv::OpPtrAccessChain:
            return "OpPtrAccessChain";
        case spv::OpArrayLength:
            return "OpArrayLength";
        case spv::OpInBoundsPtrAccessChain:
            return "OpInBoundsPtrAccessChain";
        case spv::OpDecorate:
            return "OpDecorate";
        case spv::OpMemberDecorate:
            return "OpMemberDecorate";
        case spv::OpDecorationGroup:
            return "OpDecorationGroup";
        case spv::OpGroupDecorate:
            return "OpGroupDecorate";
        case spv::OpGroupMemberDecorate:
            return "OpGroupMemberDecorate";
        case spv::OpVectorExtractDynamic:
            return "OpVectorExtractDynamic";
        case spv::OpVectorInsertDynamic:
            return "OpVectorInsertDynamic";
        case spv::OpVectorShuffle:
            return "OpVectorShuffle";
        case spv::OpCompositeConstruct:
            return "OpCompositeConstruct";
        case spv::OpCompositeExtract:
            return "OpCompositeExtract";
        case spv::OpCompositeInsert:
            return "OpCompositeInsert";
        case spv::OpCopyObject:
            return "OpCopyObject";
        case spv::OpTranspose:
            return "OpTranspose";
        case spv::OpSampledImage:
            return "OpSampledImage";
        case spv::OpImageSampleImplicitLod:
            return "OpImageSampleImplicitLod";
        case spv::OpImageSampleExplicitLod:
            return "OpImageSampleExplicitLod";
        case spv::OpImageSampleDrefImplicitLod:
            return "OpImageSampleDrefImplicitLod";
        case spv::OpImageSampleDrefExplicitLod:
            return "OpImageSampleDrefExplicitLod";
        case spv::OpImageSampleProjImplicitLod:
            return "OpImageSampleProjImplicitLod";
        case spv::OpImageSampleProjExplicitLod:
            return "OpImageSampleProjExplicitLod";
        case spv::OpImageSampleProjDrefImplicitLod:
            return "OpImageSampleProjDrefImplicitLod";
        case spv::OpImageSampleProjDrefExplicitLod:
            return "OpImageSampleProjDrefExplicitLod";
        case spv::OpImageFetch:
            return "OpImageFetch";
        case spv::OpImageGather:
            return "OpImageGather";
        case spv::OpImageDrefGather:
            return "OpImageDrefGather";
        case spv::OpImageRead:
            return "OpImageRead";
        case spv::OpImageWrite:
            return "OpImageWrite";
        case spv::OpImage:
            return "OpImage";
        case spv::OpImageQuerySizeLod:
            return "OpImageQuerySizeLod";
        case spv::OpImageQuerySize:
            return "OpImageQuerySize";
        case spv::OpImageQueryLod:
            return "OpImageQueryLod";
        case spv::OpImageQueryLevels:
            return "OpImageQueryLevels";
        case spv::OpImageQuerySamples:
            return "OpImageQuerySamples";
        case spv::OpConvertFToU:
            return "OpConvertFToU";
        case spv::OpConvertFToS:
            return "OpConvertFToS";
        case spv::OpConvertSToF:
            return "OpConvertSToF";
        case spv::OpConvertUToF:
            return "OpConvertUToF";
        case spv::OpUConvert:
            return "OpUConvert";
        case spv::OpSConvert:
            return "OpSConvert";
        case spv::OpFConvert:
            return "OpFConvert";
        case spv::OpQuantizeToF16:
            return "OpQuantizeToF16";
        case spv::OpConvertPtrToU:
            return "OpConvertPtrToU";
        case spv::OpConvertUToPtr:
            return "OpConvertUToPtr";
        case spv::OpBitcast:
            return "OpBitcast";
        case spv::OpSNegate:
            return "OpSNegate";
        case spv::OpFNegate:
            return "OpFNegate";
        case spv::OpIAdd:
            return "OpIAdd";
        case spv::OpFAdd:
            return "OpFAdd";
        case spv::OpISub:
            return "OpISub";
        case spv::OpFSub:
            return "OpFSub";
        case spv::OpIMul:
            return "OpIMul";
        case spv::OpFMul:
            return "OpFMul";
        case spv::OpUDiv:
            return "OpUDiv";
        case spv::OpSDiv:
            return "OpSDiv";
        case spv::OpFDiv:
            return "OpFDiv";
        case spv::OpUMod:
            return "OpUMod";
        case spv::OpSRem:
            return "OpSRem";
        case spv::OpSMod:
            return "OpSMod";
        case spv::OpFRem:
            return "OpFRem";
        case spv::OpFMod:
            return "OpFMod";
        case spv::OpVectorTimesScalar:
            return "OpVectorTimesScalar";
        case spv::OpMatrixTimesScalar:
            return "OpMatrixTimesScalar";
        case spv::OpVectorTimesMatrix:
            return "OpVectorTimesMatrix";
        case spv::OpMatrixTimesVector:
            return "OpMatrixTimesVector";
        case spv::OpMatrixTimesMatrix:
            return "OpMatrixTimesMatrix";
        case spv::OpOuterProduct:
            return "OpOuterProduct";
        case spv::OpDot:
            return "OpDot";
        case spv::OpIAddCarry:
            return "OpIAddCarry";
        case spv::OpISubBorrow:
            return "OpISubBorrow";
        case spv::OpUMulExtended:
            return "OpUMulExtended";
        case spv::OpSMulExtended:
            return "OpSMulExtended";
        case spv::OpAny:
            return "OpAny";
        case spv::OpAll:
            return "OpAll";
        case spv::OpIsNan:
            return "OpIsNan";
        case spv::OpIsInf:
            return "OpIsInf";
        case spv::OpLogicalEqual:
            return "OpLogicalEqual";
        case spv::OpLogicalNotEqual:
            return "OpLogicalNotEqual";
        case spv::OpLogicalOr:
            return "OpLogicalOr";
        case spv::OpLogicalAnd:
            return "OpLogicalAnd";
        case spv::OpLogicalNot:
            return "OpLogicalNot";
        case spv::OpSelect:
            return "OpSelect";
        case spv::OpIEqual:
            return "OpIEqual";
        case spv::OpINotEqual:
            return "OpINotEqual";
        case spv::OpUGreaterThan:
            return "OpUGreaterThan";
        case spv::OpSGreaterThan:
            return "OpSGreaterThan";
        case spv::OpUGreaterThanEqual:
            return "OpUGreaterThanEqual";
        case spv::OpSGreaterThanEqual:
            return "OpSGreaterThanEqual";
        case spv::OpULessThan:
            return "OpULessThan";
        case spv::OpSLessThan:
            return "OpSLessThan";
        case spv::OpULessThanEqual:
            return "OpULessThanEqual";
        case spv::OpSLessThanEqual:
            return "OpSLessThanEqual";
        case spv::OpFOrdEqual:
            return "OpFOrdEqual";
        case spv::OpFUnordEqual:
            return "OpFUnordEqual";
        case spv::OpFOrdNotEqual:
            return "OpFOrdNotEqual";
        case spv::OpFUnordNotEqual:
            return "OpFUnordNotEqual";
        case spv::OpFOrdLessThan:
            return "OpFOrdLessThan";
        case spv::OpFUnordLessThan:
            return "OpFUnordLessThan";
        case spv::OpFOrdGreaterThan:
            return "OpFOrdGreaterThan";
        case spv::OpFUnordGreaterThan:
            return "OpFUnordGreaterThan";
        case spv::OpFOrdLessThanEqual:
            return "OpFOrdLessThanEqual";
        case spv::OpFUnordLessThanEqual:
            return "OpFUnordLessThanEqual";
        case spv::OpFOrdGreaterThanEqual:
            return "OpFOrdGreaterThanEqual";
        case spv::OpFUnordGreaterThanEqual:
            return "OpFUnordGreaterThanEqual";
        case spv::OpShiftRightLogical:
            return "OpShiftRightLogical";
        case spv::OpShiftRightArithmetic:
            return "OpShiftRightArithmetic";
        case spv::OpShiftLeftLogical:
            return "OpShiftLeftLogical";
        case spv::OpBitwiseOr:
            return "OpBitwiseOr";
        case spv::OpBitwiseXor:
            return "OpBitwiseXor";
        case spv::OpBitwiseAnd:
            return "OpBitwiseAnd";
        case spv::OpNot:
            return "OpNot";
        case spv::OpBitFieldInsert:
            return "OpBitFieldInsert";
        case spv::OpBitFieldSExtract:
            return "OpBitFieldSExtract";
        case spv::OpBitFieldUExtract:
            return "OpBitFieldUExtract";
        case spv::OpBitReverse:
            return "OpBitReverse";
        case spv::OpBitCount:
            return "OpBitCount";
        case spv::OpDPdx:
            return "OpDPdx";
        case spv::OpDPdy:
            return "OpDPdy";
        case spv::OpFwidth:
            return "OpFwidth";
        case spv::OpDPdxFine:
            return "OpDPdxFine";
        case spv::OpDPdyFine:
            return "OpDPdyFine";
        case spv::OpFwidthFine:
            return "OpFwidthFine";
        case spv::OpDPdxCoarse:
            return "OpDPdxCoarse";
        case spv::OpDPdyCoarse:
            return "OpDPdyCoarse";
        case spv::OpFwidthCoarse:
            return "OpFwidthCoarse";
        case spv::OpEmitVertex:
            return "OpEmitVertex";
        case spv::OpEndPrimitive:
            return "OpEndPrimitive";
        case spv::OpEmitStreamVertex:
            return "OpEmitStreamVertex";
        case spv::OpEndStreamPrimitive:
            return "OpEndStreamPrimitive";
        case spv::OpControlBarrier:
            return "OpControlBarrier";
        case spv::OpMemoryBarrier:
            return "OpMemoryBarrier";
        case spv::OpAtomicLoad:
            return "OpAtomicLoad";
        case spv::OpAtomicStore:
            return "OpAtomicStore";
        case spv::OpAtomicExchange:
            return "OpAtomicExchange";
        case spv::OpAtomicCompareExchange:
            return "OpAtomicCompareExchange";
        case spv::OpAtomicIIncrement:
            return "OpAtomicIIncrement";
        case spv::OpAtomicIDecrement:
            return "OpAtomicIDecrement";
        case spv::OpAtomicIAdd:
            return "OpAtomicIAdd";
        case spv::OpAtomicISub:
            return "OpAtomicISub";
        case spv::OpAtomicSMin:
            return "OpAtomicSMin";
        case spv::OpAtomicUMin:
            return "OpAtomicUMin";
        case spv::OpAtomicSMax:
            return "OpAtomicSMax";
        case spv::OpAtomicUMax:
            return "OpAtomicUMax";
        case spv::OpAtomicAnd:
            return "OpAtomicAnd";
        case spv::OpAtomicOr:
            return "OpAtomicOr";
        case spv::OpAtomicXor:
            return "OpAtomicXor";
        case spv::OpPhi:
            return "OpPhi";
        case spv::OpLoopMerge:
            return "OpLoopMerge";
        case spv::OpSelectionMerge:
            return "OpSelectionMerge";
        case spv::OpLabel:
            return "OpLabel";
        case spv::OpBranch:
            return "OpBranch";
        case spv::OpBranchConditional:
            return "OpBranchConditional";
        case spv::OpSwitch:
            return "OpSwitch";
        case spv::OpKill:
            return "OpKill";
        case spv::OpReturn:
            return "OpReturn";
        case spv::OpReturnValue:
            return "OpReturnValue";
        case spv::OpUnreachable:
            return "OpUnreachable";
        case spv::OpGroupAll:
            return "OpGroupAll";
        case spv::OpGroupAny:
            return "OpGroupAny";
        case spv::OpGroupBroadcast:
            return "OpGroupBroadcast";
        case spv::OpGroupIAdd:
            return "OpGroupIAdd";
        case spv::OpGroupFAdd:
            return "OpGroupFAdd";
        case spv::OpGroupFMin:
            return "OpGroupFMin";
        case spv::OpGroupUMin:
            return "OpGroupUMin";
        case spv::OpGroupSMin:
            return "OpGroupSMin";
        case spv::OpGroupFMax:
            return "OpGroupFMax";
        case spv::OpGroupUMax:
            return "OpGroupUMax";
        case spv::OpGroupSMax:
            return "OpGroupSMax";
        case spv::OpImageSparseSampleImplicitLod:
            return "OpImageSparseSampleImplicitLod";
        case spv::OpImageSparseSampleExplicitLod:
            return "OpImageSparseSampleExplicitLod";
        case spv::OpImageSparseSampleDrefImplicitLod:
            return "OpImageSparseSampleDrefImplicitLod";
        case spv::OpImageSparseSampleDrefExplicitLod:
            return "OpImageSparseSampleDrefExplicitLod";
        case spv::OpImageSparseSampleProjImplicitLod:
            return "OpImageSparseSampleProjImplicitLod";
        case spv::OpImageSparseSampleProjExplicitLod:
            return "OpImageSparseSampleProjExplicitLod";
        case spv::OpImageSparseSampleProjDrefImplicitLod:
            return "OpImageSparseSampleProjDrefImplicitLod";
        case spv::OpImageSparseSampleProjDrefExplicitLod:
            return "OpImageSparseSampleProjDrefExplicitLod";
        case spv::OpImageSparseFetch:
            return "OpImageSparseFetch";
        case spv::OpImageSparseGather:
            return "OpImageSparseGather";
        case spv::OpImageSparseDrefGather:
            return "OpImageSparseDrefGather";
        case spv::OpImageSparseTexelsResident:
            return "OpImageSparseTexelsResident";
        case spv::OpNoLine:
            return "OpNoLine";
        case spv::OpImageSparseRead:
            return "OpImageSparseRead";
        case spv::OpSizeOf:
            return "OpSizeOf";
        case spv::OpModuleProcessed:
            return "OpModuleProcessed";
        case spv::OpExecutionModeId:
            return "OpExecutionModeId";
        case spv::OpDecorateId:
            return "OpDecorateId";
        case spv::OpGroupNonUniformElect:
            return "OpGroupNonUniformElect";
        case spv::OpGroupNonUniformAll:
            return "OpGroupNonUniformAll";
        case spv::OpGroupNonUniformAny:
            return "OpGroupNonUniformAny";
        case spv::OpGroupNonUniformAllEqual:
            return "OpGroupNonUniformAllEqual";
        case spv::OpGroupNonUniformBroadcast:
            return "OpGroupNonUniformBroadcast";
        case spv::OpGroupNonUniformBroadcastFirst:
            return "OpGroupNonUniformBroadcastFirst";
        case spv::OpGroupNonUniformBallot:
            return "OpGroupNonUniformBallot";
        case spv::OpGroupNonUniformInverseBallot:
            return "OpGroupNonUniformInverseBallot";
        case spv::OpGroupNonUniformBallotBitExtract:
            return "OpGroupNonUniformBallotBitExtract";
        case spv::OpGroupNonUniformBallotBitCount:
            return "OpGroupNonUniformBallotBitCount";
        case spv::OpGroupNonUniformBallotFindLSB:
            return "OpGroupNonUniformBallotFindLSB";
        case spv::OpGroupNonUniformBallotFindMSB:
            return "OpGroupNonUniformBallotFindMSB";
        case spv::OpGroupNonUniformShuffle:
            return "OpGroupNonUniformShuffle";
        case spv::OpGroupNonUniformShuffleXor:
            return "OpGroupNonUniformShuffleXor";
        case spv::OpGroupNonUniformShuffleUp:
            return "OpGroupNonUniformShuffleUp";
        case spv::OpGroupNonUniformShuffleDown:
            return "OpGroupNonUniformShuffleDown";
        case spv::OpGroupNonUniformIAdd:
            return "OpGroupNonUniformIAdd";
        case spv::OpGroupNonUniformFAdd:
            return "OpGroupNonUniformFAdd";
        case spv::OpGroupNonUniformIMul:
            return "OpGroupNonUniformIMul";
        case spv::OpGroupNonUniformFMul:
            return "OpGroupNonUniformFMul";
        case spv::OpGroupNonUniformSMin:
            return "OpGroupNonUniformSMin";
        case spv::OpGroupNonUniformUMin:
            return "OpGroupNonUniformUMin";
        case spv::OpGroupNonUniformFMin:
            return "OpGroupNonUniformFMin";
        case spv::OpGroupNonUniformSMax:
            return "OpGroupNonUniformSMax";
        case spv::OpGroupNonUniformUMax:
            return "OpGroupNonUniformUMax";
        case spv::OpGroupNonUniformFMax:
            return "OpGroupNonUniformFMax";
        case spv::OpGroupNonUniformBitwiseAnd:
            return "OpGroupNonUniformBitwiseAnd";
        case spv::OpGroupNonUniformBitwiseOr:
            return "OpGroupNonUniformBitwiseOr";
        case spv::OpGroupNonUniformBitwiseXor:
            return "OpGroupNonUniformBitwiseXor";
        case spv::OpGroupNonUniformLogicalAnd:
            return "OpGroupNonUniformLogicalAnd";
        case spv::OpGroupNonUniformLogicalOr:
            return "OpGroupNonUniformLogicalOr";
        case spv::OpGroupNonUniformLogicalXor:
            return "OpGroupNonUniformLogicalXor";
        case spv::OpGroupNonUniformQuadBroadcast:
            return "OpGroupNonUniformQuadBroadcast";
        case spv::OpGroupNonUniformQuadSwap:
            return "OpGroupNonUniformQuadSwap";
        case spv::OpCopyLogical:
            return "OpCopyLogical";
        case spv::OpPtrEqual:
            return "OpPtrEqual";
        case spv::OpPtrNotEqual:
            return "OpPtrNotEqual";
        case spv::OpPtrDiff:
            return "OpPtrDiff";
        case spv::OpColorAttachmentReadEXT:
            return "OpColorAttachmentReadEXT";
        case spv::OpDepthAttachmentReadEXT:
            return "OpDepthAttachmentReadEXT";
        case spv::OpStencilAttachmentReadEXT:
            return "OpStencilAttachmentReadEXT";
        case spv::OpTypeTensorARM:
            return "OpTypeTensorARM";
        case spv::OpTensorReadARM:
            return "OpTensorReadARM";
        case spv::OpTensorWriteARM:
            return "OpTensorWriteARM";
        case spv::OpTensorQuerySizeARM:
            return "OpTensorQuerySizeARM";
        case spv::OpGraphConstantARM:
            return "OpGraphConstantARM";
        case spv::OpGraphEntryPointARM:
            return "OpGraphEntryPointARM";
        case spv::OpGraphARM:
            return "OpGraphARM";
        case spv::OpGraphInputARM:
            return "OpGraphInputARM";
        case spv::OpGraphSetOutputARM:
            return "OpGraphSetOutputARM";
        case spv::OpGraphEndARM:
            return "OpGraphEndARM";
        case spv::OpTypeGraphARM:
            return "OpTypeGraphARM";
        case spv::OpBitcastExtractEXT:
            return "OpBitcastExtractEXT";
        case spv::OpTerminateInvocation:
            return "OpTerminateInvocation";
        case spv::OpTypeUntypedPointerKHR:
            return "OpTypeUntypedPointerKHR";
        case spv::OpUntypedVariableKHR:
            return "OpUntypedVariableKHR";
        case spv::OpUntypedAccessChainKHR:
            return "OpUntypedAccessChainKHR";
        case spv::OpUntypedInBoundsAccessChainKHR:
            return "OpUntypedInBoundsAccessChainKHR";
        case spv::OpSubgroupBallotKHR:
            return "OpSubgroupBallotKHR";
        case spv::OpSubgroupFirstInvocationKHR:
            return "OpSubgroupFirstInvocationKHR";
        case spv::OpUntypedPtrAccessChainKHR:
            return "OpUntypedPtrAccessChainKHR";
        case spv::OpUntypedInBoundsPtrAccessChainKHR:
            return "OpUntypedInBoundsPtrAccessChainKHR";
        case spv::OpUntypedArrayLengthKHR:
            return "OpUntypedArrayLengthKHR";
        case spv::OpUntypedPrefetchKHR:
            return "OpUntypedPrefetchKHR";
        case spv::OpFmaKHR:
            return "OpFmaKHR";
        case spv::OpSubgroupAllKHR:
            return "OpSubgroupAllKHR";
        case spv::OpSubgroupAnyKHR:
            return "OpSubgroupAnyKHR";
        case spv::OpSubgroupAllEqualKHR:
            return "OpSubgroupAllEqualKHR";
        case spv::OpGroupNonUniformRotateKHR:
            return "OpGroupNonUniformRotateKHR";
        case spv::OpSubgroupReadInvocationKHR:
            return "OpSubgroupReadInvocationKHR";
        case spv::OpExtInstWithForwardRefsKHR:
            return "OpExtInstWithForwardRefsKHR";
        case spv::OpUntypedGroupAsyncCopyKHR:
            return "OpUntypedGroupAsyncCopyKHR";
        case spv::OpTraceRayKHR:
            return "OpTraceRayKHR";
        case spv::OpExecuteCallableKHR:
            return "OpExecuteCallableKHR";
        case spv::OpConvertUToAccelerationStructureKHR:
            return "OpConvertUToAccelerationStructureKHR";
        case spv::OpIgnoreIntersectionKHR:
            return "OpIgnoreIntersectionKHR";
        case spv::OpTerminateRayKHR:
            return "OpTerminateRayKHR";
        case spv::OpSDot:
            return "OpSDot";
        case spv::OpUDot:
            return "OpUDot";
        case spv::OpSUDot:
            return "OpSUDot";
        case spv::OpSDotAccSat:
            return "OpSDotAccSat";
        case spv::OpUDotAccSat:
            return "OpUDotAccSat";
        case spv::OpSUDotAccSat:
            return "OpSUDotAccSat";
        case spv::OpTypeCooperativeMatrixKHR:
            return "OpTypeCooperativeMatrixKHR";
        case spv::OpCooperativeMatrixLoadKHR:
            return "OpCooperativeMatrixLoadKHR";
        case spv::OpCooperativeMatrixStoreKHR:
            return "OpCooperativeMatrixStoreKHR";
        case spv::OpCooperativeMatrixMulAddKHR:
            return "OpCooperativeMatrixMulAddKHR";
        case spv::OpCooperativeMatrixLengthKHR:
            return "OpCooperativeMatrixLengthKHR";
        case spv::OpConstantCompositeReplicateEXT:
            return "OpConstantCompositeReplicateEXT";
        case spv::OpSpecConstantCompositeReplicateEXT:
            return "OpSpecConstantCompositeReplicateEXT";
        case spv::OpCompositeConstructReplicateEXT:
            return "OpCompositeConstructReplicateEXT";
        case spv::OpTypeRayQueryKHR:
            return "OpTypeRayQueryKHR";
        case spv::OpRayQueryInitializeKHR:
            return "OpRayQueryInitializeKHR";
        case spv::OpRayQueryTerminateKHR:
            return "OpRayQueryTerminateKHR";
        case spv::OpRayQueryGenerateIntersectionKHR:
            return "OpRayQueryGenerateIntersectionKHR";
        case spv::OpRayQueryConfirmIntersectionKHR:
            return "OpRayQueryConfirmIntersectionKHR";
        case spv::OpRayQueryProceedKHR:
            return "OpRayQueryProceedKHR";
        case spv::OpRayQueryGetIntersectionTypeKHR:
            return "OpRayQueryGetIntersectionTypeKHR";
        case spv::OpImageSampleWeightedQCOM:
            return "OpImageSampleWeightedQCOM";
        case spv::OpImageBoxFilterQCOM:
            return "OpImageBoxFilterQCOM";
        case spv::OpImageBlockMatchSSDQCOM:
            return "OpImageBlockMatchSSDQCOM";
        case spv::OpImageBlockMatchSADQCOM:
            return "OpImageBlockMatchSADQCOM";
        case spv::OpBitCastArrayQCOM:
            return "OpBitCastArrayQCOM";
        case spv::OpImageBlockMatchWindowSSDQCOM:
            return "OpImageBlockMatchWindowSSDQCOM";
        case spv::OpImageBlockMatchWindowSADQCOM:
            return "OpImageBlockMatchWindowSADQCOM";
        case spv::OpImageBlockMatchGatherSSDQCOM:
            return "OpImageBlockMatchGatherSSDQCOM";
        case spv::OpImageBlockMatchGatherSADQCOM:
            return "OpImageBlockMatchGatherSADQCOM";
        case spv::OpCompositeConstructCoopMatQCOM:
            return "OpCompositeConstructCoopMatQCOM";
        case spv::OpCompositeExtractCoopMatQCOM:
            return "OpCompositeExtractCoopMatQCOM";
        case spv::OpExtractSubArrayQCOM:
            return "OpExtractSubArrayQCOM";
        case spv::OpImageGatherQCOM:
            return "OpImageGatherQCOM";
        case spv::OpGroupIAddNonUniformAMD:
            return "OpGroupIAddNonUniformAMD";
        case spv::OpGroupFAddNonUniformAMD:
            return "OpGroupFAddNonUniformAMD";
        case spv::OpGroupFMinNonUniformAMD:
            return "OpGroupFMinNonUniformAMD";
        case spv::OpGroupUMinNonUniformAMD:
            return "OpGroupUMinNonUniformAMD";
        case spv::OpGroupSMinNonUniformAMD:
            return "OpGroupSMinNonUniformAMD";
        case spv::OpGroupFMaxNonUniformAMD:
            return "OpGroupFMaxNonUniformAMD";
        case spv::OpGroupUMaxNonUniformAMD:
            return "OpGroupUMaxNonUniformAMD";
        case spv::OpGroupSMaxNonUniformAMD:
            return "OpGroupSMaxNonUniformAMD";
        case spv::OpFragmentMaskFetchAMD:
            return "OpFragmentMaskFetchAMD";
        case spv::OpFragmentFetchAMD:
            return "OpFragmentFetchAMD";
        case spv::OpReadClockKHR:
            return "OpReadClockKHR";
        case spv::OpGroupNonUniformQuadAllKHR:
            return "OpGroupNonUniformQuadAllKHR";
        case spv::OpGroupNonUniformQuadAnyKHR:
            return "OpGroupNonUniformQuadAnyKHR";
        case spv::OpTypeBufferEXT:
            return "OpTypeBufferEXT";
        case spv::OpBufferPointerEXT:
            return "OpBufferPointerEXT";
        case spv::OpAbortKHR:
            return "OpAbortKHR";
        case spv::OpUntypedImageTexelPointerEXT:
            return "OpUntypedImageTexelPointerEXT";
        case spv::OpMemberDecorateIdEXT:
            return "OpMemberDecorateIdEXT";
        case spv::OpConstantSizeOfEXT:
            return "OpConstantSizeOfEXT";
        case spv::OpConstantDataKHR:
            return "OpConstantDataKHR";
        case spv::OpSpecConstantDataKHR:
            return "OpSpecConstantDataKHR";
        case spv::OpHitObjectRecordHitMotionNV:
            return "OpHitObjectRecordHitMotionNV";
        case spv::OpHitObjectRecordHitWithIndexMotionNV:
            return "OpHitObjectRecordHitWithIndexMotionNV";
        case spv::OpHitObjectRecordMissMotionNV:
            return "OpHitObjectRecordMissMotionNV";
        case spv::OpHitObjectGetWorldToObjectNV:
            return "OpHitObjectGetWorldToObjectNV";
        case spv::OpHitObjectGetObjectToWorldNV:
            return "OpHitObjectGetObjectToWorldNV";
        case spv::OpHitObjectGetObjectRayDirectionNV:
            return "OpHitObjectGetObjectRayDirectionNV";
        case spv::OpHitObjectGetObjectRayOriginNV:
            return "OpHitObjectGetObjectRayOriginNV";
        case spv::OpHitObjectTraceRayMotionNV:
            return "OpHitObjectTraceRayMotionNV";
        case spv::OpHitObjectGetShaderRecordBufferHandleNV:
            return "OpHitObjectGetShaderRecordBufferHandleNV";
        case spv::OpHitObjectGetShaderBindingTableRecordIndexNV:
            return "OpHitObjectGetShaderBindingTableRecordIndexNV";
        case spv::OpHitObjectRecordEmptyNV:
            return "OpHitObjectRecordEmptyNV";
        case spv::OpHitObjectTraceRayNV:
            return "OpHitObjectTraceRayNV";
        case spv::OpHitObjectRecordHitNV:
            return "OpHitObjectRecordHitNV";
        case spv::OpHitObjectRecordHitWithIndexNV:
            return "OpHitObjectRecordHitWithIndexNV";
        case spv::OpHitObjectRecordMissNV:
            return "OpHitObjectRecordMissNV";
        case spv::OpHitObjectExecuteShaderNV:
            return "OpHitObjectExecuteShaderNV";
        case spv::OpHitObjectGetCurrentTimeNV:
            return "OpHitObjectGetCurrentTimeNV";
        case spv::OpHitObjectGetAttributesNV:
            return "OpHitObjectGetAttributesNV";
        case spv::OpHitObjectGetHitKindNV:
            return "OpHitObjectGetHitKindNV";
        case spv::OpHitObjectGetPrimitiveIndexNV:
            return "OpHitObjectGetPrimitiveIndexNV";
        case spv::OpHitObjectGetGeometryIndexNV:
            return "OpHitObjectGetGeometryIndexNV";
        case spv::OpHitObjectGetInstanceIdNV:
            return "OpHitObjectGetInstanceIdNV";
        case spv::OpHitObjectGetInstanceCustomIndexNV:
            return "OpHitObjectGetInstanceCustomIndexNV";
        case spv::OpHitObjectGetWorldRayDirectionNV:
            return "OpHitObjectGetWorldRayDirectionNV";
        case spv::OpHitObjectGetWorldRayOriginNV:
            return "OpHitObjectGetWorldRayOriginNV";
        case spv::OpHitObjectGetRayTMaxNV:
            return "OpHitObjectGetRayTMaxNV";
        case spv::OpHitObjectGetRayTMinNV:
            return "OpHitObjectGetRayTMinNV";
        case spv::OpHitObjectIsEmptyNV:
            return "OpHitObjectIsEmptyNV";
        case spv::OpHitObjectIsHitNV:
            return "OpHitObjectIsHitNV";
        case spv::OpHitObjectIsMissNV:
            return "OpHitObjectIsMissNV";
        case spv::OpReorderThreadWithHitObjectNV:
            return "OpReorderThreadWithHitObjectNV";
        case spv::OpReorderThreadWithHintNV:
            return "OpReorderThreadWithHintNV";
        case spv::OpTypeHitObjectNV:
            return "OpTypeHitObjectNV";
        case spv::OpImageSampleFootprintNV:
            return "OpImageSampleFootprintNV";
        case spv::OpTypeVectorIdEXT:
            return "OpTypeVectorIdEXT";
        case spv::OpCooperativeVectorMatrixMulNV:
            return "OpCooperativeVectorMatrixMulNV";
        case spv::OpCooperativeVectorOuterProductAccumulateNV:
            return "OpCooperativeVectorOuterProductAccumulateNV";
        case spv::OpCooperativeVectorReduceSumAccumulateNV:
            return "OpCooperativeVectorReduceSumAccumulateNV";
        case spv::OpCooperativeVectorMatrixMulAddNV:
            return "OpCooperativeVectorMatrixMulAddNV";
        case spv::OpCooperativeMatrixConvertNV:
            return "OpCooperativeMatrixConvertNV";
        case spv::OpEmitMeshTasksEXT:
            return "OpEmitMeshTasksEXT";
        case spv::OpSetMeshOutputsEXT:
            return "OpSetMeshOutputsEXT";
        case spv::OpGroupNonUniformPartitionEXT:
            return "OpGroupNonUniformPartitionEXT";
        case spv::OpWritePackedPrimitiveIndices4x8NV:
            return "OpWritePackedPrimitiveIndices4x8NV";
        case spv::OpFetchMicroTriangleVertexPositionNV:
            return "OpFetchMicroTriangleVertexPositionNV";
        case spv::OpFetchMicroTriangleVertexBarycentricNV:
            return "OpFetchMicroTriangleVertexBarycentricNV";
        case spv::OpCooperativeVectorLoadNV:
            return "OpCooperativeVectorLoadNV";
        case spv::OpCooperativeVectorStoreNV:
            return "OpCooperativeVectorStoreNV";
        case spv::OpHitObjectRecordFromQueryEXT:
            return "OpHitObjectRecordFromQueryEXT";
        case spv::OpHitObjectRecordMissEXT:
            return "OpHitObjectRecordMissEXT";
        case spv::OpHitObjectRecordMissMotionEXT:
            return "OpHitObjectRecordMissMotionEXT";
        case spv::OpHitObjectGetIntersectionTriangleVertexPositionsEXT:
            return "OpHitObjectGetIntersectionTriangleVertexPositionsEXT";
        case spv::OpHitObjectGetRayFlagsEXT:
            return "OpHitObjectGetRayFlagsEXT";
        case spv::OpHitObjectSetShaderBindingTableRecordIndexEXT:
            return "OpHitObjectSetShaderBindingTableRecordIndexEXT";
        case spv::OpHitObjectReorderExecuteShaderEXT:
            return "OpHitObjectReorderExecuteShaderEXT";
        case spv::OpHitObjectTraceReorderExecuteEXT:
            return "OpHitObjectTraceReorderExecuteEXT";
        case spv::OpHitObjectTraceMotionReorderExecuteEXT:
            return "OpHitObjectTraceMotionReorderExecuteEXT";
        case spv::OpTypeHitObjectEXT:
            return "OpTypeHitObjectEXT";
        case spv::OpReorderThreadWithHintEXT:
            return "OpReorderThreadWithHintEXT";
        case spv::OpReorderThreadWithHitObjectEXT:
            return "OpReorderThreadWithHitObjectEXT";
        case spv::OpHitObjectTraceRayEXT:
            return "OpHitObjectTraceRayEXT";
        case spv::OpHitObjectTraceRayMotionEXT:
            return "OpHitObjectTraceRayMotionEXT";
        case spv::OpHitObjectRecordEmptyEXT:
            return "OpHitObjectRecordEmptyEXT";
        case spv::OpHitObjectExecuteShaderEXT:
            return "OpHitObjectExecuteShaderEXT";
        case spv::OpHitObjectGetCurrentTimeEXT:
            return "OpHitObjectGetCurrentTimeEXT";
        case spv::OpHitObjectGetAttributesEXT:
            return "OpHitObjectGetAttributesEXT";
        case spv::OpHitObjectGetHitKindEXT:
            return "OpHitObjectGetHitKindEXT";
        case spv::OpHitObjectGetPrimitiveIndexEXT:
            return "OpHitObjectGetPrimitiveIndexEXT";
        case spv::OpHitObjectGetGeometryIndexEXT:
            return "OpHitObjectGetGeometryIndexEXT";
        case spv::OpHitObjectGetInstanceIdEXT:
            return "OpHitObjectGetInstanceIdEXT";
        case spv::OpHitObjectGetInstanceCustomIndexEXT:
            return "OpHitObjectGetInstanceCustomIndexEXT";
        case spv::OpHitObjectGetObjectRayOriginEXT:
            return "OpHitObjectGetObjectRayOriginEXT";
        case spv::OpHitObjectGetObjectRayDirectionEXT:
            return "OpHitObjectGetObjectRayDirectionEXT";
        case spv::OpHitObjectGetWorldRayDirectionEXT:
            return "OpHitObjectGetWorldRayDirectionEXT";
        case spv::OpHitObjectGetWorldRayOriginEXT:
            return "OpHitObjectGetWorldRayOriginEXT";
        case spv::OpHitObjectGetObjectToWorldEXT:
            return "OpHitObjectGetObjectToWorldEXT";
        case spv::OpHitObjectGetWorldToObjectEXT:
            return "OpHitObjectGetWorldToObjectEXT";
        case spv::OpHitObjectGetRayTMaxEXT:
            return "OpHitObjectGetRayTMaxEXT";
        case spv::OpReportIntersectionKHR:
            return "OpReportIntersectionKHR";
        case spv::OpIgnoreIntersectionNV:
            return "OpIgnoreIntersectionNV";
        case spv::OpTerminateRayNV:
            return "OpTerminateRayNV";
        case spv::OpTraceNV:
            return "OpTraceNV";
        case spv::OpTraceMotionNV:
            return "OpTraceMotionNV";
        case spv::OpTraceRayMotionNV:
            return "OpTraceRayMotionNV";
        case spv::OpRayQueryGetIntersectionTriangleVertexPositionsKHR:
            return "OpRayQueryGetIntersectionTriangleVertexPositionsKHR";
        case spv::OpTypeAccelerationStructureKHR:
            return "OpTypeAccelerationStructureKHR";
        case spv::OpExecuteCallableNV:
            return "OpExecuteCallableNV";
        case spv::OpRayQueryGetIntersectionClusterIdNV:
            return "OpRayQueryGetIntersectionClusterIdNV";
        case spv::OpHitObjectGetClusterIdNV:
            return "OpHitObjectGetClusterIdNV";
        case spv::OpHitObjectGetRayTMinEXT:
            return "OpHitObjectGetRayTMinEXT";
        case spv::OpHitObjectGetShaderBindingTableRecordIndexEXT:
            return "OpHitObjectGetShaderBindingTableRecordIndexEXT";
        case spv::OpHitObjectGetShaderRecordBufferHandleEXT:
            return "OpHitObjectGetShaderRecordBufferHandleEXT";
        case spv::OpHitObjectIsEmptyEXT:
            return "OpHitObjectIsEmptyEXT";
        case spv::OpHitObjectIsHitEXT:
            return "OpHitObjectIsHitEXT";
        case spv::OpHitObjectIsMissEXT:
            return "OpHitObjectIsMissEXT";
        case spv::OpTypeCooperativeMatrixNV:
            return "OpTypeCooperativeMatrixNV";
        case spv::OpCooperativeMatrixLoadNV:
            return "OpCooperativeMatrixLoadNV";
        case spv::OpCooperativeMatrixStoreNV:
            return "OpCooperativeMatrixStoreNV";
        case spv::OpCooperativeMatrixMulAddNV:
            return "OpCooperativeMatrixMulAddNV";
        case spv::OpCooperativeMatrixLengthNV:
            return "OpCooperativeMatrixLengthNV";
        case spv::OpBeginInvocationInterlockEXT:
            return "OpBeginInvocationInterlockEXT";
        case spv::OpEndInvocationInterlockEXT:
            return "OpEndInvocationInterlockEXT";
        case spv::OpCooperativeMatrixReduceNV:
            return "OpCooperativeMatrixReduceNV";
        case spv::OpCooperativeMatrixLoadTensorNV:
            return "OpCooperativeMatrixLoadTensorNV";
        case spv::OpCooperativeMatrixStoreTensorNV:
            return "OpCooperativeMatrixStoreTensorNV";
        case spv::OpCooperativeMatrixPerElementOpNV:
            return "OpCooperativeMatrixPerElementOpNV";
        case spv::OpTypeTensorLayoutNV:
            return "OpTypeTensorLayoutNV";
        case spv::OpTypeTensorViewNV:
            return "OpTypeTensorViewNV";
        case spv::OpCreateTensorLayoutNV:
            return "OpCreateTensorLayoutNV";
        case spv::OpTensorLayoutSetDimensionNV:
            return "OpTensorLayoutSetDimensionNV";
        case spv::OpTensorLayoutSetStrideNV:
            return "OpTensorLayoutSetStrideNV";
        case spv::OpTensorLayoutSliceNV:
            return "OpTensorLayoutSliceNV";
        case spv::OpTensorLayoutSetClampValueNV:
            return "OpTensorLayoutSetClampValueNV";
        case spv::OpCreateTensorViewNV:
            return "OpCreateTensorViewNV";
        case spv::OpTensorViewSetDimensionNV:
            return "OpTensorViewSetDimensionNV";
        case spv::OpTensorViewSetStrideNV:
            return "OpTensorViewSetStrideNV";
        case spv::OpDemoteToHelperInvocation:
            return "OpDemoteToHelperInvocation";
        case spv::OpIsHelperInvocationEXT:
            return "OpIsHelperInvocationEXT";
        case spv::OpTensorViewSetClipNV:
            return "OpTensorViewSetClipNV";
        case spv::OpTensorLayoutSetBlockSizeNV:
            return "OpTensorLayoutSetBlockSizeNV";
        case spv::OpCooperativeMatrixTransposeNV:
            return "OpCooperativeMatrixTransposeNV";
        case spv::OpConvertUToImageNV:
            return "OpConvertUToImageNV";
        case spv::OpConvertUToSamplerNV:
            return "OpConvertUToSamplerNV";
        case spv::OpConvertImageToUNV:
            return "OpConvertImageToUNV";
        case spv::OpConvertSamplerToUNV:
            return "OpConvertSamplerToUNV";
        case spv::OpConvertUToSampledImageNV:
            return "OpConvertUToSampledImageNV";
        case spv::OpConvertSampledImageToUNV:
            return "OpConvertSampledImageToUNV";
        case spv::OpSamplerImageAddressingModeNV:
            return "OpSamplerImageAddressingModeNV";
        case spv::OpRawAccessChainNV:
            return "OpRawAccessChainNV";
        case spv::OpRayQueryGetIntersectionSpherePositionNV:
            return "OpRayQueryGetIntersectionSpherePositionNV";
        case spv::OpRayQueryGetIntersectionSphereRadiusNV:
            return "OpRayQueryGetIntersectionSphereRadiusNV";
        case spv::OpRayQueryGetIntersectionLSSPositionsNV:
            return "OpRayQueryGetIntersectionLSSPositionsNV";
        case spv::OpRayQueryGetIntersectionLSSRadiiNV:
            return "OpRayQueryGetIntersectionLSSRadiiNV";
        case spv::OpRayQueryGetIntersectionLSSHitValueNV:
            return "OpRayQueryGetIntersectionLSSHitValueNV";
        case spv::OpHitObjectGetSpherePositionNV:
            return "OpHitObjectGetSpherePositionNV";
        case spv::OpHitObjectGetSphereRadiusNV:
            return "OpHitObjectGetSphereRadiusNV";
        case spv::OpHitObjectGetLSSPositionsNV:
            return "OpHitObjectGetLSSPositionsNV";
        case spv::OpHitObjectGetLSSRadiiNV:
            return "OpHitObjectGetLSSRadiiNV";
        case spv::OpHitObjectIsSphereHitNV:
            return "OpHitObjectIsSphereHitNV";
        case spv::OpHitObjectIsLSSHitNV:
            return "OpHitObjectIsLSSHitNV";
        case spv::OpRayQueryIsSphereHitNV:
            return "OpRayQueryIsSphereHitNV";
        case spv::OpRayQueryIsLSSHitNV:
            return "OpRayQueryIsLSSHitNV";
        case spv::OpUCountLeadingZerosINTEL:
            return "OpUCountLeadingZerosINTEL";
        case spv::OpUCountTrailingZerosINTEL:
            return "OpUCountTrailingZerosINTEL";
        case spv::OpAbsISubINTEL:
            return "OpAbsISubINTEL";
        case spv::OpAbsUSubINTEL:
            return "OpAbsUSubINTEL";
        case spv::OpIAddSatINTEL:
            return "OpIAddSatINTEL";
        case spv::OpUAddSatINTEL:
            return "OpUAddSatINTEL";
        case spv::OpIAverageINTEL:
            return "OpIAverageINTEL";
        case spv::OpUAverageINTEL:
            return "OpUAverageINTEL";
        case spv::OpIAverageRoundedINTEL:
            return "OpIAverageRoundedINTEL";
        case spv::OpUAverageRoundedINTEL:
            return "OpUAverageRoundedINTEL";
        case spv::OpISubSatINTEL:
            return "OpISubSatINTEL";
        case spv::OpUSubSatINTEL:
            return "OpUSubSatINTEL";
        case spv::OpIMul32x16INTEL:
            return "OpIMul32x16INTEL";
        case spv::OpUMul32x16INTEL:
            return "OpUMul32x16INTEL";
        case spv::OpConstantFunctionPointerINTEL:
            return "OpConstantFunctionPointerINTEL";
        case spv::OpFunctionPointerCallINTEL:
            return "OpFunctionPointerCallINTEL";
        case spv::OpAtomicFMinEXT:
            return "OpAtomicFMinEXT";
        case spv::OpAtomicFMaxEXT:
            return "OpAtomicFMaxEXT";
        case spv::OpAssumeTrueKHR:
            return "OpAssumeTrueKHR";
        case spv::OpExpectKHR:
            return "OpExpectKHR";
        case spv::OpDecorateString:
            return "OpDecorateString";
        case spv::OpMemberDecorateString:
            return "OpMemberDecorateString";
        case spv::OpRayQueryGetRayTMinKHR:
            return "OpRayQueryGetRayTMinKHR";
        case spv::OpRayQueryGetRayFlagsKHR:
            return "OpRayQueryGetRayFlagsKHR";
        case spv::OpRayQueryGetIntersectionTKHR:
            return "OpRayQueryGetIntersectionTKHR";
        case spv::OpRayQueryGetIntersectionInstanceCustomIndexKHR:
            return "OpRayQueryGetIntersectionInstanceCustomIndexKHR";
        case spv::OpRayQueryGetIntersectionInstanceIdKHR:
            return "OpRayQueryGetIntersectionInstanceIdKHR";
        case spv::OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR:
            return "OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR";
        case spv::OpRayQueryGetIntersectionGeometryIndexKHR:
            return "OpRayQueryGetIntersectionGeometryIndexKHR";
        case spv::OpRayQueryGetIntersectionPrimitiveIndexKHR:
            return "OpRayQueryGetIntersectionPrimitiveIndexKHR";
        case spv::OpRayQueryGetIntersectionBarycentricsKHR:
            return "OpRayQueryGetIntersectionBarycentricsKHR";
        case spv::OpRayQueryGetIntersectionFrontFaceKHR:
            return "OpRayQueryGetIntersectionFrontFaceKHR";
        case spv::OpRayQueryGetIntersectionCandidateAABBOpaqueKHR:
            return "OpRayQueryGetIntersectionCandidateAABBOpaqueKHR";
        case spv::OpRayQueryGetIntersectionObjectRayDirectionKHR:
            return "OpRayQueryGetIntersectionObjectRayDirectionKHR";
        case spv::OpRayQueryGetIntersectionObjectRayOriginKHR:
            return "OpRayQueryGetIntersectionObjectRayOriginKHR";
        case spv::OpRayQueryGetWorldRayDirectionKHR:
            return "OpRayQueryGetWorldRayDirectionKHR";
        case spv::OpRayQueryGetWorldRayOriginKHR:
            return "OpRayQueryGetWorldRayOriginKHR";
        case spv::OpRayQueryGetIntersectionObjectToWorldKHR:
            return "OpRayQueryGetIntersectionObjectToWorldKHR";
        case spv::OpRayQueryGetIntersectionWorldToObjectKHR:
            return "OpRayQueryGetIntersectionWorldToObjectKHR";
        case spv::OpAtomicFAddEXT:
            return "OpAtomicFAddEXT";
        case spv::OpControlBarrierArriveEXT:
            return "OpControlBarrierArriveEXT";
        case spv::OpControlBarrierWaitEXT:
            return "OpControlBarrierWaitEXT";
        case spv::OpArithmeticFenceEXT:
            return "OpArithmeticFenceEXT";
        case spv::OpSubgroupBlockPrefetchINTEL:
            return "OpSubgroupBlockPrefetchINTEL";
        case spv::OpSubgroup2DBlockLoadINTEL:
            return "OpSubgroup2DBlockLoadINTEL";
        case spv::OpSubgroup2DBlockLoadTransformINTEL:
            return "OpSubgroup2DBlockLoadTransformINTEL";
        case spv::OpSubgroup2DBlockLoadTransposeINTEL:
            return "OpSubgroup2DBlockLoadTransposeINTEL";
        case spv::OpSubgroup2DBlockPrefetchINTEL:
            return "OpSubgroup2DBlockPrefetchINTEL";
        case spv::OpSubgroup2DBlockStoreINTEL:
            return "OpSubgroup2DBlockStoreINTEL";
        case spv::OpSubgroupMatrixMultiplyAccumulateINTEL:
            return "OpSubgroupMatrixMultiplyAccumulateINTEL";
        case spv::OpBitwiseFunctionINTEL:
            return "OpBitwiseFunctionINTEL";
        case spv::OpUntypedVariableLengthArrayINTEL:
            return "OpUntypedVariableLengthArrayINTEL";
        case spv::OpPredicatedLoadINTEL:
            return "OpPredicatedLoadINTEL";
        case spv::OpPredicatedStoreINTEL:
            return "OpPredicatedStoreINTEL";
        case spv::OpGroupIMulKHR:
            return "OpGroupIMulKHR";
        case spv::OpGroupFMulKHR:
            return "OpGroupFMulKHR";
        case spv::OpGroupBitwiseAndKHR:
            return "OpGroupBitwiseAndKHR";
        case spv::OpGroupBitwiseOrKHR:
            return "OpGroupBitwiseOrKHR";
        case spv::OpGroupBitwiseXorKHR:
            return "OpGroupBitwiseXorKHR";
        case spv::OpGroupLogicalAndKHR:
            return "OpGroupLogicalAndKHR";
        case spv::OpGroupLogicalOrKHR:
            return "OpGroupLogicalOrKHR";
        case spv::OpGroupLogicalXorKHR:
            return "OpGroupLogicalXorKHR";
        case spv::OpRoundFToTF32INTEL:
            return "OpRoundFToTF32INTEL";
        case spv::OpFDot2MixAcc32VALVE:
            return "OpFDot2MixAcc32VALVE";
        case spv::OpFDot2MixAcc16VALVE:
            return "OpFDot2MixAcc16VALVE";
        case spv::OpFDot4MixAcc32VALVE:
            return "OpFDot4MixAcc32VALVE";

#ifdef VK_ENABLE_BETA_EXTENSIONS
        case spv::OpAllocateNodePayloadsAMDX:
            return "OpAllocateNodePayloadsAMDX";
        case spv::OpEnqueueNodePayloadsAMDX:
            return "OpEnqueueNodePayloadsAMDX";
        case spv::OpTypeNodePayloadArrayAMDX:
            return "OpTypeNodePayloadArrayAMDX";
        case spv::OpFinishWritingNodePayloadAMDX:
            return "OpFinishWritingNodePayloadAMDX";
        case spv::OpNodePayloadArrayLengthAMDX:
            return "OpNodePayloadArrayLengthAMDX";
        case spv::OpIsNodePayloadValidAMDX:
            return "OpIsNodePayloadValidAMDX";
        case spv::OpConstantStringAMDX:
            return "OpConstantStringAMDX";
        case spv::OpSpecConstantStringAMDX:
            return "OpSpecConstantStringAMDX";
        case spv::OpPoisonKHR:
            return "OpPoisonKHR";
        case spv::OpFreezeKHR:
            return "OpFreezeKHR";
        case spv::OpConditionalExtensionINTEL:
            return "OpConditionalExtensionINTEL";
        case spv::OpConditionalEntryPointINTEL:
            return "OpConditionalEntryPointINTEL";
        case spv::OpConditionalCapabilityINTEL:
            return "OpConditionalCapabilityINTEL";
        case spv::OpSpecConstantTargetINTEL:
            return "OpSpecConstantTargetINTEL";
        case spv::OpSpecConstantArchitectureINTEL:
            return "OpSpecConstantArchitectureINTEL";
        case spv::OpSpecConstantCapabilitiesINTEL:
            return "OpSpecConstantCapabilitiesINTEL";
        case spv::OpConditionalCopyObjectINTEL:
            return "OpConditionalCopyObjectINTEL";
        case spv::OpConvertHandleToImageINTEL:
            return "OpConvertHandleToImageINTEL";
        case spv::OpConvertHandleToSamplerINTEL:
            return "OpConvertHandleToSamplerINTEL";
        case spv::OpConvertHandleToSampledImageINTEL:
            return "OpConvertHandleToSampledImageINTEL";
#endif
        default:
            return "Unknown Opcode";
    }
}

const char* string_SpvStorageClass(uint32_t storage_class) {
    switch (storage_class) {
        case spv::StorageClassUniformConstant:
            return "UniformConstant";
        case spv::StorageClassInput:
            return "Input";
        case spv::StorageClassUniform:
            return "Uniform";
        case spv::StorageClassOutput:
            return "Output";
        case spv::StorageClassWorkgroup:
            return "Workgroup";
        case spv::StorageClassCrossWorkgroup:
            return "CrossWorkgroup";
        case spv::StorageClassPrivate:
            return "Private";
        case spv::StorageClassFunction:
            return "Function";
        case spv::StorageClassGeneric:
            return "Generic";
        case spv::StorageClassPushConstant:
            return "PushConstant";
        case spv::StorageClassAtomicCounter:
            return "AtomicCounter";
        case spv::StorageClassImage:
            return "Image";
        case spv::StorageClassStorageBuffer:
            return "StorageBuffer";
        case spv::StorageClassTileImageEXT:
            return "TileImageEXT";
        case spv::StorageClassTileAttachmentQCOM:
            return "TileAttachmentQCOM";
        case spv::StorageClassCallableDataKHR:
            return "CallableDataKHR";
        case spv::StorageClassIncomingCallableDataKHR:
            return "IncomingCallableDataKHR";
        case spv::StorageClassRayPayloadKHR:
            return "RayPayloadKHR";
        case spv::StorageClassHitAttributeKHR:
            return "HitAttributeKHR";
        case spv::StorageClassIncomingRayPayloadKHR:
            return "IncomingRayPayloadKHR";
        case spv::StorageClassShaderRecordBufferKHR:
            return "ShaderRecordBufferKHR";
        case spv::StorageClassPhysicalStorageBuffer:
            return "PhysicalStorageBuffer";
        case spv::StorageClassHitObjectAttributeNV:
            return "HitObjectAttributeNV";
        case spv::StorageClassTaskPayloadWorkgroupEXT:
            return "TaskPayloadWorkgroupEXT";
        case spv::StorageClassHitObjectAttributeEXT:
            return "HitObjectAttributeEXT";
        case spv::StorageClassCodeSectionINTEL:
            return "CodeSectionINTEL";
        case spv::StorageClassDeviceOnlyALTERA:
            return "DeviceOnlyALTERA";
        case spv::StorageClassHostOnlyALTERA:
            return "HostOnlyALTERA";

#ifdef VK_ENABLE_BETA_EXTENSIONS
        case spv::StorageClassNodePayloadAMDX:
            return "NodePayloadAMDX";
#endif
        default:
            return "Unknown Storage Class";
    }
}

const char* string_SpvExecutionModel(uint32_t execution_model) {
    switch (execution_model) {
        case spv::ExecutionModelVertex:
            return "Vertex";
        case spv::ExecutionModelTessellationControl:
            return "TessellationControl";
        case spv::ExecutionModelTessellationEvaluation:
            return "TessellationEvaluation";
        case spv::ExecutionModelGeometry:
            return "Geometry";
        case spv::ExecutionModelFragment:
            return "Fragment";
        case spv::ExecutionModelGLCompute:
            return "GLCompute";
        case spv::ExecutionModelKernel:
            return "Kernel";
        case spv::ExecutionModelTaskNV:
            return "TaskNV";
        case spv::ExecutionModelMeshNV:
            return "MeshNV";
        case spv::ExecutionModelRayGenerationKHR:
            return "RayGenerationKHR";
        case spv::ExecutionModelIntersectionKHR:
            return "IntersectionKHR";
        case spv::ExecutionModelAnyHitKHR:
            return "AnyHitKHR";
        case spv::ExecutionModelClosestHitKHR:
            return "ClosestHitKHR";
        case spv::ExecutionModelMissKHR:
            return "MissKHR";
        case spv::ExecutionModelCallableKHR:
            return "CallableKHR";
        case spv::ExecutionModelTaskEXT:
            return "TaskEXT";
        case spv::ExecutionModelMeshEXT:
            return "MeshEXT";

#ifdef VK_ENABLE_BETA_EXTENSIONS
#endif
        default:
            return "Unknown Execution Model";
    }
}

const char* string_SpvExecutionMode(uint32_t execution_mode) {
    switch (execution_mode) {
        case spv::ExecutionModeInvocations:
            return "Invocations";
        case spv::ExecutionModeSpacingEqual:
            return "SpacingEqual";
        case spv::ExecutionModeSpacingFractionalEven:
            return "SpacingFractionalEven";
        case spv::ExecutionModeSpacingFractionalOdd:
            return "SpacingFractionalOdd";
        case spv::ExecutionModeVertexOrderCw:
            return "VertexOrderCw";
        case spv::ExecutionModeVertexOrderCcw:
            return "VertexOrderCcw";
        case spv::ExecutionModePixelCenterInteger:
            return "PixelCenterInteger";
        case spv::ExecutionModeOriginUpperLeft:
            return "OriginUpperLeft";
        case spv::ExecutionModeOriginLowerLeft:
            return "OriginLowerLeft";
        case spv::ExecutionModeEarlyFragmentTests:
            return "EarlyFragmentTests";
        case spv::ExecutionModePointMode:
            return "PointMode";
        case spv::ExecutionModeXfb:
            return "Xfb";
        case spv::ExecutionModeDepthReplacing:
            return "DepthReplacing";
        case spv::ExecutionModeDepthGreater:
            return "DepthGreater";
        case spv::ExecutionModeDepthLess:
            return "DepthLess";
        case spv::ExecutionModeDepthUnchanged:
            return "DepthUnchanged";
        case spv::ExecutionModeLocalSize:
            return "LocalSize";
        case spv::ExecutionModeLocalSizeHint:
            return "LocalSizeHint";
        case spv::ExecutionModeInputPoints:
            return "InputPoints";
        case spv::ExecutionModeInputLines:
            return "InputLines";
        case spv::ExecutionModeInputLinesAdjacency:
            return "InputLinesAdjacency";
        case spv::ExecutionModeTriangles:
            return "Triangles";
        case spv::ExecutionModeInputTrianglesAdjacency:
            return "InputTrianglesAdjacency";
        case spv::ExecutionModeQuads:
            return "Quads";
        case spv::ExecutionModeIsolines:
            return "Isolines";
        case spv::ExecutionModeOutputVertices:
            return "OutputVertices";
        case spv::ExecutionModeOutputPoints:
            return "OutputPoints";
        case spv::ExecutionModeOutputLineStrip:
            return "OutputLineStrip";
        case spv::ExecutionModeOutputTriangleStrip:
            return "OutputTriangleStrip";
        case spv::ExecutionModeVecTypeHint:
            return "VecTypeHint";
        case spv::ExecutionModeContractionOff:
            return "ContractionOff";
        case spv::ExecutionModeInitializer:
            return "Initializer";
        case spv::ExecutionModeFinalizer:
            return "Finalizer";
        case spv::ExecutionModeSubgroupSize:
            return "SubgroupSize";
        case spv::ExecutionModeSubgroupsPerWorkgroup:
            return "SubgroupsPerWorkgroup";
        case spv::ExecutionModeSubgroupsPerWorkgroupId:
            return "SubgroupsPerWorkgroupId";
        case spv::ExecutionModeLocalSizeId:
            return "LocalSizeId";
        case spv::ExecutionModeLocalSizeHintId:
            return "LocalSizeHintId";
        case spv::ExecutionModeNonCoherentColorAttachmentReadEXT:
            return "NonCoherentColorAttachmentReadEXT";
        case spv::ExecutionModeNonCoherentDepthAttachmentReadEXT:
            return "NonCoherentDepthAttachmentReadEXT";
        case spv::ExecutionModeNonCoherentStencilAttachmentReadEXT:
            return "NonCoherentStencilAttachmentReadEXT";
        case spv::ExecutionModeSubgroupUniformControlFlowKHR:
            return "SubgroupUniformControlFlowKHR";
        case spv::ExecutionModePostDepthCoverage:
            return "PostDepthCoverage";
        case spv::ExecutionModeDenormPreserve:
            return "DenormPreserve";
        case spv::ExecutionModeDenormFlushToZero:
            return "DenormFlushToZero";
        case spv::ExecutionModeSignedZeroInfNanPreserve:
            return "SignedZeroInfNanPreserve";
        case spv::ExecutionModeRoundingModeRTE:
            return "RoundingModeRTE";
        case spv::ExecutionModeRoundingModeRTZ:
            return "RoundingModeRTZ";
        case spv::ExecutionModeNonCoherentTileAttachmentReadQCOM:
            return "NonCoherentTileAttachmentReadQCOM";
        case spv::ExecutionModeTileShadingRateQCOM:
            return "TileShadingRateQCOM";
        case spv::ExecutionModeEarlyAndLateFragmentTestsAMD:
            return "EarlyAndLateFragmentTestsAMD";
        case spv::ExecutionModeStencilRefReplacingEXT:
            return "StencilRefReplacingEXT";
        case spv::ExecutionModeStencilRefUnchangedFrontAMD:
            return "StencilRefUnchangedFrontAMD";
        case spv::ExecutionModeStencilRefGreaterFrontAMD:
            return "StencilRefGreaterFrontAMD";
        case spv::ExecutionModeStencilRefLessFrontAMD:
            return "StencilRefLessFrontAMD";
        case spv::ExecutionModeStencilRefUnchangedBackAMD:
            return "StencilRefUnchangedBackAMD";
        case spv::ExecutionModeStencilRefGreaterBackAMD:
            return "StencilRefGreaterBackAMD";
        case spv::ExecutionModeStencilRefLessBackAMD:
            return "StencilRefLessBackAMD";
        case spv::ExecutionModeQuadDerivativesKHR:
            return "QuadDerivativesKHR";
        case spv::ExecutionModeRequireFullQuadsKHR:
            return "RequireFullQuadsKHR";
        case spv::ExecutionModeOutputLinesEXT:
            return "OutputLinesEXT";
        case spv::ExecutionModeOutputPrimitivesEXT:
            return "OutputPrimitivesEXT";
        case spv::ExecutionModeDerivativeGroupQuadsKHR:
            return "DerivativeGroupQuadsKHR";
        case spv::ExecutionModeDerivativeGroupLinearKHR:
            return "DerivativeGroupLinearKHR";
        case spv::ExecutionModeOutputTrianglesEXT:
            return "OutputTrianglesEXT";
        case spv::ExecutionModePixelInterlockOrderedEXT:
            return "PixelInterlockOrderedEXT";
        case spv::ExecutionModePixelInterlockUnorderedEXT:
            return "PixelInterlockUnorderedEXT";
        case spv::ExecutionModeSampleInterlockOrderedEXT:
            return "SampleInterlockOrderedEXT";
        case spv::ExecutionModeSampleInterlockUnorderedEXT:
            return "SampleInterlockUnorderedEXT";
        case spv::ExecutionModeShadingRateInterlockOrderedEXT:
            return "ShadingRateInterlockOrderedEXT";
        case spv::ExecutionModeShadingRateInterlockUnorderedEXT:
            return "ShadingRateInterlockUnorderedEXT";
        case spv::ExecutionModeShader64BitIndexingEXT:
            return "Shader64BitIndexingEXT";
        case spv::ExecutionModeSharedLocalMemorySizeINTEL:
            return "SharedLocalMemorySizeINTEL";
        case spv::ExecutionModeRoundingModeRTPINTEL:
            return "RoundingModeRTPINTEL";
        case spv::ExecutionModeRoundingModeRTNINTEL:
            return "RoundingModeRTNINTEL";
        case spv::ExecutionModeFloatingPointModeALTINTEL:
            return "FloatingPointModeALTINTEL";
        case spv::ExecutionModeFloatingPointModeIEEEINTEL:
            return "FloatingPointModeIEEEINTEL";
        case spv::ExecutionModeMaxWorkgroupSizeINTEL:
            return "MaxWorkgroupSizeINTEL";
        case spv::ExecutionModeMaxWorkDimINTEL:
            return "MaxWorkDimINTEL";
        case spv::ExecutionModeNoGlobalOffsetINTEL:
            return "NoGlobalOffsetINTEL";
        case spv::ExecutionModeNumSIMDWorkitemsINTEL:
            return "NumSIMDWorkitemsINTEL";
        case spv::ExecutionModeSchedulerTargetFmaxMhzINTEL:
            return "SchedulerTargetFmaxMhzINTEL";
        case spv::ExecutionModeMaximallyReconvergesKHR:
            return "MaximallyReconvergesKHR";
        case spv::ExecutionModeFPFastMathDefault:
            return "FPFastMathDefault";
        case spv::ExecutionModeOpacityMicromapIdKHR:
            return "OpacityMicromapIdKHR";
        case spv::ExecutionModeStreamingInterfaceINTEL:
            return "StreamingInterfaceINTEL";
        case spv::ExecutionModeRegisterMapInterfaceINTEL:
            return "RegisterMapInterfaceINTEL";
        case spv::ExecutionModeNamedBarrierCountINTEL:
            return "NamedBarrierCountINTEL";
        case spv::ExecutionModeMaximumRegistersINTEL:
            return "MaximumRegistersINTEL";
        case spv::ExecutionModeMaximumRegistersIdINTEL:
            return "MaximumRegistersIdINTEL";
        case spv::ExecutionModeNamedMaximumRegistersINTEL:
            return "NamedMaximumRegistersINTEL";

#ifdef VK_ENABLE_BETA_EXTENSIONS
        case spv::ExecutionModeCoalescingAMDX:
            return "CoalescingAMDX";
        case spv::ExecutionModeIsApiEntryAMDX:
            return "IsApiEntryAMDX";
        case spv::ExecutionModeMaxNodeRecursionAMDX:
            return "MaxNodeRecursionAMDX";
        case spv::ExecutionModeStaticNumWorkgroupsAMDX:
            return "StaticNumWorkgroupsAMDX";
        case spv::ExecutionModeShaderIndexAMDX:
            return "ShaderIndexAMDX";
        case spv::ExecutionModeMaxNumWorkgroupsAMDX:
            return "MaxNumWorkgroupsAMDX";
        case spv::ExecutionModeSharesInputWithAMDX:
            return "SharesInputWithAMDX";
        case spv::ExecutionModeArithmeticPoisonKHR:
            return "ArithmeticPoisonKHR";
#endif
        default:
            return "Unknown Execution Mode";
    }
}

const char* string_SpvDecoration(uint32_t decoration) {
    switch (decoration) {
        case spv::DecorationRelaxedPrecision:
            return "RelaxedPrecision";
        case spv::DecorationSpecId:
            return "SpecId";
        case spv::DecorationBlock:
            return "Block";
        case spv::DecorationBufferBlock:
            return "BufferBlock";
        case spv::DecorationRowMajor:
            return "RowMajor";
        case spv::DecorationColMajor:
            return "ColMajor";
        case spv::DecorationArrayStride:
            return "ArrayStride";
        case spv::DecorationMatrixStride:
            return "MatrixStride";
        case spv::DecorationGLSLShared:
            return "GLSLShared";
        case spv::DecorationGLSLPacked:
            return "GLSLPacked";
        case spv::DecorationCPacked:
            return "CPacked";
        case spv::DecorationBuiltIn:
            return "BuiltIn";
        case spv::DecorationNoPerspective:
            return "NoPerspective";
        case spv::DecorationFlat:
            return "Flat";
        case spv::DecorationPatch:
            return "Patch";
        case spv::DecorationCentroid:
            return "Centroid";
        case spv::DecorationSample:
            return "Sample";
        case spv::DecorationInvariant:
            return "Invariant";
        case spv::DecorationRestrict:
            return "Restrict";
        case spv::DecorationAliased:
            return "Aliased";
        case spv::DecorationVolatile:
            return "Volatile";
        case spv::DecorationConstant:
            return "Constant";
        case spv::DecorationCoherent:
            return "Coherent";
        case spv::DecorationNonWritable:
            return "NonWritable";
        case spv::DecorationNonReadable:
            return "NonReadable";
        case spv::DecorationUniform:
            return "Uniform";
        case spv::DecorationUniformId:
            return "UniformId";
        case spv::DecorationSaturatedConversion:
            return "SaturatedConversion";
        case spv::DecorationStream:
            return "Stream";
        case spv::DecorationLocation:
            return "Location";
        case spv::DecorationComponent:
            return "Component";
        case spv::DecorationIndex:
            return "Index";
        case spv::DecorationBinding:
            return "Binding";
        case spv::DecorationDescriptorSet:
            return "DescriptorSet";
        case spv::DecorationOffset:
            return "Offset";
        case spv::DecorationXfbBuffer:
            return "XfbBuffer";
        case spv::DecorationXfbStride:
            return "XfbStride";
        case spv::DecorationFuncParamAttr:
            return "FuncParamAttr";
        case spv::DecorationFPRoundingMode:
            return "FPRoundingMode";
        case spv::DecorationFPFastMathMode:
            return "FPFastMathMode";
        case spv::DecorationLinkageAttributes:
            return "LinkageAttributes";
        case spv::DecorationNoContraction:
            return "NoContraction";
        case spv::DecorationInputAttachmentIndex:
            return "InputAttachmentIndex";
        case spv::DecorationAlignment:
            return "Alignment";
        case spv::DecorationMaxByteOffset:
            return "MaxByteOffset";
        case spv::DecorationAlignmentId:
            return "AlignmentId";
        case spv::DecorationMaxByteOffsetId:
            return "MaxByteOffsetId";
        case spv::DecorationSaturatedToLargestFloat8NormalConversionEXT:
            return "SaturatedToLargestFloat8NormalConversionEXT";
        case spv::DecorationNoSignedWrap:
            return "NoSignedWrap";
        case spv::DecorationNoUnsignedWrap:
            return "NoUnsignedWrap";
        case spv::DecorationWeightTextureQCOM:
            return "WeightTextureQCOM";
        case spv::DecorationBlockMatchTextureQCOM:
            return "BlockMatchTextureQCOM";
        case spv::DecorationBlockMatchSamplerQCOM:
            return "BlockMatchSamplerQCOM";
        case spv::DecorationExplicitInterpAMD:
            return "ExplicitInterpAMD";
        case spv::DecorationArrayStrideIdEXT:
            return "ArrayStrideIdEXT";
        case spv::DecorationOffsetIdEXT:
            return "OffsetIdEXT";
        case spv::DecorationUTFEncodedKHR:
            return "UTFEncodedKHR";
        case spv::DecorationOverrideCoverageNV:
            return "OverrideCoverageNV";
        case spv::DecorationPassthroughNV:
            return "PassthroughNV";
        case spv::DecorationViewportRelativeNV:
            return "ViewportRelativeNV";
        case spv::DecorationSecondaryViewportRelativeNV:
            return "SecondaryViewportRelativeNV";
        case spv::DecorationPerPrimitiveEXT:
            return "PerPrimitiveEXT";
        case spv::DecorationPerViewNV:
            return "PerViewNV";
        case spv::DecorationPerTaskNV:
            return "PerTaskNV";
        case spv::DecorationPerVertexKHR:
            return "PerVertexKHR";
        case spv::DecorationNonUniform:
            return "NonUniform";
        case spv::DecorationRestrictPointer:
            return "RestrictPointer";
        case spv::DecorationAliasedPointer:
            return "AliasedPointer";
        case spv::DecorationMemberOffsetNV:
            return "MemberOffsetNV";
        case spv::DecorationHitObjectShaderRecordBufferNV:
            return "HitObjectShaderRecordBufferNV";
        case spv::DecorationHitObjectShaderRecordBufferEXT:
            return "HitObjectShaderRecordBufferEXT";
        case spv::DecorationBankNV:
            return "BankNV";
        case spv::DecorationBindlessSamplerNV:
            return "BindlessSamplerNV";
        case spv::DecorationBindlessImageNV:
            return "BindlessImageNV";
        case spv::DecorationBoundSamplerNV:
            return "BoundSamplerNV";
        case spv::DecorationBoundImageNV:
            return "BoundImageNV";
        case spv::DecorationSIMTCallINTEL:
            return "SIMTCallINTEL";
        case spv::DecorationReferencedIndirectlyINTEL:
            return "ReferencedIndirectlyINTEL";
        case spv::DecorationClobberINTEL:
            return "ClobberINTEL";
        case spv::DecorationSideEffectsINTEL:
            return "SideEffectsINTEL";
        case spv::DecorationVectorComputeVariableINTEL:
            return "VectorComputeVariableINTEL";
        case spv::DecorationFuncParamIOKindINTEL:
            return "FuncParamIOKindINTEL";
        case spv::DecorationVectorComputeFunctionINTEL:
            return "VectorComputeFunctionINTEL";
        case spv::DecorationStackCallINTEL:
            return "StackCallINTEL";
        case spv::DecorationGlobalVariableOffsetINTEL:
            return "GlobalVariableOffsetINTEL";
        case spv::DecorationCounterBuffer:
            return "CounterBuffer";
        case spv::DecorationUserSemantic:
            return "UserSemantic";
        case spv::DecorationUserTypeGOOGLE:
            return "UserTypeGOOGLE";
        case spv::DecorationFunctionRoundingModeINTEL:
            return "FunctionRoundingModeINTEL";
        case spv::DecorationFunctionDenormModeINTEL:
            return "FunctionDenormModeINTEL";
        case spv::DecorationRegisterALTERA:
            return "RegisterALTERA";
        case spv::DecorationMemoryALTERA:
            return "MemoryALTERA";
        case spv::DecorationNumbanksALTERA:
            return "NumbanksALTERA";
        case spv::DecorationBankwidthALTERA:
            return "BankwidthALTERA";
        case spv::DecorationMaxPrivateCopiesALTERA:
            return "MaxPrivateCopiesALTERA";
        case spv::DecorationSinglepumpALTERA:
            return "SinglepumpALTERA";
        case spv::DecorationDoublepumpALTERA:
            return "DoublepumpALTERA";
        case spv::DecorationMaxReplicatesALTERA:
            return "MaxReplicatesALTERA";
        case spv::DecorationSimpleDualPortALTERA:
            return "SimpleDualPortALTERA";
        case spv::DecorationMergeALTERA:
            return "MergeALTERA";
        case spv::DecorationBankBitsALTERA:
            return "BankBitsALTERA";
        case spv::DecorationForcePow2DepthALTERA:
            return "ForcePow2DepthALTERA";
        case spv::DecorationStridesizeALTERA:
            return "StridesizeALTERA";
        case spv::DecorationWordsizeALTERA:
            return "WordsizeALTERA";
        case spv::DecorationTrueDualPortALTERA:
            return "TrueDualPortALTERA";
        case spv::DecorationBurstCoalesceALTERA:
            return "BurstCoalesceALTERA";
        case spv::DecorationCacheSizeALTERA:
            return "CacheSizeALTERA";
        case spv::DecorationDontStaticallyCoalesceALTERA:
            return "DontStaticallyCoalesceALTERA";
        case spv::DecorationPrefetchALTERA:
            return "PrefetchALTERA";
        case spv::DecorationStallEnableALTERA:
            return "StallEnableALTERA";
        case spv::DecorationFuseLoopsInFunctionALTERA:
            return "FuseLoopsInFunctionALTERA";
        case spv::DecorationMathOpDSPModeALTERA:
            return "MathOpDSPModeALTERA";
        case spv::DecorationAliasScopeINTEL:
            return "AliasScopeINTEL";
        case spv::DecorationNoAliasINTEL:
            return "NoAliasINTEL";
        case spv::DecorationInitiationIntervalALTERA:
            return "InitiationIntervalALTERA";
        case spv::DecorationMaxConcurrencyALTERA:
            return "MaxConcurrencyALTERA";
        case spv::DecorationPipelineEnableALTERA:
            return "PipelineEnableALTERA";
        case spv::DecorationBufferLocationALTERA:
            return "BufferLocationALTERA";
        case spv::DecorationIOPipeStorageALTERA:
            return "IOPipeStorageALTERA";
        case spv::DecorationFunctionFloatingPointModeINTEL:
            return "FunctionFloatingPointModeINTEL";
        case spv::DecorationSingleElementVectorINTEL:
            return "SingleElementVectorINTEL";
        case spv::DecorationVectorComputeCallableFunctionINTEL:
            return "VectorComputeCallableFunctionINTEL";
        case spv::DecorationMediaBlockIOINTEL:
            return "MediaBlockIOINTEL";
        case spv::DecorationStallFreeALTERA:
            return "StallFreeALTERA";
        case spv::DecorationFPMaxErrorDecorationINTEL:
            return "FPMaxErrorDecorationINTEL";
        case spv::DecorationLatencyControlLabelALTERA:
            return "LatencyControlLabelALTERA";
        case spv::DecorationLatencyControlConstraintALTERA:
            return "LatencyControlConstraintALTERA";
        case spv::DecorationConduitKernelArgumentALTERA:
            return "ConduitKernelArgumentALTERA";
        case spv::DecorationRegisterMapKernelArgumentALTERA:
            return "RegisterMapKernelArgumentALTERA";
        case spv::DecorationMMHostInterfaceAddressWidthALTERA:
            return "MMHostInterfaceAddressWidthALTERA";
        case spv::DecorationMMHostInterfaceDataWidthALTERA:
            return "MMHostInterfaceDataWidthALTERA";
        case spv::DecorationMMHostInterfaceLatencyALTERA:
            return "MMHostInterfaceLatencyALTERA";
        case spv::DecorationMMHostInterfaceReadWriteModeALTERA:
            return "MMHostInterfaceReadWriteModeALTERA";
        case spv::DecorationMMHostInterfaceMaxBurstALTERA:
            return "MMHostInterfaceMaxBurstALTERA";
        case spv::DecorationMMHostInterfaceWaitRequestALTERA:
            return "MMHostInterfaceWaitRequestALTERA";
        case spv::DecorationStableKernelArgumentALTERA:
            return "StableKernelArgumentALTERA";
        case spv::DecorationHostAccessINTEL:
            return "HostAccessINTEL";
        case spv::DecorationInitModeALTERA:
            return "InitModeALTERA";
        case spv::DecorationImplementInRegisterMapALTERA:
            return "ImplementInRegisterMapALTERA";
        case spv::DecorationCacheControlLoadINTEL:
            return "CacheControlLoadINTEL";
        case spv::DecorationCacheControlStoreINTEL:
            return "CacheControlStoreINTEL";
        case spv::DecorationIntrinsicSAMSUNG:
            return "IntrinsicSAMSUNG";

#ifdef VK_ENABLE_BETA_EXTENSIONS
        case spv::DecorationNodeSharesPayloadLimitsWithAMDX:
            return "NodeSharesPayloadLimitsWithAMDX";
        case spv::DecorationNodeMaxPayloadsAMDX:
            return "NodeMaxPayloadsAMDX";
        case spv::DecorationTrackFinishWritingAMDX:
            return "TrackFinishWritingAMDX";
        case spv::DecorationPayloadNodeNameAMDX:
            return "PayloadNodeNameAMDX";
        case spv::DecorationPayloadNodeBaseIndexAMDX:
            return "PayloadNodeBaseIndexAMDX";
        case spv::DecorationPayloadNodeSparseArrayAMDX:
            return "PayloadNodeSparseArrayAMDX";
        case spv::DecorationPayloadNodeArraySizeAMDX:
            return "PayloadNodeArraySizeAMDX";
        case spv::DecorationPayloadDispatchIndirectAMDX:
            return "PayloadDispatchIndirectAMDX";
        case spv::DecorationConditionalINTEL:
            return "ConditionalINTEL";
#endif
        default:
            return "Unknown Decoration";
    }
}

const char* string_SpvBuiltIn(spv::BuiltIn built_in) {
    switch (built_in) {
        case spv::BuiltInPosition:
            return "Position";
        case spv::BuiltInPointSize:
            return "PointSize";
        case spv::BuiltInClipDistance:
            return "ClipDistance";
        case spv::BuiltInCullDistance:
            return "CullDistance";
        case spv::BuiltInVertexId:
            return "VertexId";
        case spv::BuiltInInstanceId:
            return "InstanceId";
        case spv::BuiltInPrimitiveId:
            return "PrimitiveId";
        case spv::BuiltInInvocationId:
            return "InvocationId";
        case spv::BuiltInLayer:
            return "Layer";
        case spv::BuiltInViewportIndex:
            return "ViewportIndex";
        case spv::BuiltInTessLevelOuter:
            return "TessLevelOuter";
        case spv::BuiltInTessLevelInner:
            return "TessLevelInner";
        case spv::BuiltInTessCoord:
            return "TessCoord";
        case spv::BuiltInPatchVertices:
            return "PatchVertices";
        case spv::BuiltInFragCoord:
            return "FragCoord";
        case spv::BuiltInPointCoord:
            return "PointCoord";
        case spv::BuiltInFrontFacing:
            return "FrontFacing";
        case spv::BuiltInSampleId:
            return "SampleId";
        case spv::BuiltInSamplePosition:
            return "SamplePosition";
        case spv::BuiltInSampleMask:
            return "SampleMask";
        case spv::BuiltInFragDepth:
            return "FragDepth";
        case spv::BuiltInHelperInvocation:
            return "HelperInvocation";
        case spv::BuiltInNumWorkgroups:
            return "NumWorkgroups";
        case spv::BuiltInWorkgroupSize:
            return "WorkgroupSize";
        case spv::BuiltInWorkgroupId:
            return "WorkgroupId";
        case spv::BuiltInLocalInvocationId:
            return "LocalInvocationId";
        case spv::BuiltInGlobalInvocationId:
            return "GlobalInvocationId";
        case spv::BuiltInLocalInvocationIndex:
            return "LocalInvocationIndex";
        case spv::BuiltInWorkDim:
            return "WorkDim";
        case spv::BuiltInGlobalSize:
            return "GlobalSize";
        case spv::BuiltInEnqueuedWorkgroupSize:
            return "EnqueuedWorkgroupSize";
        case spv::BuiltInGlobalOffset:
            return "GlobalOffset";
        case spv::BuiltInGlobalLinearId:
            return "GlobalLinearId";
        case spv::BuiltInSubgroupSize:
            return "SubgroupSize";
        case spv::BuiltInSubgroupMaxSize:
            return "SubgroupMaxSize";
        case spv::BuiltInNumSubgroups:
            return "NumSubgroups";
        case spv::BuiltInNumEnqueuedSubgroups:
            return "NumEnqueuedSubgroups";
        case spv::BuiltInSubgroupId:
            return "SubgroupId";
        case spv::BuiltInSubgroupLocalInvocationId:
            return "SubgroupLocalInvocationId";
        case spv::BuiltInVertexIndex:
            return "VertexIndex";
        case spv::BuiltInInstanceIndex:
            return "InstanceIndex";
        case spv::BuiltInCoreIDARM:
            return "CoreIDARM";
        case spv::BuiltInCoreCountARM:
            return "CoreCountARM";
        case spv::BuiltInCoreMaxIDARM:
            return "CoreMaxIDARM";
        case spv::BuiltInWarpIDARM:
            return "WarpIDARM";
        case spv::BuiltInWarpMaxIDARM:
            return "WarpMaxIDARM";
        case spv::BuiltInSubgroupEqMask:
            return "SubgroupEqMask";
        case spv::BuiltInSubgroupGeMask:
            return "SubgroupGeMask";
        case spv::BuiltInSubgroupGtMask:
            return "SubgroupGtMask";
        case spv::BuiltInSubgroupLeMask:
            return "SubgroupLeMask";
        case spv::BuiltInSubgroupLtMask:
            return "SubgroupLtMask";
        case spv::BuiltInBaseVertex:
            return "BaseVertex";
        case spv::BuiltInBaseInstance:
            return "BaseInstance";
        case spv::BuiltInDrawIndex:
            return "DrawIndex";
        case spv::BuiltInPrimitiveShadingRateKHR:
            return "PrimitiveShadingRateKHR";
        case spv::BuiltInDeviceIndex:
            return "DeviceIndex";
        case spv::BuiltInViewIndex:
            return "ViewIndex";
        case spv::BuiltInShadingRateKHR:
            return "ShadingRateKHR";
        case spv::BuiltInTileOffsetQCOM:
            return "TileOffsetQCOM";
        case spv::BuiltInTileDimensionQCOM:
            return "TileDimensionQCOM";
        case spv::BuiltInTileApronSizeQCOM:
            return "TileApronSizeQCOM";
        case spv::BuiltInBaryCoordNoPerspAMD:
            return "BaryCoordNoPerspAMD";
        case spv::BuiltInBaryCoordNoPerspCentroidAMD:
            return "BaryCoordNoPerspCentroidAMD";
        case spv::BuiltInBaryCoordNoPerspSampleAMD:
            return "BaryCoordNoPerspSampleAMD";
        case spv::BuiltInBaryCoordSmoothAMD:
            return "BaryCoordSmoothAMD";
        case spv::BuiltInBaryCoordSmoothCentroidAMD:
            return "BaryCoordSmoothCentroidAMD";
        case spv::BuiltInBaryCoordSmoothSampleAMD:
            return "BaryCoordSmoothSampleAMD";
        case spv::BuiltInBaryCoordPullModelAMD:
            return "BaryCoordPullModelAMD";
        case spv::BuiltInFragStencilRefEXT:
            return "FragStencilRefEXT";
        case spv::BuiltInSamplerHeapEXT:
            return "SamplerHeapEXT";
        case spv::BuiltInResourceHeapEXT:
            return "ResourceHeapEXT";
        case spv::BuiltInViewportMaskNV:
            return "ViewportMaskNV";
        case spv::BuiltInSecondaryPositionNV:
            return "SecondaryPositionNV";
        case spv::BuiltInSecondaryViewportMaskNV:
            return "SecondaryViewportMaskNV";
        case spv::BuiltInPositionPerViewNV:
            return "PositionPerViewNV";
        case spv::BuiltInViewportMaskPerViewNV:
            return "ViewportMaskPerViewNV";
        case spv::BuiltInFullyCoveredEXT:
            return "FullyCoveredEXT";
        case spv::BuiltInTaskCountNV:
            return "TaskCountNV";
        case spv::BuiltInPrimitiveCountNV:
            return "PrimitiveCountNV";
        case spv::BuiltInPrimitiveIndicesNV:
            return "PrimitiveIndicesNV";
        case spv::BuiltInClipDistancePerViewNV:
            return "ClipDistancePerViewNV";
        case spv::BuiltInCullDistancePerViewNV:
            return "CullDistancePerViewNV";
        case spv::BuiltInLayerPerViewNV:
            return "LayerPerViewNV";
        case spv::BuiltInMeshViewCountNV:
            return "MeshViewCountNV";
        case spv::BuiltInMeshViewIndicesNV:
            return "MeshViewIndicesNV";
        case spv::BuiltInBaryCoordKHR:
            return "BaryCoordKHR";
        case spv::BuiltInBaryCoordNoPerspKHR:
            return "BaryCoordNoPerspKHR";
        case spv::BuiltInFragSizeEXT:
            return "FragSizeEXT";
        case spv::BuiltInFragInvocationCountEXT:
            return "FragInvocationCountEXT";
        case spv::BuiltInPrimitivePointIndicesEXT:
            return "PrimitivePointIndicesEXT";
        case spv::BuiltInPrimitiveLineIndicesEXT:
            return "PrimitiveLineIndicesEXT";
        case spv::BuiltInPrimitiveTriangleIndicesEXT:
            return "PrimitiveTriangleIndicesEXT";
        case spv::BuiltInCullPrimitiveEXT:
            return "CullPrimitiveEXT";
        case spv::BuiltInLaunchIdKHR:
            return "LaunchIdKHR";
        case spv::BuiltInLaunchSizeKHR:
            return "LaunchSizeKHR";
        case spv::BuiltInWorldRayOriginKHR:
            return "WorldRayOriginKHR";
        case spv::BuiltInWorldRayDirectionKHR:
            return "WorldRayDirectionKHR";
        case spv::BuiltInObjectRayOriginKHR:
            return "ObjectRayOriginKHR";
        case spv::BuiltInObjectRayDirectionKHR:
            return "ObjectRayDirectionKHR";
        case spv::BuiltInRayTminKHR:
            return "RayTminKHR";
        case spv::BuiltInRayTmaxKHR:
            return "RayTmaxKHR";
        case spv::BuiltInInstanceCustomIndexKHR:
            return "InstanceCustomIndexKHR";
        case spv::BuiltInObjectToWorldKHR:
            return "ObjectToWorldKHR";
        case spv::BuiltInWorldToObjectKHR:
            return "WorldToObjectKHR";
        case spv::BuiltInHitTNV:
            return "HitTNV";
        case spv::BuiltInHitKindKHR:
            return "HitKindKHR";
        case spv::BuiltInCurrentRayTimeNV:
            return "CurrentRayTimeNV";
        case spv::BuiltInHitTriangleVertexPositionsKHR:
            return "HitTriangleVertexPositionsKHR";
        case spv::BuiltInHitMicroTriangleVertexPositionsNV:
            return "HitMicroTriangleVertexPositionsNV";
        case spv::BuiltInHitMicroTriangleVertexBarycentricsNV:
            return "HitMicroTriangleVertexBarycentricsNV";
        case spv::BuiltInIncomingRayFlagsKHR:
            return "IncomingRayFlagsKHR";
        case spv::BuiltInRayGeometryIndexKHR:
            return "RayGeometryIndexKHR";
        case spv::BuiltInHitIsSphereNV:
            return "HitIsSphereNV";
        case spv::BuiltInHitIsLSSNV:
            return "HitIsLSSNV";
        case spv::BuiltInHitSpherePositionNV:
            return "HitSpherePositionNV";
        case spv::BuiltInWarpsPerSMNV:
            return "WarpsPerSMNV";
        case spv::BuiltInSMCountNV:
            return "SMCountNV";
        case spv::BuiltInWarpIDNV:
            return "WarpIDNV";
        case spv::BuiltInSMIDNV:
            return "SMIDNV";
        case spv::BuiltInHitLSSPositionsNV:
            return "HitLSSPositionsNV";
        case spv::BuiltInHitKindFrontFacingMicroTriangleNV:
            return "HitKindFrontFacingMicroTriangleNV";
        case spv::BuiltInHitKindBackFacingMicroTriangleNV:
            return "HitKindBackFacingMicroTriangleNV";
        case spv::BuiltInHitSphereRadiusNV:
            return "HitSphereRadiusNV";
        case spv::BuiltInHitLSSRadiiNV:
            return "HitLSSRadiiNV";
        case spv::BuiltInClusterIDNV:
            return "ClusterIDNV";
        case spv::BuiltInCullMaskKHR:
            return "CullMaskKHR";

#ifdef VK_ENABLE_BETA_EXTENSIONS
        case spv::BuiltInRemainingRecursionLevelsAMDX:
            return "RemainingRecursionLevelsAMDX";
        case spv::BuiltInShaderIndexAMDX:
            return "ShaderIndexAMDX";
#endif
        default:
            return "Unknown BuiltIn";
    }
}

const char* string_SpvDim(uint32_t dim) {
    switch (dim) {
        case spv::Dim1D:
            return "1D";
        case spv::Dim2D:
            return "2D";
        case spv::Dim3D:
            return "3D";
        case spv::DimCube:
            return "Cube";
        case spv::DimRect:
            return "Rect";
        case spv::DimBuffer:
            return "Buffer";
        case spv::DimSubpassData:
            return "SubpassData";
        case spv::DimTileImageDataEXT:
            return "TileImageDataEXT";

        default:
            return "Unknown Dim";
    }
}

static const char* string_SpvCooperativeMatrixOperandsMask(spv::CooperativeMatrixOperandsMask mask) {
    switch (mask) {
        case spv::CooperativeMatrixOperandsMaskNone:
            return "NoneKHR";
        case spv::CooperativeMatrixOperandsMatrixASignedComponentsKHRMask:
            return "MatrixASignedComponentsKHR";
        case spv::CooperativeMatrixOperandsMatrixBSignedComponentsKHRMask:
            return "MatrixBSignedComponentsKHR";
        case spv::CooperativeMatrixOperandsMatrixCSignedComponentsKHRMask:
            return "MatrixCSignedComponentsKHR";
        case spv::CooperativeMatrixOperandsMatrixResultSignedComponentsKHRMask:
            return "MatrixResultSignedComponentsKHR";
        case spv::CooperativeMatrixOperandsSaturatingAccumulationKHRMask:
            return "SaturatingAccumulationKHR";

        default:
            return "Unknown CooperativeMatrixOperandsMask";
    }
}

std::string string_SpvCooperativeMatrixOperands(uint32_t mask) {
    if (mask == 0) {
        return "CooperativeMatrixOperandsMask(0)";
    }
    std::string ret;
    for (uint32_t bit = 1; mask != 0; bit <<= 1, mask >>= 1) {
        if (mask & 1) {
            if (!ret.empty()) {
                ret.append("|");
            }
            ret.append(string_SpvCooperativeMatrixOperandsMask(static_cast<spv::CooperativeMatrixOperandsMask>(bit)));
        }
    }
    return ret;
}

static const char* string_SpvRayFlagsBit(spv::RayFlagsMask mask) {
    switch (mask) {
        case spv::RayFlagsMaskNone:
            return "None";
        case spv::RayFlagsOpaqueKHRMask:
            return "OpaqueKHR";
        case spv::RayFlagsNoOpaqueKHRMask:
            return "NoOpaqueKHR";
        case spv::RayFlagsTerminateOnFirstHitKHRMask:
            return "TerminateOnFirstHitKHR";
        case spv::RayFlagsSkipClosestHitShaderKHRMask:
            return "SkipClosestHitShaderKHR";
        case spv::RayFlagsCullBackFacingTrianglesKHRMask:
            return "CullBackFacingTrianglesKHR";
        case spv::RayFlagsCullFrontFacingTrianglesKHRMask:
            return "CullFrontFacingTrianglesKHR";
        case spv::RayFlagsCullOpaqueKHRMask:
            return "CullOpaqueKHR";
        case spv::RayFlagsCullNoOpaqueKHRMask:
            return "CullNoOpaqueKHR";
        case spv::RayFlagsSkipTrianglesKHRMask:
            return "SkipTrianglesKHR";
        case spv::RayFlagsSkipAABBsKHRMask:
            return "SkipAABBsKHR";
        case spv::RayFlagsForceOpacityMicromap2StateKHRMask:
            return "ForceOpacityMicromap2StateKHR";

        default:
            return "Unknown RayFlagsMask";
    }
}

std::string string_SpvRayFlagsMask(uint32_t mask) {
    if (mask == 0) {
        return "RayFlagsMask(0)";
    }
    std::string ret;
    for (uint32_t bit = 1; mask != 0; bit <<= 1, mask >>= 1) {
        if (mask & 1) {
            if (!ret.empty()) {
                ret.append("|");
            }
            ret.append(string_SpvRayFlagsBit(static_cast<spv::RayFlagsMask>(bit)));
        }
    }
    return ret;
}

const char* string_SpvFPEncoding(spv::FPEncoding value) {
    switch (value) {
        case spv::FPEncodingBFloat16KHR:
            return "BFloat16KHR";
        case spv::FPEncodingFloat8E4M3EXT:
            return "Float8E4M3EXT";
        case spv::FPEncodingFloat8E5M2EXT:
            return "Float8E5M2EXT";
        case spv::FPEncodingFloat6E2M3EXT:
            return "Float6E2M3EXT";
        case spv::FPEncodingFloat6E3M2EXT:
            return "Float6E3M2EXT";
        case spv::FPEncodingFloat4E2M1EXT:
            return "Float4E2M1EXT";
        case spv::FPEncodingFloat8UnsignedE8M0EXT:
            return "Float8UnsignedE8M0EXT";
        case spv::FPEncodingMXInt8EXT:
            return "MXInt8EXT";

        default:
            return "IEEE-754";  // default for 16-bit
    }
}

const OperandInfo& GetOperandInfo(uint32_t opcode) {
    static const vvl::unordered_map<uint32_t, OperandInfo> kOperandTable{
        // clang-format off
        {spv::OpNop, {{}}},
        {spv::OpUndef, {{}}},
        {spv::OpSourceContinued, {{OperandKind::LiteralString}}},
        {spv::OpSource, {{OperandKind::ValueEnum, OperandKind::Literal, OperandKind::Id, OperandKind::LiteralString}}},
        {spv::OpSourceExtension, {{OperandKind::LiteralString}}},
        {spv::OpName, {{OperandKind::Id, OperandKind::LiteralString}}},
        {spv::OpMemberName, {{OperandKind::Id, OperandKind::Literal, OperandKind::LiteralString}}},
        {spv::OpString, {{OperandKind::LiteralString}}},
        {spv::OpLine, {{OperandKind::Id, OperandKind::Literal, OperandKind::Literal}}},
        {spv::OpExtension, {{OperandKind::LiteralString}}},
        {spv::OpExtInstImport, {{OperandKind::LiteralString}}},
        {spv::OpExtInst, {{OperandKind::Id, OperandKind::Literal, OperandKind::Id}}},
        {spv::OpMemoryModel, {{OperandKind::ValueEnum, OperandKind::ValueEnum}}},
        {spv::OpEntryPoint, {{OperandKind::ValueEnum, OperandKind::Id, OperandKind::LiteralString, OperandKind::Id}}},
        {spv::OpExecutionMode, {{OperandKind::Id, OperandKind::ValueEnum}}},
        {spv::OpCapability, {{OperandKind::ValueEnum}}},
        {spv::OpTypeVoid, {{}}},
        {spv::OpTypeBool, {{}}},
        {spv::OpTypeInt, {{OperandKind::Literal, OperandKind::Literal}}},
        {spv::OpTypeFloat, {{OperandKind::Literal, OperandKind::ValueEnum}}},
        {spv::OpTypeVector, {{OperandKind::Id, OperandKind::Literal}}},
        {spv::OpTypeMatrix, {{OperandKind::Id, OperandKind::Literal}}},
        {spv::OpTypeImage, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Literal, OperandKind::Literal, OperandKind::Literal, OperandKind::Literal, OperandKind::ValueEnum, OperandKind::ValueEnum}}},
        {spv::OpTypeSampler, {{}}},
        {spv::OpTypeSampledImage, {{OperandKind::Id}}},
        {spv::OpTypeArray, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpTypeRuntimeArray, {{OperandKind::Id}}},
        {spv::OpTypeStruct, {{OperandKind::Id}}},
        {spv::OpTypePointer, {{OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpTypeFunction, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpTypeForwardPointer, {{OperandKind::Id, OperandKind::ValueEnum}}},
        {spv::OpConstantTrue, {{}}},
        {spv::OpConstantFalse, {{}}},
        {spv::OpConstant, {{OperandKind::Literal}}},
        {spv::OpConstantComposite, {{OperandKind::Id}}},
        {spv::OpConstantNull, {{}}},
        {spv::OpSpecConstantTrue, {{}}},
        {spv::OpSpecConstantFalse, {{}}},
        {spv::OpSpecConstant, {{OperandKind::Literal}}},
        {spv::OpSpecConstantComposite, {{OperandKind::Id}}},
        {spv::OpSpecConstantOp, {{OperandKind::Literal}}},
        {spv::OpFunction, {{OperandKind::BitEnum, OperandKind::Id}}},
        {spv::OpFunctionParameter, {{}}},
        {spv::OpFunctionEnd, {{}}},
        {spv::OpFunctionCall, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpVariable, {{OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpImageTexelPointer, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpLoad, {{OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpStore, {{OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpCopyMemory, {{OperandKind::Id, OperandKind::Id, OperandKind::BitEnum, OperandKind::BitEnum}}},
        {spv::OpCopyMemorySized, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum, OperandKind::BitEnum}}},
        {spv::OpAccessChain, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpInBoundsAccessChain, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpPtrAccessChain, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpArrayLength, {{OperandKind::Id, OperandKind::Literal}}},
        {spv::OpInBoundsPtrAccessChain, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpDecorate, {{OperandKind::Id, OperandKind::ValueEnum}}},
        {spv::OpMemberDecorate, {{OperandKind::Id, OperandKind::Literal, OperandKind::ValueEnum}}},
        {spv::OpDecorationGroup, {{}}},
        {spv::OpGroupDecorate, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupMemberDecorate, {{OperandKind::Id, OperandKind::Composite}}},
        {spv::OpVectorExtractDynamic, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpVectorInsertDynamic, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpVectorShuffle, {{OperandKind::Id, OperandKind::Id, OperandKind::Literal}}},
        {spv::OpCompositeConstruct, {{OperandKind::Id}}},
        {spv::OpCompositeExtract, {{OperandKind::Id, OperandKind::Literal}}},
        {spv::OpCompositeInsert, {{OperandKind::Id, OperandKind::Id, OperandKind::Literal}}},
        {spv::OpCopyObject, {{OperandKind::Id}}},
        {spv::OpTranspose, {{OperandKind::Id}}},
        {spv::OpSampledImage, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpImageSampleImplicitLod, {{OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageSampleExplicitLod, {{OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageSampleDrefImplicitLod, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageSampleDrefExplicitLod, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageSampleProjImplicitLod, {{OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageSampleProjExplicitLod, {{OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageSampleProjDrefImplicitLod, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageSampleProjDrefExplicitLod, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageFetch, {{OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageGather, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageDrefGather, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageRead, {{OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageWrite, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImage, {{OperandKind::Id}}},
        {spv::OpImageQuerySizeLod, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpImageQuerySize, {{OperandKind::Id}}},
        {spv::OpImageQueryLod, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpImageQueryLevels, {{OperandKind::Id}}},
        {spv::OpImageQuerySamples, {{OperandKind::Id}}},
        {spv::OpConvertFToU, {{OperandKind::Id}}},
        {spv::OpConvertFToS, {{OperandKind::Id}}},
        {spv::OpConvertSToF, {{OperandKind::Id}}},
        {spv::OpConvertUToF, {{OperandKind::Id}}},
        {spv::OpUConvert, {{OperandKind::Id}}},
        {spv::OpSConvert, {{OperandKind::Id}}},
        {spv::OpFConvert, {{OperandKind::Id}}},
        {spv::OpQuantizeToF16, {{OperandKind::Id}}},
        {spv::OpConvertPtrToU, {{OperandKind::Id}}},
        {spv::OpConvertUToPtr, {{OperandKind::Id}}},
        {spv::OpBitcast, {{OperandKind::Id}}},
        {spv::OpSNegate, {{OperandKind::Id}}},
        {spv::OpFNegate, {{OperandKind::Id}}},
        {spv::OpIAdd, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpFAdd, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpISub, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpFSub, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpIMul, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpFMul, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpUDiv, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpSDiv, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpFDiv, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpUMod, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpSRem, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpSMod, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpFRem, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpFMod, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpVectorTimesScalar, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpMatrixTimesScalar, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpVectorTimesMatrix, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpMatrixTimesVector, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpMatrixTimesMatrix, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpOuterProduct, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpDot, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpIAddCarry, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpISubBorrow, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpUMulExtended, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpSMulExtended, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpAny, {{OperandKind::Id}}},
        {spv::OpAll, {{OperandKind::Id}}},
        {spv::OpIsNan, {{OperandKind::Id}}},
        {spv::OpIsInf, {{OperandKind::Id}}},
        {spv::OpLogicalEqual, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpLogicalNotEqual, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpLogicalOr, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpLogicalAnd, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpLogicalNot, {{OperandKind::Id}}},
        {spv::OpSelect, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpIEqual, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpINotEqual, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpUGreaterThan, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpSGreaterThan, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpUGreaterThanEqual, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpSGreaterThanEqual, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpULessThan, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpSLessThan, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpULessThanEqual, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpSLessThanEqual, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpFOrdEqual, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpFUnordEqual, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpFOrdNotEqual, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpFUnordNotEqual, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpFOrdLessThan, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpFUnordLessThan, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpFOrdGreaterThan, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpFUnordGreaterThan, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpFOrdLessThanEqual, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpFUnordLessThanEqual, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpFOrdGreaterThanEqual, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpFUnordGreaterThanEqual, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpShiftRightLogical, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpShiftRightArithmetic, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpShiftLeftLogical, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpBitwiseOr, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpBitwiseXor, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpBitwiseAnd, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpNot, {{OperandKind::Id}}},
        {spv::OpBitFieldInsert, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpBitFieldSExtract, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpBitFieldUExtract, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpBitReverse, {{OperandKind::Id}}},
        {spv::OpBitCount, {{OperandKind::Id}}},
        {spv::OpDPdx, {{OperandKind::Id}}},
        {spv::OpDPdy, {{OperandKind::Id}}},
        {spv::OpFwidth, {{OperandKind::Id}}},
        {spv::OpDPdxFine, {{OperandKind::Id}}},
        {spv::OpDPdyFine, {{OperandKind::Id}}},
        {spv::OpFwidthFine, {{OperandKind::Id}}},
        {spv::OpDPdxCoarse, {{OperandKind::Id}}},
        {spv::OpDPdyCoarse, {{OperandKind::Id}}},
        {spv::OpFwidthCoarse, {{OperandKind::Id}}},
        {spv::OpEmitVertex, {{}}},
        {spv::OpEndPrimitive, {{}}},
        {spv::OpEmitStreamVertex, {{OperandKind::Id}}},
        {spv::OpEndStreamPrimitive, {{OperandKind::Id}}},
        {spv::OpControlBarrier, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpMemoryBarrier, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpAtomicLoad, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpAtomicStore, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpAtomicExchange, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpAtomicCompareExchange, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpAtomicIIncrement, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpAtomicIDecrement, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpAtomicIAdd, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpAtomicISub, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpAtomicSMin, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpAtomicUMin, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpAtomicSMax, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpAtomicUMax, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpAtomicAnd, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpAtomicOr, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpAtomicXor, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpPhi, {{OperandKind::Composite}}},
        {spv::OpLoopMerge, {{OperandKind::Label, OperandKind::Label, OperandKind::BitEnum}}},
        {spv::OpSelectionMerge, {{OperandKind::Label, OperandKind::BitEnum}}},
        {spv::OpLabel, {{}}},
        {spv::OpBranch, {{OperandKind::Label}}},
        {spv::OpBranchConditional, {{OperandKind::Id, OperandKind::Label, OperandKind::Label, OperandKind::Literal}}},
        {spv::OpSwitch, {{OperandKind::Id, OperandKind::Label, OperandKind::Label}}},
        {spv::OpKill, {{}}},
        {spv::OpReturn, {{}}},
        {spv::OpReturnValue, {{OperandKind::Id}}},
        {spv::OpUnreachable, {{}}},
        {spv::OpGroupAll, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupAny, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupBroadcast, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupIAdd, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupFAdd, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupFMin, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupUMin, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupSMin, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupFMax, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupUMax, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupSMax, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpImageSparseSampleImplicitLod, {{OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageSparseSampleExplicitLod, {{OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageSparseSampleDrefImplicitLod, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageSparseSampleDrefExplicitLod, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageSparseSampleProjImplicitLod, {{OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageSparseSampleProjExplicitLod, {{OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageSparseSampleProjDrefImplicitLod, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageSparseSampleProjDrefExplicitLod, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageSparseFetch, {{OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageSparseGather, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageSparseDrefGather, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpImageSparseTexelsResident, {{OperandKind::Id}}},
        {spv::OpNoLine, {{}}},
        {spv::OpImageSparseRead, {{OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpSizeOf, {{OperandKind::Id}}},
        {spv::OpModuleProcessed, {{OperandKind::LiteralString}}},
        {spv::OpExecutionModeId, {{OperandKind::Id, OperandKind::ValueEnum}}},
        {spv::OpDecorateId, {{OperandKind::Id, OperandKind::ValueEnum}}},
        {spv::OpGroupNonUniformElect, {{OperandKind::Id}}},
        {spv::OpGroupNonUniformAll, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformAny, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformAllEqual, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformBroadcast, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformBroadcastFirst, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformBallot, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformInverseBallot, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformBallotBitExtract, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformBallotBitCount, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupNonUniformBallotFindLSB, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformBallotFindMSB, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformShuffle, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformShuffleXor, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformShuffleUp, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformShuffleDown, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformIAdd, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformFAdd, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformIMul, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformFMul, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformSMin, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformUMin, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformFMin, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformSMax, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformUMax, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformFMax, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformBitwiseAnd, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformBitwiseOr, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformBitwiseXor, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformLogicalAnd, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformLogicalOr, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformLogicalXor, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformQuadBroadcast, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformQuadSwap, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpCopyLogical, {{OperandKind::Id}}},
        {spv::OpPtrEqual, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpPtrNotEqual, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpPtrDiff, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpColorAttachmentReadEXT, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpDepthAttachmentReadEXT, {{OperandKind::Id}}},
        {spv::OpStencilAttachmentReadEXT, {{OperandKind::Id}}},
        {spv::OpTypeTensorARM, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpTensorReadARM, {{OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpTensorWriteARM, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpTensorQuerySizeARM, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpGraphConstantARM, {{OperandKind::Literal}}},
        {spv::OpGraphEntryPointARM, {{OperandKind::Id, OperandKind::LiteralString, OperandKind::Id}}},
        {spv::OpGraphARM, {{}}},
        {spv::OpGraphInputARM, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpGraphSetOutputARM, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpGraphEndARM, {{}}},
        {spv::OpTypeGraphARM, {{OperandKind::Literal, OperandKind::Id}}},
        {spv::OpBitcastExtractEXT, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpTerminateInvocation, {{}}},
        {spv::OpTypeUntypedPointerKHR, {{OperandKind::ValueEnum}}},
        {spv::OpUntypedVariableKHR, {{OperandKind::ValueEnum, OperandKind::Id, OperandKind::Id}}},
        {spv::OpUntypedAccessChainKHR, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpUntypedInBoundsAccessChainKHR, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpSubgroupBallotKHR, {{OperandKind::Id}}},
        {spv::OpSubgroupFirstInvocationKHR, {{OperandKind::Id}}},
        {spv::OpUntypedPtrAccessChainKHR, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpUntypedInBoundsPtrAccessChainKHR, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpUntypedArrayLengthKHR, {{OperandKind::Id, OperandKind::Id, OperandKind::Literal}}},
        {spv::OpUntypedPrefetchKHR, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpFmaKHR, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpSubgroupAllKHR, {{OperandKind::Id}}},
        {spv::OpSubgroupAnyKHR, {{OperandKind::Id}}},
        {spv::OpSubgroupAllEqualKHR, {{OperandKind::Id}}},
        {spv::OpGroupNonUniformRotateKHR, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpSubgroupReadInvocationKHR, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpExtInstWithForwardRefsKHR, {{OperandKind::Id, OperandKind::Literal, OperandKind::Id}}},
        {spv::OpUntypedGroupAsyncCopyKHR, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum, OperandKind::BitEnum}}},
        {spv::OpTraceRayKHR, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpExecuteCallableKHR, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpConvertUToAccelerationStructureKHR, {{OperandKind::Id}}},
        {spv::OpIgnoreIntersectionKHR, {{}}},
        {spv::OpTerminateRayKHR, {{}}},
        {spv::OpSDot, {{OperandKind::Id, OperandKind::Id, OperandKind::ValueEnum}}},
        {spv::OpUDot, {{OperandKind::Id, OperandKind::Id, OperandKind::ValueEnum}}},
        {spv::OpSUDot, {{OperandKind::Id, OperandKind::Id, OperandKind::ValueEnum}}},
        {spv::OpSDotAccSat, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::ValueEnum}}},
        {spv::OpUDotAccSat, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::ValueEnum}}},
        {spv::OpSUDotAccSat, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::ValueEnum}}},
        {spv::OpTypeCooperativeMatrixKHR, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpCooperativeMatrixLoadKHR, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpCooperativeMatrixStoreKHR, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpCooperativeMatrixMulAddKHR, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpCooperativeMatrixLengthKHR, {{OperandKind::Id}}},
        {spv::OpConstantCompositeReplicateEXT, {{OperandKind::Id}}},
        {spv::OpSpecConstantCompositeReplicateEXT, {{OperandKind::Id}}},
        {spv::OpCompositeConstructReplicateEXT, {{OperandKind::Id}}},
        {spv::OpTypeRayQueryKHR, {{}}},
        {spv::OpRayQueryInitializeKHR, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpRayQueryTerminateKHR, {{OperandKind::Id}}},
        {spv::OpRayQueryGenerateIntersectionKHR, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpRayQueryConfirmIntersectionKHR, {{OperandKind::Id}}},
        {spv::OpRayQueryProceedKHR, {{OperandKind::Id}}},
        {spv::OpRayQueryGetIntersectionTypeKHR, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpImageSampleWeightedQCOM, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpImageBoxFilterQCOM, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpImageBlockMatchSSDQCOM, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpImageBlockMatchSADQCOM, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpBitCastArrayQCOM, {{OperandKind::Id}}},
        {spv::OpImageBlockMatchWindowSSDQCOM, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpImageBlockMatchWindowSADQCOM, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpImageBlockMatchGatherSSDQCOM, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpImageBlockMatchGatherSADQCOM, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpCompositeConstructCoopMatQCOM, {{OperandKind::Id}}},
        {spv::OpCompositeExtractCoopMatQCOM, {{OperandKind::Id}}},
        {spv::OpExtractSubArrayQCOM, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpImageGatherQCOM, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpGroupIAddNonUniformAMD, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupFAddNonUniformAMD, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupFMinNonUniformAMD, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupUMinNonUniformAMD, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupSMinNonUniformAMD, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupFMaxNonUniformAMD, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupUMaxNonUniformAMD, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupSMaxNonUniformAMD, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpFragmentMaskFetchAMD, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpFragmentFetchAMD, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpReadClockKHR, {{OperandKind::Id}}},
        {spv::OpGroupNonUniformQuadAllKHR, {{OperandKind::Id}}},
        {spv::OpGroupNonUniformQuadAnyKHR, {{OperandKind::Id}}},
        {spv::OpTypeBufferEXT, {{OperandKind::ValueEnum}}},
        {spv::OpBufferPointerEXT, {{OperandKind::Id}}},
        {spv::OpAbortKHR, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpUntypedImageTexelPointerEXT, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpMemberDecorateIdEXT, {{OperandKind::Id, OperandKind::Literal, OperandKind::ValueEnum}}},
        {spv::OpConstantSizeOfEXT, {{OperandKind::Id}}},
        {spv::OpConstantDataKHR, {{OperandKind::Literal}}},
        {spv::OpSpecConstantDataKHR, {{OperandKind::Literal}}},
        {spv::OpHitObjectRecordHitMotionNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectRecordHitWithIndexMotionNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectRecordMissMotionNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectGetWorldToObjectNV, {{OperandKind::Id}}},
        {spv::OpHitObjectGetObjectToWorldNV, {{OperandKind::Id}}},
        {spv::OpHitObjectGetObjectRayDirectionNV, {{OperandKind::Id}}},
        {spv::OpHitObjectGetObjectRayOriginNV, {{OperandKind::Id}}},
        {spv::OpHitObjectTraceRayMotionNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectGetShaderRecordBufferHandleNV, {{OperandKind::Id}}},
        {spv::OpHitObjectGetShaderBindingTableRecordIndexNV, {{OperandKind::Id}}},
        {spv::OpHitObjectRecordEmptyNV, {{OperandKind::Id}}},
        {spv::OpHitObjectTraceRayNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectRecordHitNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectRecordHitWithIndexNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectRecordMissNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectExecuteShaderNV, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectGetCurrentTimeNV, {{OperandKind::Id}}},
        {spv::OpHitObjectGetAttributesNV, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectGetHitKindNV, {{OperandKind::Id}}},
        {spv::OpHitObjectGetPrimitiveIndexNV, {{OperandKind::Id}}},
        {spv::OpHitObjectGetGeometryIndexNV, {{OperandKind::Id}}},
        {spv::OpHitObjectGetInstanceIdNV, {{OperandKind::Id}}},
        {spv::OpHitObjectGetInstanceCustomIndexNV, {{OperandKind::Id}}},
        {spv::OpHitObjectGetWorldRayDirectionNV, {{OperandKind::Id}}},
        {spv::OpHitObjectGetWorldRayOriginNV, {{OperandKind::Id}}},
        {spv::OpHitObjectGetRayTMaxNV, {{OperandKind::Id}}},
        {spv::OpHitObjectGetRayTMinNV, {{OperandKind::Id}}},
        {spv::OpHitObjectIsEmptyNV, {{OperandKind::Id}}},
        {spv::OpHitObjectIsHitNV, {{OperandKind::Id}}},
        {spv::OpHitObjectIsMissNV, {{OperandKind::Id}}},
        {spv::OpReorderThreadWithHitObjectNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpReorderThreadWithHintNV, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpTypeHitObjectNV, {{}}},
        {spv::OpImageSampleFootprintNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpTypeVectorIdEXT, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpCooperativeVectorMatrixMulNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpCooperativeVectorOuterProductAccumulateNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpCooperativeVectorReduceSumAccumulateNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpCooperativeVectorMatrixMulAddNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpCooperativeMatrixConvertNV, {{OperandKind::Id}}},
        {spv::OpEmitMeshTasksEXT, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpSetMeshOutputsEXT, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpGroupNonUniformPartitionEXT, {{OperandKind::Id}}},
        {spv::OpWritePackedPrimitiveIndices4x8NV, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpFetchMicroTriangleVertexPositionNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpFetchMicroTriangleVertexBarycentricNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpCooperativeVectorLoadNV, {{OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpCooperativeVectorStoreNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpHitObjectRecordFromQueryEXT, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectRecordMissEXT, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectRecordMissMotionEXT, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectGetIntersectionTriangleVertexPositionsEXT, {{OperandKind::Id}}},
        {spv::OpHitObjectGetRayFlagsEXT, {{OperandKind::Id}}},
        {spv::OpHitObjectSetShaderBindingTableRecordIndexEXT, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectReorderExecuteShaderEXT, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectTraceReorderExecuteEXT, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectTraceMotionReorderExecuteEXT, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpTypeHitObjectEXT, {{}}},
        {spv::OpReorderThreadWithHintEXT, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpReorderThreadWithHitObjectEXT, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectTraceRayEXT, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectTraceRayMotionEXT, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectRecordEmptyEXT, {{OperandKind::Id}}},
        {spv::OpHitObjectExecuteShaderEXT, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectGetCurrentTimeEXT, {{OperandKind::Id}}},
        {spv::OpHitObjectGetAttributesEXT, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectGetHitKindEXT, {{OperandKind::Id}}},
        {spv::OpHitObjectGetPrimitiveIndexEXT, {{OperandKind::Id}}},
        {spv::OpHitObjectGetGeometryIndexEXT, {{OperandKind::Id}}},
        {spv::OpHitObjectGetInstanceIdEXT, {{OperandKind::Id}}},
        {spv::OpHitObjectGetInstanceCustomIndexEXT, {{OperandKind::Id}}},
        {spv::OpHitObjectGetObjectRayOriginEXT, {{OperandKind::Id}}},
        {spv::OpHitObjectGetObjectRayDirectionEXT, {{OperandKind::Id}}},
        {spv::OpHitObjectGetWorldRayDirectionEXT, {{OperandKind::Id}}},
        {spv::OpHitObjectGetWorldRayOriginEXT, {{OperandKind::Id}}},
        {spv::OpHitObjectGetObjectToWorldEXT, {{OperandKind::Id}}},
        {spv::OpHitObjectGetWorldToObjectEXT, {{OperandKind::Id}}},
        {spv::OpHitObjectGetRayTMaxEXT, {{OperandKind::Id}}},
        {spv::OpReportIntersectionKHR, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpIgnoreIntersectionNV, {{}}},
        {spv::OpTerminateRayNV, {{}}},
        {spv::OpTraceNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpTraceMotionNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpTraceRayMotionNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpRayQueryGetIntersectionTriangleVertexPositionsKHR, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpTypeAccelerationStructureKHR, {{}}},
        {spv::OpExecuteCallableNV, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpRayQueryGetIntersectionClusterIdNV, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectGetClusterIdNV, {{OperandKind::Id}}},
        {spv::OpHitObjectGetRayTMinEXT, {{OperandKind::Id}}},
        {spv::OpHitObjectGetShaderBindingTableRecordIndexEXT, {{OperandKind::Id}}},
        {spv::OpHitObjectGetShaderRecordBufferHandleEXT, {{OperandKind::Id}}},
        {spv::OpHitObjectIsEmptyEXT, {{OperandKind::Id}}},
        {spv::OpHitObjectIsHitEXT, {{OperandKind::Id}}},
        {spv::OpHitObjectIsMissEXT, {{OperandKind::Id}}},
        {spv::OpTypeCooperativeMatrixNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpCooperativeMatrixLoadNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpCooperativeMatrixStoreNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpCooperativeMatrixMulAddNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpCooperativeMatrixLengthNV, {{OperandKind::Id}}},
        {spv::OpBeginInvocationInterlockEXT, {{}}},
        {spv::OpEndInvocationInterlockEXT, {{}}},
        {spv::OpCooperativeMatrixReduceNV, {{OperandKind::Id, OperandKind::BitEnum, OperandKind::Id}}},
        {spv::OpCooperativeMatrixLoadTensorNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum, OperandKind::BitEnum}}},
        {spv::OpCooperativeMatrixStoreTensorNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum, OperandKind::BitEnum}}},
        {spv::OpCooperativeMatrixPerElementOpNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpTypeTensorLayoutNV, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpTypeTensorViewNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpCreateTensorLayoutNV, {{}}},
        {spv::OpTensorLayoutSetDimensionNV, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpTensorLayoutSetStrideNV, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpTensorLayoutSliceNV, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpTensorLayoutSetClampValueNV, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpCreateTensorViewNV, {{}}},
        {spv::OpTensorViewSetDimensionNV, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpTensorViewSetStrideNV, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpDemoteToHelperInvocation, {{}}},
        {spv::OpIsHelperInvocationEXT, {{}}},
        {spv::OpTensorViewSetClipNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpTensorLayoutSetBlockSizeNV, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpCooperativeMatrixTransposeNV, {{OperandKind::Id}}},
        {spv::OpConvertUToImageNV, {{OperandKind::Id}}},
        {spv::OpConvertUToSamplerNV, {{OperandKind::Id}}},
        {spv::OpConvertImageToUNV, {{OperandKind::Id}}},
        {spv::OpConvertSamplerToUNV, {{OperandKind::Id}}},
        {spv::OpConvertUToSampledImageNV, {{OperandKind::Id}}},
        {spv::OpConvertSampledImageToUNV, {{OperandKind::Id}}},
        {spv::OpSamplerImageAddressingModeNV, {{OperandKind::Literal}}},
        {spv::OpRawAccessChainNV, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpRayQueryGetIntersectionSpherePositionNV, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpRayQueryGetIntersectionSphereRadiusNV, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpRayQueryGetIntersectionLSSPositionsNV, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpRayQueryGetIntersectionLSSRadiiNV, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpRayQueryGetIntersectionLSSHitValueNV, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpHitObjectGetSpherePositionNV, {{OperandKind::Id}}},
        {spv::OpHitObjectGetSphereRadiusNV, {{OperandKind::Id}}},
        {spv::OpHitObjectGetLSSPositionsNV, {{OperandKind::Id}}},
        {spv::OpHitObjectGetLSSRadiiNV, {{OperandKind::Id}}},
        {spv::OpHitObjectIsSphereHitNV, {{OperandKind::Id}}},
        {spv::OpHitObjectIsLSSHitNV, {{OperandKind::Id}}},
        {spv::OpRayQueryIsSphereHitNV, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpRayQueryIsLSSHitNV, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpUCountLeadingZerosINTEL, {{OperandKind::Id}}},
        {spv::OpUCountTrailingZerosINTEL, {{OperandKind::Id}}},
        {spv::OpAbsISubINTEL, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpAbsUSubINTEL, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpIAddSatINTEL, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpUAddSatINTEL, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpIAverageINTEL, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpUAverageINTEL, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpIAverageRoundedINTEL, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpUAverageRoundedINTEL, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpISubSatINTEL, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpUSubSatINTEL, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpIMul32x16INTEL, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpUMul32x16INTEL, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpConstantFunctionPointerINTEL, {{OperandKind::Id}}},
        {spv::OpFunctionPointerCallINTEL, {{OperandKind::Id}}},
        {spv::OpAtomicFMinEXT, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpAtomicFMaxEXT, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpAssumeTrueKHR, {{OperandKind::Id}}},
        {spv::OpExpectKHR, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpDecorateString, {{OperandKind::Id, OperandKind::ValueEnum}}},
        {spv::OpMemberDecorateString, {{OperandKind::Id, OperandKind::Literal, OperandKind::ValueEnum}}},
        {spv::OpRayQueryGetRayTMinKHR, {{OperandKind::Id}}},
        {spv::OpRayQueryGetRayFlagsKHR, {{OperandKind::Id}}},
        {spv::OpRayQueryGetIntersectionTKHR, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpRayQueryGetIntersectionInstanceCustomIndexKHR, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpRayQueryGetIntersectionInstanceIdKHR, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpRayQueryGetIntersectionGeometryIndexKHR, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpRayQueryGetIntersectionPrimitiveIndexKHR, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpRayQueryGetIntersectionBarycentricsKHR, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpRayQueryGetIntersectionFrontFaceKHR, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpRayQueryGetIntersectionCandidateAABBOpaqueKHR, {{OperandKind::Id}}},
        {spv::OpRayQueryGetIntersectionObjectRayDirectionKHR, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpRayQueryGetIntersectionObjectRayOriginKHR, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpRayQueryGetWorldRayDirectionKHR, {{OperandKind::Id}}},
        {spv::OpRayQueryGetWorldRayOriginKHR, {{OperandKind::Id}}},
        {spv::OpRayQueryGetIntersectionObjectToWorldKHR, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpRayQueryGetIntersectionWorldToObjectKHR, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpAtomicFAddEXT, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpControlBarrierArriveEXT, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpControlBarrierWaitEXT, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpArithmeticFenceEXT, {{OperandKind::Id}}},
        {spv::OpSubgroupBlockPrefetchINTEL, {{OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpSubgroup2DBlockLoadINTEL, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpSubgroup2DBlockLoadTransformINTEL, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpSubgroup2DBlockLoadTransposeINTEL, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpSubgroup2DBlockPrefetchINTEL, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpSubgroup2DBlockStoreINTEL, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpSubgroupMatrixMultiplyAccumulateINTEL, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpBitwiseFunctionINTEL, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpUntypedVariableLengthArrayINTEL, {{OperandKind::Id, OperandKind::Id}}},
        {spv::OpPredicatedLoadINTEL, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpPredicatedStoreINTEL, {{OperandKind::Id, OperandKind::Id, OperandKind::Id, OperandKind::BitEnum}}},
        {spv::OpGroupIMulKHR, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupFMulKHR, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupBitwiseAndKHR, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupBitwiseOrKHR, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupBitwiseXorKHR, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupLogicalAndKHR, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupLogicalOrKHR, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpGroupLogicalXorKHR, {{OperandKind::Id, OperandKind::ValueEnum, OperandKind::Id}}},
        {spv::OpRoundFToTF32INTEL, {{OperandKind::Id}}},
        {spv::OpFDot2MixAcc32VALVE, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpFDot2MixAcc16VALVE, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
        {spv::OpFDot4MixAcc32VALVE, {{OperandKind::Id, OperandKind::Id, OperandKind::Id}}},
    };  // clang-format on

    auto info = kOperandTable.find(opcode);
    if (info != kOperandTable.end()) {
        return info->second;
    }
    return kOperandTable.find(spv::OpNop)->second;
}

// NOLINTEND
