{-# LANGUAGE MultiParamTypeClasses #-}
module Language.SpirV.OpCode where

import           Data.Word (Word16)
import qualified Language.SpirV.Capability as Capability
import           Language.SpirV.SpirEnum

data OpCode =
    OpNop
  | OpUndef
  | OpSourceContinued
  | OpSource
  | OpSourceExtension
  | OpName
  | OpMemberName
  | OpString
  | OpLine
  | OpNoLine
  | OpDecorate
  | OpMemberDecorate
  | OpDecorationGroup
  | OpGroupDecorate
  | OpGroupMemberDecorate
  | OpExtension
  | OpExtInstImport
  | OpExtInst
  | OpMemoryModel
  | OpEntryPoint
  | OpExecutionMode
  | OpCapability
  | OpTypeVoid
  | OpTypeBool
  | OpTypeInt
  | OpTypeFloat
  | OpTypeVector
  | OpTypeMatrix
  | OpTypeImage
  | OpTypeSampler
  | OpTypeSampledImage
  | OpTypeArray
  | OpTypeRuntimeArray
  | OpTypeStruct
  | OpTypeOpaque
  | OpTypePointer
  | OpTypeFunction
  | OpTypeEvent
  | OpTypeDeviceEvent
  | OpTypeReserveId
  | OpTypeQueue
  | OpTypePipe
  | OpTypeForwardPointer
  | OpConstantTrue
  | OpConstantFalse
  | OpConstant
  | OpConstantComposite
  | OpConstantSampler
  | OpConstantNull
  | OpSpecConstantTrue
  | OpSpecConstantFalse
  | OpSpecConstant
  | OpSpecConstantComposite
  | OpSpecConstantOp
  | OpVariable
  | OpImageTexelPointer
  | OpLoad
  | OpStore
  | OpCopyMemory
  | OpCopyMemorySized
  | OpAccessChain
  | OpInBoundsAccessChain
  | OpPtrAccessChain
  | OpArrayLength
  | OpGenericPtrMemSemantics
  | OpInBoundsPtrAccessChain
  | OpFunction
  | OpFunctionParameter
  | OpFunctionEnd
  | OpFunctionCall
  | OpSampledImage
  | OpImageSampleImplicitLod
  | OpImageSampleExplicitLod
  | OpImageSampleDrefImplicitLod
  | OpImageSampleDrefExplicitLod
  | OpImageSampleProjImplicitLod
  | OpImageSampleProjExplicitLod
  | OpImageSampleProjDrefImplicitLod
  | OpImageSampleProjDrefExplicitLod
  | OpImageFetch
  | OpImageGather
  | OpImageDrefGather
  | OpImageRead
  | OpImageWrite
  | OpImage
  | OpImageQueryFormat
  | OpImageQueryOrder
  | OpImageQuerySizeLod
  | OpImageQuerySize
  | OpImageQueryLod
  | OpImageQueryLevels
  | OpImageQuerySamples
  | OpImageSparseSampleImplicitLod
  | OpImageSparseSampleExplicitLod
  | OpImageSparseSampleDrefImplicitLod
  | OpImageSparseSampleDrefExplicitLod
  | OpImageSparseSampleProjImplicitLod
  | OpImageSparseSampleProjExplicitLod
  | OpImageSparseSampleProjDrefImplicitLod
  | OpImageSparseSampleProjDrefExplicitLod
  | OpImageSparseFetch
  | OpImageSparseGather
  | OpImageSparseDrefGather
  | OpImageSparseTexelsResident
  | OpImageSparseRead
  | OpConvertFToU
  | OpConvertFToS
  | OpConvertSToF
  | OpConvertUToF
  | OpUConvert
  | OpSConvert
  | OpFConvert
  | OpQuantizeToF16
  | OpConvertPtrToU
  | OpSatConvertSToU
  | OpSatConvertUToS
  | OpConvertUToPtr
  | OpPtrCastToGeneric
  | OpGenericCastToPtr
  | OpGenericCastToPtrExplicit
  | OpBitcast
  | OpVectorExtractDynamic
  | OpVectorInsertDynamic
  | OpVectorShuffle
  | OpCompositeConstruct
  | OpCompositeExtract
  | OpCompositeInsert
  | OpCopyObject
  | OpTranspose
  | OpSNegate
  | OpFNegate
  | OpIAdd
  | OpFAdd
  | OpISub
  | OpFSub
  | OpIMul
  | OpFMul
  | OpUDiv
  | OpSDiv
  | OpFDiv
  | OpUMod
  | OpSRem
  | OpSMod
  | OpFRem
  | OpFMod
  | OpVectorTimesScalar
  | OpMatrixTimesScalar
  | OpVectorTimesMatrix
  | OpMatrixTimesVector
  | OpMatrixTimesMatrix
  | OpOuterProduct
  | OpDot
  | OpIAddCarry
  | OpISubBorrow
  | OpUMulExtended
  | OpSMulExtended
  | OpShiftRightLogical
  | OpShiftRightArithmetic
  | OpShiftLeftLogical
  | OpBitwiseOr
  | OpBitwiseXor
  | OpBitwiseAnd
  | OpNot
  | OpBitFieldInsert
  | OpBitFieldSExtract
  | OpBitFieldUExtract
  | OpBitReverse
  | OpBitCount
  | OpAny
  | OpAll
  | OpIsNan
  | OpIsInf
  | OpIsFinite
  | OpIsNormal
  | OpSignBitSet
  | OpLessOrGreater
  | OpOrdered
  | OpUnordered
  | OpLogicalEqual
  | OpLogicalNotEqual
  | OpLogicalOr
  | OpLogicalAnd
  | OpLogicalNot
  | OpSelect
  | OpIEqual
  | OpINotEqual
  | OpUGreaterThan
  | OpSGreaterThan
  | OpUGreaterThanEqual
  | OpSGreaterThanEqual
  | OpULessThan
  | OpSLessThan
  | OpULessThanEqual
  | OpSLessThanEqual
  | OpFOrdEqual
  | OpFUnordEqual
  | OpFOrdNotEqual
  | OpFUnordNotEqual
  | OpFOrdLessThan
  | OpFUnordLessThan
  | OpFOrdGreaterThan
  | OpFUnordGreaterThan
  | OpFOrdLessThanEqual
  | OpFUnordLessThanEqual
  | OpFOrdGreaterThanEqual
  | OpFUnordGreaterThanEqual
  | OpDPdx
  | OpDPdy
  | OpFwidth
  | OpDPdxFine
  | OpDPdyFine
  | OpFwidthFine
  | OpDPdxCoarse
  | OpDPdyCoarse
  | OpFwidthCoarse
  | OpPhi
  | OpLoopMerge
  | OpSelectionMerge
  | OpLabel
  | OpBranch
  | OpBranchConditional
  | OpSwitch
  | OpKill
  | OpReturn
  | OpReturnValue
  | OpUnreachable
  | OpLifetimeStart
  | OpLifetimeStop
  | OpAtomicLoad
  | OpAtomicStore
  | OpAtomicExchange
  | OpAtomicCompareExchange
  | OpAtomicCompareExchangeWeak
  | OpAtomicIIncrement
  | OpAtomicIDecrement
  | OpAtomicIAdd
  | OpAtomicISub
  | OpAtomicSMin
  | OpAtomicUMin
  | OpAtomicSMax
  | OpAtomicUMax
  | OpAtomicAnd
  | OpAtomicOr
  | OpAtomicXor
  | OpAtomicFlagTestAndSet
  | OpAtomicFlagClear
  | OpEmitVertex
  | OpEndPrimitive
  | OpEmitStreamVertex
  | OpEndStreamPrimitive
  | OpControlBarrier
  | OpMemoryBarrier
  | OpGroupAsyncCopy
  | OpGroupWaitEvents
  | OpGroupAll
  | OpGroupAny
  | OpGroupBroadcast
  | OpGroupIAdd
  | OpGroupFAdd
  | OpGroupFMin
  | OpGroupUMin
  | OpGroupSMin
  | OpGroupFMax
  | OpGroupUMax
  | OpGroupSMax
  | OpEnqueueMarker
  | OpEnqueueKernel
  | OpGetKernelNDrangeSubGroupCount
  | OpGetKernelNDrangeMaxSubGroupSize
  | OpGetKernelWorkGroupSize
  | OpGetKernelPreferredWorkGroupSizeMultiple
  | OpRetainEvent
  | OpReleaseEvent
  | OpCreateUserEvent
  | OpIsValidEvent
  | OpSetUserEventStatus
  | OpCaptureEventProfilingInfo
  | OpGetDefaultQueue
  | OpBuildNDRange
  | OpReadPipe
  | OpWritePipe
  | OpReservedReadPipe
  | OpReservedWritePipe
  | OpReserveReadPipePackets
  | OpReserveWritePipePackets
  | OpCommitReadPipe
  | OpCommitWritePipe
  | OpIsValidReserveId
  | OpGetNumPipePackets
  | OpGetMaxPipePackets
  | OpGroupReserveReadPipePackets
  | OpGroupReserveWritePipePackets
  | OpGroupCommitReadPipe
  | OpGroupCommitWritePipe
  deriving(Read, Show, Eq, Ord)

data InstructionSize = Fixed Word16
                     | Variadic Word16
  deriving(Read, Show, Eq)

instructionSize :: OpCode -> InstructionSize
instructionSize OpNop = Fixed 1
instructionSize OpUndef = Fixed 3
instructionSize OpSourceContinued = Variadic 2
instructionSize OpSource = Variadic 3
instructionSize OpSourceExtension = Variadic 2
instructionSize OpName = Variadic 3
instructionSize OpMemberName = Variadic 4
instructionSize OpString = Variadic 3
instructionSize OpLine = Fixed 4
instructionSize OpNoLine = Fixed 1
instructionSize OpDecorate = Variadic 3
instructionSize OpMemberDecorate = Variadic 4
instructionSize OpDecorationGroup = Fixed 2
instructionSize OpGroupDecorate = Variadic 2
instructionSize OpGroupMemberDecorate = Fixed 2
instructionSize OpExtension = Variadic 2
instructionSize OpExtInstImport = Variadic 3
instructionSize OpExtInst = Variadic 5
instructionSize OpMemoryModel = Fixed 3
instructionSize OpEntryPoint = Variadic 4
instructionSize OpExecutionMode = Variadic 3
instructionSize OpCapability = Fixed 2
instructionSize OpTypeVoid = Fixed 2
instructionSize OpTypeBool = Fixed 2
instructionSize OpTypeInt = Fixed 4
instructionSize OpTypeFloat = Fixed 3
instructionSize OpTypeVector = Fixed 4
instructionSize OpTypeMatrix = Fixed 4
instructionSize OpTypeImage = Variadic 9
instructionSize OpTypeSampler = Fixed 2
instructionSize OpTypeSampledImage = Fixed 3
instructionSize OpTypeArray = Fixed 4
instructionSize OpTypeRuntimeArray = Fixed 3
instructionSize OpTypeStruct = Variadic 2
instructionSize OpTypeOpaque = Variadic 3
instructionSize OpTypePointer = Fixed 4
instructionSize OpTypeFunction = Variadic 3
instructionSize OpTypeEvent = Fixed 2
instructionSize OpTypeDeviceEvent = Fixed 2
instructionSize OpTypeReserveId = Fixed 2
instructionSize OpTypeQueue = Fixed 2
instructionSize OpTypePipe = Fixed 3
instructionSize OpTypeForwardPointer = Fixed 3
instructionSize OpConstantTrue = Fixed 3
instructionSize OpConstantFalse = Fixed 3
instructionSize OpConstant = Variadic 3
instructionSize OpConstantComposite = Variadic 3
instructionSize OpConstantSampler = Fixed 6
instructionSize OpConstantNull = Fixed 3
instructionSize OpSpecConstantTrue = Fixed 3
instructionSize OpSpecConstantFalse = Fixed 3
instructionSize OpSpecConstant = Variadic 3
instructionSize OpSpecConstantComposite = Variadic 3
instructionSize OpSpecConstantOp = Variadic 4
instructionSize OpVariable = Variadic 4
instructionSize OpImageTexelPointer = Fixed 6
instructionSize OpLoad = Variadic 4
instructionSize OpStore = Variadic 3
instructionSize OpCopyMemory = Variadic 3
instructionSize OpCopyMemorySized = Variadic 4
instructionSize OpAccessChain = Variadic 4
instructionSize OpInBoundsAccessChain = Variadic 4
instructionSize OpPtrAccessChain = Variadic 5
instructionSize OpArrayLength = Fixed 5
instructionSize OpGenericPtrMemSemantics = Fixed 4
instructionSize OpInBoundsPtrAccessChain = Variadic 5
instructionSize OpFunction = Fixed 5
instructionSize OpFunctionParameter = Fixed 3
instructionSize OpFunctionEnd = Fixed 1
instructionSize OpFunctionCall = Variadic 4
instructionSize OpSampledImage = Fixed 5
instructionSize OpImageSampleImplicitLod = Variadic 5
instructionSize OpImageSampleExplicitLod = Variadic 7
instructionSize OpImageSampleDrefImplicitLod = Variadic 6
instructionSize OpImageSampleDrefExplicitLod = Variadic 8
instructionSize OpImageSampleProjImplicitLod = Variadic 5
instructionSize OpImageSampleProjExplicitLod = Variadic 7
instructionSize OpImageSampleProjDrefImplicitLod = Variadic 6
instructionSize OpImageSampleProjDrefExplicitLod = Variadic 8
instructionSize OpImageFetch = Variadic 5
instructionSize OpImageGather = Variadic 6
instructionSize OpImageDrefGather = Variadic 6
instructionSize OpImageRead = Variadic 5
instructionSize OpImageWrite = Variadic 4
instructionSize OpImage = Fixed 4
instructionSize OpImageQueryFormat = Fixed 4
instructionSize OpImageQueryOrder = Fixed 4
instructionSize OpImageQuerySizeLod = Fixed 5
instructionSize OpImageQuerySize = Fixed 4
instructionSize OpImageQueryLod = Fixed 5
instructionSize OpImageQueryLevels = Fixed 4
instructionSize OpImageQuerySamples = Fixed 4
instructionSize OpImageSparseSampleImplicitLod = Variadic 5
instructionSize OpImageSparseSampleExplicitLod = Variadic 7
instructionSize OpImageSparseSampleDrefImplicitLod = Variadic 6
instructionSize OpImageSparseSampleDrefExplicitLod = Variadic 8
instructionSize OpImageSparseSampleProjImplicitLod = Variadic 5
instructionSize OpImageSparseSampleProjExplicitLod = Variadic 7
instructionSize OpImageSparseSampleProjDrefImplicitLod = Variadic 6
instructionSize OpImageSparseSampleProjDrefExplicitLod = Variadic 8
instructionSize OpImageSparseFetch = Variadic 5
instructionSize OpImageSparseGather = Variadic 6
instructionSize OpImageSparseDrefGather = Variadic 6
instructionSize OpImageSparseTexelsResident = Fixed 4
instructionSize OpImageSparseRead = Variadic 5
instructionSize OpConvertFToU = Fixed 4
instructionSize OpConvertFToS = Fixed 4
instructionSize OpConvertSToF = Fixed 4
instructionSize OpConvertUToF = Fixed 4
instructionSize OpUConvert = Fixed 4
instructionSize OpSConvert = Fixed 4
instructionSize OpFConvert = Fixed 4
instructionSize OpQuantizeToF16 = Fixed 4
instructionSize OpConvertPtrToU = Fixed 4
instructionSize OpSatConvertSToU = Fixed 4
instructionSize OpSatConvertUToS = Fixed 4
instructionSize OpConvertUToPtr = Fixed 4
instructionSize OpPtrCastToGeneric = Fixed 4
instructionSize OpGenericCastToPtr = Fixed 4
instructionSize OpGenericCastToPtrExplicit = Fixed 5
instructionSize OpBitcast = Fixed 4
instructionSize OpVectorExtractDynamic = Fixed 5
instructionSize OpVectorInsertDynamic = Fixed 6
instructionSize OpVectorShuffle = Variadic 5
instructionSize OpCompositeConstruct = Variadic 3
instructionSize OpCompositeExtract = Variadic 4
instructionSize OpCompositeInsert = Variadic 5
instructionSize OpCopyObject = Fixed 4
instructionSize OpTranspose = Fixed 4
instructionSize OpSNegate = Fixed 4
instructionSize OpFNegate = Fixed 4
instructionSize OpIAdd = Fixed 5
instructionSize OpFAdd = Fixed 5
instructionSize OpISub = Fixed 5
instructionSize OpFSub = Fixed 5
instructionSize OpIMul = Fixed 5
instructionSize OpFMul = Fixed 5
instructionSize OpUDiv = Fixed 5
instructionSize OpSDiv = Fixed 5
instructionSize OpFDiv = Fixed 5
instructionSize OpUMod = Fixed 5
instructionSize OpSRem = Fixed 5
instructionSize OpSMod = Fixed 5
instructionSize OpFRem = Fixed 5
instructionSize OpFMod = Fixed 5
instructionSize OpVectorTimesScalar = Fixed 5
instructionSize OpMatrixTimesScalar = Fixed 5
instructionSize OpVectorTimesMatrix = Fixed 5
instructionSize OpMatrixTimesVector = Fixed 5
instructionSize OpMatrixTimesMatrix = Fixed 5
instructionSize OpOuterProduct = Fixed 5
instructionSize OpDot = Fixed 5
instructionSize OpIAddCarry = Fixed 5
instructionSize OpISubBorrow = Fixed 5
instructionSize OpUMulExtended = Fixed 5
instructionSize OpSMulExtended = Fixed 5
instructionSize OpShiftRightLogical = Fixed 5
instructionSize OpShiftRightArithmetic = Fixed 5
instructionSize OpShiftLeftLogical = Fixed 5
instructionSize OpBitwiseOr = Fixed 5
instructionSize OpBitwiseXor = Fixed 5
instructionSize OpBitwiseAnd = Fixed 5
instructionSize OpNot = Fixed 4
instructionSize OpBitFieldInsert = Fixed 7
instructionSize OpBitFieldSExtract = Fixed 6
instructionSize OpBitFieldUExtract = Fixed 6
instructionSize OpBitReverse = Fixed 4
instructionSize OpBitCount = Fixed 4
instructionSize OpAny = Fixed 4
instructionSize OpAll = Fixed 4
instructionSize OpIsNan = Fixed 4
instructionSize OpIsInf = Fixed 4
instructionSize OpIsFinite = Fixed 4
instructionSize OpIsNormal = Fixed 4
instructionSize OpSignBitSet = Fixed 4
instructionSize OpLessOrGreater = Fixed 5
instructionSize OpOrdered = Fixed 5
instructionSize OpUnordered = Fixed 5
instructionSize OpLogicalEqual = Fixed 5
instructionSize OpLogicalNotEqual = Fixed 5
instructionSize OpLogicalOr = Fixed 5
instructionSize OpLogicalAnd = Fixed 5
instructionSize OpLogicalNot = Fixed 4
instructionSize OpSelect = Fixed 6
instructionSize OpIEqual = Fixed 5
instructionSize OpINotEqual = Fixed 5
instructionSize OpUGreaterThan = Fixed 5
instructionSize OpSGreaterThan = Fixed 5
instructionSize OpUGreaterThanEqual = Fixed 5
instructionSize OpSGreaterThanEqual = Fixed 5
instructionSize OpULessThan = Fixed 5
instructionSize OpSLessThan = Fixed 5
instructionSize OpULessThanEqual = Fixed 5
instructionSize OpSLessThanEqual = Fixed 5
instructionSize OpFOrdEqual = Fixed 5
instructionSize OpFUnordEqual = Fixed 5
instructionSize OpFOrdNotEqual = Fixed 5
instructionSize OpFUnordNotEqual = Fixed 5
instructionSize OpFOrdLessThan = Fixed 5
instructionSize OpFUnordLessThan = Fixed 5
instructionSize OpFOrdGreaterThan = Fixed 5
instructionSize OpFUnordGreaterThan = Fixed 5
instructionSize OpFOrdLessThanEqual = Fixed 5
instructionSize OpFUnordLessThanEqual = Fixed 5
instructionSize OpFOrdGreaterThanEqual = Fixed 5
instructionSize OpFUnordGreaterThanEqual = Fixed 5
instructionSize OpDPdx = Fixed 4
instructionSize OpDPdy = Fixed 4
instructionSize OpFwidth = Fixed 4
instructionSize OpDPdxFine = Fixed 4
instructionSize OpDPdyFine = Fixed 4
instructionSize OpFwidthFine = Fixed 4
instructionSize OpDPdxCoarse = Fixed 4
instructionSize OpDPdyCoarse = Fixed 4
instructionSize OpFwidthCoarse = Fixed 4
instructionSize OpPhi = Variadic 3
instructionSize OpLoopMerge = Fixed 4
instructionSize OpSelectionMerge = Fixed 3
instructionSize OpLabel = Fixed 2
instructionSize OpBranch = Fixed 2
instructionSize OpBranchConditional = Variadic 4
instructionSize OpSwitch = Fixed 3
instructionSize OpKill = Fixed 1
instructionSize OpReturn = Fixed 1
instructionSize OpReturnValue = Fixed 2
instructionSize OpUnreachable = Fixed 1
instructionSize OpLifetimeStart = Fixed 3
instructionSize OpLifetimeStop = Fixed 3
instructionSize OpAtomicLoad = Fixed 6
instructionSize OpAtomicStore = Fixed 5
instructionSize OpAtomicExchange = Fixed 7
instructionSize OpAtomicCompareExchange = Fixed 9
instructionSize OpAtomicCompareExchangeWeak = Fixed 9
instructionSize OpAtomicIIncrement = Fixed 6
instructionSize OpAtomicIDecrement = Fixed 6
instructionSize OpAtomicIAdd = Fixed 7
instructionSize OpAtomicISub = Fixed 7
instructionSize OpAtomicSMin = Fixed 7
instructionSize OpAtomicUMin = Fixed 7
instructionSize OpAtomicSMax = Fixed 7
instructionSize OpAtomicUMax = Fixed 7
instructionSize OpAtomicAnd = Fixed 7
instructionSize OpAtomicOr = Fixed 7
instructionSize OpAtomicXor = Fixed 7
instructionSize OpAtomicFlagTestAndSet = Fixed 6
instructionSize OpAtomicFlagClear = Fixed 4
instructionSize OpEmitVertex = Fixed 1
instructionSize OpEndPrimitive = Fixed 1
instructionSize OpEmitStreamVertex = Fixed 2
instructionSize OpEndStreamPrimitive = Fixed 2
instructionSize OpControlBarrier = Fixed 4
instructionSize OpMemoryBarrier = Fixed 3
instructionSize OpGroupAsyncCopy = Fixed 9
instructionSize OpGroupWaitEvents = Fixed 4
instructionSize OpGroupAll = Fixed 5
instructionSize OpGroupAny = Fixed 5
instructionSize OpGroupBroadcast = Fixed 6
instructionSize OpGroupIAdd = Fixed 6
instructionSize OpGroupFAdd = Fixed 6
instructionSize OpGroupFMin = Fixed 6
instructionSize OpGroupUMin = Fixed 6
instructionSize OpGroupSMin = Fixed 6
instructionSize OpGroupFMax = Fixed 6
instructionSize OpGroupUMax = Fixed 6
instructionSize OpGroupSMax = Fixed 6
instructionSize OpEnqueueMarker = Fixed 7
instructionSize OpEnqueueKernel = Variadic 13
instructionSize OpGetKernelNDrangeSubGroupCount = Fixed 8
instructionSize OpGetKernelNDrangeMaxSubGroupSize = Fixed 8
instructionSize OpGetKernelWorkGroupSize = Fixed 7
instructionSize OpGetKernelPreferredWorkGroupSizeMultiple = Fixed 7
instructionSize OpRetainEvent = Fixed 2
instructionSize OpReleaseEvent = Fixed 2
instructionSize OpCreateUserEvent = Fixed 3
instructionSize OpIsValidEvent = Fixed 4
instructionSize OpSetUserEventStatus = Fixed 3
instructionSize OpCaptureEventProfilingInfo = Fixed 4
instructionSize OpGetDefaultQueue = Fixed 3
instructionSize OpBuildNDRange = Fixed 6
instructionSize OpReadPipe = Fixed 7
instructionSize OpWritePipe = Fixed 7
instructionSize OpReservedReadPipe = Fixed 9
instructionSize OpReservedWritePipe = Fixed 9
instructionSize OpReserveReadPipePackets = Fixed 7
instructionSize OpReserveWritePipePackets = Fixed 7
instructionSize OpCommitReadPipe = Fixed 5
instructionSize OpCommitWritePipe = Fixed 5
instructionSize OpIsValidReserveId = Fixed 4
instructionSize OpGetNumPipePackets = Fixed 6
instructionSize OpGetMaxPipePackets = Fixed 6
instructionSize OpGroupReserveReadPipePackets = Fixed 8
instructionSize OpGroupReserveWritePipePackets = Fixed 8
instructionSize OpGroupCommitReadPipe = Fixed 6
instructionSize OpGroupCommitWritePipe = Fixed 6

instance SpirEnum OpCode Word16 where
  toWord OpNop = 0
  toWord OpUndef = 1
  toWord OpSourceContinued = 2
  toWord OpSource = 3
  toWord OpSourceExtension = 4
  toWord OpName = 5
  toWord OpMemberName = 6
  toWord OpString = 7
  toWord OpLine = 8
  toWord OpNoLine = 317
  toWord OpDecorate = 71
  toWord OpMemberDecorate = 72
  toWord OpDecorationGroup = 73
  toWord OpGroupDecorate = 74
  toWord OpGroupMemberDecorate = 75
  toWord OpExtension = 10
  toWord OpExtInstImport = 11
  toWord OpExtInst = 12
  toWord OpMemoryModel = 14
  toWord OpEntryPoint = 15
  toWord OpExecutionMode = 16
  toWord OpCapability = 17
  toWord OpTypeVoid = 19
  toWord OpTypeBool = 20
  toWord OpTypeInt = 21
  toWord OpTypeFloat = 22
  toWord OpTypeVector = 23
  toWord OpTypeMatrix = 24
  toWord OpTypeImage = 25
  toWord OpTypeSampler = 26
  toWord OpTypeSampledImage = 27
  toWord OpTypeArray = 28
  toWord OpTypeRuntimeArray = 29
  toWord OpTypeStruct = 30
  toWord OpTypeOpaque = 31
  toWord OpTypePointer = 32
  toWord OpTypeFunction = 33
  toWord OpTypeEvent = 34
  toWord OpTypeDeviceEvent = 35
  toWord OpTypeReserveId = 36
  toWord OpTypeQueue = 37
  toWord OpTypePipe = 38
  toWord OpTypeForwardPointer = 39
  toWord OpConstantTrue = 41
  toWord OpConstantFalse = 42
  toWord OpConstant = 43
  toWord OpConstantComposite = 44
  toWord OpConstantSampler = 45
  toWord OpConstantNull = 46
  toWord OpSpecConstantTrue = 48
  toWord OpSpecConstantFalse = 49
  toWord OpSpecConstant = 50
  toWord OpSpecConstantComposite = 51
  toWord OpSpecConstantOp = 52
  toWord OpVariable = 59
  toWord OpImageTexelPointer = 60
  toWord OpLoad = 61
  toWord OpStore = 62
  toWord OpCopyMemory = 63
  toWord OpCopyMemorySized = 64
  toWord OpAccessChain = 65
  toWord OpInBoundsAccessChain = 66
  toWord OpPtrAccessChain = 67
  toWord OpArrayLength = 68
  toWord OpGenericPtrMemSemantics = 69
  toWord OpInBoundsPtrAccessChain = 70
  toWord OpFunction = 54
  toWord OpFunctionParameter = 55
  toWord OpFunctionEnd = 56
  toWord OpFunctionCall = 57
  toWord OpSampledImage = 86
  toWord OpImageSampleImplicitLod = 87
  toWord OpImageSampleExplicitLod = 88
  toWord OpImageSampleDrefImplicitLod = 89
  toWord OpImageSampleDrefExplicitLod = 90
  toWord OpImageSampleProjImplicitLod = 91
  toWord OpImageSampleProjExplicitLod = 92
  toWord OpImageSampleProjDrefImplicitLod = 93
  toWord OpImageSampleProjDrefExplicitLod = 94
  toWord OpImageFetch = 95
  toWord OpImageGather = 96
  toWord OpImageDrefGather = 97
  toWord OpImageRead = 98
  toWord OpImageWrite = 99
  toWord OpImage = 100
  toWord OpImageQueryFormat = 101
  toWord OpImageQueryOrder = 102
  toWord OpImageQuerySizeLod = 103
  toWord OpImageQuerySize = 104
  toWord OpImageQueryLod = 105
  toWord OpImageQueryLevels = 106
  toWord OpImageQuerySamples = 107
  toWord OpImageSparseSampleImplicitLod = 305
  toWord OpImageSparseSampleExplicitLod = 306
  toWord OpImageSparseSampleDrefImplicitLod = 307
  toWord OpImageSparseSampleDrefExplicitLod = 308
  toWord OpImageSparseSampleProjImplicitLod = 309
  toWord OpImageSparseSampleProjExplicitLod = 310
  toWord OpImageSparseSampleProjDrefImplicitLod = 311
  toWord OpImageSparseSampleProjDrefExplicitLod = 312
  toWord OpImageSparseFetch = 313
  toWord OpImageSparseGather = 314
  toWord OpImageSparseDrefGather = 315
  toWord OpImageSparseTexelsResident = 316
  toWord OpImageSparseRead = 320
  toWord OpConvertFToU = 109
  toWord OpConvertFToS = 110
  toWord OpConvertSToF = 111
  toWord OpConvertUToF = 112
  toWord OpUConvert = 113
  toWord OpSConvert = 114
  toWord OpFConvert = 115
  toWord OpQuantizeToF16 = 116
  toWord OpConvertPtrToU = 117
  toWord OpSatConvertSToU = 118
  toWord OpSatConvertUToS = 119
  toWord OpConvertUToPtr = 120
  toWord OpPtrCastToGeneric = 121
  toWord OpGenericCastToPtr = 122
  toWord OpGenericCastToPtrExplicit = 123
  toWord OpBitcast = 124
  toWord OpVectorExtractDynamic = 77
  toWord OpVectorInsertDynamic = 78
  toWord OpVectorShuffle = 79
  toWord OpCompositeConstruct = 80
  toWord OpCompositeExtract = 81
  toWord OpCompositeInsert = 82
  toWord OpCopyObject = 83
  toWord OpTranspose = 84
  toWord OpSNegate = 126
  toWord OpFNegate = 127
  toWord OpIAdd = 128
  toWord OpFAdd = 129
  toWord OpISub = 130
  toWord OpFSub = 131
  toWord OpIMul = 132
  toWord OpFMul = 133
  toWord OpUDiv = 134
  toWord OpSDiv = 135
  toWord OpFDiv = 136
  toWord OpUMod = 137
  toWord OpSRem = 138
  toWord OpSMod = 139
  toWord OpFRem = 140
  toWord OpFMod = 141
  toWord OpVectorTimesScalar = 142
  toWord OpMatrixTimesScalar = 143
  toWord OpVectorTimesMatrix = 144
  toWord OpMatrixTimesVector = 145
  toWord OpMatrixTimesMatrix = 146
  toWord OpOuterProduct = 147
  toWord OpDot = 148
  toWord OpIAddCarry = 149
  toWord OpISubBorrow = 150
  toWord OpUMulExtended = 151
  toWord OpSMulExtended = 152
  toWord OpShiftRightLogical = 194
  toWord OpShiftRightArithmetic = 195
  toWord OpShiftLeftLogical = 196
  toWord OpBitwiseOr = 197
  toWord OpBitwiseXor = 198
  toWord OpBitwiseAnd = 199
  toWord OpNot = 200
  toWord OpBitFieldInsert = 201
  toWord OpBitFieldSExtract = 202
  toWord OpBitFieldUExtract = 203
  toWord OpBitReverse = 204
  toWord OpBitCount = 205
  toWord OpAny = 154
  toWord OpAll = 155
  toWord OpIsNan = 156
  toWord OpIsInf = 157
  toWord OpIsFinite = 158
  toWord OpIsNormal = 159
  toWord OpSignBitSet = 160
  toWord OpLessOrGreater = 161
  toWord OpOrdered = 162
  toWord OpUnordered = 163
  toWord OpLogicalEqual = 164
  toWord OpLogicalNotEqual = 165
  toWord OpLogicalOr = 166
  toWord OpLogicalAnd = 167
  toWord OpLogicalNot = 168
  toWord OpSelect = 169
  toWord OpIEqual = 170
  toWord OpINotEqual = 171
  toWord OpUGreaterThan = 172
  toWord OpSGreaterThan = 173
  toWord OpUGreaterThanEqual = 174
  toWord OpSGreaterThanEqual = 175
  toWord OpULessThan = 176
  toWord OpSLessThan = 177
  toWord OpULessThanEqual = 178
  toWord OpSLessThanEqual = 179
  toWord OpFOrdEqual = 180
  toWord OpFUnordEqual = 181
  toWord OpFOrdNotEqual = 182
  toWord OpFUnordNotEqual = 183
  toWord OpFOrdLessThan = 184
  toWord OpFUnordLessThan = 185
  toWord OpFOrdGreaterThan = 186
  toWord OpFUnordGreaterThan = 187
  toWord OpFOrdLessThanEqual = 188
  toWord OpFUnordLessThanEqual = 189
  toWord OpFOrdGreaterThanEqual = 190
  toWord OpFUnordGreaterThanEqual = 191
  toWord OpDPdx = 207
  toWord OpDPdy = 208
  toWord OpFwidth = 209
  toWord OpDPdxFine = 210
  toWord OpDPdyFine = 211
  toWord OpFwidthFine = 212
  toWord OpDPdxCoarse = 213
  toWord OpDPdyCoarse = 214
  toWord OpFwidthCoarse = 215
  toWord OpPhi = 245
  toWord OpLoopMerge = 246
  toWord OpSelectionMerge = 247
  toWord OpLabel = 248
  toWord OpBranch = 249
  toWord OpBranchConditional = 250
  toWord OpSwitch = 251
  toWord OpKill = 252
  toWord OpReturn = 253
  toWord OpReturnValue = 254
  toWord OpUnreachable = 255
  toWord OpLifetimeStart = 256
  toWord OpLifetimeStop = 257
  toWord OpAtomicLoad = 227
  toWord OpAtomicStore = 228
  toWord OpAtomicExchange = 229
  toWord OpAtomicCompareExchange = 230
  toWord OpAtomicCompareExchangeWeak = 231
  toWord OpAtomicIIncrement = 232
  toWord OpAtomicIDecrement = 233
  toWord OpAtomicIAdd = 234
  toWord OpAtomicISub = 235
  toWord OpAtomicSMin = 236
  toWord OpAtomicUMin = 237
  toWord OpAtomicSMax = 238
  toWord OpAtomicUMax = 239
  toWord OpAtomicAnd = 240
  toWord OpAtomicOr = 241
  toWord OpAtomicXor = 242
  toWord OpAtomicFlagTestAndSet = 318
  toWord OpAtomicFlagClear = 319
  toWord OpEmitVertex = 218
  toWord OpEndPrimitive = 219
  toWord OpEmitStreamVertex = 220
  toWord OpEndStreamPrimitive = 221
  toWord OpControlBarrier = 224
  toWord OpMemoryBarrier = 225
  toWord OpGroupAsyncCopy = 259
  toWord OpGroupWaitEvents = 260
  toWord OpGroupAll = 261
  toWord OpGroupAny = 262
  toWord OpGroupBroadcast = 263
  toWord OpGroupIAdd = 264
  toWord OpGroupFAdd = 265
  toWord OpGroupFMin = 266
  toWord OpGroupUMin = 267
  toWord OpGroupSMin = 268
  toWord OpGroupFMax = 269
  toWord OpGroupUMax = 270
  toWord OpGroupSMax = 271
  toWord OpEnqueueMarker = 291
  toWord OpEnqueueKernel = 292
  toWord OpGetKernelNDrangeSubGroupCount = 293
  toWord OpGetKernelNDrangeMaxSubGroupSize = 294
  toWord OpGetKernelWorkGroupSize = 295
  toWord OpGetKernelPreferredWorkGroupSizeMultiple = 296
  toWord OpRetainEvent = 297
  toWord OpReleaseEvent = 298
  toWord OpCreateUserEvent = 299
  toWord OpIsValidEvent = 300
  toWord OpSetUserEventStatus = 301
  toWord OpCaptureEventProfilingInfo = 302
  toWord OpGetDefaultQueue = 303
  toWord OpBuildNDRange = 304
  toWord OpReadPipe = 274
  toWord OpWritePipe = 275
  toWord OpReservedReadPipe = 276
  toWord OpReservedWritePipe = 277
  toWord OpReserveReadPipePackets = 278
  toWord OpReserveWritePipePackets = 279
  toWord OpCommitReadPipe = 280
  toWord OpCommitWritePipe = 281
  toWord OpIsValidReserveId = 282
  toWord OpGetNumPipePackets = 283
  toWord OpGetMaxPipePackets = 284
  toWord OpGroupReserveReadPipePackets = 285
  toWord OpGroupReserveWritePipePackets = 286
  toWord OpGroupCommitReadPipe = 287
  toWord OpGroupCommitWritePipe = 288

  fromWord 0 = Just OpNop
  fromWord 1 = Just OpUndef
  fromWord 2 = Just OpSourceContinued
  fromWord 3 = Just OpSource
  fromWord 4 = Just OpSourceExtension
  fromWord 5 = Just OpName
  fromWord 6 = Just OpMemberName
  fromWord 7 = Just OpString
  fromWord 8 = Just OpLine
  fromWord 317 = Just OpNoLine
  fromWord 71 = Just OpDecorate
  fromWord 72 = Just OpMemberDecorate
  fromWord 73 = Just OpDecorationGroup
  fromWord 74 = Just OpGroupDecorate
  fromWord 75 = Just OpGroupMemberDecorate
  fromWord 10 = Just OpExtension
  fromWord 11 = Just OpExtInstImport
  fromWord 12 = Just OpExtInst
  fromWord 14 = Just OpMemoryModel
  fromWord 15 = Just OpEntryPoint
  fromWord 16 = Just OpExecutionMode
  fromWord 17 = Just OpCapability
  fromWord 19 = Just OpTypeVoid
  fromWord 20 = Just OpTypeBool
  fromWord 21 = Just OpTypeInt
  fromWord 22 = Just OpTypeFloat
  fromWord 23 = Just OpTypeVector
  fromWord 24 = Just OpTypeMatrix
  fromWord 25 = Just OpTypeImage
  fromWord 26 = Just OpTypeSampler
  fromWord 27 = Just OpTypeSampledImage
  fromWord 28 = Just OpTypeArray
  fromWord 29 = Just OpTypeRuntimeArray
  fromWord 30 = Just OpTypeStruct
  fromWord 31 = Just OpTypeOpaque
  fromWord 32 = Just OpTypePointer
  fromWord 33 = Just OpTypeFunction
  fromWord 34 = Just OpTypeEvent
  fromWord 35 = Just OpTypeDeviceEvent
  fromWord 36 = Just OpTypeReserveId
  fromWord 37 = Just OpTypeQueue
  fromWord 38 = Just OpTypePipe
  fromWord 39 = Just OpTypeForwardPointer
  fromWord 41 = Just OpConstantTrue
  fromWord 42 = Just OpConstantFalse
  fromWord 43 = Just OpConstant
  fromWord 44 = Just OpConstantComposite
  fromWord 45 = Just OpConstantSampler
  fromWord 46 = Just OpConstantNull
  fromWord 48 = Just OpSpecConstantTrue
  fromWord 49 = Just OpSpecConstantFalse
  fromWord 50 = Just OpSpecConstant
  fromWord 51 = Just OpSpecConstantComposite
  fromWord 52 = Just OpSpecConstantOp
  fromWord 59 = Just OpVariable
  fromWord 60 = Just OpImageTexelPointer
  fromWord 61 = Just OpLoad
  fromWord 62 = Just OpStore
  fromWord 63 = Just OpCopyMemory
  fromWord 64 = Just OpCopyMemorySized
  fromWord 65 = Just OpAccessChain
  fromWord 66 = Just OpInBoundsAccessChain
  fromWord 67 = Just OpPtrAccessChain
  fromWord 68 = Just OpArrayLength
  fromWord 69 = Just OpGenericPtrMemSemantics
  fromWord 70 = Just OpInBoundsPtrAccessChain
  fromWord 54 = Just OpFunction
  fromWord 55 = Just OpFunctionParameter
  fromWord 56 = Just OpFunctionEnd
  fromWord 57 = Just OpFunctionCall
  fromWord 86 = Just OpSampledImage
  fromWord 87 = Just OpImageSampleImplicitLod
  fromWord 88 = Just OpImageSampleExplicitLod
  fromWord 89 = Just OpImageSampleDrefImplicitLod
  fromWord 90 = Just OpImageSampleDrefExplicitLod
  fromWord 91 = Just OpImageSampleProjImplicitLod
  fromWord 92 = Just OpImageSampleProjExplicitLod
  fromWord 93 = Just OpImageSampleProjDrefImplicitLod
  fromWord 94 = Just OpImageSampleProjDrefExplicitLod
  fromWord 95 = Just OpImageFetch
  fromWord 96 = Just OpImageGather
  fromWord 97 = Just OpImageDrefGather
  fromWord 98 = Just OpImageRead
  fromWord 99 = Just OpImageWrite
  fromWord 100 = Just OpImage
  fromWord 101 = Just OpImageQueryFormat
  fromWord 102 = Just OpImageQueryOrder
  fromWord 103 = Just OpImageQuerySizeLod
  fromWord 104 = Just OpImageQuerySize
  fromWord 105 = Just OpImageQueryLod
  fromWord 106 = Just OpImageQueryLevels
  fromWord 107 = Just OpImageQuerySamples
  fromWord 305 = Just OpImageSparseSampleImplicitLod
  fromWord 306 = Just OpImageSparseSampleExplicitLod
  fromWord 307 = Just OpImageSparseSampleDrefImplicitLod
  fromWord 308 = Just OpImageSparseSampleDrefExplicitLod
  fromWord 309 = Just OpImageSparseSampleProjImplicitLod
  fromWord 310 = Just OpImageSparseSampleProjExplicitLod
  fromWord 311 = Just OpImageSparseSampleProjDrefImplicitLod
  fromWord 312 = Just OpImageSparseSampleProjDrefExplicitLod
  fromWord 313 = Just OpImageSparseFetch
  fromWord 314 = Just OpImageSparseGather
  fromWord 315 = Just OpImageSparseDrefGather
  fromWord 316 = Just OpImageSparseTexelsResident
  fromWord 320 = Just OpImageSparseRead
  fromWord 109 = Just OpConvertFToU
  fromWord 110 = Just OpConvertFToS
  fromWord 111 = Just OpConvertSToF
  fromWord 112 = Just OpConvertUToF
  fromWord 113 = Just OpUConvert
  fromWord 114 = Just OpSConvert
  fromWord 115 = Just OpFConvert
  fromWord 116 = Just OpQuantizeToF16
  fromWord 117 = Just OpConvertPtrToU
  fromWord 118 = Just OpSatConvertSToU
  fromWord 119 = Just OpSatConvertUToS
  fromWord 120 = Just OpConvertUToPtr
  fromWord 121 = Just OpPtrCastToGeneric
  fromWord 122 = Just OpGenericCastToPtr
  fromWord 123 = Just OpGenericCastToPtrExplicit
  fromWord 124 = Just OpBitcast
  fromWord 77 = Just OpVectorExtractDynamic
  fromWord 78 = Just OpVectorInsertDynamic
  fromWord 79 = Just OpVectorShuffle
  fromWord 80 = Just OpCompositeConstruct
  fromWord 81 = Just OpCompositeExtract
  fromWord 82 = Just OpCompositeInsert
  fromWord 83 = Just OpCopyObject
  fromWord 84 = Just OpTranspose
  fromWord 126 = Just OpSNegate
  fromWord 127 = Just OpFNegate
  fromWord 128 = Just OpIAdd
  fromWord 129 = Just OpFAdd
  fromWord 130 = Just OpISub
  fromWord 131 = Just OpFSub
  fromWord 132 = Just OpIMul
  fromWord 133 = Just OpFMul
  fromWord 134 = Just OpUDiv
  fromWord 135 = Just OpSDiv
  fromWord 136 = Just OpFDiv
  fromWord 137 = Just OpUMod
  fromWord 138 = Just OpSRem
  fromWord 139 = Just OpSMod
  fromWord 140 = Just OpFRem
  fromWord 141 = Just OpFMod
  fromWord 142 = Just OpVectorTimesScalar
  fromWord 143 = Just OpMatrixTimesScalar
  fromWord 144 = Just OpVectorTimesMatrix
  fromWord 145 = Just OpMatrixTimesVector
  fromWord 146 = Just OpMatrixTimesMatrix
  fromWord 147 = Just OpOuterProduct
  fromWord 148 = Just OpDot
  fromWord 149 = Just OpIAddCarry
  fromWord 150 = Just OpISubBorrow
  fromWord 151 = Just OpUMulExtended
  fromWord 152 = Just OpSMulExtended
  fromWord 194 = Just OpShiftRightLogical
  fromWord 195 = Just OpShiftRightArithmetic
  fromWord 196 = Just OpShiftLeftLogical
  fromWord 197 = Just OpBitwiseOr
  fromWord 198 = Just OpBitwiseXor
  fromWord 199 = Just OpBitwiseAnd
  fromWord 200 = Just OpNot
  fromWord 201 = Just OpBitFieldInsert
  fromWord 202 = Just OpBitFieldSExtract
  fromWord 203 = Just OpBitFieldUExtract
  fromWord 204 = Just OpBitReverse
  fromWord 205 = Just OpBitCount
  fromWord 154 = Just OpAny
  fromWord 155 = Just OpAll
  fromWord 156 = Just OpIsNan
  fromWord 157 = Just OpIsInf
  fromWord 158 = Just OpIsFinite
  fromWord 159 = Just OpIsNormal
  fromWord 160 = Just OpSignBitSet
  fromWord 161 = Just OpLessOrGreater
  fromWord 162 = Just OpOrdered
  fromWord 163 = Just OpUnordered
  fromWord 164 = Just OpLogicalEqual
  fromWord 165 = Just OpLogicalNotEqual
  fromWord 166 = Just OpLogicalOr
  fromWord 167 = Just OpLogicalAnd
  fromWord 168 = Just OpLogicalNot
  fromWord 169 = Just OpSelect
  fromWord 170 = Just OpIEqual
  fromWord 171 = Just OpINotEqual
  fromWord 172 = Just OpUGreaterThan
  fromWord 173 = Just OpSGreaterThan
  fromWord 174 = Just OpUGreaterThanEqual
  fromWord 175 = Just OpSGreaterThanEqual
  fromWord 176 = Just OpULessThan
  fromWord 177 = Just OpSLessThan
  fromWord 178 = Just OpULessThanEqual
  fromWord 179 = Just OpSLessThanEqual
  fromWord 180 = Just OpFOrdEqual
  fromWord 181 = Just OpFUnordEqual
  fromWord 182 = Just OpFOrdNotEqual
  fromWord 183 = Just OpFUnordNotEqual
  fromWord 184 = Just OpFOrdLessThan
  fromWord 185 = Just OpFUnordLessThan
  fromWord 186 = Just OpFOrdGreaterThan
  fromWord 187 = Just OpFUnordGreaterThan
  fromWord 188 = Just OpFOrdLessThanEqual
  fromWord 189 = Just OpFUnordLessThanEqual
  fromWord 190 = Just OpFOrdGreaterThanEqual
  fromWord 191 = Just OpFUnordGreaterThanEqual
  fromWord 207 = Just OpDPdx
  fromWord 208 = Just OpDPdy
  fromWord 209 = Just OpFwidth
  fromWord 210 = Just OpDPdxFine
  fromWord 211 = Just OpDPdyFine
  fromWord 212 = Just OpFwidthFine
  fromWord 213 = Just OpDPdxCoarse
  fromWord 214 = Just OpDPdyCoarse
  fromWord 215 = Just OpFwidthCoarse
  fromWord 245 = Just OpPhi
  fromWord 246 = Just OpLoopMerge
  fromWord 247 = Just OpSelectionMerge
  fromWord 248 = Just OpLabel
  fromWord 249 = Just OpBranch
  fromWord 250 = Just OpBranchConditional
  fromWord 251 = Just OpSwitch
  fromWord 252 = Just OpKill
  fromWord 253 = Just OpReturn
  fromWord 254 = Just OpReturnValue
  fromWord 255 = Just OpUnreachable
  fromWord 256 = Just OpLifetimeStart
  fromWord 257 = Just OpLifetimeStop
  fromWord 227 = Just OpAtomicLoad
  fromWord 228 = Just OpAtomicStore
  fromWord 229 = Just OpAtomicExchange
  fromWord 230 = Just OpAtomicCompareExchange
  fromWord 231 = Just OpAtomicCompareExchangeWeak
  fromWord 232 = Just OpAtomicIIncrement
  fromWord 233 = Just OpAtomicIDecrement
  fromWord 234 = Just OpAtomicIAdd
  fromWord 235 = Just OpAtomicISub
  fromWord 236 = Just OpAtomicSMin
  fromWord 237 = Just OpAtomicUMin
  fromWord 238 = Just OpAtomicSMax
  fromWord 239 = Just OpAtomicUMax
  fromWord 240 = Just OpAtomicAnd
  fromWord 241 = Just OpAtomicOr
  fromWord 242 = Just OpAtomicXor
  fromWord 318 = Just OpAtomicFlagTestAndSet
  fromWord 319 = Just OpAtomicFlagClear
  fromWord 218 = Just OpEmitVertex
  fromWord 219 = Just OpEndPrimitive
  fromWord 220 = Just OpEmitStreamVertex
  fromWord 221 = Just OpEndStreamPrimitive
  fromWord 224 = Just OpControlBarrier
  fromWord 225 = Just OpMemoryBarrier
  fromWord 259 = Just OpGroupAsyncCopy
  fromWord 260 = Just OpGroupWaitEvents
  fromWord 261 = Just OpGroupAll
  fromWord 262 = Just OpGroupAny
  fromWord 263 = Just OpGroupBroadcast
  fromWord 264 = Just OpGroupIAdd
  fromWord 265 = Just OpGroupFAdd
  fromWord 266 = Just OpGroupFMin
  fromWord 267 = Just OpGroupUMin
  fromWord 268 = Just OpGroupSMin
  fromWord 269 = Just OpGroupFMax
  fromWord 270 = Just OpGroupUMax
  fromWord 271 = Just OpGroupSMax
  fromWord 291 = Just OpEnqueueMarker
  fromWord 292 = Just OpEnqueueKernel
  fromWord 293 = Just OpGetKernelNDrangeSubGroupCount
  fromWord 294 = Just OpGetKernelNDrangeMaxSubGroupSize
  fromWord 295 = Just OpGetKernelWorkGroupSize
  fromWord 296 = Just OpGetKernelPreferredWorkGroupSizeMultiple
  fromWord 297 = Just OpRetainEvent
  fromWord 298 = Just OpReleaseEvent
  fromWord 299 = Just OpCreateUserEvent
  fromWord 300 = Just OpIsValidEvent
  fromWord 301 = Just OpSetUserEventStatus
  fromWord 302 = Just OpCaptureEventProfilingInfo
  fromWord 303 = Just OpGetDefaultQueue
  fromWord 304 = Just OpBuildNDRange
  fromWord 274 = Just OpReadPipe
  fromWord 275 = Just OpWritePipe
  fromWord 276 = Just OpReservedReadPipe
  fromWord 277 = Just OpReservedWritePipe
  fromWord 278 = Just OpReserveReadPipePackets
  fromWord 279 = Just OpReserveWritePipePackets
  fromWord 280 = Just OpCommitReadPipe
  fromWord 281 = Just OpCommitWritePipe
  fromWord 282 = Just OpIsValidReserveId
  fromWord 283 = Just OpGetNumPipePackets
  fromWord 284 = Just OpGetMaxPipePackets
  fromWord 285 = Just OpGroupReserveReadPipePackets
  fromWord 286 = Just OpGroupReserveWritePipePackets
  fromWord 287 = Just OpGroupCommitReadPipe
  fromWord 288 = Just OpGroupCommitWritePipe
  fromWord _ = Nothing

  requiredCapabilities OpTypeMatrix = [Capability.Matrix]
  requiredCapabilities OpTypeRuntimeArray = [Capability.Shader]
  requiredCapabilities OpTypeOpaque = [Capability.Kernel]
  requiredCapabilities OpTypeEvent = [Capability.Kernel]
  requiredCapabilities OpTypeDeviceEvent = [Capability.DeviceEnqueue]
  requiredCapabilities OpTypeReserveId = [Capability.Pipes]
  requiredCapabilities OpTypeQueue = [Capability.DeviceEnqueue]
  requiredCapabilities OpTypePipe = [Capability.Pipes]
  requiredCapabilities OpTypeForwardPointer = [Capability.Addresses]
  requiredCapabilities OpConstantSampler = [Capability.LiteralSampler]
  requiredCapabilities OpCopyMemorySized = [Capability.Addresses]
  requiredCapabilities OpPtrAccessChain = [Capability.Addresses]
  requiredCapabilities OpArrayLength = [Capability.Shader]
  requiredCapabilities OpGenericPtrMemSemantics = [Capability.Kernel]
  requiredCapabilities OpInBoundsPtrAccessChain = [Capability.Addresses]
  requiredCapabilities OpImageSampleImplicitLod = [Capability.Shader]
  requiredCapabilities OpImageSampleDrefImplicitLod = [Capability.Shader]
  requiredCapabilities OpImageSampleDrefExplicitLod = [Capability.Shader]
  requiredCapabilities OpImageSampleProjImplicitLod = [Capability.Shader]
  requiredCapabilities OpImageSampleProjExplicitLod = [Capability.Shader]
  requiredCapabilities OpImageSampleProjDrefImplicitLod = [Capability.Shader]
  requiredCapabilities OpImageSampleProjDrefExplicitLod = [Capability.Shader]
  requiredCapabilities OpImageGather = [Capability.Shader]
  requiredCapabilities OpImageDrefGather = [Capability.Shader]
  requiredCapabilities OpImageQueryFormat = [Capability.Kernel]
  requiredCapabilities OpImageQueryOrder = [Capability.Kernel]
  requiredCapabilities OpImageQuerySizeLod = [Capability.Kernel ,  Capability.ImageQuery]
  requiredCapabilities OpImageQuerySize = [Capability.Kernel ,  Capability.ImageQuery]
  requiredCapabilities OpImageQueryLod = [Capability.ImageQuery]
  requiredCapabilities OpImageQueryLevels = [Capability.Kernel ,  Capability.ImageQuery]
  requiredCapabilities OpImageQuerySamples = [Capability.Kernel ,  Capability.ImageQuery]
  requiredCapabilities OpImageSparseSampleImplicitLod = [Capability.SparseResidency]
  requiredCapabilities OpImageSparseSampleExplicitLod = [Capability.SparseResidency]
  requiredCapabilities OpImageSparseSampleDrefImplicitLod = [Capability.SparseResidency]
  requiredCapabilities OpImageSparseSampleDrefExplicitLod = [Capability.SparseResidency]
  requiredCapabilities OpImageSparseSampleProjImplicitLod = [Capability.SparseResidency]
  requiredCapabilities OpImageSparseSampleProjExplicitLod = [Capability.SparseResidency]
  requiredCapabilities OpImageSparseSampleProjDrefImplicitLod = [Capability.SparseResidency]
  requiredCapabilities OpImageSparseSampleProjDrefExplicitLod = [Capability.SparseResidency]
  requiredCapabilities OpImageSparseFetch = [Capability.SparseResidency]
  requiredCapabilities OpImageSparseGather = [Capability.SparseResidency]
  requiredCapabilities OpImageSparseDrefGather = [Capability.SparseResidency]
  requiredCapabilities OpImageSparseTexelsResident = [Capability.SparseResidency]
  requiredCapabilities OpImageSparseRead = [Capability.SparseResidency]
  requiredCapabilities OpQuantizeToF16 = [Capability.Shader]
  requiredCapabilities OpConvertPtrToU = [Capability.Addresses]
  requiredCapabilities OpSatConvertSToU = [Capability.Kernel]
  requiredCapabilities OpSatConvertUToS = [Capability.Kernel]
  requiredCapabilities OpConvertUToPtr = [Capability.Addresses]
  requiredCapabilities OpPtrCastToGeneric = [Capability.Kernel]
  requiredCapabilities OpGenericCastToPtr = [Capability.Kernel]
  requiredCapabilities OpGenericCastToPtrExplicit = [Capability.Kernel]
  requiredCapabilities OpTranspose = [Capability.Matrix]
  requiredCapabilities OpMatrixTimesScalar = [Capability.Matrix]
  requiredCapabilities OpVectorTimesMatrix = [Capability.Matrix]
  requiredCapabilities OpMatrixTimesVector = [Capability.Matrix]
  requiredCapabilities OpMatrixTimesMatrix = [Capability.Matrix]
  requiredCapabilities OpOuterProduct = [Capability.Matrix]
  requiredCapabilities OpBitFieldInsert = [Capability.Shader]
  requiredCapabilities OpBitFieldSExtract = [Capability.Shader]
  requiredCapabilities OpBitFieldUExtract = [Capability.Shader]
  requiredCapabilities OpBitReverse = [Capability.Shader]
  requiredCapabilities OpIsFinite = [Capability.Kernel]
  requiredCapabilities OpIsNormal = [Capability.Kernel]
  requiredCapabilities OpSignBitSet = [Capability.Kernel]
  requiredCapabilities OpLessOrGreater = [Capability.Kernel]
  requiredCapabilities OpOrdered = [Capability.Kernel]
  requiredCapabilities OpUnordered = [Capability.Kernel]
  requiredCapabilities OpDPdx = [Capability.Shader]
  requiredCapabilities OpDPdy = [Capability.Shader]
  requiredCapabilities OpFwidth = [Capability.Shader]
  requiredCapabilities OpDPdxFine = [Capability.DerivativeControl]
  requiredCapabilities OpDPdyFine = [Capability.DerivativeControl]
  requiredCapabilities OpFwidthFine = [Capability.DerivativeControl]
  requiredCapabilities OpDPdxCoarse = [Capability.DerivativeControl]
  requiredCapabilities OpDPdyCoarse = [Capability.DerivativeControl]
  requiredCapabilities OpFwidthCoarse = [Capability.DerivativeControl]
  requiredCapabilities OpKill = [Capability.Shader]
  requiredCapabilities OpLifetimeStart = [Capability.Kernel]
  requiredCapabilities OpLifetimeStop = [Capability.Kernel]
  requiredCapabilities OpAtomicCompareExchangeWeak = [Capability.Kernel]
  requiredCapabilities OpAtomicFlagTestAndSet = [Capability.Kernel]
  requiredCapabilities OpAtomicFlagClear = [Capability.Kernel]
  requiredCapabilities OpEmitVertex = [Capability.Geometry]
  requiredCapabilities OpEndPrimitive = [Capability.Geometry]
  requiredCapabilities OpEmitStreamVertex = [Capability.GeometryStreams]
  requiredCapabilities OpEndStreamPrimitive = [Capability.GeometryStreams]
  requiredCapabilities OpGroupAsyncCopy = [Capability.Kernel]
  requiredCapabilities OpGroupWaitEvents = [Capability.Kernel]
  requiredCapabilities OpGroupAll = [Capability.Groups]
  requiredCapabilities OpGroupAny = [Capability.Groups]
  requiredCapabilities OpGroupBroadcast = [Capability.Groups]
  requiredCapabilities OpGroupIAdd = [Capability.Groups]
  requiredCapabilities OpGroupFAdd = [Capability.Groups]
  requiredCapabilities OpGroupFMin = [Capability.Groups]
  requiredCapabilities OpGroupUMin = [Capability.Groups]
  requiredCapabilities OpGroupSMin = [Capability.Groups]
  requiredCapabilities OpGroupFMax = [Capability.Groups]
  requiredCapabilities OpGroupUMax = [Capability.Groups]
  requiredCapabilities OpGroupSMax = [Capability.Groups]
  requiredCapabilities OpEnqueueMarker = [Capability.DeviceEnqueue]
  requiredCapabilities OpEnqueueKernel = [Capability.DeviceEnqueue]
  requiredCapabilities OpGetKernelNDrangeSubGroupCount = [Capability.DeviceEnqueue]
  requiredCapabilities OpGetKernelNDrangeMaxSubGroupSize = [Capability.DeviceEnqueue]
  requiredCapabilities OpGetKernelWorkGroupSize = [Capability.DeviceEnqueue]
  requiredCapabilities OpGetKernelPreferredWorkGroupSizeMultiple = [Capability.DeviceEnqueue]
  requiredCapabilities OpRetainEvent = [Capability.DeviceEnqueue]
  requiredCapabilities OpReleaseEvent = [Capability.DeviceEnqueue]
  requiredCapabilities OpCreateUserEvent = [Capability.DeviceEnqueue]
  requiredCapabilities OpIsValidEvent = [Capability.DeviceEnqueue]
  requiredCapabilities OpSetUserEventStatus = [Capability.DeviceEnqueue]
  requiredCapabilities OpCaptureEventProfilingInfo = [Capability.DeviceEnqueue]
  requiredCapabilities OpGetDefaultQueue = [Capability.DeviceEnqueue]
  requiredCapabilities OpBuildNDRange = [Capability.DeviceEnqueue]
  requiredCapabilities OpReadPipe = [Capability.Pipes]
  requiredCapabilities OpWritePipe = [Capability.Pipes]
  requiredCapabilities OpReservedReadPipe = [Capability.Pipes]
  requiredCapabilities OpReservedWritePipe = [Capability.Pipes]
  requiredCapabilities OpReserveReadPipePackets = [Capability.Pipes]
  requiredCapabilities OpReserveWritePipePackets = [Capability.Pipes]
  requiredCapabilities OpCommitReadPipe = [Capability.Pipes]
  requiredCapabilities OpCommitWritePipe = [Capability.Pipes]
  requiredCapabilities OpIsValidReserveId = [Capability.Pipes]
  requiredCapabilities OpGetNumPipePackets = [Capability.Pipes]
  requiredCapabilities OpGetMaxPipePackets = [Capability.Pipes]
  requiredCapabilities OpGroupReserveReadPipePackets = [Capability.Pipes]
  requiredCapabilities OpGroupReserveWritePipePackets = [Capability.Pipes]
  requiredCapabilities OpGroupCommitReadPipe = [Capability.Pipes]
  requiredCapabilities OpGroupCommitWritePipe = [Capability.Pipes]
  requiredCapabilities _ = []