diff options
author | Samuel Iglesias Gonsálvez <[email protected]> | 2018-07-10 12:04:38 +0200 |
---|---|---|
committer | Andres Gomez <[email protected]> | 2019-09-17 23:39:18 +0300 |
commit | 2abc6299bfa29d905046c7d198e3262fb19c0119 (patch) | |
tree | 897493300a9c75fa5ffe32da23b1ba0bad1165dc /src | |
parent | 1e0e3ed15a8cfb98a182714bcb3e55cfab5c3df7 (diff) |
nir: fix denorm flush-to-zero in sqrt's lowering at nir_lower_double_ops
v2:
- Replace hard coded value with DBL_MIN (Connor).
v3:
- Have into account the FLOAT_CONTROLS_DENORM_PRESERVE_FP64
flag (Caio).
Signed-off-by: Samuel Iglesias Gonsálvez <[email protected]>
Signed-off-by: Andres Gomez <[email protected]>
Reviewed-by: Connor Abbott <[email protected]> [v2]
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/nir/nir_lower_double_ops.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/compiler/nir/nir_lower_double_ops.c b/src/compiler/nir/nir_lower_double_ops.c index 45ac155de51..322ae49bacd 100644 --- a/src/compiler/nir/nir_lower_double_ops.c +++ b/src/compiler/nir/nir_lower_double_ops.c @@ -26,6 +26,8 @@ #include "nir_builder.h" #include "c99_math.h" +#include <float.h> + /* * Lowers some unsupported double operations, using only: * @@ -289,9 +291,20 @@ lower_sqrt_rsq(nir_builder *b, nir_ssa_def *src, bool sqrt) * 0 -> 0 and * +inf -> +inf */ - res = nir_bcsel(b, nir_ior(b, nir_feq(b, src, nir_imm_double(b, 0.0)), + const bool preserve_denorms = + b->shader->info.float_controls_execution_mode & + FLOAT_CONTROLS_DENORM_PRESERVE_FP64; + nir_ssa_def *src_flushed = src; + if (!preserve_denorms) { + src_flushed = nir_bcsel(b, + nir_flt(b, nir_fabs(b, src), + nir_imm_double(b, DBL_MIN)), + nir_imm_double(b, 0.0), + src); + } + res = nir_bcsel(b, nir_ior(b, nir_feq(b, src_flushed, nir_imm_double(b, 0.0)), nir_feq(b, src, nir_imm_double(b, INFINITY))), - src, res); + src_flushed, res); } else { res = fix_inv_result(b, res, src, new_exp); } |