// language: metal2.4
#include <metal_stdlib>
#include <simd/simd.h>

using metal::uint;

struct Structure {
    uint num_subgroups;
    uint subgroup_size;
};

struct main_Input {
};
kernel void main_(
  uint num_subgroups [[simdgroups_per_threadgroup]]
, uint subgroup_size [[threads_per_simdgroup]]
, uint subgroup_id [[simdgroup_index_in_threadgroup]]
, uint subgroup_invocation_id [[thread_index_in_simdgroup]]
) {
    const Structure sizes = { num_subgroups, subgroup_size };
    metal::simdgroup_barrier(metal::mem_flags::mem_threadgroup);
    metal::uint4 unnamed = metal::uint4((uint64_t)metal::simd_ballot((subgroup_invocation_id & 1u) == 1u), 0, 0, 0);
    metal::uint4 unnamed_1 = metal::uint4((uint64_t)metal::simd_ballot(true), 0, 0, 0);
    bool unnamed_2 = metal::simd_all(subgroup_invocation_id != 0u);
    bool unnamed_3 = metal::simd_any(subgroup_invocation_id == 0u);
    uint unnamed_4 = metal::simd_sum(subgroup_invocation_id);
    uint unnamed_5 = metal::simd_product(subgroup_invocation_id);
    uint unnamed_6 = metal::simd_min(subgroup_invocation_id);
    uint unnamed_7 = metal::simd_max(subgroup_invocation_id);
    uint unnamed_8 = metal::simd_and(subgroup_invocation_id);
    uint unnamed_9 = metal::simd_or(subgroup_invocation_id);
    uint unnamed_10 = metal::simd_xor(subgroup_invocation_id);
    uint unnamed_11 = metal::simd_prefix_exclusive_sum(subgroup_invocation_id);
    uint unnamed_12 = metal::simd_prefix_exclusive_product(subgroup_invocation_id);
    uint unnamed_13 = metal::simd_prefix_inclusive_sum(subgroup_invocation_id);
    uint unnamed_14 = metal::simd_prefix_inclusive_product(subgroup_invocation_id);
    uint unnamed_15 = metal::simd_broadcast_first(subgroup_invocation_id);
    uint unnamed_16 = metal::simd_broadcast(subgroup_invocation_id, 4u);
    uint unnamed_17 = metal::simd_shuffle(subgroup_invocation_id, (sizes.subgroup_size - 1u) - subgroup_invocation_id);
    uint unnamed_18 = metal::simd_shuffle_down(subgroup_invocation_id, 1u);
    uint unnamed_19 = metal::simd_shuffle_up(subgroup_invocation_id, 1u);
    uint unnamed_20 = metal::simd_shuffle_xor(subgroup_invocation_id, sizes.subgroup_size - 1u);
    return;
}
