diff options
author | martynas <martynas@openbsd.org> | 2013-11-12 21:07:15 +0000 |
---|---|---|
committer | martynas <martynas@openbsd.org> | 2013-11-12 21:07:15 +0000 |
commit | 7eebeddebb2c15d35615f19f709954b806e079e2 (patch) | |
tree | 68741ab269fcae2849613c39cca45630aea48062 | |
parent | remove dead files (diff) | |
download | wireguard-openbsd-7eebeddebb2c15d35615f19f709954b806e079e2.tar.xz wireguard-openbsd-7eebeddebb2c15d35615f19f709954b806e079e2.zip |
Trick the compiler that volatile temporary is used while raising
the underflow.
-rw-r--r-- | lib/libm/src/ld80/s_nextafterl.c | 4 | ||||
-rw-r--r-- | lib/libm/src/ld80/s_nexttoward.c | 4 | ||||
-rw-r--r-- | lib/libm/src/s_nexttowardf.c | 4 |
3 files changed, 12 insertions, 0 deletions
diff --git a/lib/libm/src/ld80/s_nextafterl.c b/lib/libm/src/ld80/s_nextafterl.c index d4d16a7d1c0..9187e44f7bf 100644 --- a/lib/libm/src/ld80/s_nextafterl.c +++ b/lib/libm/src/ld80/s_nextafterl.c @@ -79,6 +79,10 @@ nextafterl(long double x, long double y) if(esy==0x7fff) return x+x; /* overflow */ if(esy==0) { volatile long double u = x*x; /* underflow */ + if(u==x) { + SET_LDOUBLE_WORDS(x,esx,hx,lx); + return x; + } } SET_LDOUBLE_WORDS(x,esx,hx,lx); return x; diff --git a/lib/libm/src/ld80/s_nexttoward.c b/lib/libm/src/ld80/s_nexttoward.c index d85c97ef61a..a9d6773dcf7 100644 --- a/lib/libm/src/ld80/s_nexttoward.c +++ b/lib/libm/src/ld80/s_nexttoward.c @@ -76,6 +76,10 @@ nexttoward(double x, long double y) } if(hy<0x00100000) { volatile double u = x*x; /* underflow */ + if(u==x) { + INSERT_WORDS(x,hx,lx); + return x; + } } INSERT_WORDS(x,hx,lx); return x; diff --git a/lib/libm/src/s_nexttowardf.c b/lib/libm/src/s_nexttowardf.c index ee22018343d..5e5749acd0d 100644 --- a/lib/libm/src/s_nexttowardf.c +++ b/lib/libm/src/s_nexttowardf.c @@ -68,6 +68,10 @@ nexttowardf(float x, long double y) } if(hy<0x00800000) { volatile float u = x*x; /* underflow */ + if(u==x) { + SET_FLOAT_WORD(x,hx); + return x; + } } SET_FLOAT_WORD(x,hx); return x; |