#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_nonuniform_qualifier : require
#extension GL_EXT_scalar_block_layout : require
layout(local_size_x = 128, local_size_y = 1, local_size_z = 1) in;

layout(set = 0, binding = 0, scalar) buffer SSBO
{
    u64vec3 _m0[];
} _11[];

layout(set = 0, binding = 0, scalar) restrict readonly buffer _13_16
{
    u64vec3 _m0[];
} _16[];

layout(set = 0, binding = 0, std430) buffer _18_21
{
    uint64_t _m0[];
} _21[];

layout(set = 0, binding = 0, std430) restrict readonly buffer _23_26
{
    uint64_t _m0[];
} _26[];

void main()
{
    uint _47 = gl_GlobalInvocationID.x * 2u;
    uint _56 = (gl_GlobalInvocationID.x * 2u) + 1u;
    uint _65 = gl_GlobalInvocationID.x << 3u;
    _11[0u]._m0[gl_GlobalInvocationID.x * 8u] = u64vec3(_16[1u]._m0[_56].x + _16[1u]._m0[_47].x, _16[1u]._m0[_56].y + _16[1u]._m0[_47].y, _16[1u]._m0[_56].z + _16[1u]._m0[_47].z);
    _11[0u]._m0[(gl_GlobalInvocationID.x * 8u) + 1u] = u64vec3(_16[1u]._m0[_47].x - _16[1u]._m0[_56].x, _16[1u]._m0[_47].y - _16[1u]._m0[_56].y, _16[1u]._m0[_47].z - _16[1u]._m0[_56].z);
    _11[0u]._m0[(gl_GlobalInvocationID.x * 8u) + 2u] = u64vec3(_16[1u]._m0[_56].x * _16[1u]._m0[_47].x, _16[1u]._m0[_56].y * _16[1u]._m0[_47].y, _16[1u]._m0[_56].z * _16[1u]._m0[_47].z);
    _11[0u]._m0[(gl_GlobalInvocationID.x * 8u) + 3u] = u64vec3(_16[1u]._m0[_47].x / _16[1u]._m0[_56].x, _16[1u]._m0[_47].y / _16[1u]._m0[_56].y, _16[1u]._m0[_47].z / _16[1u]._m0[_56].z);
    uint64_t _94 = _16[1u]._m0[_56].x & 63ul;
    uint64_t _96 = _16[1u]._m0[_56].y & 63ul;
    uint64_t _97 = _16[1u]._m0[_56].z & 63ul;
    _11[0u]._m0[(gl_GlobalInvocationID.x * 8u) + 4u] = u64vec3(_16[1u]._m0[_47].x << _94, _16[1u]._m0[_47].y << _96, _16[1u]._m0[_47].z << _97);
    _11[0u]._m0[(gl_GlobalInvocationID.x * 8u) + 5u] = u64vec3(_16[1u]._m0[_47].x >> _94, _16[1u]._m0[_47].y >> _96, _16[1u]._m0[_47].z >> _97);
    _11[0u]._m0[(gl_GlobalInvocationID.x * 8u) + 6u] = u64vec3(uint64_t(int64_t(_16[1u]._m0[_47].x) >> int64_t(_94)), uint64_t(int64_t(_16[1u]._m0[_47].y) >> int64_t(_96)), uint64_t(int64_t(_16[1u]._m0[_47].z) >> int64_t(_97)));
    _11[0u]._m0[(gl_GlobalInvocationID.x * 8u) + 7u] = u64vec3(_16[1u]._m0[_56].x & _16[1u]._m0[_47].x, _16[1u]._m0[_56].y & _16[1u]._m0[_47].y, _16[1u]._m0[_56].z & _16[1u]._m0[_47].z);
    uint _136 = gl_GlobalInvocationID.x * 3u;
    u64vec2 _144 = u64vec2(_26[3u]._m0[_136], _26[3u]._m0[_136 + 1u]);
    _21[2u]._m0[gl_GlobalInvocationID.x] = _144.x;
    _21[2u]._m0[gl_GlobalInvocationID.x + 1u] = _144.y;
    _21[2u]._m0[gl_GlobalInvocationID.x + 2u] = _16[1u]._m0[_47].z;
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.3
; Generator: Unknown(30017); 21022
; Bound: 154
; Schema: 0
OpCapability Shader
OpCapability Int64
OpCapability RuntimeDescriptorArray
OpExtension "SPV_EXT_descriptor_indexing"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %3 "main" %30
OpExecutionMode %3 LocalSize 128 1 1
OpName %3 "main"
OpName %8 "SSBO"
OpName %13 "SSBO"
OpName %18 "SSBO"
OpName %23 "SSBO"
OpDecorate %7 ArrayStride 24
OpMemberDecorate %8 0 Offset 0
OpDecorate %8 Block
OpDecorate %11 DescriptorSet 0
OpDecorate %11 Binding 0
OpDecorate %12 ArrayStride 24
OpMemberDecorate %13 0 Offset 0
OpDecorate %13 Block
OpDecorate %16 DescriptorSet 0
OpDecorate %16 Binding 0
OpDecorate %16 NonWritable
OpDecorate %16 Restrict
OpDecorate %17 ArrayStride 8
OpMemberDecorate %18 0 Offset 0
OpDecorate %18 Block
OpDecorate %21 DescriptorSet 0
OpDecorate %21 Binding 0
OpDecorate %22 ArrayStride 8
OpMemberDecorate %23 0 Offset 0
OpDecorate %23 Block
OpDecorate %26 DescriptorSet 0
OpDecorate %26 Binding 0
OpDecorate %26 NonWritable
OpDecorate %26 Restrict
OpDecorate %30 BuiltIn GlobalInvocationId
%1 = OpTypeVoid
%2 = OpTypeFunction %1
%5 = OpTypeInt 64 0
%6 = OpTypeVector %5 3
%7 = OpTypeRuntimeArray %6
%8 = OpTypeStruct %7
%9 = OpTypeRuntimeArray %8
%10 = OpTypePointer StorageBuffer %9
%11 = OpVariable %10 StorageBuffer
%12 = OpTypeRuntimeArray %6
%13 = OpTypeStruct %12
%14 = OpTypeRuntimeArray %13
%15 = OpTypePointer StorageBuffer %14
%16 = OpVariable %15 StorageBuffer
%17 = OpTypeRuntimeArray %5
%18 = OpTypeStruct %17
%19 = OpTypeRuntimeArray %18
%20 = OpTypePointer StorageBuffer %19
%21 = OpVariable %20 StorageBuffer
%22 = OpTypeRuntimeArray %5
%23 = OpTypeStruct %22
%24 = OpTypeRuntimeArray %23
%25 = OpTypePointer StorageBuffer %24
%26 = OpVariable %25 StorageBuffer
%27 = OpTypeInt 32 0
%28 = OpTypeVector %27 3
%29 = OpTypePointer Input %28
%30 = OpVariable %29 Input
%31 = OpTypePointer Input %27
%33 = OpConstant %27 0
%35 = OpTypePointer StorageBuffer %8
%37 = OpTypePointer StorageBuffer %13
%39 = OpConstant %27 1
%40 = OpTypePointer StorageBuffer %18
%42 = OpConstant %27 2
%43 = OpTypePointer StorageBuffer %23
%45 = OpConstant %27 3
%48 = OpTypePointer StorageBuffer %6
%67 = OpConstant %27 8
%95 = OpConstant %5 63
%102 = OpConstant %27 4
%111 = OpConstant %27 5
%120 = OpConstant %27 6
%129 = OpConstant %27 7
%135 = OpConstant %27 24
%137 = OpTypePointer StorageBuffer %5
%143 = OpTypeVector %5 2
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %152
%152 = OpLabel
%32 = OpAccessChain %31 %30 %33
%34 = OpLoad %27 %32
%36 = OpAccessChain %35 %11 %33
%38 = OpAccessChain %37 %16 %39
%41 = OpAccessChain %40 %21 %42
%44 = OpAccessChain %43 %26 %45
%46 = OpShiftLeftLogical %27 %34 %39
%47 = OpIMul %27 %34 %42
%49 = OpAccessChain %48 %38 %33 %47
%50 = OpLoad %6 %49
%51 = OpCompositeExtract %5 %50 0
%52 = OpCompositeExtract %5 %50 1
%53 = OpCompositeExtract %5 %50 2
%54 = OpBitwiseOr %27 %46 %39
%55 = OpIMul %27 %34 %42
%56 = OpIAdd %27 %55 %39
%57 = OpAccessChain %48 %38 %33 %56
%58 = OpLoad %6 %57
%59 = OpCompositeExtract %5 %58 0
%60 = OpCompositeExtract %5 %58 1
%61 = OpCompositeExtract %5 %58 2
%62 = OpIAdd %5 %59 %51
%63 = OpIAdd %5 %60 %52
%64 = OpIAdd %5 %61 %53
%65 = OpShiftLeftLogical %27 %34 %45
%66 = OpIMul %27 %34 %67
%68 = OpCompositeConstruct %6 %62 %63 %64
%69 = OpAccessChain %48 %36 %33 %66
OpStore %69 %68
%70 = OpISub %5 %51 %59
%71 = OpISub %5 %52 %60
%72 = OpISub %5 %53 %61
%73 = OpBitwiseOr %27 %65 %39
%74 = OpIMul %27 %34 %67
%75 = OpIAdd %27 %74 %39
%76 = OpCompositeConstruct %6 %70 %71 %72
%77 = OpAccessChain %48 %36 %33 %75
OpStore %77 %76
%78 = OpIMul %5 %59 %51
%79 = OpIMul %5 %60 %52
%80 = OpIMul %5 %61 %53
%81 = OpBitwiseOr %27 %65 %42
%82 = OpIMul %27 %34 %67
%83 = OpIAdd %27 %82 %42
%84 = OpCompositeConstruct %6 %78 %79 %80
%85 = OpAccessChain %48 %36 %33 %83
OpStore %85 %84
%86 = OpUDiv %5 %51 %59
%87 = OpUDiv %5 %52 %60
%88 = OpUDiv %5 %53 %61
%89 = OpBitwiseOr %27 %65 %45
%90 = OpIMul %27 %34 %67
%91 = OpIAdd %27 %90 %45
%92 = OpCompositeConstruct %6 %86 %87 %88
%93 = OpAccessChain %48 %36 %33 %91
OpStore %93 %92
%94 = OpBitwiseAnd %5 %59 %95
%96 = OpBitwiseAnd %5 %60 %95
%97 = OpBitwiseAnd %5 %61 %95
%98 = OpShiftLeftLogical %5 %51 %94
%99 = OpShiftLeftLogical %5 %52 %96
%100 = OpShiftLeftLogical %5 %53 %97
%101 = OpBitwiseOr %27 %65 %102
%103 = OpIMul %27 %34 %67
%104 = OpIAdd %27 %103 %102
%105 = OpCompositeConstruct %6 %98 %99 %100
%106 = OpAccessChain %48 %36 %33 %104
OpStore %106 %105
%107 = OpShiftRightLogical %5 %51 %94
%108 = OpShiftRightLogical %5 %52 %96
%109 = OpShiftRightLogical %5 %53 %97
%110 = OpBitwiseOr %27 %65 %111
%112 = OpIMul %27 %34 %67
%113 = OpIAdd %27 %112 %111
%114 = OpCompositeConstruct %6 %107 %108 %109
%115 = OpAccessChain %48 %36 %33 %113
OpStore %115 %114
%116 = OpShiftRightArithmetic %5 %51 %94
%117 = OpShiftRightArithmetic %5 %52 %96
%118 = OpShiftRightArithmetic %5 %53 %97
%119 = OpBitwiseOr %27 %65 %120
%121 = OpIMul %27 %34 %67
%122 = OpIAdd %27 %121 %120
%123 = OpCompositeConstruct %6 %116 %117 %118
%124 = OpAccessChain %48 %36 %33 %122
OpStore %124 %123
%125 = OpBitwiseAnd %5 %59 %51
%126 = OpBitwiseAnd %5 %60 %52
%127 = OpBitwiseAnd %5 %61 %53
%128 = OpBitwiseOr %27 %65 %129
%130 = OpIMul %27 %34 %67
%131 = OpIAdd %27 %130 %129
%132 = OpCompositeConstruct %6 %125 %126 %127
%133 = OpAccessChain %48 %36 %33 %131
OpStore %133 %132
%134 = OpIMul %27 %34 %135
%136 = OpIMul %27 %34 %45
%138 = OpAccessChain %137 %44 %33 %136
%139 = OpLoad %5 %138
%141 = OpIAdd %27 %136 %39
%140 = OpAccessChain %137 %44 %33 %141
%142 = OpLoad %5 %140
%144 = OpCompositeConstruct %143 %139 %142
%145 = OpCompositeExtract %5 %144 0
%146 = OpCompositeExtract %5 %144 1
%147 = OpAccessChain %137 %41 %33 %34
OpStore %147 %145
%149 = OpIAdd %27 %34 %39
%148 = OpAccessChain %137 %41 %33 %149
OpStore %148 %146
%151 = OpIAdd %27 %34 %42
%150 = OpAccessChain %137 %41 %33 %151
OpStore %150 %53
OpReturn
OpFunctionEnd
#endif
