diff options
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/i386/fpu/s_asinh.S | 11 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_asinhf.S | 11 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_asinhl.S | 7 | ||||
-rw-r--r-- | sysdeps/ieee754/dbl-64/s_asinh.c | 6 | ||||
-rw-r--r-- | sysdeps/ieee754/flt-32/s_asinhf.c | 6 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128/s_asinhl.c | 6 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128ibm/s_asinhl.c | 6 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-96/s_asinhl.c | 6 |
8 files changed, 56 insertions, 3 deletions
diff --git a/sysdeps/i386/fpu/s_asinh.S b/sysdeps/i386/fpu/s_asinh.S index e4c0c676a6..7123772dee 100644 --- a/sysdeps/i386/fpu/s_asinh.S +++ b/sysdeps/i386/fpu/s_asinh.S @@ -100,7 +100,16 @@ ENTRY(__asinh) 4: fld %st // x : x faddl MO(huge) // huge+x : x fstp %st(0) // x - ret + cmpl $0x00100000, %eax + jae 8f + subl $8, %esp + cfi_adjust_cfa_offset (8) + fld %st(0) + fmul %st(0) + fstpl (%esp) + addl $8, %esp + cfi_adjust_cfa_offset (-8) +8: ret // |x| > 2^28 => y = sign(x) * (log(|x|) + log(2)) .align ALIGNARG(4) diff --git a/sysdeps/i386/fpu/s_asinhf.S b/sysdeps/i386/fpu/s_asinhf.S index b1a28e7ac1..77ebae46ec 100644 --- a/sysdeps/i386/fpu/s_asinhf.S +++ b/sysdeps/i386/fpu/s_asinhf.S @@ -100,7 +100,16 @@ ENTRY(__asinhf) 4: fld %st // x : x faddl MO(huge) // huge+x : x fstp %st(0) // x - ret + cmpl $0x00800000, %eax + jae 8f + subl $4, %esp + cfi_adjust_cfa_offset (4) + fld %st(0) + fmul %st(0) + fstps (%esp) + addl $4, %esp + cfi_adjust_cfa_offset (-4) +8: ret // |x| > 2^14 => y = sign(x) * (log(|x|) + log(2)) .align ALIGNARG(4) diff --git a/sysdeps/i386/fpu/s_asinhl.S b/sysdeps/i386/fpu/s_asinhl.S index 6a5defed38..8799da6e53 100644 --- a/sysdeps/i386/fpu/s_asinhl.S +++ b/sysdeps/i386/fpu/s_asinhl.S @@ -108,7 +108,12 @@ ENTRY(__asinhl) fldt MO(huge) // huge : x : x faddp // huge+x : x fstp %st(0) // x - ret + cmpl $0x0001, %eax + jae 8f + fld %st(0) + fmul %st(0) + fstp %st(0) +8: ret // |x| > 2^34 => y = sign(x) * (log(|x|) + log(2)) .align ALIGNARG(4) diff --git a/sysdeps/ieee754/dbl-64/s_asinh.c b/sysdeps/ieee754/dbl-64/s_asinh.c index a33758d3c9..ebe471015b 100644 --- a/sysdeps/ieee754/dbl-64/s_asinh.c +++ b/sysdeps/ieee754/dbl-64/s_asinh.c @@ -21,6 +21,7 @@ * := sign(x)*log1p(|x| + x^2/(1 + sqrt(1+x^2))) */ +#include <float.h> #include <math.h> #include <math_private.h> @@ -38,6 +39,11 @@ __asinh (double x) ix = hx & 0x7fffffff; if (__glibc_unlikely (ix < 0x3e300000)) /* |x|<2**-28 */ { + if (fabs (x) < DBL_MIN) + { + double force_underflow = x * x; + math_force_eval (force_underflow); + } if (huge + x > one) return x; /* return x inexact except 0 */ } diff --git a/sysdeps/ieee754/flt-32/s_asinhf.c b/sysdeps/ieee754/flt-32/s_asinhf.c index b7fa2b4443..697faa843c 100644 --- a/sysdeps/ieee754/flt-32/s_asinhf.c +++ b/sysdeps/ieee754/flt-32/s_asinhf.c @@ -13,6 +13,7 @@ * ==================================================== */ +#include <float.h> #include <math.h> #include <math_private.h> @@ -29,6 +30,11 @@ __asinhf(float x) GET_FLOAT_WORD(hx,x); ix = hx&0x7fffffff; if(__builtin_expect(ix< 0x38000000, 0)) { /* |x|<2**-14 */ + if (fabsf (x) < FLT_MIN) + { + float force_underflow = x * x; + math_force_eval (force_underflow); + } if(huge+x>one) return x; /* return x inexact except 0 */ } if(__builtin_expect(ix>0x47000000, 0)) { /* |x| > 2**14 */ diff --git a/sysdeps/ieee754/ldbl-128/s_asinhl.c b/sysdeps/ieee754/ldbl-128/s_asinhl.c index e5a3636beb..8d5721a73c 100644 --- a/sysdeps/ieee754/ldbl-128/s_asinhl.c +++ b/sysdeps/ieee754/ldbl-128/s_asinhl.c @@ -29,6 +29,7 @@ static char rcsid[] = "$NetBSD: $"; * := signl(x)*log1pl(|x| + x^2/(1 + sqrtl(1+x^2))) */ +#include <float.h> #include <math.h> #include <math_private.h> @@ -51,6 +52,11 @@ __asinhl (long double x) return x + x; /* x is inf or NaN */ if (ix < 0x3fc70000) { /* |x| < 2^ -56 */ + if (fabsl (x) < LDBL_MIN) + { + long double force_underflow = x * x; + math_force_eval (force_underflow); + } if (huge + x > one) return x; /* return x inexact except 0 */ } diff --git a/sysdeps/ieee754/ldbl-128ibm/s_asinhl.c b/sysdeps/ieee754/ldbl-128ibm/s_asinhl.c index b76e114317..dda7f780fc 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_asinhl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_asinhl.c @@ -25,6 +25,7 @@ static char rcsid[] = "$NetBSD: s_asinh.c,v 1.9 1995/05/12 04:57:37 jtc Exp $"; * := sign(x)*log1p(|x| + x^2/(1 + sqrt(1+x^2))) */ +#include <float.h> #include <math.h> #include <math_private.h> #include <math_ldbl_opt.h> @@ -45,6 +46,11 @@ long double __asinhl(long double x) ix = hx&0x7fffffffffffffffLL; if(ix>=0x7ff0000000000000LL) return x+x; /* x is inf or NaN */ if(ix< 0x3c70000000000000LL) { /* |x|<2**-56 */ + if (fabsl (x) < LDBL_MIN) + { + long double force_underflow = x * x; + math_force_eval (force_underflow); + } if(huge+x>one) return x; /* return x inexact except 0 */ } if(ix>0x4370000000000000LL) { /* |x| > 2**56 */ diff --git a/sysdeps/ieee754/ldbl-96/s_asinhl.c b/sysdeps/ieee754/ldbl-96/s_asinhl.c index 5e679bd719..75e47c71ea 100644 --- a/sysdeps/ieee754/ldbl-96/s_asinhl.c +++ b/sysdeps/ieee754/ldbl-96/s_asinhl.c @@ -29,6 +29,7 @@ static char rcsid[] = "$NetBSD: $"; * := signl(x)*log1pl(|x| + x^2/(1 + sqrtl(1+x^2))) */ +#include <float.h> #include <math.h> #include <math_private.h> @@ -44,6 +45,11 @@ long double __asinhl(long double x) GET_LDOUBLE_EXP(hx,x); ix = hx&0x7fff; if(__builtin_expect(ix< 0x3fde, 0)) { /* |x|<2**-34 */ + if (fabsl (x) < LDBL_MIN) + { + long double force_underflow = x * x; + math_force_eval (force_underflow); + } if(huge+x>one) return x; /* return x inexact except 0 */ } if(__builtin_expect(ix>0x4020,0)) { /* |x| > 2**34 */ |