blob: 5535eb36af533391747c433cddc3393e2d4c919f [file] [log] [blame]
Anders Carlsson566d8da2008-12-22 00:01:20 +00001/*===---- xmmintrin.h - SSE intrinsics -------------------------------------===
2 *
3 * Permission is hereby granted, free of charge, to any person obtaining a copy
4 * of this software and associated documentation files (the "Software"), to deal
5 * in the Software without restriction, including without limitation the rights
6 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 * copies of the Software, and to permit persons to whom the Software is
8 * furnished to do so, subject to the following conditions:
9 *
10 * The above copyright notice and this permission notice shall be included in
11 * all copies or substantial portions of the Software.
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 * THE SOFTWARE.
20 *
21 *===-----------------------------------------------------------------------===
22 */
23
24#ifndef __XMMINTRIN_H
25#define __XMMINTRIN_H
26
27#ifndef __SSE__
28#error "MMX instruction set not enabled"
29#else
30
31typedef float __m128 __attribute__((__vector_size__(16)));
32
33static inline __m128 __attribute__((__always_inline__)) _mm_add_ss(__m128 a, __m128 b)
34{
35 return __builtin_ia32_addss(a, b);
36}
37
38static inline __m128 __attribute__((__always_inline__)) _mm_add_ps(__m128 a, __m128 b)
39{
40 return a + b;
41}
42
43static inline __m128 __attribute__((__always_inline__)) _mm_sub_ss(__m128 a, __m128 b)
44{
45 return __builtin_ia32_subss(a, b);
46}
47
48static inline __m128 __attribute__((__always_inline__)) _mm_sub_ps(__m128 a, __m128 b)
49{
50 return a - b;
51}
52
53static inline __m128 __attribute__((__always_inline__)) _mm_mul_ss(__m128 a, __m128 b)
54{
55 return __builtin_ia32_mulss(a, b);
56}
57
58static inline __m128 __attribute__((__always_inline__)) _mm_mul_ps(__m128 a, __m128 b)
59{
60 return a * b;
61}
62
63static inline __m128 __attribute__((__always_inline__)) _mm_div_ss(__m128 a, __m128 b)
64{
65 return __builtin_ia32_divss(a, b);
66}
67
68static inline __m128 __attribute__((__always_inline__)) _mm_div_ps(__m128 a, __m128 b)
69{
70 return a / b;
71}
72
73static inline __m128 __attribute__((__always_inline__)) _mm_sqrt_ss(__m128 a)
74{
75 return __builtin_ia32_sqrtss(a);
76}
77
78static inline __m128 __attribute__((__always_inline__)) _mm_sqrt_ps(__m128 a)
79{
80 return __builtin_ia32_sqrtps(a);
81}
82
83static inline __m128 __attribute__((__always_inline__)) _mm_rcp_ss(__m128 a)
84{
85 return __builtin_ia32_rcpss(a);
86}
87
88static inline __m128 __attribute__((__always_inline__)) _mm_rcp_ps(__m128 a)
89{
90 return __builtin_ia32_rcpps(a);
91}
92
93static inline __m128 __attribute__((__always_inline__)) _mm_rsqrt_ss(__m128 a)
94{
95 return __builtin_ia32_rsqrtss(a);
96}
97
98static inline __m128 __attribute__((__always_inline__)) _mm_rsqrt_ps(__m128 a)
99{
100 return __builtin_ia32_rsqrtps(a);
101}
102
103static inline __m128 __attribute__((__always_inline__)) _mm_min_ss(__m128 a, __m128 b)
104{
105 return __builtin_ia32_minss(a, b);
106}
107
108static inline __m128 __attribute__((__always_inline__)) _mm_min_ps(__m128 a, __m128 b)
109{
110 return __builtin_ia32_minps(a, b);
111}
112
113static inline __m128 __attribute__((__always_inline__)) _mm_max_ss(__m128 a, __m128 b)
114{
115 return __builtin_ia32_maxss(a, b);
116}
117
118static inline __m128 __attribute__((__always_inline__)) _mm_max_ps(__m128 a, __m128 b)
119{
120 return __builtin_ia32_maxps(a, b);
121}
122
123static inline __m128 __attribute__((__always_inline__)) _mm_and_ps(__m128 a, __m128 b)
124{
125 return __builtin_ia32_andps(a, b);
126}
127
128static inline __m128 __attribute__((__always_inline__)) _mm_andnot_ps(__m128 a, __m128 b)
129{
130 return __builtin_ia32_andnps(a, b);
131}
132
133static inline __m128 __attribute__((__always_inline__)) _mm_or_ps(__m128 a, __m128 b)
134{
135 return __builtin_ia32_orps(a, b);
136}
137
138static inline __m128 __attribute__((__always_inline__)) _mm_xor_ps(__m128 a, __m128 b)
139{
140 return __builtin_ia32_xorps(a, b);
141}
142
Anders Carlssonf62c6812008-12-22 00:28:39 +0000143static inline __m128 __attribute__((__always_inline__)) _mm_cmpeq_ss(__m128 a, __m128 b)
144{
145 return (__m128)__builtin_ia32_cmpeqss(a, b);
146}
147
148static inline __m128 __attribute__((__always_inline__)) _mm_cmpeq_ps(__m128 a, __m128 b)
149{
150 return (__m128)__builtin_ia32_cmpeqps(a, b);
151}
152
153static inline __m128 __attribute__((__always_inline__)) _mm_cmplt_ss(__m128 a, __m128 b)
154{
155 return (__m128)__builtin_ia32_cmpltss(a, b);
156}
157
158static inline __m128 __attribute__((__always_inline__)) _mm_cmplt_ps(__m128 a, __m128 b)
159{
160 return (__m128)__builtin_ia32_cmpltps(a, b);
161}
162
163static inline __m128 __attribute__((__always_inline__)) _mm_cmple_ss(__m128 a, __m128 b)
164{
165 return (__m128)__builtin_ia32_cmpless(a, b);
166}
167
168static inline __m128 __attribute__((__always_inline__)) _mm_cmple_ps(__m128 a, __m128 b)
169{
170 return (__m128)__builtin_ia32_cmpleps(a, b);
171}
172
173static inline __m128 __attribute__((__always_inline__)) _mm_cmpgt_ss(__m128 a, __m128 b)
174{
175 return (__m128)__builtin_ia32_cmpltss(b, a);
176}
177
178static inline __m128 __attribute__((__always_inline__)) _mm_cmpgt_ps(__m128 a, __m128 b)
179{
180 return (__m128)__builtin_ia32_cmpltps(b, a);
181}
182
183static inline __m128 __attribute__((__always_inline__)) _mm_cmpge_ss(__m128 a, __m128 b)
184{
185 return (__m128)__builtin_ia32_cmpless(b, a);
186}
187
188static inline __m128 __attribute__((__always_inline__)) _mm_cmpge_ps(__m128 a, __m128 b)
189{
190 return (__m128)__builtin_ia32_cmpleps(b, a);
191}
192
193static inline __m128 __attribute__((__always_inline__)) _mm_cmpneq_ss(__m128 a, __m128 b)
194{
195 return (__m128)__builtin_ia32_cmpneqss(a, b);
196}
197
198static inline __m128 __attribute__((__always_inline__)) _mm_cmpneq_ps(__m128 a, __m128 b)
199{
200 return (__m128)__builtin_ia32_cmpneqps(a, b);
201}
202
203static inline __m128 __attribute__((__always_inline__)) _mm_cmpnlt_ss(__m128 a, __m128 b)
204{
205 return (__m128)__builtin_ia32_cmpnltss(a, b);
206}
207
208static inline __m128 __attribute__((__always_inline__)) _mm_cmpnlt_ps(__m128 a, __m128 b)
209{
210 return (__m128)__builtin_ia32_cmpnltps(a, b);
211}
212
213static inline __m128 __attribute__((__always_inline__)) _mm_cmpnle_ss(__m128 a, __m128 b)
214{
215 return (__m128)__builtin_ia32_cmpnless(a, b);
216}
217
218static inline __m128 __attribute__((__always_inline__)) _mm_cmpnle_ps(__m128 a, __m128 b)
219{
220 return (__m128)__builtin_ia32_cmpnleps(a, b);
221}
222
223static inline __m128 __attribute__((__always_inline__)) _mm_cmpngt_ss(__m128 a, __m128 b)
224{
225 return (__m128)__builtin_ia32_cmpnltss(b, a);
226}
227
228static inline __m128 __attribute__((__always_inline__)) _mm_cmpngt_ps(__m128 a, __m128 b)
229{
230 return (__m128)__builtin_ia32_cmpnltps(b, a);
231}
232
233static inline __m128 __attribute__((__always_inline__)) _mm_cmpnge_ss(__m128 a, __m128 b)
234{
235 return (__m128)__builtin_ia32_cmpnless(b, a);
236}
237
238static inline __m128 __attribute__((__always_inline__)) _mm_cmpnge_ps(__m128 a, __m128 b)
239{
240 return (__m128)__builtin_ia32_cmpnleps(b, a);
241}
242
243static inline __m128 __attribute__((__always_inline__)) _mm_cmpord_ss(__m128 a, __m128 b)
244{
245 return (__m128)__builtin_ia32_cmpordss(a, b);
246}
247
248static inline __m128 __attribute__((__always_inline__)) _mm_cmpord_ps(__m128 a, __m128 b)
249{
250 return (__m128)__builtin_ia32_cmpordps(a, b);
251}
252
253static inline __m128 __attribute__((__always_inline__)) _mm_cmpunord_ss(__m128 a, __m128 b)
254{
255 return (__m128)__builtin_ia32_cmpunordss(a, b);
256}
257
258static inline __m128 __attribute__((__always_inline__)) _mm_cmpunord_ps(__m128 a, __m128 b)
259{
260 return (__m128)__builtin_ia32_cmpunordps(a, b);
261}
262
263static inline int __attribute__((__always_inline__)) _mm_comieq_ss(__m128 a, __m128 b)
264{
265 return __builtin_ia32_comieq(a, b);
266}
267
268static inline int __attribute__((__always_inline__)) _mm_comilt_ss(__m128 a, __m128 b)
269{
270 return __builtin_ia32_comilt(a, b);
271}
272
273static inline int __attribute__((__always_inline__)) _mm_comile_ss(__m128 a, __m128 b)
274{
275 return __builtin_ia32_comile(a, b);
276}
277
278static inline int __attribute__((__always_inline__)) _mm_comigt_ss(__m128 a, __m128 b)
279{
280 return __builtin_ia32_comigt(a, b);
281}
282
283static inline int __attribute__((__always_inline__)) _mm_comige_ss(__m128 a, __m128 b)
284{
285 return __builtin_ia32_comige(a, b);
286}
287
288static inline int __attribute__((__always_inline__)) _mm_comineq_ss(__m128 a, __m128 b)
289{
290 return __builtin_ia32_comineq(a, b);
291}
292
293static inline int __attribute__((__always_inline__)) _mm_ucomieq_ss(__m128 a, __m128 b)
294{
295 return __builtin_ia32_ucomieq(a, b);
296}
297
298static inline int __attribute__((__always_inline__)) _mm_ucomilt_ss(__m128 a, __m128 b)
299{
300 return __builtin_ia32_ucomilt(a, b);
301}
302
303static inline int __attribute__((__always_inline__)) _mm_ucomile_ss(__m128 a, __m128 b)
304{
305 return __builtin_ia32_ucomile(a, b);
306}
307
308static inline int __attribute__((__always_inline__)) _mm_ucomigt_ss(__m128 a, __m128 b)
309{
310 return __builtin_ia32_ucomigt(a, b);
311}
312
313static inline int __attribute__((__always_inline__)) _mm_ucomige_ss(__m128 a, __m128 b)
314{
315 return __builtin_ia32_ucomige(a, b);
316}
317
318static inline int __attribute__((__always_inline__)) _mm_ucomineq_ss(__m128 a, __m128 b)
319{
320 return __builtin_ia32_ucomineq(a, b);
321}
322
Anders Carlsson566d8da2008-12-22 00:01:20 +0000323#endif /* __SSE__ */
324
325#endif /* __XMMINTRIN_H */