diff options
author | Richard Henderson <rth@twiddle.net> | 2012-03-10 08:53:05 -0800 |
---|---|---|
committer | Richard Henderson <rth@twiddle.net> | 2012-03-19 06:50:41 -0700 |
commit | 0fe0f1f86f82f9e08ca4d4b85111de03f4c2f876 (patch) | |
tree | b7daee8ebf19cc6f493921a1862408ef166b6b14 /sysdeps/ieee754/dbl-64/s_fma.c | |
parent | eb92c487b35e26aa1e08815c4480d0bc5cc9f370 (diff) | |
download | glibc-0fe0f1f86f82f9e08ca4d4b85111de03f4c2f876.tar glibc-0fe0f1f86f82f9e08ca4d4b85111de03f4c2f876.tar.gz glibc-0fe0f1f86f82f9e08ca4d4b85111de03f4c2f876.tar.bz2 glibc-0fe0f1f86f82f9e08ca4d4b85111de03f4c2f876.zip |
Create and use libc_feupdateenv_test.
We can reduce the number of STMXCSR, and often we can avoid the
call to __feraiseexcept.
Diffstat (limited to 'sysdeps/ieee754/dbl-64/s_fma.c')
-rw-r--r-- | sysdeps/ieee754/dbl-64/s_fma.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/sysdeps/ieee754/dbl-64/s_fma.c b/sysdeps/ieee754/dbl-64/s_fma.c index a27e246a49..ab20a801a4 100644 --- a/sysdeps/ieee754/dbl-64/s_fma.c +++ b/sysdeps/ieee754/dbl-64/s_fma.c @@ -149,35 +149,36 @@ __fma (double x, double y, double z) fenv_t env; libc_feholdexcept_setround (&env, FE_TOWARDZERO); + /* Perform m2 + a2 addition with round to odd. */ u.d = a2 + m2; + if (__builtin_expect (adjust < 0, 0)) + { + if ((u.ieee.mantissa1 & 1) == 0) + u.ieee.mantissa1 |= libc_fetestexcept (FE_INEXACT) != 0; + v.d = a1 + u.d; + } + + /* Reset rounding mode and test for inexact simultaneously. */ + int j = libc_feupdateenv_test (&env, FE_INEXACT) != 0; + if (__builtin_expect (adjust == 0, 1)) { if ((u.ieee.mantissa1 & 1) == 0 && u.ieee.exponent != 0x7ff) - u.ieee.mantissa1 |= libc_fetestexcept (FE_INEXACT) != 0; - libc_feupdateenv (&env); + u.ieee.mantissa1 |= j; /* Result is a1 + u.d. */ return a1 + u.d; } else if (__builtin_expect (adjust > 0, 1)) { if ((u.ieee.mantissa1 & 1) == 0 && u.ieee.exponent != 0x7ff) - u.ieee.mantissa1 |= libc_fetestexcept (FE_INEXACT) != 0; - libc_feupdateenv (&env); + u.ieee.mantissa1 |= j; /* Result is a1 + u.d, scaled up. */ return (a1 + u.d) * 0x1p53; } else { - if ((u.ieee.mantissa1 & 1) == 0) - u.ieee.mantissa1 |= libc_fetestexcept (FE_INEXACT) != 0; - v.d = a1 + u.d; - int j = libc_fetestexcept (FE_INEXACT) != 0; - libc_feupdateenv (&env); - /* Ensure the following computations are performed in default rounding - mode instead of just reusing the round to zero computation. */ - asm volatile ("" : "=m" (u) : "m" (u)); /* If a1 + u.d is exact, the only rounding happens during scaling down. */ if (j == 0) |