diff options
-rw-r--r-- | ChangeLog | 60 | ||||
-rw-r--r-- | sysdeps/i386/fpu/e_asin.S | 25 | ||||
-rw-r--r-- | sysdeps/i386/fpu/e_asinf.S | 23 | ||||
-rw-r--r-- | sysdeps/i386/fpu/e_atan2.S | 27 | ||||
-rw-r--r-- | sysdeps/i386/fpu/e_atan2f.S | 27 | ||||
-rw-r--r-- | sysdeps/i386/fpu/e_atanh.S | 22 | ||||
-rw-r--r-- | sysdeps/i386/fpu/e_atanhf.S | 22 | ||||
-rw-r--r-- | sysdeps/i386/fpu/e_exp2l.S | 21 | ||||
-rw-r--r-- | sysdeps/i386/fpu/e_expl.S | 19 | ||||
-rw-r--r-- | sysdeps/i386/fpu/i386-math-asm.h | 168 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_atan.S | 25 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_atanf.S | 25 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_expm1.S | 24 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_expm1f.S | 24 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_log1p.S | 45 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_log1pf.S | 45 | ||||
-rw-r--r-- | sysdeps/i386/fpu/s_log1pl.S | 18 |
17 files changed, 304 insertions, 316 deletions
diff --git a/ChangeLog b/ChangeLog index df079ca412..dbe8c77d3b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,65 @@ 2015-09-24 Joseph Myers <joseph@codesourcery.com> + * sysdeps/i386/fpu/i386-math-asm.h (DEFINE_LDBL_MIN): New macro. + (FLT_CHECK_FORCE_UFLOW): Likewise. + (DBL_CHECK_FORCE_UFLOW): Likewise. + (FLT_CHECK_FORCE_UFLOW_NARROW): Likewise. + (DBL_CHECK_FORCE_UFLOW_NARROW): Likewise. + (LDBL_CHECK_FORCE_UFLOW_NONNEG_NAN): Likewise. + (FLT_CHECK_FORCE_UFLOW_NONNAN): Likewise. + (DBL_CHECK_FORCE_UFLOW_NONNAN): Likewise. + (FLT_CHECK_FORCE_UFLOW_NONNEG): Likewise. + (DBL_CHECK_FORCE_UFLOW_NONNEG): Likewise. + (LDBL_CHECK_FORCE_UFLOW_NONNEG): Likewise. + * sysdeps/i386/fpu/e_asin.S: Include <i386-math-asm.h>. + (dbl_min): Replace with use of DEFINE_DBL_MIN. + (__ieee754_asin): Use DBL_CHECK_FORCE_UFLOW. + * sysdeps/i386/fpu/e_asinf.S: Include <i386-math-asm.h>. + (flt_min): Replace with use of DEFINE_FLT_MIN. + (__ieee754_asinf): Use FLT_CHECK_FORCE_UFLOW. + * sysdeps/i386/fpu/e_atan2.S: Include <i386-math-asm.h>. + (dbl_min): Replace with use of DEFINE_DBL_MIN. + (__ieee754_atan2): Use DBL_CHECK_FORCE_UFLOW_NARROW. + * sysdeps/i386/fpu/e_atan2f.S: Include <i386-math-asm.h>. + (flt_min): Replace with use of DEFINE_FLT_MIN. + (__ieee754_atan2f): Use FLT_CHECK_FORCE_UFLOW_NARROW. + * sysdeps/i386/fpu/e_atanh.S: Include <i386-math-asm.h>. + (dbl_min): Replace with use of DEFINE_DBL_MIN. + (__ieee754_atanh): Use DBL_CHECK_FORCE_UFLOW_NONNEG. + * sysdeps/i386/fpu/e_atanhf.S: Include <i386-math-asm.h>. + (flt_min): Replace with use of DEFINE_FLT_MIN. + (__ieee754_atanhf): Use FLT_CHECK_FORCE_UFLOW_NONNEG. + * sysdeps/i386/fpu/e_exp2l.S: Include <i386-math-asm.h>. + (ldbl_min): Replace with use of DEFINE_LDBL_MIN. + (__ieee754_exp2l): Use LDBL_CHECK_FORCE_UFLOW_NONNEG_NAN. + * sysdeps/i386/fpu/e_expl.S: Include <i386-math-asm.h>. + [!USE_AS_EXPM1L] (cmin): Replace with use of DEFINE_LDBL_MIN. + (IEEE754_EXPL): Use LDBL_CHECK_FORCE_UFLOW_NONNEG. + * sysdeps/i386/fpu/s_atan.S: Include <i386-math-asm.h>. + (dbl_min): Replace with use of DEFINE_DBL_MIN. + (__atan): Use DBL_CHECK_FORCE_UFLOW. + * sysdeps/i386/fpu/s_atanf.S: Include <i386-math-asm.h>. + (flt_min): Replace with use of DEFINE_FLT_MIN. + (__atanf): Use FLT_CHECK_FORCE_UFLOW. + * sysdeps/i386/fpu/s_expm1.S: Include <i386-math-asm.h>. + (dbl_min): Replace with use of DEFINE_DBL_MIN. + (__expm1): Use DBL_CHECK_FORCE_UFLOW. Move underflow check after + main computation. + * sysdeps/i386/fpu/s_expm1f.S: Include <i386-math-asm.h>. + (flt_min): Replace with use of DEFINE_FLT_MIN. + (__expm1f): Use FLT_CHECK_FORCE_UFLOW. Move underflow check after + main computation. + * sysdeps/i386/fpu/s_log1p.S: Include <i386-math-asm.h>. + (dbl_min): Replace with use of DEFINE_DBL_MIN. + (MO): New macro. + (__log1p): Use MO. Use DBL_CHECK_FORCE_UFLOW_NONNAN. + * sysdeps/i386/fpu/s_log1pf.S: Include <i386-math-asm.h>. + (flt_min): Replace with use of DEFINE_FLT_MIN. + (MO): New macro. + (__log1pf): Use MO. Use FLT_CHECK_FORCE_UFLOW_NONNAN. + * sysdeps/i386/fpu/s_log1pl.S (MO): New macro. + (__log1pl): Use MO. + [BZ #19003] * sysdeps/x86_64/fpu/multiarch/Makefile (CFLAGS-e_pow-fma4.c): Add $(config-cflags-nofma). diff --git a/sysdeps/i386/fpu/e_asin.S b/sysdeps/i386/fpu/e_asin.S index ea8cb6f1b2..39c8b47da4 100644 --- a/sysdeps/i386/fpu/e_asin.S +++ b/sysdeps/i386/fpu/e_asin.S @@ -4,15 +4,11 @@ */ #include <machine/asm.h> +#include <i386-math-asm.h> RCSID("$NetBSD: e_asin.S,v 1.4 1995/05/08 23:45:40 jtc Exp $") - .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) +DEFINE_DBL_MIN #ifdef PIC # define MO(op) op##@GOTOFF(%ecx) @@ -36,20 +32,7 @@ ENTRY(__ieee754_asin) fmulp /* 1 - x^2 */ fsqrt /* sqrt (1 - x^2) */ fpatan - fldl MO(dbl_min) - fld %st(1) - fabs - fucompp - fnstsw - sahf - jnc 1f - subl $8, %esp - cfi_adjust_cfa_offset (8) - fld %st(0) - fmul %st(0) - fstpl (%esp) - addl $8, %esp - cfi_adjust_cfa_offset (-8) -1: ret + DBL_CHECK_FORCE_UFLOW + ret END (__ieee754_asin) strong_alias (__ieee754_asin, __asin_finite) diff --git a/sysdeps/i386/fpu/e_asinf.S b/sysdeps/i386/fpu/e_asinf.S index f7bda77fa6..1102bdedfd 100644 --- a/sysdeps/i386/fpu/e_asinf.S +++ b/sysdeps/i386/fpu/e_asinf.S @@ -5,15 +5,13 @@ */ #include <machine/asm.h> +#include <i386-math-asm.h> RCSID("$NetBSD: $") .section .rodata.cst4,"aM",@progbits,4 - .p2align 2 - .type flt_min,@object -flt_min: .byte 0, 0, 0x80, 0 - ASM_SIZE_DIRECTIVE(flt_min) +DEFINE_FLT_MIN #ifdef PIC # define MO(op) op##@GOTOFF(%ecx) @@ -35,20 +33,7 @@ ENTRY(__ieee754_asinf) fsubp /* 1 - x^2 */ fsqrt /* sqrt (1 - x^2) */ fpatan - flds MO(flt_min) - fld %st(1) - fabs - fucompp - fnstsw - sahf - jnc 1f - subl $4, %esp - cfi_adjust_cfa_offset (4) - fld %st(0) - fmul %st(0) - fstps (%esp) - addl $4, %esp - cfi_adjust_cfa_offset (-4) -1: ret + FLT_CHECK_FORCE_UFLOW + ret END (__ieee754_asinf) strong_alias (__ieee754_asinf, __asinf_finite) diff --git a/sysdeps/i386/fpu/e_atan2.S b/sysdeps/i386/fpu/e_atan2.S index 6f5481fb5c..25f43bb5a1 100644 --- a/sysdeps/i386/fpu/e_atan2.S +++ b/sysdeps/i386/fpu/e_atan2.S @@ -4,15 +4,11 @@ */ #include <machine/asm.h> +#include <i386-math-asm.h> RCSID("$NetBSD: e_atan2.S,v 1.4 1995/05/08 23:46:28 jtc Exp $") - .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) +DEFINE_DBL_MIN #ifdef PIC # define MO(op) op##@GOTOFF(%ecx) @@ -28,22 +24,7 @@ ENTRY(__ieee754_atan2) fldl 4(%esp) fldl 12(%esp) fpatan - fldl MO(dbl_min) - fld %st(1) - fabs - fucompp - fnstsw - sahf - jnc 1f - subl $8, %esp - cfi_adjust_cfa_offset (8) - fld %st(0) - fmul %st(0) - fstpl (%esp) - fstpl (%esp) - fldl (%esp) - addl $8, %esp - cfi_adjust_cfa_offset (-8) -1: ret + DBL_CHECK_FORCE_UFLOW_NARROW + ret END (__ieee754_atan2) strong_alias (__ieee754_atan2, __atan2_finite) diff --git a/sysdeps/i386/fpu/e_atan2f.S b/sysdeps/i386/fpu/e_atan2f.S index ec0eb3fd71..2bc909a762 100644 --- a/sysdeps/i386/fpu/e_atan2f.S +++ b/sysdeps/i386/fpu/e_atan2f.S @@ -4,15 +4,11 @@ */ #include <machine/asm.h> +#include <i386-math-asm.h> RCSID("$NetBSD: e_atan2f.S,v 1.1 1995/05/08 23:35:10 jtc Exp $") - .section .rodata.cst4,"aM",@progbits,4 - - .p2align 2 - .type flt_min,@object -flt_min: .byte 0, 0, 0x80, 0 - ASM_SIZE_DIRECTIVE(flt_min) +DEFINE_FLT_MIN #ifdef PIC # define MO(op) op##@GOTOFF(%ecx) @@ -28,22 +24,7 @@ ENTRY(__ieee754_atan2f) flds 4(%esp) flds 8(%esp) fpatan - flds MO(flt_min) - fld %st(1) - fabs - fucompp - fnstsw - sahf - jnc 1f - subl $4, %esp - cfi_adjust_cfa_offset (4) - fld %st(0) - fmul %st(0) - fstps (%esp) - fstps (%esp) - flds (%esp) - addl $4, %esp - cfi_adjust_cfa_offset (-4) -1: ret + FLT_CHECK_FORCE_UFLOW_NARROW + ret END (__ieee754_atan2f) strong_alias (__ieee754_atan2f, __atan2f_finite) diff --git a/sysdeps/i386/fpu/e_atanh.S b/sysdeps/i386/fpu/e_atanh.S index 90d19bc9d6..5772bbf802 100644 --- a/sysdeps/i386/fpu/e_atanh.S +++ b/sysdeps/i386/fpu/e_atanh.S @@ -18,6 +18,7 @@ <http://www.gnu.org/licenses/>. */ #include <machine/asm.h> +#include <i386-math-asm.h> .section .rodata @@ -35,12 +36,7 @@ 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) +DEFINE_DBL_MIN #ifdef PIC #define MO(op) op##@GOTOFF(%edx) @@ -88,18 +84,8 @@ ENTRY(__ieee754_atanh) sahf jae 4f fyl2xp1 // 0.5*ln2*ld(1+2*|x|+(2*|x|^2)/(1-|x|)) - 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 + DBL_CHECK_FORCE_UFLOW_NONNEG + 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 1c8969e5ec..6e4184908e 100644 --- a/sysdeps/i386/fpu/e_atanhf.S +++ b/sysdeps/i386/fpu/e_atanhf.S @@ -18,6 +18,7 @@ <http://www.gnu.org/licenses/>. */ #include <machine/asm.h> +#include <i386-math-asm.h> .section .rodata @@ -36,12 +37,7 @@ 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) +DEFINE_FLT_MIN #ifdef PIC #define MO(op) op##@GOTOFF(%edx) @@ -84,18 +80,8 @@ ENTRY(__ieee754_atanhf) sahf jae 4f fyl2xp1 // 0.5*ln2*ld(1+2*|x|+(2*|x|^2)/(1-|x|)) - 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 + FLT_CHECK_FORCE_UFLOW_NONNEG + jecxz 3f fchs // 0.5*ln2*ld(1+2*x+(2*x^2)/(1-x)) 3: ret diff --git a/sysdeps/i386/fpu/e_exp2l.S b/sysdeps/i386/fpu/e_exp2l.S index 9a5ff95a6c..c4cb73d589 100644 --- a/sysdeps/i386/fpu/e_exp2l.S +++ b/sysdeps/i386/fpu/e_exp2l.S @@ -5,13 +5,9 @@ */ #include <machine/asm.h> +#include <i386-math-asm.h> - .section .rodata.cst16,"aM",@progbits,16 - .p2align 4 - .type ldbl_min,@object -ldbl_min: .byte 0, 0, 0, 0, 0, 0, 0, 0x80, 0x1, 0 - .byte 0, 0, 0, 0, 0, 0 - ASM_SIZE_DIRECTIVE(ldbl_min) +DEFINE_LDBL_MIN #ifdef PIC # define MO(op) op##@GOTOFF(%ecx) @@ -52,17 +48,8 @@ ENTRY(__ieee754_exp2l) faddp /* 2^(fract(x)) */ fscale /* e^x */ fstp %st(1) - /* Ensure underflow for tiny result. */ - fldt MO(ldbl_min) - fld %st(1) - fucompp - fnstsw - sahf - jnc 4f - fld %st - fmul %st - fstp %st -4: ret + LDBL_CHECK_FORCE_UFLOW_NONNEG_NAN + ret 1: testl $0x200, %eax /* Test sign. */ jz 2f /* If positive, jump. */ diff --git a/sysdeps/i386/fpu/e_expl.S b/sysdeps/i386/fpu/e_expl.S index 711c86a6e8..64e0d96839 100644 --- a/sysdeps/i386/fpu/e_expl.S +++ b/sysdeps/i386/fpu/e_expl.S @@ -23,6 +23,7 @@ */ #include <machine/asm.h> +#include <i386-math-asm.h> #ifdef USE_AS_EXP10L # define IEEE754_EXPL __ieee754_exp10l @@ -65,10 +66,7 @@ c1: .byte 0x20, 0xfa, 0xee, 0xc2, 0x5f, 0x70, 0xa5, 0xec, 0xed, 0x3f csat: .byte 0, 0, 0, 0, 0, 0, 0, 0x80, 0x0e, 0x40 .byte 0, 0, 0, 0, 0, 0 ASM_SIZE_DIRECTIVE(csat) - .type cmin,@object -cmin: .byte 0, 0, 0, 0, 0, 0, 0, 0x80, 0x1, 0 - .byte 0, 0, 0, 0, 0, 0 - ASM_SIZE_DIRECTIVE(cmin) +DEFINE_LDBL_MIN #endif #ifdef PIC @@ -199,18 +197,9 @@ ENTRY(IEEE754_EXPL) fstp %st(1) /* 2 */ fscale /* 2 scale factor is st(1); base^x */ fstp %st(1) /* 1 */ - /* Ensure underflow for tiny result. */ - fldt MO(cmin) /* 2 cmin */ - fld %st(1) /* 3 */ - fcompp /* 1 */ - fnstsw - sahf - jnc 6f - fld %st - fmul %st - fstp %st + LDBL_CHECK_FORCE_UFLOW_NONNEG #endif -6: fstp %st(1) /* 0 */ + fstp %st(1) /* 0 */ jmp 2f 1: #ifdef USE_AS_EXPM1L diff --git a/sysdeps/i386/fpu/i386-math-asm.h b/sysdeps/i386/fpu/i386-math-asm.h index c15029d2ee..5d8d847cc3 100644 --- a/sysdeps/i386/fpu/i386-math-asm.h +++ b/sysdeps/i386/fpu/i386-math-asm.h @@ -52,6 +52,14 @@ flt_min: \ dbl_min: \ .byte 0, 0, 0, 0, 0, 0, 0x10, 0; \ .size dbl_min, .-dbl_min; +#define DEFINE_LDBL_MIN \ + .section .rodata.cst16,"aM",@progbits,16; \ + .p2align 4; \ + .type ldbl_min,@object; \ +ldbl_min: \ + .byte 0, 0, 0, 0, 0, 0, 0, 0x80, 0x1, 0; \ + .byte 0, 0, 0, 0, 0, 0; \ + .size ldbl_min, .-ldbl_min; /* Remove excess range and precision by storing a value on the stack and loading it back. The value is given to be nonnegative or NaN; @@ -123,4 +131,164 @@ dbl_min: \ addl $8, %esp; \ cfi_adjust_cfa_offset (-8); +/* Force an underflow exception if the given value is subnormal. The + relevant constant for the minimum of the type must have been + defined, the MO macro must have been defined for access to memory + operands, and, if PIC, the PIC register must have been loaded. */ +#define FLT_CHECK_FORCE_UFLOW \ + flds MO(flt_min); \ + fld %st(1); \ + fabs; \ + fucompp; \ + fnstsw; \ + sahf; \ + jnc 6424f; \ + subl $4, %esp; \ + cfi_adjust_cfa_offset (4); \ + fld %st(0); \ + fmul %st(0); \ + fstps (%esp); \ + addl $4, %esp; \ + cfi_adjust_cfa_offset (-4); \ +6424: +#define DBL_CHECK_FORCE_UFLOW \ + fldl MO(dbl_min); \ + fld %st(1); \ + fabs; \ + fucompp; \ + fnstsw; \ + sahf; \ + jnc 6453f; \ + subl $8, %esp; \ + cfi_adjust_cfa_offset (8); \ + fld %st(0); \ + fmul %st(0); \ + fstpl (%esp); \ + addl $8, %esp; \ + cfi_adjust_cfa_offset (-8); \ +6453: + +/* Likewise, but also remove excess range and precision if the value + is subnormal. */ +#define FLT_CHECK_FORCE_UFLOW_NARROW \ + flds MO(flt_min); \ + fld %st(1); \ + fabs; \ + fucompp; \ + fnstsw; \ + sahf; \ + jnc 6424f; \ + subl $4, %esp; \ + cfi_adjust_cfa_offset (4); \ + fld %st(0); \ + fmul %st(0); \ + fstps (%esp); \ + fstps (%esp); \ + flds (%esp); \ + addl $4, %esp; \ + cfi_adjust_cfa_offset (-4); \ +6424: +#define DBL_CHECK_FORCE_UFLOW_NARROW \ + fldl MO(dbl_min); \ + fld %st(1); \ + fabs; \ + fucompp; \ + fnstsw; \ + sahf; \ + jnc 6453f; \ + subl $8, %esp; \ + cfi_adjust_cfa_offset (8); \ + fld %st(0); \ + fmul %st(0); \ + fstpl (%esp); \ + fstpl (%esp); \ + fldl (%esp); \ + addl $8, %esp; \ + cfi_adjust_cfa_offset (-8); \ +6453: + +/* Likewise, but the argument is nonnegative or NaN. */ +#define LDBL_CHECK_FORCE_UFLOW_NONNEG_NAN \ + fldt MO(ldbl_min); \ + fld %st(1); \ + fucompp; \ + fnstsw; \ + sahf; \ + jnc 6464f; \ + fld %st(0); \ + fmul %st(0); \ + fstp %st(0); \ +6464: + +/* Likewise, but the argument is not a NaN. */ +#define FLT_CHECK_FORCE_UFLOW_NONNAN \ + fld %st(0); \ + fabs; \ + fcomps MO(flt_min); \ + fnstsw; \ + sahf; \ + jnc 6424f; \ + subl $4, %esp; \ + cfi_adjust_cfa_offset (4); \ + fld %st(0); \ + fmul %st(0); \ + fstps (%esp); \ + addl $4, %esp; \ + cfi_adjust_cfa_offset (-4); \ +6424: +#define DBL_CHECK_FORCE_UFLOW_NONNAN \ + fld %st(0); \ + fabs; \ + fcompl MO(dbl_min); \ + fnstsw; \ + sahf; \ + jnc 6453f; \ + subl $8, %esp; \ + cfi_adjust_cfa_offset (8); \ + fld %st(0); \ + fmul %st(0); \ + fstpl (%esp); \ + addl $8, %esp; \ + cfi_adjust_cfa_offset (-8); \ +6453: + +/* Likewise, but the argument is nonnegative and not a NaN. */ +#define FLT_CHECK_FORCE_UFLOW_NONNEG \ + fcoms MO(flt_min); \ + fnstsw; \ + sahf; \ + jnc 6424f; \ + subl $4, %esp; \ + cfi_adjust_cfa_offset (4); \ + fld %st(0); \ + fmul %st(0); \ + fstps (%esp); \ + addl $4, %esp; \ + cfi_adjust_cfa_offset (-4); \ +6424: +#define DBL_CHECK_FORCE_UFLOW_NONNEG \ + fcoml MO(dbl_min); \ + fnstsw; \ + sahf; \ + jnc 6453f; \ + subl $8, %esp; \ + cfi_adjust_cfa_offset (8); \ + fld %st(0); \ + fmul %st(0); \ + fstpl (%esp); \ + addl $8, %esp; \ + cfi_adjust_cfa_offset (-8); \ +6453: +#define LDBL_CHECK_FORCE_UFLOW_NONNEG \ + fldt MO(ldbl_min); \ + fld %st(1); \ + fcompp; \ + fnstsw; \ + sahf; \ + jnc 6464f; \ + fld %st(0); \ + fmul %st(0); \ + fstp %st(0); \ +6464: + #endif /* i386-math-asm.h. */ diff --git a/sysdeps/i386/fpu/s_atan.S b/sysdeps/i386/fpu/s_atan.S index c28b73ce75..644de78feb 100644 --- a/sysdeps/i386/fpu/s_atan.S +++ b/sysdeps/i386/fpu/s_atan.S @@ -4,15 +4,11 @@ */ #include <machine/asm.h> +#include <i386-math-asm.h> RCSID("$NetBSD: s_atan.S,v 1.4 1995/05/08 23:50:41 jtc Exp $") - .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) +DEFINE_DBL_MIN #ifdef PIC # define MO(op) op##@GOTOFF(%ecx) @@ -28,20 +24,7 @@ ENTRY(__atan) fldl 4(%esp) fld1 fpatan - fldl MO(dbl_min) - fld %st(1) - fabs - fucompp - fnstsw - sahf - jnc 1f - subl $8, %esp - cfi_adjust_cfa_offset (8) - fld %st(0) - fmul %st(0) - fstpl (%esp) - addl $8, %esp - cfi_adjust_cfa_offset (-8) -1: ret + DBL_CHECK_FORCE_UFLOW + ret END (__atan) weak_alias (__atan, atan) diff --git a/sysdeps/i386/fpu/s_atanf.S b/sysdeps/i386/fpu/s_atanf.S index da3c2a64b5..0589c1135e 100644 --- a/sysdeps/i386/fpu/s_atanf.S +++ b/sysdeps/i386/fpu/s_atanf.S @@ -4,15 +4,11 @@ */ #include <machine/asm.h> +#include <i386-math-asm.h> RCSID("$NetBSD: s_atanf.S,v 1.3 1995/05/08 23:51:33 jtc Exp $") - .section .rodata.cst4,"aM",@progbits,4 - - .p2align 2 - .type flt_min,@object -flt_min: .byte 0, 0, 0x80, 0 - ASM_SIZE_DIRECTIVE(flt_min) +DEFINE_FLT_MIN #ifdef PIC # define MO(op) op##@GOTOFF(%ecx) @@ -28,20 +24,7 @@ ENTRY(__atanf) flds 4(%esp) fld1 fpatan - flds MO(flt_min) - fld %st(1) - fabs - fucompp - fnstsw - sahf - jnc 1f - subl $4, %esp - cfi_adjust_cfa_offset (4) - fld %st(0) - fmul %st(0) - fstps (%esp) - addl $4, %esp - cfi_adjust_cfa_offset (-4) -1: ret + FLT_CHECK_FORCE_UFLOW + ret END (__atanf) weak_alias (__atanf, atanf) diff --git a/sysdeps/i386/fpu/s_expm1.S b/sysdeps/i386/fpu/s_expm1.S index 05e5285d7b..b4694c8e37 100644 --- a/sysdeps/i386/fpu/s_expm1.S +++ b/sysdeps/i386/fpu/s_expm1.S @@ -23,6 +23,7 @@ #include <sysdep.h> #include <machine/asm.h> +#include <i386-math-asm.h> .section .rodata @@ -37,12 +38,7 @@ one: .double 1.0 l2e: .tfloat 1.442695040888963407359924681002 ASM_SIZE_DIRECTIVE(l2e) - .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) +DEFINE_DBL_MIN #ifdef PIC #define MO(op) op##@GOTOFF(%edx) @@ -81,21 +77,6 @@ ENTRY(__expm1) #ifdef PIC LOAD_PIC_REG (dx) #endif - fld %st - fabs - fcoml MO(dbl_min) - fstp %st - fnstsw - sahf - jae 5f - subl $8, %esp - cfi_adjust_cfa_offset (8) - fld %st(0) - fmul %st(0) - fstpl (%esp) - addl $8, %esp - cfi_adjust_cfa_offset (-8) - ret 5: fldt MO(l2e) // log2(e) : x fmulp // log2(e)*x @@ -122,6 +103,7 @@ ENTRY(__expm1) fsubrl MO(one) // 1-2^int(log2(e)*x) : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) fstp %st(1) // 1-2^int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) fsubrp %st, %st(1) // 2^(log2(e)*x) + DBL_CHECK_FORCE_UFLOW ret 2: fstp %st diff --git a/sysdeps/i386/fpu/s_expm1f.S b/sysdeps/i386/fpu/s_expm1f.S index a83e435e22..5522902527 100644 --- a/sysdeps/i386/fpu/s_expm1f.S +++ b/sysdeps/i386/fpu/s_expm1f.S @@ -23,6 +23,7 @@ #include <sysdep.h> #include <machine/asm.h> +#include <i386-math-asm.h> .section .rodata @@ -37,12 +38,7 @@ one: .double 1.0 l2e: .tfloat 1.442695040888963407359924681002 ASM_SIZE_DIRECTIVE(l2e) - .section .rodata.cst4,"aM",@progbits,4 - - .p2align 2 - .type flt_min,@object -flt_min: .byte 0, 0, 0x80, 0 - ASM_SIZE_DIRECTIVE(flt_min) +DEFINE_FLT_MIN #ifdef PIC #define MO(op) op##@GOTOFF(%edx) @@ -81,21 +77,6 @@ ENTRY(__expm1f) #ifdef PIC LOAD_PIC_REG (dx) #endif - fld %st - fabs - fcoms MO(flt_min) - fstp %st - fnstsw - sahf - jae 5f - subl $4, %esp - cfi_adjust_cfa_offset (4) - fld %st(0) - fmul %st(0) - fstps (%esp) - addl $4, %esp - cfi_adjust_cfa_offset (-4) - ret 5: fldt MO(l2e) // log2(e) : x fmulp // log2(e)*x @@ -122,6 +103,7 @@ ENTRY(__expm1f) fsubrl MO(one) // 1-2^int(log2(e)*x) : int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) fstp %st(1) // 1-2^int(log2(e)*x) : 2^(log2(e)*x)-2^int(log2(e)*x) fsubrp %st, %st(1) // 2^(log2(e)*x) + FLT_CHECK_FORCE_UFLOW ret 2: fstp %st diff --git a/sysdeps/i386/fpu/s_log1p.S b/sysdeps/i386/fpu/s_log1p.S index c2559a3f18..7978e76095 100644 --- a/sysdeps/i386/fpu/s_log1p.S +++ b/sysdeps/i386/fpu/s_log1p.S @@ -4,6 +4,7 @@ */ #include <machine/asm.h> +#include <i386-math-asm.h> RCSID("$NetBSD: s_log1p.S,v 1.7 1995/05/09 00:10:58 jtc Exp $") @@ -17,12 +18,13 @@ RCSID("$NetBSD: s_log1p.S,v 1.7 1995/05/09 00:10:58 jtc Exp $") limit: .double 0.29 one: .double 1.0 - .section .rodata.cst8,"aM",@progbits,8 +DEFINE_DBL_MIN - .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 +# define MO(op) op +#endif /* * Use the fyl2xp1 function when the argument is in the range -0.29 to 0.29, @@ -44,43 +46,18 @@ ENTRY(__log1p) sahf jc 3f // in case x is NaN or ħInf 4: fabs -#ifdef PIC - fcompl limit@GOTOFF(%edx) -#else - fcompl limit -#endif + fcompl MO(limit) fnstsw sahf jc 2f -#ifdef PIC - faddl one@GOTOFF(%edx) -#else - faddl one -#endif + faddl MO(one) fyl2x ret 2: fyl2xp1 -#ifdef PIC - fldl dbl_min@GOTOFF(%edx) -#else - fldl dbl_min -#endif - fld %st(1) - fabs - fucompp - fnstsw - sahf - jnc 1f - subl $8, %esp - cfi_adjust_cfa_offset (8) - fld %st(0) - fmul %st(0) - fstpl (%esp) - addl $8, %esp - cfi_adjust_cfa_offset (-8) -1: ret + DBL_CHECK_FORCE_UFLOW_NONNAN + ret 3: jp 4b // in case x is ħInf fstp %st(1) diff --git a/sysdeps/i386/fpu/s_log1pf.S b/sysdeps/i386/fpu/s_log1pf.S index 8fca22e4ff..acaa299d94 100644 --- a/sysdeps/i386/fpu/s_log1pf.S +++ b/sysdeps/i386/fpu/s_log1pf.S @@ -4,6 +4,7 @@ */ #include <machine/asm.h> +#include <i386-math-asm.h> RCSID("$NetBSD: s_log1pf.S,v 1.4 1995/05/09 00:13:05 jtc Exp $") @@ -17,12 +18,13 @@ RCSID("$NetBSD: s_log1pf.S,v 1.4 1995/05/09 00:13:05 jtc Exp $") limit: .float 0.29 one: .float 1.0 - .section .rodata.cst4,"aM",@progbits,4 +DEFINE_FLT_MIN - .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 +# define MO(op) op +#endif /* * Use the fyl2xp1 function when the argument is in the range -0.29 to 0.29, @@ -44,43 +46,18 @@ ENTRY(__log1pf) sahf jc 3f // in case x is NaN or ħInf 4: fabs -#ifdef PIC - fcomps limit@GOTOFF(%edx) -#else - fcomps limit -#endif + fcomps MO(limit) fnstsw sahf jc 2f -#ifdef PIC - fadds one@GOTOFF(%edx) -#else - fadds one -#endif + fadds MO(one) fyl2x ret 2: fyl2xp1 -#ifdef PIC - flds flt_min@GOTOFF(%edx) -#else - flds flt_min -#endif - fld %st(1) - fabs - fucompp - fnstsw - sahf - jnc 1f - subl $4, %esp - cfi_adjust_cfa_offset (4) - fld %st(0) - fmul %st(0) - fstps (%esp) - addl $4, %esp - cfi_adjust_cfa_offset (-4) -1: ret + FLT_CHECK_FORCE_UFLOW_NONNAN + ret 3: jp 4b // in case x is ħInf fstp %st(1) diff --git a/sysdeps/i386/fpu/s_log1pl.S b/sysdeps/i386/fpu/s_log1pl.S index 8f87cf61c6..98965fa48c 100644 --- a/sysdeps/i386/fpu/s_log1pl.S +++ b/sysdeps/i386/fpu/s_log1pl.S @@ -22,6 +22,12 @@ limit: .tfloat 0.29 but it helps to optimize the code. */ one: .double 1.0 +#ifdef PIC +# define MO(op) op##@GOTOFF(%edx) +#else +# define MO(op) op +#endif + /* * Use the fyl2xp1 function when the argument is in the range -0.29 to 0.29, * otherwise fyl2x with the needed extra computation. @@ -43,11 +49,7 @@ ENTRY(__log1pl) jc 3f // in case x is NaN or ħInf 4: fabs -#ifdef PIC - fldt limit@GOTOFF(%edx) -#else - fldt limit -#endif + fldt MO(limit) fcompp fnstsw sahf @@ -58,11 +60,7 @@ ENTRY(__log1pl) cmpl $0xc040, %eax jae 5f -#ifdef PIC - faddl one@GOTOFF(%edx) -#else - faddl one -#endif + faddl MO(one) 5: fyl2x ret |