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

layout(set = 0, binding = 0, r32ui) uniform writeonly uimageBuffer _8;
layout(set = 0, binding = 1, r32ui) uniform writeonly uimageBuffer _9;
layout(set = 0, binding = 2, r32ui) uniform writeonly uimageBuffer _10;

void main()
{
    uint _23 = gl_GlobalInvocationID.x * 28u;
    imageStore(_8, int(gl_GlobalInvocationID.x * 7u), uvec4(subgroupAdd(gl_GlobalInvocationID.x)));
    imageStore(_8, int((gl_GlobalInvocationID.x * 7u) + 1u), uvec4(subgroupMul(gl_GlobalInvocationID.x)));
    imageStore(_8, int((gl_GlobalInvocationID.x * 7u) + 2u), uvec4(subgroupAnd(gl_GlobalInvocationID.x)));
    imageStore(_8, int((gl_GlobalInvocationID.x * 7u) + 3u), uvec4(subgroupOr(gl_GlobalInvocationID.x)));
    imageStore(_8, int((gl_GlobalInvocationID.x * 7u) + 4u), uvec4(subgroupXor(gl_GlobalInvocationID.x)));
    imageStore(_8, int((gl_GlobalInvocationID.x * 7u) + 5u), uvec4(subgroupMin(gl_GlobalInvocationID.x)));
    imageStore(_8, int((gl_GlobalInvocationID.x * 7u) + 6u), uvec4(subgroupMax(gl_GlobalInvocationID.x)));
    imageStore(_9, int(gl_GlobalInvocationID.x * 7u), uvec4(subgroupAdd(gl_GlobalInvocationID.x)));
    imageStore(_9, int((gl_GlobalInvocationID.x * 7u) + 1u), uvec4(subgroupMul(gl_GlobalInvocationID.x)));
    imageStore(_9, int((gl_GlobalInvocationID.x * 7u) + 2u), uvec4(subgroupAnd(gl_GlobalInvocationID.x)));
    imageStore(_9, int((gl_GlobalInvocationID.x * 7u) + 3u), uvec4(subgroupOr(gl_GlobalInvocationID.x)));
    imageStore(_9, int((gl_GlobalInvocationID.x * 7u) + 4u), uvec4(subgroupXor(gl_GlobalInvocationID.x)));
    imageStore(_9, int((gl_GlobalInvocationID.x * 7u) + 5u), uvec4(uint(subgroupMin(int(gl_GlobalInvocationID.x)))));
    imageStore(_9, int((gl_GlobalInvocationID.x * 7u) + 6u), uvec4(uint(subgroupMax(int(gl_GlobalInvocationID.x)))));
    float _97 = float(gl_GlobalInvocationID.x);
    imageStore(_10, int(gl_GlobalInvocationID.x * 7u), uvec4(uint(subgroupAdd(_97))));
    imageStore(_10, int((gl_GlobalInvocationID.x * 7u) + 1u), uvec4(uint(subgroupMul(_97))));
    imageStore(_10, int((gl_GlobalInvocationID.x * 7u) + 5u), uvec4(uint(subgroupMin(_97))));
    imageStore(_10, int((gl_GlobalInvocationID.x * 7u) + 6u), uvec4(uint(subgroupMax(_97))));
}


#if 0
// SPIR-V disassembly
; SPIR-V
; Version: 1.3
; Generator: Unknown(30017); 21022
; Bound: 119
; Schema: 0
OpCapability Shader
OpCapability ImageBuffer
OpCapability GroupNonUniformArithmetic
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %3 "main" %16
OpExecutionMode %3 LocalSize 64 1 1
OpName %3 "main"
OpDecorate %8 DescriptorSet 0
OpDecorate %8 Binding 0
OpDecorate %8 NonReadable
OpDecorate %9 DescriptorSet 0
OpDecorate %9 Binding 1
OpDecorate %9 NonReadable
OpDecorate %10 DescriptorSet 0
OpDecorate %10 Binding 2
OpDecorate %10 NonReadable
OpDecorate %16 BuiltIn GlobalInvocationId
%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
%9 = OpVariable %7 UniformConstant
%10 = OpVariable %7 UniformConstant
%14 = OpTypeVector %5 3
%15 = OpTypePointer Input %14
%16 = OpVariable %15 Input
%17 = OpTypePointer Input %5
%19 = OpConstant %5 0
%22 = OpConstant %5 3
%24 = OpConstant %5 28
%26 = OpConstant %5 7
%27 = OpTypeVector %5 4
%31 = OpConstant %5 4
%34 = OpConstant %5 1
%38 = OpConstant %5 8
%41 = OpConstant %5 2
%45 = OpConstant %5 12
%51 = OpConstant %5 16
%57 = OpConstant %5 20
%60 = OpConstant %5 5
%64 = OpConstant %5 24
%67 = OpConstant %5 6
%96 = OpTypeFloat 32
%3 = OpFunction %1 None %2
%4 = OpLabel
OpBranch %117
%117 = OpLabel
%11 = OpLoad %6 %10
%12 = OpLoad %6 %9
%13 = OpLoad %6 %8
%18 = OpAccessChain %17 %16 %19
%20 = OpLoad %5 %18
%21 = OpGroupNonUniformIAdd %5 %22 Reduce %20
%23 = OpIMul %5 %20 %24
%25 = OpIMul %5 %20 %26
%28 = OpCompositeConstruct %27 %21 %21 %21 %21
OpImageWrite %13 %25 %28
%29 = OpGroupNonUniformIMul %5 %22 Reduce %20
%30 = OpIAdd %5 %23 %31
%32 = OpIMul %5 %20 %26
%33 = OpIAdd %5 %32 %34
%35 = OpCompositeConstruct %27 %29 %29 %29 %29
OpImageWrite %13 %33 %35
%36 = OpGroupNonUniformBitwiseAnd %5 %22 Reduce %20
%37 = OpIAdd %5 %23 %38
%39 = OpIMul %5 %20 %26
%40 = OpIAdd %5 %39 %41
%42 = OpCompositeConstruct %27 %36 %36 %36 %36
OpImageWrite %13 %40 %42
%43 = OpGroupNonUniformBitwiseOr %5 %22 Reduce %20
%44 = OpIAdd %5 %23 %45
%46 = OpIMul %5 %20 %26
%47 = OpIAdd %5 %46 %22
%48 = OpCompositeConstruct %27 %43 %43 %43 %43
OpImageWrite %13 %47 %48
%49 = OpGroupNonUniformBitwiseXor %5 %22 Reduce %20
%50 = OpIAdd %5 %23 %51
%52 = OpIMul %5 %20 %26
%53 = OpIAdd %5 %52 %31
%54 = OpCompositeConstruct %27 %49 %49 %49 %49
OpImageWrite %13 %53 %54
%55 = OpGroupNonUniformUMin %5 %22 Reduce %20
%56 = OpIAdd %5 %23 %57
%58 = OpIMul %5 %20 %26
%59 = OpIAdd %5 %58 %60
%61 = OpCompositeConstruct %27 %55 %55 %55 %55
OpImageWrite %13 %59 %61
%62 = OpGroupNonUniformUMax %5 %22 Reduce %20
%63 = OpIAdd %5 %23 %64
%65 = OpIMul %5 %20 %26
%66 = OpIAdd %5 %65 %67
%68 = OpCompositeConstruct %27 %62 %62 %62 %62
OpImageWrite %13 %66 %68
%69 = OpGroupNonUniformIAdd %5 %22 Reduce %20
%70 = OpIMul %5 %20 %26
%71 = OpCompositeConstruct %27 %69 %69 %69 %69
OpImageWrite %12 %70 %71
%72 = OpGroupNonUniformIMul %5 %22 Reduce %20
%73 = OpIMul %5 %20 %26
%74 = OpIAdd %5 %73 %34
%75 = OpCompositeConstruct %27 %72 %72 %72 %72
OpImageWrite %12 %74 %75
%76 = OpGroupNonUniformBitwiseAnd %5 %22 Reduce %20
%77 = OpIMul %5 %20 %26
%78 = OpIAdd %5 %77 %41
%79 = OpCompositeConstruct %27 %76 %76 %76 %76
OpImageWrite %12 %78 %79
%80 = OpGroupNonUniformBitwiseOr %5 %22 Reduce %20
%81 = OpIMul %5 %20 %26
%82 = OpIAdd %5 %81 %22
%83 = OpCompositeConstruct %27 %80 %80 %80 %80
OpImageWrite %12 %82 %83
%84 = OpGroupNonUniformBitwiseXor %5 %22 Reduce %20
%85 = OpIMul %5 %20 %26
%86 = OpIAdd %5 %85 %31
%87 = OpCompositeConstruct %27 %84 %84 %84 %84
OpImageWrite %12 %86 %87
%88 = OpGroupNonUniformSMin %5 %22 Reduce %20
%89 = OpIMul %5 %20 %26
%90 = OpIAdd %5 %89 %60
%91 = OpCompositeConstruct %27 %88 %88 %88 %88
OpImageWrite %12 %90 %91
%92 = OpGroupNonUniformSMax %5 %22 Reduce %20
%93 = OpIMul %5 %20 %26
%94 = OpIAdd %5 %93 %67
%95 = OpCompositeConstruct %27 %92 %92 %92 %92
OpImageWrite %12 %94 %95
%97 = OpConvertUToF %96 %20
%98 = OpGroupNonUniformFAdd %96 %22 Reduce %97
%99 = OpConvertFToU %5 %98
%100 = OpIMul %5 %20 %26
%101 = OpCompositeConstruct %27 %99 %99 %99 %99
OpImageWrite %11 %100 %101
%102 = OpGroupNonUniformFMul %96 %22 Reduce %97
%103 = OpConvertFToU %5 %102
%104 = OpIMul %5 %20 %26
%105 = OpIAdd %5 %104 %34
%106 = OpCompositeConstruct %27 %103 %103 %103 %103
OpImageWrite %11 %105 %106
%107 = OpGroupNonUniformFMin %96 %22 Reduce %97
%108 = OpConvertFToU %5 %107
%109 = OpIMul %5 %20 %26
%110 = OpIAdd %5 %109 %60
%111 = OpCompositeConstruct %27 %108 %108 %108 %108
OpImageWrite %11 %110 %111
%112 = OpGroupNonUniformFMax %96 %22 Reduce %97
%113 = OpConvertFToU %5 %112
%114 = OpIMul %5 %20 %26
%115 = OpIAdd %5 %114 %67
%116 = OpCompositeConstruct %27 %113 %113 %113 %113
OpImageWrite %11 %115 %116
OpReturn
OpFunctionEnd
#endif
