aco: always use ds_bpermute for shuffle/rotate on GFX12

ds_bpermute supports both 32 and 64 lanes now.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32974>
This commit is contained in:
Samuel Pitoiset
2025-01-08 02:03:09 -08:00
committed by Marge Bot
parent b3d4d65f5a
commit 10e424f586
@@ -177,9 +177,10 @@ emit_bpermute(isel_context* ctx, Builder& bld, Temp index, Temp data)
/* GFX6-7: there is no bpermute instruction */
return bld.pseudo(aco_opcode::p_bpermute_readlane, bld.def(v1), bld.def(bld.lm),
bld.def(bld.lm, vcc), index, data);
} else if (ctx->options->gfx_level >= GFX10 && ctx->program->wave_size == 64) {
} else if (ctx->options->gfx_level >= GFX10 && ctx->options->gfx_level <= GFX11_5 &&
ctx->program->wave_size == 64) {
/* GFX10 wave64 mode: emulate full-wave bpermute */
/* GFX10-11.5 wave64 mode: emulate full-wave bpermute */
Temp index_is_lo =
bld.vopc(aco_opcode::v_cmp_ge_u32, bld.def(bld.lm), Operand::c32(31u), index);
Builder::Result index_is_lo_split =
@@ -203,7 +204,7 @@ emit_bpermute(isel_context* ctx, Builder& bld, Temp index, Temp data)
bld.def(s1, scc), Operand(v1.as_linear()), index_x4, data, same_half);
}
} else {
/* GFX8-9 or GFX10 wave32: bpermute works normally */
/* wave32 or GFX8-9, GFX12+: bpermute works normally */
Temp index_x4 = bld.vop2(aco_opcode::v_lshlrev_b32, bld.def(v1), Operand::c32(2u), index);
return bld.ds(aco_opcode::ds_bpermute_b32, bld.def(v1), index_x4, data);
}
@@ -8284,8 +8285,9 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr)
Temp tid = emit_mbcnt(ctx, bld.tmp(v1));
Temp src_lane = bld.vadd32(bld.def(v1), tid, delta);
if (ctx->program->gfx_level >= GFX10 && cluster_size == 32) {
/* ds_bpermute is restricted to 32 lanes on GFX10+. */
if (ctx->program->gfx_level >= GFX10 && ctx->program->gfx_level <= GFX11_5 &&
cluster_size == 32) {
/* ds_bpermute is restricted to 32 lanes on GFX10-GFX11.5. */
Temp index_x4 =
bld.vop2(aco_opcode::v_lshlrev_b32, bld.def(v1), Operand::c32(2u), src_lane);
tmp = bld.ds(aco_opcode::ds_bpermute_b32, bld.def(v1), index_x4, src);