blob: 56c6c2285546c388f81a9deda2aea226d885bdb5 [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{
David Blaikie3302f2b2013-01-16 23:08:36 +0000158 return (__m128d)__builtin_ia32_cmppd(__a, __b, 0);
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{
David Blaikie3302f2b2013-01-16 23:08:36 +0000164 return (__m128d)__builtin_ia32_cmppd(__a, __b, 1);
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{
David Blaikie3302f2b2013-01-16 23:08:36 +0000170 return (__m128d)__builtin_ia32_cmppd(__a, __b, 2);
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{
David Blaikie3302f2b2013-01-16 23:08:36 +0000176 return (__m128d)__builtin_ia32_cmppd(__b, __a, 1);
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{
David Blaikie3302f2b2013-01-16 23:08:36 +0000182 return (__m128d)__builtin_ia32_cmppd(__b, __a, 2);
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{
David Blaikie3302f2b2013-01-16 23:08:36 +0000188 return (__m128d)__builtin_ia32_cmppd(__a, __b, 7);
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{
David Blaikie3302f2b2013-01-16 23:08:36 +0000194 return (__m128d)__builtin_ia32_cmppd(__a, __b, 3);
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{
David Blaikie3302f2b2013-01-16 23:08:36 +0000200 return (__m128d)__builtin_ia32_cmppd(__a, __b, 4);
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{
David Blaikie3302f2b2013-01-16 23:08:36 +0000206 return (__m128d)__builtin_ia32_cmppd(__a, __b, 5);
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{
David Blaikie3302f2b2013-01-16 23:08:36 +0000212 return (__m128d)__builtin_ia32_cmppd(__a, __b, 6);
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{
David Blaikie3302f2b2013-01-16 23:08:36 +0000218 return (__m128d)__builtin_ia32_cmppd(__b, __a, 5);
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{
David Blaikie3302f2b2013-01-16 23:08:36 +0000224 return (__m128d)__builtin_ia32_cmppd(__b, __a, 6);
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{
David Blaikie3302f2b2013-01-16 23:08:36 +0000230 return (__m128d)__builtin_ia32_cmpsd(__a, __b, 0);
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{
David Blaikie3302f2b2013-01-16 23:08:36 +0000236 return (__m128d)__builtin_ia32_cmpsd(__a, __b, 1);
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{
David Blaikie3302f2b2013-01-16 23:08:36 +0000242 return (__m128d)__builtin_ia32_cmpsd(__a, __b, 2);
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{
David Blaikie3302f2b2013-01-16 23:08:36 +0000248 return (__m128d)__builtin_ia32_cmpsd(__b, __a, 1);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000249}
250
Chris Lattner7eac8052010-03-22 18:14:12 +0000251static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000252_mm_cmpge_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000253{
David Blaikie3302f2b2013-01-16 23:08:36 +0000254 return (__m128d)__builtin_ia32_cmpsd(__b, __a, 2);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000255}
256
Chris Lattner7eac8052010-03-22 18:14:12 +0000257static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000258_mm_cmpord_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000259{
David Blaikie3302f2b2013-01-16 23:08:36 +0000260 return (__m128d)__builtin_ia32_cmpsd(__a, __b, 7);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000261}
262
Chris Lattner7eac8052010-03-22 18:14:12 +0000263static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000264_mm_cmpunord_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000265{
David Blaikie3302f2b2013-01-16 23:08:36 +0000266 return (__m128d)__builtin_ia32_cmpsd(__a, __b, 3);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000267}
268
Chris Lattner7eac8052010-03-22 18:14:12 +0000269static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000270_mm_cmpneq_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000271{
David Blaikie3302f2b2013-01-16 23:08:36 +0000272 return (__m128d)__builtin_ia32_cmpsd(__a, __b, 4);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000273}
274
Chris Lattner7eac8052010-03-22 18:14:12 +0000275static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000276_mm_cmpnlt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000277{
David Blaikie3302f2b2013-01-16 23:08:36 +0000278 return (__m128d)__builtin_ia32_cmpsd(__a, __b, 5);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000279}
280
Chris Lattner7eac8052010-03-22 18:14:12 +0000281static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000282_mm_cmpnle_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000283{
David Blaikie3302f2b2013-01-16 23:08:36 +0000284 return (__m128d)__builtin_ia32_cmpsd(__a, __b, 6);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000285}
286
Chris Lattner7eac8052010-03-22 18:14:12 +0000287static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000288_mm_cmpngt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000289{
David Blaikie3302f2b2013-01-16 23:08:36 +0000290 return (__m128d)__builtin_ia32_cmpsd(__b, __a, 5);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000291}
292
Chris Lattner7eac8052010-03-22 18:14:12 +0000293static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000294_mm_cmpnge_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000295{
David Blaikie3302f2b2013-01-16 23:08:36 +0000296 return (__m128d)__builtin_ia32_cmpsd(__b, __a, 6);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000297}
298
Chris Lattner7eac8052010-03-22 18:14:12 +0000299static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000300_mm_comieq_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000301{
David Blaikie3302f2b2013-01-16 23:08:36 +0000302 return __builtin_ia32_comisdeq(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000303}
304
Chris Lattner7eac8052010-03-22 18:14:12 +0000305static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000306_mm_comilt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000307{
David Blaikie3302f2b2013-01-16 23:08:36 +0000308 return __builtin_ia32_comisdlt(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000309}
310
Chris Lattner7eac8052010-03-22 18:14:12 +0000311static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000312_mm_comile_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000313{
David Blaikie3302f2b2013-01-16 23:08:36 +0000314 return __builtin_ia32_comisdle(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000315}
316
Chris Lattner7eac8052010-03-22 18:14:12 +0000317static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000318_mm_comigt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000319{
David Blaikie3302f2b2013-01-16 23:08:36 +0000320 return __builtin_ia32_comisdgt(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000321}
322
Chris Lattner7eac8052010-03-22 18:14:12 +0000323static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000324_mm_comige_sd(__m128d __a, __m128d __b)
Eli Friedman89c11332011-10-06 20:31:50 +0000325{
David Blaikie3302f2b2013-01-16 23:08:36 +0000326 return __builtin_ia32_comisdge(__a, __b);
Eli Friedman89c11332011-10-06 20:31:50 +0000327}
328
329static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000330_mm_comineq_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000331{
David Blaikie3302f2b2013-01-16 23:08:36 +0000332 return __builtin_ia32_comisdneq(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000333}
334
Chris Lattner7eac8052010-03-22 18:14:12 +0000335static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000336_mm_ucomieq_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000337{
David Blaikie3302f2b2013-01-16 23:08:36 +0000338 return __builtin_ia32_ucomisdeq(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000339}
340
Chris Lattner7eac8052010-03-22 18:14:12 +0000341static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000342_mm_ucomilt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000343{
David Blaikie3302f2b2013-01-16 23:08:36 +0000344 return __builtin_ia32_ucomisdlt(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000345}
346
Chris Lattner7eac8052010-03-22 18:14:12 +0000347static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000348_mm_ucomile_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000349{
David Blaikie3302f2b2013-01-16 23:08:36 +0000350 return __builtin_ia32_ucomisdle(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000351}
352
Chris Lattner7eac8052010-03-22 18:14:12 +0000353static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000354_mm_ucomigt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000355{
David Blaikie3302f2b2013-01-16 23:08:36 +0000356 return __builtin_ia32_ucomisdgt(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000357}
358
Chris Lattner7eac8052010-03-22 18:14:12 +0000359static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000360_mm_ucomige_sd(__m128d __a, __m128d __b)
Eli Friedmanf8cb4802011-08-29 21:26:24 +0000361{
David Blaikie3302f2b2013-01-16 23:08:36 +0000362 return __builtin_ia32_ucomisdge(__a, __b);
Eli Friedmanf8cb4802011-08-29 21:26:24 +0000363}
364
365static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000366_mm_ucomineq_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000367{
David Blaikie3302f2b2013-01-16 23:08:36 +0000368 return __builtin_ia32_ucomisdneq(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000369}
370
Chris Lattner7eac8052010-03-22 18:14:12 +0000371static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000372_mm_cvtpd_ps(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000373{
David Blaikie3302f2b2013-01-16 23:08:36 +0000374 return __builtin_ia32_cvtpd2ps(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000375}
376
Chris Lattner7eac8052010-03-22 18:14:12 +0000377static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000378_mm_cvtps_pd(__m128 __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000379{
David Blaikie3302f2b2013-01-16 23:08:36 +0000380 return __builtin_ia32_cvtps2pd(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000381}
382
Chris Lattner7eac8052010-03-22 18:14:12 +0000383static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000384_mm_cvtepi32_pd(__m128i __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000385{
David Blaikie3302f2b2013-01-16 23:08:36 +0000386 return __builtin_ia32_cvtdq2pd((__v4si)__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000387}
388
Chris Lattner7eac8052010-03-22 18:14:12 +0000389static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000390_mm_cvtpd_epi32(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000391{
David Blaikie3302f2b2013-01-16 23:08:36 +0000392 return __builtin_ia32_cvtpd2dq(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000393}
394
Chris Lattner7eac8052010-03-22 18:14:12 +0000395static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000396_mm_cvtsd_si32(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000397{
David Blaikie3302f2b2013-01-16 23:08:36 +0000398 return __builtin_ia32_cvtsd2si(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000399}
400
Chris Lattner7eac8052010-03-22 18:14:12 +0000401static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000402_mm_cvtsd_ss(__m128 __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000403{
David Blaikie3302f2b2013-01-16 23:08:36 +0000404 __a[0] = __b[0];
405 return __a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000406}
407
Chris Lattner7eac8052010-03-22 18:14:12 +0000408static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000409_mm_cvtsi32_sd(__m128d __a, int __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000410{
David Blaikie3302f2b2013-01-16 23:08:36 +0000411 __a[0] = __b;
412 return __a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000413}
414
Chris Lattner7eac8052010-03-22 18:14:12 +0000415static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000416_mm_cvtss_sd(__m128d __a, __m128 __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000417{
David Blaikie3302f2b2013-01-16 23:08:36 +0000418 __a[0] = __b[0];
419 return __a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000420}
421
Chris Lattner7eac8052010-03-22 18:14:12 +0000422static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000423_mm_cvttpd_epi32(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000424{
David Blaikie3302f2b2013-01-16 23:08:36 +0000425 return (__m128i)__builtin_ia32_cvttpd2dq(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000426}
427
Chris Lattner7eac8052010-03-22 18:14:12 +0000428static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000429_mm_cvttsd_si32(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000430{
David Blaikie3302f2b2013-01-16 23:08:36 +0000431 return __a[0];
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000432}
433
Chris Lattner7eac8052010-03-22 18:14:12 +0000434static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000435_mm_cvtpd_pi32(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000436{
David Blaikie3302f2b2013-01-16 23:08:36 +0000437 return (__m64)__builtin_ia32_cvtpd2pi(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000438}
439
Chris Lattner7eac8052010-03-22 18:14:12 +0000440static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000441_mm_cvttpd_pi32(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000442{
David Blaikie3302f2b2013-01-16 23:08:36 +0000443 return (__m64)__builtin_ia32_cvttpd2pi(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000444}
445
Chris Lattner7eac8052010-03-22 18:14:12 +0000446static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000447_mm_cvtpi32_pd(__m64 __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000448{
David Blaikie3302f2b2013-01-16 23:08:36 +0000449 return __builtin_ia32_cvtpi2pd((__v2si)__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000450}
451
Chris Lattner7eac8052010-03-22 18:14:12 +0000452static __inline__ double __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000453_mm_cvtsd_f64(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000454{
David Blaikie3302f2b2013-01-16 23:08:36 +0000455 return __a[0];
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000456}
457
Chris Lattner7eac8052010-03-22 18:14:12 +0000458static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000459_mm_load_pd(double const *__dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000460{
David Blaikie3302f2b2013-01-16 23:08:36 +0000461 return *(__m128d*)__dp;
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000462}
463
Chris Lattner7eac8052010-03-22 18:14:12 +0000464static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000465_mm_load1_pd(double const *__dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000466{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000467 struct __mm_load1_pd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000468 double __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000469 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000470 double __u = ((struct __mm_load1_pd_struct*)__dp)->__u;
471 return (__m128d){ __u, __u };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000472}
473
Eli Friedmanf83c2582009-06-02 05:55:48 +0000474#define _mm_load_pd1(dp) _mm_load1_pd(dp)
475
Chris Lattner7eac8052010-03-22 18:14:12 +0000476static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000477_mm_loadr_pd(double const *__dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000478{
David Blaikie3302f2b2013-01-16 23:08:36 +0000479 __m128d __u = *(__m128d*)__dp;
480 return __builtin_shufflevector(__u, __u, 1, 0);
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000481}
482
Chris Lattner7eac8052010-03-22 18:14:12 +0000483static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000484_mm_loadu_pd(double const *__dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000485{
Bill Wendling502931f2011-05-13 00:11:39 +0000486 struct __loadu_pd {
David Blaikie3302f2b2013-01-16 23:08:36 +0000487 __m128d __v;
Bill Wendling03e7e432011-05-13 01:24:00 +0000488 } __attribute__((packed, may_alias));
David Blaikie3302f2b2013-01-16 23:08:36 +0000489 return ((struct __loadu_pd*)__dp)->__v;
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000490}
491
Chris Lattner7eac8052010-03-22 18:14:12 +0000492static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000493_mm_load_sd(double const *__dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000494{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000495 struct __mm_load_sd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000496 double __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000497 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000498 double __u = ((struct __mm_load_sd_struct*)__dp)->__u;
499 return (__m128d){ __u, 0 };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000500}
501
Chris Lattner7eac8052010-03-22 18:14:12 +0000502static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000503_mm_loadh_pd(__m128d __a, double const *__dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000504{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000505 struct __mm_loadh_pd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000506 double __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000507 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000508 double __u = ((struct __mm_loadh_pd_struct*)__dp)->__u;
509 return (__m128d){ __a[0], __u };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000510}
511
Chris Lattner7eac8052010-03-22 18:14:12 +0000512static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000513_mm_loadl_pd(__m128d __a, double const *__dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000514{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000515 struct __mm_loadl_pd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000516 double __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000517 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000518 double __u = ((struct __mm_loadl_pd_struct*)__dp)->__u;
519 return (__m128d){ __u, __a[1] };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000520}
521
Chris Lattner7eac8052010-03-22 18:14:12 +0000522static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000523_mm_set_sd(double __w)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000524{
David Blaikie3302f2b2013-01-16 23:08:36 +0000525 return (__m128d){ __w, 0 };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000526}
527
Chris Lattner7eac8052010-03-22 18:14:12 +0000528static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000529_mm_set1_pd(double __w)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000530{
David Blaikie3302f2b2013-01-16 23:08:36 +0000531 return (__m128d){ __w, __w };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000532}
533
Chris Lattner7eac8052010-03-22 18:14:12 +0000534static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000535_mm_set_pd(double __w, double __x)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000536{
David Blaikie3302f2b2013-01-16 23:08:36 +0000537 return (__m128d){ __x, __w };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000538}
539
Chris Lattner7eac8052010-03-22 18:14:12 +0000540static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000541_mm_setr_pd(double __w, double __x)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000542{
David Blaikie3302f2b2013-01-16 23:08:36 +0000543 return (__m128d){ __w, __x };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000544}
545
Chris Lattner7eac8052010-03-22 18:14:12 +0000546static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +0000547_mm_setzero_pd(void)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000548{
549 return (__m128d){ 0, 0 };
550}
551
Chris Lattner7eac8052010-03-22 18:14:12 +0000552static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000553_mm_move_sd(__m128d __a, __m128d __b)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000554{
David Blaikie3302f2b2013-01-16 23:08:36 +0000555 return (__m128d){ __b[0], __a[1] };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000556}
557
Chris Lattner7eac8052010-03-22 18:14:12 +0000558static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000559_mm_store_sd(double *__dp, __m128d __a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000560{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000561 struct __mm_store_sd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000562 double __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000563 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000564 ((struct __mm_store_sd_struct*)__dp)->__u = __a[0];
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000565}
566
Chris Lattner7eac8052010-03-22 18:14:12 +0000567static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000568_mm_store1_pd(double *__dp, __m128d __a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000569{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000570 struct __mm_store1_pd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000571 double __u[2];
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000572 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000573 ((struct __mm_store1_pd_struct*)__dp)->__u[0] = __a[0];
574 ((struct __mm_store1_pd_struct*)__dp)->__u[1] = __a[0];
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000575}
576
Chris Lattner7eac8052010-03-22 18:14:12 +0000577static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000578_mm_store_pd(double *__dp, __m128d __a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000579{
David Blaikie3302f2b2013-01-16 23:08:36 +0000580 *(__m128d *)__dp = __a;
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000581}
582
Chris Lattner7eac8052010-03-22 18:14:12 +0000583static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000584_mm_storeu_pd(double *__dp, __m128d __a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000585{
David Blaikie3302f2b2013-01-16 23:08:36 +0000586 __builtin_ia32_storeupd(__dp, __a);
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000587}
588
Chris Lattner7eac8052010-03-22 18:14:12 +0000589static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000590_mm_storer_pd(double *__dp, __m128d __a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000591{
David Blaikie3302f2b2013-01-16 23:08:36 +0000592 __a = __builtin_shufflevector(__a, __a, 1, 0);
593 *(__m128d *)__dp = __a;
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000594}
595
Chris Lattner7eac8052010-03-22 18:14:12 +0000596static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000597_mm_storeh_pd(double *__dp, __m128d __a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000598{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000599 struct __mm_storeh_pd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000600 double __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000601 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000602 ((struct __mm_storeh_pd_struct*)__dp)->__u = __a[1];
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000603}
604
Chris Lattner7eac8052010-03-22 18:14:12 +0000605static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000606_mm_storel_pd(double *__dp, __m128d __a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000607{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000608 struct __mm_storeh_pd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000609 double __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000610 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000611 ((struct __mm_storeh_pd_struct*)__dp)->__u = __a[0];
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000612}
613
Chris Lattner7eac8052010-03-22 18:14:12 +0000614static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000615_mm_add_epi8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000616{
David Blaikie3302f2b2013-01-16 23:08:36 +0000617 return (__m128i)((__v16qi)__a + (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000618}
619
Chris Lattner7eac8052010-03-22 18:14:12 +0000620static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000621_mm_add_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000622{
David Blaikie3302f2b2013-01-16 23:08:36 +0000623 return (__m128i)((__v8hi)__a + (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000624}
625
Chris Lattner7eac8052010-03-22 18:14:12 +0000626static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000627_mm_add_epi32(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000628{
David Blaikie3302f2b2013-01-16 23:08:36 +0000629 return (__m128i)((__v4si)__a + (__v4si)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000630}
631
Chris Lattner7eac8052010-03-22 18:14:12 +0000632static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000633_mm_add_si64(__m64 __a, __m64 __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000634{
David Blaikie3302f2b2013-01-16 23:08:36 +0000635 return __a + __b;
Anders Carlssona283f912008-12-24 02:41:00 +0000636}
637
Chris Lattner7eac8052010-03-22 18:14:12 +0000638static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000639_mm_add_epi64(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000640{
David Blaikie3302f2b2013-01-16 23:08:36 +0000641 return __a + __b;
Anders Carlssona283f912008-12-24 02:41:00 +0000642}
643
Chris Lattner7eac8052010-03-22 18:14:12 +0000644static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000645_mm_adds_epi8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000646{
David Blaikie3302f2b2013-01-16 23:08:36 +0000647 return (__m128i)__builtin_ia32_paddsb128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000648}
649
Chris Lattner7eac8052010-03-22 18:14:12 +0000650static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000651_mm_adds_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000652{
David Blaikie3302f2b2013-01-16 23:08:36 +0000653 return (__m128i)__builtin_ia32_paddsw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000654}
655
Chris Lattner7eac8052010-03-22 18:14:12 +0000656static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000657_mm_adds_epu8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000658{
David Blaikie3302f2b2013-01-16 23:08:36 +0000659 return (__m128i)__builtin_ia32_paddusb128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000660}
661
Chris Lattner7eac8052010-03-22 18:14:12 +0000662static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000663_mm_adds_epu16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000664{
David Blaikie3302f2b2013-01-16 23:08:36 +0000665 return (__m128i)__builtin_ia32_paddusw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000666}
667
Chris Lattner7eac8052010-03-22 18:14:12 +0000668static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000669_mm_avg_epu8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000670{
David Blaikie3302f2b2013-01-16 23:08:36 +0000671 return (__m128i)__builtin_ia32_pavgb128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000672}
673
Chris Lattner7eac8052010-03-22 18:14:12 +0000674static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000675_mm_avg_epu16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000676{
David Blaikie3302f2b2013-01-16 23:08:36 +0000677 return (__m128i)__builtin_ia32_pavgw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000678}
679
Chris Lattner7eac8052010-03-22 18:14:12 +0000680static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000681_mm_madd_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000682{
David Blaikie3302f2b2013-01-16 23:08:36 +0000683 return (__m128i)__builtin_ia32_pmaddwd128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000684}
685
Chris Lattner7eac8052010-03-22 18:14:12 +0000686static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000687_mm_max_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000688{
David Blaikie3302f2b2013-01-16 23:08:36 +0000689 return (__m128i)__builtin_ia32_pmaxsw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000690}
691
Chris Lattner7eac8052010-03-22 18:14:12 +0000692static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000693_mm_max_epu8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000694{
David Blaikie3302f2b2013-01-16 23:08:36 +0000695 return (__m128i)__builtin_ia32_pmaxub128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000696}
697
Chris Lattner7eac8052010-03-22 18:14:12 +0000698static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000699_mm_min_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000700{
David Blaikie3302f2b2013-01-16 23:08:36 +0000701 return (__m128i)__builtin_ia32_pminsw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000702}
703
Chris Lattner7eac8052010-03-22 18:14:12 +0000704static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000705_mm_min_epu8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000706{
David Blaikie3302f2b2013-01-16 23:08:36 +0000707 return (__m128i)__builtin_ia32_pminub128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000708}
709
Chris Lattner7eac8052010-03-22 18:14:12 +0000710static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000711_mm_mulhi_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000712{
David Blaikie3302f2b2013-01-16 23:08:36 +0000713 return (__m128i)__builtin_ia32_pmulhw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000714}
715
Chris Lattner7eac8052010-03-22 18:14:12 +0000716static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000717_mm_mulhi_epu16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000718{
David Blaikie3302f2b2013-01-16 23:08:36 +0000719 return (__m128i)__builtin_ia32_pmulhuw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000720}
721
Chris Lattner7eac8052010-03-22 18:14:12 +0000722static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000723_mm_mullo_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000724{
David Blaikie3302f2b2013-01-16 23:08:36 +0000725 return (__m128i)((__v8hi)__a * (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000726}
727
Chris Lattner7eac8052010-03-22 18:14:12 +0000728static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000729_mm_mul_su32(__m64 __a, __m64 __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000730{
David Blaikie3302f2b2013-01-16 23:08:36 +0000731 return __builtin_ia32_pmuludq((__v2si)__a, (__v2si)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000732}
733
Chris Lattner7eac8052010-03-22 18:14:12 +0000734static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000735_mm_mul_epu32(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000736{
David Blaikie3302f2b2013-01-16 23:08:36 +0000737 return __builtin_ia32_pmuludq128((__v4si)__a, (__v4si)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000738}
739
Chris Lattner7eac8052010-03-22 18:14:12 +0000740static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000741_mm_sad_epu8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000742{
David Blaikie3302f2b2013-01-16 23:08:36 +0000743 return __builtin_ia32_psadbw128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000744}
745
Chris Lattner7eac8052010-03-22 18:14:12 +0000746static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000747_mm_sub_epi8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000748{
David Blaikie3302f2b2013-01-16 23:08:36 +0000749 return (__m128i)((__v16qi)__a - (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000750}
751
Chris Lattner7eac8052010-03-22 18:14:12 +0000752static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000753_mm_sub_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000754{
David Blaikie3302f2b2013-01-16 23:08:36 +0000755 return (__m128i)((__v8hi)__a - (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000756}
757
Chris Lattner7eac8052010-03-22 18:14:12 +0000758static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000759_mm_sub_epi32(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000760{
David Blaikie3302f2b2013-01-16 23:08:36 +0000761 return (__m128i)((__v4si)__a - (__v4si)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000762}
763
Chris Lattner7eac8052010-03-22 18:14:12 +0000764static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000765_mm_sub_si64(__m64 __a, __m64 __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000766{
David Blaikie3302f2b2013-01-16 23:08:36 +0000767 return __a - __b;
Anders Carlssona283f912008-12-24 02:41:00 +0000768}
769
Chris Lattner7eac8052010-03-22 18:14:12 +0000770static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000771_mm_sub_epi64(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000772{
David Blaikie3302f2b2013-01-16 23:08:36 +0000773 return __a - __b;
Anders Carlssona283f912008-12-24 02:41:00 +0000774}
775
Chris Lattner7eac8052010-03-22 18:14:12 +0000776static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000777_mm_subs_epi8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000778{
David Blaikie3302f2b2013-01-16 23:08:36 +0000779 return (__m128i)__builtin_ia32_psubsb128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000780}
781
Chris Lattner7eac8052010-03-22 18:14:12 +0000782static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000783_mm_subs_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000784{
David Blaikie3302f2b2013-01-16 23:08:36 +0000785 return (__m128i)__builtin_ia32_psubsw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000786}
787
Chris Lattner7eac8052010-03-22 18:14:12 +0000788static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000789_mm_subs_epu8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000790{
David Blaikie3302f2b2013-01-16 23:08:36 +0000791 return (__m128i)__builtin_ia32_psubusb128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000792}
793
Chris Lattner7eac8052010-03-22 18:14:12 +0000794static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000795_mm_subs_epu16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000796{
David Blaikie3302f2b2013-01-16 23:08:36 +0000797 return (__m128i)__builtin_ia32_psubusw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000798}
799
Chris Lattner7eac8052010-03-22 18:14:12 +0000800static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000801_mm_and_si128(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000802{
David Blaikie3302f2b2013-01-16 23:08:36 +0000803 return __a & __b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000804}
805
Chris Lattner7eac8052010-03-22 18:14:12 +0000806static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000807_mm_andnot_si128(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000808{
David Blaikie3302f2b2013-01-16 23:08:36 +0000809 return ~__a & __b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000810}
811
Chris Lattner7eac8052010-03-22 18:14:12 +0000812static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000813_mm_or_si128(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000814{
David Blaikie3302f2b2013-01-16 23:08:36 +0000815 return __a | __b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000816}
817
Chris Lattner7eac8052010-03-22 18:14:12 +0000818static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000819_mm_xor_si128(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000820{
David Blaikie3302f2b2013-01-16 23:08:36 +0000821 return __a ^ __b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000822}
823
Bob Wilsonc9b97cc2011-11-05 06:08:06 +0000824#define _mm_slli_si128(a, count) __extension__ ({ \
825 __m128i __a = (a); \
826 (__m128i)__builtin_ia32_pslldqi128(__a, (count)*8); })
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000827
Chris Lattner7eac8052010-03-22 18:14:12 +0000828static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000829_mm_slli_epi16(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000830{
David Blaikie3302f2b2013-01-16 23:08:36 +0000831 return (__m128i)__builtin_ia32_psllwi128((__v8hi)__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000832}
833
Chris Lattner7eac8052010-03-22 18:14:12 +0000834static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000835_mm_sll_epi16(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000836{
David Blaikie3302f2b2013-01-16 23:08:36 +0000837 return (__m128i)__builtin_ia32_psllw128((__v8hi)__a, (__v8hi)__count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000838}
839
Chris Lattner7eac8052010-03-22 18:14:12 +0000840static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000841_mm_slli_epi32(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000842{
David Blaikie3302f2b2013-01-16 23:08:36 +0000843 return (__m128i)__builtin_ia32_pslldi128((__v4si)__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000844}
845
Chris Lattner7eac8052010-03-22 18:14:12 +0000846static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000847_mm_sll_epi32(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000848{
David Blaikie3302f2b2013-01-16 23:08:36 +0000849 return (__m128i)__builtin_ia32_pslld128((__v4si)__a, (__v4si)__count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000850}
851
Chris Lattner7eac8052010-03-22 18:14:12 +0000852static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000853_mm_slli_epi64(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000854{
David Blaikie3302f2b2013-01-16 23:08:36 +0000855 return __builtin_ia32_psllqi128(__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000856}
857
Chris Lattner7eac8052010-03-22 18:14:12 +0000858static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000859_mm_sll_epi64(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000860{
David Blaikie3302f2b2013-01-16 23:08:36 +0000861 return __builtin_ia32_psllq128(__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000862}
863
Chris Lattner7eac8052010-03-22 18:14:12 +0000864static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000865_mm_srai_epi16(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000866{
David Blaikie3302f2b2013-01-16 23:08:36 +0000867 return (__m128i)__builtin_ia32_psrawi128((__v8hi)__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000868}
869
Chris Lattner7eac8052010-03-22 18:14:12 +0000870static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000871_mm_sra_epi16(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000872{
David Blaikie3302f2b2013-01-16 23:08:36 +0000873 return (__m128i)__builtin_ia32_psraw128((__v8hi)__a, (__v8hi)__count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000874}
875
Chris Lattner7eac8052010-03-22 18:14:12 +0000876static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000877_mm_srai_epi32(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000878{
David Blaikie3302f2b2013-01-16 23:08:36 +0000879 return (__m128i)__builtin_ia32_psradi128((__v4si)__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000880}
881
Chris Lattner7eac8052010-03-22 18:14:12 +0000882static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000883_mm_sra_epi32(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000884{
David Blaikie3302f2b2013-01-16 23:08:36 +0000885 return (__m128i)__builtin_ia32_psrad128((__v4si)__a, (__v4si)__count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000886}
887
Chris Lattner1750cb02010-10-01 06:58:49 +0000888
Bob Wilsonc9b97cc2011-11-05 06:08:06 +0000889#define _mm_srli_si128(a, count) __extension__ ({ \
890 __m128i __a = (a); \
891 (__m128i)__builtin_ia32_psrldqi128(__a, (count)*8); })
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000892
Chris Lattner7eac8052010-03-22 18:14:12 +0000893static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000894_mm_srli_epi16(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000895{
David Blaikie3302f2b2013-01-16 23:08:36 +0000896 return (__m128i)__builtin_ia32_psrlwi128((__v8hi)__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000897}
898
Chris Lattner7eac8052010-03-22 18:14:12 +0000899static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000900_mm_srl_epi16(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000901{
David Blaikie3302f2b2013-01-16 23:08:36 +0000902 return (__m128i)__builtin_ia32_psrlw128((__v8hi)__a, (__v8hi)__count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000903}
904
Chris Lattner7eac8052010-03-22 18:14:12 +0000905static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000906_mm_srli_epi32(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000907{
David Blaikie3302f2b2013-01-16 23:08:36 +0000908 return (__m128i)__builtin_ia32_psrldi128((__v4si)__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000909}
910
Chris Lattner7eac8052010-03-22 18:14:12 +0000911static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000912_mm_srl_epi32(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000913{
David Blaikie3302f2b2013-01-16 23:08:36 +0000914 return (__m128i)__builtin_ia32_psrld128((__v4si)__a, (__v4si)__count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000915}
916
Chris Lattner7eac8052010-03-22 18:14:12 +0000917static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000918_mm_srli_epi64(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000919{
David Blaikie3302f2b2013-01-16 23:08:36 +0000920 return __builtin_ia32_psrlqi128(__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000921}
922
Chris Lattner7eac8052010-03-22 18:14:12 +0000923static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000924_mm_srl_epi64(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000925{
David Blaikie3302f2b2013-01-16 23:08:36 +0000926 return __builtin_ia32_psrlq128(__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000927}
928
Chris Lattner7eac8052010-03-22 18:14:12 +0000929static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000930_mm_cmpeq_epi8(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000931{
David Blaikie3302f2b2013-01-16 23:08:36 +0000932 return (__m128i)((__v16qi)__a == (__v16qi)__b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000933}
934
Chris Lattner7eac8052010-03-22 18:14:12 +0000935static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000936_mm_cmpeq_epi16(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000937{
David Blaikie3302f2b2013-01-16 23:08:36 +0000938 return (__m128i)((__v8hi)__a == (__v8hi)__b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000939}
940
Chris Lattner7eac8052010-03-22 18:14:12 +0000941static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000942_mm_cmpeq_epi32(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000943{
David Blaikie3302f2b2013-01-16 23:08:36 +0000944 return (__m128i)((__v4si)__a == (__v4si)__b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000945}
946
Chris Lattner7eac8052010-03-22 18:14:12 +0000947static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000948_mm_cmpgt_epi8(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000949{
Nick Lewyckyd0ba3792012-02-04 02:16:48 +0000950 /* This function always performs a signed comparison, but __v16qi is a char
951 which may be signed or unsigned. */
Nick Lewycky51a00902012-02-03 23:57:48 +0000952 typedef signed char __v16qs __attribute__((__vector_size__(16)));
David Blaikie3302f2b2013-01-16 23:08:36 +0000953 return (__m128i)((__v16qs)__a > (__v16qs)__b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000954}
955
Chris Lattner7eac8052010-03-22 18:14:12 +0000956static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000957_mm_cmpgt_epi16(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000958{
David Blaikie3302f2b2013-01-16 23:08:36 +0000959 return (__m128i)((__v8hi)__a > (__v8hi)__b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000960}
961
Chris Lattner7eac8052010-03-22 18:14:12 +0000962static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000963_mm_cmpgt_epi32(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000964{
David Blaikie3302f2b2013-01-16 23:08:36 +0000965 return (__m128i)((__v4si)__a > (__v4si)__b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000966}
967
Chris Lattner7eac8052010-03-22 18:14:12 +0000968static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000969_mm_cmplt_epi8(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000970{
David Blaikie3302f2b2013-01-16 23:08:36 +0000971 return _mm_cmpgt_epi8(__b, __a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000972}
973
Chris Lattner7eac8052010-03-22 18:14:12 +0000974static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000975_mm_cmplt_epi16(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000976{
David Blaikie3302f2b2013-01-16 23:08:36 +0000977 return _mm_cmpgt_epi16(__b, __a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000978}
979
Chris Lattner7eac8052010-03-22 18:14:12 +0000980static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000981_mm_cmplt_epi32(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000982{
David Blaikie3302f2b2013-01-16 23:08:36 +0000983 return _mm_cmpgt_epi32(__b, __a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000984}
985
986#ifdef __x86_64__
Chris Lattner7eac8052010-03-22 18:14:12 +0000987static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000988_mm_cvtsi64_sd(__m128d __a, long long __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000989{
David Blaikie3302f2b2013-01-16 23:08:36 +0000990 __a[0] = __b;
991 return __a;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000992}
993
Chris Lattner7eac8052010-03-22 18:14:12 +0000994static __inline__ long long __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000995_mm_cvtsd_si64(__m128d __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000996{
David Blaikie3302f2b2013-01-16 23:08:36 +0000997 return __builtin_ia32_cvtsd2si64(__a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000998}
999
Chris Lattner7eac8052010-03-22 18:14:12 +00001000static __inline__ long long __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001001_mm_cvttsd_si64(__m128d __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001002{
David Blaikie3302f2b2013-01-16 23:08:36 +00001003 return __a[0];
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001004}
1005#endif
1006
Chris Lattner7eac8052010-03-22 18:14:12 +00001007static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001008_mm_cvtepi32_ps(__m128i __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001009{
David Blaikie3302f2b2013-01-16 23:08:36 +00001010 return __builtin_ia32_cvtdq2ps((__v4si)__a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001011}
1012
Chris Lattner7eac8052010-03-22 18:14:12 +00001013static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001014_mm_cvtps_epi32(__m128 __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001015{
David Blaikie3302f2b2013-01-16 23:08:36 +00001016 return (__m128i)__builtin_ia32_cvtps2dq(__a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001017}
1018
Chris Lattner7eac8052010-03-22 18:14:12 +00001019static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001020_mm_cvttps_epi32(__m128 __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001021{
David Blaikie3302f2b2013-01-16 23:08:36 +00001022 return (__m128i)__builtin_ia32_cvttps2dq(__a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001023}
1024
Chris Lattner7eac8052010-03-22 18:14:12 +00001025static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001026_mm_cvtsi32_si128(int __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001027{
David Blaikie3302f2b2013-01-16 23:08:36 +00001028 return (__m128i)(__v4si){ __a, 0, 0, 0 };
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001029}
1030
1031#ifdef __x86_64__
Chris Lattner7eac8052010-03-22 18:14:12 +00001032static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001033_mm_cvtsi64_si128(long long __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001034{
David Blaikie3302f2b2013-01-16 23:08:36 +00001035 return (__m128i){ __a, 0 };
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001036}
1037#endif
1038
Chris Lattner7eac8052010-03-22 18:14:12 +00001039static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001040_mm_cvtsi128_si32(__m128i __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001041{
David Blaikie3302f2b2013-01-16 23:08:36 +00001042 __v4si __b = (__v4si)__a;
1043 return __b[0];
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001044}
1045
1046#ifdef __x86_64__
Chris Lattner7eac8052010-03-22 18:14:12 +00001047static __inline__ long long __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001048_mm_cvtsi128_si64(__m128i __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001049{
David Blaikie3302f2b2013-01-16 23:08:36 +00001050 return __a[0];
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001051}
1052#endif
1053
Chris Lattner7eac8052010-03-22 18:14:12 +00001054static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001055_mm_load_si128(__m128i const *__p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001056{
David Blaikie3302f2b2013-01-16 23:08:36 +00001057 return *__p;
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_loadu_si128(__m128i const *__p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001062{
Bill Wendling502931f2011-05-13 00:11:39 +00001063 struct __loadu_si128 {
David Blaikie3302f2b2013-01-16 23:08:36 +00001064 __m128i __v;
Bill Wendling03e7e432011-05-13 01:24:00 +00001065 } __attribute__((packed, may_alias));
David Blaikie3302f2b2013-01-16 23:08:36 +00001066 return ((struct __loadu_si128*)__p)->__v;
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001067}
1068
Chris Lattner7eac8052010-03-22 18:14:12 +00001069static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001070_mm_loadl_epi64(__m128i const *__p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001071{
Eli Friedman9bb51ad2011-09-15 23:15:27 +00001072 struct __mm_loadl_epi64_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +00001073 long long __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +00001074 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +00001075 return (__m128i) { ((struct __mm_loadl_epi64_struct*)__p)->__u, 0};
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001076}
1077
Chris Lattner7eac8052010-03-22 18:14:12 +00001078static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Anders Carlssondfa31172009-09-18 17:03:55 +00001079_mm_set_epi64x(long long q1, long long q0)
1080{
1081 return (__m128i){ q0, q1 };
1082}
1083
Chris Lattner7eac8052010-03-22 18:14:12 +00001084static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001085_mm_set_epi64(__m64 q1, __m64 q0)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001086{
1087 return (__m128i){ (long long)q0, (long long)q1 };
1088}
1089
Chris Lattner7eac8052010-03-22 18:14:12 +00001090static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001091_mm_set_epi32(int i3, int i2, int i1, int i0)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001092{
1093 return (__m128i)(__v4si){ i0, i1, i2, i3};
1094}
1095
Chris Lattner7eac8052010-03-22 18:14:12 +00001096static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001097_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 +00001098{
1099 return (__m128i)(__v8hi){ w0, w1, w2, w3, w4, w5, w6, w7 };
1100}
1101
Chris Lattner7eac8052010-03-22 18:14:12 +00001102static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001103_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 +00001104{
1105 return (__m128i)(__v16qi){ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15 };
1106}
1107
Chris Lattner7eac8052010-03-22 18:14:12 +00001108static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001109_mm_set1_epi64x(long long __q)
Anders Carlssondfa31172009-09-18 17:03:55 +00001110{
David Blaikie3302f2b2013-01-16 23:08:36 +00001111 return (__m128i){ __q, __q };
Anders Carlssondfa31172009-09-18 17:03:55 +00001112}
1113
Chris Lattner7eac8052010-03-22 18:14:12 +00001114static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001115_mm_set1_epi64(__m64 __q)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001116{
David Blaikie3302f2b2013-01-16 23:08:36 +00001117 return (__m128i){ (long long)__q, (long long)__q };
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001118}
1119
Chris Lattner7eac8052010-03-22 18:14:12 +00001120static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001121_mm_set1_epi32(int __i)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001122{
David Blaikie3302f2b2013-01-16 23:08:36 +00001123 return (__m128i)(__v4si){ __i, __i, __i, __i };
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001124}
1125
Chris Lattner7eac8052010-03-22 18:14:12 +00001126static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001127_mm_set1_epi16(short __w)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001128{
David Blaikie3302f2b2013-01-16 23:08:36 +00001129 return (__m128i)(__v8hi){ __w, __w, __w, __w, __w, __w, __w, __w };
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001130}
1131
Chris Lattner7eac8052010-03-22 18:14:12 +00001132static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001133_mm_set1_epi8(char __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001134{
David Blaikie3302f2b2013-01-16 23:08:36 +00001135 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 +00001136}
1137
Chris Lattner7eac8052010-03-22 18:14:12 +00001138static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001139_mm_setr_epi64(__m64 q0, __m64 q1)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001140{
1141 return (__m128i){ (long long)q0, (long long)q1 };
1142}
1143
Chris Lattner7eac8052010-03-22 18:14:12 +00001144static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001145_mm_setr_epi32(int i0, int i1, int i2, int i3)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001146{
1147 return (__m128i)(__v4si){ i0, i1, i2, i3};
1148}
1149
Chris Lattner7eac8052010-03-22 18:14:12 +00001150static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001151_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 +00001152{
1153 return (__m128i)(__v8hi){ w0, w1, w2, w3, w4, w5, w6, w7 };
1154}
1155
Chris Lattner7eac8052010-03-22 18:14:12 +00001156static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001157_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 +00001158{
1159 return (__m128i)(__v16qi){ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15 };
1160}
1161
Chris Lattner7eac8052010-03-22 18:14:12 +00001162static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001163_mm_setzero_si128(void)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001164{
1165 return (__m128i){ 0LL, 0LL };
1166}
1167
Chris Lattner7eac8052010-03-22 18:14:12 +00001168static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001169_mm_store_si128(__m128i *__p, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001170{
David Blaikie3302f2b2013-01-16 23:08:36 +00001171 *__p = __b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001172}
1173
Chris Lattner7eac8052010-03-22 18:14:12 +00001174static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001175_mm_storeu_si128(__m128i *__p, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001176{
David Blaikie3302f2b2013-01-16 23:08:36 +00001177 __builtin_ia32_storedqu((char *)__p, (__v16qi)__b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001178}
1179
Chris Lattner7eac8052010-03-22 18:14:12 +00001180static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001181_mm_maskmoveu_si128(__m128i __d, __m128i __n, char *__p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001182{
David Blaikie3302f2b2013-01-16 23:08:36 +00001183 __builtin_ia32_maskmovdqu((__v16qi)__d, (__v16qi)__n, __p);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001184}
1185
Chris Lattner7eac8052010-03-22 18:14:12 +00001186static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001187_mm_storel_epi64(__m128i *__p, __m128i __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001188{
Chad Rosier87622b82012-05-01 18:11:51 +00001189 struct __mm_storel_epi64_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +00001190 long long __u;
Chad Rosier87622b82012-05-01 18:11:51 +00001191 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +00001192 ((struct __mm_storel_epi64_struct*)__p)->__u = __a[0];
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001193}
1194
Chris Lattner7eac8052010-03-22 18:14:12 +00001195static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001196_mm_stream_pd(double *__p, __m128d __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001197{
David Blaikie3302f2b2013-01-16 23:08:36 +00001198 __builtin_ia32_movntpd(__p, __a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001199}
1200
Chris Lattner7eac8052010-03-22 18:14:12 +00001201static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001202_mm_stream_si128(__m128i *__p, __m128i __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001203{
David Blaikie3302f2b2013-01-16 23:08:36 +00001204 __builtin_ia32_movntdq(__p, __a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001205}
1206
Chris Lattner7eac8052010-03-22 18:14:12 +00001207static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001208_mm_stream_si32(int *__p, int __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001209{
David Blaikie3302f2b2013-01-16 23:08:36 +00001210 __builtin_ia32_movnti(__p, __a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001211}
1212
Chris Lattner7eac8052010-03-22 18:14:12 +00001213static __inline__ void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001214_mm_clflush(void const *__p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001215{
David Blaikie3302f2b2013-01-16 23:08:36 +00001216 __builtin_ia32_clflush(__p);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001217}
1218
Chris Lattner7eac8052010-03-22 18:14:12 +00001219static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001220_mm_lfence(void)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001221{
1222 __builtin_ia32_lfence();
1223}
1224
Chris Lattner7eac8052010-03-22 18:14:12 +00001225static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001226_mm_mfence(void)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001227{
1228 __builtin_ia32_mfence();
1229}
1230
Chris Lattner7eac8052010-03-22 18:14:12 +00001231static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001232_mm_packs_epi16(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001233{
David Blaikie3302f2b2013-01-16 23:08:36 +00001234 return (__m128i)__builtin_ia32_packsswb128((__v8hi)__a, (__v8hi)__b);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001235}
1236
Chris Lattner7eac8052010-03-22 18:14:12 +00001237static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001238_mm_packs_epi32(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001239{
David Blaikie3302f2b2013-01-16 23:08:36 +00001240 return (__m128i)__builtin_ia32_packssdw128((__v4si)__a, (__v4si)__b);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001241}
1242
Chris Lattner7eac8052010-03-22 18:14:12 +00001243static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001244_mm_packus_epi16(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001245{
David Blaikie3302f2b2013-01-16 23:08:36 +00001246 return (__m128i)__builtin_ia32_packuswb128((__v8hi)__a, (__v8hi)__b);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001247}
1248
Chris Lattner7eac8052010-03-22 18:14:12 +00001249static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001250_mm_extract_epi16(__m128i __a, int __imm)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001251{
David Blaikie3302f2b2013-01-16 23:08:36 +00001252 __v8hi __b = (__v8hi)__a;
1253 return (unsigned short)__b[__imm];
Anders Carlsson85eb1242008-12-26 00:45:50 +00001254}
1255
Chris Lattner7eac8052010-03-22 18:14:12 +00001256static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001257_mm_insert_epi16(__m128i __a, int __b, int __imm)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001258{
David Blaikie3302f2b2013-01-16 23:08:36 +00001259 __v8hi __c = (__v8hi)__a;
1260 __c[__imm & 7] = __b;
1261 return (__m128i)__c;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001262}
1263
Chris Lattner7eac8052010-03-22 18:14:12 +00001264static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001265_mm_movemask_epi8(__m128i __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001266{
David Blaikie3302f2b2013-01-16 23:08:36 +00001267 return __builtin_ia32_pmovmskb128((__v16qi)__a);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001268}
1269
Bob Wilsonc9b97cc2011-11-05 06:08:06 +00001270#define _mm_shuffle_epi32(a, imm) __extension__ ({ \
1271 __m128i __a = (a); \
1272 (__m128i)__builtin_shufflevector((__v4si)__a, (__v4si) _mm_set1_epi32(0), \
1273 (imm) & 0x3, ((imm) & 0xc) >> 2, \
1274 ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6); })
Chris Lattnerf03406f2011-04-25 20:42:40 +00001275
Bob Wilsonc9b97cc2011-11-05 06:08:06 +00001276#define _mm_shufflelo_epi16(a, imm) __extension__ ({ \
1277 __m128i __a = (a); \
1278 (__m128i)__builtin_shufflevector((__v8hi)__a, (__v8hi) _mm_set1_epi16(0), \
1279 (imm) & 0x3, ((imm) & 0xc) >> 2, \
1280 ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6, \
1281 4, 5, 6, 7); })
Chris Lattnerf03406f2011-04-25 20:42:40 +00001282
Bob Wilsonc9b97cc2011-11-05 06:08:06 +00001283#define _mm_shufflehi_epi16(a, imm) __extension__ ({ \
1284 __m128i __a = (a); \
1285 (__m128i)__builtin_shufflevector((__v8hi)__a, (__v8hi) _mm_set1_epi16(0), \
1286 0, 1, 2, 3, \
1287 4 + (((imm) & 0x03) >> 0), \
1288 4 + (((imm) & 0x0c) >> 2), \
1289 4 + (((imm) & 0x30) >> 4), \
1290 4 + (((imm) & 0xc0) >> 6)); })
Anders Carlsson85eb1242008-12-26 00:45:50 +00001291
Chris Lattner7eac8052010-03-22 18:14:12 +00001292static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001293_mm_unpackhi_epi8(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001294{
David Blaikie3302f2b2013-01-16 23:08:36 +00001295 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 +00001296}
1297
Chris Lattner7eac8052010-03-22 18:14:12 +00001298static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001299_mm_unpackhi_epi16(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001300{
David Blaikie3302f2b2013-01-16 23:08:36 +00001301 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 +00001302}
1303
Chris Lattner7eac8052010-03-22 18:14:12 +00001304static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001305_mm_unpackhi_epi32(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001306{
David Blaikie3302f2b2013-01-16 23:08:36 +00001307 return (__m128i)__builtin_shufflevector((__v4si)__a, (__v4si)__b, 2, 4+2, 3, 4+3);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001308}
1309
Chris Lattner7eac8052010-03-22 18:14:12 +00001310static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001311_mm_unpackhi_epi64(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001312{
David Blaikie3302f2b2013-01-16 23:08:36 +00001313 return (__m128i)__builtin_shufflevector(__a, __b, 1, 2+1);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001314}
1315
Chris Lattner7eac8052010-03-22 18:14:12 +00001316static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001317_mm_unpacklo_epi8(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001318{
David Blaikie3302f2b2013-01-16 23:08:36 +00001319 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 +00001320}
1321
Chris Lattner7eac8052010-03-22 18:14:12 +00001322static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001323_mm_unpacklo_epi16(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001324{
David Blaikie3302f2b2013-01-16 23:08:36 +00001325 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 +00001326}
1327
Chris Lattner7eac8052010-03-22 18:14:12 +00001328static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001329_mm_unpacklo_epi32(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001330{
David Blaikie3302f2b2013-01-16 23:08:36 +00001331 return (__m128i)__builtin_shufflevector((__v4si)__a, (__v4si)__b, 0, 4+0, 1, 4+1);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001332}
1333
Chris Lattner7eac8052010-03-22 18:14:12 +00001334static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001335_mm_unpacklo_epi64(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001336{
David Blaikie3302f2b2013-01-16 23:08:36 +00001337 return (__m128i)__builtin_shufflevector(__a, __b, 0, 2+0);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001338}
1339
Chris Lattner7eac8052010-03-22 18:14:12 +00001340static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001341_mm_movepi64_pi64(__m128i __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001342{
David Blaikie3302f2b2013-01-16 23:08:36 +00001343 return (__m64)__a[0];
Anders Carlsson85eb1242008-12-26 00:45:50 +00001344}
1345
Chris Lattner7eac8052010-03-22 18:14:12 +00001346static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001347_mm_movpi64_pi64(__m64 __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001348{
David Blaikie3302f2b2013-01-16 23:08:36 +00001349 return (__m128i){ (long long)__a, 0 };
Anders Carlsson85eb1242008-12-26 00:45:50 +00001350}
1351
Chris Lattner7eac8052010-03-22 18:14:12 +00001352static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001353_mm_move_epi64(__m128i __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001354{
David Blaikie3302f2b2013-01-16 23:08:36 +00001355 return __builtin_shufflevector(__a, (__m128i){ 0 }, 0, 2);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001356}
1357
Chris Lattner7eac8052010-03-22 18:14:12 +00001358static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001359_mm_unpackhi_pd(__m128d __a, __m128d __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001360{
David Blaikie3302f2b2013-01-16 23:08:36 +00001361 return __builtin_shufflevector(__a, __b, 1, 2+1);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001362}
1363
Chris Lattner7eac8052010-03-22 18:14:12 +00001364static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001365_mm_unpacklo_pd(__m128d __a, __m128d __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001366{
David Blaikie3302f2b2013-01-16 23:08:36 +00001367 return __builtin_shufflevector(__a, __b, 0, 2+0);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001368}
1369
Chris Lattner7eac8052010-03-22 18:14:12 +00001370static __inline__ int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001371_mm_movemask_pd(__m128d __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001372{
David Blaikie3302f2b2013-01-16 23:08:36 +00001373 return __builtin_ia32_movmskpd(__a);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001374}
1375
Bob Wilsonc9b97cc2011-11-05 06:08:06 +00001376#define _mm_shuffle_pd(a, b, i) __extension__ ({ \
1377 __m128d __a = (a); \
1378 __m128d __b = (b); \
1379 __builtin_shufflevector(__a, __b, (i) & 1, (((i) & 2) >> 1) + 2); })
Anders Carlsson85eb1242008-12-26 00:45:50 +00001380
Chris Lattner7eac8052010-03-22 18:14:12 +00001381static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001382_mm_castpd_ps(__m128d __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001383{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001384 return (__m128)__a;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001385}
1386
Chris Lattner7eac8052010-03-22 18:14:12 +00001387static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001388_mm_castpd_si128(__m128d __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001389{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001390 return (__m128i)__a;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001391}
1392
Chris Lattner7eac8052010-03-22 18:14:12 +00001393static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001394_mm_castps_pd(__m128 __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001395{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001396 return (__m128d)__a;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001397}
1398
Chris Lattner7eac8052010-03-22 18:14:12 +00001399static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001400_mm_castps_si128(__m128 __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001401{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001402 return (__m128i)__a;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001403}
1404
Chris Lattner7eac8052010-03-22 18:14:12 +00001405static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001406_mm_castsi128_ps(__m128i __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001407{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001408 return (__m128)__a;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001409}
1410
Chris Lattner7eac8052010-03-22 18:14:12 +00001411static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001412_mm_castsi128_pd(__m128i __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001413{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001414 return (__m128d)__a;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001415}
1416
Chris Lattner7eac8052010-03-22 18:14:12 +00001417static __inline__ void __attribute__((__always_inline__, __nodebug__))
Mike Stump5b31ed32009-02-13 14:24:50 +00001418_mm_pause(void)
Anders Carlsson37c23712008-12-26 00:49:43 +00001419{
Anders Carlsson88b53662008-12-26 02:22:10 +00001420 __asm__ volatile ("pause");
Anders Carlsson37c23712008-12-26 00:49:43 +00001421}
1422
Anders Carlsson43c2bab2009-01-21 01:49:39 +00001423#define _MM_SHUFFLE2(x, y) (((x) << 1) | (y))
Anders Carlsson37c23712008-12-26 00:49:43 +00001424
Anders Carlssonf15e71d2008-12-24 01:45:22 +00001425#endif /* __SSE2__ */
1426
1427#endif /* __EMMINTRIN_H */