#version 460
#extension GL_KHR_shader_subgroup_basic : require
#extension GL_KHR_shader_subgroup_quad : require
#extension GL_KHR_shader_subgroup_shuffle : require
layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;

layout(set = 0, binding = 0, r32ui) uniform uimageBuffer _8;

void main()
{
    uvec4 _18 = imageLoad(_8, int(gl_GlobalInvocationID.x));
    float _21 = uintBitsToFloat(_18.x);
    imageStore(_8, int(gl_GlobalInvocationID.x), uvec4(floatBitsToUint(uintBitsToFloat(imageLoad(_8, int(gl_GlobalInvocationID.x)).x) + subgroupQuadBroadcast(_21, 0u))));
    imageStore(_8, int(gl_GlobalInvocationID.x), uvec4(floatBitsToUint(uintBitsToFloat(imageLoad(_8, int(gl_GlobalInvocationID.x)).x) + subgroupQuadBroadcast(_21, 1u))));
    imageStore(_8, int(gl_GlobalInvocationID.x), uvec4(floatBitsToUint(uintBitsToFloat(imageLoad(_8, int(gl_GlobalInvocationID.x)).x) + subgroupQuadBroadcast(_21, 2u))));
    imageStore(_8, int(gl_GlobalInvocationID.x), uvec4(floatBitsToUint(uintBitsToFloat(imageLoad(_8, int(gl_GlobalInvocationID.x)).x) + subgroupQuadBroadcast(_21, 3u))));
    imageStore(_8, int(gl_GlobalInvocationID.x), uvec4(floatBitsToUint(uintBitsToFloat(imageLoad(_8, int(gl_GlobalInvocationID.x)).x) + subgroupShuffle(_21, (gl_SubgroupInvocationID + 4u) & 4294967292u))));
    imageStore(_8, int(gl_GlobalInvocationID.x), uvec4(floatBitsToUint(uintBitsToFloat(imageLoad(_8, int(gl_GlobalInvocationID.x)).x) + subgroupQuadBroadcast(_21, 0u))));
    imageStore(_8, int(gl_GlobalInvocationID.x), uvec4(floatBitsToUint(uintBitsToFloat(imageLoad(_8, int(gl_GlobalInvocationID.x)).x) + subgroupQuadBroadcast(_21, 1u))));
    imageStore(_8, int(gl_GlobalInvocationID.x), uvec4(floatBitsToUint(uintBitsToFloat(imageLoad(_8, int(gl_GlobalInvocationID.x)).x) + subgroupQuadBroadcast(_21, 2u))));
    imageStore(_8, int(gl_GlobalInvocationID.x), uvec4(floatBitsToUint(uintBitsToFloat(imageLoad(_8, int(gl_GlobalInvocationID.x)).x) + subgroupQuadBroadcast(_21, 3u))));
    imageStore(_8, int(gl_GlobalInvocationID.x), uvec4(floatBitsToUint(uintBitsToFloat(imageLoad(_8, int(gl_GlobalInvocationID.x)).x) + subgroupShuffle(_21, (gl_SubgroupInvocationID & 4294967288u) | 4u))));
    imageStore(_8, int(gl_GlobalInvocationID.x), uvec4(floatBitsToUint(uintBitsToFloat(imageLoad(_8, int(gl_GlobalInvocationID.x)).x) + subgroupQuadBroadcast(_21, 0u))));
    imageStore(_8, int(gl_GlobalInvocationID.x), uvec4(floatBitsToUint(uintBitsToFloat(imageLoad(_8, int(gl_GlobalInvocationID.x)).x) + subgroupQuadBroadcast(_21, 3u))));
}


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