| /** | |
| * This file has no copyright assigned and is placed in the Public Domain. | |
| * This file is part of the w64 mingw-runtime package. | |
| * No warranty is given; refer to the file DISCLAIMER within this package. | |
| */ | |
| /* | |
| * frexpl(long double x, int* expnt) extracts the exponent from x. | |
| * It returns an integer power of two to expnt and the significand | |
| * between 0.5 and 1 to y. Thus x = y * 2**expn. | |
| */ | |
| .align 2 | |
| .globl _frexpl | |
| _frexpl: | |
| pushq %rbp | |
| movq %rsp,%rbp | |
| subq $24,%rsp | |
| pushq %rsi | |
| pushq %rbx | |
| fldt (%rdx) | |
| movq %r8,%rbx | |
| movq %rcx,%r9 | |
| fld %st(0) | |
| fstpt -24(%rbp) | |
| leaq -8(%rbp),%rcx | |
| movw -8(%rbp),%dx | |
| andq $32767,%rdx | |
| jne L25 | |
| fldz | |
| fucompp | |
| fnstsw %ax | |
| andb $68,%ah | |
| xorb $64,%ah | |
| jne L21 | |
| movq $0,(%rbx) | |
| fldz | |
| jmp L24 | |
| .align 2,0x90 | |
| .align 2,0x90 | |
| L21: | |
| fldt -24(%rbp) | |
| fadd %st(0),%st | |
| fstpt -24(%rbp) | |
| decq %rdx | |
| movw (%rcx),%si | |
| andq $32767,%rsi | |
| jne L22 | |
| cmpq $-66,%rdx | |
| jg L21 | |
| L22: | |
| addq %rsi,%rdx | |
| jmp L19 | |
| .align 2,0x90 | |
| L25: | |
| fstp %st(0) | |
| L19: | |
| addq $-16382,%rdx | |
| movq %rdx,(%rbx) | |
| movw (%rcx),%ax | |
| andq $-32768,%rax | |
| orq $16382,%rax | |
| movw %ax,(%rcx) | |
| fldt -24(%rbp) | |
| L24: | |
| leaq -40(%rbp),%rsp | |
| popq %rbx | |
| popq %rsi | |
| movq %r9,%rax | |
| fstpt (%r9) | |
| leave | |
| ret |