newlib/winsup/cygwin/math/frexpl.S

131 lines
1.9 KiB
ArmAsm

/**
* 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