diff options
Diffstat (limited to 'winsup/cygwin/math/frexpl.S')
-rw-r--r-- | winsup/cygwin/math/frexpl.S | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/winsup/cygwin/math/frexpl.S b/winsup/cygwin/math/frexpl.S new file mode 100644 index 000000000..f9fcc6be1 --- /dev/null +++ b/winsup/cygwin/math/frexpl.S @@ -0,0 +1,130 @@ +/** + * 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> + +/* + * 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. + */ +#ifdef __x86_64__ + .align 8 +#else + .align 2 +#endif +.globl __MINGW_USYMBOL(frexpl) +__MINGW_USYMBOL(frexpl): +#ifdef __x86_64__ + pushq %rbp + movq %rsp,%rbp + subq $48,%rsp + pushq %rsi + fldt (%rdx) + movq %rcx,%r9 + fld %st(0) + fstpt -12(%rbp) + leaq -4(%rbp),%rcx + movw -4(%rbp),%dx + andl $32767,%edx + jne L25 + fldz + fucompp + fnstsw %ax + andb $68,%ah + xorb $64,%ah + jne L21 + movl $0,(%r8) + fldz + jmp L24 + .align 4,0x90 + .align 4,0x90 +L21: + fldt -12(%rbp) + fadd %st(0),%st + fstpt -12(%rbp) + decl %edx + movw (%rcx),%si + andl $32767,%esi + jne L22 + cmpl $-66,%edx + jg L21 +L22: + add %esi,%edx + jmp L19 + .align 2,0x90 +L25: + fstp %st(0) +L19: + addl $-16382,%edx + movl %edx,(%r8) + movw (%rcx),%ax + andl $-32768,%eax + orl $16382,%eax + movw %ax,(%rcx) + fldt -12(%rbp) +L24: + popq %rsi + movq %r9,%rax + movq $0,8(%r9) + fstpt (%r9) + leave + ret +#else + pushl %ebp + movl %esp,%ebp + subl $24,%esp + pushl %esi + pushl %ebx + fldt 8(%ebp) + movl 20(%ebp),%ebx + fld %st(0) + fstpt -12(%ebp) + leal -4(%ebp),%ecx + movw -4(%ebp),%dx + andl $32767,%edx + jne L25 + fldz + fucompp + fnstsw %ax + andb $68,%ah + xorb $64,%ah + jne L21 + movl $0,(%ebx) + fldz + jmp L24 + .align 2,0x90 + .align 2,0x90 +L21: + fldt -12(%ebp) + fadd %st(0),%st + fstpt -12(%ebp) + decl %edx + movw (%ecx),%si + andl $32767,%esi + jne L22 + cmpl $-66,%edx + jg L21 +L22: + addl %esi,%edx + jmp L19 + .align 2,0x90 +L25: + fstp %st(0) +L19: + addl $-16382,%edx + movl %edx,(%ebx) + movw (%ecx),%ax + andl $-32768,%eax + orl $16382,%eax + movw %ax,(%ecx) + fldt -12(%ebp) +L24: + leal -32(%ebp),%esp + popl %ebx + popl %esi + leave + ret +#endif |