ReactOS 0.4.16-dev-1750-g918bc85
libm_sse2.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS CRT
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Simplified implementation of __libm_sse2_*
5 * COPYRIGHT: Copyright 2025 Timo Kreuzer <timo.kreuzer@reactos.org>
6 */
7
8#include <emmintrin.h>
9#include <math.h>
10
11#if defined(_MSC_VER) && !defined(__clang__)
12#pragma function(acos,asin,atan,atan2,cos)
13#pragma function(exp,log,log10,pow,sin,tan)
14#define __ATTRIBUTE_SSE2__
15#else
16#define __ATTRIBUTE_SSE2__ __attribute__((__target__("sse2")))
17#endif
18
19#ifdef __GNUC__
20#pragma GCC diagnostic ignored "-Wuninitialized"
21#endif
22
24{
25 double x = _mm_cvtsd_f64(Xmm0);
26 double result = acos(x);
27 return _mm_set_sd(result);
28}
29
31{
32 __m128d Xmm0d = _mm_cvtss_sd(Xmm0d, Xmm0);
33 double x = _mm_cvtsd_f64(Xmm0d);
34 double result = acos(x);
35 __m128d result128 = _mm_set_sd(result);
36 return _mm_cvtpd_ps(result128);
37}
38
40{
41 double x = _mm_cvtsd_f64(Xmm0);
42 double result = asin(x);
43 return _mm_set_sd(result);
44}
45
47{
48 __m128d Xmm0d = _mm_cvtss_sd(Xmm0d, Xmm0);
49 double x = _mm_cvtsd_f64(Xmm0d);
50 double result = asin(x);
51 __m128d result128 = _mm_set_sd(result);
52 return _mm_cvtpd_ps(result128);
53}
54
56{
57 double x = _mm_cvtsd_f64(Xmm0);
58 double result = atan(x);
59 return _mm_set_sd(result);
60}
61
63{
64 __m128d Xmm0d = _mm_cvtss_sd(Xmm0d, Xmm0);
65 double x = _mm_cvtsd_f64(Xmm0d);
66 double result = atan(x);
67 __m128d result128 = _mm_set_sd(result);
68 return _mm_cvtpd_ps(result128);
69}
70
71__ATTRIBUTE_SSE2__ __m128d __libm_sse2_atan2(__m128d Xmm0, __m128d Xmm1)
72{
73 double x = _mm_cvtsd_f64(Xmm0);
74 double y = _mm_cvtsd_f64(Xmm1);
75 double result = atan2(x, y);
76 return _mm_set_sd(result);
77}
78
80{
81 double x = _mm_cvtsd_f64(Xmm0);
82 double result = cos(x);
83 return _mm_set_sd(result);
84}
85
87{
88 __m128d Xmm0d = _mm_cvtss_sd(Xmm0d, Xmm0);
89 double x = _mm_cvtsd_f64(Xmm0d);
90 double result = cos(x);
91 __m128d result128 = _mm_set_sd(result);
92 return _mm_cvtpd_ps(result128);
93}
94
96{
97 double x = _mm_cvtsd_f64(Xmm0);
98 double result = exp(x);
99 return _mm_set_sd(result);
100}
101
103{
104 __m128d Xmm0d = _mm_cvtss_sd(Xmm0d, Xmm0);
105 double x = _mm_cvtsd_f64(Xmm0d);
106 double result = exp(x);
107 __m128d result128 = _mm_set_sd(result);
108 return _mm_cvtpd_ps(result128);
109}
110
112{
113 double x = _mm_cvtsd_f64(Xmm0);
114 double result = log(x);
115 return _mm_set_sd(result);
116}
117
119{
120 __m128d Xmm0d = _mm_cvtss_sd(Xmm0d, Xmm0);
121 double x = _mm_cvtsd_f64(Xmm0d);
122 double result = log(x);
123 __m128d result128 = _mm_set_sd(result);
124 return _mm_cvtpd_ps(result128);
125}
126
128{
129 double x = _mm_cvtsd_f64(Xmm0);
130 double result = log10(x);
131 return _mm_set_sd(result);
132}
133
135{
136 __m128d Xmm0d = _mm_cvtss_sd(Xmm0d, Xmm0);
137 double x = _mm_cvtsd_f64(Xmm0d);
138 double result = log10(x);
139 __m128d result128 = _mm_set_sd(result);
140 return _mm_cvtpd_ps(result128);
141}
142
143__ATTRIBUTE_SSE2__ __m128d __libm_sse2_pow(__m128d Xmm0, __m128d Xmm1)
144{
145 double x = _mm_cvtsd_f64(Xmm0);
146 double y = _mm_cvtsd_f64(Xmm1);
147 double result = pow(x, y);
148 return _mm_set_sd(result);
149}
150
151__ATTRIBUTE_SSE2__ __m128 __libm_sse2_powf(__m128 Xmm0, __m128 Xmm1)
152{
153 float x = _mm_cvtss_f32(Xmm0);
154 float y = _mm_cvtss_f32(Xmm1);
155 float result = powf(x, y);
156 return _mm_set_ss(result);
157}
158
160{
161 double x = _mm_cvtsd_f64(Xmm0);
162 double result = sin(x);
163 return _mm_set_sd(result);
164}
165
167{
168 __m128d Xmm0d = _mm_cvtss_sd(Xmm0d, Xmm0);
169 double x = _mm_cvtsd_f64(Xmm0d);
170 double result = sin(x);
171 __m128d result128 = _mm_set_sd(result);
172 return _mm_cvtpd_ps(result128);
173}
174
176{
177 double x = _mm_cvtsd_f64(Xmm0);
178 double result = tan(x);
179 return _mm_set_sd(result);
180}
181
183{
184 __m128d Xmm0d = _mm_cvtss_sd(Xmm0d, Xmm0);
185 double x = _mm_cvtsd_f64(Xmm0d);
186 double result = tan(x);
187 __m128d result128 = _mm_set_sd(result);
188 return _mm_cvtpd_ps(result128);
189}
190
192{
193 double x = _mm_cvtsd_f64(Xmm0);
194 double result = acos(x);
195 return _mm_set_sd(result);
196}
197
199{
200 double x = _mm_cvtsd_f64(Xmm0);
201 double result = asin(x);
202 return _mm_set_sd(result);
203}
204
206{
207 double x = _mm_cvtsd_f64(Xmm0);
208 double result = atan(x);
209 return _mm_set_sd(result);
210}
211
213{
214 double x = _mm_cvtsd_f64(Xmm0);
215 double result = cos(x);
216 return _mm_set_sd(result);
217}
218
220{
221 double x = _mm_cvtsd_f64(Xmm0);
222 double result = exp(x);
223 return _mm_set_sd(result);
224}
225
227{
228 double x = _mm_cvtsd_f64(Xmm0);
229 double result = log(x);
230 return _mm_set_sd(result);
231}
232
234{
235 double x = _mm_cvtsd_f64(Xmm0);
236 double result = log10(x);
237 return _mm_set_sd(result);
238}
239
240__ATTRIBUTE_SSE2__ __m128d _libm_sse2_pow_precise(__m128d Xmm0, __m128d Xmm1)
241{
242 double x = _mm_cvtsd_f64(Xmm0);
243 double y = _mm_cvtsd_f64(Xmm1);
244 double result = pow(x, y);
245 return _mm_set_sd(result);
246}
247
249{
250 double x = _mm_cvtsd_f64(Xmm0);
251 double result = sin(x);
252 return _mm_set_sd(result);
253}
254
256{
257 double x = _mm_cvtsd_f64(Xmm0);
258 double result = sqrt(x);
259 return _mm_set_sd(result);
260}
261
263{
264 double x = _mm_cvtsd_f64(Xmm0);
265 double result = tan(x);
266 return _mm_set_sd(result);
267}
_STLP_DECLSPEC complex< float > _STLP_CALL cos(const complex< float > &)
_STLP_DECLSPEC complex< float > _STLP_CALL tan(const complex< float > &)
_STLP_DECLSPEC complex< float > _STLP_CALL sin(const complex< float > &)
_STLP_DECLSPEC complex< float > _STLP_CALL sqrt(const complex< float > &)
Definition: complex.cpp:188
valarray< _Tp > acos(const valarray< _Tp > &__x)
Definition: _valarray.h:901
valarray< _Tp > atan(const valarray< _Tp > &__x)
Definition: _valarray.h:919
valarray< _Tp > asin(const valarray< _Tp > &__x)
Definition: _valarray.h:910
valarray< _Tp > atan2(const valarray< _Tp > &__x, const valarray< _Tp > &__y)
Definition: _valarray.h:928
__m128 _mm_cvtpd_ps(__m128d a)
Definition: emmintrin.h:855
__m128d _mm_set_sd(double w)
Definition: emmintrin.h:1037
__m128d _mm_cvtss_sd(__m128d a, __m128 b)
Definition: emmintrin.h:900
double _mm_cvtsd_f64(__m128d a)
Definition: emmintrin.h:931
double log10(double x)
Definition: freeldr.c:190
double pow(double x, double y)
Definition: freeldr.c:178
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLuint64EXT * result
Definition: glext.h:11304
_Check_return_ float __cdecl powf(_In_ float b, _In_ float e)
Definition: math.h:246
__ATTRIBUTE_SSE2__ __m128 __libm_sse2_cosf(__m128 Xmm0)
Definition: libm_sse2.c:86
__ATTRIBUTE_SSE2__ __m128d _libm_sse2_cos_precise(__m128d Xmm0)
Definition: libm_sse2.c:212
__ATTRIBUTE_SSE2__ __m128 __libm_sse2_log10f(__m128 Xmm0)
Definition: libm_sse2.c:134
__ATTRIBUTE_SSE2__ __m128d __libm_sse2_atan(__m128d Xmm0)
Definition: libm_sse2.c:55
__ATTRIBUTE_SSE2__ __m128d __libm_sse2_acos(__m128d Xmm0)
Definition: libm_sse2.c:23
__ATTRIBUTE_SSE2__ __m128d _libm_sse2_log10_precise(__m128d Xmm0)
Definition: libm_sse2.c:233
__ATTRIBUTE_SSE2__ __m128d __libm_sse2_asin(__m128d Xmm0)
Definition: libm_sse2.c:39
__ATTRIBUTE_SSE2__ __m128 __libm_sse2_asinf(__m128 Xmm0)
Definition: libm_sse2.c:46
__ATTRIBUTE_SSE2__ __m128d _libm_sse2_acos_precise(__m128d Xmm0)
Definition: libm_sse2.c:191
#define __ATTRIBUTE_SSE2__
Definition: libm_sse2.c:16
__ATTRIBUTE_SSE2__ __m128d _libm_sse2_pow_precise(__m128d Xmm0, __m128d Xmm1)
Definition: libm_sse2.c:240
__ATTRIBUTE_SSE2__ __m128d _libm_sse2_asin_precise(__m128d Xmm0)
Definition: libm_sse2.c:198
__ATTRIBUTE_SSE2__ __m128d _libm_sse2_exp_precise(__m128d Xmm0)
Definition: libm_sse2.c:219
__ATTRIBUTE_SSE2__ __m128d _libm_sse2_sin_precise(__m128d Xmm0)
Definition: libm_sse2.c:248
__ATTRIBUTE_SSE2__ __m128d _libm_sse2_atan_precise(__m128d Xmm0)
Definition: libm_sse2.c:205
__ATTRIBUTE_SSE2__ __m128d _libm_sse2_tan_precise(__m128d Xmm0)
Definition: libm_sse2.c:262
__ATTRIBUTE_SSE2__ __m128d __libm_sse2_cos(__m128d Xmm0)
Definition: libm_sse2.c:79
__ATTRIBUTE_SSE2__ __m128d __libm_sse2_pow(__m128d Xmm0, __m128d Xmm1)
Definition: libm_sse2.c:143
__ATTRIBUTE_SSE2__ __m128d __libm_sse2_tan(__m128d Xmm0)
Definition: libm_sse2.c:175
__ATTRIBUTE_SSE2__ __m128 __libm_sse2_atanf(__m128 Xmm0)
Definition: libm_sse2.c:62
__ATTRIBUTE_SSE2__ __m128 __libm_sse2_sinf(__m128 Xmm0)
Definition: libm_sse2.c:166
__ATTRIBUTE_SSE2__ __m128 __libm_sse2_expf(__m128 Xmm0)
Definition: libm_sse2.c:102
__ATTRIBUTE_SSE2__ __m128 __libm_sse2_logf(__m128 Xmm0)
Definition: libm_sse2.c:118
__ATTRIBUTE_SSE2__ __m128 __libm_sse2_powf(__m128 Xmm0, __m128 Xmm1)
Definition: libm_sse2.c:151
__ATTRIBUTE_SSE2__ __m128d __libm_sse2_atan2(__m128d Xmm0, __m128d Xmm1)
Definition: libm_sse2.c:71
__ATTRIBUTE_SSE2__ __m128 __libm_sse2_acosf(__m128 Xmm0)
Definition: libm_sse2.c:30
__ATTRIBUTE_SSE2__ __m128d __libm_sse2_exp(__m128d Xmm0)
Definition: libm_sse2.c:95
__ATTRIBUTE_SSE2__ __m128d __libm_sse2_log(__m128d Xmm0)
Definition: libm_sse2.c:111
__ATTRIBUTE_SSE2__ __m128 __libm_sse2_tanf(__m128 Xmm0)
Definition: libm_sse2.c:182
__ATTRIBUTE_SSE2__ __m128d _libm_sse2_log_precise(__m128d Xmm0)
Definition: libm_sse2.c:226
__ATTRIBUTE_SSE2__ __m128d _libm_sse2_sqrt_precise(__m128d Xmm0)
Definition: libm_sse2.c:255
__ATTRIBUTE_SSE2__ __m128d __libm_sse2_log10(__m128d Xmm0)
Definition: libm_sse2.c:127
__ATTRIBUTE_SSE2__ __m128d __libm_sse2_sin(__m128d Xmm0)
Definition: libm_sse2.c:159
DWORD exp
Definition: msg.c:16058
#define log(outFile, fmt,...)
Definition: util.h:15
float _mm_cvtss_f32(__m128 a)
Definition: xmmintrin.h:921
__m128 _mm_set_ss(float a)
Definition: xmmintrin.h:1000