|  | /** | 
|  | * This file has no copyright assigned and is placed in the Public Domain. | 
|  | * This file is part of the mingw-w64 runtime package. | 
|  | * No warranty is given; refer to the file DISCLAIMER.PD within this package. | 
|  | */ | 
|  | #include <_mingw_mac.h> | 
|  |  | 
|  | .file	"ilogb.S" | 
|  | .text | 
|  | .p2align 4,,15 | 
|  | .globl __MINGW_USYMBOL(ilogb) | 
|  | .def	__MINGW_USYMBOL(ilogb);	.scl	2;	.type	32;	.endef | 
|  | #ifdef __x86_64__ | 
|  | .seh_proc __MINGW_USYMBOL(ilogb) | 
|  | #endif | 
|  | __MINGW_USYMBOL(ilogb): | 
|  | #ifdef __x86_64__ | 
|  | /* Generated code by: | 
|  | int | 
|  | ilogb (double x) | 
|  | { | 
|  | __mingw_dbl_type_t hlp; | 
|  | int hx, lx, ix; | 
|  |  | 
|  | hlp.x = x; | 
|  | hx = hpl.lh.high & 0x7fffffff; | 
|  | if (hx < 0x100000) | 
|  | { | 
|  | lx = hlp.lh.low; | 
|  | if ((hx | lx) == 0) | 
|  | return 0x80000000;      // ilogb(0) = FP_ILOGB0 | 
|  | // subnormal x | 
|  | if (hx == 0) | 
|  | { | 
|  | for (ix = -1043; lx > 0; lx <<= 1) | 
|  | ix -=1; | 
|  | } | 
|  | else | 
|  | { | 
|  | for (ix = -1022,hx <<= 11; hx > 0; hx <<= 1) | 
|  | ix -=1; | 
|  | } | 
|  | return ix; | 
|  | } | 
|  | if (hx < 0x7ff00000) | 
|  | return (hx >> 20) - 1023; | 
|  | lx = hlp.lh.low; | 
|  | return 0x7fffffff; | 
|  | } */ | 
|  | subq    $24, %rsp | 
|  | .seh_stackalloc 24 | 
|  | .seh_endprologue | 
|  | movsd   %xmm0, 8(%rsp) | 
|  | movq    8(%rsp), %rdx | 
|  | shrq    $32, %rdx | 
|  | andl    $2147483647, %edx | 
|  | cmpl    $1048575, %edx | 
|  | jg      .L2 | 
|  | movq    8(%rsp), %rcx | 
|  | movl    %edx, %eax | 
|  | orl     %ecx, %eax | 
|  | je      .L8 | 
|  | testl   %edx, %edx | 
|  | jne     .L4 | 
|  | testl   %ecx, %ecx | 
|  | movl    %ecx, %edx | 
|  | movl    $-1043, %eax | 
|  | jle     .L3 | 
|  | .p2align 4,,10 | 
|  | .L5: | 
|  | addl    %edx, %edx | 
|  | subl    $1, %eax | 
|  | testl   %edx, %edx | 
|  | jg      .L5 | 
|  | addq    $24, %rsp | 
|  | ret | 
|  | .p2align 4,,10 | 
|  | .L2: | 
|  | cmpl    $2146435071, %edx | 
|  | jle     .L13 | 
|  | movl    $2147483647, %eax | 
|  | .L3: | 
|  | addq    $24, %rsp | 
|  | ret | 
|  | .p2align 4,,10 | 
|  | .L4: | 
|  | sall    $11, %edx | 
|  | movl    $-1022, %eax | 
|  | testl   %edx, %edx | 
|  | jle     .L3 | 
|  | .p2align 4,,10 | 
|  | .L6: | 
|  | addl    %edx, %edx | 
|  | subl    $1, %eax | 
|  | testl   %edx, %edx | 
|  | jg      .L6 | 
|  | addq    $24, %rsp | 
|  | ret | 
|  | .p2align 4,,10 | 
|  | .L13: | 
|  | sarl    $20, %edx | 
|  | leal    -1023(%rdx), %eax | 
|  | addq    $24, %rsp | 
|  | ret | 
|  | .L8: | 
|  | movl    $-2147483648, %eax | 
|  | jmp     .L3 | 
|  | .seh_endproc | 
|  | #else | 
|  |  | 
|  | fldl	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    $0x01, %dh | 
|  | je      1f		/* Is NaN, jump.  */ | 
|  |  | 
|  | fxtract | 
|  | pushl	%eax | 
|  | fstp	%st | 
|  |  | 
|  | fistpl	(%esp) | 
|  | fwait | 
|  | popl	%eax | 
|  |  | 
|  | ret | 
|  |  | 
|  | 1:	fstp	%st | 
|  | movl	$0x7fffffff, %eax | 
|  | ret | 
|  | #endif |