diff options
Diffstat (limited to 'winsup/cygwin/math/copysignl.S')
-rw-r--r-- | winsup/cygwin/math/copysignl.S | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/winsup/cygwin/math/copysignl.S b/winsup/cygwin/math/copysignl.S new file mode 100644 index 000000000..ffe6240d5 --- /dev/null +++ b/winsup/cygwin/math/copysignl.S @@ -0,0 +1,56 @@ +/** + * 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. + */ +/* + * Written by J.T. Conklin <jtc@netbsd.org>. + * Changes for long double by Ulrich Drepper <drepper@cygnus.com> + * Public domain. + */ +#include <_mingw_mac.h> + + .file "copysignl.S" + .text +#ifdef __x86_64__ + .align 8 +#else + .align 4 +#endif + + .globl __MINGW_USYMBOL(copysignl) + .def __MINGW_USYMBOL(copysignl); .scl 2; .type 32; .endef +__MINGW_USYMBOL(copysignl): +#if defined(_AMD64_) || defined(__x86_64__) + movq (%rdx), %rax + movq %rax, (%rcx) + movq 8(%rdx), %rax + movq 8(%r8), %rdx + andq $0x777f, %rax + andq $0x8000, %rdx + orq %rdx, %rax + movq %rax, 8(%rcx) + movq %rcx, %rax + ret +#elif defined(_ARM_) || defined(__arm__) + fcmpzd d1 + fmstat + bmi 1f /* jump if d1 is negative */ + fcmpzd d0 + fmstat + vnegmi.f64 d0, d0 /* negate d0 if it is negative */ + bx lr + 1: fcmpzd d0 + fmstat + vnegpl.f64 d0, d0 /* negate d0 if it is positive */ + bx lr +#elif defined(_X86_) || defined(__i386__) + movl 24(%esp),%edx + movl 12(%esp),%eax + andl $0x8000,%edx + andl $0x7fff,%eax + orl %edx,%eax + movl %eax,12(%esp) + fldt 4(%esp) + ret +#endif |