nir/algebraic: add lowering for fsign
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>
This commit is contained in:
@@ -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.
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user