#version 460
#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
#extension GL_EXT_shader_16bit_storage : require
#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require
#extension GL_EXT_shader_8bit_storage : require
#extension GL_EXT_shader_explicit_arithmetic_types_int16 : require
#extension GL_KHR_cooperative_matrix : require
#extension GL_KHR_memory_scope_semantics : require
layout(local_size_x = 32, local_size_y = 1, local_size_z = 1) in;

layout(set = 0, binding = 0, std430) restrict readonly buffer SSBO
{
    uint8_t _m0[];
} _20;

layout(set = 0, binding = 0, std430) writeonly buffer _22_24
{
    uint8_t _m0[];
} _24;

coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA> _29[5] = coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA>[](coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA>(float16_t(0.0)), coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA>(float16_t(0.0)), coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA>(float16_t(0.0)), coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA>(float16_t(0.0)), coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA>(float16_t(0.0)));
coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB> _33[5] = coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB>[](coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB>(float16_t(0.0)), coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB>(float16_t(0.0)), coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB>(float16_t(0.0)), coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB>(float16_t(0.0)), coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB>(float16_t(0.0)));

coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA> CoopMatFP8toFP16(coopmat<uint8_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA> _43)
{
    uint _51;
    _51 = 0u;
    coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA> coop_output;
    for (;;)
    {
        uint _52 = _51 + 1u;
        coop_output[_51] = int16BitsToFloat16((int16_t(int8_t(_43[_51])) << 7s) & (-16385s));
        if (_52 < uint(coopmat<uint8_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA>(0).length()))
        {
            _51 = _52;
        }
        else
        {
            break;
        }
    }
    return coop_output * float16_t(256.0);
}

coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB> CoopMatFP8toFP16_1(coopmat<uint8_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB> _80)
{
    uint _88;
    _88 = 0u;
    coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB> coop_output;
    for (;;)
    {
        uint _89 = _88 + 1u;
        coop_output[_88] = int16BitsToFloat16((int16_t(int8_t(_80[_88])) << 7s) & (-16385s));
        if (_89 < uint(coopmat<uint8_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB>(0).length()))
        {
            _88 = _89;
        }
        else
        {
            break;
        }
    }
    return coop_output * float16_t(256.0);
}

void main()
{
    coopmat<uint8_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA> _39;
    coopMatLoad(_39, _20._m0, 0u, 64u, gl_CooperativeMatrixLayoutRowMajor);
    coopmat<uint8_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA> _70 = _39;
    _29[0u] = CoopMatFP8toFP16(_70);
    coopmat<uint8_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB> _77;
    coopMatLoad(_77, _20._m0, 1024u, 64u, gl_CooperativeMatrixLayoutColumnMajor);
    coopmat<uint8_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB> _101 = _77;
    _33[0u] = CoopMatFP8toFP16_1(_101);
    coopmat<uint8_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA> _107;
    coopMatLoad(_107, _20._m0, 32u, 64u, gl_CooperativeMatrixLayoutRowMajor);
    coopmat<uint8_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA> _108 = _107;
    _29[1u] = CoopMatFP8toFP16(_108);
    coopmat<uint8_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB> _113;
    coopMatLoad(_113, _20._m0, 1056u, 64u, gl_CooperativeMatrixLayoutColumnMajor);
    coopmat<uint8_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB> _114 = _113;
    _33[1u] = CoopMatFP8toFP16_1(_114);
    uint _117;
    _117 = 2u;
    coopmat<uint8_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA> _122;
    coopmat<uint8_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB> _155;
    for (;;)
    {
        uint _119 = _117 << 5u;
        coopmat<uint8_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA> _121;
        coopMatLoad(_121, _20._m0, _119, 64u, gl_CooperativeMatrixLayoutRowMajor);
        _122 = _121;
        _29[_117] = CoopMatFP8toFP16(_122);
        coopmat<uint8_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB> _154;
        coopMatLoad(_154, _20._m0, _119 + 1024u, 64u, gl_CooperativeMatrixLayoutColumnMajor);
        _155 = _154;
        _33[_117] = CoopMatFP8toFP16_1(_155);
        uint _118 = _117 + 1u;
        if (_118 == 5u)
        {
            break;
        }
        else
        {
            _117 = _118;
        }
    }
    coopmat<float, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseAccumulator> _194;
    uint _196;
    _194 = coopMatMulAdd(_29[1u], _33[1u], coopMatMulAdd(_29[0u], _33[0u], coopmat<float, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseAccumulator>(0.0), 0), 0);
    _196 = 2u;
    coopmat<float, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseAccumulator> _262;
    for (;;)
    {
        _262 = coopMatMulAdd(_29[_196], _33[_196], _194, 0);
        uint _197 = _196 + 1u;
        if (_197 == 5u)
        {
            break;
        }
        else
        {
            _194 = _262;
            _196 = _197;
        }
    }
    coopMatStore(_262, _24._m0, 0u, 64u, gl_CooperativeMatrixLayoutColumnMajor);
}


#if 0
// SPIR-V disassembly
// WaveSize(32)
; SPIR-V
; Version: 1.6
; Generator: Unknown(30017); 21022
; Bound: 271
; Schema: 0
OpCapability Shader
OpCapability Float16
OpCapability Int16
OpCapability Int8
OpCapability StorageBuffer8BitAccess
OpCapability DenormPreserve
OpCapability VulkanMemoryModel
OpCapability CooperativeMatrixKHR
OpExtension "SPV_KHR_8bit_storage"
OpExtension "SPV_KHR_cooperative_matrix"
OpExtension "SPV_KHR_float_controls"
OpMemoryModel Logical Vulkan
OpEntryPoint GLCompute %14 "main" %20 %24 %29 %33
OpExecutionMode %14 LocalSize 32 1 1
OpExecutionMode %14 DenormPreserve 16
OpName %14 "main"
OpName %18 "SSBO"
OpName %22 "SSBO"
OpName %44 "CoopMatFP8toFP16"
OpName %47 "coop_output"
OpName %81 "CoopMatFP8toFP16"
OpName %84 "coop_output"
OpDecorate %17 ArrayStride 1
OpMemberDecorate %18 0 Offset 0
OpDecorate %18 Block
OpDecorate %20 DescriptorSet 0
OpDecorate %20 Binding 0
OpDecorate %20 NonWritable
OpDecorate %20 Restrict
OpDecorate %21 ArrayStride 1
OpMemberDecorate %22 0 Offset 0
OpDecorate %22 Block
OpDecorate %24 DescriptorSet 0
OpDecorate %24 Binding 0
OpDecorate %24 NonReadable
%1 = OpTypeFloat 16
%2 = OpTypeInt 32 0
%3 = OpConstant %2 0
%4 = OpConstant %2 16
%6 = OpConstant %2 3
%5 = OpTypeCooperativeMatrixKHR %1 %6 %4 %4 %3
%7 = OpConstant %2 1
%8 = OpTypeCooperativeMatrixKHR %1 %6 %4 %4 %7
%9 = OpTypeFloat 32
%10 = OpConstant %2 2
%11 = OpTypeCooperativeMatrixKHR %9 %6 %4 %4 %10
%12 = OpTypeVoid
%13 = OpTypeFunction %12
%16 = OpTypeInt 8 0
%17 = OpTypeRuntimeArray %16
%18 = OpTypeStruct %17
%19 = OpTypePointer StorageBuffer %18
%20 = OpVariable %19 StorageBuffer
%21 = OpTypeRuntimeArray %16
%22 = OpTypeStruct %21
%23 = OpTypePointer StorageBuffer %22
%24 = OpVariable %23 StorageBuffer
%25 = OpConstant %2 5
%26 = OpTypeArray %5 %25
%27 = OpConstantNull %26
%28 = OpTypePointer Private %26
%29 = OpVariable %28 Private %27
%30 = OpTypeArray %8 %25
%31 = OpConstantNull %30
%32 = OpTypePointer Private %30
%33 = OpVariable %32 Private %31
%35 = OpTypeCooperativeMatrixKHR %16 %6 %4 %4 %3
%36 = OpTypePointer StorageBuffer %16
%38 = OpConstant %2 64
%40 = OpTypeBool
%41 = OpTypePointer Function %35
%42 = OpTypeFunction %5 %41
%46 = OpTypePointer Function %5
%53 = OpTypePointer Function %16
%56 = OpTypeInt 16 1
%59 = OpConstant %56 7
%61 = OpConstant %56 -16385
%63 = OpTypePointer Function %1
%68 = OpConstant %1 0x1p+8
%72 = OpTypePointer Private %5
%74 = OpTypeCooperativeMatrixKHR %16 %6 %4 %4 %7
%76 = OpConstant %2 1024
%78 = OpTypePointer Function %74
%79 = OpTypeFunction %8 %78
%83 = OpTypePointer Function %8
%103 = OpTypePointer Private %8
%106 = OpConstant %2 32
%112 = OpConstant %2 1056
%125 = OpConstant %2 8
%139 = OpConstant %2 4
%146 = OpConstant %2 6
%150 = OpConstant %2 7
%182 = OpConstant %9 0
%183 = OpConstantComposite %11 %182
%14 = OpFunction %12 None %13
%15 = OpLabel
%70 = OpVariable %41 Function
%101 = OpVariable %78 Function
%108 = OpVariable %41 Function
%114 = OpVariable %78 Function
%122 = OpVariable %41 Function
%155 = OpVariable %78 Function
OpBranch %265
%265 = OpLabel
%37 = OpAccessChain %36 %20 %3 %3
%39 = OpCooperativeMatrixLoadKHR %35 %37 %3 %38 NonPrivatePointer
OpStore %70 %39
%71 = OpFunctionCall %5 %44 %70
%73 = OpAccessChain %72 %29 %3
OpStore %73 %71
%75 = OpAccessChain %36 %20 %3 %76
%77 = OpCooperativeMatrixLoadKHR %74 %75 %7 %38 NonPrivatePointer
OpStore %101 %77
%102 = OpFunctionCall %8 %81 %101
%104 = OpAccessChain %103 %33 %3
OpStore %104 %102
%105 = OpAccessChain %36 %20 %3 %106
%107 = OpCooperativeMatrixLoadKHR %35 %105 %3 %38 NonPrivatePointer
OpStore %108 %107
%109 = OpFunctionCall %5 %44 %108
%110 = OpAccessChain %72 %29 %7
OpStore %110 %109
%111 = OpAccessChain %36 %20 %3 %112
%113 = OpCooperativeMatrixLoadKHR %74 %111 %7 %38 NonPrivatePointer
OpStore %114 %113
%115 = OpFunctionCall %8 %81 %114
%116 = OpAccessChain %103 %33 %7
OpStore %116 %115
OpBranch %266
%266 = OpLabel
%117 = OpPhi %2 %10 %265 %118 %266
%119 = OpShiftLeftLogical %2 %117 %25
%120 = OpAccessChain %36 %20 %3 %119
%121 = OpCooperativeMatrixLoadKHR %35 %120 %3 %38 NonPrivatePointer
OpStore %122 %121
%123 = OpFunctionCall %5 %44 %122
%124 = OpIMul %2 %117 %125
%126 = OpIAdd %2 %3 %124
%127 = OpAccessChain %72 %29 %117
OpStore %127 %123
%128 = OpIMul %2 %117 %125
%129 = OpIAdd %2 %7 %128
%131 = OpIMul %2 %117 %125
%132 = OpIAdd %2 %10 %131
%134 = OpIMul %2 %117 %125
%135 = OpIAdd %2 %6 %134
%137 = OpIMul %2 %117 %125
%138 = OpIAdd %2 %139 %137
%141 = OpIMul %2 %117 %125
%142 = OpIAdd %2 %25 %141
%144 = OpIMul %2 %117 %125
%145 = OpIAdd %2 %146 %144
%148 = OpIMul %2 %117 %125
%149 = OpIAdd %2 %150 %148
%152 = OpIAdd %2 %119 %76
%153 = OpAccessChain %36 %20 %3 %152
%154 = OpCooperativeMatrixLoadKHR %74 %153 %7 %38 NonPrivatePointer
OpStore %155 %154
%156 = OpFunctionCall %8 %81 %155
%157 = OpIMul %2 %117 %125
%158 = OpIAdd %2 %3 %157
%159 = OpAccessChain %103 %33 %117
OpStore %159 %156
%160 = OpIMul %2 %117 %125
%161 = OpIAdd %2 %7 %160
%163 = OpIMul %2 %117 %125
%164 = OpIAdd %2 %10 %163
%166 = OpIMul %2 %117 %125
%167 = OpIAdd %2 %6 %166
%169 = OpIMul %2 %117 %125
%170 = OpIAdd %2 %139 %169
%172 = OpIMul %2 %117 %125
%173 = OpIAdd %2 %25 %172
%175 = OpIMul %2 %117 %125
%176 = OpIAdd %2 %146 %175
%178 = OpIMul %2 %117 %125
%179 = OpIAdd %2 %150 %178
%118 = OpIAdd %2 %117 %7
%181 = OpIEqual %40 %118 %25
OpLoopMerge %267 %266 None
OpBranchConditional %181 %267 %266
%267 = OpLabel
%184 = OpAccessChain %72 %29 %3
%185 = OpLoad %5 %184
%186 = OpAccessChain %103 %33 %3
%187 = OpLoad %8 %186
%188 = OpCooperativeMatrixMulAddKHR %11 %185 %187 %183
%189 = OpAccessChain %72 %29 %7
%190 = OpLoad %5 %189
%191 = OpAccessChain %103 %33 %7
%192 = OpLoad %8 %191
%193 = OpCooperativeMatrixMulAddKHR %11 %190 %192 %188
OpBranch %268
%268 = OpLabel
%194 = OpPhi %11 %193 %267 %262 %268
%196 = OpPhi %2 %10 %267 %197 %268
%198 = OpIMul %2 %196 %125
%199 = OpIAdd %2 %3 %198
%200 = OpAccessChain %72 %29 %196
%201 = OpLoad %5 %200
%202 = OpIMul %2 %196 %125
%203 = OpIAdd %2 %7 %202
%206 = OpIMul %2 %196 %125
%207 = OpIAdd %2 %10 %206
%210 = OpIMul %2 %196 %125
%211 = OpIAdd %2 %6 %210
%214 = OpIMul %2 %196 %125
%215 = OpIAdd %2 %139 %214
%218 = OpIMul %2 %196 %125
%219 = OpIAdd %2 %25 %218
%222 = OpIMul %2 %196 %125
%223 = OpIAdd %2 %146 %222
%226 = OpIMul %2 %196 %125
%227 = OpIAdd %2 %150 %226
%230 = OpIMul %2 %196 %125
%231 = OpIAdd %2 %3 %230
%232 = OpAccessChain %103 %33 %196
%233 = OpLoad %8 %232
%234 = OpIMul %2 %196 %125
%235 = OpIAdd %2 %7 %234
%238 = OpIMul %2 %196 %125
%239 = OpIAdd %2 %10 %238
%242 = OpIMul %2 %196 %125
%243 = OpIAdd %2 %6 %242
%246 = OpIMul %2 %196 %125
%247 = OpIAdd %2 %139 %246
%250 = OpIMul %2 %196 %125
%251 = OpIAdd %2 %25 %250
%254 = OpIMul %2 %196 %125
%255 = OpIAdd %2 %146 %254
%258 = OpIMul %2 %196 %125
%259 = OpIAdd %2 %150 %258
%262 = OpCooperativeMatrixMulAddKHR %11 %201 %233 %194
%197 = OpIAdd %2 %196 %7
%263 = OpIEqual %40 %197 %25
OpLoopMerge %269 %268 None
OpBranchConditional %263 %269 %268
%269 = OpLabel
%264 = OpAccessChain %36 %24 %3 %3
OpCooperativeMatrixStoreKHR %264 %262 %7 %38 NonPrivatePointer
OpReturn
OpFunctionEnd
%44 = OpFunction %5 None %42
%43 = OpFunctionParameter %41
%45 = OpLabel
%47 = OpVariable %46 Function
%48 = OpCooperativeMatrixLengthKHR %2 %35
OpBranch %49
%49 = OpLabel
%51 = OpPhi %2 %3 %45 %52 %49
%52 = OpIAdd %2 %51 %7
%54 = OpInBoundsAccessChain %53 %43 %51
%55 = OpLoad %16 %54
%57 = OpSConvert %56 %55
%58 = OpShiftLeftLogical %56 %57 %59
%60 = OpBitwiseAnd %56 %58 %61
%62 = OpBitcast %1 %60
%64 = OpInBoundsAccessChain %63 %47 %51
OpStore %64 %62
%65 = OpULessThan %40 %52 %48
OpLoopMerge %50 %49 None
OpBranchConditional %65 %49 %50
%50 = OpLabel
%66 = OpLoad %5 %47
%67 = OpMatrixTimesScalar %5 %66 %68
OpReturnValue %67
OpFunctionEnd
%81 = OpFunction %8 None %79
%80 = OpFunctionParameter %78
%82 = OpLabel
%84 = OpVariable %83 Function
%85 = OpCooperativeMatrixLengthKHR %2 %74
OpBranch %86
%86 = OpLabel
%88 = OpPhi %2 %3 %82 %89 %86
%89 = OpIAdd %2 %88 %7
%90 = OpInBoundsAccessChain %53 %80 %88
%91 = OpLoad %16 %90
%92 = OpSConvert %56 %91
%93 = OpShiftLeftLogical %56 %92 %59
%94 = OpBitwiseAnd %56 %93 %61
%95 = OpBitcast %1 %94
%96 = OpInBoundsAccessChain %63 %84 %88
OpStore %96 %95
%97 = OpULessThan %40 %89 %85
OpLoopMerge %87 %86 None
OpBranchConditional %97 %86 %87
%87 = OpLabel
%98 = OpLoad %8 %84
%99 = OpMatrixTimesScalar %8 %98 %68
OpReturnValue %99
OpFunctionEnd
#endif
