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