blob: 5e037340b4db8ab6cd026a73bfbf0d69e862220c [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
Anders Carlssonf15e71d2008-12-24 01:45:22 +000027#include <xmmintrin.h>
28
29typedef double __m128d __attribute__((__vector_size__(16)));
30typedef long long __m128i __attribute__((__vector_size__(16)));
31
Eric Christopher2a9898f2010-08-26 02:09:25 +000032/* Type defines. */
33typedef double __v2df __attribute__ ((__vector_size__ (16)));
34typedef long long __v2di __attribute__ ((__vector_size__ (16)));
Anders Carlssona283f912008-12-24 02:41:00 +000035typedef short __v8hi __attribute__((__vector_size__(16)));
Anders Carlsson327c8df2009-09-18 19:18:19 +000036typedef char __v16qi __attribute__((__vector_size__(16)));
Anders Carlssonf15e71d2008-12-24 01:45:22 +000037
Eric Christopher4d1851682015-06-17 07:09:20 +000038/* Define the default attributes for the functions in this file. */
Michael Kupersteine45af542015-06-30 13:36:19 +000039#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("sse2")))
Eric Christopher4d1851682015-06-17 07:09:20 +000040
Michael Kupersteine45af542015-06-30 13:36:19 +000041static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +000042_mm_add_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000043{
David Blaikie3302f2b2013-01-16 23:08:36 +000044 __a[0] += __b[0];
45 return __a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000046}
47
Michael Kupersteine45af542015-06-30 13:36:19 +000048static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +000049_mm_add_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000050{
David Blaikie3302f2b2013-01-16 23:08:36 +000051 return __a + __b;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000052}
53
Michael Kupersteine45af542015-06-30 13:36:19 +000054static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +000055_mm_sub_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000056{
David Blaikie3302f2b2013-01-16 23:08:36 +000057 __a[0] -= __b[0];
58 return __a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000059}
60
Michael Kupersteine45af542015-06-30 13:36:19 +000061static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +000062_mm_sub_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000063{
David Blaikie3302f2b2013-01-16 23:08:36 +000064 return __a - __b;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000065}
66
Michael Kupersteine45af542015-06-30 13:36:19 +000067static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +000068_mm_mul_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000069{
David Blaikie3302f2b2013-01-16 23:08:36 +000070 __a[0] *= __b[0];
71 return __a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000072}
73
Michael Kupersteine45af542015-06-30 13:36:19 +000074static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +000075_mm_mul_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000076{
David Blaikie3302f2b2013-01-16 23:08:36 +000077 return __a * __b;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000078}
79
Michael Kupersteine45af542015-06-30 13:36:19 +000080static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +000081_mm_div_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000082{
David Blaikie3302f2b2013-01-16 23:08:36 +000083 __a[0] /= __b[0];
84 return __a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000085}
86
Michael Kupersteine45af542015-06-30 13:36:19 +000087static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +000088_mm_div_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000089{
David Blaikie3302f2b2013-01-16 23:08:36 +000090 return __a / __b;
Anders Carlssonf15e71d2008-12-24 01:45:22 +000091}
92
Michael Kupersteine45af542015-06-30 13:36:19 +000093static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +000094_mm_sqrt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +000095{
David Blaikie3302f2b2013-01-16 23:08:36 +000096 __m128d __c = __builtin_ia32_sqrtsd(__b);
97 return (__m128d) { __c[0], __a[1] };
Anders Carlssonf15e71d2008-12-24 01:45:22 +000098}
99
Michael Kupersteine45af542015-06-30 13:36:19 +0000100static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000101_mm_sqrt_pd(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000102{
David Blaikie3302f2b2013-01-16 23:08:36 +0000103 return __builtin_ia32_sqrtpd(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000104}
105
Michael Kupersteine45af542015-06-30 13:36:19 +0000106static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000107_mm_min_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000108{
David Blaikie3302f2b2013-01-16 23:08:36 +0000109 return __builtin_ia32_minsd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000110}
111
Michael Kupersteine45af542015-06-30 13:36:19 +0000112static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000113_mm_min_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000114{
David Blaikie3302f2b2013-01-16 23:08:36 +0000115 return __builtin_ia32_minpd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000116}
117
Michael Kupersteine45af542015-06-30 13:36:19 +0000118static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000119_mm_max_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000120{
David Blaikie3302f2b2013-01-16 23:08:36 +0000121 return __builtin_ia32_maxsd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000122}
123
Michael Kupersteine45af542015-06-30 13:36:19 +0000124static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000125_mm_max_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000126{
David Blaikie3302f2b2013-01-16 23:08:36 +0000127 return __builtin_ia32_maxpd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000128}
129
Michael Kupersteine45af542015-06-30 13:36:19 +0000130static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000131_mm_and_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000132{
David Blaikie3302f2b2013-01-16 23:08:36 +0000133 return (__m128d)((__v4si)__a & (__v4si)__b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000134}
135
Michael Kupersteine45af542015-06-30 13:36:19 +0000136static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000137_mm_andnot_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000138{
David Blaikie3302f2b2013-01-16 23:08:36 +0000139 return (__m128d)(~(__v4si)__a & (__v4si)__b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000140}
141
Michael Kupersteine45af542015-06-30 13:36:19 +0000142static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000143_mm_or_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000144{
David Blaikie3302f2b2013-01-16 23:08:36 +0000145 return (__m128d)((__v4si)__a | (__v4si)__b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000146}
147
Michael Kupersteine45af542015-06-30 13:36:19 +0000148static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000149_mm_xor_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000150{
David Blaikie3302f2b2013-01-16 23:08:36 +0000151 return (__m128d)((__v4si)__a ^ (__v4si)__b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000152}
153
Michael Kupersteine45af542015-06-30 13:36:19 +0000154static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000155_mm_cmpeq_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000156{
Craig Topper2094d8f2014-12-27 06:59:57 +0000157 return (__m128d)__builtin_ia32_cmpeqpd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000158}
159
Michael Kupersteine45af542015-06-30 13:36:19 +0000160static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000161_mm_cmplt_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000162{
Craig Topper2094d8f2014-12-27 06:59:57 +0000163 return (__m128d)__builtin_ia32_cmpltpd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000164}
165
Michael Kupersteine45af542015-06-30 13:36:19 +0000166static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000167_mm_cmple_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000168{
Craig Topper2094d8f2014-12-27 06:59:57 +0000169 return (__m128d)__builtin_ia32_cmplepd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000170}
171
Michael Kupersteine45af542015-06-30 13:36:19 +0000172static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000173_mm_cmpgt_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000174{
Craig Topper2094d8f2014-12-27 06:59:57 +0000175 return (__m128d)__builtin_ia32_cmpltpd(__b, __a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000176}
177
Michael Kupersteine45af542015-06-30 13:36:19 +0000178static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000179_mm_cmpge_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000180{
Craig Topper2094d8f2014-12-27 06:59:57 +0000181 return (__m128d)__builtin_ia32_cmplepd(__b, __a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000182}
183
Michael Kupersteine45af542015-06-30 13:36:19 +0000184static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000185_mm_cmpord_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000186{
Craig Topper2094d8f2014-12-27 06:59:57 +0000187 return (__m128d)__builtin_ia32_cmpordpd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000188}
189
Michael Kupersteine45af542015-06-30 13:36:19 +0000190static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000191_mm_cmpunord_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000192{
Craig Topper2094d8f2014-12-27 06:59:57 +0000193 return (__m128d)__builtin_ia32_cmpunordpd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000194}
195
Michael Kupersteine45af542015-06-30 13:36:19 +0000196static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000197_mm_cmpneq_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000198{
Craig Topper2094d8f2014-12-27 06:59:57 +0000199 return (__m128d)__builtin_ia32_cmpneqpd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000200}
201
Michael Kupersteine45af542015-06-30 13:36:19 +0000202static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000203_mm_cmpnlt_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000204{
Craig Topper2094d8f2014-12-27 06:59:57 +0000205 return (__m128d)__builtin_ia32_cmpnltpd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000206}
207
Michael Kupersteine45af542015-06-30 13:36:19 +0000208static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000209_mm_cmpnle_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000210{
Craig Topper2094d8f2014-12-27 06:59:57 +0000211 return (__m128d)__builtin_ia32_cmpnlepd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000212}
213
Michael Kupersteine45af542015-06-30 13:36:19 +0000214static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000215_mm_cmpngt_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000216{
Craig Topper2094d8f2014-12-27 06:59:57 +0000217 return (__m128d)__builtin_ia32_cmpnltpd(__b, __a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000218}
219
Michael Kupersteine45af542015-06-30 13:36:19 +0000220static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000221_mm_cmpnge_pd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000222{
Craig Topper2094d8f2014-12-27 06:59:57 +0000223 return (__m128d)__builtin_ia32_cmpnlepd(__b, __a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000224}
225
Michael Kupersteine45af542015-06-30 13:36:19 +0000226static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000227_mm_cmpeq_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000228{
Craig Topper2094d8f2014-12-27 06:59:57 +0000229 return (__m128d)__builtin_ia32_cmpeqsd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000230}
231
Michael Kupersteine45af542015-06-30 13:36:19 +0000232static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000233_mm_cmplt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000234{
Craig Topper2094d8f2014-12-27 06:59:57 +0000235 return (__m128d)__builtin_ia32_cmpltsd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000236}
237
Michael Kupersteine45af542015-06-30 13:36:19 +0000238static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000239_mm_cmple_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000240{
Craig Topper2094d8f2014-12-27 06:59:57 +0000241 return (__m128d)__builtin_ia32_cmplesd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000242}
243
Michael Kupersteine45af542015-06-30 13:36:19 +0000244static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000245_mm_cmpgt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000246{
Craig Topper2094d8f2014-12-27 06:59:57 +0000247 __m128d __c = __builtin_ia32_cmpltsd(__b, __a);
Manman Ren9bb34d62013-06-17 19:42:49 +0000248 return (__m128d) { __c[0], __a[1] };
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000249}
250
Michael Kupersteine45af542015-06-30 13:36:19 +0000251static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000252_mm_cmpge_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000253{
Craig Topper2094d8f2014-12-27 06:59:57 +0000254 __m128d __c = __builtin_ia32_cmplesd(__b, __a);
Manman Ren9bb34d62013-06-17 19:42:49 +0000255 return (__m128d) { __c[0], __a[1] };
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000256}
257
Michael Kupersteine45af542015-06-30 13:36:19 +0000258static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000259_mm_cmpord_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000260{
Craig Topper2094d8f2014-12-27 06:59:57 +0000261 return (__m128d)__builtin_ia32_cmpordsd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000262}
263
Michael Kupersteine45af542015-06-30 13:36:19 +0000264static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000265_mm_cmpunord_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000266{
Craig Topper2094d8f2014-12-27 06:59:57 +0000267 return (__m128d)__builtin_ia32_cmpunordsd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000268}
269
Michael Kupersteine45af542015-06-30 13:36:19 +0000270static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000271_mm_cmpneq_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000272{
Craig Topper2094d8f2014-12-27 06:59:57 +0000273 return (__m128d)__builtin_ia32_cmpneqsd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000274}
275
Michael Kupersteine45af542015-06-30 13:36:19 +0000276static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000277_mm_cmpnlt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000278{
Craig Topper2094d8f2014-12-27 06:59:57 +0000279 return (__m128d)__builtin_ia32_cmpnltsd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000280}
281
Michael Kupersteine45af542015-06-30 13:36:19 +0000282static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000283_mm_cmpnle_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000284{
Craig Topper2094d8f2014-12-27 06:59:57 +0000285 return (__m128d)__builtin_ia32_cmpnlesd(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000286}
287
Michael Kupersteine45af542015-06-30 13:36:19 +0000288static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000289_mm_cmpngt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000290{
Craig Topper2094d8f2014-12-27 06:59:57 +0000291 __m128d __c = __builtin_ia32_cmpnltsd(__b, __a);
Manman Ren9bb34d62013-06-17 19:42:49 +0000292 return (__m128d) { __c[0], __a[1] };
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000293}
294
Michael Kupersteine45af542015-06-30 13:36:19 +0000295static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000296_mm_cmpnge_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000297{
Craig Topper2094d8f2014-12-27 06:59:57 +0000298 __m128d __c = __builtin_ia32_cmpnlesd(__b, __a);
Manman Ren9bb34d62013-06-17 19:42:49 +0000299 return (__m128d) { __c[0], __a[1] };
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000300}
301
Michael Kupersteine45af542015-06-30 13:36:19 +0000302static __inline__ int __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000303_mm_comieq_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000304{
David Blaikie3302f2b2013-01-16 23:08:36 +0000305 return __builtin_ia32_comisdeq(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000306}
307
Michael Kupersteine45af542015-06-30 13:36:19 +0000308static __inline__ int __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000309_mm_comilt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000310{
David Blaikie3302f2b2013-01-16 23:08:36 +0000311 return __builtin_ia32_comisdlt(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000312}
313
Michael Kupersteine45af542015-06-30 13:36:19 +0000314static __inline__ int __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000315_mm_comile_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000316{
David Blaikie3302f2b2013-01-16 23:08:36 +0000317 return __builtin_ia32_comisdle(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000318}
319
Michael Kupersteine45af542015-06-30 13:36:19 +0000320static __inline__ int __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000321_mm_comigt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000322{
David Blaikie3302f2b2013-01-16 23:08:36 +0000323 return __builtin_ia32_comisdgt(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000324}
325
Michael Kupersteine45af542015-06-30 13:36:19 +0000326static __inline__ int __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000327_mm_comige_sd(__m128d __a, __m128d __b)
Eli Friedman89c11332011-10-06 20:31:50 +0000328{
David Blaikie3302f2b2013-01-16 23:08:36 +0000329 return __builtin_ia32_comisdge(__a, __b);
Eli Friedman89c11332011-10-06 20:31:50 +0000330}
331
Michael Kupersteine45af542015-06-30 13:36:19 +0000332static __inline__ int __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000333_mm_comineq_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000334{
David Blaikie3302f2b2013-01-16 23:08:36 +0000335 return __builtin_ia32_comisdneq(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000336}
337
Michael Kupersteine45af542015-06-30 13:36:19 +0000338static __inline__ int __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000339_mm_ucomieq_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000340{
David Blaikie3302f2b2013-01-16 23:08:36 +0000341 return __builtin_ia32_ucomisdeq(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000342}
343
Michael Kupersteine45af542015-06-30 13:36:19 +0000344static __inline__ int __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000345_mm_ucomilt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000346{
David Blaikie3302f2b2013-01-16 23:08:36 +0000347 return __builtin_ia32_ucomisdlt(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000348}
349
Michael Kupersteine45af542015-06-30 13:36:19 +0000350static __inline__ int __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000351_mm_ucomile_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000352{
David Blaikie3302f2b2013-01-16 23:08:36 +0000353 return __builtin_ia32_ucomisdle(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000354}
355
Michael Kupersteine45af542015-06-30 13:36:19 +0000356static __inline__ int __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000357_mm_ucomigt_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000358{
David Blaikie3302f2b2013-01-16 23:08:36 +0000359 return __builtin_ia32_ucomisdgt(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000360}
361
Michael Kupersteine45af542015-06-30 13:36:19 +0000362static __inline__ int __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000363_mm_ucomige_sd(__m128d __a, __m128d __b)
Eli Friedmanf8cb4802011-08-29 21:26:24 +0000364{
David Blaikie3302f2b2013-01-16 23:08:36 +0000365 return __builtin_ia32_ucomisdge(__a, __b);
Eli Friedmanf8cb4802011-08-29 21:26:24 +0000366}
367
Michael Kupersteine45af542015-06-30 13:36:19 +0000368static __inline__ int __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000369_mm_ucomineq_sd(__m128d __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000370{
David Blaikie3302f2b2013-01-16 23:08:36 +0000371 return __builtin_ia32_ucomisdneq(__a, __b);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000372}
373
Michael Kupersteine45af542015-06-30 13:36:19 +0000374static __inline__ __m128 __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000375_mm_cvtpd_ps(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000376{
David Blaikie3302f2b2013-01-16 23:08:36 +0000377 return __builtin_ia32_cvtpd2ps(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000378}
379
Michael Kupersteine45af542015-06-30 13:36:19 +0000380static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000381_mm_cvtps_pd(__m128 __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000382{
David Blaikie3302f2b2013-01-16 23:08:36 +0000383 return __builtin_ia32_cvtps2pd(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000384}
385
Michael Kupersteine45af542015-06-30 13:36:19 +0000386static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000387_mm_cvtepi32_pd(__m128i __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000388{
David Blaikie3302f2b2013-01-16 23:08:36 +0000389 return __builtin_ia32_cvtdq2pd((__v4si)__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000390}
391
Michael Kupersteine45af542015-06-30 13:36:19 +0000392static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000393_mm_cvtpd_epi32(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000394{
David Blaikie3302f2b2013-01-16 23:08:36 +0000395 return __builtin_ia32_cvtpd2dq(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000396}
397
Michael Kupersteine45af542015-06-30 13:36:19 +0000398static __inline__ int __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000399_mm_cvtsd_si32(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000400{
David Blaikie3302f2b2013-01-16 23:08:36 +0000401 return __builtin_ia32_cvtsd2si(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000402}
403
Michael Kupersteine45af542015-06-30 13:36:19 +0000404static __inline__ __m128 __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000405_mm_cvtsd_ss(__m128 __a, __m128d __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000406{
David Blaikie3302f2b2013-01-16 23:08:36 +0000407 __a[0] = __b[0];
408 return __a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000409}
410
Michael Kupersteine45af542015-06-30 13:36:19 +0000411static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000412_mm_cvtsi32_sd(__m128d __a, int __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000413{
David Blaikie3302f2b2013-01-16 23:08:36 +0000414 __a[0] = __b;
415 return __a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000416}
417
Michael Kupersteine45af542015-06-30 13:36:19 +0000418static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000419_mm_cvtss_sd(__m128d __a, __m128 __b)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000420{
David Blaikie3302f2b2013-01-16 23:08:36 +0000421 __a[0] = __b[0];
422 return __a;
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000423}
424
Michael Kupersteine45af542015-06-30 13:36:19 +0000425static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000426_mm_cvttpd_epi32(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000427{
David Blaikie3302f2b2013-01-16 23:08:36 +0000428 return (__m128i)__builtin_ia32_cvttpd2dq(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000429}
430
Michael Kupersteine45af542015-06-30 13:36:19 +0000431static __inline__ int __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000432_mm_cvttsd_si32(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000433{
David Blaikie3302f2b2013-01-16 23:08:36 +0000434 return __a[0];
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000435}
436
Michael Kupersteine45af542015-06-30 13:36:19 +0000437static __inline__ __m64 __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000438_mm_cvtpd_pi32(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000439{
David Blaikie3302f2b2013-01-16 23:08:36 +0000440 return (__m64)__builtin_ia32_cvtpd2pi(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000441}
442
Michael Kupersteine45af542015-06-30 13:36:19 +0000443static __inline__ __m64 __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000444_mm_cvttpd_pi32(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000445{
David Blaikie3302f2b2013-01-16 23:08:36 +0000446 return (__m64)__builtin_ia32_cvttpd2pi(__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000447}
448
Michael Kupersteine45af542015-06-30 13:36:19 +0000449static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000450_mm_cvtpi32_pd(__m64 __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000451{
David Blaikie3302f2b2013-01-16 23:08:36 +0000452 return __builtin_ia32_cvtpi2pd((__v2si)__a);
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000453}
454
Michael Kupersteine45af542015-06-30 13:36:19 +0000455static __inline__ double __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000456_mm_cvtsd_f64(__m128d __a)
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000457{
David Blaikie3302f2b2013-01-16 23:08:36 +0000458 return __a[0];
Anders Carlssonf15e71d2008-12-24 01:45:22 +0000459}
460
Michael Kupersteine45af542015-06-30 13:36:19 +0000461static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000462_mm_load_pd(double const *__dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000463{
David Blaikie3302f2b2013-01-16 23:08:36 +0000464 return *(__m128d*)__dp;
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000465}
466
Michael Kupersteine45af542015-06-30 13:36:19 +0000467static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000468_mm_load1_pd(double const *__dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000469{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000470 struct __mm_load1_pd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000471 double __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000472 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000473 double __u = ((struct __mm_load1_pd_struct*)__dp)->__u;
474 return (__m128d){ __u, __u };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000475}
476
Eli Friedmanf83c2582009-06-02 05:55:48 +0000477#define _mm_load_pd1(dp) _mm_load1_pd(dp)
478
Michael Kupersteine45af542015-06-30 13:36:19 +0000479static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000480_mm_loadr_pd(double const *__dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000481{
David Blaikie3302f2b2013-01-16 23:08:36 +0000482 __m128d __u = *(__m128d*)__dp;
483 return __builtin_shufflevector(__u, __u, 1, 0);
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000484}
485
Michael Kupersteine45af542015-06-30 13:36:19 +0000486static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000487_mm_loadu_pd(double const *__dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000488{
Bill Wendling502931f2011-05-13 00:11:39 +0000489 struct __loadu_pd {
David Blaikie3302f2b2013-01-16 23:08:36 +0000490 __m128d __v;
David Majnemer1cf22e62015-02-04 00:26:10 +0000491 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000492 return ((struct __loadu_pd*)__dp)->__v;
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000493}
494
Michael Kupersteine45af542015-06-30 13:36:19 +0000495static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000496_mm_load_sd(double const *__dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000497{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000498 struct __mm_load_sd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000499 double __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000500 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000501 double __u = ((struct __mm_load_sd_struct*)__dp)->__u;
502 return (__m128d){ __u, 0 };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000503}
504
Michael Kupersteine45af542015-06-30 13:36:19 +0000505static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000506_mm_loadh_pd(__m128d __a, double const *__dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000507{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000508 struct __mm_loadh_pd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000509 double __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000510 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000511 double __u = ((struct __mm_loadh_pd_struct*)__dp)->__u;
512 return (__m128d){ __a[0], __u };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000513}
514
Michael Kupersteine45af542015-06-30 13:36:19 +0000515static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000516_mm_loadl_pd(__m128d __a, double const *__dp)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000517{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000518 struct __mm_loadl_pd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000519 double __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000520 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000521 double __u = ((struct __mm_loadl_pd_struct*)__dp)->__u;
522 return (__m128d){ __u, __a[1] };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000523}
524
Michael Kupersteine45af542015-06-30 13:36:19 +0000525static __inline__ __m128d __DEFAULT_FN_ATTRS
Simon Pilgrim5aba9922015-08-26 21:17:12 +0000526_mm_undefined_pd()
527{
528 return (__m128d)__builtin_ia32_undef128();
529}
530
531static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000532_mm_set_sd(double __w)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000533{
David Blaikie3302f2b2013-01-16 23:08:36 +0000534 return (__m128d){ __w, 0 };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000535}
536
Michael Kupersteine45af542015-06-30 13:36:19 +0000537static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000538_mm_set1_pd(double __w)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000539{
David Blaikie3302f2b2013-01-16 23:08:36 +0000540 return (__m128d){ __w, __w };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000541}
542
Michael Kupersteine45af542015-06-30 13:36:19 +0000543static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000544_mm_set_pd(double __w, double __x)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000545{
David Blaikie3302f2b2013-01-16 23:08:36 +0000546 return (__m128d){ __x, __w };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000547}
548
Michael Kupersteine45af542015-06-30 13:36:19 +0000549static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000550_mm_setr_pd(double __w, double __x)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000551{
David Blaikie3302f2b2013-01-16 23:08:36 +0000552 return (__m128d){ __w, __x };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000553}
554
Michael Kupersteine45af542015-06-30 13:36:19 +0000555static __inline__ __m128d __DEFAULT_FN_ATTRS
Mike Stump5b31ed32009-02-13 14:24:50 +0000556_mm_setzero_pd(void)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000557{
558 return (__m128d){ 0, 0 };
559}
560
Michael Kupersteine45af542015-06-30 13:36:19 +0000561static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000562_mm_move_sd(__m128d __a, __m128d __b)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000563{
David Blaikie3302f2b2013-01-16 23:08:36 +0000564 return (__m128d){ __b[0], __a[1] };
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000565}
566
Michael Kupersteine45af542015-06-30 13:36:19 +0000567static __inline__ void __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000568_mm_store_sd(double *__dp, __m128d __a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000569{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000570 struct __mm_store_sd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000571 double __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000572 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000573 ((struct __mm_store_sd_struct*)__dp)->__u = __a[0];
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000574}
575
Michael Kupersteine45af542015-06-30 13:36:19 +0000576static __inline__ void __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000577_mm_store1_pd(double *__dp, __m128d __a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000578{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000579 struct __mm_store1_pd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000580 double __u[2];
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000581 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000582 ((struct __mm_store1_pd_struct*)__dp)->__u[0] = __a[0];
583 ((struct __mm_store1_pd_struct*)__dp)->__u[1] = __a[0];
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000584}
585
Michael Kupersteine45af542015-06-30 13:36:19 +0000586static __inline__ void __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000587_mm_store_pd(double *__dp, __m128d __a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000588{
David Blaikie3302f2b2013-01-16 23:08:36 +0000589 *(__m128d *)__dp = __a;
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000590}
591
Michael Kupersteine45af542015-06-30 13:36:19 +0000592static __inline__ void __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000593_mm_storeu_pd(double *__dp, __m128d __a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000594{
David Blaikie3302f2b2013-01-16 23:08:36 +0000595 __builtin_ia32_storeupd(__dp, __a);
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000596}
597
Michael Kupersteine45af542015-06-30 13:36:19 +0000598static __inline__ void __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000599_mm_storer_pd(double *__dp, __m128d __a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000600{
David Blaikie3302f2b2013-01-16 23:08:36 +0000601 __a = __builtin_shufflevector(__a, __a, 1, 0);
602 *(__m128d *)__dp = __a;
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000603}
604
Michael Kupersteine45af542015-06-30 13:36:19 +0000605static __inline__ void __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000606_mm_storeh_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[1];
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000612}
613
Michael Kupersteine45af542015-06-30 13:36:19 +0000614static __inline__ void __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000615_mm_storel_pd(double *__dp, __m128d __a)
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000616{
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000617 struct __mm_storeh_pd_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +0000618 double __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +0000619 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +0000620 ((struct __mm_storeh_pd_struct*)__dp)->__u = __a[0];
Anders Carlssonb08ac0b2008-12-24 02:11:54 +0000621}
622
Michael Kupersteine45af542015-06-30 13:36:19 +0000623static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000624_mm_add_epi8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000625{
David Blaikie3302f2b2013-01-16 23:08:36 +0000626 return (__m128i)((__v16qi)__a + (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000627}
628
Michael Kupersteine45af542015-06-30 13:36:19 +0000629static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000630_mm_add_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000631{
David Blaikie3302f2b2013-01-16 23:08:36 +0000632 return (__m128i)((__v8hi)__a + (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000633}
634
Michael Kupersteine45af542015-06-30 13:36:19 +0000635static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000636_mm_add_epi32(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000637{
David Blaikie3302f2b2013-01-16 23:08:36 +0000638 return (__m128i)((__v4si)__a + (__v4si)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000639}
640
Michael Kupersteine45af542015-06-30 13:36:19 +0000641static __inline__ __m64 __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000642_mm_add_si64(__m64 __a, __m64 __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000643{
David Blaikie3302f2b2013-01-16 23:08:36 +0000644 return __a + __b;
Anders Carlssona283f912008-12-24 02:41:00 +0000645}
646
Michael Kupersteine45af542015-06-30 13:36:19 +0000647static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000648_mm_add_epi64(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000649{
David Blaikie3302f2b2013-01-16 23:08:36 +0000650 return __a + __b;
Anders Carlssona283f912008-12-24 02:41:00 +0000651}
652
Michael Kupersteine45af542015-06-30 13:36:19 +0000653static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000654_mm_adds_epi8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000655{
David Blaikie3302f2b2013-01-16 23:08:36 +0000656 return (__m128i)__builtin_ia32_paddsb128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000657}
658
Michael Kupersteine45af542015-06-30 13:36:19 +0000659static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000660_mm_adds_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000661{
David Blaikie3302f2b2013-01-16 23:08:36 +0000662 return (__m128i)__builtin_ia32_paddsw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000663}
664
Michael Kupersteine45af542015-06-30 13:36:19 +0000665static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000666_mm_adds_epu8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000667{
David Blaikie3302f2b2013-01-16 23:08:36 +0000668 return (__m128i)__builtin_ia32_paddusb128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000669}
670
Michael Kupersteine45af542015-06-30 13:36:19 +0000671static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000672_mm_adds_epu16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000673{
David Blaikie3302f2b2013-01-16 23:08:36 +0000674 return (__m128i)__builtin_ia32_paddusw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000675}
676
Michael Kupersteine45af542015-06-30 13:36:19 +0000677static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000678_mm_avg_epu8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000679{
David Blaikie3302f2b2013-01-16 23:08:36 +0000680 return (__m128i)__builtin_ia32_pavgb128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000681}
682
Michael Kupersteine45af542015-06-30 13:36:19 +0000683static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000684_mm_avg_epu16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000685{
David Blaikie3302f2b2013-01-16 23:08:36 +0000686 return (__m128i)__builtin_ia32_pavgw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000687}
688
Michael Kupersteine45af542015-06-30 13:36:19 +0000689static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000690_mm_madd_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000691{
David Blaikie3302f2b2013-01-16 23:08:36 +0000692 return (__m128i)__builtin_ia32_pmaddwd128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000693}
694
Michael Kupersteine45af542015-06-30 13:36:19 +0000695static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000696_mm_max_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000697{
David Blaikie3302f2b2013-01-16 23:08:36 +0000698 return (__m128i)__builtin_ia32_pmaxsw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000699}
700
Michael Kupersteine45af542015-06-30 13:36:19 +0000701static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000702_mm_max_epu8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000703{
David Blaikie3302f2b2013-01-16 23:08:36 +0000704 return (__m128i)__builtin_ia32_pmaxub128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000705}
706
Michael Kupersteine45af542015-06-30 13:36:19 +0000707static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000708_mm_min_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000709{
David Blaikie3302f2b2013-01-16 23:08:36 +0000710 return (__m128i)__builtin_ia32_pminsw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000711}
712
Michael Kupersteine45af542015-06-30 13:36:19 +0000713static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000714_mm_min_epu8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000715{
David Blaikie3302f2b2013-01-16 23:08:36 +0000716 return (__m128i)__builtin_ia32_pminub128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000717}
718
Michael Kupersteine45af542015-06-30 13:36:19 +0000719static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000720_mm_mulhi_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000721{
David Blaikie3302f2b2013-01-16 23:08:36 +0000722 return (__m128i)__builtin_ia32_pmulhw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000723}
724
Michael Kupersteine45af542015-06-30 13:36:19 +0000725static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000726_mm_mulhi_epu16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000727{
David Blaikie3302f2b2013-01-16 23:08:36 +0000728 return (__m128i)__builtin_ia32_pmulhuw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000729}
730
Michael Kupersteine45af542015-06-30 13:36:19 +0000731static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000732_mm_mullo_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000733{
David Blaikie3302f2b2013-01-16 23:08:36 +0000734 return (__m128i)((__v8hi)__a * (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000735}
736
Michael Kupersteine45af542015-06-30 13:36:19 +0000737static __inline__ __m64 __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000738_mm_mul_su32(__m64 __a, __m64 __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000739{
David Blaikie3302f2b2013-01-16 23:08:36 +0000740 return __builtin_ia32_pmuludq((__v2si)__a, (__v2si)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000741}
742
Michael Kupersteine45af542015-06-30 13:36:19 +0000743static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000744_mm_mul_epu32(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000745{
David Blaikie3302f2b2013-01-16 23:08:36 +0000746 return __builtin_ia32_pmuludq128((__v4si)__a, (__v4si)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000747}
748
Michael Kupersteine45af542015-06-30 13:36:19 +0000749static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000750_mm_sad_epu8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000751{
David Blaikie3302f2b2013-01-16 23:08:36 +0000752 return __builtin_ia32_psadbw128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000753}
754
Michael Kupersteine45af542015-06-30 13:36:19 +0000755static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000756_mm_sub_epi8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000757{
David Blaikie3302f2b2013-01-16 23:08:36 +0000758 return (__m128i)((__v16qi)__a - (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000759}
760
Michael Kupersteine45af542015-06-30 13:36:19 +0000761static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000762_mm_sub_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000763{
David Blaikie3302f2b2013-01-16 23:08:36 +0000764 return (__m128i)((__v8hi)__a - (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000765}
766
Michael Kupersteine45af542015-06-30 13:36:19 +0000767static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000768_mm_sub_epi32(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000769{
David Blaikie3302f2b2013-01-16 23:08:36 +0000770 return (__m128i)((__v4si)__a - (__v4si)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000771}
772
Michael Kupersteine45af542015-06-30 13:36:19 +0000773static __inline__ __m64 __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000774_mm_sub_si64(__m64 __a, __m64 __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000775{
David Blaikie3302f2b2013-01-16 23:08:36 +0000776 return __a - __b;
Anders Carlssona283f912008-12-24 02:41:00 +0000777}
778
Michael Kupersteine45af542015-06-30 13:36:19 +0000779static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000780_mm_sub_epi64(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000781{
David Blaikie3302f2b2013-01-16 23:08:36 +0000782 return __a - __b;
Anders Carlssona283f912008-12-24 02:41:00 +0000783}
784
Michael Kupersteine45af542015-06-30 13:36:19 +0000785static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000786_mm_subs_epi8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000787{
David Blaikie3302f2b2013-01-16 23:08:36 +0000788 return (__m128i)__builtin_ia32_psubsb128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000789}
790
Michael Kupersteine45af542015-06-30 13:36:19 +0000791static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000792_mm_subs_epi16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000793{
David Blaikie3302f2b2013-01-16 23:08:36 +0000794 return (__m128i)__builtin_ia32_psubsw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000795}
796
Michael Kupersteine45af542015-06-30 13:36:19 +0000797static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000798_mm_subs_epu8(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000799{
David Blaikie3302f2b2013-01-16 23:08:36 +0000800 return (__m128i)__builtin_ia32_psubusb128((__v16qi)__a, (__v16qi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000801}
802
Michael Kupersteine45af542015-06-30 13:36:19 +0000803static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000804_mm_subs_epu16(__m128i __a, __m128i __b)
Anders Carlssona283f912008-12-24 02:41:00 +0000805{
David Blaikie3302f2b2013-01-16 23:08:36 +0000806 return (__m128i)__builtin_ia32_psubusw128((__v8hi)__a, (__v8hi)__b);
Anders Carlssona283f912008-12-24 02:41:00 +0000807}
808
Michael Kupersteine45af542015-06-30 13:36:19 +0000809static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000810_mm_and_si128(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000811{
David Blaikie3302f2b2013-01-16 23:08:36 +0000812 return __a & __b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000813}
814
Michael Kupersteine45af542015-06-30 13:36:19 +0000815static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000816_mm_andnot_si128(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000817{
David Blaikie3302f2b2013-01-16 23:08:36 +0000818 return ~__a & __b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000819}
820
Michael Kupersteine45af542015-06-30 13:36:19 +0000821static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000822_mm_or_si128(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000823{
David Blaikie3302f2b2013-01-16 23:08:36 +0000824 return __a | __b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000825}
826
Michael Kupersteine45af542015-06-30 13:36:19 +0000827static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000828_mm_xor_si128(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000829{
David Blaikie3302f2b2013-01-16 23:08:36 +0000830 return __a ^ __b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000831}
832
Craig Topper51e47412015-02-13 06:04:43 +0000833#define _mm_slli_si128(a, imm) __extension__ ({ \
834 (__m128i)__builtin_shufflevector((__v16qi)_mm_setzero_si128(), \
835 (__v16qi)(__m128i)(a), \
836 ((imm)&0xF0) ? 0 : 16 - ((imm)&0xF), \
837 ((imm)&0xF0) ? 0 : 17 - ((imm)&0xF), \
838 ((imm)&0xF0) ? 0 : 18 - ((imm)&0xF), \
839 ((imm)&0xF0) ? 0 : 19 - ((imm)&0xF), \
840 ((imm)&0xF0) ? 0 : 20 - ((imm)&0xF), \
841 ((imm)&0xF0) ? 0 : 21 - ((imm)&0xF), \
842 ((imm)&0xF0) ? 0 : 22 - ((imm)&0xF), \
843 ((imm)&0xF0) ? 0 : 23 - ((imm)&0xF), \
844 ((imm)&0xF0) ? 0 : 24 - ((imm)&0xF), \
845 ((imm)&0xF0) ? 0 : 25 - ((imm)&0xF), \
846 ((imm)&0xF0) ? 0 : 26 - ((imm)&0xF), \
847 ((imm)&0xF0) ? 0 : 27 - ((imm)&0xF), \
848 ((imm)&0xF0) ? 0 : 28 - ((imm)&0xF), \
849 ((imm)&0xF0) ? 0 : 29 - ((imm)&0xF), \
850 ((imm)&0xF0) ? 0 : 30 - ((imm)&0xF), \
851 ((imm)&0xF0) ? 0 : 31 - ((imm)&0xF)); })
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000852
Craig Toppera4624822015-02-13 06:04:45 +0000853#define _mm_bslli_si128(a, imm) \
854 _mm_slli_si128((a), (imm))
855
Michael Kupersteine45af542015-06-30 13:36:19 +0000856static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000857_mm_slli_epi16(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000858{
David Blaikie3302f2b2013-01-16 23:08:36 +0000859 return (__m128i)__builtin_ia32_psllwi128((__v8hi)__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000860}
861
Michael Kupersteine45af542015-06-30 13:36:19 +0000862static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000863_mm_sll_epi16(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000864{
David Blaikie3302f2b2013-01-16 23:08:36 +0000865 return (__m128i)__builtin_ia32_psllw128((__v8hi)__a, (__v8hi)__count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000866}
867
Michael Kupersteine45af542015-06-30 13:36:19 +0000868static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000869_mm_slli_epi32(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000870{
David Blaikie3302f2b2013-01-16 23:08:36 +0000871 return (__m128i)__builtin_ia32_pslldi128((__v4si)__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000872}
873
Michael Kupersteine45af542015-06-30 13:36:19 +0000874static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000875_mm_sll_epi32(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000876{
David Blaikie3302f2b2013-01-16 23:08:36 +0000877 return (__m128i)__builtin_ia32_pslld128((__v4si)__a, (__v4si)__count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000878}
879
Michael Kupersteine45af542015-06-30 13:36:19 +0000880static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000881_mm_slli_epi64(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000882{
David Blaikie3302f2b2013-01-16 23:08:36 +0000883 return __builtin_ia32_psllqi128(__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000884}
885
Michael Kupersteine45af542015-06-30 13:36:19 +0000886static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000887_mm_sll_epi64(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000888{
David Blaikie3302f2b2013-01-16 23:08:36 +0000889 return __builtin_ia32_psllq128(__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000890}
891
Michael Kupersteine45af542015-06-30 13:36:19 +0000892static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000893_mm_srai_epi16(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000894{
David Blaikie3302f2b2013-01-16 23:08:36 +0000895 return (__m128i)__builtin_ia32_psrawi128((__v8hi)__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000896}
897
Michael Kupersteine45af542015-06-30 13:36:19 +0000898static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000899_mm_sra_epi16(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000900{
David Blaikie3302f2b2013-01-16 23:08:36 +0000901 return (__m128i)__builtin_ia32_psraw128((__v8hi)__a, (__v8hi)__count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000902}
903
Michael Kupersteine45af542015-06-30 13:36:19 +0000904static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000905_mm_srai_epi32(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000906{
David Blaikie3302f2b2013-01-16 23:08:36 +0000907 return (__m128i)__builtin_ia32_psradi128((__v4si)__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000908}
909
Michael Kupersteine45af542015-06-30 13:36:19 +0000910static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000911_mm_sra_epi32(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000912{
David Blaikie3302f2b2013-01-16 23:08:36 +0000913 return (__m128i)__builtin_ia32_psrad128((__v4si)__a, (__v4si)__count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000914}
915
Craig Topper51e47412015-02-13 06:04:43 +0000916#define _mm_srli_si128(a, imm) __extension__ ({ \
917 (__m128i)__builtin_shufflevector((__v16qi)(__m128i)(a), \
918 (__v16qi)_mm_setzero_si128(), \
919 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 0, \
920 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 1, \
921 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 2, \
922 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 3, \
923 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 4, \
924 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 5, \
925 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 6, \
926 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 7, \
927 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 8, \
928 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 9, \
929 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 10, \
930 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 11, \
931 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 12, \
932 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 13, \
933 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 14, \
934 ((imm)&0xF0) ? 16 : ((imm)&0xF) + 15); })
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000935
Craig Toppera4624822015-02-13 06:04:45 +0000936#define _mm_bsrli_si128(a, imm) \
937 _mm_srli_si128((a), (imm))
938
Michael Kupersteine45af542015-06-30 13:36:19 +0000939static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000940_mm_srli_epi16(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000941{
David Blaikie3302f2b2013-01-16 23:08:36 +0000942 return (__m128i)__builtin_ia32_psrlwi128((__v8hi)__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000943}
944
Michael Kupersteine45af542015-06-30 13:36:19 +0000945static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000946_mm_srl_epi16(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000947{
David Blaikie3302f2b2013-01-16 23:08:36 +0000948 return (__m128i)__builtin_ia32_psrlw128((__v8hi)__a, (__v8hi)__count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000949}
950
Michael Kupersteine45af542015-06-30 13:36:19 +0000951static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000952_mm_srli_epi32(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000953{
David Blaikie3302f2b2013-01-16 23:08:36 +0000954 return (__m128i)__builtin_ia32_psrldi128((__v4si)__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000955}
956
Michael Kupersteine45af542015-06-30 13:36:19 +0000957static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000958_mm_srl_epi32(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000959{
David Blaikie3302f2b2013-01-16 23:08:36 +0000960 return (__m128i)__builtin_ia32_psrld128((__v4si)__a, (__v4si)__count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000961}
962
Michael Kupersteine45af542015-06-30 13:36:19 +0000963static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000964_mm_srli_epi64(__m128i __a, int __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000965{
David Blaikie3302f2b2013-01-16 23:08:36 +0000966 return __builtin_ia32_psrlqi128(__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000967}
968
Michael Kupersteine45af542015-06-30 13:36:19 +0000969static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000970_mm_srl_epi64(__m128i __a, __m128i __count)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000971{
David Blaikie3302f2b2013-01-16 23:08:36 +0000972 return __builtin_ia32_psrlq128(__a, __count);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000973}
974
Michael Kupersteine45af542015-06-30 13:36:19 +0000975static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000976_mm_cmpeq_epi8(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000977{
David Blaikie3302f2b2013-01-16 23:08:36 +0000978 return (__m128i)((__v16qi)__a == (__v16qi)__b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000979}
980
Michael Kupersteine45af542015-06-30 13:36:19 +0000981static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000982_mm_cmpeq_epi16(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000983{
David Blaikie3302f2b2013-01-16 23:08:36 +0000984 return (__m128i)((__v8hi)__a == (__v8hi)__b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000985}
986
Michael Kupersteine45af542015-06-30 13:36:19 +0000987static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000988_mm_cmpeq_epi32(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000989{
David Blaikie3302f2b2013-01-16 23:08:36 +0000990 return (__m128i)((__v4si)__a == (__v4si)__b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000991}
992
Michael Kupersteine45af542015-06-30 13:36:19 +0000993static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +0000994_mm_cmpgt_epi8(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +0000995{
Nick Lewyckyd0ba3792012-02-04 02:16:48 +0000996 /* This function always performs a signed comparison, but __v16qi is a char
997 which may be signed or unsigned. */
Nick Lewycky51a00902012-02-03 23:57:48 +0000998 typedef signed char __v16qs __attribute__((__vector_size__(16)));
David Blaikie3302f2b2013-01-16 23:08:36 +0000999 return (__m128i)((__v16qs)__a > (__v16qs)__b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001000}
1001
Michael Kupersteine45af542015-06-30 13:36:19 +00001002static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001003_mm_cmpgt_epi16(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001004{
David Blaikie3302f2b2013-01-16 23:08:36 +00001005 return (__m128i)((__v8hi)__a > (__v8hi)__b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001006}
1007
Michael Kupersteine45af542015-06-30 13:36:19 +00001008static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001009_mm_cmpgt_epi32(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001010{
David Blaikie3302f2b2013-01-16 23:08:36 +00001011 return (__m128i)((__v4si)__a > (__v4si)__b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001012}
1013
Michael Kupersteine45af542015-06-30 13:36:19 +00001014static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001015_mm_cmplt_epi8(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001016{
David Blaikie3302f2b2013-01-16 23:08:36 +00001017 return _mm_cmpgt_epi8(__b, __a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001018}
1019
Michael Kupersteine45af542015-06-30 13:36:19 +00001020static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001021_mm_cmplt_epi16(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001022{
David Blaikie3302f2b2013-01-16 23:08:36 +00001023 return _mm_cmpgt_epi16(__b, __a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001024}
1025
Michael Kupersteine45af542015-06-30 13:36:19 +00001026static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001027_mm_cmplt_epi32(__m128i __a, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001028{
David Blaikie3302f2b2013-01-16 23:08:36 +00001029 return _mm_cmpgt_epi32(__b, __a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001030}
1031
1032#ifdef __x86_64__
Michael Kupersteine45af542015-06-30 13:36:19 +00001033static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001034_mm_cvtsi64_sd(__m128d __a, long long __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001035{
David Blaikie3302f2b2013-01-16 23:08:36 +00001036 __a[0] = __b;
1037 return __a;
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001038}
1039
Michael Kupersteine45af542015-06-30 13:36:19 +00001040static __inline__ long long __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001041_mm_cvtsd_si64(__m128d __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001042{
David Blaikie3302f2b2013-01-16 23:08:36 +00001043 return __builtin_ia32_cvtsd2si64(__a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001044}
1045
Michael Kupersteine45af542015-06-30 13:36:19 +00001046static __inline__ long long __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001047_mm_cvttsd_si64(__m128d __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001048{
David Blaikie3302f2b2013-01-16 23:08:36 +00001049 return __a[0];
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001050}
1051#endif
1052
Michael Kupersteine45af542015-06-30 13:36:19 +00001053static __inline__ __m128 __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001054_mm_cvtepi32_ps(__m128i __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001055{
David Blaikie3302f2b2013-01-16 23:08:36 +00001056 return __builtin_ia32_cvtdq2ps((__v4si)__a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001057}
1058
Michael Kupersteine45af542015-06-30 13:36:19 +00001059static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001060_mm_cvtps_epi32(__m128 __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001061{
David Blaikie3302f2b2013-01-16 23:08:36 +00001062 return (__m128i)__builtin_ia32_cvtps2dq(__a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001063}
1064
Michael Kupersteine45af542015-06-30 13:36:19 +00001065static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001066_mm_cvttps_epi32(__m128 __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001067{
David Blaikie3302f2b2013-01-16 23:08:36 +00001068 return (__m128i)__builtin_ia32_cvttps2dq(__a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001069}
1070
Michael Kupersteine45af542015-06-30 13:36:19 +00001071static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001072_mm_cvtsi32_si128(int __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001073{
David Blaikie3302f2b2013-01-16 23:08:36 +00001074 return (__m128i)(__v4si){ __a, 0, 0, 0 };
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001075}
1076
1077#ifdef __x86_64__
Michael Kupersteine45af542015-06-30 13:36:19 +00001078static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001079_mm_cvtsi64_si128(long long __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001080{
David Blaikie3302f2b2013-01-16 23:08:36 +00001081 return (__m128i){ __a, 0 };
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001082}
1083#endif
1084
Michael Kupersteine45af542015-06-30 13:36:19 +00001085static __inline__ int __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001086_mm_cvtsi128_si32(__m128i __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001087{
David Blaikie3302f2b2013-01-16 23:08:36 +00001088 __v4si __b = (__v4si)__a;
1089 return __b[0];
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001090}
1091
1092#ifdef __x86_64__
Michael Kupersteine45af542015-06-30 13:36:19 +00001093static __inline__ long long __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001094_mm_cvtsi128_si64(__m128i __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001095{
David Blaikie3302f2b2013-01-16 23:08:36 +00001096 return __a[0];
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001097}
1098#endif
1099
Michael Kupersteine45af542015-06-30 13:36:19 +00001100static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001101_mm_load_si128(__m128i const *__p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001102{
David Blaikie3302f2b2013-01-16 23:08:36 +00001103 return *__p;
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001104}
1105
Michael Kupersteine45af542015-06-30 13:36:19 +00001106static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001107_mm_loadu_si128(__m128i const *__p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001108{
Bill Wendling502931f2011-05-13 00:11:39 +00001109 struct __loadu_si128 {
David Blaikie3302f2b2013-01-16 23:08:36 +00001110 __m128i __v;
David Majnemer1cf22e62015-02-04 00:26:10 +00001111 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +00001112 return ((struct __loadu_si128*)__p)->__v;
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001113}
1114
Michael Kupersteine45af542015-06-30 13:36:19 +00001115static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001116_mm_loadl_epi64(__m128i const *__p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001117{
Eli Friedman9bb51ad2011-09-15 23:15:27 +00001118 struct __mm_loadl_epi64_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +00001119 long long __u;
Eli Friedman9bb51ad2011-09-15 23:15:27 +00001120 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +00001121 return (__m128i) { ((struct __mm_loadl_epi64_struct*)__p)->__u, 0};
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001122}
1123
Michael Kupersteine45af542015-06-30 13:36:19 +00001124static __inline__ __m128i __DEFAULT_FN_ATTRS
Simon Pilgrim5aba9922015-08-26 21:17:12 +00001125_mm_undefined_si128()
1126{
1127 return (__m128i)__builtin_ia32_undef128();
1128}
1129
1130static __inline__ __m128i __DEFAULT_FN_ATTRS
Anders Carlssondfa31172009-09-18 17:03:55 +00001131_mm_set_epi64x(long long q1, long long q0)
1132{
1133 return (__m128i){ q0, q1 };
1134}
1135
Michael Kupersteine45af542015-06-30 13:36:19 +00001136static __inline__ __m128i __DEFAULT_FN_ATTRS
Mike Stump5b31ed32009-02-13 14:24:50 +00001137_mm_set_epi64(__m64 q1, __m64 q0)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001138{
1139 return (__m128i){ (long long)q0, (long long)q1 };
1140}
1141
Michael Kupersteine45af542015-06-30 13:36:19 +00001142static __inline__ __m128i __DEFAULT_FN_ATTRS
Mike Stump5b31ed32009-02-13 14:24:50 +00001143_mm_set_epi32(int i3, int i2, int i1, int i0)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001144{
1145 return (__m128i)(__v4si){ i0, i1, i2, i3};
1146}
1147
Michael Kupersteine45af542015-06-30 13:36:19 +00001148static __inline__ __m128i __DEFAULT_FN_ATTRS
Mike Stump5b31ed32009-02-13 14:24:50 +00001149_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 +00001150{
1151 return (__m128i)(__v8hi){ w0, w1, w2, w3, w4, w5, w6, w7 };
1152}
1153
Michael Kupersteine45af542015-06-30 13:36:19 +00001154static __inline__ __m128i __DEFAULT_FN_ATTRS
Mike Stump5b31ed32009-02-13 14:24:50 +00001155_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 +00001156{
1157 return (__m128i)(__v16qi){ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15 };
1158}
1159
Michael Kupersteine45af542015-06-30 13:36:19 +00001160static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001161_mm_set1_epi64x(long long __q)
Anders Carlssondfa31172009-09-18 17:03:55 +00001162{
David Blaikie3302f2b2013-01-16 23:08:36 +00001163 return (__m128i){ __q, __q };
Anders Carlssondfa31172009-09-18 17:03:55 +00001164}
1165
Michael Kupersteine45af542015-06-30 13:36:19 +00001166static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001167_mm_set1_epi64(__m64 __q)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001168{
David Blaikie3302f2b2013-01-16 23:08:36 +00001169 return (__m128i){ (long long)__q, (long long)__q };
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001170}
1171
Michael Kupersteine45af542015-06-30 13:36:19 +00001172static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001173_mm_set1_epi32(int __i)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001174{
David Blaikie3302f2b2013-01-16 23:08:36 +00001175 return (__m128i)(__v4si){ __i, __i, __i, __i };
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001176}
1177
Michael Kupersteine45af542015-06-30 13:36:19 +00001178static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001179_mm_set1_epi16(short __w)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001180{
David Blaikie3302f2b2013-01-16 23:08:36 +00001181 return (__m128i)(__v8hi){ __w, __w, __w, __w, __w, __w, __w, __w };
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001182}
1183
Michael Kupersteine45af542015-06-30 13:36:19 +00001184static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001185_mm_set1_epi8(char __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001186{
David Blaikie3302f2b2013-01-16 23:08:36 +00001187 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 +00001188}
1189
Michael Kupersteine45af542015-06-30 13:36:19 +00001190static __inline__ __m128i __DEFAULT_FN_ATTRS
Mike Stump5b31ed32009-02-13 14:24:50 +00001191_mm_setr_epi64(__m64 q0, __m64 q1)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001192{
1193 return (__m128i){ (long long)q0, (long long)q1 };
1194}
1195
Michael Kupersteine45af542015-06-30 13:36:19 +00001196static __inline__ __m128i __DEFAULT_FN_ATTRS
Mike Stump5b31ed32009-02-13 14:24:50 +00001197_mm_setr_epi32(int i0, int i1, int i2, int i3)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001198{
1199 return (__m128i)(__v4si){ i0, i1, i2, i3};
1200}
1201
Michael Kupersteine45af542015-06-30 13:36:19 +00001202static __inline__ __m128i __DEFAULT_FN_ATTRS
Mike Stump5b31ed32009-02-13 14:24:50 +00001203_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 +00001204{
1205 return (__m128i)(__v8hi){ w0, w1, w2, w3, w4, w5, w6, w7 };
1206}
1207
Michael Kupersteine45af542015-06-30 13:36:19 +00001208static __inline__ __m128i __DEFAULT_FN_ATTRS
Mike Stump5b31ed32009-02-13 14:24:50 +00001209_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 +00001210{
1211 return (__m128i)(__v16qi){ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15 };
1212}
1213
Michael Kupersteine45af542015-06-30 13:36:19 +00001214static __inline__ __m128i __DEFAULT_FN_ATTRS
Mike Stump5b31ed32009-02-13 14:24:50 +00001215_mm_setzero_si128(void)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001216{
1217 return (__m128i){ 0LL, 0LL };
1218}
1219
Michael Kupersteine45af542015-06-30 13:36:19 +00001220static __inline__ void __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001221_mm_store_si128(__m128i *__p, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001222{
David Blaikie3302f2b2013-01-16 23:08:36 +00001223 *__p = __b;
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001224}
1225
Michael Kupersteine45af542015-06-30 13:36:19 +00001226static __inline__ void __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001227_mm_storeu_si128(__m128i *__p, __m128i __b)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001228{
David Blaikie3302f2b2013-01-16 23:08:36 +00001229 __builtin_ia32_storedqu((char *)__p, (__v16qi)__b);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001230}
1231
Michael Kupersteine45af542015-06-30 13:36:19 +00001232static __inline__ void __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001233_mm_maskmoveu_si128(__m128i __d, __m128i __n, char *__p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001234{
David Blaikie3302f2b2013-01-16 23:08:36 +00001235 __builtin_ia32_maskmovdqu((__v16qi)__d, (__v16qi)__n, __p);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001236}
1237
Michael Kupersteine45af542015-06-30 13:36:19 +00001238static __inline__ void __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001239_mm_storel_epi64(__m128i *__p, __m128i __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001240{
Chad Rosier87622b82012-05-01 18:11:51 +00001241 struct __mm_storel_epi64_struct {
David Blaikie3302f2b2013-01-16 23:08:36 +00001242 long long __u;
Chad Rosier87622b82012-05-01 18:11:51 +00001243 } __attribute__((__packed__, __may_alias__));
David Blaikie3302f2b2013-01-16 23:08:36 +00001244 ((struct __mm_storel_epi64_struct*)__p)->__u = __a[0];
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001245}
1246
Michael Kupersteine45af542015-06-30 13:36:19 +00001247static __inline__ void __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001248_mm_stream_pd(double *__p, __m128d __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001249{
David Blaikie3302f2b2013-01-16 23:08:36 +00001250 __builtin_ia32_movntpd(__p, __a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001251}
1252
Michael Kupersteine45af542015-06-30 13:36:19 +00001253static __inline__ void __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001254_mm_stream_si128(__m128i *__p, __m128i __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001255{
David Blaikie3302f2b2013-01-16 23:08:36 +00001256 __builtin_ia32_movntdq(__p, __a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001257}
1258
Michael Kupersteine45af542015-06-30 13:36:19 +00001259static __inline__ void __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001260_mm_stream_si32(int *__p, int __a)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001261{
David Blaikie3302f2b2013-01-16 23:08:36 +00001262 __builtin_ia32_movnti(__p, __a);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001263}
1264
Eli Friedmanf9d8c6c2013-09-23 23:38:39 +00001265#ifdef __x86_64__
Michael Kupersteine45af542015-06-30 13:36:19 +00001266static __inline__ void __DEFAULT_FN_ATTRS
Eli Friedmanf9d8c6c2013-09-23 23:38:39 +00001267_mm_stream_si64(long long *__p, long long __a)
1268{
1269 __builtin_ia32_movnti64(__p, __a);
1270}
1271#endif
1272
Michael Kupersteine45af542015-06-30 13:36:19 +00001273static __inline__ void __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001274_mm_clflush(void const *__p)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001275{
David Blaikie3302f2b2013-01-16 23:08:36 +00001276 __builtin_ia32_clflush(__p);
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001277}
1278
Michael Kupersteine45af542015-06-30 13:36:19 +00001279static __inline__ void __DEFAULT_FN_ATTRS
Mike Stump5b31ed32009-02-13 14:24:50 +00001280_mm_lfence(void)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001281{
1282 __builtin_ia32_lfence();
1283}
1284
Michael Kupersteine45af542015-06-30 13:36:19 +00001285static __inline__ void __DEFAULT_FN_ATTRS
Mike Stump5b31ed32009-02-13 14:24:50 +00001286_mm_mfence(void)
Anders Carlssona0d5ca22008-12-25 23:48:58 +00001287{
1288 __builtin_ia32_mfence();
1289}
1290
Michael Kupersteine45af542015-06-30 13:36:19 +00001291static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001292_mm_packs_epi16(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001293{
David Blaikie3302f2b2013-01-16 23:08:36 +00001294 return (__m128i)__builtin_ia32_packsswb128((__v8hi)__a, (__v8hi)__b);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001295}
1296
Michael Kupersteine45af542015-06-30 13:36:19 +00001297static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001298_mm_packs_epi32(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001299{
David Blaikie3302f2b2013-01-16 23:08:36 +00001300 return (__m128i)__builtin_ia32_packssdw128((__v4si)__a, (__v4si)__b);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001301}
1302
Michael Kupersteine45af542015-06-30 13:36:19 +00001303static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001304_mm_packus_epi16(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001305{
David Blaikie3302f2b2013-01-16 23:08:36 +00001306 return (__m128i)__builtin_ia32_packuswb128((__v8hi)__a, (__v8hi)__b);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001307}
1308
Michael Kupersteine45af542015-06-30 13:36:19 +00001309static __inline__ int __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001310_mm_extract_epi16(__m128i __a, int __imm)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001311{
David Blaikie3302f2b2013-01-16 23:08:36 +00001312 __v8hi __b = (__v8hi)__a;
Manman Renbe38b9e2013-10-22 19:24:42 +00001313 return (unsigned short)__b[__imm & 7];
Anders Carlsson85eb1242008-12-26 00:45:50 +00001314}
1315
Michael Kupersteine45af542015-06-30 13:36:19 +00001316static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001317_mm_insert_epi16(__m128i __a, int __b, int __imm)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001318{
David Blaikie3302f2b2013-01-16 23:08:36 +00001319 __v8hi __c = (__v8hi)__a;
1320 __c[__imm & 7] = __b;
1321 return (__m128i)__c;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001322}
1323
Michael Kupersteine45af542015-06-30 13:36:19 +00001324static __inline__ int __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001325_mm_movemask_epi8(__m128i __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001326{
David Blaikie3302f2b2013-01-16 23:08:36 +00001327 return __builtin_ia32_pmovmskb128((__v16qi)__a);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001328}
1329
Bob Wilsonc9b97cc2011-11-05 06:08:06 +00001330#define _mm_shuffle_epi32(a, imm) __extension__ ({ \
Craig Topper51e47412015-02-13 06:04:43 +00001331 (__m128i)__builtin_shufflevector((__v4si)(__m128i)(a), \
1332 (__v4si)_mm_set1_epi32(0), \
Bob Wilsonc9b97cc2011-11-05 06:08:06 +00001333 (imm) & 0x3, ((imm) & 0xc) >> 2, \
1334 ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6); })
Chris Lattnerf03406f2011-04-25 20:42:40 +00001335
Bob Wilsonc9b97cc2011-11-05 06:08:06 +00001336#define _mm_shufflelo_epi16(a, imm) __extension__ ({ \
Craig Topper51e47412015-02-13 06:04:43 +00001337 (__m128i)__builtin_shufflevector((__v8hi)(__m128i)(a), \
1338 (__v8hi)_mm_set1_epi16(0), \
Bob Wilsonc9b97cc2011-11-05 06:08:06 +00001339 (imm) & 0x3, ((imm) & 0xc) >> 2, \
1340 ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6, \
1341 4, 5, 6, 7); })
Chris Lattnerf03406f2011-04-25 20:42:40 +00001342
Bob Wilsonc9b97cc2011-11-05 06:08:06 +00001343#define _mm_shufflehi_epi16(a, imm) __extension__ ({ \
Craig Topper51e47412015-02-13 06:04:43 +00001344 (__m128i)__builtin_shufflevector((__v8hi)(__m128i)(a), \
1345 (__v8hi)_mm_set1_epi16(0), \
Bob Wilsonc9b97cc2011-11-05 06:08:06 +00001346 0, 1, 2, 3, \
1347 4 + (((imm) & 0x03) >> 0), \
1348 4 + (((imm) & 0x0c) >> 2), \
1349 4 + (((imm) & 0x30) >> 4), \
1350 4 + (((imm) & 0xc0) >> 6)); })
Anders Carlsson85eb1242008-12-26 00:45:50 +00001351
Michael Kupersteine45af542015-06-30 13:36:19 +00001352static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001353_mm_unpackhi_epi8(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001354{
David Blaikie3302f2b2013-01-16 23:08:36 +00001355 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 +00001356}
1357
Michael Kupersteine45af542015-06-30 13:36:19 +00001358static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001359_mm_unpackhi_epi16(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001360{
David Blaikie3302f2b2013-01-16 23:08:36 +00001361 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 +00001362}
1363
Michael Kupersteine45af542015-06-30 13:36:19 +00001364static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001365_mm_unpackhi_epi32(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001366{
David Blaikie3302f2b2013-01-16 23:08:36 +00001367 return (__m128i)__builtin_shufflevector((__v4si)__a, (__v4si)__b, 2, 4+2, 3, 4+3);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001368}
1369
Michael Kupersteine45af542015-06-30 13:36:19 +00001370static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001371_mm_unpackhi_epi64(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001372{
David Blaikie3302f2b2013-01-16 23:08:36 +00001373 return (__m128i)__builtin_shufflevector(__a, __b, 1, 2+1);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001374}
1375
Michael Kupersteine45af542015-06-30 13:36:19 +00001376static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001377_mm_unpacklo_epi8(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001378{
David Blaikie3302f2b2013-01-16 23:08:36 +00001379 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 +00001380}
1381
Michael Kupersteine45af542015-06-30 13:36:19 +00001382static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001383_mm_unpacklo_epi16(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001384{
David Blaikie3302f2b2013-01-16 23:08:36 +00001385 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 +00001386}
1387
Michael Kupersteine45af542015-06-30 13:36:19 +00001388static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001389_mm_unpacklo_epi32(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001390{
David Blaikie3302f2b2013-01-16 23:08:36 +00001391 return (__m128i)__builtin_shufflevector((__v4si)__a, (__v4si)__b, 0, 4+0, 1, 4+1);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001392}
1393
Michael Kupersteine45af542015-06-30 13:36:19 +00001394static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001395_mm_unpacklo_epi64(__m128i __a, __m128i __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001396{
David Blaikie3302f2b2013-01-16 23:08:36 +00001397 return (__m128i)__builtin_shufflevector(__a, __b, 0, 2+0);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001398}
1399
Michael Kupersteine45af542015-06-30 13:36:19 +00001400static __inline__ __m64 __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001401_mm_movepi64_pi64(__m128i __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001402{
David Blaikie3302f2b2013-01-16 23:08:36 +00001403 return (__m64)__a[0];
Anders Carlsson85eb1242008-12-26 00:45:50 +00001404}
1405
Michael Kupersteine45af542015-06-30 13:36:19 +00001406static __inline__ __m128i __DEFAULT_FN_ATTRS
Alp Tokerd480b1b2013-11-23 22:11:57 +00001407_mm_movpi64_epi64(__m64 __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001408{
David Blaikie3302f2b2013-01-16 23:08:36 +00001409 return (__m128i){ (long long)__a, 0 };
Anders Carlsson85eb1242008-12-26 00:45:50 +00001410}
1411
Michael Kupersteine45af542015-06-30 13:36:19 +00001412static __inline__ __m128i __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001413_mm_move_epi64(__m128i __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001414{
David Blaikie3302f2b2013-01-16 23:08:36 +00001415 return __builtin_shufflevector(__a, (__m128i){ 0 }, 0, 2);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001416}
1417
Michael Kupersteine45af542015-06-30 13:36:19 +00001418static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001419_mm_unpackhi_pd(__m128d __a, __m128d __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001420{
David Blaikie3302f2b2013-01-16 23:08:36 +00001421 return __builtin_shufflevector(__a, __b, 1, 2+1);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001422}
1423
Michael Kupersteine45af542015-06-30 13:36:19 +00001424static __inline__ __m128d __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001425_mm_unpacklo_pd(__m128d __a, __m128d __b)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001426{
David Blaikie3302f2b2013-01-16 23:08:36 +00001427 return __builtin_shufflevector(__a, __b, 0, 2+0);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001428}
1429
Michael Kupersteine45af542015-06-30 13:36:19 +00001430static __inline__ int __DEFAULT_FN_ATTRS
David Blaikie3302f2b2013-01-16 23:08:36 +00001431_mm_movemask_pd(__m128d __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001432{
David Blaikie3302f2b2013-01-16 23:08:36 +00001433 return __builtin_ia32_movmskpd(__a);
Anders Carlsson85eb1242008-12-26 00:45:50 +00001434}
1435
Bob Wilsonc9b97cc2011-11-05 06:08:06 +00001436#define _mm_shuffle_pd(a, b, i) __extension__ ({ \
Craig Topper51e47412015-02-13 06:04:43 +00001437 __builtin_shufflevector((__m128d)(a), (__m128d)(b), \
1438 (i) & 1, (((i) & 2) >> 1) + 2); })
Anders Carlsson85eb1242008-12-26 00:45:50 +00001439
Michael Kupersteine45af542015-06-30 13:36:19 +00001440static __inline__ __m128 __DEFAULT_FN_ATTRS
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001441_mm_castpd_ps(__m128d __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001442{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001443 return (__m128)__a;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001444}
1445
Michael Kupersteine45af542015-06-30 13:36:19 +00001446static __inline__ __m128i __DEFAULT_FN_ATTRS
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001447_mm_castpd_si128(__m128d __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001448{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001449 return (__m128i)__a;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001450}
1451
Michael Kupersteine45af542015-06-30 13:36:19 +00001452static __inline__ __m128d __DEFAULT_FN_ATTRS
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001453_mm_castps_pd(__m128 __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001454{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001455 return (__m128d)__a;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001456}
1457
Michael Kupersteine45af542015-06-30 13:36:19 +00001458static __inline__ __m128i __DEFAULT_FN_ATTRS
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001459_mm_castps_si128(__m128 __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001460{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001461 return (__m128i)__a;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001462}
1463
Michael Kupersteine45af542015-06-30 13:36:19 +00001464static __inline__ __m128 __DEFAULT_FN_ATTRS
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001465_mm_castsi128_ps(__m128i __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001466{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001467 return (__m128)__a;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001468}
1469
Michael Kupersteine45af542015-06-30 13:36:19 +00001470static __inline__ __m128d __DEFAULT_FN_ATTRS
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001471_mm_castsi128_pd(__m128i __a)
Anders Carlsson85eb1242008-12-26 00:45:50 +00001472{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001473 return (__m128d)__a;
Anders Carlsson85eb1242008-12-26 00:45:50 +00001474}
1475
Michael Kupersteine45af542015-06-30 13:36:19 +00001476static __inline__ void __DEFAULT_FN_ATTRS
Mike Stump5b31ed32009-02-13 14:24:50 +00001477_mm_pause(void)
Anders Carlsson37c23712008-12-26 00:49:43 +00001478{
Anders Carlsson88b53662008-12-26 02:22:10 +00001479 __asm__ volatile ("pause");
Anders Carlsson37c23712008-12-26 00:49:43 +00001480}
1481
Michael Kupersteine45af542015-06-30 13:36:19 +00001482#undef __DEFAULT_FN_ATTRS
Eric Christopher4d1851682015-06-17 07:09:20 +00001483
Anders Carlsson43c2bab2009-01-21 01:49:39 +00001484#define _MM_SHUFFLE2(x, y) (((x) << 1) | (y))
Anders Carlsson37c23712008-12-26 00:49:43 +00001485
Anders Carlssonf15e71d2008-12-24 01:45:22 +00001486#endif /* __EMMINTRIN_H */