this repo has no description
1/*
2 * copysign.s
3 *
4 * by Ian Ollmann.
5 *
6 * Copyright (c) 2007 Apple Inc., All Rights Reserved.
7 *
8 * Implementation of C99 copysign functions for __i386__ and __x86_64__.
9 */
10
11#include <machine/asm.h>
12
13#include "abi.h"
14
15
16ENTRY( copysignf )
17#if defined( __i386__ )
18 movss FRAME_SIZE(STACKP), %xmm0
19 movss 4+FRAME_SIZE(STACKP), %xmm1
20#endif
21 pcmpeqw %xmm2, %xmm2 //0xffffffff
22 psrld $1, %xmm2 //0x7fffffff
23 andps %xmm2, %xmm0
24 andnps %xmm1, %xmm2
25 orps %xmm2, %xmm0
26#if defined( __i386__ )
27 movss %xmm0, FRAME_SIZE( STACKP )
28 flds FRAME_SIZE(STACKP)
29#endif
30 ret
31
32ENTRY( copysign )
33#if defined( __i386__ )
34 movsd FRAME_SIZE( STACKP ), %xmm0 //x
35 movsd 8+FRAME_SIZE( STACKP ), %xmm1 //y
36#endif
37 pcmpeqw %xmm2, %xmm2 //0xffffffffffffffff
38 psrlq $1, %xmm2 //0x7fffffffffffffff
39 andpd %xmm2, %xmm0
40 andnpd %xmm1, %xmm2
41 orpd %xmm2, %xmm0
42#if defined( __i386__ )
43 movsd %xmm0, FRAME_SIZE( STACKP )
44 fldl FRAME_SIZE(STACKP)
45#endif
46 ret
47
48ENTRY( copysignl )
49 movzwl 8+FRAME_SIZE( STACKP ), %eax // x exp
50 movzwl 24+FRAME_SIZE( STACKP ), %edx // y exp
51 andl $0x7fff, %eax
52 andl $0x8000, %edx
53 orl %edx, %eax
54 movw %ax, 8+FRAME_SIZE(STACKP)
55 fldt FRAME_SIZE(STACKP )
56 ret
57
58ENTRY( fabsf )
59#if defined( __i386__ )
60 flds FIRST_ARG_OFFSET(STACKP)
61 fabs
62 ret
63#else
64 pcmpeqw %xmm1, %xmm1 //0xffffffff
65 psrld $1, %xmm1 //0x7fffffff
66 andps %xmm1, %xmm0
67 ret
68#endif
69
70ENTRY( fabs )
71#if defined( __i386__ )
72 fldl FIRST_ARG_OFFSET(STACKP)
73 fabs
74 ret
75#else
76 pcmpeqw %xmm1, %xmm1 //0xffffffffffffffff
77 psrlq $1, %xmm1 //0x7fffffffffffffff
78 andpd %xmm1, %xmm0
79 ret
80#endif
81
82ENTRY( fabsl )
83 fldt FIRST_ARG_OFFSET(STACKP)
84 fabs
85 ret
86