rpcsx/hw/amdgpu/lib/libspirv/include/spirv/spirv-instruction.hpp

2422 lines
71 KiB
C++
Raw Normal View History

2023-06-24 14:59:27 +02:00
#pragma once
#include "spirv.hpp"
#include <cstdint>
#include <cstdio>
#include <span>
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<InstructionFlags>(static_cast<int>(lhs) |
static_cast<int>(rhs));
}
inline InstructionFlags operator&(InstructionFlags lhs, InstructionFlags rhs) {
return static_cast<InstructionFlags>(static_cast<int>(lhs) &
static_cast<int>(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<const std::uint32_t> 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<spv::Op>(opWordCount & spv::OpCodeMask);
auto wordCount = opWordCount >> spv::WordCountShift;
if (range.size() < wordCount || wordCount == 0) {
std::printf("<corrupted data>\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("<corrupted>\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<const char *>(currentWord)[3] == '\0') {
foundEnd = true;
break;
}
if (word >= wordEnd) {
break;
}
currentWord = *word++;
}
if (foundEnd) {
std::printf("'%s'", reinterpret_cast<const char *>(word - 1));
} else {
std::printf("<corrupted string>");
}
} else {
std::printf("<invalid>");
}
}
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