From 10e424f586a38f4f0e6d3b4444915b1b2aac684d Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Wed, 8 Jan 2025 02:03:09 -0800 Subject: [PATCH] aco: always use ds_bpermute for shuffle/rotate on GFX12 ds_bpermute supports both 32 and 64 lanes now. Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/compiler/aco_instruction_selection.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 7d9a23aa338..fb30a5014da 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -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);