diff options
Diffstat (limited to 'sysdeps/ieee754/ldbl-96/s_fma.c')
-rw-r--r-- | sysdeps/ieee754/ldbl-96/s_fma.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/sysdeps/ieee754/ldbl-96/s_fma.c b/sysdeps/ieee754/ldbl-96/s_fma.c index ab45bcfce2..986879cda5 100644 --- a/sysdeps/ieee754/ldbl-96/s_fma.c +++ b/sysdeps/ieee754/ldbl-96/s_fma.c @@ -1,5 +1,5 @@ /* Compute x * y + z as ternary operation. - Copyright (C) 2010-2016 Free Software Foundation, Inc. + Copyright (C) 2010-2018 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek <jakub@redhat.com>, 2010. @@ -21,7 +21,9 @@ #include <math.h> #include <fenv.h> #include <ieee754.h> +#include <math-barriers.h> #include <math_private.h> +#include <libm-alias-double.h> /* This implementation uses rounding to odd to avoid problems with double rounding. See a paper by Boldo and Melquiond: @@ -30,14 +32,12 @@ double __fma (double x, double y, double z) { - if (__glibc_unlikely (isinf (z))) - { - /* If z is Inf, but x and y are finite, the result should be - z rather than NaN. */ - if (isfinite (x) && isfinite (y)) - return (z + x) + y; - return (x * y) + z; - } + if (__glibc_unlikely (!isfinite (x) || !isfinite (y))) + return x * y + z; + else if (__glibc_unlikely (!isfinite (z))) + /* If z is Inf, but x and y are finite, the result should be z + rather than NaN. */ + return (z + x) + y; /* Ensure correct sign of exact 0 + 0. */ if (__glibc_unlikely ((x == 0 || y == 0) && z == 0)) @@ -97,5 +97,5 @@ __fma (double x, double y, double z) return u.d; } #ifndef __fma -weak_alias (__fma, fma) +libm_alias_double (__fma, fma) #endif |