From 29aa8c52b3e4bf6f60da6a22d6db4bebf56a87af Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Wed, 16 Nov 2022 00:34:29 +0100 Subject: [PATCH] radeonsi: lower mul_high MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes `integer_mad_hi` and `integer_mul_hi` `integer_ops` tests Cc: mesa-stable Signed-off-by: Karol Herbst Reviewed-by: Marek Olšák Part-of: (cherry picked from commit 037b56bf0fa589bdd9887937c089f4b50a75b351) --- .pick_status.json | 2 +- src/gallium/drivers/radeonsi/si_get.c | 2 +- src/gallium/drivers/radeonsi/si_shader_nir.c | 21 ++++++++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 02f6e24de57..0f2dfd6a891 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -175,7 +175,7 @@ "description": "radeonsi: lower mul_high", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/gallium/drivers/radeonsi/si_get.c b/src/gallium/drivers/radeonsi/si_get.c index 62508f5b204..7084e43ff52 100644 --- a/src/gallium/drivers/radeonsi/si_get.c +++ b/src/gallium/drivers/radeonsi/si_get.c @@ -1240,7 +1240,7 @@ void si_init_screen_get_functions(struct si_screen *sscreen) .lower_fisnormal = true, .lower_rotate = true, .lower_to_scalar = true, - .lower_int64_options = nir_lower_imul_2x32_64, + .lower_int64_options = nir_lower_imul_2x32_64 | nir_lower_imul_high64, .has_sdot_4x8 = sscreen->info.has_accelerated_dot_product, .has_sudot_4x8 = sscreen->info.has_accelerated_dot_product && sscreen->info.gfx_level >= GFX11, .has_udot_4x8 = sscreen->info.has_accelerated_dot_product, diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c index db2ac4c31dc..02556a8e8b9 100644 --- a/src/gallium/drivers/radeonsi/si_shader_nir.c +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c @@ -63,6 +63,26 @@ static uint8_t si_vectorize_callback(const nir_instr *instr, const void *data) return 1; } +static unsigned si_lower_bit_size_callback(const nir_instr *instr, void *data) +{ + if (instr->type != nir_instr_type_alu) + return 0; + + nir_alu_instr *alu = nir_instr_as_alu(instr); + + switch (alu->op) { + case nir_op_imul_high: + case nir_op_umul_high: + if (nir_dest_bit_size(alu->dest.dest) < 32) + return 32; + break; + default: + break; + } + + return 0; +} + void si_nir_opts(struct si_screen *sscreen, struct nir_shader *nir, bool first) { bool progress; @@ -105,6 +125,7 @@ void si_nir_opts(struct si_screen *sscreen, struct nir_shader *nir, bool first) NIR_PASS(progress, nir, nir_opt_peephole_select, 8, true, true); /* Needed for algebraic lowering */ + NIR_PASS(progress, nir, nir_lower_bit_size, si_lower_bit_size_callback, NULL); NIR_PASS(progress, nir, nir_opt_algebraic); NIR_PASS(progress, nir, nir_opt_constant_folding);