#version 460
#if defined(GL_ARB_gpu_shader_int64)
#extension GL_ARB_gpu_shader_int64 : require
#else
#error No extension available for 64-bit integers.
#endif
#extension GL_EXT_buffer_reference2 : require
#extension GL_EXT_nonuniform_qualifier : require
#extension GL_KHR_shader_subgroup_ballot : require
layout(local_size_x = 128, local_size_y = 1, local_size_z = 1) in;

layout(set = 15, binding = 0, std430) restrict readonly buffer SSBO_Offsets
{
    uvec2 _m0[];
} _13;

layout(set = 1, binding = 0, std430) restrict readonly buffer SSBO
{
    uint64_t _m0[];
} _19[];

layout(set = 1, binding = 0, std430) restrict readonly buffer _21_24
{
    uint64_t _m0[];
} _24[];

layout(set = 4, binding = 0, std430) writeonly buffer _26_29
{
    uint64_t _m0[];
} _29[];

layout(set = 4, binding = 0, std430) writeonly buffer _31_34
{
    uint64_t _m0[];
} _34[];

layout(push_constant, std430) uniform RootConstants
{
    uint _m0;
    uint _m1;
    uint _m2;
    uint _m3;
    uint _m4;
    uint _m5;
    uint _m6;
    uint _m7;
} registers;

void main()
{
    uint _41 = registers._m4 + 1u;
    uvec2 _49 = _13._m0[subgroupBroadcastFirst(_41)] >> uvec2(3u);
    uvec2 _58 = _13._m0[subgroupBroadcastFirst(registers._m4)] >> uvec2(3u);
    uint _63 = registers._m1 + 1u;
    uvec2 _67 = _13._m0[subgroupBroadcastFirst(_63)] >> uvec2(3u);
    uvec2 _75 = _13._m0[subgroupBroadcastFirst(registers._m1)] >> uvec2(3u);
    uint _83 = gl_GlobalInvocationID.x * 6u;
    uint _90 = (_83 < _75.y) ? (_83 + _75.x) : 536870908u;
    u64vec3 _103 = u64vec3(_19[registers._m1]._m0[_90], _19[registers._m1]._m0[_90 + 1u], _19[registers._m1]._m0[_90 + 2u]);
    uint64_t _104 = _103.x;
    uint64_t _105 = _103.y;
    uint64_t _106 = _103.z;
    uint _109 = (gl_GlobalInvocationID.x * 6u) + 3u;
    uint _114 = (_109 < _75.y) ? (_109 + _75.x) : 536870908u;
    u64vec3 _123 = u64vec3(_19[registers._m1]._m0[_114], _19[registers._m1]._m0[_114 + 1u], _19[registers._m1]._m0[_114 + 2u]);
    uint64_t _124 = _123.x;
    uint64_t _125 = _123.y;
    uint64_t _126 = _123.z;
    uint _130 = gl_GlobalInvocationID.x << 3u;
    uint _131 = gl_GlobalInvocationID.x * 24u;
    uint _137 = (_131 < _58.y) ? (_131 + _58.x) : 536870908u;
    _29[registers._m4]._m0[_137] = _124 + _104;
    _29[registers._m4]._m0[_137 + 1u] = _125 + _105;
    _29[registers._m4]._m0[_137 + 2u] = _126 + _106;
    uint _148 = (gl_GlobalInvocationID.x * 24u) + 3u;
    uint _153 = (_148 < _58.y) ? (_148 + _58.x) : 536870908u;
    _29[registers._m4]._m0[_153] = _104 - _124;
    _29[registers._m4]._m0[_153 + 1u] = _105 - _125;
    _29[registers._m4]._m0[_153 + 2u] = _106 - _126;
    uint _164 = (gl_GlobalInvocationID.x * 24u) + 6u;
    uint _169 = (_164 < _58.y) ? (_164 + _58.x) : 536870908u;
    _29[registers._m4]._m0[_169] = _124 * _104;
    _29[registers._m4]._m0[_169 + 1u] = _125 * _105;
    _29[registers._m4]._m0[_169 + 2u] = _126 * _106;
    uint _181 = (gl_GlobalInvocationID.x * 24u) + 9u;
    uint _186 = (_181 < _58.y) ? (_181 + _58.x) : 536870908u;
    _29[registers._m4]._m0[_186] = _104 / _124;
    _29[registers._m4]._m0[_186 + 1u] = _105 / _125;
    _29[registers._m4]._m0[_186 + 2u] = _106 / _126;
    uint64_t _192 = _124 & 63ul;
    uint64_t _194 = _125 & 63ul;
    uint64_t _195 = _126 & 63ul;
    uint _202 = (gl_GlobalInvocationID.x * 24u) + 12u;
    uint _207 = (_202 < _58.y) ? (_202 + _58.x) : 536870908u;
    _29[registers._m4]._m0[_207] = _104 << _192;
    _29[registers._m4]._m0[_207 + 1u] = _105 << _194;
    _29[registers._m4]._m0[_207 + 2u] = _106 << _195;
    uint _220 = (gl_GlobalInvocationID.x * 24u) + 15u;
    uint _225 = (_220 < _58.y) ? (_220 + _58.x) : 536870908u;
    _29[registers._m4]._m0[_225] = _104 >> _192;
    _29[registers._m4]._m0[_225 + 1u] = _105 >> _194;
    _29[registers._m4]._m0[_225 + 2u] = _106 >> _195;
    uint _237 = (gl_GlobalInvocationID.x * 24u) + 18u;
    uint _242 = (_237 < _58.y) ? (_237 + _58.x) : 536870908u;
    _29[registers._m4]._m0[_242] = uint64_t(int64_t(_104) >> int64_t(_192));
    _29[registers._m4]._m0[_242 + 1u] = uint64_t(int64_t(_105) >> int64_t(_194));
    _29[registers._m4]._m0[_242 + 2u] = uint64_t(int64_t(_106) >> int64_t(_195));
    uint _255 = (gl_GlobalInvocationID.x * 24u) + 21u;
    uint _260 = (_255 < _58.y) ? (_255 + _58.x) : 536870908u;
    _29[registers._m4]._m0[_260] = _124 & _104;
    _29[registers._m4]._m0[_260 + 1u] = _125 & _105;
    _29[registers._m4]._m0[_260 + 2u] = _126 & _106;
    uint _267 = gl_GlobalInvocationID.x * 3u;
    uint _272 = (_267 < _67.y) ? (_267 + _67.x) : 536870908u;
    u64vec2 _279 = u64vec2(_24[_63]._m0[_272], _24[_63]._m0[_272 + 1u]);
    uint _286 = (gl_GlobalInvocationID.x < _49.y) ? (gl_GlobalInvocationID.x + _49.x) : 536870908u;
    _34[_41]._m0[_286] = _279.x;
    _34[_41]._m0[_286 + 1u] = _279.y;
    _34[_41]._m0[_286 + 2u] = _106;
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.3
; Generator: Unknown(30017); 21022
; Bound: 294
; Schema: 0
OpCapability Shader
OpCapability Int64
OpCapability GroupNonUniformBallot
OpCapability RuntimeDescriptorArray
OpCapability PhysicalStorageBufferAddresses
OpExtension "SPV_EXT_descriptor_indexing"
OpExtension "SPV_KHR_physical_storage_buffer"
OpMemoryModel PhysicalStorageBuffer64 GLSL450
OpEntryPoint GLCompute %3 "main" %78
OpExecutionMode %3 LocalSize 128 1 1
OpName %3 "main"
OpName %6 "RootConstants"
OpName %8 "registers"
OpName %11 "SSBO_Offsets"
OpName %16 "SSBO"
OpName %21 "SSBO"
OpName %26 "SSBO"
OpName %31 "SSBO"
OpDecorate %6 Block
OpMemberDecorate %6 0 Offset 0
OpMemberDecorate %6 1 Offset 4
OpMemberDecorate %6 2 Offset 8
OpMemberDecorate %6 3 Offset 12
OpMemberDecorate %6 4 Offset 16
OpMemberDecorate %6 5 Offset 20
OpMemberDecorate %6 6 Offset 24
OpMemberDecorate %6 7 Offset 28
OpDecorate %10 ArrayStride 8
OpMemberDecorate %11 0 Offset 0
OpDecorate %11 Block
OpDecorate %13 DescriptorSet 15
OpDecorate %13 Binding 0
OpDecorate %13 NonWritable
OpDecorate %13 Restrict
OpDecorate %15 ArrayStride 8
OpMemberDecorate %16 0 Offset 0
OpDecorate %16 Block
OpDecorate %19 DescriptorSet 1
OpDecorate %19 Binding 0
OpDecorate %19 NonWritable
OpDecorate %19 Restrict
OpDecorate %20 ArrayStride 8
OpMemberDecorate %21 0 Offset 0
OpDecorate %21 Block
OpDecorate %24 DescriptorSet 1
OpDecorate %24 Binding 0
OpDecorate %24 NonWritable
OpDecorate %24 Restrict
OpDecorate %25 ArrayStride 8
OpMemberDecorate %26 0 Offset 0
OpDecorate %26 Block
OpDecorate %29 DescriptorSet 4
OpDecorate %29 Binding 0
OpDecorate %29 NonReadable
OpDecorate %30 ArrayStride 8
OpMemberDecorate %31 0 Offset 0
OpDecorate %31 Block
OpDecorate %34 DescriptorSet 4
OpDecorate %34 Binding 0
OpDecorate %34 NonReadable
OpDecorate %78 BuiltIn GlobalInvocationId
%1 = OpTypeVoid
%2 = OpTypeFunction %1
%5 = OpTypeInt 32 0
%6 = OpTypeStruct %5 %5 %5 %5 %5 %5 %5 %5
%7 = OpTypePointer PushConstant %6
%8 = OpVariable %7 PushConstant
%9 = OpTypeVector %5 2
%10 = OpTypeRuntimeArray %9
%11 = OpTypeStruct %10
%12 = OpTypePointer StorageBuffer %11
%13 = OpVariable %12 StorageBuffer
%14 = OpTypeInt 64 0
%15 = OpTypeRuntimeArray %14
%16 = OpTypeStruct %15
%17 = OpTypeRuntimeArray %16
%18 = OpTypePointer StorageBuffer %17
%19 = OpVariable %18 StorageBuffer
%20 = OpTypeRuntimeArray %14
%21 = OpTypeStruct %20
%22 = OpTypeRuntimeArray %21
%23 = OpTypePointer StorageBuffer %22
%24 = OpVariable %23 StorageBuffer
%25 = OpTypeRuntimeArray %14
%26 = OpTypeStruct %25
%27 = OpTypeRuntimeArray %26
%28 = OpTypePointer StorageBuffer %27
%29 = OpVariable %28 StorageBuffer
%30 = OpTypeRuntimeArray %14
%31 = OpTypeStruct %30
%32 = OpTypeRuntimeArray %31
%33 = OpTypePointer StorageBuffer %32
%34 = OpVariable %33 StorageBuffer
%35 = OpTypePointer StorageBuffer %31
%37 = OpTypePointer PushConstant %5
%39 = OpConstant %5 4
%42 = OpConstant %5 1
%44 = OpConstant %5 3
%45 = OpTypePointer StorageBuffer %9
%47 = OpConstant %5 0
%50 = OpConstantComposite %9 %44 %44
%51 = OpTypePointer StorageBuffer %26
%59 = OpTypePointer StorageBuffer %21
%68 = OpTypePointer StorageBuffer %16
%76 = OpTypeVector %5 3
%77 = OpTypePointer Input %76
%78 = OpVariable %77 Input
%79 = OpTypePointer Input %5
%84 = OpConstant %5 6
%88 = OpTypeBool
%91 = OpConstant %5 536870908
%92 = OpTypePointer StorageBuffer %14
%100 = OpConstant %5 2
%102 = OpTypeVector %14 3
%132 = OpConstant %5 24
%180 = OpConstant %5 9
%193 = OpConstant %14 63
%201 = OpConstant %5 12
%217 = OpConstant %5 5
%219 = OpConstant %5 15
%236 = OpConstant %5 18
%252 = OpConstant %5 7
%254 = OpConstant %5 21
%278 = OpTypeVector %14 2
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %292
%292 = OpLabel
%38 = OpAccessChain %37 %8 %39
%40 = OpLoad %5 %38
%41 = OpIAdd %5 %40 %42
%36 = OpAccessChain %35 %34 %41
%43 = OpGroupNonUniformBroadcastFirst %5 %44 %41
%46 = OpAccessChain %45 %13 %47 %43
%48 = OpLoad %9 %46
%49 = OpShiftRightLogical %9 %48 %50
%53 = OpAccessChain %37 %8 %39
%54 = OpLoad %5 %53
%52 = OpAccessChain %51 %29 %54
%55 = OpGroupNonUniformBroadcastFirst %5 %44 %54
%56 = OpAccessChain %45 %13 %47 %55
%57 = OpLoad %9 %56
%58 = OpShiftRightLogical %9 %57 %50
%61 = OpAccessChain %37 %8 %42
%62 = OpLoad %5 %61
%63 = OpIAdd %5 %62 %42
%60 = OpAccessChain %59 %24 %63
%64 = OpGroupNonUniformBroadcastFirst %5 %44 %63
%65 = OpAccessChain %45 %13 %47 %64
%66 = OpLoad %9 %65
%67 = OpShiftRightLogical %9 %66 %50
%70 = OpAccessChain %37 %8 %42
%71 = OpLoad %5 %70
%69 = OpAccessChain %68 %19 %71
%72 = OpGroupNonUniformBroadcastFirst %5 %44 %71
%73 = OpAccessChain %45 %13 %47 %72
%74 = OpLoad %9 %73
%75 = OpShiftRightLogical %9 %74 %50
%80 = OpAccessChain %79 %78 %47
%81 = OpLoad %5 %80
%82 = OpShiftLeftLogical %5 %81 %42
%83 = OpIMul %5 %81 %84
%85 = OpCompositeExtract %5 %75 0
%86 = OpCompositeExtract %5 %75 1
%87 = OpIAdd %5 %83 %85
%89 = OpULessThan %88 %83 %86
%90 = OpSelect %5 %89 %87 %91
%93 = OpAccessChain %92 %69 %47 %90
%94 = OpLoad %14 %93
%96 = OpIAdd %5 %90 %42
%95 = OpAccessChain %92 %69 %47 %96
%97 = OpLoad %14 %95
%99 = OpIAdd %5 %90 %100
%98 = OpAccessChain %92 %69 %47 %99
%101 = OpLoad %14 %98
%103 = OpCompositeConstruct %102 %94 %97 %101
%104 = OpCompositeExtract %14 %103 0
%105 = OpCompositeExtract %14 %103 1
%106 = OpCompositeExtract %14 %103 2
%107 = OpBitwiseOr %5 %82 %42
%108 = OpIMul %5 %81 %84
%109 = OpIAdd %5 %108 %44
%110 = OpCompositeExtract %5 %75 0
%111 = OpCompositeExtract %5 %75 1
%112 = OpIAdd %5 %109 %110
%113 = OpULessThan %88 %109 %111
%114 = OpSelect %5 %113 %112 %91
%115 = OpAccessChain %92 %69 %47 %114
%116 = OpLoad %14 %115
%118 = OpIAdd %5 %114 %42
%117 = OpAccessChain %92 %69 %47 %118
%119 = OpLoad %14 %117
%121 = OpIAdd %5 %114 %100
%120 = OpAccessChain %92 %69 %47 %121
%122 = OpLoad %14 %120
%123 = OpCompositeConstruct %102 %116 %119 %122
%124 = OpCompositeExtract %14 %123 0
%125 = OpCompositeExtract %14 %123 1
%126 = OpCompositeExtract %14 %123 2
%127 = OpIAdd %14 %124 %104
%128 = OpIAdd %14 %125 %105
%129 = OpIAdd %14 %126 %106
%130 = OpShiftLeftLogical %5 %81 %44
%131 = OpIMul %5 %81 %132
%133 = OpCompositeExtract %5 %58 0
%134 = OpCompositeExtract %5 %58 1
%135 = OpIAdd %5 %131 %133
%136 = OpULessThan %88 %131 %134
%137 = OpSelect %5 %136 %135 %91
%138 = OpAccessChain %92 %52 %47 %137
OpStore %138 %127
%140 = OpIAdd %5 %137 %42
%139 = OpAccessChain %92 %52 %47 %140
OpStore %139 %128
%142 = OpIAdd %5 %137 %100
%141 = OpAccessChain %92 %52 %47 %142
OpStore %141 %129
%143 = OpISub %14 %104 %124
%144 = OpISub %14 %105 %125
%145 = OpISub %14 %106 %126
%146 = OpBitwiseOr %5 %130 %42
%147 = OpIMul %5 %81 %132
%148 = OpIAdd %5 %147 %44
%149 = OpCompositeExtract %5 %58 0
%150 = OpCompositeExtract %5 %58 1
%151 = OpIAdd %5 %148 %149
%152 = OpULessThan %88 %148 %150
%153 = OpSelect %5 %152 %151 %91
%154 = OpAccessChain %92 %52 %47 %153
OpStore %154 %143
%156 = OpIAdd %5 %153 %42
%155 = OpAccessChain %92 %52 %47 %156
OpStore %155 %144
%158 = OpIAdd %5 %153 %100
%157 = OpAccessChain %92 %52 %47 %158
OpStore %157 %145
%159 = OpIMul %14 %124 %104
%160 = OpIMul %14 %125 %105
%161 = OpIMul %14 %126 %106
%162 = OpBitwiseOr %5 %130 %100
%163 = OpIMul %5 %81 %132
%164 = OpIAdd %5 %163 %84
%165 = OpCompositeExtract %5 %58 0
%166 = OpCompositeExtract %5 %58 1
%167 = OpIAdd %5 %164 %165
%168 = OpULessThan %88 %164 %166
%169 = OpSelect %5 %168 %167 %91
%170 = OpAccessChain %92 %52 %47 %169
OpStore %170 %159
%172 = OpIAdd %5 %169 %42
%171 = OpAccessChain %92 %52 %47 %172
OpStore %171 %160
%174 = OpIAdd %5 %169 %100
%173 = OpAccessChain %92 %52 %47 %174
OpStore %173 %161
%175 = OpUDiv %14 %104 %124
%176 = OpUDiv %14 %105 %125
%177 = OpUDiv %14 %106 %126
%178 = OpBitwiseOr %5 %130 %44
%179 = OpIMul %5 %81 %132
%181 = OpIAdd %5 %179 %180
%182 = OpCompositeExtract %5 %58 0
%183 = OpCompositeExtract %5 %58 1
%184 = OpIAdd %5 %181 %182
%185 = OpULessThan %88 %181 %183
%186 = OpSelect %5 %185 %184 %91
%187 = OpAccessChain %92 %52 %47 %186
OpStore %187 %175
%189 = OpIAdd %5 %186 %42
%188 = OpAccessChain %92 %52 %47 %189
OpStore %188 %176
%191 = OpIAdd %5 %186 %100
%190 = OpAccessChain %92 %52 %47 %191
OpStore %190 %177
%192 = OpBitwiseAnd %14 %124 %193
%194 = OpBitwiseAnd %14 %125 %193
%195 = OpBitwiseAnd %14 %126 %193
%196 = OpShiftLeftLogical %14 %104 %192
%197 = OpShiftLeftLogical %14 %105 %194
%198 = OpShiftLeftLogical %14 %106 %195
%199 = OpBitwiseOr %5 %130 %39
%200 = OpIMul %5 %81 %132
%202 = OpIAdd %5 %200 %201
%203 = OpCompositeExtract %5 %58 0
%204 = OpCompositeExtract %5 %58 1
%205 = OpIAdd %5 %202 %203
%206 = OpULessThan %88 %202 %204
%207 = OpSelect %5 %206 %205 %91
%208 = OpAccessChain %92 %52 %47 %207
OpStore %208 %196
%210 = OpIAdd %5 %207 %42
%209 = OpAccessChain %92 %52 %47 %210
OpStore %209 %197
%212 = OpIAdd %5 %207 %100
%211 = OpAccessChain %92 %52 %47 %212
OpStore %211 %198
%213 = OpShiftRightLogical %14 %104 %192
%214 = OpShiftRightLogical %14 %105 %194
%215 = OpShiftRightLogical %14 %106 %195
%216 = OpBitwiseOr %5 %130 %217
%218 = OpIMul %5 %81 %132
%220 = OpIAdd %5 %218 %219
%221 = OpCompositeExtract %5 %58 0
%222 = OpCompositeExtract %5 %58 1
%223 = OpIAdd %5 %220 %221
%224 = OpULessThan %88 %220 %222
%225 = OpSelect %5 %224 %223 %91
%226 = OpAccessChain %92 %52 %47 %225
OpStore %226 %213
%228 = OpIAdd %5 %225 %42
%227 = OpAccessChain %92 %52 %47 %228
OpStore %227 %214
%230 = OpIAdd %5 %225 %100
%229 = OpAccessChain %92 %52 %47 %230
OpStore %229 %215
%231 = OpShiftRightArithmetic %14 %104 %192
%232 = OpShiftRightArithmetic %14 %105 %194
%233 = OpShiftRightArithmetic %14 %106 %195
%234 = OpBitwiseOr %5 %130 %84
%235 = OpIMul %5 %81 %132
%237 = OpIAdd %5 %235 %236
%238 = OpCompositeExtract %5 %58 0
%239 = OpCompositeExtract %5 %58 1
%240 = OpIAdd %5 %237 %238
%241 = OpULessThan %88 %237 %239
%242 = OpSelect %5 %241 %240 %91
%243 = OpAccessChain %92 %52 %47 %242
OpStore %243 %231
%245 = OpIAdd %5 %242 %42
%244 = OpAccessChain %92 %52 %47 %245
OpStore %244 %232
%247 = OpIAdd %5 %242 %100
%246 = OpAccessChain %92 %52 %47 %247
OpStore %246 %233
%248 = OpBitwiseAnd %14 %124 %104
%249 = OpBitwiseAnd %14 %125 %105
%250 = OpBitwiseAnd %14 %126 %106
%251 = OpBitwiseOr %5 %130 %252
%253 = OpIMul %5 %81 %132
%255 = OpIAdd %5 %253 %254
%256 = OpCompositeExtract %5 %58 0
%257 = OpCompositeExtract %5 %58 1
%258 = OpIAdd %5 %255 %256
%259 = OpULessThan %88 %255 %257
%260 = OpSelect %5 %259 %258 %91
%261 = OpAccessChain %92 %52 %47 %260
OpStore %261 %248
%263 = OpIAdd %5 %260 %42
%262 = OpAccessChain %92 %52 %47 %263
OpStore %262 %249
%265 = OpIAdd %5 %260 %100
%264 = OpAccessChain %92 %52 %47 %265
OpStore %264 %250
%266 = OpIMul %5 %81 %132
%267 = OpIMul %5 %81 %44
%268 = OpCompositeExtract %5 %67 0
%269 = OpCompositeExtract %5 %67 1
%270 = OpIAdd %5 %267 %268
%271 = OpULessThan %88 %267 %269
%272 = OpSelect %5 %271 %270 %91
%273 = OpAccessChain %92 %60 %47 %272
%274 = OpLoad %14 %273
%276 = OpIAdd %5 %272 %42
%275 = OpAccessChain %92 %60 %47 %276
%277 = OpLoad %14 %275
%279 = OpCompositeConstruct %278 %274 %277
%280 = OpCompositeExtract %14 %279 0
%281 = OpCompositeExtract %14 %279 1
%282 = OpCompositeExtract %5 %49 0
%283 = OpCompositeExtract %5 %49 1
%284 = OpIAdd %5 %81 %282
%285 = OpULessThan %88 %81 %283
%286 = OpSelect %5 %285 %284 %91
%287 = OpAccessChain %92 %36 %47 %286
OpStore %287 %280
%289 = OpIAdd %5 %286 %42
%288 = OpAccessChain %92 %36 %47 %289
OpStore %288 %281
%291 = OpIAdd %5 %286 %100
%290 = OpAccessChain %92 %36 %47 %291
OpStore %290 %106
OpReturn
OpFunctionEnd
#endif
