this repo has no description
1/*
2 * xmm_dimMinMax.c
3 * xmmLibm
4 *
5 * Created by Ian Ollmann, Ph.D. on 8/15/05.
6 * Copyright © 2005 Apple Computer, Inc. All rights reserved.
7 *
8 */
9
10
11#include "xmmLibm_prefix.h"
12#include "math.h"
13
14#if defined( BUILDING_FOR_CARBONCORE_LEGACY )
15double fdim( double x, double y )
16{
17 xDouble xx = DOUBLE_2_XDOUBLE(x);
18 xDouble yy = DOUBLE_2_XDOUBLE(y);
19
20 xDouble isNaN = _mm_cmpunord_pd( xx, yy );
21 xDouble testX = _mm_andnot_pd( isNaN, xx );
22 xDouble testY = _mm_andnot_pd( isNaN, yy );
23 xDouble xGTy = _mm_cmplt_sd( testY, testX );
24 xGTy = _mm_or_pd( xGTy, isNaN );
25
26 xx = _mm_and_pd( xx, xGTy );
27 yy = _mm_and_pd( yy, xGTy );
28 xx = _mm_sub_sd( xx, yy );
29
30 return XDOUBLE_2_DOUBLE( xx );
31}
32
33double fmax( double x, double y )
34{
35 xDouble xx = DOUBLE_2_XDOUBLE(x);
36 xDouble yy = DOUBLE_2_XDOUBLE(y);
37
38 xDouble isNaN = _mm_cmpunord_pd( xx, yy );
39 xDouble yIsNaN = _mm_cmpunord_pd( yy, yy );
40 xDouble xEQy = _mm_cmpeq_pd( xx, yy );
41 xDouble safeX = _mm_andnot_pd( isNaN, xx );
42 xDouble safeY = _mm_andnot_pd( isNaN, yy );
43 xDouble xGTy = _mm_cmplt_sd( safeY, safeX );
44 xDouble xGEy = _mm_or_pd( xGTy, xEQy );
45 xGEy = _mm_or_pd( xGEy, yIsNaN );
46
47 xx = _mm_sel_pd( yy, xx, xGEy );
48
49 return XDOUBLE_2_DOUBLE( xx );
50}
51
52double fmin( double x, double y )
53{
54 xDouble xx = DOUBLE_2_XDOUBLE(x);
55 xDouble yy = DOUBLE_2_XDOUBLE(y);
56
57 xDouble isNaN = _mm_cmpunord_pd( xx, yy );
58 xDouble yIsNaN = _mm_cmpunord_pd( yy, yy );
59 xDouble xEQy = _mm_cmpeq_pd( xx, yy );
60 xDouble safeX = _mm_andnot_pd( isNaN, xx );
61 xDouble safeY = _mm_andnot_pd( isNaN, yy );
62 xDouble xLTy = _mm_cmplt_sd( safeX, safeY );
63 xDouble xLEy = _mm_or_pd( xLTy, xEQy );
64 xLEy = _mm_or_pd( xLEy, yIsNaN );
65
66 xx = _mm_sel_pd( yy, xx, xLEy );
67
68 return XDOUBLE_2_DOUBLE( xx );
69}
70
71#else
72float fdimf( float x, float y )
73{
74 xFloat xx = FLOAT_2_XFLOAT(x);
75 xFloat yy = FLOAT_2_XFLOAT(y);
76
77 xFloat isNaN = _mm_cmpunord_ps( xx, yy );
78 xFloat testX = _mm_andnot_ps( isNaN, xx );
79 xFloat testY = _mm_andnot_ps( isNaN, yy );
80 xFloat xGTy = _mm_cmplt_ss( testY, testX );
81 xGTy = _mm_or_ps( xGTy, isNaN );
82
83 xx = _mm_and_ps( xx, xGTy );
84 yy = _mm_and_ps( yy, xGTy );
85 xx = _mm_sub_ss( xx, yy );
86
87 return XFLOAT_2_FLOAT( xx );
88}
89
90float fmaxf( float x, float y )
91{
92 xFloat xx = FLOAT_2_XFLOAT(x);
93 xFloat yy = FLOAT_2_XFLOAT(y);
94
95 xFloat isNaN = _mm_cmpunord_ps( xx, yy );
96 xFloat yIsNaN = _mm_cmpunord_ps( yy, yy );
97 xFloat xEQy = _mm_cmpeq_ss( xx, yy );
98 xFloat safeX = _mm_andnot_ps( isNaN, xx );
99 xFloat safeY = _mm_andnot_ps( isNaN, yy );
100 xFloat xGTy = _mm_cmplt_ss( safeY, safeX );
101 xFloat xGEy = _mm_or_ps( xGTy, xEQy );
102 xGEy = _mm_or_ps( xGEy, yIsNaN );
103
104 xx = _mm_sel_ps( yy, xx, xGEy );
105
106 return XFLOAT_2_FLOAT( xx );
107}
108
109float fminf( float x, float y )
110{
111 xFloat xx = FLOAT_2_XFLOAT(x);
112 xFloat yy = FLOAT_2_XFLOAT(y);
113
114 xFloat isNaN = _mm_cmpunord_ps( xx, yy );
115 xFloat yIsNaN = _mm_cmpunord_ps( yy, yy );
116 xFloat xEQy = _mm_cmpeq_ps( xx, yy );
117 xFloat safeX = _mm_andnot_ps( isNaN, xx );
118 xFloat safeY = _mm_andnot_ps( isNaN, yy );
119 xFloat xLTy = _mm_cmplt_ss( safeX, safeY );
120 xFloat xLEy = _mm_or_ps( xLTy, xEQy );
121 xLEy = _mm_or_ps( xLEy, yIsNaN );
122
123 xx = _mm_sel_ps( yy, xx, xLEy );
124
125 return XFLOAT_2_FLOAT( xx );
126}
127
128#endif /* CARBONCORE_LEGACY */
129
130