diff options
Diffstat (limited to 'sysdeps/i386')
-rw-r--r-- | sysdeps/i386/fpu/e_exp10.S | 34 | ||||
-rw-r--r-- | sysdeps/i386/fpu/e_exp10f.S | 34 |
2 files changed, 66 insertions, 2 deletions
diff --git a/sysdeps/i386/fpu/e_exp10.S b/sysdeps/i386/fpu/e_exp10.S index 1e32b07848..fa54732e2a 100644 --- a/sysdeps/i386/fpu/e_exp10.S +++ b/sysdeps/i386/fpu/e_exp10.S @@ -4,8 +4,25 @@ #include <machine/asm.h> + .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(%ecx) +#else +# define MO(op) op +#endif + + .text /* 10^x = 2^(x * log2(10)) */ ENTRY(__ieee754_exp10) +#ifdef PIC + LOAD_PIC_REG (cx) +#endif fldl 4(%esp) /* I added the following ugly construct because exp(+-Inf) resulted in NaN. The ugliness results from the bright minds at Intel. @@ -28,7 +45,22 @@ ENTRY(__ieee754_exp10) faddp /* 2^(fract(x * log2(10))) */ fscale /* e^x */ fstp %st(1) - ret + fldl MO(dbl_min) + fld %st(1) + fucompp + fnstsw + sahf + jnc 3f + 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) +3: ret 1: testl $0x200, %eax /* Test sign. */ jz 2f /* If positive, jump. */ diff --git a/sysdeps/i386/fpu/e_exp10f.S b/sysdeps/i386/fpu/e_exp10f.S index 614496415e..a84b2ae535 100644 --- a/sysdeps/i386/fpu/e_exp10f.S +++ b/sysdeps/i386/fpu/e_exp10f.S @@ -4,8 +4,25 @@ #include <machine/asm.h> + .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(%ecx) +#else +# define MO(op) op +#endif + + .text /* 10^x = 2^(x * log2(10)) */ ENTRY(__ieee754_exp10f) +#ifdef PIC + LOAD_PIC_REG (cx) +#endif flds 4(%esp) /* I added the following ugly construct because exp(+-Inf) resulted in NaN. The ugliness results from the bright minds at Intel. @@ -28,7 +45,22 @@ ENTRY(__ieee754_exp10f) faddp /* 2^(fract(x * log2(10))) */ fscale /* e^x */ fstp %st(1) - ret + flds MO(flt_min) + fld %st(1) + fucompp + fnstsw + sahf + jnc 3f + 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) +3: ret 1: testl $0x200, %eax /* Test sign. */ jz 2f /* If positive, jump. */ |