[Mesa-dev] [PATCH] nir: mark dsqrt/drsqrt/drcp implementation as exact

Connor Abbott cwabbott0 at gmail.com
Thu Apr 28 15:17:18 UTC 2016


The floating-point operations used to implement these have been
carefully chosen to minimize rounding error while still getting decent
performance. We don't want any optimizations to mess with them. While
this shouldn't affect anything now, it seems like a good idea.

Signed-off-by: Connor Abbott <cwabbott0 at gmail.com>
---
 src/compiler/nir/nir_lower_double_ops.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/compiler/nir/nir_lower_double_ops.c b/src/compiler/nir/nir_lower_double_ops.c
index 7505fa3..42b94bb 100644
--- a/src/compiler/nir/nir_lower_double_ops.c
+++ b/src/compiler/nir/nir_lower_double_ops.c
@@ -142,8 +142,10 @@ lower_rcp(nir_builder *b, nir_ssa_def *src)
     * See https://en.wikipedia.org/wiki/Division_algorithm for more details.
     */
 
+   b->exact = true;
    ra = nir_ffma(b, ra, nir_ffma(b, ra, src, nir_imm_double(b, -1)), ra);
    ra = nir_ffma(b, ra, nir_ffma(b, ra, src, nir_imm_double(b, -1)), ra);
+   b->exact = false;
 
    return fix_inv_result(b, ra, src, new_exp);
 }
@@ -267,6 +269,7 @@ lower_sqrt_rsq(nir_builder *b, nir_ssa_def *src, bool sqrt)
     * (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots).
     */
 
+    b->exact = true;
     nir_ssa_def *one_half = nir_imm_double(b, 0.5);
     nir_ssa_def *h_0 = nir_fmul(b, one_half, ra);
     nir_ssa_def *g_0 = nir_fmul(b, src, ra);
@@ -283,6 +286,7 @@ lower_sqrt_rsq(nir_builder *b, nir_ssa_def *src, bool sqrt)
                                    one_half);
        res = nir_ffma(b, y_1, r_1, y_1);
     }
+    b->exact = false;
 
     if (sqrt) {
        /* Here, the special cases we need to handle are
-- 
2.5.0



More information about the mesa-dev mailing list