diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py index 5b3b265ab00..0e9240fff2f 100644 --- a/src/compiler/nir/nir_opt_algebraic.py +++ b/src/compiler/nir/nir_opt_algebraic.py @@ -337,6 +337,18 @@ optimizations = [ # (b==0.0 ? 0.0 : a) * (a==0.0 ? 0.0 : b) -> fmulz(a, b) *add_fabs_fneg((('fmul@32(nsz)', ('bcsel', ignore_exact('feq', b, 0.0), 0.0, 'ma'), ('bcsel', ignore_exact('feq', a, 0.0), 0.0, 'mb')), ('fmulz', 'ma', 'mb'), has_fmulz), {'ma' : a, 'mb' : b}), + # (b!=0.0 ? a : 0.0) * (a==0.0 ? 0.0 : b) -> fmulz(a, b) + *add_fabs_fneg((('fmul@32(nsz)', ('bcsel', ignore_exact('fneu', b, 0.0), 'ma', 0.0), ('bcsel', ignore_exact('feq', a, 0.0), 0.0, 'mb')), + ('fmulz', 'ma', 'mb'), has_fmulz), {'ma' : a, 'mb' : b}), + # (b!=0.0 ? a : 0.0) * (a!=0.0 ? b : 0.0) -> fmulz(a, b) + *add_fabs_fneg((('fmul@32(nsz)', ('bcsel', ignore_exact('fneu', b, 0.0), 'ma', 0.0), ('bcsel', ignore_exact('fneu', a, 0.0), 'mb', 0.0)), + ('fmulz', 'ma', 'mb'), has_fmulz), {'ma' : a, 'mb' : b}), + + # (min(abs(a), abs(b)) == 0.0 ? 0.0 : a * b) -> fmulz(a,b) + *add_fabs_fneg((('bcsel', ('feq', ('fmin', ('fabs', a), ('fabs', b)), 0.0), 0.0, ('fmul@32', 'ma', 'mb')), + ('fmulz', 'ma', 'mb'), has_fmulz), {'ma': a, 'mb': b}), + + # a * (a == 0.0 ? 0.0 : b(is_non_const_zero)) *add_fabs_fneg((('fmul@32(nsz)', 'ma', ('bcsel', ignore_exact('feq', a, 0.0), 0.0, '#b(is_not_const_zero)')), ('fmulz', 'ma', b), has_fmulz), {'ma' : a}),