diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c index 69102202d08..5e38522f5c5 100644 --- a/src/broadcom/compiler/nir_to_vir.c +++ b/src/broadcom/compiler/nir_to_vir.c @@ -2245,7 +2245,7 @@ v3d_optimize_nir(struct v3d_compile *c, struct nir_shader *s) /* needs to be outside of optimization loop, otherwise it fights with * opt_algebraic optimizing the conversion lowering */ - NIR_PASS(progress, s, v3d_nir_lower_algebraic); + NIR_PASS(progress, s, v3d_nir_lower_algebraic, c); NIR_PASS(progress, s, nir_opt_cse); nir_move_options sink_opts = diff --git a/src/broadcom/compiler/v3d_compiler.h b/src/broadcom/compiler/v3d_compiler.h index 409e8970130..c28027799eb 100644 --- a/src/broadcom/compiler/v3d_compiler.h +++ b/src/broadcom/compiler/v3d_compiler.h @@ -1209,7 +1209,7 @@ bool v3d_nir_lower_txf_ms(nir_shader *s); bool v3d_nir_lower_image_load_store(nir_shader *s, struct v3d_compile *c); bool v3d_nir_lower_global_2x32(nir_shader *s); bool v3d_nir_lower_load_store_bitsize(nir_shader *s); -bool v3d_nir_lower_algebraic(struct nir_shader *shader); +bool v3d_nir_lower_algebraic(struct nir_shader *shader, const struct v3d_compile *c); void v3d_vir_emit_tex(struct v3d_compile *c, nir_tex_instr *instr); void v3d_vir_emit_image_load_store(struct v3d_compile *c, diff --git a/src/broadcom/compiler/v3d_nir_lower_algebraic.py b/src/broadcom/compiler/v3d_nir_lower_algebraic.py index 91e62476317..59dd498e36e 100644 --- a/src/broadcom/compiler/v3d_nir_lower_algebraic.py +++ b/src/broadcom/compiler/v3d_nir_lower_algebraic.py @@ -5,6 +5,9 @@ import sys a = 'a' +has_unpack_sat = 'c && v3d_device_has_unpack_sat(c->devinfo)' +has_unpack_max0 = 'c && v3d_device_has_unpack_max0(c->devinfo)' + lower_alu = [ (('f2i8', a), ('i2i8', ('f2i32', a))), (('f2i16', a), ('i2i16', ('f2i32', a))), @@ -17,6 +20,10 @@ lower_alu = [ (('u2f32', 'a@8'), ('u2f32', ('u2u32', a))), (('u2f32', 'a@16'), ('u2f32', ('u2u32', a))), + + (('fmin', ('fmax', a, -1.0), 1.0), ('fsat_signed', a), has_unpack_sat), + (('fmax', ('fmin', a, 1.0), -1.0), ('fsat_signed', a), has_unpack_sat), + (('fmax', a, 0.0), ('fclamp_pos', a), has_unpack_max0), ] def main(): @@ -32,7 +39,10 @@ def run(): print('#include "v3d_compiler.h"') print(nir_algebraic.AlgebraicPass("v3d_nir_lower_algebraic", - lower_alu).render()) + lower_alu, + [ + ("const struct v3d_compile *", "c") + ]).render()) if __name__ == '__main__': main()