blob: fec01549edc50d8d3d61b2373d9e02163596df74 [file] [log] [blame]
Anders Carlssonf15e71d2008-12-24 01:45:22 +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 __EMMINTRIN_H
25#define __EMMINTRIN_H
26
27#ifndef __SSE2__
28#error "SSE2 instruction set not enabled"
29#else
30
31#include <xmmintrin.h>
32
33typedef double __m128d __attribute__((__vector_size__(16)));
34typedef long long __m128i __attribute__((__vector_size__(16)));
35
36typedef int __v4si __attribute__((__vector_size__(16)));
Anders Carlssona283f912008-12-24 02:41:00 +000037typedef short __v8hi __attribute__((__vector_size__(16)));
Anders Carlsson327c8df2009-09-18 19:18:19 +000038typedef char __v16qi __attribute__((__vector_size__(16)));
Anders Carlssonf15e71d2008-12-24 01:45:22 +000039
Anders Carlsson823c02e2009-02-14 01:00:11 +000040static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +000041_mm_add_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000042{
Eli Friedmanebd93142009-06-06 02:13:04 +000043 a[0] += b[0];
44 return a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000045}
46
Anders Carlsson823c02e2009-02-14 01:00:11 +000047static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +000048_mm_add_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000049{
50 return a + b;
51}
52
Anders Carlsson823c02e2009-02-14 01:00:11 +000053static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +000054_mm_sub_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000055{
Eli Friedmanebd93142009-06-06 02:13:04 +000056 a[0] -= b[0];
57 return a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000058}
59
Anders Carlsson823c02e2009-02-14 01:00:11 +000060static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +000061_mm_sub_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000062{
63 return a - b;
64}
65
Anders Carlsson823c02e2009-02-14 01:00:11 +000066static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +000067_mm_mul_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000068{
Eli Friedmanebd93142009-06-06 02:13:04 +000069 a[0] *= b[0];
70 return a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000071}
72
Anders Carlsson823c02e2009-02-14 01:00:11 +000073static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +000074_mm_mul_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000075{
76 return a * b;
77}
78
Anders Carlsson823c02e2009-02-14 01:00:11 +000079static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +000080_mm_div_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000081{
Eli Friedmanebd93142009-06-06 02:13:04 +000082 a[0] /= b[0];
83 return a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000084}
85
Anders Carlsson823c02e2009-02-14 01:00:11 +000086static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +000087_mm_div_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000088{
89 return a / b;
90}
91
Anders Carlsson823c02e2009-02-14 01:00:11 +000092static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +000093_mm_sqrt_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000094{
95 __m128d c = __builtin_ia32_sqrtsd(b);
96 return (__m128d) { c[0], a[1] };
97}
98
Anders Carlsson823c02e2009-02-14 01:00:11 +000099static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000100_mm_sqrt_pd(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000101{
102 return __builtin_ia32_sqrtpd(a);
103}
104
Anders Carlsson823c02e2009-02-14 01:00:11 +0000105static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000106_mm_min_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000107{
108 return __builtin_ia32_minsd(a, b);
109}
110
Anders Carlsson823c02e2009-02-14 01:00:11 +0000111static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000112_mm_min_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000113{
114 return __builtin_ia32_minpd(a, b);
115}
116
Anders Carlsson823c02e2009-02-14 01:00:11 +0000117static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000118_mm_max_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000119{
120 return __builtin_ia32_maxsd(a, b);
121}
122
Anders Carlsson823c02e2009-02-14 01:00:11 +0000123static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000124_mm_max_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000125{
126 return __builtin_ia32_maxpd(a, b);
127}
128
Anders Carlsson823c02e2009-02-14 01:00:11 +0000129static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000130_mm_and_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000131{
Eli Friedmand00fd282009-06-06 03:45:06 +0000132 return (__m128d)((__v4si)a & (__v4si)b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000133}
134
Anders Carlsson823c02e2009-02-14 01:00:11 +0000135static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000136_mm_andnot_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000137{
Eli Friedmand00fd282009-06-06 03:45:06 +0000138 return (__m128d)(~(__v4si)a & (__v4si)b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000139}
140
Anders Carlsson823c02e2009-02-14 01:00:11 +0000141static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000142_mm_or_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000143{
Eli Friedmand00fd282009-06-06 03:45:06 +0000144 return (__m128d)((__v4si)a | (__v4si)b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000145}
146
Anders Carlsson823c02e2009-02-14 01:00:11 +0000147static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000148_mm_xor_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000149{
Eli Friedmand00fd282009-06-06 03:45:06 +0000150 return (__m128d)((__v4si)a ^ (__v4si)b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000151}
152
Anders Carlsson823c02e2009-02-14 01:00:11 +0000153static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000154_mm_cmpeq_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000155{
Anders Carlsson20812002009-05-18 19:16:46 +0000156 return (__m128d)__builtin_ia32_cmppd(a, b, 0);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000157}
158
Anders Carlsson823c02e2009-02-14 01:00:11 +0000159static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000160_mm_cmplt_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000161{
Anders Carlsson20812002009-05-18 19:16:46 +0000162 return (__m128d)__builtin_ia32_cmppd(a, b, 1);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000163}
164
Anders Carlsson823c02e2009-02-14 01:00:11 +0000165static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000166_mm_cmple_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000167{
Anders Carlsson20812002009-05-18 19:16:46 +0000168 return (__m128d)__builtin_ia32_cmppd(a, b, 2);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000169}
170
Anders Carlsson823c02e2009-02-14 01:00:11 +0000171static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000172_mm_cmpgt_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000173{
Anders Carlsson20812002009-05-18 19:16:46 +0000174 return (__m128d)__builtin_ia32_cmppd(b, a, 1);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000175}
176
Anders Carlsson823c02e2009-02-14 01:00:11 +0000177static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000178_mm_cmpge_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000179{
Anders Carlsson20812002009-05-18 19:16:46 +0000180 return (__m128d)__builtin_ia32_cmppd(b, a, 2);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000181}
182
Anders Carlsson823c02e2009-02-14 01:00:11 +0000183static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000184_mm_cmpord_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000185{
Anders Carlsson20812002009-05-18 19:16:46 +0000186 return (__m128d)__builtin_ia32_cmppd(a, b, 7);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000187}
188
Anders Carlsson823c02e2009-02-14 01:00:11 +0000189static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000190_mm_cmpunord_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000191{
Anders Carlsson20812002009-05-18 19:16:46 +0000192 return (__m128d)__builtin_ia32_cmppd(a, b, 3);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000193}
194
Anders Carlsson823c02e2009-02-14 01:00:11 +0000195static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000196_mm_cmpneq_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000197{
Anders Carlsson20812002009-05-18 19:16:46 +0000198 return (__m128d)__builtin_ia32_cmppd(a, b, 4);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000199}
200
Anders Carlsson823c02e2009-02-14 01:00:11 +0000201static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000202_mm_cmpnlt_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000203{
Anders Carlsson20812002009-05-18 19:16:46 +0000204 return (__m128d)__builtin_ia32_cmppd(a, b, 5);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000205}
206
Anders Carlsson823c02e2009-02-14 01:00:11 +0000207static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000208_mm_cmpnle_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000209{
Anders Carlsson20812002009-05-18 19:16:46 +0000210 return (__m128d)__builtin_ia32_cmppd(a, b, 6);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000211}
212
Anders Carlsson823c02e2009-02-14 01:00:11 +0000213static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000214_mm_cmpngt_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000215{
Anders Carlsson20812002009-05-18 19:16:46 +0000216 return (__m128d)__builtin_ia32_cmppd(b, a, 5);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000217}
218
Anders Carlsson823c02e2009-02-14 01:00:11 +0000219static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000220_mm_cmpnge_pd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000221{
Anders Carlsson20812002009-05-18 19:16:46 +0000222 return (__m128d)__builtin_ia32_cmppd(b, a, 6);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000223}
224
Anders Carlsson823c02e2009-02-14 01:00:11 +0000225static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000226_mm_cmpeq_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000227{
Anders Carlsson20812002009-05-18 19:16:46 +0000228 return (__m128d)__builtin_ia32_cmpsd(a, b, 0);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000229}
230
Anders Carlsson823c02e2009-02-14 01:00:11 +0000231static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000232_mm_cmplt_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000233{
Anders Carlsson20812002009-05-18 19:16:46 +0000234 return (__m128d)__builtin_ia32_cmpsd(a, b, 1);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000235}
236
Anders Carlsson823c02e2009-02-14 01:00:11 +0000237static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000238_mm_cmple_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000239{
Anders Carlsson20812002009-05-18 19:16:46 +0000240 return (__m128d)__builtin_ia32_cmpsd(a, b, 2);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000241}
242
Anders Carlsson823c02e2009-02-14 01:00:11 +0000243static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000244_mm_cmpgt_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000245{
Anders Carlsson20812002009-05-18 19:16:46 +0000246 return (__m128d)__builtin_ia32_cmpsd(b, a, 1);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000247}
248
Anders Carlsson823c02e2009-02-14 01:00:11 +0000249static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000250_mm_cmpge_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000251{
Anders Carlsson20812002009-05-18 19:16:46 +0000252 return (__m128d)__builtin_ia32_cmpsd(b, a, 2);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000253}
254
Anders Carlsson823c02e2009-02-14 01:00:11 +0000255static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000256_mm_cmpord_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000257{
Anders Carlsson20812002009-05-18 19:16:46 +0000258 return (__m128d)__builtin_ia32_cmpsd(a, b, 7);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000259}
260
Anders Carlsson823c02e2009-02-14 01:00:11 +0000261static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000262_mm_cmpunord_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000263{
Anders Carlsson20812002009-05-18 19:16:46 +0000264 return (__m128d)__builtin_ia32_cmpsd(a, b, 3);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000265}
266
Anders Carlsson823c02e2009-02-14 01:00:11 +0000267static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000268_mm_cmpneq_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000269{
Anders Carlsson20812002009-05-18 19:16:46 +0000270 return (__m128d)__builtin_ia32_cmpsd(a, b, 4);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000271}
272
Anders Carlsson823c02e2009-02-14 01:00:11 +0000273static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000274_mm_cmpnlt_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000275{
Anders Carlsson20812002009-05-18 19:16:46 +0000276 return (__m128d)__builtin_ia32_cmpsd(a, b, 5);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000277}
278
Anders Carlsson823c02e2009-02-14 01:00:11 +0000279static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000280_mm_cmpnle_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000281{
Anders Carlsson20812002009-05-18 19:16:46 +0000282 return (__m128d)__builtin_ia32_cmpsd(a, b, 6);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000283}
284
Anders Carlsson823c02e2009-02-14 01:00:11 +0000285static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000286_mm_cmpngt_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000287{
Anders Carlsson20812002009-05-18 19:16:46 +0000288 return (__m128d)__builtin_ia32_cmpsd(b, a, 5);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000289}
290
Anders Carlsson823c02e2009-02-14 01:00:11 +0000291static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000292_mm_cmpnge_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000293{
Anders Carlsson20812002009-05-18 19:16:46 +0000294 return (__m128d)__builtin_ia32_cmpsd(b, a, 6);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000295}
296
Anders Carlsson823c02e2009-02-14 01:00:11 +0000297static inline int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000298_mm_comieq_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000299{
300 return __builtin_ia32_comisdeq(a, b);
301}
302
Anders Carlsson823c02e2009-02-14 01:00:11 +0000303static inline int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000304_mm_comilt_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000305{
306 return __builtin_ia32_comisdlt(a, b);
307}
308
Anders Carlsson823c02e2009-02-14 01:00:11 +0000309static inline int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000310_mm_comile_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000311{
312 return __builtin_ia32_comisdle(a, b);
313}
314
Anders Carlsson823c02e2009-02-14 01:00:11 +0000315static inline int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000316_mm_comigt_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000317{
318 return __builtin_ia32_comisdgt(a, b);
319}
320
Anders Carlsson823c02e2009-02-14 01:00:11 +0000321static inline int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000322_mm_comineq_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000323{
324 return __builtin_ia32_comisdneq(a, b);
325}
326
Anders Carlsson823c02e2009-02-14 01:00:11 +0000327static inline int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000328_mm_ucomieq_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000329{
330 return __builtin_ia32_ucomisdeq(a, b);
331}
332
Anders Carlsson823c02e2009-02-14 01:00:11 +0000333static inline int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000334_mm_ucomilt_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000335{
336 return __builtin_ia32_ucomisdlt(a, b);
337}
338
Anders Carlsson823c02e2009-02-14 01:00:11 +0000339static inline int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000340_mm_ucomile_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000341{
342 return __builtin_ia32_ucomisdle(a, b);
343}
344
Anders Carlsson823c02e2009-02-14 01:00:11 +0000345static inline int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000346_mm_ucomigt_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000347{
348 return __builtin_ia32_ucomisdgt(a, b);
349}
350
Anders Carlsson823c02e2009-02-14 01:00:11 +0000351static inline int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000352_mm_ucomineq_sd(__m128d a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000353{
354 return __builtin_ia32_ucomisdneq(a, b);
355}
356
Anders Carlsson823c02e2009-02-14 01:00:11 +0000357static inline __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000358_mm_cvtpd_ps(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000359{
360 return __builtin_ia32_cvtpd2ps(a);
361}
362
Anders Carlsson823c02e2009-02-14 01:00:11 +0000363static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000364_mm_cvtps_pd(__m128 a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000365{
366 return __builtin_ia32_cvtps2pd(a);
367}
368
Anders Carlsson823c02e2009-02-14 01:00:11 +0000369static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000370_mm_cvtepi32_pd(__m128i a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000371{
372 return __builtin_ia32_cvtdq2pd((__v4si)a);
373}
374
Anders Carlsson823c02e2009-02-14 01:00:11 +0000375static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000376_mm_cvtpd_epi32(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000377{
378 return __builtin_ia32_cvtpd2dq(a);
379}
380
Anders Carlsson823c02e2009-02-14 01:00:11 +0000381static inline int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000382_mm_cvtsd_si32(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000383{
384 return __builtin_ia32_cvtsd2si(a);
385}
386
Anders Carlsson823c02e2009-02-14 01:00:11 +0000387static inline __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000388_mm_cvtsd_ss(__m128 a, __m128d b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000389{
Eli Friedmanebd93142009-06-06 02:13:04 +0000390 a[0] = b[0];
391 return a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000392}
393
Anders Carlsson823c02e2009-02-14 01:00:11 +0000394static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000395_mm_cvtsi32_sd(__m128d a, int b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000396{
Eli Friedman4d8d7d32009-06-06 08:08:06 +0000397 a[0] = b;
398 return a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000399}
400
Anders Carlsson823c02e2009-02-14 01:00:11 +0000401static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000402_mm_cvtss_sd(__m128d a, __m128 b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000403{
Eli Friedmanebd93142009-06-06 02:13:04 +0000404 a[0] = b[0];
405 return a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000406}
407
Anders Carlsson823c02e2009-02-14 01:00:11 +0000408static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000409_mm_cvttpd_epi32(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000410{
411 return (__m128i)__builtin_ia32_cvttpd2dq(a);
412}
413
Anders Carlsson823c02e2009-02-14 01:00:11 +0000414static inline int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000415_mm_cvttsd_si32(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000416{
Eli Friedmanebd93142009-06-06 02:13:04 +0000417 return a[0];
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000418}
419
Anders Carlsson823c02e2009-02-14 01:00:11 +0000420static inline __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000421_mm_cvtpd_pi32(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000422{
423 return (__m64)__builtin_ia32_cvtpd2pi(a);
424}
425
Anders Carlsson823c02e2009-02-14 01:00:11 +0000426static inline __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000427_mm_cvttpd_pi32(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000428{
429 return (__m64)__builtin_ia32_cvttpd2pi(a);
430}
431
Anders Carlsson823c02e2009-02-14 01:00:11 +0000432static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000433_mm_cvtpi32_pd(__m64 a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000434{
435 return __builtin_ia32_cvtpi2pd((__v2si)a);
436}
437
Anders Carlsson823c02e2009-02-14 01:00:11 +0000438static inline double __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000439_mm_cvtsd_f64(__m128d a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000440{
441 return a[0];
442}
443
Anders Carlsson823c02e2009-02-14 01:00:11 +0000444static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000445_mm_load_pd(double const *dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000446{
447 return *(__m128d*)dp;
448}
449
Anders Carlsson823c02e2009-02-14 01:00:11 +0000450static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000451_mm_load1_pd(double const *dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000452{
453 return (__m128d){ dp[0], dp[0] };
454}
455
Eli Friedmanf83c2582009-06-02 05:55:48 +0000456#define _mm_load_pd1(dp) _mm_load1_pd(dp)
457
Anders Carlsson823c02e2009-02-14 01:00:11 +0000458static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000459_mm_loadr_pd(double const *dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000460{
461 return (__m128d){ dp[1], dp[0] };
462}
463
Anders Carlsson823c02e2009-02-14 01:00:11 +0000464static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000465_mm_loadu_pd(double const *dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000466{
467 return __builtin_ia32_loadupd(dp);
468}
469
Anders Carlsson823c02e2009-02-14 01:00:11 +0000470static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000471_mm_load_sd(double const *dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000472{
473 return (__m128d){ *dp, 0.0 };
474}
475
Anders Carlsson823c02e2009-02-14 01:00:11 +0000476static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000477_mm_loadh_pd(__m128d a, double const *dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000478{
479 return __builtin_shufflevector(a, *(__m128d *)dp, 0, 2);
480}
481
Anders Carlsson823c02e2009-02-14 01:00:11 +0000482static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000483_mm_loadl_pd(__m128d a, double const *dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000484{
485 return __builtin_shufflevector(a, *(__m128d *)dp, 2, 1);
486}
487
Anders Carlsson823c02e2009-02-14 01:00:11 +0000488static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000489_mm_set_sd(double w)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000490{
491 return (__m128d){ w, 0 };
492}
493
Anders Carlsson823c02e2009-02-14 01:00:11 +0000494static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000495_mm_set1_pd(double w)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000496{
497 return (__m128d){ w, w };
498}
499
Anders Carlsson823c02e2009-02-14 01:00:11 +0000500static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000501_mm_set_pd(double w, double x)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000502{
Anders Carlssondfa31172009-09-18 17:03:55 +0000503 return (__m128d){ x, w };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000504}
505
Anders Carlsson823c02e2009-02-14 01:00:11 +0000506static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000507_mm_setr_pd(double w, double x)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000508{
Anders Carlssondfa31172009-09-18 17:03:55 +0000509 return (__m128d){ w, x };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000510}
511
Anders Carlsson823c02e2009-02-14 01:00:11 +0000512static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000513_mm_setzero_pd(void)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000514{
515 return (__m128d){ 0, 0 };
516}
517
Anders Carlsson823c02e2009-02-14 01:00:11 +0000518static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000519_mm_move_sd(__m128d a, __m128d b)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000520{
521 return (__m128d){ b[0], a[1] };
522}
523
Anders Carlsson823c02e2009-02-14 01:00:11 +0000524static inline void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000525_mm_store_sd(double *dp, __m128d a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000526{
527 dp[0] = a[0];
528}
529
Anders Carlsson823c02e2009-02-14 01:00:11 +0000530static inline void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000531_mm_store1_pd(double *dp, __m128d a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000532{
533 dp[0] = a[0];
534 dp[1] = a[0];
535}
536
Anders Carlsson823c02e2009-02-14 01:00:11 +0000537static inline void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000538_mm_store_pd(double *dp, __m128d a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000539{
540 *(__m128d *)dp = a;
541}
542
Anders Carlsson823c02e2009-02-14 01:00:11 +0000543static inline void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000544_mm_storeu_pd(double *dp, __m128d a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000545{
546 __builtin_ia32_storeupd(dp, a);
547}
548
Anders Carlsson823c02e2009-02-14 01:00:11 +0000549static inline void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000550_mm_storer_pd(double *dp, __m128d a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000551{
552 dp[0] = a[1];
553 dp[1] = a[0];
554}
555
Anders Carlsson823c02e2009-02-14 01:00:11 +0000556static inline void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000557_mm_storeh_pd(double *dp, __m128d a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000558{
559 dp[0] = a[1];
560}
561
Anders Carlsson823c02e2009-02-14 01:00:11 +0000562static inline void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000563_mm_storel_pd(double *dp, __m128d a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000564{
565 dp[0] = a[0];
566}
567
Anders Carlsson823c02e2009-02-14 01:00:11 +0000568static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000569_mm_add_epi8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000570{
571 return (__m128i)((__v16qi)a + (__v16qi)b);
572}
573
Anders Carlsson823c02e2009-02-14 01:00:11 +0000574static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000575_mm_add_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000576{
577 return (__m128i)((__v8hi)a + (__v8hi)b);
578}
579
Anders Carlsson823c02e2009-02-14 01:00:11 +0000580static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000581_mm_add_epi32(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000582{
583 return (__m128i)((__v4si)a + (__v4si)b);
584}
585
Anders Carlsson823c02e2009-02-14 01:00:11 +0000586static inline __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000587_mm_add_si64(__m64 a, __m64 b)
Anders Carlssona283f912008-12-24 02:41:00 +0000588{
589 return a + b;
590}
591
Anders Carlsson823c02e2009-02-14 01:00:11 +0000592static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000593_mm_add_epi64(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000594{
595 return a + b;
596}
597
Anders Carlsson823c02e2009-02-14 01:00:11 +0000598static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000599_mm_adds_epi8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000600{
601 return (__m128i)__builtin_ia32_paddsb128((__v16qi)a, (__v16qi)b);
602}
603
Anders Carlsson823c02e2009-02-14 01:00:11 +0000604static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000605_mm_adds_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000606{
607 return (__m128i)__builtin_ia32_paddsw128((__v8hi)a, (__v8hi)b);
608}
609
Anders Carlsson823c02e2009-02-14 01:00:11 +0000610static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000611_mm_adds_epu8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000612{
613 return (__m128i)__builtin_ia32_paddusb128((__v16qi)a, (__v16qi)b);
614}
615
Anders Carlsson823c02e2009-02-14 01:00:11 +0000616static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000617_mm_adds_epu16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000618{
619 return (__m128i)__builtin_ia32_paddusw128((__v8hi)a, (__v8hi)b);
620}
621
Anders Carlsson823c02e2009-02-14 01:00:11 +0000622static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000623_mm_avg_epu8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000624{
625 return (__m128i)__builtin_ia32_pavgb128((__v16qi)a, (__v16qi)b);
626}
627
Anders Carlsson823c02e2009-02-14 01:00:11 +0000628static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000629_mm_avg_epu16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000630{
631 return (__m128i)__builtin_ia32_pavgw128((__v8hi)a, (__v8hi)b);
632}
633
Anders Carlsson823c02e2009-02-14 01:00:11 +0000634static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000635_mm_madd_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000636{
637 return (__m128i)__builtin_ia32_pmaddwd128((__v8hi)a, (__v8hi)b);
638}
639
Anders Carlsson823c02e2009-02-14 01:00:11 +0000640static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000641_mm_max_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000642{
643 return (__m128i)__builtin_ia32_pmaxsw128((__v8hi)a, (__v8hi)b);
644}
645
Anders Carlsson823c02e2009-02-14 01:00:11 +0000646static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000647_mm_max_epu8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000648{
649 return (__m128i)__builtin_ia32_pmaxub128((__v16qi)a, (__v16qi)b);
650}
651
Anders Carlsson823c02e2009-02-14 01:00:11 +0000652static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000653_mm_min_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000654{
655 return (__m128i)__builtin_ia32_pminsw128((__v8hi)a, (__v8hi)b);
656}
657
Anders Carlsson823c02e2009-02-14 01:00:11 +0000658static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000659_mm_min_epu8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000660{
661 return (__m128i)__builtin_ia32_pminub128((__v16qi)a, (__v16qi)b);
662}
663
Anders Carlsson823c02e2009-02-14 01:00:11 +0000664static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000665_mm_mulhi_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000666{
667 return (__m128i)__builtin_ia32_pmulhw128((__v8hi)a, (__v8hi)b);
668}
669
Anders Carlsson823c02e2009-02-14 01:00:11 +0000670static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000671_mm_mulhi_epu16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000672{
673 return (__m128i)__builtin_ia32_pmulhuw128((__v8hi)a, (__v8hi)b);
674}
675
Anders Carlsson823c02e2009-02-14 01:00:11 +0000676static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000677_mm_mullo_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000678{
Eli Friedman4d8d7d32009-06-06 08:08:06 +0000679 return (__m128i)((__v8hi)a * (__v8hi)b);
Anders Carlssona283f912008-12-24 02:41:00 +0000680}
681
Anders Carlsson823c02e2009-02-14 01:00:11 +0000682static inline __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000683_mm_mul_su32(__m64 a, __m64 b)
Anders Carlssona283f912008-12-24 02:41:00 +0000684{
685 return __builtin_ia32_pmuludq((__v2si)a, (__v2si)b);
686}
687
Anders Carlsson823c02e2009-02-14 01:00:11 +0000688static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000689_mm_mul_epu32(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000690{
691 return __builtin_ia32_pmuludq128((__v4si)a, (__v4si)b);
692}
693
Anders Carlsson823c02e2009-02-14 01:00:11 +0000694static inline __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson57640932009-04-06 21:55:22 +0000695_mm_sad_epu8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000696{
697 return __builtin_ia32_psadbw128((__v16qi)a, (__v16qi)b);
698}
699
Anders Carlsson823c02e2009-02-14 01:00:11 +0000700static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000701_mm_sub_epi8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000702{
703 return (__m128i)((__v16qi)a - (__v16qi)b);
704}
705
Anders Carlsson823c02e2009-02-14 01:00:11 +0000706static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000707_mm_sub_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000708{
709 return (__m128i)((__v8hi)a - (__v8hi)b);
710}
711
Anders Carlsson823c02e2009-02-14 01:00:11 +0000712static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000713_mm_sub_epi32(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000714{
715 return (__m128i)((__v4si)a - (__v4si)b);
716}
717
Anders Carlsson823c02e2009-02-14 01:00:11 +0000718static inline __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000719_mm_sub_si64(__m64 a, __m64 b)
Anders Carlssona283f912008-12-24 02:41:00 +0000720{
721 return a - b;
722}
723
Anders Carlsson823c02e2009-02-14 01:00:11 +0000724static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000725_mm_sub_epi64(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000726{
727 return a - b;
728}
729
Anders Carlsson823c02e2009-02-14 01:00:11 +0000730static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000731_mm_subs_epi8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000732{
733 return (__m128i)__builtin_ia32_psubsb128((__v16qi)a, (__v16qi)b);
734}
735
Anders Carlsson823c02e2009-02-14 01:00:11 +0000736static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000737_mm_subs_epi16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000738{
739 return (__m128i)__builtin_ia32_psubsw128((__v8hi)a, (__v8hi)b);
740}
741
Anders Carlsson823c02e2009-02-14 01:00:11 +0000742static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000743_mm_subs_epu8(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000744{
745 return (__m128i)__builtin_ia32_psubusb128((__v16qi)a, (__v16qi)b);
746}
747
Anders Carlsson823c02e2009-02-14 01:00:11 +0000748static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000749_mm_subs_epu16(__m128i a, __m128i b)
Anders Carlssona283f912008-12-24 02:41:00 +0000750{
751 return (__m128i)__builtin_ia32_psubusw128((__v8hi)a, (__v8hi)b);
752}
753
Anders Carlsson823c02e2009-02-14 01:00:11 +0000754static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000755_mm_and_si128(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000756{
Eli Friedmanebd93142009-06-06 02:13:04 +0000757 return a & b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000758}
759
Anders Carlsson823c02e2009-02-14 01:00:11 +0000760static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000761_mm_andnot_si128(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000762{
Eli Friedmanebd93142009-06-06 02:13:04 +0000763 return ~a & b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000764}
765
Anders Carlsson823c02e2009-02-14 01:00:11 +0000766static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000767_mm_or_si128(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000768{
Eli Friedmanebd93142009-06-06 02:13:04 +0000769 return a | b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000770}
771
Anders Carlsson823c02e2009-02-14 01:00:11 +0000772static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000773_mm_xor_si128(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000774{
Eli Friedmanebd93142009-06-06 02:13:04 +0000775 return a ^ b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000776}
777
Anders Carlsson823c02e2009-02-14 01:00:11 +0000778static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000779_mm_slli_si128(__m128i a, int imm)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000780{
781 return __builtin_ia32_pslldqi128(a, imm * 8);
782}
783
Anders Carlsson823c02e2009-02-14 01:00:11 +0000784static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000785_mm_slli_epi16(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000786{
787 return (__m128i)__builtin_ia32_psllwi128((__v8hi)a, count);
788}
789
Anders Carlsson823c02e2009-02-14 01:00:11 +0000790static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000791_mm_sll_epi16(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000792{
793 return (__m128i)__builtin_ia32_psllw128((__v8hi)a, (__v8hi)count);
794}
795
Anders Carlsson823c02e2009-02-14 01:00:11 +0000796static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000797_mm_slli_epi32(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000798{
799 return (__m128i)__builtin_ia32_pslldi128((__v4si)a, count);
800}
801
Anders Carlsson823c02e2009-02-14 01:00:11 +0000802static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000803_mm_sll_epi32(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000804{
805 return (__m128i)__builtin_ia32_pslld128((__v4si)a, (__v4si)count);
806}
807
Anders Carlsson823c02e2009-02-14 01:00:11 +0000808static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000809_mm_slli_epi64(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000810{
811 return __builtin_ia32_psllqi128(a, count);
812}
813
Anders Carlsson823c02e2009-02-14 01:00:11 +0000814static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000815_mm_sll_epi64(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000816{
817 return __builtin_ia32_psllq128(a, count);
818}
819
Anders Carlsson823c02e2009-02-14 01:00:11 +0000820static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000821_mm_srai_epi16(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000822{
823 return (__m128i)__builtin_ia32_psrawi128((__v8hi)a, count);
824}
825
Anders Carlsson823c02e2009-02-14 01:00:11 +0000826static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000827_mm_sra_epi16(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000828{
829 return (__m128i)__builtin_ia32_psraw128((__v8hi)a, (__v8hi)count);
830}
831
Anders Carlsson823c02e2009-02-14 01:00:11 +0000832static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000833_mm_srai_epi32(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000834{
835 return (__m128i)__builtin_ia32_psradi128((__v4si)a, count);
836}
837
Anders Carlsson823c02e2009-02-14 01:00:11 +0000838static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000839_mm_sra_epi32(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000840{
841 return (__m128i)__builtin_ia32_psrad128((__v4si)a, (__v4si)count);
842}
843
Anders Carlsson823c02e2009-02-14 01:00:11 +0000844static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000845_mm_srli_si128(__m128i a, int imm)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000846{
847 return __builtin_ia32_psrldqi128(a, imm * 8);
848}
849
Anders Carlsson823c02e2009-02-14 01:00:11 +0000850static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000851_mm_srli_epi16(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000852{
853 return (__m128i)__builtin_ia32_psrlwi128((__v8hi)a, count);
854}
855
Anders Carlsson823c02e2009-02-14 01:00:11 +0000856static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000857_mm_srl_epi16(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000858{
859 return (__m128i)__builtin_ia32_psrlw128((__v8hi)a, (__v8hi)count);
860}
861
Anders Carlsson823c02e2009-02-14 01:00:11 +0000862static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000863_mm_srli_epi32(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000864{
865 return (__m128i)__builtin_ia32_psrldi128((__v4si)a, count);
866}
867
Anders Carlsson823c02e2009-02-14 01:00:11 +0000868static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000869_mm_srl_epi32(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000870{
871 return (__m128i)__builtin_ia32_psrld128((__v4si)a, (__v4si)count);
872}
873
Anders Carlsson823c02e2009-02-14 01:00:11 +0000874static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000875_mm_srli_epi64(__m128i a, int count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000876{
877 return __builtin_ia32_psrlqi128(a, count);
878}
879
Anders Carlsson823c02e2009-02-14 01:00:11 +0000880static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000881_mm_srl_epi64(__m128i a, __m128i count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000882{
883 return __builtin_ia32_psrlq128(a, count);
884}
885
Anders Carlsson823c02e2009-02-14 01:00:11 +0000886static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000887_mm_cmpeq_epi8(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000888{
Eli Friedman51733492009-07-22 17:08:01 +0000889 return (__m128i)((__v16qi)a == (__v16qi)b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000890}
891
Anders Carlsson823c02e2009-02-14 01:00:11 +0000892static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000893_mm_cmpeq_epi16(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000894{
Eli Friedman51733492009-07-22 17:08:01 +0000895 return (__m128i)((__v8hi)a == (__v8hi)b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000896}
897
Anders Carlsson823c02e2009-02-14 01:00:11 +0000898static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000899_mm_cmpeq_epi32(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000900{
Eli Friedman51733492009-07-22 17:08:01 +0000901 return (__m128i)((__v4si)a == (__v4si)b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000902}
903
Anders Carlsson823c02e2009-02-14 01:00:11 +0000904static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000905_mm_cmpgt_epi8(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000906{
Eli Friedman51733492009-07-22 17:08:01 +0000907 return (__m128i)((__v16qi)a > (__v16qi)b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000908}
909
Anders Carlsson823c02e2009-02-14 01:00:11 +0000910static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000911_mm_cmpgt_epi16(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000912{
Eli Friedman51733492009-07-22 17:08:01 +0000913 return (__m128i)((__v8hi)a > (__v8hi)b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000914}
915
Anders Carlsson823c02e2009-02-14 01:00:11 +0000916static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000917_mm_cmpgt_epi32(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000918{
Eli Friedman51733492009-07-22 17:08:01 +0000919 return (__m128i)((__v4si)a > (__v4si)b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000920}
921
Anders Carlsson823c02e2009-02-14 01:00:11 +0000922static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000923_mm_cmplt_epi8(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000924{
Eli Friedman51733492009-07-22 17:08:01 +0000925 return _mm_cmpgt_epi8(b,a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000926}
927
Anders Carlsson823c02e2009-02-14 01:00:11 +0000928static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000929_mm_cmplt_epi16(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000930{
Eli Friedman51733492009-07-22 17:08:01 +0000931 return _mm_cmpgt_epi16(b,a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000932}
933
Anders Carlsson823c02e2009-02-14 01:00:11 +0000934static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000935_mm_cmplt_epi32(__m128i a, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000936{
Eli Friedman51733492009-07-22 17:08:01 +0000937 return _mm_cmpgt_epi32(b,a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000938}
939
940#ifdef __x86_64__
Anders Carlsson823c02e2009-02-14 01:00:11 +0000941static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000942_mm_cvtsi64_sd(__m128d a, long long b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000943{
Eli Friedmanebd93142009-06-06 02:13:04 +0000944 a[0] = b;
945 return a;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000946}
947
Anders Carlsson823c02e2009-02-14 01:00:11 +0000948static inline long long __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000949_mm_cvtsd_si64(__m128d a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000950{
951 return __builtin_ia32_cvtsd2si64(a);
952}
953
Anders Carlsson823c02e2009-02-14 01:00:11 +0000954static inline long long __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000955_mm_cvttsd_si64(__m128d a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000956{
Eli Friedmanebd93142009-06-06 02:13:04 +0000957 return a[0];
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000958}
959#endif
960
Anders Carlsson823c02e2009-02-14 01:00:11 +0000961static inline __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000962_mm_cvtepi32_ps(__m128i a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000963{
964 return __builtin_ia32_cvtdq2ps((__v4si)a);
965}
966
Anders Carlsson823c02e2009-02-14 01:00:11 +0000967static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000968_mm_cvtps_epi32(__m128 a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000969{
970 return (__m128i)__builtin_ia32_cvtps2dq(a);
971}
972
Anders Carlsson823c02e2009-02-14 01:00:11 +0000973static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000974_mm_cvttps_epi32(__m128 a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000975{
976 return (__m128i)__builtin_ia32_cvttps2dq(a);
977}
978
Anders Carlsson823c02e2009-02-14 01:00:11 +0000979static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000980_mm_cvtsi32_si128(int a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000981{
982 return (__m128i)(__v4si){ a, 0, 0, 0 };
983}
984
985#ifdef __x86_64__
Anders Carlsson823c02e2009-02-14 01:00:11 +0000986static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000987_mm_cvtsi64_si128(long long a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000988{
989 return (__m128i){ a, 0 };
990}
991#endif
992
Anders Carlsson823c02e2009-02-14 01:00:11 +0000993static inline int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000994_mm_cvtsi128_si32(__m128i a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000995{
996 __v4si b = (__v4si)a;
997 return b[0];
998}
999
1000#ifdef __x86_64__
Anders Carlsson823c02e2009-02-14 01:00:11 +00001001static inline long long __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001002_mm_cvtsi128_si64(__m128i a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001003{
1004 return a[0];
1005}
1006#endif
1007
Anders Carlsson823c02e2009-02-14 01:00:11 +00001008static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001009_mm_load_si128(__m128i const *p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001010{
1011 return *p;
1012}
1013
Anders Carlsson823c02e2009-02-14 01:00:11 +00001014static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001015_mm_loadu_si128(__m128i const *p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001016{
1017 return (__m128i)__builtin_ia32_loaddqu((char const *)p);
1018}
1019
Anders Carlsson823c02e2009-02-14 01:00:11 +00001020static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001021_mm_loadl_epi64(__m128i const *p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001022{
Eli Friedmane9ff1912009-06-07 09:32:56 +00001023 return (__m128i) { *(long long*)p, 0};
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001024}
1025
Anders Carlsson823c02e2009-02-14 01:00:11 +00001026static inline __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlssondfa31172009-09-18 17:03:55 +00001027_mm_set_epi64x(long long q1, long long q0)
1028{
1029 return (__m128i){ q0, q1 };
1030}
1031
1032static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001033_mm_set_epi64(__m64 q1, __m64 q0)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001034{
1035 return (__m128i){ (long long)q0, (long long)q1 };
1036}
1037
Anders Carlsson823c02e2009-02-14 01:00:11 +00001038static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001039_mm_set_epi32(int i3, int i2, int i1, int i0)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001040{
1041 return (__m128i)(__v4si){ i0, i1, i2, i3};
1042}
1043
Anders Carlsson823c02e2009-02-14 01:00:11 +00001044static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001045_mm_set_epi16(short w7, short w6, short w5, short w4, short w3, short w2, short w1, short w0)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001046{
1047 return (__m128i)(__v8hi){ w0, w1, w2, w3, w4, w5, w6, w7 };
1048}
1049
Anders Carlsson823c02e2009-02-14 01:00:11 +00001050static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001051_mm_set_epi8(char b15, char b14, char b13, char b12, char b11, char b10, char b9, char b8, char b7, char b6, char b5, char b4, char b3, char b2, char b1, char b0)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001052{
1053 return (__m128i)(__v16qi){ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15 };
1054}
1055
Anders Carlsson823c02e2009-02-14 01:00:11 +00001056static inline __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlssondfa31172009-09-18 17:03:55 +00001057_mm_set1_epi64x(long long q)
1058{
1059 return (__m128i){ q, q };
1060}
1061
1062static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001063_mm_set1_epi64(__m64 q)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001064{
1065 return (__m128i){ (long long)q, (long long)q };
1066}
1067
Anders Carlsson823c02e2009-02-14 01:00:11 +00001068static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001069_mm_set1_epi32(int i)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001070{
1071 return (__m128i)(__v4si){ i, i, i, i };
1072}
1073
Anders Carlsson823c02e2009-02-14 01:00:11 +00001074static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001075_mm_set1_epi16(short w)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001076{
1077 return (__m128i)(__v8hi){ w, w, w, w, w, w, w, w };
1078}
1079
Anders Carlsson823c02e2009-02-14 01:00:11 +00001080static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001081_mm_set1_epi8(char b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001082{
1083 return (__m128i)(__v16qi){ b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b };
1084}
1085
Anders Carlsson823c02e2009-02-14 01:00:11 +00001086static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001087_mm_setr_epi64(__m64 q0, __m64 q1)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001088{
1089 return (__m128i){ (long long)q0, (long long)q1 };
1090}
1091
Anders Carlsson823c02e2009-02-14 01:00:11 +00001092static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001093_mm_setr_epi32(int i0, int i1, int i2, int i3)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001094{
1095 return (__m128i)(__v4si){ i0, i1, i2, i3};
1096}
1097
Anders Carlsson823c02e2009-02-14 01:00:11 +00001098static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001099_mm_setr_epi16(short w0, short w1, short w2, short w3, short w4, short w5, short w6, short w7)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001100{
1101 return (__m128i)(__v8hi){ w0, w1, w2, w3, w4, w5, w6, w7 };
1102}
1103
Anders Carlsson823c02e2009-02-14 01:00:11 +00001104static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001105_mm_setr_epi8(char b0, char b1, char b2, char b3, char b4, char b5, char b6, char b7, char b8, char b9, char b10, char b11, char b12, char b13, char b14, char b15)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001106{
1107 return (__m128i)(__v16qi){ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15 };
1108}
1109
Anders Carlsson823c02e2009-02-14 01:00:11 +00001110static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001111_mm_setzero_si128(void)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001112{
1113 return (__m128i){ 0LL, 0LL };
1114}
1115
Anders Carlsson823c02e2009-02-14 01:00:11 +00001116static inline void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001117_mm_store_si128(__m128i *p, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001118{
1119 *p = b;
1120}
1121
Anders Carlsson823c02e2009-02-14 01:00:11 +00001122static inline void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001123_mm_storeu_si128(__m128i *p, __m128i b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001124{
1125 __builtin_ia32_storedqu((char *)p, (__v16qi)b);
1126}
1127
Anders Carlsson823c02e2009-02-14 01:00:11 +00001128static inline void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001129_mm_maskmoveu_si128(__m128i d, __m128i n, char *p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001130{
1131 __builtin_ia32_maskmovdqu((__v16qi)d, (__v16qi)n, p);
1132}
1133
Anders Carlsson823c02e2009-02-14 01:00:11 +00001134static inline void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001135_mm_storel_epi64(__m128i *p, __m128i a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001136{
1137 __builtin_ia32_storelv4si((__v2si *)p, a);
1138}
1139
Anders Carlsson823c02e2009-02-14 01:00:11 +00001140static inline void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001141_mm_stream_pd(double *p, __m128d a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001142{
1143 __builtin_ia32_movntpd(p, a);
1144}
1145
Anders Carlsson823c02e2009-02-14 01:00:11 +00001146static inline void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001147_mm_stream_si128(__m128i *p, __m128i a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001148{
1149 __builtin_ia32_movntdq(p, a);
1150}
1151
Anders Carlsson823c02e2009-02-14 01:00:11 +00001152static inline void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001153_mm_stream_si32(int *p, int a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001154{
1155 __builtin_ia32_movnti(p, a);
1156}
1157
Anders Carlsson823c02e2009-02-14 01:00:11 +00001158static inline void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001159_mm_clflush(void const *p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001160{
1161 __builtin_ia32_clflush(p);
1162}
1163
Anders Carlsson823c02e2009-02-14 01:00:11 +00001164static inline void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001165_mm_lfence(void)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001166{
1167 __builtin_ia32_lfence();
1168}
1169
Anders Carlsson823c02e2009-02-14 01:00:11 +00001170static inline void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001171_mm_mfence(void)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001172{
1173 __builtin_ia32_mfence();
1174}
1175
Anders Carlsson823c02e2009-02-14 01:00:11 +00001176static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001177_mm_packs_epi16(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001178{
1179 return (__m128i)__builtin_ia32_packsswb128((__v8hi)a, (__v8hi)b);
1180}
1181
Anders Carlsson823c02e2009-02-14 01:00:11 +00001182static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001183_mm_packs_epi32(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001184{
1185 return (__m128i)__builtin_ia32_packssdw128((__v4si)a, (__v4si)b);
1186}
1187
Anders Carlsson823c02e2009-02-14 01:00:11 +00001188static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001189_mm_packus_epi16(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001190{
1191 return (__m128i)__builtin_ia32_packuswb128((__v8hi)a, (__v8hi)b);
1192}
1193
Anders Carlsson823c02e2009-02-14 01:00:11 +00001194static inline int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001195_mm_extract_epi16(__m128i a, int imm)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001196{
1197 __v8hi b = (__v8hi)a;
1198 return b[imm];
1199}
1200
Anders Carlsson823c02e2009-02-14 01:00:11 +00001201static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001202_mm_insert_epi16(__m128i a, int b, int imm)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001203{
Eli Friedmanebd93142009-06-06 02:13:04 +00001204 __v8hi c = (__v8hi)a;
1205 c[imm & 7] = b;
Eli Friedmand00fd282009-06-06 03:45:06 +00001206 return (__m128i)c;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001207}
1208
Anders Carlsson823c02e2009-02-14 01:00:11 +00001209static inline int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001210_mm_movemask_epi8(__m128i a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001211{
1212 return __builtin_ia32_pmovmskb128((__v16qi)a);
1213}
1214
Eli Friedman4d8d7d32009-06-06 08:08:06 +00001215#define _mm_shuffle_epi32(a, imm) \
1216 ((__m128i)__builtin_shufflevector((__v4si)(a), (__v4si) {0}, \
1217 (imm) & 0x3, ((imm) & 0xc) >> 2, \
1218 ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6))
1219#define _mm_shufflelo_epi16(a, imm) \
1220 ((__m128i)__builtin_shufflevector((__v8hi)(a), (__v8hi) {0}, \
1221 (imm) & 0x3, ((imm) & 0xc) >> 2, \
1222 ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6, \
1223 4, 5, 6, 7))
1224#define _mm_shufflehi_epi16(a, imm) \
1225 ((__m128i)__builtin_shufflevector((__v8hi)(a), (__v8hi) {0}, 0, 1, 2, 3, \
1226 4 + ((imm) & 0x3), 4 + ((imm) & 0xc) >> 2, \
1227 4 + ((imm) & 0x30) >> 4, \
1228 4 + ((imm) & 0xc0) >> 6))
Anders Carlsson85eb1242008-12-26 00:45:50 +00001229
Anders Carlsson823c02e2009-02-14 01:00:11 +00001230static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001231_mm_unpackhi_epi8(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001232{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001233 return (__m128i)__builtin_shufflevector((__v16qi)a, (__v16qi)b, 8, 16+8, 9, 16+9, 10, 16+10, 11, 16+11, 12, 16+12, 13, 16+13, 14, 16+14, 15, 16+15);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001234}
1235
Anders Carlsson823c02e2009-02-14 01:00:11 +00001236static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001237_mm_unpackhi_epi16(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001238{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001239 return (__m128i)__builtin_shufflevector((__v8hi)a, (__v8hi)b, 4, 8+4, 5, 8+5, 6, 8+6, 7, 8+7);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001240}
1241
Anders Carlsson823c02e2009-02-14 01:00:11 +00001242static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001243_mm_unpackhi_epi32(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001244{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001245 return (__m128i)__builtin_shufflevector((__v4si)a, (__v4si)b, 2, 4+2, 3, 4+3);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001246}
1247
Anders Carlsson823c02e2009-02-14 01:00:11 +00001248static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001249_mm_unpackhi_epi64(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001250{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001251 return (__m128i)__builtin_shufflevector(a, b, 1, 2+1);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001252}
1253
Anders Carlsson823c02e2009-02-14 01:00:11 +00001254static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001255_mm_unpacklo_epi8(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001256{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001257 return (__m128i)__builtin_shufflevector((__v16qi)a, (__v16qi)b, 0, 16+0, 1, 16+1, 2, 16+2, 3, 16+3, 4, 16+4, 5, 16+5, 6, 16+6, 7, 16+7);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001258}
1259
Anders Carlsson823c02e2009-02-14 01:00:11 +00001260static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001261_mm_unpacklo_epi16(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001262{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001263 return (__m128i)__builtin_shufflevector((__v8hi)a, (__v8hi)b, 0, 8+0, 1, 8+1, 2, 8+2, 3, 8+3);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001264}
1265
Anders Carlsson823c02e2009-02-14 01:00:11 +00001266static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001267_mm_unpacklo_epi32(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001268{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001269 return (__m128i)__builtin_shufflevector((__v4si)a, (__v4si)b, 0, 4+0, 1, 4+1);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001270}
1271
Anders Carlsson823c02e2009-02-14 01:00:11 +00001272static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001273_mm_unpacklo_epi64(__m128i a, __m128i b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001274{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001275 return (__m128i)__builtin_shufflevector(a, b, 0, 2+0);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001276}
1277
Anders Carlsson823c02e2009-02-14 01:00:11 +00001278static inline __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001279_mm_movepi64_pi64(__m128i a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001280{
1281 return (__m64)a[0];
1282}
1283
Anders Carlsson823c02e2009-02-14 01:00:11 +00001284static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001285_mm_movpi64_pi64(__m64 a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001286{
1287 return (__m128i){ (long long)a, 0 };
1288}
1289
Anders Carlsson823c02e2009-02-14 01:00:11 +00001290static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001291_mm_move_epi64(__m128i a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001292{
Eli Friedmanebd93142009-06-06 02:13:04 +00001293 return __builtin_shufflevector(a, (__m128i){ 0 }, 0, 2);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001294}
1295
Anders Carlsson823c02e2009-02-14 01:00:11 +00001296static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001297_mm_unpackhi_pd(__m128d a, __m128d b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001298{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001299 return __builtin_shufflevector(a, b, 1, 2+1);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001300}
1301
Anders Carlsson823c02e2009-02-14 01:00:11 +00001302static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001303_mm_unpacklo_pd(__m128d a, __m128d b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001304{
Anders Carlsson37ba1a52008-12-26 00:50:47 +00001305 return __builtin_shufflevector(a, b, 0, 2+0);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001306}
1307
Anders Carlsson823c02e2009-02-14 01:00:11 +00001308static inline int __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001309_mm_movemask_pd(__m128d a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001310{
1311 return __builtin_ia32_movmskpd(a);
1312}
1313
Eli Friedman4d8d7d32009-06-06 08:08:06 +00001314#define _mm_shuffle_pd(a, b, i) (__builtin_shufflevector((a), (b), (i) & 1, \
1315 (((i) & 2) >> 1) + 2))
Anders Carlsson85eb1242008-12-26 00:45:50 +00001316
Anders Carlsson823c02e2009-02-14 01:00:11 +00001317static inline __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001318_mm_castpd_ps(__m128d in)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001319{
1320 return (__m128)in;
1321}
1322
Anders Carlsson823c02e2009-02-14 01:00:11 +00001323static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001324_mm_castpd_si128(__m128d in)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001325{
1326 return (__m128i)in;
1327}
1328
Anders Carlsson823c02e2009-02-14 01:00:11 +00001329static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001330_mm_castps_pd(__m128 in)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001331{
1332 return (__m128d)in;
1333}
1334
Anders Carlsson823c02e2009-02-14 01:00:11 +00001335static inline __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001336_mm_castps_si128(__m128 in)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001337{
1338 return (__m128i)in;
1339}
1340
Anders Carlsson823c02e2009-02-14 01:00:11 +00001341static inline __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001342_mm_castsi128_ps(__m128i in)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001343{
1344 return (__m128)in;
1345}
1346
Anders Carlsson823c02e2009-02-14 01:00:11 +00001347static inline __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001348_mm_castsi128_pd(__m128i in)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001349{
1350 return (__m128d)in;
1351}
1352
Anders Carlsson823c02e2009-02-14 01:00:11 +00001353static inline void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001354_mm_pause(void)
Anders Carlsson37c23712008-12-26 00:49:43 +00001355{
Anders Carlsson88b53662008-12-26 02:22:10 +00001356 __asm__ volatile ("pause");
Anders Carlsson37c23712008-12-26 00:49:43 +00001357}
1358
Anders Carlsson43c2bab2009-01-21 01:49:39 +00001359#define _MM_SHUFFLE2(x, y) (((x) << 1) | (y))
Anders Carlsson37c23712008-12-26 00:49:43 +00001360
Anders Carlssonf15e71d2008-12-24 01:45:22 +00001361#endif /* __SSE2__ */
1362
1363#endif /* __EMMINTRIN_H */