diff options
Diffstat (limited to 'libm/upstream-freebsd/lib/msun/src/s_fmal.c')
-rw-r--r-- | libm/upstream-freebsd/lib/msun/src/s_fmal.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/libm/upstream-freebsd/lib/msun/src/s_fmal.c b/libm/upstream-freebsd/lib/msun/src/s_fmal.c index c2a6913..9271901 100644 --- a/libm/upstream-freebsd/lib/msun/src/s_fmal.c +++ b/libm/upstream-freebsd/lib/msun/src/s_fmal.c @@ -226,6 +226,8 @@ fmal(long double x, long double y, long double z) zs = copysignl(LDBL_MIN, zs); fesetround(FE_TONEAREST); + /* work around clang bug 8100 */ + volatile long double vxs = xs; /* * Basic approach for round-to-nearest: @@ -235,7 +237,7 @@ fmal(long double x, long double y, long 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; @@ -256,7 +258,9 @@ fmal(long double x, long double y, long double z) * rounding modes. */ fesetround(oround); - adj = r.lo + xy.lo; + /* work around clang bug 8100 */ + volatile long double vrlo = r.lo; + adj = vrlo + xy.lo; return (ldexpl(r.hi + adj, spread)); } |