aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/x86_64/fpu/e_exp2l.S
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2015-09-24 22:25:30 +0000
committerJoseph Myers <joseph@codesourcery.com>2015-09-24 22:25:30 +0000
commitb2a64460ba9aca39e92731da67cc6344acb483bc (patch)
tree213e279495212accf939a0d03c10e16c131963cc /sysdeps/x86_64/fpu/e_exp2l.S
parent1a19b8894f93878f99025096ec1d3b6af7db6f78 (diff)
downloadglibc-b2a64460ba9aca39e92731da67cc6344acb483bc.zip
glibc-b2a64460ba9aca39e92731da67cc6344acb483bc.tar.gz
glibc-b2a64460ba9aca39e92731da67cc6344acb483bc.tar.bz2
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.S20
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 d634ad3..0e059b7 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. */