diff options
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/i386/fpu/e_atanh.S | 20 | ||||
-rw-r--r-- | sysdeps/i386/fpu/e_atanhf.S | 20 | ||||
-rw-r--r-- | sysdeps/ieee754/dbl-64/e_atanh.c | 6 | ||||
-rw-r--r-- | sysdeps/ieee754/flt-32/e_atanhf.c | 6 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128/e_atanhl.c | 11 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128ibm/e_atanhl.c | 11 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-96/e_atanhl.c | 6 |
7 files changed, 76 insertions, 4 deletions
diff --git a/sysdeps/i386/fpu/e_atanh.S b/sysdeps/i386/fpu/e_atanh.S index 16e149b..90d19bc 100644 --- a/sysdeps/i386/fpu/e_atanh.S +++ b/sysdeps/i386/fpu/e_atanh.S @@ -35,6 +35,13 @@ limit: .double 0.29 ln2_2: .tfloat 0.3465735902799726547086160 ASM_SIZE_DIRECTIVE(ln2_2) + .section .rodata.cst8,"aM",@progbits,8 + + .p2align 3 + .type dbl_min,@object +dbl_min: .byte 0, 0, 0, 0, 0, 0, 0x10, 0 + ASM_SIZE_DIRECTIVE(dbl_min) + #ifdef PIC #define MO(op) op##@GOTOFF(%edx) #else @@ -81,7 +88,18 @@ ENTRY(__ieee754_atanh) sahf jae 4f fyl2xp1 // 0.5*ln2*ld(1+2*|x|+(2*|x|^2)/(1-|x|)) - jecxz 3f + fcoml MO(dbl_min) + fnstsw + sahf + 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: jecxz 3f fchs // 0.5*ln2*ld(1+2*x+(2*x^2)/(1-x)) 3: ret diff --git a/sysdeps/i386/fpu/e_atanhf.S b/sysdeps/i386/fpu/e_atanhf.S index 0021d9c..1c8969e 100644 --- a/sysdeps/i386/fpu/e_atanhf.S +++ b/sysdeps/i386/fpu/e_atanhf.S @@ -36,6 +36,13 @@ limit: .double 0.29 ln2_2: .tfloat 0.3465735902799726547086160 ASM_SIZE_DIRECTIVE(ln2_2) + .section .rodata.cst4,"aM",@progbits,4 + + .p2align 2 + .type flt_min,@object +flt_min: .byte 0, 0, 0x80, 0 + ASM_SIZE_DIRECTIVE(flt_min) + #ifdef PIC #define MO(op) op##@GOTOFF(%edx) #else @@ -77,7 +84,18 @@ ENTRY(__ieee754_atanhf) sahf jae 4f fyl2xp1 // 0.5*ln2*ld(1+2*|x|+(2*|x|^2)/(1-|x|)) - jecxz 3f + fcoms MO(flt_min) + fnstsw + sahf + jae 6f + subl $4, %esp + cfi_adjust_cfa_offset (4) + fld %st(0) + fmul %st(0) + fstps (%esp) + addl $4, %esp + cfi_adjust_cfa_offset (-4) +6: jecxz 3f fchs // 0.5*ln2*ld(1+2*x+(2*x^2)/(1-x)) 3: ret diff --git a/sysdeps/ieee754/dbl-64/e_atanh.c b/sysdeps/ieee754/dbl-64/e_atanh.c index b95399d..6b00b80 100644 --- a/sysdeps/ieee754/dbl-64/e_atanh.c +++ b/sysdeps/ieee754/dbl-64/e_atanh.c @@ -35,6 +35,7 @@ */ +#include <float.h> #include <inttypes.h> #include <math.h> #include <math_private.h> @@ -51,6 +52,11 @@ __ieee754_atanh (double x) if (__glibc_unlikely (xa < 0x1.0p-28)) { math_force_eval (huge + x); + if (fabs (x) < DBL_MIN) + { + double force_underflow = x * x; + math_force_eval (force_underflow); + } return x; } diff --git a/sysdeps/ieee754/flt-32/e_atanhf.c b/sysdeps/ieee754/flt-32/e_atanhf.c index a6d8bd1..bc74960 100644 --- a/sysdeps/ieee754/flt-32/e_atanhf.c +++ b/sysdeps/ieee754/flt-32/e_atanhf.c @@ -35,6 +35,7 @@ */ +#include <float.h> #include <inttypes.h> #include <math.h> #include <math_private.h> @@ -51,6 +52,11 @@ __ieee754_atanhf (float x) if (__glibc_unlikely (xa < 0x1.0p-28f)) { math_force_eval (huge + x); + if (fabsf (x) < FLT_MIN) + { + float force_underflow = x * x; + math_force_eval (force_underflow); + } return x; } diff --git a/sysdeps/ieee754/ldbl-128/e_atanhl.c b/sysdeps/ieee754/ldbl-128/e_atanhl.c index c5cceb5..a5a7ee0 100644 --- a/sysdeps/ieee754/ldbl-128/e_atanhl.c +++ b/sysdeps/ieee754/ldbl-128/e_atanhl.c @@ -32,6 +32,7 @@ * */ +#include <float.h> #include <math.h> #include <math_private.h> @@ -57,7 +58,15 @@ __ieee754_atanhl(long double x) else return (x-x)/(x-x); } - if(ix<0x3fc60000 && (huge+x)>zero) return x; /* x < 2^-57 */ + if(ix<0x3fc60000 && (huge+x)>zero) /* x < 2^-57 */ + { + if (fabsl (x) < LDBL_MIN) + { + long double force_underflow = x * x; + math_force_eval (force_underflow); + } + return x; + } if(ix<0x3ffe0000) { /* x < 0.5 */ t = u.value+u.value; diff --git a/sysdeps/ieee754/ldbl-128ibm/e_atanhl.c b/sysdeps/ieee754/ldbl-128ibm/e_atanhl.c index 5a98999..bcd1fce 100644 --- a/sysdeps/ieee754/ldbl-128ibm/e_atanhl.c +++ b/sysdeps/ieee754/ldbl-128ibm/e_atanhl.c @@ -28,6 +28,7 @@ * */ +#include <float.h> #include <math.h> #include <math_private.h> @@ -54,7 +55,15 @@ __ieee754_atanhl(long double x) if (t == one) return x/zero; } - if(ix<0x3c70000000000000LL&&(huge+x)>zero) return x; /* x<2**-56 */ + if(ix<0x3c70000000000000LL&&(huge+x)>zero) /* x<2**-56 */ + { + if (fabsl (x) < LDBL_MIN) + { + long double force_underflow = x * x; + math_force_eval (force_underflow); + } + return x; + } x = fabsl (x); if(ix<0x3fe0000000000000LL) { /* x < 0.5 */ t = x+x; diff --git a/sysdeps/ieee754/ldbl-96/e_atanhl.c b/sysdeps/ieee754/ldbl-96/e_atanhl.c index 305d50e..9a957c9 100644 --- a/sysdeps/ieee754/ldbl-96/e_atanhl.c +++ b/sysdeps/ieee754/ldbl-96/e_atanhl.c @@ -32,6 +32,7 @@ * */ +#include <float.h> #include <math.h> #include <math_private.h> @@ -54,6 +55,11 @@ __ieee754_atanhl(long double x) return x/zero; if(ix<0x3fdf) { math_force_eval(huge+x); + if (fabsl (x) < LDBL_MIN) + { + long double force_underflow = x * x; + math_force_eval (force_underflow); + } return x; /* x<2**-32 */ } SET_LDOUBLE_EXP(x,ix); |