master
 1/**
 2 * This file has no copyright assigned and is placed in the Public Domain.
 3 * This file is part of the mingw-w64 runtime package.
 4 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 5 */
 6#include <_mingw_mac.h>
 7
 8	.file	"ilogbl.S"
 9	.text
10#ifdef __x86_64__
11	.align 8
12#else
13	.align 4
14#endif
15.globl __MINGW_USYMBOL(ilogbl)
16	.def	__MINGW_USYMBOL(ilogbl);	.scl	2;	.type	32;	.endef
17__MINGW_USYMBOL(ilogbl):
18#ifdef __x86_64__
19	fldt	(%rcx)
20	fxam			/* Is NaN or +-Inf?  */
21	fstsw   %ax
22	movb    $0x45, %dh
23	andb    %ah, %dh
24	cmpb    $0x05, %dh
25	je      1f		/* Is +-Inf, jump.  */
26	cmpb    $0x01, %dh
27	je      1f		/* Is NaN, jump.  */
28
29	fxtract
30	pushq	%rax
31	fstp	%st
32
33	fistpl	(%rsp)
34	fwait
35	popq	%rax
36
37	ret
38
391:	fstp	%st
40	movl	$0x7fffffff, %eax
41	ret
42#else
43	fldt	4(%esp)
44/* I added the following ugly construct because ilogb(+-Inf) is
45   required to return INT_MAX in ISO C99.
46   -- jakub@redhat.com.  */
47	fxam			/* Is NaN or +-Inf?  */
48	fstsw   %ax
49	movb    $0x45, %dh
50	andb    %ah, %dh
51	cmpb    $0x05, %dh
52	je      1f		/* Is +-Inf, jump.  */
53	cmpb    $0x01, %dh
54	je      1f		/* Is NaN, jump.  */
55
56	fxtract
57	pushl	%eax
58	fstp	%st
59
60	fistpl	(%esp)
61	fwait
62	popl	%eax
63
64	ret
65
661:	fstp	%st
67	movl	$0x7fffffff, %eax
68	ret
69#endif