blob: 8afbe76fbeb5df56cc333206a1c9576316433e2a [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
Anders Carlsson07603aa2008-12-24 02:41:00 +000036typedef short __v8hi __attribute__((__vector_size__(16)));
Anders Carlsson4bf4e302009-09-18 19:18:19 +000037typedef char __v16qi __attribute__((__vector_size__(16)));
Anders Carlsson37f2f002008-12-24 01:45:22 +000038
Chris Lattner1bddbcb2010-03-22 18:14:12 +000039static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +000040_mm_add_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +000041{
Eli Friedman80c80042009-06-06 02:13:04 +000042 a[0] += b[0];
43 return a;
Anders Carlsson37f2f002008-12-24 01:45:22 +000044}
45
Chris Lattner1bddbcb2010-03-22 18:14:12 +000046static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +000047_mm_add_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +000048{
49 return a + b;
50}
51
Chris Lattner1bddbcb2010-03-22 18:14:12 +000052static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +000053_mm_sub_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +000054{
Eli Friedman80c80042009-06-06 02:13:04 +000055 a[0] -= b[0];
56 return a;
Anders Carlsson37f2f002008-12-24 01:45:22 +000057}
58
Chris Lattner1bddbcb2010-03-22 18:14:12 +000059static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +000060_mm_sub_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +000061{
62 return a - b;
63}
64
Chris Lattner1bddbcb2010-03-22 18:14:12 +000065static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +000066_mm_mul_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +000067{
Eli Friedman80c80042009-06-06 02:13:04 +000068 a[0] *= b[0];
69 return a;
Anders Carlsson37f2f002008-12-24 01:45:22 +000070}
71
Chris Lattner1bddbcb2010-03-22 18:14:12 +000072static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +000073_mm_mul_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +000074{
75 return a * b;
76}
77
Chris Lattner1bddbcb2010-03-22 18:14:12 +000078static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +000079_mm_div_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +000080{
Eli Friedman80c80042009-06-06 02:13:04 +000081 a[0] /= b[0];
82 return a;
Anders Carlsson37f2f002008-12-24 01:45:22 +000083}
84
Chris Lattner1bddbcb2010-03-22 18:14:12 +000085static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +000086_mm_div_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +000087{
88 return a / b;
89}
90
Chris Lattner1bddbcb2010-03-22 18:14:12 +000091static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +000092_mm_sqrt_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +000093{
94 __m128d c = __builtin_ia32_sqrtsd(b);
95 return (__m128d) { c[0], a[1] };
96}
97
Chris Lattner1bddbcb2010-03-22 18:14:12 +000098static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +000099_mm_sqrt_pd(__m128d a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000100{
101 return __builtin_ia32_sqrtpd(a);
102}
103
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000104static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000105_mm_min_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000106{
107 return __builtin_ia32_minsd(a, b);
108}
109
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000110static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000111_mm_min_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000112{
113 return __builtin_ia32_minpd(a, b);
114}
115
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000116static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000117_mm_max_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000118{
119 return __builtin_ia32_maxsd(a, b);
120}
121
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000122static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000123_mm_max_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000124{
125 return __builtin_ia32_maxpd(a, b);
126}
127
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000128static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000129_mm_and_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000130{
Eli Friedman17d2e3a2009-06-06 03:45:06 +0000131 return (__m128d)((__v4si)a & (__v4si)b);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000132}
133
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000134static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000135_mm_andnot_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000136{
Eli Friedman17d2e3a2009-06-06 03:45:06 +0000137 return (__m128d)(~(__v4si)a & (__v4si)b);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000138}
139
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000140static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000141_mm_or_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000142{
Eli Friedman17d2e3a2009-06-06 03:45:06 +0000143 return (__m128d)((__v4si)a | (__v4si)b);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000144}
145
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000146static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000147_mm_xor_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000148{
Eli Friedman17d2e3a2009-06-06 03:45:06 +0000149 return (__m128d)((__v4si)a ^ (__v4si)b);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000150}
151
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000152static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000153_mm_cmpeq_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000154{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000155 return (__m128d)__builtin_ia32_cmppd(a, b, 0);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000156}
157
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000158static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000159_mm_cmplt_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000160{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000161 return (__m128d)__builtin_ia32_cmppd(a, b, 1);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000162}
163
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000164static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000165_mm_cmple_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000166{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000167 return (__m128d)__builtin_ia32_cmppd(a, b, 2);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000168}
169
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000170static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000171_mm_cmpgt_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000172{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000173 return (__m128d)__builtin_ia32_cmppd(b, a, 1);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000174}
175
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000176static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000177_mm_cmpge_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000178{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000179 return (__m128d)__builtin_ia32_cmppd(b, a, 2);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000180}
181
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000182static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000183_mm_cmpord_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000184{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000185 return (__m128d)__builtin_ia32_cmppd(a, b, 7);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000186}
187
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000188static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000189_mm_cmpunord_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000190{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000191 return (__m128d)__builtin_ia32_cmppd(a, b, 3);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000192}
193
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000194static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000195_mm_cmpneq_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000196{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000197 return (__m128d)__builtin_ia32_cmppd(a, b, 4);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000198}
199
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000200static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000201_mm_cmpnlt_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000202{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000203 return (__m128d)__builtin_ia32_cmppd(a, b, 5);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000204}
205
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000206static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000207_mm_cmpnle_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000208{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000209 return (__m128d)__builtin_ia32_cmppd(a, b, 6);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000210}
211
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000212static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000213_mm_cmpngt_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000214{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000215 return (__m128d)__builtin_ia32_cmppd(b, a, 5);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000216}
217
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000218static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000219_mm_cmpnge_pd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000220{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000221 return (__m128d)__builtin_ia32_cmppd(b, a, 6);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000222}
223
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000224static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000225_mm_cmpeq_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000226{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000227 return (__m128d)__builtin_ia32_cmpsd(a, b, 0);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000228}
229
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000230static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000231_mm_cmplt_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000232{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000233 return (__m128d)__builtin_ia32_cmpsd(a, b, 1);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000234}
235
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000236static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000237_mm_cmple_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000238{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000239 return (__m128d)__builtin_ia32_cmpsd(a, b, 2);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000240}
241
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000242static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000243_mm_cmpgt_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000244{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000245 return (__m128d)__builtin_ia32_cmpsd(b, a, 1);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000246}
247
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000248static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000249_mm_cmpge_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000250{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000251 return (__m128d)__builtin_ia32_cmpsd(b, a, 2);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000252}
253
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000254static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000255_mm_cmpord_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000256{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000257 return (__m128d)__builtin_ia32_cmpsd(a, b, 7);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000258}
259
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000260static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000261_mm_cmpunord_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000262{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000263 return (__m128d)__builtin_ia32_cmpsd(a, b, 3);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000264}
265
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000266static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000267_mm_cmpneq_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000268{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000269 return (__m128d)__builtin_ia32_cmpsd(a, b, 4);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000270}
271
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000272static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000273_mm_cmpnlt_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000274{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000275 return (__m128d)__builtin_ia32_cmpsd(a, b, 5);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000276}
277
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000278static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000279_mm_cmpnle_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000280{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000281 return (__m128d)__builtin_ia32_cmpsd(a, b, 6);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000282}
283
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000284static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000285_mm_cmpngt_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000286{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000287 return (__m128d)__builtin_ia32_cmpsd(b, a, 5);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000288}
289
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000290static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000291_mm_cmpnge_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000292{
Anders Carlsson79dcf5f2009-05-18 19:16:46 +0000293 return (__m128d)__builtin_ia32_cmpsd(b, a, 6);
Anders Carlsson37f2f002008-12-24 01:45:22 +0000294}
295
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000296static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000297_mm_comieq_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000298{
299 return __builtin_ia32_comisdeq(a, b);
300}
301
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000302static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000303_mm_comilt_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000304{
305 return __builtin_ia32_comisdlt(a, b);
306}
307
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000308static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000309_mm_comile_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000310{
311 return __builtin_ia32_comisdle(a, b);
312}
313
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000314static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000315_mm_comigt_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000316{
317 return __builtin_ia32_comisdgt(a, b);
318}
319
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000320static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000321_mm_comineq_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000322{
323 return __builtin_ia32_comisdneq(a, b);
324}
325
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000326static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000327_mm_ucomieq_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000328{
329 return __builtin_ia32_ucomisdeq(a, b);
330}
331
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000332static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000333_mm_ucomilt_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000334{
335 return __builtin_ia32_ucomisdlt(a, b);
336}
337
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000338static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000339_mm_ucomile_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000340{
341 return __builtin_ia32_ucomisdle(a, b);
342}
343
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000344static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000345_mm_ucomigt_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000346{
347 return __builtin_ia32_ucomisdgt(a, b);
348}
349
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000350static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000351_mm_ucomineq_sd(__m128d a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000352{
353 return __builtin_ia32_ucomisdneq(a, b);
354}
355
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000356static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000357_mm_cvtpd_ps(__m128d a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000358{
359 return __builtin_ia32_cvtpd2ps(a);
360}
361
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000362static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000363_mm_cvtps_pd(__m128 a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000364{
365 return __builtin_ia32_cvtps2pd(a);
366}
367
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000368static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000369_mm_cvtepi32_pd(__m128i a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000370{
371 return __builtin_ia32_cvtdq2pd((__v4si)a);
372}
373
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000374static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000375_mm_cvtpd_epi32(__m128d a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000376{
377 return __builtin_ia32_cvtpd2dq(a);
378}
379
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000380static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000381_mm_cvtsd_si32(__m128d a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000382{
383 return __builtin_ia32_cvtsd2si(a);
384}
385
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000386static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000387_mm_cvtsd_ss(__m128 a, __m128d b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000388{
Eli Friedman80c80042009-06-06 02:13:04 +0000389 a[0] = b[0];
390 return a;
Anders Carlsson37f2f002008-12-24 01:45:22 +0000391}
392
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000393static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000394_mm_cvtsi32_sd(__m128d a, int b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000395{
Eli Friedman098136a2009-06-06 08:08:06 +0000396 a[0] = b;
397 return a;
Anders Carlsson37f2f002008-12-24 01:45:22 +0000398}
399
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000400static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000401_mm_cvtss_sd(__m128d a, __m128 b)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000402{
Eli Friedman80c80042009-06-06 02:13:04 +0000403 a[0] = b[0];
404 return a;
Anders Carlsson37f2f002008-12-24 01:45:22 +0000405}
406
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000407static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000408_mm_cvttpd_epi32(__m128d a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000409{
410 return (__m128i)__builtin_ia32_cvttpd2dq(a);
411}
412
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000413static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000414_mm_cvttsd_si32(__m128d a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000415{
Eli Friedman80c80042009-06-06 02:13:04 +0000416 return a[0];
Anders Carlsson37f2f002008-12-24 01:45:22 +0000417}
418
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000419static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000420_mm_cvtpd_pi32(__m128d a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000421{
422 return (__m64)__builtin_ia32_cvtpd2pi(a);
423}
424
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000425static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000426_mm_cvttpd_pi32(__m128d a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000427{
428 return (__m64)__builtin_ia32_cvttpd2pi(a);
429}
430
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000431static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000432_mm_cvtpi32_pd(__m64 a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000433{
434 return __builtin_ia32_cvtpi2pd((__v2si)a);
435}
436
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000437static __inline__ double __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000438_mm_cvtsd_f64(__m128d a)
Anders Carlsson37f2f002008-12-24 01:45:22 +0000439{
440 return a[0];
441}
442
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000443static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000444_mm_load_pd(double const *dp)
Anders Carlsson445afa02008-12-24 02:11:54 +0000445{
446 return *(__m128d*)dp;
447}
448
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000449static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000450_mm_load1_pd(double const *dp)
Anders Carlsson445afa02008-12-24 02:11:54 +0000451{
452 return (__m128d){ dp[0], dp[0] };
453}
454
Eli Friedmandb7351a2009-06-02 05:55:48 +0000455#define _mm_load_pd1(dp) _mm_load1_pd(dp)
456
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000457static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000458_mm_loadr_pd(double const *dp)
Anders Carlsson445afa02008-12-24 02:11:54 +0000459{
460 return (__m128d){ dp[1], dp[0] };
461}
462
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000463static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000464_mm_loadu_pd(double const *dp)
Anders Carlsson445afa02008-12-24 02:11:54 +0000465{
466 return __builtin_ia32_loadupd(dp);
467}
468
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000469static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000470_mm_load_sd(double const *dp)
Anders Carlsson445afa02008-12-24 02:11:54 +0000471{
472 return (__m128d){ *dp, 0.0 };
473}
474
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000475static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000476_mm_loadh_pd(__m128d a, double const *dp)
Anders Carlsson445afa02008-12-24 02:11:54 +0000477{
478 return __builtin_shufflevector(a, *(__m128d *)dp, 0, 2);
479}
480
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000481static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000482_mm_loadl_pd(__m128d a, double const *dp)
Anders Carlsson445afa02008-12-24 02:11:54 +0000483{
484 return __builtin_shufflevector(a, *(__m128d *)dp, 2, 1);
485}
486
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000487static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000488_mm_set_sd(double w)
Anders Carlsson445afa02008-12-24 02:11:54 +0000489{
490 return (__m128d){ w, 0 };
491}
492
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000493static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000494_mm_set1_pd(double w)
Anders Carlsson445afa02008-12-24 02:11:54 +0000495{
496 return (__m128d){ w, w };
497}
498
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000499static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000500_mm_set_pd(double w, double x)
Anders Carlsson445afa02008-12-24 02:11:54 +0000501{
Anders Carlsson9436ed52009-09-18 17:03:55 +0000502 return (__m128d){ x, w };
Anders Carlsson445afa02008-12-24 02:11:54 +0000503}
504
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000505static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000506_mm_setr_pd(double w, double x)
Anders Carlsson445afa02008-12-24 02:11:54 +0000507{
Anders Carlsson9436ed52009-09-18 17:03:55 +0000508 return (__m128d){ w, x };
Anders Carlsson445afa02008-12-24 02:11:54 +0000509}
510
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000511static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000512_mm_setzero_pd(void)
Anders Carlsson445afa02008-12-24 02:11:54 +0000513{
514 return (__m128d){ 0, 0 };
515}
516
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000517static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000518_mm_move_sd(__m128d a, __m128d b)
Anders Carlsson445afa02008-12-24 02:11:54 +0000519{
520 return (__m128d){ b[0], a[1] };
521}
522
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000523static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000524_mm_store_sd(double *dp, __m128d a)
Anders Carlsson445afa02008-12-24 02:11:54 +0000525{
526 dp[0] = a[0];
527}
528
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000529static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000530_mm_store1_pd(double *dp, __m128d a)
Anders Carlsson445afa02008-12-24 02:11:54 +0000531{
532 dp[0] = a[0];
533 dp[1] = a[0];
534}
535
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000536static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000537_mm_store_pd(double *dp, __m128d a)
Anders Carlsson445afa02008-12-24 02:11:54 +0000538{
539 *(__m128d *)dp = a;
540}
541
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000542static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000543_mm_storeu_pd(double *dp, __m128d a)
Anders Carlsson445afa02008-12-24 02:11:54 +0000544{
545 __builtin_ia32_storeupd(dp, a);
546}
547
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000548static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000549_mm_storer_pd(double *dp, __m128d a)
Anders Carlsson445afa02008-12-24 02:11:54 +0000550{
551 dp[0] = a[1];
552 dp[1] = a[0];
553}
554
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000555static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000556_mm_storeh_pd(double *dp, __m128d a)
Anders Carlsson445afa02008-12-24 02:11:54 +0000557{
558 dp[0] = a[1];
559}
560
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000561static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000562_mm_storel_pd(double *dp, __m128d a)
Anders Carlsson445afa02008-12-24 02:11:54 +0000563{
564 dp[0] = a[0];
565}
566
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000567static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000568_mm_add_epi8(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000569{
570 return (__m128i)((__v16qi)a + (__v16qi)b);
571}
572
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000573static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000574_mm_add_epi16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000575{
576 return (__m128i)((__v8hi)a + (__v8hi)b);
577}
578
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000579static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000580_mm_add_epi32(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000581{
582 return (__m128i)((__v4si)a + (__v4si)b);
583}
584
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000585static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000586_mm_add_si64(__m64 a, __m64 b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000587{
588 return a + b;
589}
590
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000591static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000592_mm_add_epi64(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000593{
594 return a + b;
595}
596
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000597static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000598_mm_adds_epi8(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000599{
600 return (__m128i)__builtin_ia32_paddsb128((__v16qi)a, (__v16qi)b);
601}
602
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000603static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000604_mm_adds_epi16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000605{
606 return (__m128i)__builtin_ia32_paddsw128((__v8hi)a, (__v8hi)b);
607}
608
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000609static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000610_mm_adds_epu8(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000611{
612 return (__m128i)__builtin_ia32_paddusb128((__v16qi)a, (__v16qi)b);
613}
614
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000615static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000616_mm_adds_epu16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000617{
618 return (__m128i)__builtin_ia32_paddusw128((__v8hi)a, (__v8hi)b);
619}
620
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000621static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000622_mm_avg_epu8(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000623{
624 return (__m128i)__builtin_ia32_pavgb128((__v16qi)a, (__v16qi)b);
625}
626
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000627static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000628_mm_avg_epu16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000629{
630 return (__m128i)__builtin_ia32_pavgw128((__v8hi)a, (__v8hi)b);
631}
632
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000633static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000634_mm_madd_epi16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000635{
636 return (__m128i)__builtin_ia32_pmaddwd128((__v8hi)a, (__v8hi)b);
637}
638
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000639static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000640_mm_max_epi16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000641{
642 return (__m128i)__builtin_ia32_pmaxsw128((__v8hi)a, (__v8hi)b);
643}
644
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000645static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000646_mm_max_epu8(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000647{
648 return (__m128i)__builtin_ia32_pmaxub128((__v16qi)a, (__v16qi)b);
649}
650
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000651static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000652_mm_min_epi16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000653{
654 return (__m128i)__builtin_ia32_pminsw128((__v8hi)a, (__v8hi)b);
655}
656
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000657static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000658_mm_min_epu8(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000659{
660 return (__m128i)__builtin_ia32_pminub128((__v16qi)a, (__v16qi)b);
661}
662
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000663static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000664_mm_mulhi_epi16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000665{
666 return (__m128i)__builtin_ia32_pmulhw128((__v8hi)a, (__v8hi)b);
667}
668
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000669static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000670_mm_mulhi_epu16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000671{
672 return (__m128i)__builtin_ia32_pmulhuw128((__v8hi)a, (__v8hi)b);
673}
674
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000675static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000676_mm_mullo_epi16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000677{
Eli Friedman098136a2009-06-06 08:08:06 +0000678 return (__m128i)((__v8hi)a * (__v8hi)b);
Anders Carlsson07603aa2008-12-24 02:41:00 +0000679}
680
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000681static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000682_mm_mul_su32(__m64 a, __m64 b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000683{
684 return __builtin_ia32_pmuludq((__v2si)a, (__v2si)b);
685}
686
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000687static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000688_mm_mul_epu32(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000689{
690 return __builtin_ia32_pmuludq128((__v4si)a, (__v4si)b);
691}
692
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000693static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlssonae8ecdd2009-04-06 21:55:22 +0000694_mm_sad_epu8(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000695{
696 return __builtin_ia32_psadbw128((__v16qi)a, (__v16qi)b);
697}
698
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000699static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000700_mm_sub_epi8(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000701{
702 return (__m128i)((__v16qi)a - (__v16qi)b);
703}
704
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000705static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000706_mm_sub_epi16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000707{
708 return (__m128i)((__v8hi)a - (__v8hi)b);
709}
710
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000711static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000712_mm_sub_epi32(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000713{
714 return (__m128i)((__v4si)a - (__v4si)b);
715}
716
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000717static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000718_mm_sub_si64(__m64 a, __m64 b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000719{
720 return a - b;
721}
722
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000723static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000724_mm_sub_epi64(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000725{
726 return a - b;
727}
728
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000729static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000730_mm_subs_epi8(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000731{
732 return (__m128i)__builtin_ia32_psubsb128((__v16qi)a, (__v16qi)b);
733}
734
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000735static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000736_mm_subs_epi16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000737{
738 return (__m128i)__builtin_ia32_psubsw128((__v8hi)a, (__v8hi)b);
739}
740
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000741static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000742_mm_subs_epu8(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000743{
744 return (__m128i)__builtin_ia32_psubusb128((__v16qi)a, (__v16qi)b);
745}
746
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000747static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000748_mm_subs_epu16(__m128i a, __m128i b)
Anders Carlsson07603aa2008-12-24 02:41:00 +0000749{
750 return (__m128i)__builtin_ia32_psubusw128((__v8hi)a, (__v8hi)b);
751}
752
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000753static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000754_mm_and_si128(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000755{
Eli Friedman80c80042009-06-06 02:13:04 +0000756 return a & b;
Anders Carlsson0727df02008-12-25 23:48:58 +0000757}
758
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000759static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000760_mm_andnot_si128(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000761{
Eli Friedman80c80042009-06-06 02:13:04 +0000762 return ~a & b;
Anders Carlsson0727df02008-12-25 23:48:58 +0000763}
764
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000765static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000766_mm_or_si128(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000767{
Eli Friedman80c80042009-06-06 02:13:04 +0000768 return a | b;
Anders Carlsson0727df02008-12-25 23:48:58 +0000769}
770
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000771static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000772_mm_xor_si128(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000773{
Eli Friedman80c80042009-06-06 02:13:04 +0000774 return a ^ b;
Anders Carlsson0727df02008-12-25 23:48:58 +0000775}
776
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000777static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000778_mm_slli_si128(__m128i a, int imm)
Anders Carlsson0727df02008-12-25 23:48:58 +0000779{
780 return __builtin_ia32_pslldqi128(a, imm * 8);
781}
782
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000783static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000784_mm_slli_epi16(__m128i a, int count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000785{
786 return (__m128i)__builtin_ia32_psllwi128((__v8hi)a, count);
787}
788
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000789static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000790_mm_sll_epi16(__m128i a, __m128i count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000791{
792 return (__m128i)__builtin_ia32_psllw128((__v8hi)a, (__v8hi)count);
793}
794
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000795static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000796_mm_slli_epi32(__m128i a, int count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000797{
798 return (__m128i)__builtin_ia32_pslldi128((__v4si)a, count);
799}
800
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000801static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000802_mm_sll_epi32(__m128i a, __m128i count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000803{
804 return (__m128i)__builtin_ia32_pslld128((__v4si)a, (__v4si)count);
805}
806
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000807static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000808_mm_slli_epi64(__m128i a, int count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000809{
810 return __builtin_ia32_psllqi128(a, count);
811}
812
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000813static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000814_mm_sll_epi64(__m128i a, __m128i count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000815{
816 return __builtin_ia32_psllq128(a, count);
817}
818
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000819static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000820_mm_srai_epi16(__m128i a, int count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000821{
822 return (__m128i)__builtin_ia32_psrawi128((__v8hi)a, count);
823}
824
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000825static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000826_mm_sra_epi16(__m128i a, __m128i count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000827{
828 return (__m128i)__builtin_ia32_psraw128((__v8hi)a, (__v8hi)count);
829}
830
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000831static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000832_mm_srai_epi32(__m128i a, int count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000833{
834 return (__m128i)__builtin_ia32_psradi128((__v4si)a, count);
835}
836
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000837static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000838_mm_sra_epi32(__m128i a, __m128i count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000839{
840 return (__m128i)__builtin_ia32_psrad128((__v4si)a, (__v4si)count);
841}
842
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000843static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000844_mm_srli_si128(__m128i a, int imm)
Anders Carlsson0727df02008-12-25 23:48:58 +0000845{
846 return __builtin_ia32_psrldqi128(a, imm * 8);
847}
848
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000849static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000850_mm_srli_epi16(__m128i a, int count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000851{
852 return (__m128i)__builtin_ia32_psrlwi128((__v8hi)a, count);
853}
854
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000855static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000856_mm_srl_epi16(__m128i a, __m128i count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000857{
858 return (__m128i)__builtin_ia32_psrlw128((__v8hi)a, (__v8hi)count);
859}
860
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000861static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000862_mm_srli_epi32(__m128i a, int count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000863{
864 return (__m128i)__builtin_ia32_psrldi128((__v4si)a, count);
865}
866
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000867static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000868_mm_srl_epi32(__m128i a, __m128i count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000869{
870 return (__m128i)__builtin_ia32_psrld128((__v4si)a, (__v4si)count);
871}
872
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000873static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000874_mm_srli_epi64(__m128i a, int count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000875{
876 return __builtin_ia32_psrlqi128(a, count);
877}
878
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000879static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000880_mm_srl_epi64(__m128i a, __m128i count)
Anders Carlsson0727df02008-12-25 23:48:58 +0000881{
882 return __builtin_ia32_psrlq128(a, count);
883}
884
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000885static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000886_mm_cmpeq_epi8(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000887{
Eli Friedman3a266f22009-07-22 17:08:01 +0000888 return (__m128i)((__v16qi)a == (__v16qi)b);
Anders Carlsson0727df02008-12-25 23:48:58 +0000889}
890
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000891static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000892_mm_cmpeq_epi16(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000893{
Eli Friedman3a266f22009-07-22 17:08:01 +0000894 return (__m128i)((__v8hi)a == (__v8hi)b);
Anders Carlsson0727df02008-12-25 23:48:58 +0000895}
896
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000897static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000898_mm_cmpeq_epi32(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000899{
Eli Friedman3a266f22009-07-22 17:08:01 +0000900 return (__m128i)((__v4si)a == (__v4si)b);
Anders Carlsson0727df02008-12-25 23:48:58 +0000901}
902
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000903static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000904_mm_cmpgt_epi8(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000905{
Eli Friedman3a266f22009-07-22 17:08:01 +0000906 return (__m128i)((__v16qi)a > (__v16qi)b);
Anders Carlsson0727df02008-12-25 23:48:58 +0000907}
908
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000909static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000910_mm_cmpgt_epi16(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000911{
Eli Friedman3a266f22009-07-22 17:08:01 +0000912 return (__m128i)((__v8hi)a > (__v8hi)b);
Anders Carlsson0727df02008-12-25 23:48:58 +0000913}
914
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000915static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000916_mm_cmpgt_epi32(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000917{
Eli Friedman3a266f22009-07-22 17:08:01 +0000918 return (__m128i)((__v4si)a > (__v4si)b);
Anders Carlsson0727df02008-12-25 23:48:58 +0000919}
920
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000921static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000922_mm_cmplt_epi8(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000923{
Eli Friedman3a266f22009-07-22 17:08:01 +0000924 return _mm_cmpgt_epi8(b,a);
Anders Carlsson0727df02008-12-25 23:48:58 +0000925}
926
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000927static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000928_mm_cmplt_epi16(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000929{
Eli Friedman3a266f22009-07-22 17:08:01 +0000930 return _mm_cmpgt_epi16(b,a);
Anders Carlsson0727df02008-12-25 23:48:58 +0000931}
932
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000933static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000934_mm_cmplt_epi32(__m128i a, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000935{
Eli Friedman3a266f22009-07-22 17:08:01 +0000936 return _mm_cmpgt_epi32(b,a);
Anders Carlsson0727df02008-12-25 23:48:58 +0000937}
938
939#ifdef __x86_64__
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000940static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000941_mm_cvtsi64_sd(__m128d a, long long b)
Anders Carlsson0727df02008-12-25 23:48:58 +0000942{
Eli Friedman80c80042009-06-06 02:13:04 +0000943 a[0] = b;
944 return a;
Anders Carlsson0727df02008-12-25 23:48:58 +0000945}
946
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000947static __inline__ long long __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000948_mm_cvtsd_si64(__m128d a)
Anders Carlsson0727df02008-12-25 23:48:58 +0000949{
950 return __builtin_ia32_cvtsd2si64(a);
951}
952
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000953static __inline__ long long __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000954_mm_cvttsd_si64(__m128d a)
Anders Carlsson0727df02008-12-25 23:48:58 +0000955{
Eli Friedman80c80042009-06-06 02:13:04 +0000956 return a[0];
Anders Carlsson0727df02008-12-25 23:48:58 +0000957}
958#endif
959
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000960static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000961_mm_cvtepi32_ps(__m128i a)
Anders Carlsson0727df02008-12-25 23:48:58 +0000962{
963 return __builtin_ia32_cvtdq2ps((__v4si)a);
964}
965
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000966static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000967_mm_cvtps_epi32(__m128 a)
Anders Carlsson0727df02008-12-25 23:48:58 +0000968{
969 return (__m128i)__builtin_ia32_cvtps2dq(a);
970}
971
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000972static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000973_mm_cvttps_epi32(__m128 a)
Anders Carlsson0727df02008-12-25 23:48:58 +0000974{
975 return (__m128i)__builtin_ia32_cvttps2dq(a);
976}
977
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000978static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000979_mm_cvtsi32_si128(int a)
Anders Carlsson0727df02008-12-25 23:48:58 +0000980{
981 return (__m128i)(__v4si){ a, 0, 0, 0 };
982}
983
984#ifdef __x86_64__
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000985static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000986_mm_cvtsi64_si128(long long a)
Anders Carlsson0727df02008-12-25 23:48:58 +0000987{
988 return (__m128i){ a, 0 };
989}
990#endif
991
Chris Lattner1bddbcb2010-03-22 18:14:12 +0000992static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +0000993_mm_cvtsi128_si32(__m128i a)
Anders Carlsson0727df02008-12-25 23:48:58 +0000994{
995 __v4si b = (__v4si)a;
996 return b[0];
997}
998
999#ifdef __x86_64__
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001000static __inline__ long long __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001001_mm_cvtsi128_si64(__m128i a)
Anders Carlsson0727df02008-12-25 23:48:58 +00001002{
1003 return a[0];
1004}
1005#endif
1006
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001007static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001008_mm_load_si128(__m128i const *p)
Anders Carlsson0727df02008-12-25 23:48:58 +00001009{
1010 return *p;
1011}
1012
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001013static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001014_mm_loadu_si128(__m128i const *p)
Anders Carlsson0727df02008-12-25 23:48:58 +00001015{
1016 return (__m128i)__builtin_ia32_loaddqu((char const *)p);
1017}
1018
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001019static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001020_mm_loadl_epi64(__m128i const *p)
Anders Carlsson0727df02008-12-25 23:48:58 +00001021{
Eli Friedman8fff2572009-06-07 09:32:56 +00001022 return (__m128i) { *(long long*)p, 0};
Anders Carlsson0727df02008-12-25 23:48:58 +00001023}
1024
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001025static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson9436ed52009-09-18 17:03:55 +00001026_mm_set_epi64x(long long q1, long long q0)
1027{
1028 return (__m128i){ q0, q1 };
1029}
1030
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001031static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001032_mm_set_epi64(__m64 q1, __m64 q0)
Anders Carlsson0727df02008-12-25 23:48:58 +00001033{
1034 return (__m128i){ (long long)q0, (long long)q1 };
1035}
1036
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001037static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001038_mm_set_epi32(int i3, int i2, int i1, int i0)
Anders Carlsson0727df02008-12-25 23:48:58 +00001039{
1040 return (__m128i)(__v4si){ i0, i1, i2, i3};
1041}
1042
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001043static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001044_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 +00001045{
1046 return (__m128i)(__v8hi){ w0, w1, w2, w3, w4, w5, w6, w7 };
1047}
1048
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001049static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001050_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 +00001051{
1052 return (__m128i)(__v16qi){ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15 };
1053}
1054
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001055static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlsson9436ed52009-09-18 17:03:55 +00001056_mm_set1_epi64x(long long q)
1057{
1058 return (__m128i){ q, q };
1059}
1060
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001061static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001062_mm_set1_epi64(__m64 q)
Anders Carlsson0727df02008-12-25 23:48:58 +00001063{
1064 return (__m128i){ (long long)q, (long long)q };
1065}
1066
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001067static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001068_mm_set1_epi32(int i)
Anders Carlsson0727df02008-12-25 23:48:58 +00001069{
1070 return (__m128i)(__v4si){ i, i, i, i };
1071}
1072
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001073static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001074_mm_set1_epi16(short w)
Anders Carlsson0727df02008-12-25 23:48:58 +00001075{
1076 return (__m128i)(__v8hi){ w, w, w, w, w, w, w, w };
1077}
1078
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001079static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001080_mm_set1_epi8(char b)
Anders Carlsson0727df02008-12-25 23:48:58 +00001081{
1082 return (__m128i)(__v16qi){ b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b };
1083}
1084
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001085static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001086_mm_setr_epi64(__m64 q0, __m64 q1)
Anders Carlsson0727df02008-12-25 23:48:58 +00001087{
1088 return (__m128i){ (long long)q0, (long long)q1 };
1089}
1090
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001091static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001092_mm_setr_epi32(int i0, int i1, int i2, int i3)
Anders Carlsson0727df02008-12-25 23:48:58 +00001093{
1094 return (__m128i)(__v4si){ i0, i1, i2, i3};
1095}
1096
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001097static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001098_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 +00001099{
1100 return (__m128i)(__v8hi){ w0, w1, w2, w3, w4, w5, w6, w7 };
1101}
1102
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001103static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001104_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 +00001105{
1106 return (__m128i)(__v16qi){ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15 };
1107}
1108
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001109static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001110_mm_setzero_si128(void)
Anders Carlsson0727df02008-12-25 23:48:58 +00001111{
1112 return (__m128i){ 0LL, 0LL };
1113}
1114
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001115static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001116_mm_store_si128(__m128i *p, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +00001117{
1118 *p = b;
1119}
1120
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001121static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001122_mm_storeu_si128(__m128i *p, __m128i b)
Anders Carlsson0727df02008-12-25 23:48:58 +00001123{
1124 __builtin_ia32_storedqu((char *)p, (__v16qi)b);
1125}
1126
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001127static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001128_mm_maskmoveu_si128(__m128i d, __m128i n, char *p)
Anders Carlsson0727df02008-12-25 23:48:58 +00001129{
1130 __builtin_ia32_maskmovdqu((__v16qi)d, (__v16qi)n, p);
1131}
1132
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001133static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001134_mm_storel_epi64(__m128i *p, __m128i a)
Anders Carlsson0727df02008-12-25 23:48:58 +00001135{
1136 __builtin_ia32_storelv4si((__v2si *)p, a);
1137}
1138
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001139static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001140_mm_stream_pd(double *p, __m128d a)
Anders Carlsson0727df02008-12-25 23:48:58 +00001141{
1142 __builtin_ia32_movntpd(p, a);
1143}
1144
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001145static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001146_mm_stream_si128(__m128i *p, __m128i a)
Anders Carlsson0727df02008-12-25 23:48:58 +00001147{
1148 __builtin_ia32_movntdq(p, a);
1149}
1150
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001151static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001152_mm_stream_si32(int *p, int a)
Anders Carlsson0727df02008-12-25 23:48:58 +00001153{
1154 __builtin_ia32_movnti(p, a);
1155}
1156
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001157static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001158_mm_clflush(void const *p)
Anders Carlsson0727df02008-12-25 23:48:58 +00001159{
1160 __builtin_ia32_clflush(p);
1161}
1162
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001163static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001164_mm_lfence(void)
Anders Carlsson0727df02008-12-25 23:48:58 +00001165{
1166 __builtin_ia32_lfence();
1167}
1168
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001169static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001170_mm_mfence(void)
Anders Carlsson0727df02008-12-25 23:48:58 +00001171{
1172 __builtin_ia32_mfence();
1173}
1174
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001175static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001176_mm_packs_epi16(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001177{
1178 return (__m128i)__builtin_ia32_packsswb128((__v8hi)a, (__v8hi)b);
1179}
1180
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001181static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001182_mm_packs_epi32(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001183{
1184 return (__m128i)__builtin_ia32_packssdw128((__v4si)a, (__v4si)b);
1185}
1186
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001187static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001188_mm_packus_epi16(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001189{
1190 return (__m128i)__builtin_ia32_packuswb128((__v8hi)a, (__v8hi)b);
1191}
1192
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001193static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001194_mm_extract_epi16(__m128i a, int imm)
Anders Carlsson45470752008-12-26 00:45:50 +00001195{
1196 __v8hi b = (__v8hi)a;
1197 return b[imm];
1198}
1199
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001200static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001201_mm_insert_epi16(__m128i a, int b, int imm)
Anders Carlsson45470752008-12-26 00:45:50 +00001202{
Eli Friedman80c80042009-06-06 02:13:04 +00001203 __v8hi c = (__v8hi)a;
1204 c[imm & 7] = b;
Eli Friedman17d2e3a2009-06-06 03:45:06 +00001205 return (__m128i)c;
Anders Carlsson45470752008-12-26 00:45:50 +00001206}
1207
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001208static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001209_mm_movemask_epi8(__m128i a)
Anders Carlsson45470752008-12-26 00:45:50 +00001210{
1211 return __builtin_ia32_pmovmskb128((__v16qi)a);
1212}
1213
Eli Friedman098136a2009-06-06 08:08:06 +00001214#define _mm_shuffle_epi32(a, imm) \
1215 ((__m128i)__builtin_shufflevector((__v4si)(a), (__v4si) {0}, \
1216 (imm) & 0x3, ((imm) & 0xc) >> 2, \
1217 ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6))
1218#define _mm_shufflelo_epi16(a, imm) \
1219 ((__m128i)__builtin_shufflevector((__v8hi)(a), (__v8hi) {0}, \
1220 (imm) & 0x3, ((imm) & 0xc) >> 2, \
1221 ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6, \
1222 4, 5, 6, 7))
1223#define _mm_shufflehi_epi16(a, imm) \
1224 ((__m128i)__builtin_shufflevector((__v8hi)(a), (__v8hi) {0}, 0, 1, 2, 3, \
1225 4 + ((imm) & 0x3), 4 + ((imm) & 0xc) >> 2, \
1226 4 + ((imm) & 0x30) >> 4, \
1227 4 + ((imm) & 0xc0) >> 6))
Anders Carlsson45470752008-12-26 00:45:50 +00001228
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001229static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001230_mm_unpackhi_epi8(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001231{
Anders Carlsson92d66862008-12-26 00:50:47 +00001232 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 +00001233}
1234
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001235static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001236_mm_unpackhi_epi16(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001237{
Anders Carlsson92d66862008-12-26 00:50:47 +00001238 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 +00001239}
1240
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001241static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001242_mm_unpackhi_epi32(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001243{
Anders Carlsson92d66862008-12-26 00:50:47 +00001244 return (__m128i)__builtin_shufflevector((__v4si)a, (__v4si)b, 2, 4+2, 3, 4+3);
Anders Carlsson45470752008-12-26 00:45:50 +00001245}
1246
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001247static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001248_mm_unpackhi_epi64(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001249{
Anders Carlsson92d66862008-12-26 00:50:47 +00001250 return (__m128i)__builtin_shufflevector(a, b, 1, 2+1);
Anders Carlsson45470752008-12-26 00:45:50 +00001251}
1252
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001253static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001254_mm_unpacklo_epi8(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001255{
Anders Carlsson92d66862008-12-26 00:50:47 +00001256 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 +00001257}
1258
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001259static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001260_mm_unpacklo_epi16(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001261{
Anders Carlsson92d66862008-12-26 00:50:47 +00001262 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 +00001263}
1264
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001265static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001266_mm_unpacklo_epi32(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001267{
Anders Carlsson92d66862008-12-26 00:50:47 +00001268 return (__m128i)__builtin_shufflevector((__v4si)a, (__v4si)b, 0, 4+0, 1, 4+1);
Anders Carlsson45470752008-12-26 00:45:50 +00001269}
1270
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001271static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001272_mm_unpacklo_epi64(__m128i a, __m128i b)
Anders Carlsson45470752008-12-26 00:45:50 +00001273{
Anders Carlsson92d66862008-12-26 00:50:47 +00001274 return (__m128i)__builtin_shufflevector(a, b, 0, 2+0);
Anders Carlsson45470752008-12-26 00:45:50 +00001275}
1276
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001277static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001278_mm_movepi64_pi64(__m128i a)
Anders Carlsson45470752008-12-26 00:45:50 +00001279{
1280 return (__m64)a[0];
1281}
1282
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001283static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001284_mm_movpi64_pi64(__m64 a)
Anders Carlsson45470752008-12-26 00:45:50 +00001285{
1286 return (__m128i){ (long long)a, 0 };
1287}
1288
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001289static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001290_mm_move_epi64(__m128i a)
Anders Carlsson45470752008-12-26 00:45:50 +00001291{
Eli Friedman80c80042009-06-06 02:13:04 +00001292 return __builtin_shufflevector(a, (__m128i){ 0 }, 0, 2);
Anders Carlsson45470752008-12-26 00:45:50 +00001293}
1294
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001295static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001296_mm_unpackhi_pd(__m128d a, __m128d b)
Anders Carlsson45470752008-12-26 00:45:50 +00001297{
Anders Carlsson92d66862008-12-26 00:50:47 +00001298 return __builtin_shufflevector(a, b, 1, 2+1);
Anders Carlsson45470752008-12-26 00:45:50 +00001299}
1300
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001301static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001302_mm_unpacklo_pd(__m128d a, __m128d b)
Anders Carlsson45470752008-12-26 00:45:50 +00001303{
Anders Carlsson92d66862008-12-26 00:50:47 +00001304 return __builtin_shufflevector(a, b, 0, 2+0);
Anders Carlsson45470752008-12-26 00:45:50 +00001305}
1306
Chris Lattner1bddbcb2010-03-22 18:14:12 +00001307static __inline__ int __attribute__((__always_inline__, __nodebug__))
Mike Stumpdae44132009-02-13 14:24:50 +00001308_mm_movemask_pd(__m128d a)
Anders Carlsson45470752008-12-26 00:45:50 +00001309{
1310 return __builtin_ia32_movmskpd(a);
1311}
1312
Chris Lattnereb941552010-05-15 16:54:46 +00001313#define _mm_shuffle_pd(a, b, i) \
1314 (__builtin_shufflevector((__m128d)(a), (__m128d)(b), (i) & 1, \
1315 (((i) & 2) >> 1) + 2))
Anders Carlsson45470752008-12-26 00:45:50 +00001316
Chris Lattner1bddbcb2010-03-22 18:14:12 +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
Chris Lattner1bddbcb2010-03-22 18:14:12 +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
Chris Lattner1bddbcb2010-03-22 18:14:12 +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
Chris Lattner1bddbcb2010-03-22 18:14:12 +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
Chris Lattner1bddbcb2010-03-22 18:14:12 +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
Chris Lattner1bddbcb2010-03-22 18:14:12 +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
Chris Lattner1bddbcb2010-03-22 18:14:12 +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 */