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

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

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

layout(set = 0, binding = 0, scalar) writeonly buffer _17_19
{
    u64vec3 _m0[];
} _19;

layout(set = 0, binding = 1, std430) writeonly buffer _21_23
{
    uint64_t _m0[];
} _23;

void main()
{
    uint _33 = gl_GlobalInvocationID.x * 2u;
    uint _43 = (gl_GlobalInvocationID.x * 2u) + 1u;
    uint _52 = gl_GlobalInvocationID.x << 3u;
    _19._m0[gl_GlobalInvocationID.x * 8u] = u64vec3(_11._m0[_43].x + _11._m0[_33].x, _11._m0[_43].y + _11._m0[_33].y, _11._m0[_43].z + _11._m0[_33].z);
    _19._m0[(gl_GlobalInvocationID.x * 8u) + 1u] = u64vec3(_11._m0[_33].x - _11._m0[_43].x, _11._m0[_33].y - _11._m0[_43].y, _11._m0[_33].z - _11._m0[_43].z);
    _19._m0[(gl_GlobalInvocationID.x * 8u) + 2u] = u64vec3(_11._m0[_43].x * _11._m0[_33].x, _11._m0[_43].y * _11._m0[_33].y, _11._m0[_43].z * _11._m0[_33].z);
    _19._m0[(gl_GlobalInvocationID.x * 8u) + 3u] = u64vec3(_11._m0[_33].x / _11._m0[_43].x, _11._m0[_33].y / _11._m0[_43].y, _11._m0[_33].z / _11._m0[_43].z);
    uint64_t _82 = _11._m0[_43].x & 63ul;
    uint64_t _84 = _11._m0[_43].y & 63ul;
    uint64_t _85 = _11._m0[_43].z & 63ul;
    _19._m0[(gl_GlobalInvocationID.x * 8u) + 4u] = u64vec3(_11._m0[_33].x << _82, _11._m0[_33].y << _84, _11._m0[_33].z << _85);
    _19._m0[(gl_GlobalInvocationID.x * 8u) + 5u] = u64vec3(_11._m0[_33].x >> _82, _11._m0[_33].y >> _84, _11._m0[_33].z >> _85);
    _19._m0[(gl_GlobalInvocationID.x * 8u) + 6u] = u64vec3(uint64_t(int64_t(_11._m0[_33].x) >> int64_t(_82)), uint64_t(int64_t(_11._m0[_33].y) >> int64_t(_84)), uint64_t(int64_t(_11._m0[_33].z) >> int64_t(_85)));
    _19._m0[(gl_GlobalInvocationID.x * 8u) + 7u] = u64vec3(_11._m0[_43].x & _11._m0[_33].x, _11._m0[_43].y & _11._m0[_33].y, _11._m0[_43].z & _11._m0[_33].z);
    uint _124 = gl_GlobalInvocationID.x * 3u;
    u64vec2 _132 = u64vec2(_15._m0[_124], _15._m0[_124 + 1u]);
    _23._m0[gl_GlobalInvocationID.x] = _132.x;
    _23._m0[gl_GlobalInvocationID.x + 1u] = _132.y;
    _23._m0[gl_GlobalInvocationID.x + 2u] = _11._m0[_33].z;
}


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