mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 21:10:07 +00:00
0b7a5f9201
Similar to various other bugs in this area, some log1p implementations do not raise the underflow exception for subnormal arguments, when the result is tiny and inexact. This patch forces the exception in a similar way to previous fixes. (The ldbl-128ibm implementation doesn't currently need any change as it already generates this exception, albeit through code that would generate spurious exceptions in other cases; special code for this issue will only be needed there when fixing the spurious exceptions.) Tested for x86_64, x86, powerpc and mips64. [BZ #16339] * sysdeps/i386/fpu/s_log1p.S (dbl_min): New object. (__log1p): Force underflow exception for results with small absolute value. * sysdeps/i386/fpu/s_log1pf.S (flt_min): New object. (__log1pf): Force underflow exception for results with small absolute value. * sysdeps/ieee754/dbl-64/s_log1p.c: Include <float.h>. (__log1p): Force underflow exception for results with small absolute value. * sysdeps/ieee754/flt-32/s_log1pf.c: Include <float.h>. (__log1pf): Force underflow exception for results with small absolute value. * sysdeps/ieee754/ldbl-128/s_log1pl.c: Include <float.h>. (__log1pl): Force underflow exception for results with small absolute value. * math/auto-libm-test-in: Do not allow missing underflow exceptions from log1p. * math/auto-libm-test-out: Regenerated.
91 lines
1.3 KiB
ArmAsm
91 lines
1.3 KiB
ArmAsm
/*
|
|
* Written by J.T. Conklin <jtc@netbsd.org>.
|
|
* Public domain.
|
|
*/
|
|
|
|
#include <machine/asm.h>
|
|
|
|
RCSID("$NetBSD: s_log1pf.S,v 1.4 1995/05/09 00:13:05 jtc Exp $")
|
|
|
|
.section .rodata
|
|
|
|
.align ALIGNARG(4)
|
|
/* The fyl2xp1 can only be used for values in
|
|
-1 + sqrt(2) / 2 <= x <= 1 - sqrt(2) / 2
|
|
0.29 is a safe value.
|
|
*/
|
|
limit: .float 0.29
|
|
one: .float 1.0
|
|
|
|
.section .rodata.cst4,"aM",@progbits,4
|
|
|
|
.p2align 2
|
|
.type flt_min,@object
|
|
flt_min: .byte 0, 0, 0x80, 0
|
|
ASM_SIZE_DIRECTIVE(flt_min)
|
|
|
|
/*
|
|
* Use the fyl2xp1 function when the argument is in the range -0.29 to 0.29,
|
|
* otherwise fyl2x with the needed extra computation.
|
|
*/
|
|
.text
|
|
ENTRY(__log1pf)
|
|
fldln2
|
|
|
|
flds 4(%esp)
|
|
|
|
#ifdef PIC
|
|
LOAD_PIC_REG (dx)
|
|
#endif
|
|
|
|
fxam
|
|
fnstsw
|
|
fld %st
|
|
sahf
|
|
jc 3f // in case x is NaN or ±Inf
|
|
4: fabs
|
|
#ifdef PIC
|
|
fcomps limit@GOTOFF(%edx)
|
|
#else
|
|
fcomps limit
|
|
#endif
|
|
fnstsw
|
|
sahf
|
|
jc 2f
|
|
|
|
#ifdef PIC
|
|
fadds one@GOTOFF(%edx)
|
|
#else
|
|
fadds one
|
|
#endif
|
|
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
|
|
|
|
3: jp 4b // in case x is ±Inf
|
|
fstp %st(1)
|
|
fstp %st(1)
|
|
ret
|
|
|
|
END (__log1pf)
|