#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_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;

void main()
{
    uint _34;
    _34 = 0u;
    coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB> _32[2];
    coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA> _33[2];
    for (;;)
    {
        uint _36 = _34 << 5u;
        coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA> _42;
        coopMatLoad(_42, _20._m0, _36, 64u, gl_CooperativeMatrixLayoutRowMajor);
        _33[_34] = _42;
        coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB> _75;
        coopMatLoad(_75, _20._m0, _36 + 1024u, 64u, gl_CooperativeMatrixLayoutColumnMajor);
        _32[_34] = _75;
        uint _35 = _34 + 1u;
        if (_35 == 2u)
        {
            break;
        }
        else
        {
            _34 = _35;
        }
    }
    coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA> _105;
    coopMatLoad(_105, _20._m0, 32u, 64u, gl_CooperativeMatrixLayoutRowMajor);
    coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA> _31[2];
    _31[1u] = _105;
    coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB> _123;
    coopMatLoad(_123, _20._m0, 1056u, 64u, gl_CooperativeMatrixLayoutColumnMajor);
    coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB> _28[2];
    _28[1u] = _123;
    coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseA> _133;
    coopMatLoad(_133, _20._m0, 0u, 64u, gl_CooperativeMatrixLayoutRowMajor);
    _31[0u] = _133;
    coopmat<float16_t, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseB> _143;
    coopMatLoad(_143, _20._m0, 1024u, 64u, gl_CooperativeMatrixLayoutColumnMajor);
    _28[0u] = _143;
    coopmat<float, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseAccumulator> _154;
    uint _156;
    _154 = coopmat<float, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseAccumulator>(0.0);
    _156 = 0u;
    coopmat<float, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseAccumulator> _222;
    for (;;)
    {
        _222 = coopMatMulAdd(_33[_156], _32[_156], _154, 0);
        uint _157 = _156 + 1u;
        if (_157 == 2u)
        {
            break;
        }
        else
        {
            _154 = _222;
            _156 = _157;
        }
    }
    coopmat<float, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseAccumulator> _224;
    uint _226;
    _224 = _222;
    _226 = 0u;
    coopmat<float, gl_ScopeSubgroup, 16u, 16u, gl_MatrixUseAccumulator> _292;
    for (;;)
    {
        _292 = coopMatMulAdd(_31[_226], _28[_226], _224, 0);
        uint _227 = _226 + 1u;
        if (_227 == 2u)
        {
            break;
        }
        else
        {
            _224 = _292;
            _226 = _227;
        }
    }
    coopMatStore(_292, _24._m0, 0u, 64u, gl_CooperativeMatrixLayoutColumnMajor);
}


#if 0
// SPIR-V disassembly
// WaveSize(32)
; SPIR-V
; Version: 1.6
; Generator: Unknown(30017); 21022
; Bound: 303
; Schema: 0
OpCapability Shader
OpCapability Float16
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
OpExecutionMode %14 LocalSize 32 1 1
OpExecutionMode %14 DenormPreserve 16
OpName %14 "main"
OpName %18 "SSBO"
OpName %22 "SSBO"
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 = OpTypeArray %2 %4
%26 = OpTypeArray %8 %10
%27 = OpTypePointer Function %26
%29 = OpTypeArray %5 %10
%30 = OpTypePointer Function %29
%37 = OpConstant %2 5
%39 = OpTypePointer StorageBuffer %16
%41 = OpConstant %2 64
%44 = OpConstant %2 8
%46 = OpTypePointer Function %5
%59 = OpConstant %2 4
%66 = OpConstant %2 6
%70 = OpConstant %2 7
%73 = OpConstant %2 1024
%78 = OpTypePointer Function %8
%101 = OpTypeBool
%104 = OpConstant %2 32
%108 = OpConstant %2 9
%110 = OpConstant %2 10
%112 = OpConstant %2 11
%114 = OpConstant %2 12
%116 = OpConstant %2 13
%118 = OpConstant %2 14
%120 = OpConstant %2 15
%122 = OpConstant %2 1056
%152 = OpConstant %9 0
%153 = OpConstantComposite %11 %152
%14 = OpFunction %12 None %13
%15 = OpLabel
%28 = OpVariable %27 Function
%31 = OpVariable %30 Function
%32 = OpVariable %27 Function
%33 = OpVariable %30 Function
OpBranch %295
%295 = OpLabel
OpBranch %296
%296 = OpLabel
%34 = OpPhi %2 %3 %295 %35 %296
%36 = OpShiftLeftLogical %2 %34 %37
%40 = OpAccessChain %39 %20 %3 %36
%42 = OpCooperativeMatrixLoadKHR %5 %40 %3 %41 NonPrivatePointer
%43 = OpIMul %2 %34 %44
%45 = OpIAdd %2 %3 %43
%47 = OpAccessChain %46 %33 %34
OpStore %47 %42
%48 = OpIMul %2 %34 %44
%49 = OpIAdd %2 %7 %48
%51 = OpIMul %2 %34 %44
%52 = OpIAdd %2 %10 %51
%54 = OpIMul %2 %34 %44
%55 = OpIAdd %2 %6 %54
%57 = OpIMul %2 %34 %44
%58 = OpIAdd %2 %59 %57
%61 = OpIMul %2 %34 %44
%62 = OpIAdd %2 %37 %61
%64 = OpIMul %2 %34 %44
%65 = OpIAdd %2 %66 %64
%68 = OpIMul %2 %34 %44
%69 = OpIAdd %2 %70 %68
%72 = OpIAdd %2 %36 %73
%74 = OpAccessChain %39 %20 %3 %72
%75 = OpCooperativeMatrixLoadKHR %8 %74 %7 %41 NonPrivatePointer
%76 = OpIMul %2 %34 %44
%77 = OpIAdd %2 %3 %76
%79 = OpAccessChain %78 %32 %34
OpStore %79 %75
%80 = OpIMul %2 %34 %44
%81 = OpIAdd %2 %7 %80
%83 = OpIMul %2 %34 %44
%84 = OpIAdd %2 %10 %83
%86 = OpIMul %2 %34 %44
%87 = OpIAdd %2 %6 %86
%89 = OpIMul %2 %34 %44
%90 = OpIAdd %2 %59 %89
%92 = OpIMul %2 %34 %44
%93 = OpIAdd %2 %37 %92
%95 = OpIMul %2 %34 %44
%96 = OpIAdd %2 %66 %95
%98 = OpIMul %2 %34 %44
%99 = OpIAdd %2 %70 %98
%35 = OpIAdd %2 %34 %7
%102 = OpIEqual %101 %35 %10
OpLoopMerge %297 %296 None
OpBranchConditional %102 %297 %296
%297 = OpLabel
%103 = OpAccessChain %39 %20 %3 %104
%105 = OpCooperativeMatrixLoadKHR %5 %103 %3 %41 NonPrivatePointer
%106 = OpAccessChain %46 %31 %7
OpStore %106 %105
%121 = OpAccessChain %39 %20 %3 %122
%123 = OpCooperativeMatrixLoadKHR %8 %121 %7 %41 NonPrivatePointer
%124 = OpAccessChain %78 %28 %7
OpStore %124 %123
%132 = OpAccessChain %39 %20 %3 %3
%133 = OpCooperativeMatrixLoadKHR %5 %132 %3 %41 NonPrivatePointer
%134 = OpAccessChain %46 %31 %3
OpStore %134 %133
%142 = OpAccessChain %39 %20 %3 %73
%143 = OpCooperativeMatrixLoadKHR %8 %142 %7 %41 NonPrivatePointer
%144 = OpAccessChain %78 %28 %3
OpStore %144 %143
OpBranch %298
%298 = OpLabel
%154 = OpPhi %11 %153 %297 %222 %298
%156 = OpPhi %2 %3 %297 %157 %298
%158 = OpIMul %2 %156 %44
%159 = OpIAdd %2 %7 %158
%162 = OpIMul %2 %156 %44
%163 = OpIAdd %2 %3 %162
%164 = OpAccessChain %46 %33 %156
%165 = OpLoad %5 %164
%166 = OpIMul %2 %156 %44
%167 = OpIAdd %2 %6 %166
%170 = OpIMul %2 %156 %44
%171 = OpIAdd %2 %10 %170
%174 = OpIMul %2 %156 %44
%175 = OpIAdd %2 %37 %174
%178 = OpIMul %2 %156 %44
%179 = OpIAdd %2 %59 %178
%182 = OpIMul %2 %156 %44
%183 = OpIAdd %2 %70 %182
%186 = OpIMul %2 %156 %44
%187 = OpIAdd %2 %66 %186
%190 = OpIMul %2 %156 %44
%191 = OpIAdd %2 %7 %190
%194 = OpIMul %2 %156 %44
%195 = OpIAdd %2 %3 %194
%196 = OpAccessChain %78 %32 %156
%197 = OpLoad %8 %196
%198 = OpIMul %2 %156 %44
%199 = OpIAdd %2 %6 %198
%202 = OpIMul %2 %156 %44
%203 = OpIAdd %2 %10 %202
%206 = OpIMul %2 %156 %44
%207 = OpIAdd %2 %37 %206
%210 = OpIMul %2 %156 %44
%211 = OpIAdd %2 %59 %210
%214 = OpIMul %2 %156 %44
%215 = OpIAdd %2 %70 %214
%218 = OpIMul %2 %156 %44
%219 = OpIAdd %2 %66 %218
%222 = OpCooperativeMatrixMulAddKHR %11 %165 %197 %154
%157 = OpIAdd %2 %156 %7
%223 = OpIEqual %101 %157 %10
OpLoopMerge %299 %298 None
OpBranchConditional %223 %299 %298
%299 = OpLabel
OpBranch %300
%300 = OpLabel
%224 = OpPhi %11 %222 %299 %292 %300
%226 = OpPhi %2 %3 %299 %227 %300
%228 = OpIMul %2 %226 %44
%229 = OpIAdd %2 %7 %228
%232 = OpIMul %2 %226 %44
%233 = OpIAdd %2 %3 %232
%234 = OpAccessChain %46 %31 %226
%235 = OpLoad %5 %234
%236 = OpIMul %2 %226 %44
%237 = OpIAdd %2 %6 %236
%240 = OpIMul %2 %226 %44
%241 = OpIAdd %2 %10 %240
%244 = OpIMul %2 %226 %44
%245 = OpIAdd %2 %37 %244
%248 = OpIMul %2 %226 %44
%249 = OpIAdd %2 %59 %248
%252 = OpIMul %2 %226 %44
%253 = OpIAdd %2 %70 %252
%256 = OpIMul %2 %226 %44
%257 = OpIAdd %2 %66 %256
%260 = OpIMul %2 %226 %44
%261 = OpIAdd %2 %7 %260
%264 = OpIMul %2 %226 %44
%265 = OpIAdd %2 %3 %264
%266 = OpAccessChain %78 %28 %226
%267 = OpLoad %8 %266
%268 = OpIMul %2 %226 %44
%269 = OpIAdd %2 %6 %268
%272 = OpIMul %2 %226 %44
%273 = OpIAdd %2 %10 %272
%276 = OpIMul %2 %226 %44
%277 = OpIAdd %2 %37 %276
%280 = OpIMul %2 %226 %44
%281 = OpIAdd %2 %59 %280
%284 = OpIMul %2 %226 %44
%285 = OpIAdd %2 %70 %284
%288 = OpIMul %2 %226 %44
%289 = OpIAdd %2 %66 %288
%292 = OpCooperativeMatrixMulAddKHR %11 %235 %267 %224
%227 = OpIAdd %2 %226 %7
%293 = OpIEqual %101 %227 %10
OpLoopMerge %301 %300 None
OpBranchConditional %293 %301 %300
%301 = OpLabel
%294 = OpAccessChain %39 %24 %3 %3
OpCooperativeMatrixStoreKHR %294 %292 %7 %41 NonPrivatePointer
OpReturn
OpFunctionEnd
#endif
