From 35a10f5d5ac6f6efc121ab25fe359b36f271edac Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Thu, 8 Aug 2024 12:18:02 +0200 Subject: [PATCH] broadcom: implement nir_op_uclz MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This enables some algebraic optimizations. No changes in shader-db, but it does cause some CTS tests to produce less instructions. Reviewed-by: Alejandro PiƱeiro Part-of: --- src/broadcom/compiler/nir_to_vir.c | 4 ++++ src/broadcom/vulkan/v3dv_pipeline.c | 1 + src/gallium/drivers/v3d/v3d_screen.c | 1 + 3 files changed, 6 insertions(+) diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c index 44128161729..cd91fadaab4 100644 --- a/src/broadcom/compiler/nir_to_vir.c +++ b/src/broadcom/compiler/nir_to_vir.c @@ -1615,6 +1615,10 @@ ntq_emit_alu(struct v3d_compile *c, nir_alu_instr *instr) result = vir_NOT(c, src[0]); break; + case nir_op_uclz: + result = vir_CLZ(c, src[0]); + break; + case nir_op_ufind_msb: result = vir_SUB(c, vir_uniform_ui(c, 31), vir_CLZ(c, src[0])); break; diff --git a/src/broadcom/vulkan/v3dv_pipeline.c b/src/broadcom/vulkan/v3dv_pipeline.c index 32d80d31ab0..1f490223ab5 100644 --- a/src/broadcom/vulkan/v3dv_pipeline.c +++ b/src/broadcom/vulkan/v3dv_pipeline.c @@ -220,6 +220,7 @@ v3dv_pipeline_get_nir_options(const struct v3d_device_info *devinfo) .lower_fquantize2f16 = true, .has_fsub = true, .has_isub = true, + .has_uclz = true, .vertex_id_zero_based = false, /* FIXME: to set this to true, the intrinsic * needs to be supported */ .lower_interpolate_at = true, diff --git a/src/gallium/drivers/v3d/v3d_screen.c b/src/gallium/drivers/v3d/v3d_screen.c index e708b24a9d1..d82a7626508 100644 --- a/src/gallium/drivers/v3d/v3d_screen.c +++ b/src/gallium/drivers/v3d/v3d_screen.c @@ -751,6 +751,7 @@ v3d_screen_get_compiler_options(struct pipe_screen *pscreen, .lower_fquantize2f16 = true, .has_fsub = true, .has_isub = true, + .has_uclz = true, .divergence_analysis_options = nir_divergence_multiple_workgroup_per_compute_subgroup, /* This will enable loop unrolling in the state tracker so we won't