1/*
2 * Public domain.
3 */
4
5#include <machine/asm.h>
6
7ENTRY(__ieee754_ilogbl)
8 fldt 8(%rsp)
9/* I added the following ugly construct because ilogb(+-Inf) is
10 required to return INT_MAX in ISO C99.
11 -- jakub@redhat.com. */
12 fxam /* Is NaN or +-Inf? */
13 fstsw %ax
14 movb $0x45, %dh
15 andb %ah, %dh
16 cmpb $0x05, %dh
17 je 1f /* Is +-Inf, jump. */
18 cmpb $0x40, %dh
19 je 2f /* Is +-Inf, jump. */
20
21 fxtract
22 fstp %st
23
24 fistpl -4(%rsp)
25 fwait
26 movl -4(%rsp),%eax
27
28 ret
29
301: fstp %st
31 movl $0x7fffffff, %eax
32 ret
332: fstp %st
34 movl $0x80000000, %eax /* FP_ILOGB0 */
35 ret
36END (__ieee754_ilogbl)
37

source code of glibc/sysdeps/x86_64/fpu/e_ilogbl.S