diff options
Diffstat (limited to 'libm/upstream-freebsd/lib/msun/src/s_fma.c')
-rw-r--r-- | libm/upstream-freebsd/lib/msun/src/s_fma.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/libm/upstream-freebsd/lib/msun/src/s_fma.c b/libm/upstream-freebsd/lib/msun/src/s_fma.c index dfbd13c..452bece 100644 --- a/libm/upstream-freebsd/lib/msun/src/s_fma.c +++ b/libm/upstream-freebsd/lib/msun/src/s_fma.c @@ -238,6 +238,8 @@ fma(double x, double y, double z) zs = copysign(DBL_MIN, zs); fesetround(FE_TONEAREST); + /* work around clang bug 8100 */ + volatile double vxs = xs; /* * Basic approach for round-to-nearest: @@ -247,7 +249,7 @@ fma(double x, double y, double z) * adj = xy.lo + r.lo (inexact; low bit is sticky) * result = r.hi + adj (correctly rounded) */ - xy = dd_mul(xs, ys); + xy = dd_mul(vxs, ys); r = dd_add(xy.hi, zs); spread = ex + ey; @@ -268,7 +270,9 @@ fma(double x, double y, double z) * rounding modes. */ fesetround(oround); - adj = r.lo + xy.lo; + /* work around clang bug 8100 */ + volatile double vrlo = r.lo; + adj = vrlo + xy.lo; return (ldexp(r.hi + adj, spread)); } |