nir/algebraic: add lowering for fsign
authorErico Nunes <nunes.erico@gmail.com>
Tue, 16 Apr 2019 20:49:41 +0000 (22:49 +0200)
committerEric Anholt <eric@anholt.net>
Fri, 19 Apr 2019 15:42:23 +0000 (15:42 +0000)
The mali utgard pp doesn't support a sign instruction.
In the ARM offline shader compiler, the sign function is implemented
using sub(gt(0.0, a), lt(0.0, a)).
This is a generic optimization, so implement it in the nir level when
lower_fsign is set, alongside the lowering for isign.

Signed-off-by: Erico Nunes <nunes.erico@gmail.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/compiler/nir/nir.h
src/compiler/nir/nir_opt_algebraic.py

index 2a381d28d7cd7f08a1dfee57b49ddd8770ea3bf8..c79dcecafc495ee2b5a9a69535506d7bf50020d8 100644 (file)
@@ -2242,6 +2242,9 @@ typedef struct nir_shader_compiler_options {
    /** enables rules to lower isign to imin+imax */
    bool lower_isign;
 
+   /** enables rules to lower fsign to fsub and flt */
+   bool lower_fsign;
+
    /* Does the native fdot instruction replicate its result for four
     * components?  If so, then opt_algebraic_late will turn all fdotN
     * instructions into fdot_replicatedN instructions.
index b0914aca3959605085382f9235866ae9609c6fa8..dad0545594f07f24aab5ad04f813fb8dae311f2d 100644 (file)
@@ -840,6 +840,7 @@ optimizations.extend([
      'options->lower_unpack_snorm_4x8'),
 
    (('isign', a), ('imin', ('imax', a, -1), 1), 'options->lower_isign'),
+   (('fsign', a), ('fsub', ('b2f', ('flt', 0.0, a)), ('b2f', ('flt', a, 0.0))), 'options->lower_fsign'),
 ])
 
 # bit_size dependent lowerings