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