#pragma once #include "spirv.hpp" #include #include #include namespace spirv { enum class OperandKind { Invalid, ValueId, TypeId, Word, String, VariadicId, VariadicWord, }; enum class OperandDirection { In, Out, }; enum class InstructionFlags { None = 0, HasResult = 1 << 0, HasResultType = 1 << 1, }; inline InstructionFlags operator|(InstructionFlags lhs, InstructionFlags rhs) { return static_cast(static_cast(lhs) | static_cast(rhs)); } inline InstructionFlags operator&(InstructionFlags lhs, InstructionFlags rhs) { return static_cast(static_cast(lhs) & static_cast(rhs)); } struct InstructionInfo { const char *name; InstructionFlags flags; OperandKind operands[16]; }; inline const InstructionInfo *getInstructionInfo(spv::Op opcode) { switch (opcode) { default: /* unknown opcode */ break; case spv::Op::OpNop: { static InstructionInfo result = {"OpNop", InstructionFlags::None, {}}; return &result; } case spv::Op::OpUndef: { static InstructionInfo result = { "OpUndef", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSourceContinued: { static InstructionInfo result = { "OpSourceContinued", InstructionFlags::None, {}}; return &result; } case spv::Op::OpSource: { static InstructionInfo result = {"OpSource", InstructionFlags::None, {}}; return &result; } case spv::Op::OpSourceExtension: { static InstructionInfo result = { "OpSourceExtension", InstructionFlags::None, {}}; return &result; } case spv::Op::OpName: { static InstructionInfo result = {"OpName", InstructionFlags::None, {}}; return &result; } case spv::Op::OpMemberName: { static InstructionInfo result = { "OpMemberName", InstructionFlags::None, {}}; return &result; } case spv::Op::OpString: { static InstructionInfo result = { "OpString", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpLine: { static InstructionInfo result = {"OpLine", InstructionFlags::None, {}}; return &result; } case spv::Op::OpExtension: { static InstructionInfo result = {"OpExtension", InstructionFlags::None, {}}; return &result; } case spv::Op::OpExtInstImport: { static InstructionInfo result = { "OpExtInstImport", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpExtInst: { static InstructionInfo result = { "OpExtInst", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpMemoryModel: { static InstructionInfo result = { "OpMemoryModel", InstructionFlags::None, {}}; return &result; } case spv::Op::OpEntryPoint: { static InstructionInfo result = { "OpEntryPoint", InstructionFlags::None, {}}; return &result; } case spv::Op::OpExecutionMode: { static InstructionInfo result = { "OpExecutionMode", InstructionFlags::None, {}}; return &result; } case spv::Op::OpCapability: { static InstructionInfo result = { "OpCapability", InstructionFlags::None, {}}; return &result; } case spv::Op::OpTypeVoid: { static InstructionInfo result = { "OpTypeVoid", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpTypeBool: { static InstructionInfo result = { "OpTypeBool", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpTypeInt: { static InstructionInfo result = { "OpTypeInt", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpTypeFloat: { static InstructionInfo result = { "OpTypeFloat", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpTypeVector: { static InstructionInfo result = { "OpTypeVector", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpTypeMatrix: { static InstructionInfo result = { "OpTypeMatrix", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpTypeImage: { static InstructionInfo result = { "OpTypeImage", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpTypeSampler: { static InstructionInfo result = { "OpTypeSampler", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpTypeSampledImage: { static InstructionInfo result = {"OpTypeSampledImage", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpTypeArray: { static InstructionInfo result = { "OpTypeArray", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpTypeRuntimeArray: { static InstructionInfo result = {"OpTypeRuntimeArray", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpTypeStruct: { static InstructionInfo result = { "OpTypeStruct", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpTypeOpaque: { static InstructionInfo result = { "OpTypeOpaque", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpTypePointer: { static InstructionInfo result = { "OpTypePointer", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpTypeFunction: { static InstructionInfo result = { "OpTypeFunction", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpTypeEvent: { static InstructionInfo result = { "OpTypeEvent", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpTypeDeviceEvent: { static InstructionInfo result = {"OpTypeDeviceEvent", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpTypeReserveId: { static InstructionInfo result = { "OpTypeReserveId", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpTypeQueue: { static InstructionInfo result = { "OpTypeQueue", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpTypePipe: { static InstructionInfo result = { "OpTypePipe", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpTypeForwardPointer: { static InstructionInfo result = { "OpTypeForwardPointer", InstructionFlags::None, {}}; return &result; } case spv::Op::OpConstantTrue: { static InstructionInfo result = { "OpConstantTrue", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpConstantFalse: { static InstructionInfo result = { "OpConstantFalse", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpConstant: { static InstructionInfo result = { "OpConstant", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpConstantComposite: { static InstructionInfo result = { "OpConstantComposite", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpConstantSampler: { static InstructionInfo result = { "OpConstantSampler", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpConstantNull: { static InstructionInfo result = { "OpConstantNull", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSpecConstantTrue: { static InstructionInfo result = { "OpSpecConstantTrue", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSpecConstantFalse: { static InstructionInfo result = { "OpSpecConstantFalse", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSpecConstant: { static InstructionInfo result = { "OpSpecConstant", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSpecConstantComposite: { static InstructionInfo result = { "OpSpecConstantComposite", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSpecConstantOp: { static InstructionInfo result = { "OpSpecConstantOp", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFunction: { static InstructionInfo result = { "OpFunction", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFunctionParameter: { static InstructionInfo result = { "OpFunctionParameter", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFunctionEnd: { static InstructionInfo result = { "OpFunctionEnd", InstructionFlags::None, {}}; return &result; } case spv::Op::OpFunctionCall: { static InstructionInfo result = { "OpFunctionCall", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpVariable: { static InstructionInfo result = { "OpVariable", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageTexelPointer: { static InstructionInfo result = { "OpImageTexelPointer", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpLoad: { static InstructionInfo result = { "OpLoad", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpStore: { static InstructionInfo result = {"OpStore", InstructionFlags::None, {}}; return &result; } case spv::Op::OpCopyMemory: { static InstructionInfo result = { "OpCopyMemory", InstructionFlags::None, {}}; return &result; } case spv::Op::OpCopyMemorySized: { static InstructionInfo result = { "OpCopyMemorySized", InstructionFlags::None, {}}; return &result; } case spv::Op::OpAccessChain: { static InstructionInfo result = { "OpAccessChain", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpInBoundsAccessChain: { static InstructionInfo result = { "OpInBoundsAccessChain", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpPtrAccessChain: { static InstructionInfo result = { "OpPtrAccessChain", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpArrayLength: { static InstructionInfo result = { "OpArrayLength", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGenericPtrMemSemantics: { static InstructionInfo result = { "OpGenericPtrMemSemantics", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpInBoundsPtrAccessChain: { static InstructionInfo result = { "OpInBoundsPtrAccessChain", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpDecorate: { static InstructionInfo result = {"OpDecorate", InstructionFlags::None, {}}; return &result; } case spv::Op::OpMemberDecorate: { static InstructionInfo result = { "OpMemberDecorate", InstructionFlags::None, {}}; return &result; } case spv::Op::OpDecorationGroup: { static InstructionInfo result = {"OpDecorationGroup", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpGroupDecorate: { static InstructionInfo result = { "OpGroupDecorate", InstructionFlags::None, {}}; return &result; } case spv::Op::OpGroupMemberDecorate: { static InstructionInfo result = { "OpGroupMemberDecorate", InstructionFlags::None, {}}; return &result; } case spv::Op::OpVectorExtractDynamic: { static InstructionInfo result = { "OpVectorExtractDynamic", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpVectorInsertDynamic: { static InstructionInfo result = { "OpVectorInsertDynamic", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpVectorShuffle: { static InstructionInfo result = { "OpVectorShuffle", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpCompositeConstruct: { static InstructionInfo result = { "OpCompositeConstruct", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpCompositeExtract: { static InstructionInfo result = { "OpCompositeExtract", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpCompositeInsert: { static InstructionInfo result = { "OpCompositeInsert", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpCopyObject: { static InstructionInfo result = { "OpCopyObject", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpTranspose: { static InstructionInfo result = { "OpTranspose", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSampledImage: { static InstructionInfo result = { "OpSampledImage", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageSampleImplicitLod: { static InstructionInfo result = { "OpImageSampleImplicitLod", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageSampleExplicitLod: { static InstructionInfo result = { "OpImageSampleExplicitLod", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageSampleDrefImplicitLod: { static InstructionInfo result = { "OpImageSampleDrefImplicitLod", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageSampleDrefExplicitLod: { static InstructionInfo result = { "OpImageSampleDrefExplicitLod", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageSampleProjImplicitLod: { static InstructionInfo result = { "OpImageSampleProjImplicitLod", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageSampleProjExplicitLod: { static InstructionInfo result = { "OpImageSampleProjExplicitLod", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageSampleProjDrefImplicitLod: { static InstructionInfo result = { "OpImageSampleProjDrefImplicitLod", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageSampleProjDrefExplicitLod: { static InstructionInfo result = { "OpImageSampleProjDrefExplicitLod", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageFetch: { static InstructionInfo result = { "OpImageFetch", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageGather: { static InstructionInfo result = { "OpImageGather", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageDrefGather: { static InstructionInfo result = { "OpImageDrefGather", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageRead: { static InstructionInfo result = { "OpImageRead", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageWrite: { static InstructionInfo result = { "OpImageWrite", InstructionFlags::None, {}}; return &result; } case spv::Op::OpImage: { static InstructionInfo result = { "OpImage", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageQueryFormat: { static InstructionInfo result = { "OpImageQueryFormat", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageQueryOrder: { static InstructionInfo result = { "OpImageQueryOrder", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageQuerySizeLod: { static InstructionInfo result = { "OpImageQuerySizeLod", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageQuerySize: { static InstructionInfo result = { "OpImageQuerySize", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageQueryLod: { static InstructionInfo result = { "OpImageQueryLod", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageQueryLevels: { static InstructionInfo result = { "OpImageQueryLevels", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageQuerySamples: { static InstructionInfo result = { "OpImageQuerySamples", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpConvertFToU: { static InstructionInfo result = { "OpConvertFToU", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpConvertFToS: { static InstructionInfo result = { "OpConvertFToS", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpConvertSToF: { static InstructionInfo result = { "OpConvertSToF", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpConvertUToF: { static InstructionInfo result = { "OpConvertUToF", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpUConvert: { static InstructionInfo result = { "OpUConvert", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSConvert: { static InstructionInfo result = { "OpSConvert", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFConvert: { static InstructionInfo result = { "OpFConvert", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpQuantizeToF16: { static InstructionInfo result = { "OpQuantizeToF16", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpConvertPtrToU: { static InstructionInfo result = { "OpConvertPtrToU", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSatConvertSToU: { static InstructionInfo result = { "OpSatConvertSToU", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSatConvertUToS: { static InstructionInfo result = { "OpSatConvertUToS", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpConvertUToPtr: { static InstructionInfo result = { "OpConvertUToPtr", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpPtrCastToGeneric: { static InstructionInfo result = { "OpPtrCastToGeneric", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGenericCastToPtr: { static InstructionInfo result = { "OpGenericCastToPtr", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGenericCastToPtrExplicit: { static InstructionInfo result = { "OpGenericCastToPtrExplicit", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpBitcast: { static InstructionInfo result = { "OpBitcast", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSNegate: { static InstructionInfo result = { "OpSNegate", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFNegate: { static InstructionInfo result = { "OpFNegate", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpIAdd: { static InstructionInfo result = { "OpIAdd", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFAdd: { static InstructionInfo result = { "OpFAdd", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpISub: { static InstructionInfo result = { "OpISub", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFSub: { static InstructionInfo result = { "OpFSub", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpIMul: { static InstructionInfo result = { "OpIMul", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFMul: { static InstructionInfo result = { "OpFMul", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpUDiv: { static InstructionInfo result = { "OpUDiv", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSDiv: { static InstructionInfo result = { "OpSDiv", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFDiv: { static InstructionInfo result = { "OpFDiv", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpUMod: { static InstructionInfo result = { "OpUMod", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSRem: { static InstructionInfo result = { "OpSRem", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSMod: { static InstructionInfo result = { "OpSMod", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFRem: { static InstructionInfo result = { "OpFRem", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFMod: { static InstructionInfo result = { "OpFMod", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpVectorTimesScalar: { static InstructionInfo result = { "OpVectorTimesScalar", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpMatrixTimesScalar: { static InstructionInfo result = { "OpMatrixTimesScalar", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpVectorTimesMatrix: { static InstructionInfo result = { "OpVectorTimesMatrix", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpMatrixTimesVector: { static InstructionInfo result = { "OpMatrixTimesVector", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpMatrixTimesMatrix: { static InstructionInfo result = { "OpMatrixTimesMatrix", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpOuterProduct: { static InstructionInfo result = { "OpOuterProduct", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpDot: { static InstructionInfo result = { "OpDot", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpIAddCarry: { static InstructionInfo result = { "OpIAddCarry", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpISubBorrow: { static InstructionInfo result = { "OpISubBorrow", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpUMulExtended: { static InstructionInfo result = { "OpUMulExtended", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSMulExtended: { static InstructionInfo result = { "OpSMulExtended", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpAny: { static InstructionInfo result = { "OpAny", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpAll: { static InstructionInfo result = { "OpAll", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpIsNan: { static InstructionInfo result = { "OpIsNan", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpIsInf: { static InstructionInfo result = { "OpIsInf", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpIsFinite: { static InstructionInfo result = { "OpIsFinite", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpIsNormal: { static InstructionInfo result = { "OpIsNormal", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSignBitSet: { static InstructionInfo result = { "OpSignBitSet", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpLessOrGreater: { static InstructionInfo result = { "OpLessOrGreater", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpOrdered: { static InstructionInfo result = { "OpOrdered", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpUnordered: { static InstructionInfo result = { "OpUnordered", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpLogicalEqual: { static InstructionInfo result = { "OpLogicalEqual", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpLogicalNotEqual: { static InstructionInfo result = { "OpLogicalNotEqual", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpLogicalOr: { static InstructionInfo result = { "OpLogicalOr", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpLogicalAnd: { static InstructionInfo result = { "OpLogicalAnd", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpLogicalNot: { static InstructionInfo result = { "OpLogicalNot", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSelect: { static InstructionInfo result = { "OpSelect", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpIEqual: { static InstructionInfo result = { "OpIEqual", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpINotEqual: { static InstructionInfo result = { "OpINotEqual", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpUGreaterThan: { static InstructionInfo result = { "OpUGreaterThan", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSGreaterThan: { static InstructionInfo result = { "OpSGreaterThan", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpUGreaterThanEqual: { static InstructionInfo result = { "OpUGreaterThanEqual", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSGreaterThanEqual: { static InstructionInfo result = { "OpSGreaterThanEqual", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpULessThan: { static InstructionInfo result = { "OpULessThan", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSLessThan: { static InstructionInfo result = { "OpSLessThan", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpULessThanEqual: { static InstructionInfo result = { "OpULessThanEqual", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSLessThanEqual: { static InstructionInfo result = { "OpSLessThanEqual", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFOrdEqual: { static InstructionInfo result = { "OpFOrdEqual", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFUnordEqual: { static InstructionInfo result = { "OpFUnordEqual", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFOrdNotEqual: { static InstructionInfo result = { "OpFOrdNotEqual", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFUnordNotEqual: { static InstructionInfo result = { "OpFUnordNotEqual", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFOrdLessThan: { static InstructionInfo result = { "OpFOrdLessThan", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFUnordLessThan: { static InstructionInfo result = { "OpFUnordLessThan", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFOrdGreaterThan: { static InstructionInfo result = { "OpFOrdGreaterThan", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFUnordGreaterThan: { static InstructionInfo result = { "OpFUnordGreaterThan", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFOrdLessThanEqual: { static InstructionInfo result = { "OpFOrdLessThanEqual", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFUnordLessThanEqual: { static InstructionInfo result = { "OpFUnordLessThanEqual", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFOrdGreaterThanEqual: { static InstructionInfo result = { "OpFOrdGreaterThanEqual", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFUnordGreaterThanEqual: { static InstructionInfo result = { "OpFUnordGreaterThanEqual", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpShiftRightLogical: { static InstructionInfo result = { "OpShiftRightLogical", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpShiftRightArithmetic: { static InstructionInfo result = { "OpShiftRightArithmetic", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpShiftLeftLogical: { static InstructionInfo result = { "OpShiftLeftLogical", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpBitwiseOr: { static InstructionInfo result = { "OpBitwiseOr", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpBitwiseXor: { static InstructionInfo result = { "OpBitwiseXor", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpBitwiseAnd: { static InstructionInfo result = { "OpBitwiseAnd", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpNot: { static InstructionInfo result = { "OpNot", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpBitFieldInsert: { static InstructionInfo result = { "OpBitFieldInsert", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpBitFieldSExtract: { static InstructionInfo result = { "OpBitFieldSExtract", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpBitFieldUExtract: { static InstructionInfo result = { "OpBitFieldUExtract", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpBitReverse: { static InstructionInfo result = { "OpBitReverse", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpBitCount: { static InstructionInfo result = { "OpBitCount", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpDPdx: { static InstructionInfo result = { "OpDPdx", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpDPdy: { static InstructionInfo result = { "OpDPdy", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFwidth: { static InstructionInfo result = { "OpFwidth", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpDPdxFine: { static InstructionInfo result = { "OpDPdxFine", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpDPdyFine: { static InstructionInfo result = { "OpDPdyFine", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFwidthFine: { static InstructionInfo result = { "OpFwidthFine", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpDPdxCoarse: { static InstructionInfo result = { "OpDPdxCoarse", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpDPdyCoarse: { static InstructionInfo result = { "OpDPdyCoarse", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpFwidthCoarse: { static InstructionInfo result = { "OpFwidthCoarse", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpEmitVertex: { static InstructionInfo result = { "OpEmitVertex", InstructionFlags::None, {}}; return &result; } case spv::Op::OpEndPrimitive: { static InstructionInfo result = { "OpEndPrimitive", InstructionFlags::None, {}}; return &result; } case spv::Op::OpEmitStreamVertex: { static InstructionInfo result = { "OpEmitStreamVertex", InstructionFlags::None, {}}; return &result; } case spv::Op::OpEndStreamPrimitive: { static InstructionInfo result = { "OpEndStreamPrimitive", InstructionFlags::None, {}}; return &result; } case spv::Op::OpControlBarrier: { static InstructionInfo result = { "OpControlBarrier", InstructionFlags::None, {}}; return &result; } case spv::Op::OpMemoryBarrier: { static InstructionInfo result = { "OpMemoryBarrier", InstructionFlags::None, {}}; return &result; } case spv::Op::OpAtomicLoad: { static InstructionInfo result = { "OpAtomicLoad", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpAtomicStore: { static InstructionInfo result = { "OpAtomicStore", InstructionFlags::None, {}}; return &result; } case spv::Op::OpAtomicExchange: { static InstructionInfo result = { "OpAtomicExchange", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpAtomicCompareExchange: { static InstructionInfo result = { "OpAtomicCompareExchange", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpAtomicCompareExchangeWeak: { static InstructionInfo result = { "OpAtomicCompareExchangeWeak", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpAtomicIIncrement: { static InstructionInfo result = { "OpAtomicIIncrement", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpAtomicIDecrement: { static InstructionInfo result = { "OpAtomicIDecrement", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpAtomicIAdd: { static InstructionInfo result = { "OpAtomicIAdd", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpAtomicISub: { static InstructionInfo result = { "OpAtomicISub", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpAtomicSMin: { static InstructionInfo result = { "OpAtomicSMin", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpAtomicUMin: { static InstructionInfo result = { "OpAtomicUMin", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpAtomicSMax: { static InstructionInfo result = { "OpAtomicSMax", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpAtomicUMax: { static InstructionInfo result = { "OpAtomicUMax", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpAtomicAnd: { static InstructionInfo result = { "OpAtomicAnd", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpAtomicOr: { static InstructionInfo result = { "OpAtomicOr", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpAtomicXor: { static InstructionInfo result = { "OpAtomicXor", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpPhi: { static InstructionInfo result = { "OpPhi", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpLoopMerge: { static InstructionInfo result = {"OpLoopMerge", InstructionFlags::None, {}}; return &result; } case spv::Op::OpSelectionMerge: { static InstructionInfo result = { "OpSelectionMerge", InstructionFlags::None, {}}; return &result; } case spv::Op::OpLabel: { static InstructionInfo result = { "OpLabel", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpBranch: { static InstructionInfo result = {"OpBranch", InstructionFlags::None, {}}; return &result; } case spv::Op::OpBranchConditional: { static InstructionInfo result = { "OpBranchConditional", InstructionFlags::None, {}}; return &result; } case spv::Op::OpSwitch: { static InstructionInfo result = {"OpSwitch", InstructionFlags::None, {}}; return &result; } case spv::Op::OpKill: { static InstructionInfo result = {"OpKill", InstructionFlags::None, {}}; return &result; } case spv::Op::OpReturn: { static InstructionInfo result = {"OpReturn", InstructionFlags::None, {}}; return &result; } case spv::Op::OpReturnValue: { static InstructionInfo result = { "OpReturnValue", InstructionFlags::None, {}}; return &result; } case spv::Op::OpUnreachable: { static InstructionInfo result = { "OpUnreachable", InstructionFlags::None, {}}; return &result; } case spv::Op::OpLifetimeStart: { static InstructionInfo result = { "OpLifetimeStart", InstructionFlags::None, {}}; return &result; } case spv::Op::OpLifetimeStop: { static InstructionInfo result = { "OpLifetimeStop", InstructionFlags::None, {}}; return &result; } case spv::Op::OpGroupAsyncCopy: { static InstructionInfo result = { "OpGroupAsyncCopy", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupWaitEvents: { static InstructionInfo result = { "OpGroupWaitEvents", InstructionFlags::None, {}}; return &result; } case spv::Op::OpGroupAll: { static InstructionInfo result = { "OpGroupAll", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupAny: { static InstructionInfo result = { "OpGroupAny", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupBroadcast: { static InstructionInfo result = { "OpGroupBroadcast", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupIAdd: { static InstructionInfo result = { "OpGroupIAdd", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupFAdd: { static InstructionInfo result = { "OpGroupFAdd", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupFMin: { static InstructionInfo result = { "OpGroupFMin", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupUMin: { static InstructionInfo result = { "OpGroupUMin", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupSMin: { static InstructionInfo result = { "OpGroupSMin", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupFMax: { static InstructionInfo result = { "OpGroupFMax", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupUMax: { static InstructionInfo result = { "OpGroupUMax", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupSMax: { static InstructionInfo result = { "OpGroupSMax", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpReadPipe: { static InstructionInfo result = { "OpReadPipe", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpWritePipe: { static InstructionInfo result = { "OpWritePipe", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpReservedReadPipe: { static InstructionInfo result = { "OpReservedReadPipe", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpReservedWritePipe: { static InstructionInfo result = { "OpReservedWritePipe", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpReserveReadPipePackets: { static InstructionInfo result = { "OpReserveReadPipePackets", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpReserveWritePipePackets: { static InstructionInfo result = { "OpReserveWritePipePackets", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpCommitReadPipe: { static InstructionInfo result = { "OpCommitReadPipe", InstructionFlags::None, {}}; return &result; } case spv::Op::OpCommitWritePipe: { static InstructionInfo result = { "OpCommitWritePipe", InstructionFlags::None, {}}; return &result; } case spv::Op::OpIsValidReserveId: { static InstructionInfo result = { "OpIsValidReserveId", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGetNumPipePackets: { static InstructionInfo result = { "OpGetNumPipePackets", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGetMaxPipePackets: { static InstructionInfo result = { "OpGetMaxPipePackets", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupReserveReadPipePackets: { static InstructionInfo result = { "OpGroupReserveReadPipePackets", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupReserveWritePipePackets: { static InstructionInfo result = { "OpGroupReserveWritePipePackets", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupCommitReadPipe: { static InstructionInfo result = { "OpGroupCommitReadPipe", InstructionFlags::None, {}}; return &result; } case spv::Op::OpGroupCommitWritePipe: { static InstructionInfo result = { "OpGroupCommitWritePipe", InstructionFlags::None, {}}; return &result; } case spv::Op::OpEnqueueMarker: { static InstructionInfo result = { "OpEnqueueMarker", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpEnqueueKernel: { static InstructionInfo result = { "OpEnqueueKernel", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGetKernelNDrangeSubGroupCount: { static InstructionInfo result = { "OpGetKernelNDrangeSubGroupCount", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGetKernelNDrangeMaxSubGroupSize: { static InstructionInfo result = { "OpGetKernelNDrangeMaxSubGroupSize", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGetKernelWorkGroupSize: { static InstructionInfo result = { "OpGetKernelWorkGroupSize", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGetKernelPreferredWorkGroupSizeMultiple: { static InstructionInfo result = { "OpGetKernelPreferredWorkGroupSizeMultiple", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpRetainEvent: { static InstructionInfo result = { "OpRetainEvent", InstructionFlags::None, {}}; return &result; } case spv::Op::OpReleaseEvent: { static InstructionInfo result = { "OpReleaseEvent", InstructionFlags::None, {}}; return &result; } case spv::Op::OpCreateUserEvent: { static InstructionInfo result = { "OpCreateUserEvent", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpIsValidEvent: { static InstructionInfo result = { "OpIsValidEvent", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSetUserEventStatus: { static InstructionInfo result = { "OpSetUserEventStatus", InstructionFlags::None, {}}; return &result; } case spv::Op::OpCaptureEventProfilingInfo: { static InstructionInfo result = { "OpCaptureEventProfilingInfo", InstructionFlags::None, {}}; return &result; } case spv::Op::OpGetDefaultQueue: { static InstructionInfo result = { "OpGetDefaultQueue", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpBuildNDRange: { static InstructionInfo result = { "OpBuildNDRange", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageSparseSampleImplicitLod: { static InstructionInfo result = { "OpImageSparseSampleImplicitLod", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageSparseSampleExplicitLod: { static InstructionInfo result = { "OpImageSparseSampleExplicitLod", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageSparseSampleDrefImplicitLod: { static InstructionInfo result = { "OpImageSparseSampleDrefImplicitLod", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageSparseSampleDrefExplicitLod: { static InstructionInfo result = { "OpImageSparseSampleDrefExplicitLod", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageSparseSampleProjImplicitLod: { static InstructionInfo result = { "OpImageSparseSampleProjImplicitLod", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageSparseSampleProjExplicitLod: { static InstructionInfo result = { "OpImageSparseSampleProjExplicitLod", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageSparseSampleProjDrefImplicitLod: { static InstructionInfo result = { "OpImageSparseSampleProjDrefImplicitLod", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageSparseSampleProjDrefExplicitLod: { static InstructionInfo result = { "OpImageSparseSampleProjDrefExplicitLod", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageSparseFetch: { static InstructionInfo result = { "OpImageSparseFetch", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageSparseGather: { static InstructionInfo result = { "OpImageSparseGather", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageSparseDrefGather: { static InstructionInfo result = { "OpImageSparseDrefGather", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpImageSparseTexelsResident: { static InstructionInfo result = { "OpImageSparseTexelsResident", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpNoLine: { static InstructionInfo result = {"OpNoLine", InstructionFlags::None, {}}; return &result; } case spv::Op::OpAtomicFlagTestAndSet: { static InstructionInfo result = { "OpAtomicFlagTestAndSet", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpAtomicFlagClear: { static InstructionInfo result = { "OpAtomicFlagClear", InstructionFlags::None, {}}; return &result; } case spv::Op::OpImageSparseRead: { static InstructionInfo result = { "OpImageSparseRead", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpSizeOf: { static InstructionInfo result = { "OpSizeOf", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpTypePipeStorage: { static InstructionInfo result = {"OpTypePipeStorage", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpConstantPipeStorage: { static InstructionInfo result = { "OpConstantPipeStorage", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpCreatePipeFromPipeStorage: { static InstructionInfo result = { "OpCreatePipeFromPipeStorage", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGetKernelLocalSizeForSubgroupCount: { static InstructionInfo result = { "OpGetKernelLocalSizeForSubgroupCount", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGetKernelMaxNumSubgroups: { static InstructionInfo result = { "OpGetKernelMaxNumSubgroups", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpTypeNamedBarrier: { static InstructionInfo result = {"OpTypeNamedBarrier", InstructionFlags::HasResult, {}}; return &result; } case spv::Op::OpNamedBarrierInitialize: { static InstructionInfo result = { "OpNamedBarrierInitialize", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpMemoryNamedBarrier: { static InstructionInfo result = { "OpMemoryNamedBarrier", InstructionFlags::None, {}}; return &result; } case spv::Op::OpModuleProcessed: { static InstructionInfo result = { "OpModuleProcessed", InstructionFlags::None, {}}; return &result; } case spv::Op::OpExecutionModeId: { static InstructionInfo result = { "OpExecutionModeId", InstructionFlags::None, {}}; return &result; } case spv::Op::OpDecorateId: { static InstructionInfo result = { "OpDecorateId", InstructionFlags::None, {}}; return &result; } case spv::Op::OpGroupNonUniformElect: { static InstructionInfo result = { "OpGroupNonUniformElect", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformAll: { static InstructionInfo result = { "OpGroupNonUniformAll", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformAny: { static InstructionInfo result = { "OpGroupNonUniformAny", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformAllEqual: { static InstructionInfo result = { "OpGroupNonUniformAllEqual", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformBroadcast: { static InstructionInfo result = { "OpGroupNonUniformBroadcast", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformBroadcastFirst: { static InstructionInfo result = { "OpGroupNonUniformBroadcastFirst", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformBallot: { static InstructionInfo result = { "OpGroupNonUniformBallot", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformInverseBallot: { static InstructionInfo result = { "OpGroupNonUniformInverseBallot", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformBallotBitExtract: { static InstructionInfo result = { "OpGroupNonUniformBallotBitExtract", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformBallotBitCount: { static InstructionInfo result = { "OpGroupNonUniformBallotBitCount", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformBallotFindLSB: { static InstructionInfo result = { "OpGroupNonUniformBallotFindLSB", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformBallotFindMSB: { static InstructionInfo result = { "OpGroupNonUniformBallotFindMSB", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformShuffle: { static InstructionInfo result = { "OpGroupNonUniformShuffle", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformShuffleXor: { static InstructionInfo result = { "OpGroupNonUniformShuffleXor", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformShuffleUp: { static InstructionInfo result = { "OpGroupNonUniformShuffleUp", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformShuffleDown: { static InstructionInfo result = { "OpGroupNonUniformShuffleDown", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformIAdd: { static InstructionInfo result = { "OpGroupNonUniformIAdd", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformFAdd: { static InstructionInfo result = { "OpGroupNonUniformFAdd", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformIMul: { static InstructionInfo result = { "OpGroupNonUniformIMul", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformFMul: { static InstructionInfo result = { "OpGroupNonUniformFMul", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformSMin: { static InstructionInfo result = { "OpGroupNonUniformSMin", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformUMin: { static InstructionInfo result = { "OpGroupNonUniformUMin", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformFMin: { static InstructionInfo result = { "OpGroupNonUniformFMin", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformSMax: { static InstructionInfo result = { "OpGroupNonUniformSMax", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformUMax: { static InstructionInfo result = { "OpGroupNonUniformUMax", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformFMax: { static InstructionInfo result = { "OpGroupNonUniformFMax", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformBitwiseAnd: { static InstructionInfo result = { "OpGroupNonUniformBitwiseAnd", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformBitwiseOr: { static InstructionInfo result = { "OpGroupNonUniformBitwiseOr", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformBitwiseXor: { static InstructionInfo result = { "OpGroupNonUniformBitwiseXor", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformLogicalAnd: { static InstructionInfo result = { "OpGroupNonUniformLogicalAnd", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformLogicalOr: { static InstructionInfo result = { "OpGroupNonUniformLogicalOr", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformLogicalXor: { static InstructionInfo result = { "OpGroupNonUniformLogicalXor", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformQuadBroadcast: { static InstructionInfo result = { "OpGroupNonUniformQuadBroadcast", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpGroupNonUniformQuadSwap: { static InstructionInfo result = { "OpGroupNonUniformQuadSwap", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpCopyLogical: { static InstructionInfo result = { "OpCopyLogical", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpPtrEqual: { static InstructionInfo result = { "OpPtrEqual", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpPtrNotEqual: { static InstructionInfo result = { "OpPtrNotEqual", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } case spv::Op::OpPtrDiff: { static InstructionInfo result = { "OpPtrDiff", InstructionFlags::HasResult | InstructionFlags::HasResultType, {}}; return &result; } } return nullptr; } inline void dump(std::span range, void (*printId)(std::uint32_t id) = nullptr) { if (printId == nullptr) { printId = [](uint32_t id) { std::printf("%%%u", id); }; } while (!range.empty()) { auto opWordCount = range[0]; auto op = static_cast(opWordCount & spv::OpCodeMask); auto wordCount = opWordCount >> spv::WordCountShift; if (range.size() < wordCount || wordCount == 0) { std::printf("\n"); for (auto word : range) { std::printf("%08x ", (unsigned)word); } std::printf("\n"); break; } auto info = getInstructionInfo(op); if (info == nullptr) { std::printf("unknown instruction\n"); range = range.subspan(wordCount); continue; } auto word = range.data() + 1; auto wordEnd = range.data() + wordCount; bool isFirst = true; if ((info->flags & InstructionFlags::HasResult) == InstructionFlags::HasResult) { std::uint32_t outputTypeId = 0; if ((info->flags & InstructionFlags::HasResultType) == InstructionFlags::HasResultType) { if (word < wordEnd) { outputTypeId = *word++; } } std::uint32_t outputId = word < wordEnd ? *word++ : 0; printId(outputId); if ((info->flags & InstructionFlags::HasResultType) == InstructionFlags::HasResultType) { std::printf(": "); printId(outputTypeId); } std::printf(" = "); } std::printf("%s(", info->name); for (auto &op : std::span(info->operands)) { if (op == OperandKind::Invalid) { break; } if (word >= wordEnd) { if (op == OperandKind::VariadicWord || op == OperandKind::VariadicId) { break; } std::printf("\n"); break; } auto currentWord = *word++; if (isFirst) { isFirst = false; } else { std::printf(", "); } if (op == OperandKind::VariadicId || op == OperandKind::TypeId || op == OperandKind::ValueId) { printId(currentWord); } else if (op == OperandKind::Word || op == OperandKind::VariadicWord) { std::printf("%u", currentWord); } else if (op == OperandKind::String) { bool foundEnd = false; while (true) { if (reinterpret_cast(currentWord)[3] == '\0') { foundEnd = true; break; } if (word >= wordEnd) { break; } currentWord = *word++; } if (foundEnd) { std::printf("'%s'", reinterpret_cast(word - 1)); } else { std::printf(""); } } else { std::printf(""); } } while (word < wordEnd) { if (isFirst) { isFirst = false; } else { std::printf(", "); } auto currentWord = *word++; std::printf("%u", currentWord); } std::printf(")\n"); range = range.subspan(wordCount); } } } // namespace spirv