blob: 4ad3a776633fede9950481587293d611c1c72534 [file] [log] [blame]
Benjamin Kramerae8ea1f2010-08-20 16:47:17 +00001/*===---- emmintrin.h - SSE2 intrinsics ------------------------------------===
Anders Carlssonf15e71d2008-12-24 01:45:22 +00002 *
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 */
Benjamin Kramerae8ea1f2010-08-20 16:47:17 +000023
Anders Carlssonf15e71d2008-12-24 01:45:22 +000024#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
Eric Christopher2a9898f2010-08-26 02:09:25 +000036/* Type defines. */
37typedef double __v2df __attribute__ ((__vector_size__ (16)));
38typedef long long __v2di __attribute__ ((__vector_size__ (16)));
Anders Carlssona283f912008-12-24 02:41:00 +000039typedef short __v8hi __attribute__((__vector_size__(16)));
Anders Carlsson327c8df2009-09-18 19:18:19 +000040typedef char __v16qi __attribute__((__vector_size__(16)));
Anders Carlssonf15e71d2008-12-24 01:45:22 +000041
Chris Lattner7eac8052010-03-22 18:14:12 +000042static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +000043_mm_add_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000044{
David Blaikie3302f2b2013-01-16 23:08:36 +000045 __a[0] += __b[0];
46 return __a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000047}
48
Chris Lattner7eac8052010-03-22 18:14:12 +000049static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +000050_mm_add_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000051{
David Blaikie3302f2b2013-01-16 23:08:36 +000052 return __a + __b;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000053}
54
Chris Lattner7eac8052010-03-22 18:14:12 +000055static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +000056_mm_sub_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000057{
David Blaikie3302f2b2013-01-16 23:08:36 +000058 __a[0] -= __b[0];
59 return __a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000060}
61
Chris Lattner7eac8052010-03-22 18:14:12 +000062static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +000063_mm_sub_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000064{
David Blaikie3302f2b2013-01-16 23:08:36 +000065 return __a - __b;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000066}
67
Chris Lattner7eac8052010-03-22 18:14:12 +000068static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +000069_mm_mul_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000070{
David Blaikie3302f2b2013-01-16 23:08:36 +000071 __a[0] *= __b[0];
72 return __a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000073}
74
Chris Lattner7eac8052010-03-22 18:14:12 +000075static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +000076_mm_mul_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000077{
David Blaikie3302f2b2013-01-16 23:08:36 +000078 return __a * __b;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000079}
80
Chris Lattner7eac8052010-03-22 18:14:12 +000081static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +000082_mm_div_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000083{
David Blaikie3302f2b2013-01-16 23:08:36 +000084 __a[0] /= __b[0];
85 return __a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000086}
87
Chris Lattner7eac8052010-03-22 18:14:12 +000088static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +000089_mm_div_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000090{
David Blaikie3302f2b2013-01-16 23:08:36 +000091 return __a / __b;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000092}
93
Chris Lattner7eac8052010-03-22 18:14:12 +000094static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +000095_mm_sqrt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000096{
David Blaikie3302f2b2013-01-16 23:08:36 +000097 __m128d __c = __builtin_ia32_sqrtsd(__b);
98 return (__m128d) { __c[0], __a[1] };
Anders Carlssonf15e71d2008-12-24 01:45:22 +000099}
100
Chris Lattner7eac8052010-03-22 18:14:12 +0000101static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000102_mm_sqrt_pd(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000103{
David Blaikie3302f2b2013-01-16 23:08:36 +0000104 return __builtin_ia32_sqrtpd(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000105}
106
Chris Lattner7eac8052010-03-22 18:14:12 +0000107static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000108_mm_min_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000109{
David Blaikie3302f2b2013-01-16 23:08:36 +0000110 return __builtin_ia32_minsd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000111}
112
Chris Lattner7eac8052010-03-22 18:14:12 +0000113static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000114_mm_min_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000115{
David Blaikie3302f2b2013-01-16 23:08:36 +0000116 return __builtin_ia32_minpd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000117}
118
Chris Lattner7eac8052010-03-22 18:14:12 +0000119static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000120_mm_max_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000121{
David Blaikie3302f2b2013-01-16 23:08:36 +0000122 return __builtin_ia32_maxsd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000123}
124
Chris Lattner7eac8052010-03-22 18:14:12 +0000125static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000126_mm_max_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000127{
David Blaikie3302f2b2013-01-16 23:08:36 +0000128 return __builtin_ia32_maxpd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000129}
130
Chris Lattner7eac8052010-03-22 18:14:12 +0000131static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000132_mm_and_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000133{
David Blaikie3302f2b2013-01-16 23:08:36 +0000134 return (__m128d)((__v4si)__a & (__v4si)__b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000135}
136
Chris Lattner7eac8052010-03-22 18:14:12 +0000137static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000138_mm_andnot_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000139{
David Blaikie3302f2b2013-01-16 23:08:36 +0000140 return (__m128d)(~(__v4si)__a & (__v4si)__b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000141}
142
Chris Lattner7eac8052010-03-22 18:14:12 +0000143static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000144_mm_or_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000145{
David Blaikie3302f2b2013-01-16 23:08:36 +0000146 return (__m128d)((__v4si)__a | (__v4si)__b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000147}
148
Chris Lattner7eac8052010-03-22 18:14:12 +0000149static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000150_mm_xor_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000151{
David Blaikie3302f2b2013-01-16 23:08:36 +0000152 return (__m128d)((__v4si)__a ^ (__v4si)__b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000153}
154
Chris Lattner7eac8052010-03-22 18:14:12 +0000155static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000156_mm_cmpeq_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000157{
Craig Topper2094d8f2014-12-27 06:59:57 +0000158 return (__m128d)__builtin_ia32_cmpeqpd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000159}
160
Chris Lattner7eac8052010-03-22 18:14:12 +0000161static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000162_mm_cmplt_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000163{
Craig Topper2094d8f2014-12-27 06:59:57 +0000164 return (__m128d)__builtin_ia32_cmpltpd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000165}
166
Chris Lattner7eac8052010-03-22 18:14:12 +0000167static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000168_mm_cmple_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000169{
Craig Topper2094d8f2014-12-27 06:59:57 +0000170 return (__m128d)__builtin_ia32_cmplepd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000171}
172
Chris Lattner7eac8052010-03-22 18:14:12 +0000173static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000174_mm_cmpgt_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000175{
Craig Topper2094d8f2014-12-27 06:59:57 +0000176 return (__m128d)__builtin_ia32_cmpltpd(__b, __a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000177}
178
Chris Lattner7eac8052010-03-22 18:14:12 +0000179static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000180_mm_cmpge_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000181{
Craig Topper2094d8f2014-12-27 06:59:57 +0000182 return (__m128d)__builtin_ia32_cmplepd(__b, __a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000183}
184
Chris Lattner7eac8052010-03-22 18:14:12 +0000185static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000186_mm_cmpord_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000187{
Craig Topper2094d8f2014-12-27 06:59:57 +0000188 return (__m128d)__builtin_ia32_cmpordpd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000189}
190
Chris Lattner7eac8052010-03-22 18:14:12 +0000191static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000192_mm_cmpunord_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000193{
Craig Topper2094d8f2014-12-27 06:59:57 +0000194 return (__m128d)__builtin_ia32_cmpunordpd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000195}
196
Chris Lattner7eac8052010-03-22 18:14:12 +0000197static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000198_mm_cmpneq_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000199{
Craig Topper2094d8f2014-12-27 06:59:57 +0000200 return (__m128d)__builtin_ia32_cmpneqpd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000201}
202
Chris Lattner7eac8052010-03-22 18:14:12 +0000203static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000204_mm_cmpnlt_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000205{
Craig Topper2094d8f2014-12-27 06:59:57 +0000206 return (__m128d)__builtin_ia32_cmpnltpd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000207}
208
Chris Lattner7eac8052010-03-22 18:14:12 +0000209static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000210_mm_cmpnle_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000211{
Craig Topper2094d8f2014-12-27 06:59:57 +0000212 return (__m128d)__builtin_ia32_cmpnlepd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000213}
214
Chris Lattner7eac8052010-03-22 18:14:12 +0000215static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000216_mm_cmpngt_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000217{
Craig Topper2094d8f2014-12-27 06:59:57 +0000218 return (__m128d)__builtin_ia32_cmpnltpd(__b, __a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000219}
220
Chris Lattner7eac8052010-03-22 18:14:12 +0000221static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000222_mm_cmpnge_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000223{
Craig Topper2094d8f2014-12-27 06:59:57 +0000224 return (__m128d)__builtin_ia32_cmpnlepd(__b, __a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000225}
226
Chris Lattner7eac8052010-03-22 18:14:12 +0000227static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000228_mm_cmpeq_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000229{
Craig Topper2094d8f2014-12-27 06:59:57 +0000230 return (__m128d)__builtin_ia32_cmpeqsd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000231}
232
Chris Lattner7eac8052010-03-22 18:14:12 +0000233static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000234_mm_cmplt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000235{
Craig Topper2094d8f2014-12-27 06:59:57 +0000236 return (__m128d)__builtin_ia32_cmpltsd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000237}
238
Chris Lattner7eac8052010-03-22 18:14:12 +0000239static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000240_mm_cmple_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000241{
Craig Topper2094d8f2014-12-27 06:59:57 +0000242 return (__m128d)__builtin_ia32_cmplesd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000243}
244
Chris Lattner7eac8052010-03-22 18:14:12 +0000245static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000246_mm_cmpgt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000247{
Craig Topper2094d8f2014-12-27 06:59:57 +0000248 __m128d __c = __builtin_ia32_cmpltsd(__b, __a);
Manman Ren9bb34d62013-06-17 19:42:49 +0000249 return (__m128d) { __c[0], __a[1] };
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000250}
251
Chris Lattner7eac8052010-03-22 18:14:12 +0000252static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000253_mm_cmpge_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000254{
Craig Topper2094d8f2014-12-27 06:59:57 +0000255 __m128d __c = __builtin_ia32_cmplesd(__b, __a);
Manman Ren9bb34d62013-06-17 19:42:49 +0000256 return (__m128d) { __c[0], __a[1] };
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000257}
258
Chris Lattner7eac8052010-03-22 18:14:12 +0000259static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000260_mm_cmpord_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000261{
Craig Topper2094d8f2014-12-27 06:59:57 +0000262 return (__m128d)__builtin_ia32_cmpordsd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000263}
264
Chris Lattner7eac8052010-03-22 18:14:12 +0000265static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000266_mm_cmpunord_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000267{
Craig Topper2094d8f2014-12-27 06:59:57 +0000268 return (__m128d)__builtin_ia32_cmpunordsd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000269}
270
Chris Lattner7eac8052010-03-22 18:14:12 +0000271static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000272_mm_cmpneq_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000273{
Craig Topper2094d8f2014-12-27 06:59:57 +0000274 return (__m128d)__builtin_ia32_cmpneqsd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000275}
276
Chris Lattner7eac8052010-03-22 18:14:12 +0000277static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000278_mm_cmpnlt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000279{
Craig Topper2094d8f2014-12-27 06:59:57 +0000280 return (__m128d)__builtin_ia32_cmpnltsd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000281}
282
Chris Lattner7eac8052010-03-22 18:14:12 +0000283static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000284_mm_cmpnle_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000285{
Craig Topper2094d8f2014-12-27 06:59:57 +0000286 return (__m128d)__builtin_ia32_cmpnlesd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000287}
288
Chris Lattner7eac8052010-03-22 18:14:12 +0000289static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000290_mm_cmpngt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000291{
Craig Topper2094d8f2014-12-27 06:59:57 +0000292 __m128d __c = __builtin_ia32_cmpnltsd(__b, __a);
Manman Ren9bb34d62013-06-17 19:42:49 +0000293 return (__m128d) { __c[0], __a[1] };
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000294}
295
Chris Lattner7eac8052010-03-22 18:14:12 +0000296static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000297_mm_cmpnge_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000298{
Craig Topper2094d8f2014-12-27 06:59:57 +0000299 __m128d __c = __builtin_ia32_cmpnlesd(__b, __a);
Manman Ren9bb34d62013-06-17 19:42:49 +0000300 return (__m128d) { __c[0], __a[1] };
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000301}
302
Chris Lattner7eac8052010-03-22 18:14:12 +0000303static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000304_mm_comieq_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000305{
David Blaikie3302f2b2013-01-16 23:08:36 +0000306 return __builtin_ia32_comisdeq(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000307}
308
Chris Lattner7eac8052010-03-22 18:14:12 +0000309static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000310_mm_comilt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000311{
David Blaikie3302f2b2013-01-16 23:08:36 +0000312 return __builtin_ia32_comisdlt(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000313}
314
Chris Lattner7eac8052010-03-22 18:14:12 +0000315static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000316_mm_comile_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000317{
David Blaikie3302f2b2013-01-16 23:08:36 +0000318 return __builtin_ia32_comisdle(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000319}
320
Chris Lattner7eac8052010-03-22 18:14:12 +0000321static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000322_mm_comigt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000323{
David Blaikie3302f2b2013-01-16 23:08:36 +0000324 return __builtin_ia32_comisdgt(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000325}
326
Chris Lattner7eac8052010-03-22 18:14:12 +0000327static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000328_mm_comige_sd(__m128d __a, __m128d __b)
Eli Friedman89c11332011-10-06 20:31:50 +0000329{
David Blaikie3302f2b2013-01-16 23:08:36 +0000330 return __builtin_ia32_comisdge(__a, __b);
Eli Friedman89c11332011-10-06 20:31:50 +0000331}
332
333static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000334_mm_comineq_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000335{
David Blaikie3302f2b2013-01-16 23:08:36 +0000336 return __builtin_ia32_comisdneq(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000337}
338
Chris Lattner7eac8052010-03-22 18:14:12 +0000339static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000340_mm_ucomieq_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000341{
David Blaikie3302f2b2013-01-16 23:08:36 +0000342 return __builtin_ia32_ucomisdeq(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000343}
344
Chris Lattner7eac8052010-03-22 18:14:12 +0000345static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000346_mm_ucomilt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000347{
David Blaikie3302f2b2013-01-16 23:08:36 +0000348 return __builtin_ia32_ucomisdlt(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000349}
350
Chris Lattner7eac8052010-03-22 18:14:12 +0000351static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000352_mm_ucomile_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000353{
David Blaikie3302f2b2013-01-16 23:08:36 +0000354 return __builtin_ia32_ucomisdle(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000355}
356
Chris Lattner7eac8052010-03-22 18:14:12 +0000357static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000358_mm_ucomigt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000359{
David Blaikie3302f2b2013-01-16 23:08:36 +0000360 return __builtin_ia32_ucomisdgt(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000361}
362
Chris Lattner7eac8052010-03-22 18:14:12 +0000363static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000364_mm_ucomige_sd(__m128d __a, __m128d __b)
Eli Friedmanf8cb4802011-08-29 21:26:24 +0000365{
David Blaikie3302f2b2013-01-16 23:08:36 +0000366 return __builtin_ia32_ucomisdge(__a, __b);
Eli Friedmanf8cb4802011-08-29 21:26:24 +0000367}
368
369static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000370_mm_ucomineq_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000371{
David Blaikie3302f2b2013-01-16 23:08:36 +0000372 return __builtin_ia32_ucomisdneq(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000373}
374
Chris Lattner7eac8052010-03-22 18:14:12 +0000375static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000376_mm_cvtpd_ps(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000377{
David Blaikie3302f2b2013-01-16 23:08:36 +0000378 return __builtin_ia32_cvtpd2ps(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000379}
380
Chris Lattner7eac8052010-03-22 18:14:12 +0000381static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000382_mm_cvtps_pd(__m128 __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000383{
David Blaikie3302f2b2013-01-16 23:08:36 +0000384 return __builtin_ia32_cvtps2pd(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000385}
386
Chris Lattner7eac8052010-03-22 18:14:12 +0000387static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000388_mm_cvtepi32_pd(__m128i __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000389{
David Blaikie3302f2b2013-01-16 23:08:36 +0000390 return __builtin_ia32_cvtdq2pd((__v4si)__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000391}
392
Chris Lattner7eac8052010-03-22 18:14:12 +0000393static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000394_mm_cvtpd_epi32(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000395{
David Blaikie3302f2b2013-01-16 23:08:36 +0000396 return __builtin_ia32_cvtpd2dq(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000397}
398
Chris Lattner7eac8052010-03-22 18:14:12 +0000399static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000400_mm_cvtsd_si32(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000401{
David Blaikie3302f2b2013-01-16 23:08:36 +0000402 return __builtin_ia32_cvtsd2si(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000403}
404
Chris Lattner7eac8052010-03-22 18:14:12 +0000405static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000406_mm_cvtsd_ss(__m128 __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000407{
David Blaikie3302f2b2013-01-16 23:08:36 +0000408 __a[0] = __b[0];
409 return __a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000410}
411
Chris Lattner7eac8052010-03-22 18:14:12 +0000412static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000413_mm_cvtsi32_sd(__m128d __a, int __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000414{
David Blaikie3302f2b2013-01-16 23:08:36 +0000415 __a[0] = __b;
416 return __a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000417}
418
Chris Lattner7eac8052010-03-22 18:14:12 +0000419static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000420_mm_cvtss_sd(__m128d __a, __m128 __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000421{
David Blaikie3302f2b2013-01-16 23:08:36 +0000422 __a[0] = __b[0];
423 return __a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000424}
425
Chris Lattner7eac8052010-03-22 18:14:12 +0000426static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000427_mm_cvttpd_epi32(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000428{
David Blaikie3302f2b2013-01-16 23:08:36 +0000429 return (__m128i)__builtin_ia32_cvttpd2dq(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000430}
431
Chris Lattner7eac8052010-03-22 18:14:12 +0000432static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000433_mm_cvttsd_si32(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000434{
David Blaikie3302f2b2013-01-16 23:08:36 +0000435 return __a[0];
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000436}
437
Chris Lattner7eac8052010-03-22 18:14:12 +0000438static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000439_mm_cvtpd_pi32(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000440{
David Blaikie3302f2b2013-01-16 23:08:36 +0000441 return (__m64)__builtin_ia32_cvtpd2pi(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000442}
443
Chris Lattner7eac8052010-03-22 18:14:12 +0000444static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000445_mm_cvttpd_pi32(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000446{
David Blaikie3302f2b2013-01-16 23:08:36 +0000447 return (__m64)__builtin_ia32_cvttpd2pi(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000448}
449
Chris Lattner7eac8052010-03-22 18:14:12 +0000450static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000451_mm_cvtpi32_pd(__m64 __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000452{
David Blaikie3302f2b2013-01-16 23:08:36 +0000453 return __builtin_ia32_cvtpi2pd((__v2si)__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000454}
455
Chris Lattner7eac8052010-03-22 18:14:12 +0000456static __inline__ double __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000457_mm_cvtsd_f64(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000458{
David Blaikie3302f2b2013-01-16 23:08:36 +0000459 return __a[0];
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000460}
461
Chris Lattner7eac8052010-03-22 18:14:12 +0000462static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000463_mm_load_pd(double const *__dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000464{
David Blaikie3302f2b2013-01-16 23:08:36 +0000465 return *(__m128d*)__dp;
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000466}
467
Chris Lattner7eac8052010-03-22 18:14:12 +0000468static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000469_mm_load1_pd(double const *__dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000470{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000471 struct __mm_load1_pd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000472 double __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000473 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000474 double __u = ((struct __mm_load1_pd_struct*)__dp)->__u;
475 return (__m128d){ __u, __u };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000476}
477
Eli Friedmanf83c2582009-06-02 05:55:48 +0000478#define _mm_load_pd1(dp) _mm_load1_pd(dp)
479
Chris Lattner7eac8052010-03-22 18:14:12 +0000480static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000481_mm_loadr_pd(double const *__dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000482{
David Blaikie3302f2b2013-01-16 23:08:36 +0000483 __m128d __u = *(__m128d*)__dp;
484 return __builtin_shufflevector(__u, __u, 1, 0);
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000485}
486
Chris Lattner7eac8052010-03-22 18:14:12 +0000487static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000488_mm_loadu_pd(double const *__dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000489{
Bill Wendling502931f2011-05-13 00:11:39 +0000490 struct __loadu_pd {
David Blaikie3302f2b2013-01-16 23:08:36 +0000491 __m128d __v;
David Majnemer1cf22e62015-02-04 00:26:10 +0000492 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000493 return ((struct __loadu_pd*)__dp)->__v;
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000494}
495
Chris Lattner7eac8052010-03-22 18:14:12 +0000496static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000497_mm_load_sd(double const *__dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000498{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000499 struct __mm_load_sd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000500 double __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000501 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000502 double __u = ((struct __mm_load_sd_struct*)__dp)->__u;
503 return (__m128d){ __u, 0 };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000504}
505
Chris Lattner7eac8052010-03-22 18:14:12 +0000506static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000507_mm_loadh_pd(__m128d __a, double const *__dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000508{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000509 struct __mm_loadh_pd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000510 double __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000511 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000512 double __u = ((struct __mm_loadh_pd_struct*)__dp)->__u;
513 return (__m128d){ __a[0], __u };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000514}
515
Chris Lattner7eac8052010-03-22 18:14:12 +0000516static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000517_mm_loadl_pd(__m128d __a, double const *__dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000518{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000519 struct __mm_loadl_pd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000520 double __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000521 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000522 double __u = ((struct __mm_loadl_pd_struct*)__dp)->__u;
523 return (__m128d){ __u, __a[1] };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000524}
525
Chris Lattner7eac8052010-03-22 18:14:12 +0000526static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000527_mm_set_sd(double __w)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000528{
David Blaikie3302f2b2013-01-16 23:08:36 +0000529 return (__m128d){ __w, 0 };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000530}
531
Chris Lattner7eac8052010-03-22 18:14:12 +0000532static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000533_mm_set1_pd(double __w)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000534{
David Blaikie3302f2b2013-01-16 23:08:36 +0000535 return (__m128d){ __w, __w };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000536}
537
Chris Lattner7eac8052010-03-22 18:14:12 +0000538static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000539_mm_set_pd(double __w, double __x)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000540{
David Blaikie3302f2b2013-01-16 23:08:36 +0000541 return (__m128d){ __x, __w };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000542}
543
Chris Lattner7eac8052010-03-22 18:14:12 +0000544static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000545_mm_setr_pd(double __w, double __x)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000546{
David Blaikie3302f2b2013-01-16 23:08:36 +0000547 return (__m128d){ __w, __x };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000548}
549
Chris Lattner7eac8052010-03-22 18:14:12 +0000550static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000551_mm_setzero_pd(void)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000552{
553 return (__m128d){ 0, 0 };
554}
555
Chris Lattner7eac8052010-03-22 18:14:12 +0000556static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000557_mm_move_sd(__m128d __a, __m128d __b)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000558{
David Blaikie3302f2b2013-01-16 23:08:36 +0000559 return (__m128d){ __b[0], __a[1] };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000560}
561
Chris Lattner7eac8052010-03-22 18:14:12 +0000562static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000563_mm_store_sd(double *__dp, __m128d __a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000564{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000565 struct __mm_store_sd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000566 double __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000567 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000568 ((struct __mm_store_sd_struct*)__dp)->__u = __a[0];
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000569}
570
Chris Lattner7eac8052010-03-22 18:14:12 +0000571static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000572_mm_store1_pd(double *__dp, __m128d __a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000573{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000574 struct __mm_store1_pd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000575 double __u[2];
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000576 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000577 ((struct __mm_store1_pd_struct*)__dp)->__u[0] = __a[0];
578 ((struct __mm_store1_pd_struct*)__dp)->__u[1] = __a[0];
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000579}
580
Chris Lattner7eac8052010-03-22 18:14:12 +0000581static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000582_mm_store_pd(double *__dp, __m128d __a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000583{
David Blaikie3302f2b2013-01-16 23:08:36 +0000584 *(__m128d *)__dp = __a;
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000585}
586
Chris Lattner7eac8052010-03-22 18:14:12 +0000587static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000588_mm_storeu_pd(double *__dp, __m128d __a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000589{
David Blaikie3302f2b2013-01-16 23:08:36 +0000590 __builtin_ia32_storeupd(__dp, __a);
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000591}
592
Chris Lattner7eac8052010-03-22 18:14:12 +0000593static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000594_mm_storer_pd(double *__dp, __m128d __a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000595{
David Blaikie3302f2b2013-01-16 23:08:36 +0000596 __a = __builtin_shufflevector(__a, __a, 1, 0);
597 *(__m128d *)__dp = __a;
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000598}
599
Chris Lattner7eac8052010-03-22 18:14:12 +0000600static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000601_mm_storeh_pd(double *__dp, __m128d __a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000602{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000603 struct __mm_storeh_pd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000604 double __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000605 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000606 ((struct __mm_storeh_pd_struct*)__dp)->__u = __a[1];
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000607}
608
Chris Lattner7eac8052010-03-22 18:14:12 +0000609static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000610_mm_storel_pd(double *__dp, __m128d __a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000611{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000612 struct __mm_storeh_pd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000613 double __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000614 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000615 ((struct __mm_storeh_pd_struct*)__dp)->__u = __a[0];
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000616}
617
Chris Lattner7eac8052010-03-22 18:14:12 +0000618static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000619_mm_add_epi8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000620{
David Blaikie3302f2b2013-01-16 23:08:36 +0000621 return (__m128i)((__v16qi)__a + (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000622}
623
Chris Lattner7eac8052010-03-22 18:14:12 +0000624static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000625_mm_add_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000626{
David Blaikie3302f2b2013-01-16 23:08:36 +0000627 return (__m128i)((__v8hi)__a + (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000628}
629
Chris Lattner7eac8052010-03-22 18:14:12 +0000630static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000631_mm_add_epi32(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000632{
David Blaikie3302f2b2013-01-16 23:08:36 +0000633 return (__m128i)((__v4si)__a + (__v4si)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000634}
635
Chris Lattner7eac8052010-03-22 18:14:12 +0000636static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000637_mm_add_si64(__m64 __a, __m64 __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000638{
David Blaikie3302f2b2013-01-16 23:08:36 +0000639 return __a + __b;
Anders Carlssona283f912008-12-24 02:41:00 +0000640}
641
Chris Lattner7eac8052010-03-22 18:14:12 +0000642static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000643_mm_add_epi64(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000644{
David Blaikie3302f2b2013-01-16 23:08:36 +0000645 return __a + __b;
Anders Carlssona283f912008-12-24 02:41:00 +0000646}
647
Chris Lattner7eac8052010-03-22 18:14:12 +0000648static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000649_mm_adds_epi8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000650{
David Blaikie3302f2b2013-01-16 23:08:36 +0000651 return (__m128i)__builtin_ia32_paddsb128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000652}
653
Chris Lattner7eac8052010-03-22 18:14:12 +0000654static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000655_mm_adds_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000656{
David Blaikie3302f2b2013-01-16 23:08:36 +0000657 return (__m128i)__builtin_ia32_paddsw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000658}
659
Chris Lattner7eac8052010-03-22 18:14:12 +0000660static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000661_mm_adds_epu8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000662{
David Blaikie3302f2b2013-01-16 23:08:36 +0000663 return (__m128i)__builtin_ia32_paddusb128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000664}
665
Chris Lattner7eac8052010-03-22 18:14:12 +0000666static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000667_mm_adds_epu16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000668{
David Blaikie3302f2b2013-01-16 23:08:36 +0000669 return (__m128i)__builtin_ia32_paddusw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000670}
671
Chris Lattner7eac8052010-03-22 18:14:12 +0000672static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000673_mm_avg_epu8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000674{
David Blaikie3302f2b2013-01-16 23:08:36 +0000675 return (__m128i)__builtin_ia32_pavgb128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000676}
677
Chris Lattner7eac8052010-03-22 18:14:12 +0000678static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000679_mm_avg_epu16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000680{
David Blaikie3302f2b2013-01-16 23:08:36 +0000681 return (__m128i)__builtin_ia32_pavgw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000682}
683
Chris Lattner7eac8052010-03-22 18:14:12 +0000684static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000685_mm_madd_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000686{
David Blaikie3302f2b2013-01-16 23:08:36 +0000687 return (__m128i)__builtin_ia32_pmaddwd128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000688}
689
Chris Lattner7eac8052010-03-22 18:14:12 +0000690static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000691_mm_max_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000692{
David Blaikie3302f2b2013-01-16 23:08:36 +0000693 return (__m128i)__builtin_ia32_pmaxsw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000694}
695
Chris Lattner7eac8052010-03-22 18:14:12 +0000696static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000697_mm_max_epu8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000698{
David Blaikie3302f2b2013-01-16 23:08:36 +0000699 return (__m128i)__builtin_ia32_pmaxub128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000700}
701
Chris Lattner7eac8052010-03-22 18:14:12 +0000702static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000703_mm_min_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000704{
David Blaikie3302f2b2013-01-16 23:08:36 +0000705 return (__m128i)__builtin_ia32_pminsw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000706}
707
Chris Lattner7eac8052010-03-22 18:14:12 +0000708static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000709_mm_min_epu8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000710{
David Blaikie3302f2b2013-01-16 23:08:36 +0000711 return (__m128i)__builtin_ia32_pminub128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000712}
713
Chris Lattner7eac8052010-03-22 18:14:12 +0000714static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000715_mm_mulhi_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000716{
David Blaikie3302f2b2013-01-16 23:08:36 +0000717 return (__m128i)__builtin_ia32_pmulhw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000718}
719
Chris Lattner7eac8052010-03-22 18:14:12 +0000720static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000721_mm_mulhi_epu16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000722{
David Blaikie3302f2b2013-01-16 23:08:36 +0000723 return (__m128i)__builtin_ia32_pmulhuw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000724}
725
Chris Lattner7eac8052010-03-22 18:14:12 +0000726static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000727_mm_mullo_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000728{
David Blaikie3302f2b2013-01-16 23:08:36 +0000729 return (__m128i)((__v8hi)__a * (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000730}
731
Chris Lattner7eac8052010-03-22 18:14:12 +0000732static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000733_mm_mul_su32(__m64 __a, __m64 __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000734{
David Blaikie3302f2b2013-01-16 23:08:36 +0000735 return __builtin_ia32_pmuludq((__v2si)__a, (__v2si)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000736}
737
Chris Lattner7eac8052010-03-22 18:14:12 +0000738static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000739_mm_mul_epu32(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000740{
David Blaikie3302f2b2013-01-16 23:08:36 +0000741 return __builtin_ia32_pmuludq128((__v4si)__a, (__v4si)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000742}
743
Chris Lattner7eac8052010-03-22 18:14:12 +0000744static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000745_mm_sad_epu8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000746{
David Blaikie3302f2b2013-01-16 23:08:36 +0000747 return __builtin_ia32_psadbw128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000748}
749
Chris Lattner7eac8052010-03-22 18:14:12 +0000750static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000751_mm_sub_epi8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000752{
David Blaikie3302f2b2013-01-16 23:08:36 +0000753 return (__m128i)((__v16qi)__a - (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000754}
755
Chris Lattner7eac8052010-03-22 18:14:12 +0000756static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000757_mm_sub_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000758{
David Blaikie3302f2b2013-01-16 23:08:36 +0000759 return (__m128i)((__v8hi)__a - (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000760}
761
Chris Lattner7eac8052010-03-22 18:14:12 +0000762static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000763_mm_sub_epi32(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000764{
David Blaikie3302f2b2013-01-16 23:08:36 +0000765 return (__m128i)((__v4si)__a - (__v4si)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000766}
767
Chris Lattner7eac8052010-03-22 18:14:12 +0000768static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000769_mm_sub_si64(__m64 __a, __m64 __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000770{
David Blaikie3302f2b2013-01-16 23:08:36 +0000771 return __a - __b;
Anders Carlssona283f912008-12-24 02:41:00 +0000772}
773
Chris Lattner7eac8052010-03-22 18:14:12 +0000774static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000775_mm_sub_epi64(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000776{
David Blaikie3302f2b2013-01-16 23:08:36 +0000777 return __a - __b;
Anders Carlssona283f912008-12-24 02:41:00 +0000778}
779
Chris Lattner7eac8052010-03-22 18:14:12 +0000780static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000781_mm_subs_epi8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000782{
David Blaikie3302f2b2013-01-16 23:08:36 +0000783 return (__m128i)__builtin_ia32_psubsb128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000784}
785
Chris Lattner7eac8052010-03-22 18:14:12 +0000786static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000787_mm_subs_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000788{
David Blaikie3302f2b2013-01-16 23:08:36 +0000789 return (__m128i)__builtin_ia32_psubsw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000790}
791
Chris Lattner7eac8052010-03-22 18:14:12 +0000792static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000793_mm_subs_epu8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000794{
David Blaikie3302f2b2013-01-16 23:08:36 +0000795 return (__m128i)__builtin_ia32_psubusb128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000796}
797
Chris Lattner7eac8052010-03-22 18:14:12 +0000798static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000799_mm_subs_epu16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000800{
David Blaikie3302f2b2013-01-16 23:08:36 +0000801 return (__m128i)__builtin_ia32_psubusw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000802}
803
Chris Lattner7eac8052010-03-22 18:14:12 +0000804static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000805_mm_and_si128(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000806{
David Blaikie3302f2b2013-01-16 23:08:36 +0000807 return __a & __b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000808}
809
Chris Lattner7eac8052010-03-22 18:14:12 +0000810static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000811_mm_andnot_si128(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000812{
David Blaikie3302f2b2013-01-16 23:08:36 +0000813 return ~__a & __b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000814}
815
Chris Lattner7eac8052010-03-22 18:14:12 +0000816static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000817_mm_or_si128(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000818{
David Blaikie3302f2b2013-01-16 23:08:36 +0000819 return __a | __b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000820}
821
Chris Lattner7eac8052010-03-22 18:14:12 +0000822static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000823_mm_xor_si128(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000824{
David Blaikie3302f2b2013-01-16 23:08:36 +0000825 return __a ^ __b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000826}
827
Craig Topper51e47412015-02-13 06:04:43 +0000828#define _mm_slli_si128(a, imm) __extension__ ({ \
829 (__m128i)__builtin_shufflevector((__v16qi)_mm_setzero_si128(), \
830 (__v16qi)(__m128i)(a), \
831 ((imm)&0xF0) ? 0 : 16 - ((imm)&0xF), \
832 ((imm)&0xF0) ? 0 : 17 - ((imm)&0xF), \
833 ((imm)&0xF0) ? 0 : 18 - ((imm)&0xF), \
834 ((imm)&0xF0) ? 0 : 19 - ((imm)&0xF), \
835 ((imm)&0xF0) ? 0 : 20 - ((imm)&0xF), \
836 ((imm)&0xF0) ? 0 : 21 - ((imm)&0xF), \
837 ((imm)&0xF0) ? 0 : 22 - ((imm)&0xF), \
838 ((imm)&0xF0) ? 0 : 23 - ((imm)&0xF), \
839 ((imm)&0xF0) ? 0 : 24 - ((imm)&0xF), \
840 ((imm)&0xF0) ? 0 : 25 - ((imm)&0xF), \
841 ((imm)&0xF0) ? 0 : 26 - ((imm)&0xF), \
842 ((imm)&0xF0) ? 0 : 27 - ((imm)&0xF), \
843 ((imm)&0xF0) ? 0 : 28 - ((imm)&0xF), \
844 ((imm)&0xF0) ? 0 : 29 - ((imm)&0xF), \
845 ((imm)&0xF0) ? 0 : 30 - ((imm)&0xF), \
846 ((imm)&0xF0) ? 0 : 31 - ((imm)&0xF)); })
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000847
Chris Lattner7eac8052010-03-22 18:14:12 +0000848static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000849_mm_slli_epi16(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000850{
David Blaikie3302f2b2013-01-16 23:08:36 +0000851 return (__m128i)__builtin_ia32_psllwi128((__v8hi)__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000852}
853
Chris Lattner7eac8052010-03-22 18:14:12 +0000854static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000855_mm_sll_epi16(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000856{
David Blaikie3302f2b2013-01-16 23:08:36 +0000857 return (__m128i)__builtin_ia32_psllw128((__v8hi)__a, (__v8hi)__count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000858}
859
Chris Lattner7eac8052010-03-22 18:14:12 +0000860static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000861_mm_slli_epi32(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000862{
David Blaikie3302f2b2013-01-16 23:08:36 +0000863 return (__m128i)__builtin_ia32_pslldi128((__v4si)__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000864}
865
Chris Lattner7eac8052010-03-22 18:14:12 +0000866static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000867_mm_sll_epi32(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000868{
David Blaikie3302f2b2013-01-16 23:08:36 +0000869 return (__m128i)__builtin_ia32_pslld128((__v4si)__a, (__v4si)__count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000870}
871
Chris Lattner7eac8052010-03-22 18:14:12 +0000872static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000873_mm_slli_epi64(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000874{
David Blaikie3302f2b2013-01-16 23:08:36 +0000875 return __builtin_ia32_psllqi128(__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000876}
877
Chris Lattner7eac8052010-03-22 18:14:12 +0000878static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000879_mm_sll_epi64(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000880{
David Blaikie3302f2b2013-01-16 23:08:36 +0000881 return __builtin_ia32_psllq128(__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000882}
883
Chris Lattner7eac8052010-03-22 18:14:12 +0000884static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000885_mm_srai_epi16(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000886{
David Blaikie3302f2b2013-01-16 23:08:36 +0000887 return (__m128i)__builtin_ia32_psrawi128((__v8hi)__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000888}
889
Chris Lattner7eac8052010-03-22 18:14:12 +0000890static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000891_mm_sra_epi16(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000892{
David Blaikie3302f2b2013-01-16 23:08:36 +0000893 return (__m128i)__builtin_ia32_psraw128((__v8hi)__a, (__v8hi)__count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000894}
895
Chris Lattner7eac8052010-03-22 18:14:12 +0000896static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000897_mm_srai_epi32(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000898{
David Blaikie3302f2b2013-01-16 23:08:36 +0000899 return (__m128i)__builtin_ia32_psradi128((__v4si)__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000900}
901
Chris Lattner7eac8052010-03-22 18:14:12 +0000902static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000903_mm_sra_epi32(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000904{
David Blaikie3302f2b2013-01-16 23:08:36 +0000905 return (__m128i)__builtin_ia32_psrad128((__v4si)__a, (__v4si)__count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000906}
907
Craig Topper51e47412015-02-13 06:04:43 +0000908#define _mm_srli_si128(a, imm) __extension__ ({ \
909 (__m128i)__builtin_shufflevector((__v16qi)(__m128i)(a), \
910 (__v16qi)_mm_setzero_si128(), \
911 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 0, \
912 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 1, \
913 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 2, \
914 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 3, \
915 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 4, \
916 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 5, \
917 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 6, \
918 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 7, \
919 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 8, \
920 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 9, \
921 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 10, \
922 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 11, \
923 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 12, \
924 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 13, \
925 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 14, \
926 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 15); })
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000927
Chris Lattner7eac8052010-03-22 18:14:12 +0000928static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000929_mm_srli_epi16(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000930{
David Blaikie3302f2b2013-01-16 23:08:36 +0000931 return (__m128i)__builtin_ia32_psrlwi128((__v8hi)__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000932}
933
Chris Lattner7eac8052010-03-22 18:14:12 +0000934static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000935_mm_srl_epi16(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000936{
David Blaikie3302f2b2013-01-16 23:08:36 +0000937 return (__m128i)__builtin_ia32_psrlw128((__v8hi)__a, (__v8hi)__count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000938}
939
Chris Lattner7eac8052010-03-22 18:14:12 +0000940static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000941_mm_srli_epi32(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000942{
David Blaikie3302f2b2013-01-16 23:08:36 +0000943 return (__m128i)__builtin_ia32_psrldi128((__v4si)__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000944}
945
Chris Lattner7eac8052010-03-22 18:14:12 +0000946static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000947_mm_srl_epi32(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000948{
David Blaikie3302f2b2013-01-16 23:08:36 +0000949 return (__m128i)__builtin_ia32_psrld128((__v4si)__a, (__v4si)__count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000950}
951
Chris Lattner7eac8052010-03-22 18:14:12 +0000952static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000953_mm_srli_epi64(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000954{
David Blaikie3302f2b2013-01-16 23:08:36 +0000955 return __builtin_ia32_psrlqi128(__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000956}
957
Chris Lattner7eac8052010-03-22 18:14:12 +0000958static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000959_mm_srl_epi64(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000960{
David Blaikie3302f2b2013-01-16 23:08:36 +0000961 return __builtin_ia32_psrlq128(__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000962}
963
Chris Lattner7eac8052010-03-22 18:14:12 +0000964static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000965_mm_cmpeq_epi8(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000966{
David Blaikie3302f2b2013-01-16 23:08:36 +0000967 return (__m128i)((__v16qi)__a == (__v16qi)__b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000968}
969
Chris Lattner7eac8052010-03-22 18:14:12 +0000970static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000971_mm_cmpeq_epi16(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000972{
David Blaikie3302f2b2013-01-16 23:08:36 +0000973 return (__m128i)((__v8hi)__a == (__v8hi)__b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000974}
975
Chris Lattner7eac8052010-03-22 18:14:12 +0000976static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000977_mm_cmpeq_epi32(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000978{
David Blaikie3302f2b2013-01-16 23:08:36 +0000979 return (__m128i)((__v4si)__a == (__v4si)__b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000980}
981
Chris Lattner7eac8052010-03-22 18:14:12 +0000982static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000983_mm_cmpgt_epi8(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000984{
Nick Lewyckyd0ba3792012-02-04 02:16:48 +0000985 /* This function always performs a signed comparison, but __v16qi is a char
986 which may be signed or unsigned. */
Nick Lewycky51a00902012-02-03 23:57:48 +0000987 typedef signed char __v16qs __attribute__((__vector_size__(16)));
David Blaikie3302f2b2013-01-16 23:08:36 +0000988 return (__m128i)((__v16qs)__a > (__v16qs)__b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000989}
990
Chris Lattner7eac8052010-03-22 18:14:12 +0000991static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000992_mm_cmpgt_epi16(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000993{
David Blaikie3302f2b2013-01-16 23:08:36 +0000994 return (__m128i)((__v8hi)__a > (__v8hi)__b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000995}
996
Chris Lattner7eac8052010-03-22 18:14:12 +0000997static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000998_mm_cmpgt_epi32(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000999{
David Blaikie3302f2b2013-01-16 23:08:36 +00001000 return (__m128i)((__v4si)__a > (__v4si)__b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001001}
1002
Chris Lattner7eac8052010-03-22 18:14:12 +00001003static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001004_mm_cmplt_epi8(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001005{
David Blaikie3302f2b2013-01-16 23:08:36 +00001006 return _mm_cmpgt_epi8(__b, __a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001007}
1008
Chris Lattner7eac8052010-03-22 18:14:12 +00001009static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001010_mm_cmplt_epi16(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001011{
David Blaikie3302f2b2013-01-16 23:08:36 +00001012 return _mm_cmpgt_epi16(__b, __a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001013}
1014
Chris Lattner7eac8052010-03-22 18:14:12 +00001015static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001016_mm_cmplt_epi32(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001017{
David Blaikie3302f2b2013-01-16 23:08:36 +00001018 return _mm_cmpgt_epi32(__b, __a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001019}
1020
1021#ifdef __x86_64__
Chris Lattner7eac8052010-03-22 18:14:12 +00001022static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001023_mm_cvtsi64_sd(__m128d __a, long long __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001024{
David Blaikie3302f2b2013-01-16 23:08:36 +00001025 __a[0] = __b;
1026 return __a;
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001027}
1028
Chris Lattner7eac8052010-03-22 18:14:12 +00001029static __inline__ long long __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001030_mm_cvtsd_si64(__m128d __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001031{
David Blaikie3302f2b2013-01-16 23:08:36 +00001032 return __builtin_ia32_cvtsd2si64(__a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001033}
1034
Chris Lattner7eac8052010-03-22 18:14:12 +00001035static __inline__ long long __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001036_mm_cvttsd_si64(__m128d __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001037{
David Blaikie3302f2b2013-01-16 23:08:36 +00001038 return __a[0];
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001039}
1040#endif
1041
Chris Lattner7eac8052010-03-22 18:14:12 +00001042static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001043_mm_cvtepi32_ps(__m128i __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001044{
David Blaikie3302f2b2013-01-16 23:08:36 +00001045 return __builtin_ia32_cvtdq2ps((__v4si)__a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001046}
1047
Chris Lattner7eac8052010-03-22 18:14:12 +00001048static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001049_mm_cvtps_epi32(__m128 __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001050{
David Blaikie3302f2b2013-01-16 23:08:36 +00001051 return (__m128i)__builtin_ia32_cvtps2dq(__a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001052}
1053
Chris Lattner7eac8052010-03-22 18:14:12 +00001054static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001055_mm_cvttps_epi32(__m128 __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001056{
David Blaikie3302f2b2013-01-16 23:08:36 +00001057 return (__m128i)__builtin_ia32_cvttps2dq(__a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001058}
1059
Chris Lattner7eac8052010-03-22 18:14:12 +00001060static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001061_mm_cvtsi32_si128(int __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001062{
David Blaikie3302f2b2013-01-16 23:08:36 +00001063 return (__m128i)(__v4si){ __a, 0, 0, 0 };
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001064}
1065
1066#ifdef __x86_64__
Chris Lattner7eac8052010-03-22 18:14:12 +00001067static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001068_mm_cvtsi64_si128(long long __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001069{
David Blaikie3302f2b2013-01-16 23:08:36 +00001070 return (__m128i){ __a, 0 };
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001071}
1072#endif
1073
Chris Lattner7eac8052010-03-22 18:14:12 +00001074static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001075_mm_cvtsi128_si32(__m128i __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001076{
David Blaikie3302f2b2013-01-16 23:08:36 +00001077 __v4si __b = (__v4si)__a;
1078 return __b[0];
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001079}
1080
1081#ifdef __x86_64__
Chris Lattner7eac8052010-03-22 18:14:12 +00001082static __inline__ long long __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001083_mm_cvtsi128_si64(__m128i __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001084{
David Blaikie3302f2b2013-01-16 23:08:36 +00001085 return __a[0];
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001086}
1087#endif
1088
Chris Lattner7eac8052010-03-22 18:14:12 +00001089static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001090_mm_load_si128(__m128i const *__p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001091{
David Blaikie3302f2b2013-01-16 23:08:36 +00001092 return *__p;
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001093}
1094
Chris Lattner7eac8052010-03-22 18:14:12 +00001095static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001096_mm_loadu_si128(__m128i const *__p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001097{
Bill Wendling502931f2011-05-13 00:11:39 +00001098 struct __loadu_si128 {
David Blaikie3302f2b2013-01-16 23:08:36 +00001099 __m128i __v;
David Majnemer1cf22e62015-02-04 00:26:10 +00001100 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +00001101 return ((struct __loadu_si128*)__p)->__v;
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001102}
1103
Chris Lattner7eac8052010-03-22 18:14:12 +00001104static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001105_mm_loadl_epi64(__m128i const *__p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001106{
Eli Friedman9bb51ad2011-09-15 23:15:27 +00001107 struct __mm_loadl_epi64_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +00001108 long long __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +00001109 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +00001110 return (__m128i) { ((struct __mm_loadl_epi64_struct*)__p)->__u, 0};
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001111}
1112
Chris Lattner7eac8052010-03-22 18:14:12 +00001113static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlssondfa31172009-09-18 17:03:55 +00001114_mm_set_epi64x(long long q1, long long q0)
1115{
1116 return (__m128i){ q0, q1 };
1117}
1118
Chris Lattner7eac8052010-03-22 18:14:12 +00001119static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001120_mm_set_epi64(__m64 q1, __m64 q0)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001121{
1122 return (__m128i){ (long long)q0, (long long)q1 };
1123}
1124
Chris Lattner7eac8052010-03-22 18:14:12 +00001125static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001126_mm_set_epi32(int i3, int i2, int i1, int i0)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001127{
1128 return (__m128i)(__v4si){ i0, i1, i2, i3};
1129}
1130
Chris Lattner7eac8052010-03-22 18:14:12 +00001131static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001132_mm_set_epi16(short w7, short w6, short w5, short w4, short w3, short w2, short w1, short w0)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001133{
1134 return (__m128i)(__v8hi){ w0, w1, w2, w3, w4, w5, w6, w7 };
1135}
1136
Chris Lattner7eac8052010-03-22 18:14:12 +00001137static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001138_mm_set_epi8(char b15, char b14, char b13, char b12, char b11, char b10, char b9, char b8, char b7, char b6, char b5, char b4, char b3, char b2, char b1, char b0)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001139{
1140 return (__m128i)(__v16qi){ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15 };
1141}
1142
Chris Lattner7eac8052010-03-22 18:14:12 +00001143static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001144_mm_set1_epi64x(long long __q)
Anders Carlssondfa31172009-09-18 17:03:55 +00001145{
David Blaikie3302f2b2013-01-16 23:08:36 +00001146 return (__m128i){ __q, __q };
Anders Carlssondfa31172009-09-18 17:03:55 +00001147}
1148
Chris Lattner7eac8052010-03-22 18:14:12 +00001149static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001150_mm_set1_epi64(__m64 __q)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001151{
David Blaikie3302f2b2013-01-16 23:08:36 +00001152 return (__m128i){ (long long)__q, (long long)__q };
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001153}
1154
Chris Lattner7eac8052010-03-22 18:14:12 +00001155static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001156_mm_set1_epi32(int __i)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001157{
David Blaikie3302f2b2013-01-16 23:08:36 +00001158 return (__m128i)(__v4si){ __i, __i, __i, __i };
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001159}
1160
Chris Lattner7eac8052010-03-22 18:14:12 +00001161static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001162_mm_set1_epi16(short __w)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001163{
David Blaikie3302f2b2013-01-16 23:08:36 +00001164 return (__m128i)(__v8hi){ __w, __w, __w, __w, __w, __w, __w, __w };
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001165}
1166
Chris Lattner7eac8052010-03-22 18:14:12 +00001167static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001168_mm_set1_epi8(char __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001169{
David Blaikie3302f2b2013-01-16 23:08:36 +00001170 return (__m128i)(__v16qi){ __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b };
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001171}
1172
Chris Lattner7eac8052010-03-22 18:14:12 +00001173static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001174_mm_setr_epi64(__m64 q0, __m64 q1)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001175{
1176 return (__m128i){ (long long)q0, (long long)q1 };
1177}
1178
Chris Lattner7eac8052010-03-22 18:14:12 +00001179static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001180_mm_setr_epi32(int i0, int i1, int i2, int i3)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001181{
1182 return (__m128i)(__v4si){ i0, i1, i2, i3};
1183}
1184
Chris Lattner7eac8052010-03-22 18:14:12 +00001185static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001186_mm_setr_epi16(short w0, short w1, short w2, short w3, short w4, short w5, short w6, short w7)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001187{
1188 return (__m128i)(__v8hi){ w0, w1, w2, w3, w4, w5, w6, w7 };
1189}
1190
Chris Lattner7eac8052010-03-22 18:14:12 +00001191static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001192_mm_setr_epi8(char b0, char b1, char b2, char b3, char b4, char b5, char b6, char b7, char b8, char b9, char b10, char b11, char b12, char b13, char b14, char b15)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001193{
1194 return (__m128i)(__v16qi){ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15 };
1195}
1196
Chris Lattner7eac8052010-03-22 18:14:12 +00001197static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001198_mm_setzero_si128(void)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001199{
1200 return (__m128i){ 0LL, 0LL };
1201}
1202
Chris Lattner7eac8052010-03-22 18:14:12 +00001203static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001204_mm_store_si128(__m128i *__p, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001205{
David Blaikie3302f2b2013-01-16 23:08:36 +00001206 *__p = __b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001207}
1208
Chris Lattner7eac8052010-03-22 18:14:12 +00001209static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001210_mm_storeu_si128(__m128i *__p, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001211{
David Blaikie3302f2b2013-01-16 23:08:36 +00001212 __builtin_ia32_storedqu((char *)__p, (__v16qi)__b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001213}
1214
Chris Lattner7eac8052010-03-22 18:14:12 +00001215static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001216_mm_maskmoveu_si128(__m128i __d, __m128i __n, char *__p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001217{
David Blaikie3302f2b2013-01-16 23:08:36 +00001218 __builtin_ia32_maskmovdqu((__v16qi)__d, (__v16qi)__n, __p);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001219}
1220
Chris Lattner7eac8052010-03-22 18:14:12 +00001221static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001222_mm_storel_epi64(__m128i *__p, __m128i __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001223{
Chad Rosier87622b82012-05-01 18:11:51 +00001224 struct __mm_storel_epi64_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +00001225 long long __u;
Chad Rosier87622b82012-05-01 18:11:51 +00001226 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +00001227 ((struct __mm_storel_epi64_struct*)__p)->__u = __a[0];
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001228}
1229
Chris Lattner7eac8052010-03-22 18:14:12 +00001230static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001231_mm_stream_pd(double *__p, __m128d __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001232{
David Blaikie3302f2b2013-01-16 23:08:36 +00001233 __builtin_ia32_movntpd(__p, __a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001234}
1235
Chris Lattner7eac8052010-03-22 18:14:12 +00001236static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001237_mm_stream_si128(__m128i *__p, __m128i __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001238{
David Blaikie3302f2b2013-01-16 23:08:36 +00001239 __builtin_ia32_movntdq(__p, __a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001240}
1241
Chris Lattner7eac8052010-03-22 18:14:12 +00001242static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001243_mm_stream_si32(int *__p, int __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001244{
David Blaikie3302f2b2013-01-16 23:08:36 +00001245 __builtin_ia32_movnti(__p, __a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001246}
1247
Eli Friedmanf9d8c6c2013-09-23 23:38:39 +00001248#ifdef __x86_64__
1249static __inline__ void __attribute__((__always_inline__, __nodebug__))
1250_mm_stream_si64(long long *__p, long long __a)
1251{
1252 __builtin_ia32_movnti64(__p, __a);
1253}
1254#endif
1255
Chris Lattner7eac8052010-03-22 18:14:12 +00001256static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001257_mm_clflush(void const *__p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001258{
David Blaikie3302f2b2013-01-16 23:08:36 +00001259 __builtin_ia32_clflush(__p);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001260}
1261
Chris Lattner7eac8052010-03-22 18:14:12 +00001262static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001263_mm_lfence(void)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001264{
1265 __builtin_ia32_lfence();
1266}
1267
Chris Lattner7eac8052010-03-22 18:14:12 +00001268static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001269_mm_mfence(void)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001270{
1271 __builtin_ia32_mfence();
1272}
1273
Chris Lattner7eac8052010-03-22 18:14:12 +00001274static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001275_mm_packs_epi16(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001276{
David Blaikie3302f2b2013-01-16 23:08:36 +00001277 return (__m128i)__builtin_ia32_packsswb128((__v8hi)__a, (__v8hi)__b);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001278}
1279
Chris Lattner7eac8052010-03-22 18:14:12 +00001280static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001281_mm_packs_epi32(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001282{
David Blaikie3302f2b2013-01-16 23:08:36 +00001283 return (__m128i)__builtin_ia32_packssdw128((__v4si)__a, (__v4si)__b);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001284}
1285
Chris Lattner7eac8052010-03-22 18:14:12 +00001286static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001287_mm_packus_epi16(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001288{
David Blaikie3302f2b2013-01-16 23:08:36 +00001289 return (__m128i)__builtin_ia32_packuswb128((__v8hi)__a, (__v8hi)__b);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001290}
1291
Chris Lattner7eac8052010-03-22 18:14:12 +00001292static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001293_mm_extract_epi16(__m128i __a, int __imm)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001294{
David Blaikie3302f2b2013-01-16 23:08:36 +00001295 __v8hi __b = (__v8hi)__a;
Manman Renbe38b9e2013-10-22 19:24:42 +00001296 return (unsigned short)__b[__imm & 7];
Anders Carlsson85eb1242008-12-26 00:45:50 +00001297}
1298
Chris Lattner7eac8052010-03-22 18:14:12 +00001299static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001300_mm_insert_epi16(__m128i __a, int __b, int __imm)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001301{
David Blaikie3302f2b2013-01-16 23:08:36 +00001302 __v8hi __c = (__v8hi)__a;
1303 __c[__imm & 7] = __b;
1304 return (__m128i)__c;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001305}
1306
Chris Lattner7eac8052010-03-22 18:14:12 +00001307static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001308_mm_movemask_epi8(__m128i __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001309{
David Blaikie3302f2b2013-01-16 23:08:36 +00001310 return __builtin_ia32_pmovmskb128((__v16qi)__a);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001311}
1312
Bob Wilsonc9b97cc2011-11-05 06:08:06 +00001313#define _mm_shuffle_epi32(a, imm) __extension__ ({ \
Craig Topper51e47412015-02-13 06:04:43 +00001314 (__m128i)__builtin_shufflevector((__v4si)(__m128i)(a), \
1315 (__v4si)_mm_set1_epi32(0), \
Bob Wilsonc9b97cc2011-11-05 06:08:06 +00001316 (imm) & 0x3, ((imm) & 0xc) >> 2, \
1317 ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6); })
Chris Lattnerf03406f2011-04-25 20:42:40 +00001318
Bob Wilsonc9b97cc2011-11-05 06:08:06 +00001319#define _mm_shufflelo_epi16(a, imm) __extension__ ({ \
Craig Topper51e47412015-02-13 06:04:43 +00001320 (__m128i)__builtin_shufflevector((__v8hi)(__m128i)(a), \
1321 (__v8hi)_mm_set1_epi16(0), \
Bob Wilsonc9b97cc2011-11-05 06:08:06 +00001322 (imm) & 0x3, ((imm) & 0xc) >> 2, \
1323 ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6, \
1324 4, 5, 6, 7); })
Chris Lattnerf03406f2011-04-25 20:42:40 +00001325
Bob Wilsonc9b97cc2011-11-05 06:08:06 +00001326#define _mm_shufflehi_epi16(a, imm) __extension__ ({ \
Craig Topper51e47412015-02-13 06:04:43 +00001327 (__m128i)__builtin_shufflevector((__v8hi)(__m128i)(a), \
1328 (__v8hi)_mm_set1_epi16(0), \
Bob Wilsonc9b97cc2011-11-05 06:08:06 +00001329 0, 1, 2, 3, \
1330 4 + (((imm) & 0x03) >> 0), \
1331 4 + (((imm) & 0x0c) >> 2), \
1332 4 + (((imm) & 0x30) >> 4), \
1333 4 + (((imm) & 0xc0) >> 6)); })
Anders Carlsson85eb1242008-12-26 00:45:50 +00001334
Chris Lattner7eac8052010-03-22 18:14:12 +00001335static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001336_mm_unpackhi_epi8(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001337{
David Blaikie3302f2b2013-01-16 23:08:36 +00001338 return (__m128i)__builtin_shufflevector((__v16qi)__a, (__v16qi)__b, 8, 16+8, 9, 16+9, 10, 16+10, 11, 16+11, 12, 16+12, 13, 16+13, 14, 16+14, 15, 16+15);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001339}
1340
Chris Lattner7eac8052010-03-22 18:14:12 +00001341static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001342_mm_unpackhi_epi16(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001343{
David Blaikie3302f2b2013-01-16 23:08:36 +00001344 return (__m128i)__builtin_shufflevector((__v8hi)__a, (__v8hi)__b, 4, 8+4, 5, 8+5, 6, 8+6, 7, 8+7);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001345}
1346
Chris Lattner7eac8052010-03-22 18:14:12 +00001347static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001348_mm_unpackhi_epi32(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001349{
David Blaikie3302f2b2013-01-16 23:08:36 +00001350 return (__m128i)__builtin_shufflevector((__v4si)__a, (__v4si)__b, 2, 4+2, 3, 4+3);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001351}
1352
Chris Lattner7eac8052010-03-22 18:14:12 +00001353static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001354_mm_unpackhi_epi64(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001355{
David Blaikie3302f2b2013-01-16 23:08:36 +00001356 return (__m128i)__builtin_shufflevector(__a, __b, 1, 2+1);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001357}
1358
Chris Lattner7eac8052010-03-22 18:14:12 +00001359static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001360_mm_unpacklo_epi8(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001361{
David Blaikie3302f2b2013-01-16 23:08:36 +00001362 return (__m128i)__builtin_shufflevector((__v16qi)__a, (__v16qi)__b, 0, 16+0, 1, 16+1, 2, 16+2, 3, 16+3, 4, 16+4, 5, 16+5, 6, 16+6, 7, 16+7);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001363}
1364
Chris Lattner7eac8052010-03-22 18:14:12 +00001365static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001366_mm_unpacklo_epi16(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001367{
David Blaikie3302f2b2013-01-16 23:08:36 +00001368 return (__m128i)__builtin_shufflevector((__v8hi)__a, (__v8hi)__b, 0, 8+0, 1, 8+1, 2, 8+2, 3, 8+3);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001369}
1370
Chris Lattner7eac8052010-03-22 18:14:12 +00001371static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001372_mm_unpacklo_epi32(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001373{
David Blaikie3302f2b2013-01-16 23:08:36 +00001374 return (__m128i)__builtin_shufflevector((__v4si)__a, (__v4si)__b, 0, 4+0, 1, 4+1);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001375}
1376
Chris Lattner7eac8052010-03-22 18:14:12 +00001377static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001378_mm_unpacklo_epi64(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001379{
David Blaikie3302f2b2013-01-16 23:08:36 +00001380 return (__m128i)__builtin_shufflevector(__a, __b, 0, 2+0);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001381}
1382
Chris Lattner7eac8052010-03-22 18:14:12 +00001383static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001384_mm_movepi64_pi64(__m128i __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001385{
David Blaikie3302f2b2013-01-16 23:08:36 +00001386 return (__m64)__a[0];
Anders Carlsson85eb1242008-12-26 00:45:50 +00001387}
1388
Chris Lattner7eac8052010-03-22 18:14:12 +00001389static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Alp Tokerd480b1b2013-11-23 22:11:57 +00001390_mm_movpi64_epi64(__m64 __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001391{
David Blaikie3302f2b2013-01-16 23:08:36 +00001392 return (__m128i){ (long long)__a, 0 };
Anders Carlsson85eb1242008-12-26 00:45:50 +00001393}
1394
Chris Lattner7eac8052010-03-22 18:14:12 +00001395static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001396_mm_move_epi64(__m128i __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001397{
David Blaikie3302f2b2013-01-16 23:08:36 +00001398 return __builtin_shufflevector(__a, (__m128i){ 0 }, 0, 2);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001399}
1400
Chris Lattner7eac8052010-03-22 18:14:12 +00001401static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001402_mm_unpackhi_pd(__m128d __a, __m128d __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001403{
David Blaikie3302f2b2013-01-16 23:08:36 +00001404 return __builtin_shufflevector(__a, __b, 1, 2+1);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001405}
1406
Chris Lattner7eac8052010-03-22 18:14:12 +00001407static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001408_mm_unpacklo_pd(__m128d __a, __m128d __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001409{
David Blaikie3302f2b2013-01-16 23:08:36 +00001410 return __builtin_shufflevector(__a, __b, 0, 2+0);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001411}
1412
Chris Lattner7eac8052010-03-22 18:14:12 +00001413static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001414_mm_movemask_pd(__m128d __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001415{
David Blaikie3302f2b2013-01-16 23:08:36 +00001416 return __builtin_ia32_movmskpd(__a);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001417}
1418
Bob Wilsonc9b97cc2011-11-05 06:08:06 +00001419#define _mm_shuffle_pd(a, b, i) __extension__ ({ \
Craig Topper51e47412015-02-13 06:04:43 +00001420 __builtin_shufflevector((__m128d)(a), (__m128d)(b), \
1421 (i) & 1, (((i) & 2) >> 1) + 2); })
Anders Carlsson85eb1242008-12-26 00:45:50 +00001422
Chris Lattner7eac8052010-03-22 18:14:12 +00001423static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001424_mm_castpd_ps(__m128d __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001425{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001426 return (__m128)__a;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001427}
1428
Chris Lattner7eac8052010-03-22 18:14:12 +00001429static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001430_mm_castpd_si128(__m128d __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001431{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001432 return (__m128i)__a;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001433}
1434
Chris Lattner7eac8052010-03-22 18:14:12 +00001435static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001436_mm_castps_pd(__m128 __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001437{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001438 return (__m128d)__a;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001439}
1440
Chris Lattner7eac8052010-03-22 18:14:12 +00001441static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001442_mm_castps_si128(__m128 __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001443{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001444 return (__m128i)__a;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001445}
1446
Chris Lattner7eac8052010-03-22 18:14:12 +00001447static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001448_mm_castsi128_ps(__m128i __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001449{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001450 return (__m128)__a;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001451}
1452
Chris Lattner7eac8052010-03-22 18:14:12 +00001453static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001454_mm_castsi128_pd(__m128i __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001455{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001456 return (__m128d)__a;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001457}
1458
Chris Lattner7eac8052010-03-22 18:14:12 +00001459static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001460_mm_pause(void)
Anders Carlsson37c23712008-12-26 00:49:43 +00001461{
Anders Carlsson88b53662008-12-26 02:22:10 +00001462 __asm__ volatile ("pause");
Anders Carlsson37c23712008-12-26 00:49:43 +00001463}
1464
Anders Carlsson43c2bab2009-01-21 01:49:39 +00001465#define _MM_SHUFFLE2(x, y) (((x) << 1) | (y))
Anders Carlsson37c23712008-12-26 00:49:43 +00001466
Anders Carlssonf15e71d2008-12-24 01:45:22 +00001467#endif /* __SSE2__ */
1468
1469#endif /* __EMMINTRIN_H */