diff options
Diffstat (limited to 'sysdeps/i386/fpu/e_ilogbl.S')
-rw-r--r-- | sysdeps/i386/fpu/e_ilogbl.S | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/sysdeps/i386/fpu/e_ilogbl.S b/sysdeps/i386/fpu/e_ilogbl.S new file mode 100644 index 0000000000..6e2be9a300 --- /dev/null +++ b/sysdeps/i386/fpu/e_ilogbl.S @@ -0,0 +1,44 @@ +/* + * Written by J.T. Conklin <jtc@netbsd.org>. + * Changes for long double by Ulrich Drepper <drepper@cygnus.com> + * Public domain. + */ + +#include <machine/asm.h> + +RCSID("$NetBSD: $") + +ENTRY(__ieee754_ilogbl) + fldt 4(%esp) +/* I added the following ugly construct because ilogb(+-Inf) is + required to return INT_MAX in ISO C99. + -- jakub@redhat.com. */ + fxam /* Is NaN or +-Inf? */ + fstsw %ax + movb $0x45, %dh + andb %ah, %dh + cmpb $0x05, %dh + je 1f /* Is +-Inf, jump. */ + cmpb $0x40, %dh + je 2f /* Is +-0, jump. */ + + fxtract + pushl %eax + cfi_adjust_cfa_offset (4) + fstp %st + + fistpl (%esp) + fwait + popl %eax + cfi_adjust_cfa_offset (-4) + + ret + +1: fstp %st + movl $0x7fffffff, %eax + ret +2: fstp %st + movl $0x80000000, %eax /* FP_ILOGB0 */ + ret +END (__ieee754_ilogbl) +weak_alias (__ieee754_ilogbl, __ilogbl_finite) |