diff options
author | Joseph Myers <joseph@codesourcery.com> | 2015-09-24 22:25:30 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2015-09-24 22:25:30 +0000 |
commit | b2a64460ba9aca39e92731da67cc6344acb483bc (patch) | |
tree | 213e279495212accf939a0d03c10e16c131963cc /sysdeps/x86_64/fpu/e_exp2l.S | |
parent | 1a19b8894f93878f99025096ec1d3b6af7db6f78 (diff) | |
download | glibc-b2a64460ba9aca39e92731da67cc6344acb483bc.tar.gz glibc-b2a64460ba9aca39e92731da67cc6344acb483bc.tar.xz glibc-b2a64460ba9aca39e92731da67cc6344acb483bc.zip |
Refactor x86_64 libm code forcing underflow exceptions.
This patch refactors code in sysdeps/x86_64/fpu that forces underflow exceptions and closely follows corresponding i386 code to use common macros in x86_64-math-asm.h for that purpose. This is mainly about keeping the code similar to the i386 code as far as possible, since each macro apart from DEFINE_LDBL_MIN ends up used only once. It would be possible to do a further refactoring to share these macros between i386 and x86_64 (with i386 using the fcomip / fucomip versions when building for i686 and above), but I have no immediate plans to do so. Tested for x86_64. * sysdeps/x86_64/fpu/x86_64-math-asm.h: New file. * sysdeps/x86_64/fpu/e_exp2l.S: Include <x86_64-math-asm.h>. (ldbl_min): Replace with use of DEFINE_LDBL_MIN. (__ieee754_exp2l): Use LDBL_CHECK_FORCE_UFLOW_NONNEG_NAN. * sysdeps/x86_64/fpu/e_expl.S: Include <x86_64-math-asm.h>. [!USE_AS_EXPM1L] (cmin): Replace with use of DEFINE_LDBL_MIN. (IEEE754_EXPL): Use LDBL_CHECK_FORCE_UFLOW_NONNEG.
Diffstat (limited to 'sysdeps/x86_64/fpu/e_exp2l.S')
-rw-r--r-- | sysdeps/x86_64/fpu/e_exp2l.S | 20 |
1 files changed, 4 insertions, 16 deletions
diff --git a/sysdeps/x86_64/fpu/e_exp2l.S b/sysdeps/x86_64/fpu/e_exp2l.S index d634ad38f8..0e059b7565 100644 --- a/sysdeps/x86_64/fpu/e_exp2l.S +++ b/sysdeps/x86_64/fpu/e_exp2l.S @@ -6,13 +6,9 @@ */ #include <machine/asm.h> +#include <x86_64-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##(%rip) @@ -50,16 +46,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) - fucomip %st(1), %st - fstp %st - 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. */ |