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

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

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

void main()
{
    uint64_t _31 = uint64_t(gl_GlobalInvocationID.x);
    uint64_t _34 = atomicAdd(_10[0u]._m0[0u], _31);
    uint64_t _36 = atomicAnd(_10[0u]._m0[1u], _31);
    uint64_t _38 = atomicOr(_10[0u]._m0[2u], _31);
    uint64_t _41 = atomicXor(_10[0u]._m0[3u], _31);
    uint64_t _44 = atomicMin(_10[0u]._m0[4u], _31);
    uint64_t _47 = atomicMax(_10[0u]._m0[5u], _31);
    uint64_t _50 = atomicMin(_10[1u]._m0[6u], _31);
    uint64_t _53 = atomicMax(_10[1u]._m0[7u], _31);
    uint64_t _56 = atomicExchange(_10[0u]._m0[8u], _31);
    uint64_t _59 = atomicCompSwap(_10[0u]._m0[9u], 10ul, _56);
    uint64_t _63 = atomicCompSwap(_10[0u]._m0[10u], 20ul, _31);
    uint64_t _66 = atomicAdd(_15[2u]._m0[0u], _31);
    uint64_t _68 = atomicAnd(_15[2u]._m0[1u], _31);
    uint64_t _70 = atomicOr(_15[2u]._m0[2u], _31);
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.3
; Generator: Unknown(30017); 21022
; Bound: 73
; Schema: 0
OpCapability Shader
OpCapability Int64
OpCapability Int64Atomics
OpCapability RuntimeDescriptorArray
OpExtension "SPV_EXT_descriptor_indexing"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %3 "main" %19
OpExecutionMode %3 LocalSize 128 1 1
OpName %3 "main"
OpName %7 "SSBO"
OpName %12 "SSBO"
OpDecorate %6 ArrayStride 8
OpMemberDecorate %7 0 Offset 0
OpDecorate %7 Block
OpDecorate %10 DescriptorSet 0
OpDecorate %10 Binding 0
OpDecorate %11 ArrayStride 8
OpMemberDecorate %12 0 Offset 0
OpDecorate %12 Block
OpDecorate %15 DescriptorSet 0
OpDecorate %15 Binding 0
OpDecorate %19 BuiltIn GlobalInvocationId
%1 = OpTypeVoid
%2 = OpTypeFunction %1
%5 = OpTypeInt 64 0
%6 = OpTypeRuntimeArray %5
%7 = OpTypeStruct %6
%8 = OpTypeRuntimeArray %7
%9 = OpTypePointer StorageBuffer %8
%10 = OpVariable %9 StorageBuffer
%11 = OpTypeRuntimeArray %5
%12 = OpTypeStruct %11
%13 = OpTypeRuntimeArray %12
%14 = OpTypePointer StorageBuffer %13
%15 = OpVariable %14 StorageBuffer
%16 = OpTypeInt 32 0
%17 = OpTypeVector %16 3
%18 = OpTypePointer Input %17
%19 = OpVariable %18 Input
%20 = OpTypePointer Input %16
%22 = OpConstant %16 0
%24 = OpTypePointer StorageBuffer %7
%27 = OpConstant %16 1
%28 = OpTypePointer StorageBuffer %12
%30 = OpConstant %16 2
%32 = OpTypePointer StorageBuffer %5
%39 = OpConstant %16 3
%42 = OpConstant %16 4
%45 = OpConstant %16 5
%48 = OpConstant %16 6
%51 = OpConstant %16 7
%54 = OpConstant %16 8
%57 = OpConstant %16 9
%60 = OpConstant %5 10
%61 = OpConstant %16 10
%64 = OpConstant %5 20
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %71
%71 = OpLabel
%21 = OpAccessChain %20 %19 %22
%23 = OpLoad %16 %21
%25 = OpAccessChain %24 %10 %22
%26 = OpAccessChain %24 %10 %27
%29 = OpAccessChain %28 %15 %30
%31 = OpUConvert %5 %23
%33 = OpAccessChain %32 %25 %22 %22
%34 = OpAtomicIAdd %5 %33 %27 %22 %31
%35 = OpAccessChain %32 %25 %22 %27
%36 = OpAtomicAnd %5 %35 %27 %22 %31
%37 = OpAccessChain %32 %25 %22 %30
%38 = OpAtomicOr %5 %37 %27 %22 %31
%40 = OpAccessChain %32 %25 %22 %39
%41 = OpAtomicXor %5 %40 %27 %22 %31
%43 = OpAccessChain %32 %25 %22 %42
%44 = OpAtomicUMin %5 %43 %27 %22 %31
%46 = OpAccessChain %32 %25 %22 %45
%47 = OpAtomicUMax %5 %46 %27 %22 %31
%49 = OpAccessChain %32 %26 %22 %48
%50 = OpAtomicSMin %5 %49 %27 %22 %31
%52 = OpAccessChain %32 %26 %22 %51
%53 = OpAtomicSMax %5 %52 %27 %22 %31
%55 = OpAccessChain %32 %25 %22 %54
%56 = OpAtomicExchange %5 %55 %27 %22 %31
%58 = OpAccessChain %32 %25 %22 %57
%59 = OpAtomicCompareExchange %5 %58 %27 %22 %22 %56 %60
%62 = OpAccessChain %32 %25 %22 %61
%63 = OpAtomicCompareExchange %5 %62 %27 %22 %22 %31 %64
%65 = OpAccessChain %32 %29 %22 %22
%66 = OpAtomicIAdd %5 %65 %27 %22 %31
%67 = OpAccessChain %32 %29 %22 %27
%68 = OpAtomicAnd %5 %67 %27 %22 %31
%69 = OpAccessChain %32 %29 %22 %30
%70 = OpAtomicOr %5 %69 %27 %22 %31
OpReturn
OpFunctionEnd
#endif
