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:
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);
|
||||
|
||||
Reference in New Issue
Block a user