#version 460
#extension GL_EXT_shader_explicit_arithmetic_types_int16 : require
#extension GL_EXT_shader_16bit_storage : require
#if defined(GL_AMD_gpu_shader_half_float)
#extension GL_AMD_gpu_shader_half_float : require
#elif defined(GL_EXT_shader_explicit_arithmetic_types_float16)
#extension GL_EXT_shader_explicit_arithmetic_types_float16 : require
#else
#error No extension available for FP16.
#endif
layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;

layout(set = 0, binding = 0, std430) readonly buffer SSBO
{
    uint _m0[];
} _9;

layout(set = 0, binding = 1, std430) writeonly buffer _12_14
{
    uint16_t _m0[];
} _14;

layout(set = 0, binding = 2, std430) writeonly buffer _16_18
{
    uint _m0[];
} _18;

void main()
{
    uint _28 = _9._m0[gl_GlobalInvocationID.x];
    float16_t _44 = uint16BitsToFloat16(unpackUint2x16(_28).x);
    uint _45 = gl_GlobalInvocationID.x << 1u;
    _14._m0[gl_GlobalInvocationID.x * 2u] = float16BitsToUint16(_44);
    float16_t _54 = uint16BitsToFloat16(unpackUint2x16(_28).y);
    _14._m0[(gl_GlobalInvocationID.x * 2u) + 1u] = float16BitsToUint16(_54);
    _18._m0[gl_GlobalInvocationID.x * 2u] = uint(unpackUint2x16(_28).x);
    _18._m0[(gl_GlobalInvocationID.x * 2u) + 1u] = uint(unpackUint2x16(_28).y);
    _18._m0[(gl_GlobalInvocationID.x * 2u) + 1024u] = uint(float16BitsToUint16(_44));
    _18._m0[(gl_GlobalInvocationID.x * 2u) + 1025u] = uint(float16BitsToUint16(_54));
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.3
; Generator: Unknown(30017); 21022
; Bound: 89
; Schema: 0
OpCapability Shader
OpCapability Float16
OpCapability Int16
OpCapability StorageBuffer16BitAccess
OpCapability DenormPreserve
OpExtension "SPV_KHR_float_controls"
%31 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %3 "main" %21
OpExecutionMode %3 LocalSize 64 1 1
OpExecutionMode %3 DenormPreserve 16
OpName %3 "main"
OpName %7 "SSBO"
OpName %12 "SSBO"
OpName %16 "SSBO"
OpDecorate %6 ArrayStride 4
OpMemberDecorate %7 0 Offset 0
OpDecorate %7 Block
OpDecorate %9 DescriptorSet 0
OpDecorate %9 Binding 0
OpDecorate %9 NonWritable
OpDecorate %11 ArrayStride 2
OpMemberDecorate %12 0 Offset 0
OpDecorate %12 Block
OpDecorate %14 DescriptorSet 0
OpDecorate %14 Binding 1
OpDecorate %14 NonReadable
OpDecorate %15 ArrayStride 4
OpMemberDecorate %16 0 Offset 0
OpDecorate %16 Block
OpDecorate %18 DescriptorSet 0
OpDecorate %18 Binding 2
OpDecorate %18 NonReadable
OpDecorate %21 BuiltIn GlobalInvocationId
%1 = OpTypeVoid
%2 = OpTypeFunction %1
%5 = OpTypeInt 32 0
%6 = OpTypeRuntimeArray %5
%7 = OpTypeStruct %6
%8 = OpTypePointer StorageBuffer %7
%9 = OpVariable %8 StorageBuffer
%10 = OpTypeInt 16 0
%11 = OpTypeRuntimeArray %10
%12 = OpTypeStruct %11
%13 = OpTypePointer StorageBuffer %12
%14 = OpVariable %13 StorageBuffer
%15 = OpTypeRuntimeArray %5
%16 = OpTypeStruct %15
%17 = OpTypePointer StorageBuffer %16
%18 = OpVariable %17 StorageBuffer
%19 = OpTypeVector %5 3
%20 = OpTypePointer Input %19
%21 = OpVariable %20 Input
%22 = OpTypePointer Input %5
%24 = OpConstant %5 0
%26 = OpTypePointer StorageBuffer %5
%30 = OpConstant %5 65535
%32 = OpTypeFloat 32
%33 = OpTypeVector %32 2
%37 = OpConstant %5 16
%40 = OpTypeVector %10 2
%43 = OpTypeFloat 16
%46 = OpConstant %5 1
%48 = OpConstant %5 2
%50 = OpTypePointer StorageBuffer %10
%75 = OpConstant %5 1024
%83 = OpConstant %5 1025
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %87
%87 = OpLabel
%23 = OpAccessChain %22 %21 %24
%25 = OpLoad %5 %23
%27 = OpAccessChain %26 %9 %24 %25
%28 = OpLoad %5 %27
%29 = OpBitwiseAnd %5 %28 %30
%34 = OpExtInst %33 %31 UnpackHalf2x16 %29
%35 = OpCompositeExtract %32 %34 0
%36 = OpShiftRightLogical %5 %28 %37
%38 = OpExtInst %33 %31 UnpackHalf2x16 %36
%39 = OpCompositeExtract %32 %38 0
%41 = OpBitcast %40 %28
%42 = OpCompositeExtract %10 %41 0
%44 = OpBitcast %43 %42
%45 = OpShiftLeftLogical %5 %25 %46
%47 = OpIMul %5 %25 %48
%49 = OpBitcast %10 %44
%51 = OpAccessChain %50 %14 %24 %47
OpStore %51 %49
%52 = OpBitcast %40 %28
%53 = OpCompositeExtract %10 %52 1
%54 = OpBitcast %43 %53
%55 = OpBitwiseOr %5 %45 %46
%56 = OpIMul %5 %25 %48
%57 = OpIAdd %5 %56 %46
%58 = OpBitcast %10 %54
%59 = OpAccessChain %50 %14 %24 %57
OpStore %59 %58
%60 = OpBitcast %40 %28
%61 = OpCompositeExtract %10 %60 0
%62 = OpUConvert %5 %61
%63 = OpIMul %5 %25 %48
%64 = OpAccessChain %26 %18 %24 %63
OpStore %64 %62
%65 = OpBitcast %40 %28
%66 = OpCompositeExtract %10 %65 1
%67 = OpUConvert %5 %66
%68 = OpIMul %5 %25 %48
%69 = OpIAdd %5 %68 %46
%70 = OpAccessChain %26 %18 %24 %69
OpStore %70 %67
%71 = OpQuantizeToF16 %32 %35
%72 = OpBitcast %10 %44
%73 = OpUConvert %5 %72
%74 = OpIAdd %5 %45 %75
%76 = OpIMul %5 %25 %48
%77 = OpIAdd %5 %76 %75
%78 = OpAccessChain %26 %18 %24 %77
OpStore %78 %73
%79 = OpQuantizeToF16 %32 %39
%80 = OpBitcast %10 %54
%81 = OpUConvert %5 %80
%82 = OpIAdd %5 %45 %83
%84 = OpIMul %5 %25 %48
%85 = OpIAdd %5 %84 %83
%86 = OpAccessChain %26 %18 %24 %85
OpStore %86 %81
OpReturn
OpFunctionEnd
#endif
