From a6352a504fa15e47bc29da0e62255db6d1e35919 Mon Sep 17 00:00:00 2001 From: squidbus Date: Fri, 24 Apr 2026 01:26:58 -0700 Subject: [PATCH] kk: Support subgroup rotate ops Rotate is native, clustered rotate is lowered to shuffle since MSL's rotate does not support clustering. Reviewed-by: Aitor Camacho Part-of: --- src/kosmickrisp/compiler/msl_nir_lower_subgroups.c | 3 +++ src/kosmickrisp/compiler/msl_type_inference.c | 2 ++ src/kosmickrisp/compiler/nir_to_msl.c | 7 +++++++ 3 files changed, 12 insertions(+) diff --git a/src/kosmickrisp/compiler/msl_nir_lower_subgroups.c b/src/kosmickrisp/compiler/msl_nir_lower_subgroups.c index ed48cf65b52..87a46649370 100644 --- a/src/kosmickrisp/compiler/msl_nir_lower_subgroups.c +++ b/src/kosmickrisp/compiler/msl_nir_lower_subgroups.c @@ -20,6 +20,7 @@ needs_bool_widening(nir_intrinsic_instr *intrin) case nir_intrinsic_quad_swap_horizontal: case nir_intrinsic_quad_swap_vertical: case nir_intrinsic_quad_swap_diagonal: + case nir_intrinsic_rotate: case nir_intrinsic_shuffle: case nir_intrinsic_shuffle_down: case nir_intrinsic_shuffle_up: @@ -66,6 +67,8 @@ msl_nir_lower_subgroups(nir_shader *nir) .lower_relative_shuffle = true, /* Metal reduce operations do not support certain types or cluster size */ .lower_reduce = true, + /* Metal rotate operations do not support cluster size */ + .lower_rotate_clustered_to_shuffle = true, }; NIR_PASS(_, nir, nir_lower_subgroups, &subgroups_options); NIR_PASS(_, nir, nir_shader_intrinsics_pass, lower_bool_ops, diff --git a/src/kosmickrisp/compiler/msl_type_inference.c b/src/kosmickrisp/compiler/msl_type_inference.c index 449ec61a62a..400dc5910e1 100644 --- a/src/kosmickrisp/compiler/msl_type_inference.c +++ b/src/kosmickrisp/compiler/msl_type_inference.c @@ -183,6 +183,7 @@ update_instr_type(struct hash_table *types, nir_instr *instr, ti_type type) case nir_intrinsic_quad_swap_horizontal: case nir_intrinsic_quad_swap_vertical: case nir_intrinsic_quad_swap_diagonal: + case nir_intrinsic_rotate: case nir_intrinsic_shuffle: case nir_intrinsic_shuffle_down: case nir_intrinsic_shuffle_up: @@ -462,6 +463,7 @@ infer_types_from_intrinsic(struct hash_table *types, nir_intrinsic_instr *instr) break; case nir_intrinsic_read_invocation: case nir_intrinsic_quad_broadcast: + case nir_intrinsic_rotate: case nir_intrinsic_shuffle: case nir_intrinsic_shuffle_down: case nir_intrinsic_shuffle_up: diff --git a/src/kosmickrisp/compiler/nir_to_msl.c b/src/kosmickrisp/compiler/nir_to_msl.c index 968ebdc1122..cac88123ed2 100644 --- a/src/kosmickrisp/compiler/nir_to_msl.c +++ b/src/kosmickrisp/compiler/nir_to_msl.c @@ -1471,6 +1471,13 @@ intrinsic_to_msl(struct nir_to_msl_ctx *ctx, nir_intrinsic_instr *instr) src_to_msl(ctx, &instr->src[1]); P(ctx, ");"); break; + case nir_intrinsic_rotate: + P(ctx, "simd_shuffle_rotate_down("); + src_to_msl(ctx, &instr->src[0]); + P(ctx, ", "); + src_to_msl(ctx, &instr->src[1]); + P(ctx, ");\n"); + break; case nir_intrinsic_shuffle: P(ctx, "simd_shuffle("); src_to_msl(ctx, &instr->src[0]);