summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormartynas <martynas@openbsd.org>2013-11-12 21:07:15 +0000
committermartynas <martynas@openbsd.org>2013-11-12 21:07:15 +0000
commit7eebeddebb2c15d35615f19f709954b806e079e2 (patch)
tree68741ab269fcae2849613c39cca45630aea48062
parentremove dead files (diff)
downloadwireguard-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.c4
-rw-r--r--lib/libm/src/ld80/s_nexttoward.c4
-rw-r--r--lib/libm/src/s_nexttowardf.c4
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;