aboutsummaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/i386/fpu/e_atanh.S20
-rw-r--r--sysdeps/i386/fpu/e_atanhf.S20
-rw-r--r--sysdeps/ieee754/dbl-64/e_atanh.c6
-rw-r--r--sysdeps/ieee754/flt-32/e_atanhf.c6
-rw-r--r--sysdeps/ieee754/ldbl-128/e_atanhl.c11
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/e_atanhl.c11
-rw-r--r--sysdeps/ieee754/ldbl-96/e_atanhl.c6
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);