Cygwin: (mostly) drop NT4 and Samba < 3.0 support
[newlib-cygwin.git] / winsup / cygwin / math / copysignl.S
blobffe6240d5dbfe4ab51da9e7deb00324e21e5d47d
1 /**
2  * This file has no copyright assigned and is placed in the Public Domain.
3  * This file is part of the mingw-w64 runtime package.
4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5  */
6 /*
7  * Written by J.T. Conklin <jtc@netbsd.org>.
8  * Changes for long double by Ulrich Drepper <drepper@cygnus.com>
9  * Public domain.
10  */
11 #include <_mingw_mac.h>
13         .file   "copysignl.S"
14         .text
15 #ifdef __x86_64__
16         .align 8
17 #else
18         .align 4
19 #endif
21         .globl __MINGW_USYMBOL(copysignl)
22         .def    __MINGW_USYMBOL(copysignl);     .scl    2;      .type   32;     .endef
23 __MINGW_USYMBOL(copysignl):
24 #if defined(_AMD64_) || defined(__x86_64__)
25         movq    (%rdx), %rax
26         movq    %rax, (%rcx)
27         movq    8(%rdx), %rax
28         movq    8(%r8), %rdx
29         andq    $0x777f, %rax
30         andq    $0x8000, %rdx
31         orq     %rdx, %rax
32         movq    %rax, 8(%rcx)
33         movq    %rcx, %rax
34         ret
35 #elif defined(_ARM_) || defined(__arm__)
36         fcmpzd  d1
37         fmstat
38         bmi     1f /* jump if d1 is negative */
39         fcmpzd  d0
40         fmstat
41         vnegmi.f64      d0, d0 /* negate d0 if it is negative */
42         bx      lr
43         1: fcmpzd       d0
44         fmstat
45         vnegpl.f64      d0, d0 /* negate d0 if it is positive */
46         bx      lr
47 #elif defined(_X86_) || defined(__i386__)
48         movl    24(%esp),%edx
49         movl    12(%esp),%eax
50         andl    $0x8000,%edx
51         andl    $0x7fff,%eax
52         orl     %edx,%eax
53         movl    %eax,12(%esp)
54         fldt    4(%esp)
55         ret
56 #endif