Merge branch 'vendor/GMP'
[dragonfly.git] / lib / libm / arch / i386 / s_copysignf.S
1 /*
2  * Written by J.T. Conklin <jtc@NetBSD.org>.
3  * Public domain.
4  *
5  * $NetBSD: s_copysignf.S,v 1.5 2003/07/26 19:25:01 salo Exp $
6  */
7
8 #include <machine/asm.h>
9
10 /*
11  * XXXfvdl split this file.
12  */
13
14 #ifdef __x86_64__
15 .Lneg:
16         .long 0x7fffffff
17 .Lpos:
18         .long 0x80000000
19 #endif
20
21 ENTRY(copysignf)
22 #ifdef __i386__
23         movl    8(%esp),%edx
24         andl    $0x80000000,%edx
25         movl    4(%esp),%eax
26         andl    $0x7fffffff,%eax
27         orl     %edx,%eax
28         movl    %eax,4(%esp)
29         flds    4(%esp)
30 #else
31 #if 0
32         /*
33          * XXXfvdl gas doesn't grok this.
34          * but it's legal according to the p4 manual.
35          */
36         movss    .Lpos(%rip),%xmm2
37         movss    .Lneg(%rip),%xmm3
38         pandq   %xmm2,%xmm1
39         pandq   %xmm3,%xmm0
40         porq    %xmm1,%xmm0
41 #else
42         movss   %xmm0,-4(%rsp)
43         movss   %xmm1,-8(%rsp)
44         movl    -8(%rsp),%edx
45         andl    $0x80000000,%edx
46         movl    -4(%rsp),%eax
47         andl    $0x7fffffff,%eax
48         orl     %edx,%eax
49         movl    %eax,-4(%rsp)
50         movss   -4(%rsp),%xmm0
51 #endif
52 #endif
53         ret
54 END(copysignf)