mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-03 08:11:08 +00:00
Correct errno handling in expm1.
This commit is contained in:
parent
a0902db9fe
commit
b7805d0ba8
11
ChangeLog
11
ChangeLog
@ -1,3 +1,14 @@
|
|||||||
|
2009-10-19 Andreas Schwab <schwab@redhat.com>
|
||||||
|
|
||||||
|
* include/math.h: Add hidden protos for __exp/__expf/__expl.
|
||||||
|
* sysdeps/ieee754/dbl-64/w_exp.c: Add hidden alias.
|
||||||
|
* sysdeps/ieee754/flt-32/w_expf.c: Likewise.
|
||||||
|
* sysdeps/ieee754/ldbl-96/w_expl.c: Likewise.
|
||||||
|
* sysdeps/i386/fpu/s_expm1.S: Call __exp to handle overflow.
|
||||||
|
* sysdeps/i386/fpu/s_expm1f.S: Call __expf to handle overflow.
|
||||||
|
* sysdeps/i386/fpu/s_expm1l.S: Call __expl instead of
|
||||||
|
__ieee751_expl to handle overflow.
|
||||||
|
|
||||||
2009-10-14 David S. Miller <davem@davemloft.net>
|
2009-10-14 David S. Miller <davem@davemloft.net>
|
||||||
|
|
||||||
* sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S: New file.
|
* sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S: New file.
|
||||||
|
@ -22,9 +22,12 @@ hidden_proto (__isnanl)
|
|||||||
|
|
||||||
libm_hidden_proto (__fpclassify)
|
libm_hidden_proto (__fpclassify)
|
||||||
libm_hidden_proto (__fpclassifyf)
|
libm_hidden_proto (__fpclassifyf)
|
||||||
|
libm_hidden_proto (__exp)
|
||||||
|
libm_hidden_proto (__expf)
|
||||||
|
|
||||||
# ifndef __NO_LONG_DOUBLE_MATH
|
# ifndef __NO_LONG_DOUBLE_MATH
|
||||||
libm_hidden_proto (__fpclassifyl)
|
libm_hidden_proto (__fpclassifyl)
|
||||||
|
libm_hidden_proto (__expl)
|
||||||
libm_hidden_proto (__expm1l)
|
libm_hidden_proto (__expm1l)
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
/* Using: e^x - 1 = 2^(x * log2(e)) - 1 */
|
/* Using: e^x - 1 = 2^(x * log2(e)) - 1 */
|
||||||
|
|
||||||
|
#include <sysdep.h>
|
||||||
#include <machine/asm.h>
|
#include <machine/asm.h>
|
||||||
|
|
||||||
#ifdef __ELF__
|
#ifdef __ELF__
|
||||||
@ -48,6 +49,11 @@ l2e: .tfloat 1.442695040888963407359924681002
|
|||||||
|
|
||||||
.text
|
.text
|
||||||
ENTRY(__expm1)
|
ENTRY(__expm1)
|
||||||
|
movzwl 4+6(%esp), %eax
|
||||||
|
xorb $0x80, %ah // invert sign bit (now 1 is "positive")
|
||||||
|
cmpl $0xc086, %eax // is num >= 704?
|
||||||
|
jae HIDDEN_JUMPTARGET (__exp)
|
||||||
|
|
||||||
fldl 4(%esp) // x
|
fldl 4(%esp) // x
|
||||||
fxam // Is NaN or +-Inf?
|
fxam // Is NaN or +-Inf?
|
||||||
fstsw %ax
|
fstsw %ax
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
/* Using: e^x - 1 = 2^(x * log2(e)) - 1 */
|
/* Using: e^x - 1 = 2^(x * log2(e)) - 1 */
|
||||||
|
|
||||||
|
#include <sysdep.h>
|
||||||
#include <machine/asm.h>
|
#include <machine/asm.h>
|
||||||
|
|
||||||
#ifdef __ELF__
|
#ifdef __ELF__
|
||||||
@ -48,6 +49,11 @@ l2e: .tfloat 1.442695040888963407359924681002
|
|||||||
|
|
||||||
.text
|
.text
|
||||||
ENTRY(__expm1f)
|
ENTRY(__expm1f)
|
||||||
|
movzwl 4+2(%esp), %eax
|
||||||
|
xorb $0x80, %ah // invert sign bit (now 1 is "positive")
|
||||||
|
cmpl $0xc2b1, %eax // is num >= 88.5?
|
||||||
|
jae HIDDEN_JUMPTARGET (__expf)
|
||||||
|
|
||||||
flds 4(%esp) // x
|
flds 4(%esp) // x
|
||||||
fxam // Is NaN or +-Inf?
|
fxam // Is NaN or +-Inf?
|
||||||
fstsw %ax
|
fstsw %ax
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
/* Using: e^x - 1 = 2^(x * log2(e)) - 1 */
|
/* Using: e^x - 1 = 2^(x * log2(e)) - 1 */
|
||||||
|
|
||||||
|
#include <sysdep.h>
|
||||||
#include <machine/asm.h>
|
#include <machine/asm.h>
|
||||||
|
|
||||||
#ifdef __ELF__
|
#ifdef __ELF__
|
||||||
@ -51,7 +52,7 @@ ENTRY(__expm1l)
|
|||||||
movzwl 4+8(%esp), %eax // load sign bit and 15-bit exponent
|
movzwl 4+8(%esp), %eax // load sign bit and 15-bit exponent
|
||||||
xorb $0x80, %ah // invert sign bit (now 1 is "positive")
|
xorb $0x80, %ah // invert sign bit (now 1 is "positive")
|
||||||
cmpl $0xc006, %eax // is num positive and exp >= 6 (number is >= 128.0)?
|
cmpl $0xc006, %eax // is num positive and exp >= 6 (number is >= 128.0)?
|
||||||
jae __ieee754_expl // (if num is denormal, it is at least >= 64.0)
|
jae HIDDEN_JUMPTARGET (__expl) // (if num is denormal, it is at least >= 64.0)
|
||||||
|
|
||||||
fldt 4(%esp) // x
|
fldt 4(%esp) // x
|
||||||
fxam // Is NaN or +-Inf?
|
fxam // Is NaN or +-Inf?
|
||||||
|
@ -51,6 +51,7 @@ u_threshold= -7.45133219101941108420e+02; /* 0xc0874910, 0xD52D3051 */
|
|||||||
return z;
|
return z;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
hidden_def (__exp)
|
||||||
weak_alias (__exp, exp)
|
weak_alias (__exp, exp)
|
||||||
#ifdef NO_LONG_DOUBLE
|
#ifdef NO_LONG_DOUBLE
|
||||||
strong_alias (__exp, __expl)
|
strong_alias (__exp, __expl)
|
||||||
|
@ -56,4 +56,5 @@ u_threshold= -1.0397208405e+02; /* 0xc2cff1b5 */
|
|||||||
return z;
|
return z;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
hidden_def (__expf)
|
||||||
weak_alias (__expf, expf)
|
weak_alias (__expf, expf)
|
||||||
|
@ -57,4 +57,5 @@ u_threshold= -1.140019167866942050398521670162263001513e4;
|
|||||||
return z;
|
return z;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
hidden_def (__expl)
|
||||||
weak_alias (__expl, expl)
|
weak_alias (__expl, expl)
|
||||||
|
Loading…
Reference in New Issue
Block a user