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

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

layout(set = 4, binding = 0, r64ui) uniform u64imageBuffer _13[];
layout(set = 3, binding = 0, r64ui) uniform u64image2D _17[];

void main()
{
    uint64_t _25 = uint64_t(gl_GlobalInvocationID.x);
    uint64_t _35 = imageAtomicAdd(_13[registers._m4], int(0u), _25);
    uint64_t _43 = imageAtomicAnd(_13[registers._m4 + 1u], int(1u), _25);
    uint64_t _50 = imageAtomicOr(_13[registers._m4], int(2u), _25);
    uint64_t _58 = imageAtomicXor(_13[registers._m4 + 1u], int(3u), _25);
    uint64_t _64 = imageAtomicMin(_13[registers._m4], int(4u), _25);
    uint64_t _71 = imageAtomicMax(_13[registers._m4], int(5u), _25);
    uint64_t _79 = imageAtomicMin(_13[registers._m4 + 1u], int(6u), _25);
    uint64_t _87 = imageAtomicMax(_13[registers._m4 + 1u], int(7u), _25);
    uint64_t _95 = imageAtomicExchange(_13[registers._m4 + 1u], int(8u), _25);
    uint64_t _102 = imageAtomicCompSwap(_13[registers._m4], int(9u), 10ul, _95);
    uint64_t _111 = imageAtomicCompSwap(_13[registers._m4 + 1u], int(10u), 20ul, _25);
    uint64_t _122 = imageAtomicAdd(_17[registers._m3 + 2u], ivec2(uvec2(1u, 2u)), _25);
    uint64_t _130 = imageAtomicAdd(_17[registers._m3 + 3u], ivec2(uvec2(3u, 4u)), _25);
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.3
; Generator: Unknown(30017); 21022
; Bound: 133
; Schema: 0
OpCapability Shader
OpCapability Int64
OpCapability Int64Atomics
OpCapability ImageBuffer
OpCapability Int64ImageEXT
OpCapability RuntimeDescriptorArray
OpCapability PhysicalStorageBufferAddresses
OpExtension "SPV_EXT_descriptor_indexing"
OpExtension "SPV_EXT_shader_image_int64"
OpExtension "SPV_KHR_physical_storage_buffer"
OpMemoryModel PhysicalStorageBuffer64 GLSL450
OpEntryPoint GLCompute %3 "main" %20
OpExecutionMode %3 LocalSize 128 1 1
OpName %3 "main"
OpName %6 "RootConstants"
OpName %8 "registers"
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 %13 DescriptorSet 4
OpDecorate %13 Binding 0
OpDecorate %17 DescriptorSet 3
OpDecorate %17 Binding 0
OpDecorate %20 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 = OpTypeInt 64 0
%10 = OpTypeImage %9 Buffer 0 0 0 2 R64ui
%11 = OpTypeRuntimeArray %10
%12 = OpTypePointer UniformConstant %11
%13 = OpVariable %12 UniformConstant
%14 = OpTypeImage %9 2D 0 0 0 2 R64ui
%15 = OpTypeRuntimeArray %14
%16 = OpTypePointer UniformConstant %15
%17 = OpVariable %16 UniformConstant
%18 = OpTypeVector %5 3
%19 = OpTypePointer Input %18
%20 = OpVariable %19 Input
%21 = OpTypePointer Input %5
%23 = OpConstant %5 0
%26 = OpTypePointer UniformConstant %10
%28 = OpTypePointer PushConstant %5
%30 = OpConstant %5 4
%33 = OpTypePointer Image %9
%36 = OpConstant %5 1
%48 = OpConstant %5 2
%56 = OpConstant %5 3
%69 = OpConstant %5 5
%77 = OpConstant %5 6
%85 = OpConstant %5 7
%93 = OpConstant %5 8
%100 = OpConstant %5 9
%103 = OpConstant %9 10
%109 = OpConstant %5 10
%112 = OpConstant %9 20
%113 = OpTypePointer UniformConstant %14
%119 = OpTypeVector %5 2
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %131
%131 = OpLabel
%22 = OpAccessChain %21 %20 %23
%24 = OpLoad %5 %22
%25 = OpUConvert %9 %24
%29 = OpAccessChain %28 %8 %30
%31 = OpLoad %5 %29
%27 = OpAccessChain %26 %13 %31
%32 = OpLoad %10 %27
%34 = OpImageTexelPointer %33 %27 %23 %23
%35 = OpAtomicIAdd %9 %34 %36 %23 %25
%38 = OpAccessChain %28 %8 %30
%39 = OpLoad %5 %38
%40 = OpIAdd %5 %39 %36
%37 = OpAccessChain %26 %13 %40
%41 = OpLoad %10 %37
%42 = OpImageTexelPointer %33 %37 %36 %23
%43 = OpAtomicAnd %9 %42 %36 %23 %25
%45 = OpAccessChain %28 %8 %30
%46 = OpLoad %5 %45
%44 = OpAccessChain %26 %13 %46
%47 = OpLoad %10 %44
%49 = OpImageTexelPointer %33 %44 %48 %23
%50 = OpAtomicOr %9 %49 %36 %23 %25
%52 = OpAccessChain %28 %8 %30
%53 = OpLoad %5 %52
%54 = OpIAdd %5 %53 %36
%51 = OpAccessChain %26 %13 %54
%55 = OpLoad %10 %51
%57 = OpImageTexelPointer %33 %51 %56 %23
%58 = OpAtomicXor %9 %57 %36 %23 %25
%60 = OpAccessChain %28 %8 %30
%61 = OpLoad %5 %60
%59 = OpAccessChain %26 %13 %61
%62 = OpLoad %10 %59
%63 = OpImageTexelPointer %33 %59 %30 %23
%64 = OpAtomicUMin %9 %63 %36 %23 %25
%66 = OpAccessChain %28 %8 %30
%67 = OpLoad %5 %66
%65 = OpAccessChain %26 %13 %67
%68 = OpLoad %10 %65
%70 = OpImageTexelPointer %33 %65 %69 %23
%71 = OpAtomicUMax %9 %70 %36 %23 %25
%73 = OpAccessChain %28 %8 %30
%74 = OpLoad %5 %73
%75 = OpIAdd %5 %74 %36
%72 = OpAccessChain %26 %13 %75
%76 = OpLoad %10 %72
%78 = OpImageTexelPointer %33 %72 %77 %23
%79 = OpAtomicSMin %9 %78 %36 %23 %25
%81 = OpAccessChain %28 %8 %30
%82 = OpLoad %5 %81
%83 = OpIAdd %5 %82 %36
%80 = OpAccessChain %26 %13 %83
%84 = OpLoad %10 %80
%86 = OpImageTexelPointer %33 %80 %85 %23
%87 = OpAtomicSMax %9 %86 %36 %23 %25
%89 = OpAccessChain %28 %8 %30
%90 = OpLoad %5 %89
%91 = OpIAdd %5 %90 %36
%88 = OpAccessChain %26 %13 %91
%92 = OpLoad %10 %88
%94 = OpImageTexelPointer %33 %88 %93 %23
%95 = OpAtomicExchange %9 %94 %36 %23 %25
%97 = OpAccessChain %28 %8 %30
%98 = OpLoad %5 %97
%96 = OpAccessChain %26 %13 %98
%99 = OpLoad %10 %96
%101 = OpImageTexelPointer %33 %96 %100 %23
%102 = OpAtomicCompareExchange %9 %101 %36 %23 %23 %95 %103
%105 = OpAccessChain %28 %8 %30
%106 = OpLoad %5 %105
%107 = OpIAdd %5 %106 %36
%104 = OpAccessChain %26 %13 %107
%108 = OpLoad %10 %104
%110 = OpImageTexelPointer %33 %104 %109 %23
%111 = OpAtomicCompareExchange %9 %110 %36 %23 %23 %25 %112
%115 = OpAccessChain %28 %8 %56
%116 = OpLoad %5 %115
%117 = OpIAdd %5 %116 %48
%114 = OpAccessChain %113 %17 %117
%118 = OpLoad %14 %114
%120 = OpCompositeConstruct %119 %36 %48
%121 = OpImageTexelPointer %33 %114 %120 %23
%122 = OpAtomicIAdd %9 %121 %36 %23 %25
%124 = OpAccessChain %28 %8 %56
%125 = OpLoad %5 %124
%126 = OpIAdd %5 %125 %56
%123 = OpAccessChain %113 %17 %126
%127 = OpLoad %14 %123
%128 = OpCompositeConstruct %119 %56 %30
%129 = OpImageTexelPointer %33 %123 %128 %23
%130 = OpAtomicIAdd %9 %129 %36 %23 %25
OpReturn
OpFunctionEnd
#endif
