blob: 1d5ddf65c77bc61ccc48a05dfca0615696501d7a [file] [log] [blame]
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001/*===---- avxintrin.h - AVX intrinsics -------------------------------------===
2 *
3 * Permission is hereby granted, free of charge, to any person obtaining a copy
4 * of this software and associated documentation files (the "Software"), to deal
5 * in the Software without restriction, including without limitation the rights
6 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 * copies of the Software, and to permit persons to whom the Software is
8 * furnished to do so, subject to the following conditions:
9 *
10 * The above copyright notice and this permission notice shall be included in
11 * all copies or substantial portions of the Software.
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 * THE SOFTWARE.
20 *
21 *===-----------------------------------------------------------------------===
22 */
23
Benjamin Kramer6f35f3c2010-08-20 23:00:03 +000024#ifndef __IMMINTRIN_H
25#error "Never use <avxintrin.h> directly; include <immintrin.h> instead."
26#endif
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +000027
Richard Smith49e56442013-07-14 05:41:45 +000028#ifndef __AVXINTRIN_H
29#define __AVXINTRIN_H
30
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +000031typedef double __v4df __attribute__ ((__vector_size__ (32)));
32typedef float __v8sf __attribute__ ((__vector_size__ (32)));
33typedef long long __v4di __attribute__ ((__vector_size__ (32)));
34typedef int __v8si __attribute__ ((__vector_size__ (32)));
35typedef short __v16hi __attribute__ ((__vector_size__ (32)));
36typedef char __v32qi __attribute__ ((__vector_size__ (32)));
37
38typedef float __m256 __attribute__ ((__vector_size__ (32)));
39typedef double __m256d __attribute__((__vector_size__(32)));
40typedef long long __m256i __attribute__((__vector_size__(32)));
41
42/* Arithmetic */
43static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +000044_mm256_add_pd(__m256d __a, __m256d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +000045{
David Blaikie3302f2b2013-01-16 23:08:36 +000046 return __a+__b;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +000047}
48
49static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +000050_mm256_add_ps(__m256 __a, __m256 __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +000051{
David Blaikie3302f2b2013-01-16 23:08:36 +000052 return __a+__b;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +000053}
54
55static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +000056_mm256_sub_pd(__m256d __a, __m256d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +000057{
David Blaikie3302f2b2013-01-16 23:08:36 +000058 return __a-__b;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +000059}
60
61static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +000062_mm256_sub_ps(__m256 __a, __m256 __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +000063{
David Blaikie3302f2b2013-01-16 23:08:36 +000064 return __a-__b;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +000065}
66
67static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +000068_mm256_addsub_pd(__m256d __a, __m256d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +000069{
David Blaikie3302f2b2013-01-16 23:08:36 +000070 return (__m256d)__builtin_ia32_addsubpd256((__v4df)__a, (__v4df)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +000071}
72
73static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +000074_mm256_addsub_ps(__m256 __a, __m256 __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +000075{
David Blaikie3302f2b2013-01-16 23:08:36 +000076 return (__m256)__builtin_ia32_addsubps256((__v8sf)__a, (__v8sf)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +000077}
78
79static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +000080_mm256_div_pd(__m256d __a, __m256d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +000081{
David Blaikie3302f2b2013-01-16 23:08:36 +000082 return __a / __b;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +000083}
84
85static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +000086_mm256_div_ps(__m256 __a, __m256 __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +000087{
David Blaikie3302f2b2013-01-16 23:08:36 +000088 return __a / __b;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +000089}
90
91static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +000092_mm256_max_pd(__m256d __a, __m256d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +000093{
David Blaikie3302f2b2013-01-16 23:08:36 +000094 return (__m256d)__builtin_ia32_maxpd256((__v4df)__a, (__v4df)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +000095}
96
97static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +000098_mm256_max_ps(__m256 __a, __m256 __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +000099{
David Blaikie3302f2b2013-01-16 23:08:36 +0000100 return (__m256)__builtin_ia32_maxps256((__v8sf)__a, (__v8sf)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000101}
102
103static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000104_mm256_min_pd(__m256d __a, __m256d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000105{
David Blaikie3302f2b2013-01-16 23:08:36 +0000106 return (__m256d)__builtin_ia32_minpd256((__v4df)__a, (__v4df)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000107}
108
109static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000110_mm256_min_ps(__m256 __a, __m256 __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000111{
David Blaikie3302f2b2013-01-16 23:08:36 +0000112 return (__m256)__builtin_ia32_minps256((__v8sf)__a, (__v8sf)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000113}
114
115static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000116_mm256_mul_pd(__m256d __a, __m256d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000117{
David Blaikie3302f2b2013-01-16 23:08:36 +0000118 return __a * __b;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000119}
120
121static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000122_mm256_mul_ps(__m256 __a, __m256 __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000123{
David Blaikie3302f2b2013-01-16 23:08:36 +0000124 return __a * __b;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000125}
126
127static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000128_mm256_sqrt_pd(__m256d __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000129{
David Blaikie3302f2b2013-01-16 23:08:36 +0000130 return (__m256d)__builtin_ia32_sqrtpd256((__v4df)__a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000131}
132
133static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000134_mm256_sqrt_ps(__m256 __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000135{
David Blaikie3302f2b2013-01-16 23:08:36 +0000136 return (__m256)__builtin_ia32_sqrtps256((__v8sf)__a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000137}
138
139static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000140_mm256_rsqrt_ps(__m256 __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000141{
David Blaikie3302f2b2013-01-16 23:08:36 +0000142 return (__m256)__builtin_ia32_rsqrtps256((__v8sf)__a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000143}
144
145static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000146_mm256_rcp_ps(__m256 __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000147{
David Blaikie3302f2b2013-01-16 23:08:36 +0000148 return (__m256)__builtin_ia32_rcpps256((__v8sf)__a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000149}
150
Chad Rosier060d03b2011-12-17 00:15:26 +0000151#define _mm256_round_pd(V, M) __extension__ ({ \
152 __m256d __V = (V); \
Craig Topper9f009482011-12-24 07:55:14 +0000153 (__m256d)__builtin_ia32_roundpd256((__v4df)__V, (M)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000154
Chad Rosier060d03b2011-12-17 00:15:26 +0000155#define _mm256_round_ps(V, M) __extension__ ({ \
156 __m256 __V = (V); \
Craig Topper9f009482011-12-24 07:55:14 +0000157 (__m256)__builtin_ia32_roundps256((__v8sf)__V, (M)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000158
159#define _mm256_ceil_pd(V) _mm256_round_pd((V), _MM_FROUND_CEIL)
160#define _mm256_floor_pd(V) _mm256_round_pd((V), _MM_FROUND_FLOOR)
161#define _mm256_ceil_ps(V) _mm256_round_ps((V), _MM_FROUND_CEIL)
162#define _mm256_floor_ps(V) _mm256_round_ps((V), _MM_FROUND_FLOOR)
163
164/* Logical */
165static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000166_mm256_and_pd(__m256d __a, __m256d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000167{
David Blaikie3302f2b2013-01-16 23:08:36 +0000168 return (__m256d)((__v4di)__a & (__v4di)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000169}
170
171static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000172_mm256_and_ps(__m256 __a, __m256 __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000173{
David Blaikie3302f2b2013-01-16 23:08:36 +0000174 return (__m256)((__v8si)__a & (__v8si)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000175}
176
177static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000178_mm256_andnot_pd(__m256d __a, __m256d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000179{
David Blaikie3302f2b2013-01-16 23:08:36 +0000180 return (__m256d)(~(__v4di)__a & (__v4di)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000181}
182
183static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000184_mm256_andnot_ps(__m256 __a, __m256 __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000185{
David Blaikie3302f2b2013-01-16 23:08:36 +0000186 return (__m256)(~(__v8si)__a & (__v8si)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000187}
188
189static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000190_mm256_or_pd(__m256d __a, __m256d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000191{
David Blaikie3302f2b2013-01-16 23:08:36 +0000192 return (__m256d)((__v4di)__a | (__v4di)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000193}
194
195static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000196_mm256_or_ps(__m256 __a, __m256 __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000197{
David Blaikie3302f2b2013-01-16 23:08:36 +0000198 return (__m256)((__v8si)__a | (__v8si)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000199}
200
201static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000202_mm256_xor_pd(__m256d __a, __m256d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000203{
David Blaikie3302f2b2013-01-16 23:08:36 +0000204 return (__m256d)((__v4di)__a ^ (__v4di)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000205}
206
207static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000208_mm256_xor_ps(__m256 __a, __m256 __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000209{
David Blaikie3302f2b2013-01-16 23:08:36 +0000210 return (__m256)((__v8si)__a ^ (__v8si)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000211}
212
213/* Horizontal arithmetic */
214static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000215_mm256_hadd_pd(__m256d __a, __m256d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000216{
David Blaikie3302f2b2013-01-16 23:08:36 +0000217 return (__m256d)__builtin_ia32_haddpd256((__v4df)__a, (__v4df)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000218}
219
220static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000221_mm256_hadd_ps(__m256 __a, __m256 __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000222{
David Blaikie3302f2b2013-01-16 23:08:36 +0000223 return (__m256)__builtin_ia32_haddps256((__v8sf)__a, (__v8sf)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000224}
225
226static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000227_mm256_hsub_pd(__m256d __a, __m256d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000228{
David Blaikie3302f2b2013-01-16 23:08:36 +0000229 return (__m256d)__builtin_ia32_hsubpd256((__v4df)__a, (__v4df)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000230}
231
232static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000233_mm256_hsub_ps(__m256 __a, __m256 __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000234{
David Blaikie3302f2b2013-01-16 23:08:36 +0000235 return (__m256)__builtin_ia32_hsubps256((__v8sf)__a, (__v8sf)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000236}
237
238/* Vector permutations */
239static __inline __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000240_mm_permutevar_pd(__m128d __a, __m128i __c)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000241{
David Blaikie3302f2b2013-01-16 23:08:36 +0000242 return (__m128d)__builtin_ia32_vpermilvarpd((__v2df)__a, (__v2di)__c);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000243}
244
245static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000246_mm256_permutevar_pd(__m256d __a, __m256i __c)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000247{
David Blaikie3302f2b2013-01-16 23:08:36 +0000248 return (__m256d)__builtin_ia32_vpermilvarpd256((__v4df)__a, (__v4di)__c);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000249}
250
251static __inline __m128 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000252_mm_permutevar_ps(__m128 __a, __m128i __c)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000253{
David Blaikie3302f2b2013-01-16 23:08:36 +0000254 return (__m128)__builtin_ia32_vpermilvarps((__v4sf)__a, (__v4si)__c);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000255}
256
257static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000258_mm256_permutevar_ps(__m256 __a, __m256i __c)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000259{
Craig Topper9fee8ab2015-01-31 06:33:59 +0000260 return (__m256)__builtin_ia32_vpermilvarps256((__v8sf)__a, (__v8si)__c);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000261}
262
Chad Rosier93375d52011-12-17 01:39:56 +0000263#define _mm_permute_pd(A, C) __extension__ ({ \
264 __m128d __A = (A); \
Craig Topperfec9f8e2012-02-08 05:16:54 +0000265 (__m128d)__builtin_shufflevector((__v2df)__A, (__v2df) _mm_setzero_pd(), \
266 (C) & 0x1, ((C) & 0x2) >> 1); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000267
Chad Rosier93375d52011-12-17 01:39:56 +0000268#define _mm256_permute_pd(A, C) __extension__ ({ \
269 __m256d __A = (A); \
Craig Topperfec9f8e2012-02-08 05:16:54 +0000270 (__m256d)__builtin_shufflevector((__v4df)__A, (__v4df) _mm256_setzero_pd(), \
271 (C) & 0x1, ((C) & 0x2) >> 1, \
272 2 + (((C) & 0x4) >> 2), \
273 2 + (((C) & 0x8) >> 3)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000274
Chad Rosier7caca842011-12-17 01:51:05 +0000275#define _mm_permute_ps(A, C) __extension__ ({ \
276 __m128 __A = (A); \
Craig Topperfec9f8e2012-02-08 05:16:54 +0000277 (__m128)__builtin_shufflevector((__v4sf)__A, (__v4sf) _mm_setzero_ps(), \
278 (C) & 0x3, ((C) & 0xc) >> 2, \
Craig Topper678a53c2012-03-30 05:09:18 +0000279 ((C) & 0x30) >> 4, ((C) & 0xc0) >> 6); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000280
Chad Rosier7caca842011-12-17 01:51:05 +0000281#define _mm256_permute_ps(A, C) __extension__ ({ \
282 __m256 __A = (A); \
Craig Topperfec9f8e2012-02-08 05:16:54 +0000283 (__m256)__builtin_shufflevector((__v8sf)__A, (__v8sf) _mm256_setzero_ps(), \
284 (C) & 0x3, ((C) & 0xc) >> 2, \
285 ((C) & 0x30) >> 4, ((C) & 0xc0) >> 6, \
286 4 + (((C) & 0x03) >> 0), \
287 4 + (((C) & 0x0c) >> 2), \
288 4 + (((C) & 0x30) >> 4), \
289 4 + (((C) & 0xc0) >> 6)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000290
Chad Rosier9138fea252011-12-16 21:07:34 +0000291#define _mm256_permute2f128_pd(V1, V2, M) __extension__ ({ \
292 __m256d __V1 = (V1); \
293 __m256d __V2 = (V2); \
Craig Topper26e74e52012-04-17 05:16:56 +0000294 (__m256d)__builtin_ia32_vperm2f128_pd256((__v4df)__V1, (__v4df)__V2, (M)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000295
Chad Rosier9138fea252011-12-16 21:07:34 +0000296#define _mm256_permute2f128_ps(V1, V2, M) __extension__ ({ \
297 __m256 __V1 = (V1); \
298 __m256 __V2 = (V2); \
Craig Topper26e74e52012-04-17 05:16:56 +0000299 (__m256)__builtin_ia32_vperm2f128_ps256((__v8sf)__V1, (__v8sf)__V2, (M)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000300
Chad Rosier9138fea252011-12-16 21:07:34 +0000301#define _mm256_permute2f128_si256(V1, V2, M) __extension__ ({ \
302 __m256i __V1 = (V1); \
303 __m256i __V2 = (V2); \
Craig Topper26e74e52012-04-17 05:16:56 +0000304 (__m256i)__builtin_ia32_vperm2f128_si256((__v8si)__V1, (__v8si)__V2, (M)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000305
306/* Vector Blend */
Eli Friedmanf16beb32011-11-10 00:11:13 +0000307#define _mm256_blend_pd(V1, V2, M) __extension__ ({ \
308 __m256d __V1 = (V1); \
309 __m256d __V2 = (V2); \
Filipe Cabecinhas5d289b42014-05-13 02:37:02 +0000310 (__m256d)__builtin_shufflevector((__v4df)__V1, (__v4df)__V2, \
311 (((M) & 0x01) ? 4 : 0), \
312 (((M) & 0x02) ? 5 : 1), \
313 (((M) & 0x04) ? 6 : 2), \
314 (((M) & 0x08) ? 7 : 3)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000315
Eli Friedmanf16beb32011-11-10 00:11:13 +0000316#define _mm256_blend_ps(V1, V2, M) __extension__ ({ \
317 __m256 __V1 = (V1); \
318 __m256 __V2 = (V2); \
Filipe Cabecinhas5d289b42014-05-13 02:37:02 +0000319 (__m256)__builtin_shufflevector((__v8sf)__V1, (__v8sf)__V2, \
320 (((M) & 0x01) ? 8 : 0), \
321 (((M) & 0x02) ? 9 : 1), \
322 (((M) & 0x04) ? 10 : 2), \
323 (((M) & 0x08) ? 11 : 3), \
324 (((M) & 0x10) ? 12 : 4), \
325 (((M) & 0x20) ? 13 : 5), \
326 (((M) & 0x40) ? 14 : 6), \
327 (((M) & 0x80) ? 15 : 7)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000328
329static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000330_mm256_blendv_pd(__m256d __a, __m256d __b, __m256d __c)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000331{
David Blaikie3302f2b2013-01-16 23:08:36 +0000332 return (__m256d)__builtin_ia32_blendvpd256(
333 (__v4df)__a, (__v4df)__b, (__v4df)__c);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000334}
335
336static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000337_mm256_blendv_ps(__m256 __a, __m256 __b, __m256 __c)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000338{
David Blaikie5bb70032013-01-16 23:13:42 +0000339 return (__m256)__builtin_ia32_blendvps256(
David Blaikie3302f2b2013-01-16 23:08:36 +0000340 (__v8sf)__a, (__v8sf)__b, (__v8sf)__c);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000341}
342
343/* Vector Dot Product */
Eli Friedmanf16beb32011-11-10 00:11:13 +0000344#define _mm256_dp_ps(V1, V2, M) __extension__ ({ \
345 __m256 __V1 = (V1); \
346 __m256 __V2 = (V2); \
Craig Topper9f009482011-12-24 07:55:14 +0000347 (__m256)__builtin_ia32_dpps256((__v8sf)__V1, (__v8sf)__V2, (M)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000348
349/* Vector shuffle */
Bob Wilsonc9b97cc2011-11-05 06:08:06 +0000350#define _mm256_shuffle_ps(a, b, mask) __extension__ ({ \
351 __m256 __a = (a); \
352 __m256 __b = (b); \
353 (__m256)__builtin_shufflevector((__v8sf)__a, (__v8sf)__b, \
Bruno Cardoso Lopese712a132010-08-11 01:17:34 +0000354 (mask) & 0x3, ((mask) & 0xc) >> 2, \
Bruno Cardoso Lopes8c333152010-08-11 18:45:43 +0000355 (((mask) & 0x30) >> 4) + 8, (((mask) & 0xc0) >> 6) + 8, \
Bruno Cardoso Lopes7a98a7e2011-08-23 23:29:45 +0000356 ((mask) & 0x3) + 4, (((mask) & 0xc) >> 2) + 4, \
Bob Wilsonc9b97cc2011-11-05 06:08:06 +0000357 (((mask) & 0x30) >> 4) + 12, (((mask) & 0xc0) >> 6) + 12); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000358
Bob Wilsonc9b97cc2011-11-05 06:08:06 +0000359#define _mm256_shuffle_pd(a, b, mask) __extension__ ({ \
360 __m256d __a = (a); \
361 __m256d __b = (b); \
362 (__m256d)__builtin_shufflevector((__v4df)__a, (__v4df)__b, \
Bruno Cardoso Lopese712a132010-08-11 01:17:34 +0000363 (mask) & 0x1, \
364 (((mask) & 0x2) >> 1) + 4, \
365 (((mask) & 0x4) >> 2) + 2, \
Bob Wilsonc9b97cc2011-11-05 06:08:06 +0000366 (((mask) & 0x8) >> 3) + 6); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000367
368/* Compare */
369#define _CMP_EQ_OQ 0x00 /* Equal (ordered, non-signaling) */
370#define _CMP_LT_OS 0x01 /* Less-than (ordered, signaling) */
371#define _CMP_LE_OS 0x02 /* Less-than-or-equal (ordered, signaling) */
372#define _CMP_UNORD_Q 0x03 /* Unordered (non-signaling) */
373#define _CMP_NEQ_UQ 0x04 /* Not-equal (unordered, non-signaling) */
374#define _CMP_NLT_US 0x05 /* Not-less-than (unordered, signaling) */
375#define _CMP_NLE_US 0x06 /* Not-less-than-or-equal (unordered, signaling) */
376#define _CMP_ORD_Q 0x07 /* Ordered (nonsignaling) */
377#define _CMP_EQ_UQ 0x08 /* Equal (unordered, non-signaling) */
378#define _CMP_NGE_US 0x09 /* Not-greater-than-or-equal (unord, signaling) */
379#define _CMP_NGT_US 0x0a /* Not-greater-than (unordered, signaling) */
380#define _CMP_FALSE_OQ 0x0b /* False (ordered, non-signaling) */
381#define _CMP_NEQ_OQ 0x0c /* Not-equal (ordered, non-signaling) */
382#define _CMP_GE_OS 0x0d /* Greater-than-or-equal (ordered, signaling) */
383#define _CMP_GT_OS 0x0e /* Greater-than (ordered, signaling) */
384#define _CMP_TRUE_UQ 0x0f /* True (unordered, non-signaling) */
385#define _CMP_EQ_OS 0x10 /* Equal (ordered, signaling) */
386#define _CMP_LT_OQ 0x11 /* Less-than (ordered, non-signaling) */
387#define _CMP_LE_OQ 0x12 /* Less-than-or-equal (ordered, non-signaling) */
388#define _CMP_UNORD_S 0x13 /* Unordered (signaling) */
389#define _CMP_NEQ_US 0x14 /* Not-equal (unordered, signaling) */
390#define _CMP_NLT_UQ 0x15 /* Not-less-than (unordered, non-signaling) */
391#define _CMP_NLE_UQ 0x16 /* Not-less-than-or-equal (unord, non-signaling) */
392#define _CMP_ORD_S 0x17 /* Ordered (signaling) */
393#define _CMP_EQ_US 0x18 /* Equal (unordered, signaling) */
394#define _CMP_NGE_UQ 0x19 /* Not-greater-than-or-equal (unord, non-sign) */
395#define _CMP_NGT_UQ 0x1a /* Not-greater-than (unordered, non-signaling) */
396#define _CMP_FALSE_OS 0x1b /* False (ordered, signaling) */
397#define _CMP_NEQ_OS 0x1c /* Not-equal (ordered, signaling) */
398#define _CMP_GE_OQ 0x1d /* Greater-than-or-equal (ordered, non-signaling) */
399#define _CMP_GT_OQ 0x1e /* Greater-than (ordered, non-signaling) */
400#define _CMP_TRUE_US 0x1f /* True (unordered, signaling) */
401
Bob Wilsonc9b97cc2011-11-05 06:08:06 +0000402#define _mm_cmp_pd(a, b, c) __extension__ ({ \
403 __m128d __a = (a); \
404 __m128d __b = (b); \
405 (__m128d)__builtin_ia32_cmppd((__v2df)__a, (__v2df)__b, (c)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000406
Bob Wilsonc9b97cc2011-11-05 06:08:06 +0000407#define _mm_cmp_ps(a, b, c) __extension__ ({ \
408 __m128 __a = (a); \
409 __m128 __b = (b); \
410 (__m128)__builtin_ia32_cmpps((__v4sf)__a, (__v4sf)__b, (c)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000411
Bob Wilsonc9b97cc2011-11-05 06:08:06 +0000412#define _mm256_cmp_pd(a, b, c) __extension__ ({ \
413 __m256d __a = (a); \
414 __m256d __b = (b); \
415 (__m256d)__builtin_ia32_cmppd256((__v4df)__a, (__v4df)__b, (c)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000416
Bob Wilsonc9b97cc2011-11-05 06:08:06 +0000417#define _mm256_cmp_ps(a, b, c) __extension__ ({ \
418 __m256 __a = (a); \
419 __m256 __b = (b); \
420 (__m256)__builtin_ia32_cmpps256((__v8sf)__a, (__v8sf)__b, (c)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000421
Bob Wilsonc9b97cc2011-11-05 06:08:06 +0000422#define _mm_cmp_sd(a, b, c) __extension__ ({ \
423 __m128d __a = (a); \
424 __m128d __b = (b); \
425 (__m128d)__builtin_ia32_cmpsd((__v2df)__a, (__v2df)__b, (c)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000426
Bob Wilsonc9b97cc2011-11-05 06:08:06 +0000427#define _mm_cmp_ss(a, b, c) __extension__ ({ \
428 __m128 __a = (a); \
429 __m128 __b = (b); \
430 (__m128)__builtin_ia32_cmpss((__v4sf)__a, (__v4sf)__b, (c)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000431
432/* Vector extract */
Chad Rosier0adfe7a2011-12-17 01:22:27 +0000433#define _mm256_extractf128_pd(A, O) __extension__ ({ \
434 __m256d __A = (A); \
Craig Topper9f009482011-12-24 07:55:14 +0000435 (__m128d)__builtin_ia32_vextractf128_pd256((__v4df)__A, (O)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000436
Chad Rosier0adfe7a2011-12-17 01:22:27 +0000437#define _mm256_extractf128_ps(A, O) __extension__ ({ \
438 __m256 __A = (A); \
Craig Topper9f009482011-12-24 07:55:14 +0000439 (__m128)__builtin_ia32_vextractf128_ps256((__v8sf)__A, (O)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000440
Chad Rosier0adfe7a2011-12-17 01:22:27 +0000441#define _mm256_extractf128_si256(A, O) __extension__ ({ \
442 __m256i __A = (A); \
Craig Topper9f009482011-12-24 07:55:14 +0000443 (__m128i)__builtin_ia32_vextractf128_si256((__v8si)__A, (O)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000444
445static __inline int __attribute__((__always_inline__, __nodebug__))
Craig Topper459554f2015-01-31 06:31:30 +0000446_mm256_extract_epi32(__m256i __a, const int __imm)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000447{
David Blaikie3302f2b2013-01-16 23:08:36 +0000448 __v8si __b = (__v8si)__a;
Manman Renc94122e2013-10-23 20:33:14 +0000449 return __b[__imm & 7];
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000450}
451
452static __inline int __attribute__((__always_inline__, __nodebug__))
Craig Topper459554f2015-01-31 06:31:30 +0000453_mm256_extract_epi16(__m256i __a, const int __imm)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000454{
David Blaikie3302f2b2013-01-16 23:08:36 +0000455 __v16hi __b = (__v16hi)__a;
Manman Renc94122e2013-10-23 20:33:14 +0000456 return __b[__imm & 15];
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000457}
458
459static __inline int __attribute__((__always_inline__, __nodebug__))
Craig Topper459554f2015-01-31 06:31:30 +0000460_mm256_extract_epi8(__m256i __a, const int __imm)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000461{
David Blaikie3302f2b2013-01-16 23:08:36 +0000462 __v32qi __b = (__v32qi)__a;
Manman Renc94122e2013-10-23 20:33:14 +0000463 return __b[__imm & 31];
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000464}
465
466#ifdef __x86_64__
467static __inline long long __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000468_mm256_extract_epi64(__m256i __a, const int __imm)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000469{
David Blaikie3302f2b2013-01-16 23:08:36 +0000470 __v4di __b = (__v4di)__a;
Manman Renc94122e2013-10-23 20:33:14 +0000471 return __b[__imm & 3];
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000472}
473#endif
474
475/* Vector insert */
Chad Rosier33d22d82011-12-16 21:40:31 +0000476#define _mm256_insertf128_pd(V1, V2, O) __extension__ ({ \
477 __m256d __V1 = (V1); \
478 __m128d __V2 = (V2); \
Craig Topper9f009482011-12-24 07:55:14 +0000479 (__m256d)__builtin_ia32_vinsertf128_pd256((__v4df)__V1, (__v2df)__V2, (O)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000480
Chad Rosier33d22d82011-12-16 21:40:31 +0000481#define _mm256_insertf128_ps(V1, V2, O) __extension__ ({ \
482 __m256 __V1 = (V1); \
483 __m128 __V2 = (V2); \
Craig Topper9f009482011-12-24 07:55:14 +0000484 (__m256)__builtin_ia32_vinsertf128_ps256((__v8sf)__V1, (__v4sf)__V2, (O)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000485
Chad Rosier33d22d82011-12-16 21:40:31 +0000486#define _mm256_insertf128_si256(V1, V2, O) __extension__ ({ \
487 __m256i __V1 = (V1); \
488 __m128i __V2 = (V2); \
Craig Topper9f009482011-12-24 07:55:14 +0000489 (__m256i)__builtin_ia32_vinsertf128_si256((__v8si)__V1, (__v4si)__V2, (O)); })
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000490
491static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000492_mm256_insert_epi32(__m256i __a, int __b, int const __imm)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000493{
David Blaikie3302f2b2013-01-16 23:08:36 +0000494 __v8si __c = (__v8si)__a;
495 __c[__imm & 7] = __b;
496 return (__m256i)__c;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000497}
498
499static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000500_mm256_insert_epi16(__m256i __a, int __b, int const __imm)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000501{
David Blaikie3302f2b2013-01-16 23:08:36 +0000502 __v16hi __c = (__v16hi)__a;
503 __c[__imm & 15] = __b;
504 return (__m256i)__c;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000505}
506
507static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000508_mm256_insert_epi8(__m256i __a, int __b, int const __imm)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000509{
David Blaikie3302f2b2013-01-16 23:08:36 +0000510 __v32qi __c = (__v32qi)__a;
511 __c[__imm & 31] = __b;
512 return (__m256i)__c;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000513}
514
515#ifdef __x86_64__
516static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000517_mm256_insert_epi64(__m256i __a, int __b, int const __imm)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000518{
David Blaikie3302f2b2013-01-16 23:08:36 +0000519 __v4di __c = (__v4di)__a;
520 __c[__imm & 3] = __b;
521 return (__m256i)__c;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000522}
523#endif
524
525/* Conversion */
526static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000527_mm256_cvtepi32_pd(__m128i __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000528{
David Blaikie3302f2b2013-01-16 23:08:36 +0000529 return (__m256d)__builtin_ia32_cvtdq2pd256((__v4si) __a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000530}
531
532static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000533_mm256_cvtepi32_ps(__m256i __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000534{
David Blaikie3302f2b2013-01-16 23:08:36 +0000535 return (__m256)__builtin_ia32_cvtdq2ps256((__v8si) __a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000536}
537
538static __inline __m128 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000539_mm256_cvtpd_ps(__m256d __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000540{
David Blaikie3302f2b2013-01-16 23:08:36 +0000541 return (__m128)__builtin_ia32_cvtpd2ps256((__v4df) __a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000542}
543
544static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000545_mm256_cvtps_epi32(__m256 __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000546{
David Blaikie3302f2b2013-01-16 23:08:36 +0000547 return (__m256i)__builtin_ia32_cvtps2dq256((__v8sf) __a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000548}
549
550static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000551_mm256_cvtps_pd(__m128 __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000552{
David Blaikie3302f2b2013-01-16 23:08:36 +0000553 return (__m256d)__builtin_ia32_cvtps2pd256((__v4sf) __a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000554}
555
556static __inline __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000557_mm256_cvttpd_epi32(__m256d __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000558{
David Blaikie3302f2b2013-01-16 23:08:36 +0000559 return (__m128i)__builtin_ia32_cvttpd2dq256((__v4df) __a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000560}
561
562static __inline __m128i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000563_mm256_cvtpd_epi32(__m256d __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000564{
David Blaikie3302f2b2013-01-16 23:08:36 +0000565 return (__m128i)__builtin_ia32_cvtpd2dq256((__v4df) __a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000566}
567
568static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000569_mm256_cvttps_epi32(__m256 __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000570{
David Blaikie3302f2b2013-01-16 23:08:36 +0000571 return (__m256i)__builtin_ia32_cvttps2dq256((__v8sf) __a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000572}
573
574/* Vector replicate */
575static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000576_mm256_movehdup_ps(__m256 __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000577{
David Blaikie3302f2b2013-01-16 23:08:36 +0000578 return __builtin_shufflevector(__a, __a, 1, 1, 3, 3, 5, 5, 7, 7);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000579}
580
581static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000582_mm256_moveldup_ps(__m256 __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000583{
David Blaikie3302f2b2013-01-16 23:08:36 +0000584 return __builtin_shufflevector(__a, __a, 0, 0, 2, 2, 4, 4, 6, 6);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000585}
586
587static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000588_mm256_movedup_pd(__m256d __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000589{
David Blaikie3302f2b2013-01-16 23:08:36 +0000590 return __builtin_shufflevector(__a, __a, 0, 0, 2, 2);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000591}
592
593/* Unpack and Interleave */
594static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000595_mm256_unpackhi_pd(__m256d __a, __m256d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000596{
David Blaikie3302f2b2013-01-16 23:08:36 +0000597 return __builtin_shufflevector(__a, __b, 1, 5, 1+2, 5+2);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000598}
599
600static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000601_mm256_unpacklo_pd(__m256d __a, __m256d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000602{
David Blaikie3302f2b2013-01-16 23:08:36 +0000603 return __builtin_shufflevector(__a, __b, 0, 4, 0+2, 4+2);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000604}
605
606static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000607_mm256_unpackhi_ps(__m256 __a, __m256 __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000608{
David Blaikie3302f2b2013-01-16 23:08:36 +0000609 return __builtin_shufflevector(__a, __b, 2, 10, 2+1, 10+1, 6, 14, 6+1, 14+1);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000610}
611
612static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000613_mm256_unpacklo_ps(__m256 __a, __m256 __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000614{
David Blaikie3302f2b2013-01-16 23:08:36 +0000615 return __builtin_shufflevector(__a, __b, 0, 8, 0+1, 8+1, 4, 12, 4+1, 12+1);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000616}
617
618/* Bit Test */
619static __inline int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000620_mm_testz_pd(__m128d __a, __m128d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000621{
David Blaikie3302f2b2013-01-16 23:08:36 +0000622 return __builtin_ia32_vtestzpd((__v2df)__a, (__v2df)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000623}
624
625static __inline int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000626_mm_testc_pd(__m128d __a, __m128d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000627{
David Blaikie3302f2b2013-01-16 23:08:36 +0000628 return __builtin_ia32_vtestcpd((__v2df)__a, (__v2df)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000629}
630
631static __inline int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000632_mm_testnzc_pd(__m128d __a, __m128d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000633{
David Blaikie3302f2b2013-01-16 23:08:36 +0000634 return __builtin_ia32_vtestnzcpd((__v2df)__a, (__v2df)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000635}
636
637static __inline int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000638_mm_testz_ps(__m128 __a, __m128 __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000639{
David Blaikie3302f2b2013-01-16 23:08:36 +0000640 return __builtin_ia32_vtestzps((__v4sf)__a, (__v4sf)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000641}
642
643static __inline int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000644_mm_testc_ps(__m128 __a, __m128 __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000645{
David Blaikie3302f2b2013-01-16 23:08:36 +0000646 return __builtin_ia32_vtestcps((__v4sf)__a, (__v4sf)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000647}
648
649static __inline int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000650_mm_testnzc_ps(__m128 __a, __m128 __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000651{
David Blaikie3302f2b2013-01-16 23:08:36 +0000652 return __builtin_ia32_vtestnzcps((__v4sf)__a, (__v4sf)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000653}
654
655static __inline int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000656_mm256_testz_pd(__m256d __a, __m256d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000657{
David Blaikie3302f2b2013-01-16 23:08:36 +0000658 return __builtin_ia32_vtestzpd256((__v4df)__a, (__v4df)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000659}
660
661static __inline int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000662_mm256_testc_pd(__m256d __a, __m256d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000663{
David Blaikie3302f2b2013-01-16 23:08:36 +0000664 return __builtin_ia32_vtestcpd256((__v4df)__a, (__v4df)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000665}
666
667static __inline int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000668_mm256_testnzc_pd(__m256d __a, __m256d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000669{
David Blaikie3302f2b2013-01-16 23:08:36 +0000670 return __builtin_ia32_vtestnzcpd256((__v4df)__a, (__v4df)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000671}
672
673static __inline int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000674_mm256_testz_ps(__m256 __a, __m256 __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000675{
David Blaikie3302f2b2013-01-16 23:08:36 +0000676 return __builtin_ia32_vtestzps256((__v8sf)__a, (__v8sf)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000677}
678
679static __inline int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000680_mm256_testc_ps(__m256 __a, __m256 __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000681{
David Blaikie3302f2b2013-01-16 23:08:36 +0000682 return __builtin_ia32_vtestcps256((__v8sf)__a, (__v8sf)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000683}
684
685static __inline int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000686_mm256_testnzc_ps(__m256 __a, __m256 __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000687{
David Blaikie3302f2b2013-01-16 23:08:36 +0000688 return __builtin_ia32_vtestnzcps256((__v8sf)__a, (__v8sf)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000689}
690
691static __inline int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000692_mm256_testz_si256(__m256i __a, __m256i __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000693{
David Blaikie3302f2b2013-01-16 23:08:36 +0000694 return __builtin_ia32_ptestz256((__v4di)__a, (__v4di)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000695}
696
697static __inline int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000698_mm256_testc_si256(__m256i __a, __m256i __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000699{
David Blaikie3302f2b2013-01-16 23:08:36 +0000700 return __builtin_ia32_ptestc256((__v4di)__a, (__v4di)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000701}
702
703static __inline int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000704_mm256_testnzc_si256(__m256i __a, __m256i __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000705{
David Blaikie3302f2b2013-01-16 23:08:36 +0000706 return __builtin_ia32_ptestnzc256((__v4di)__a, (__v4di)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000707}
708
709/* Vector extract sign mask */
710static __inline int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000711_mm256_movemask_pd(__m256d __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000712{
David Blaikie3302f2b2013-01-16 23:08:36 +0000713 return __builtin_ia32_movmskpd256((__v4df)__a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000714}
715
716static __inline int __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000717_mm256_movemask_ps(__m256 __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000718{
David Blaikie3302f2b2013-01-16 23:08:36 +0000719 return __builtin_ia32_movmskps256((__v8sf)__a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000720}
721
David Blaikie3302f2b2013-01-16 23:08:36 +0000722/* Vector __zero */
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000723static __inline void __attribute__((__always_inline__, __nodebug__))
724_mm256_zeroall(void)
725{
726 __builtin_ia32_vzeroall();
727}
728
729static __inline void __attribute__((__always_inline__, __nodebug__))
730_mm256_zeroupper(void)
731{
732 __builtin_ia32_vzeroupper();
733}
734
735/* Vector load with broadcast */
736static __inline __m128 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000737_mm_broadcast_ss(float const *__a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000738{
Adam Nemet286ae082014-05-29 20:47:29 +0000739 float __f = *__a;
740 return (__m128)(__v4sf){ __f, __f, __f, __f };
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000741}
742
743static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000744_mm256_broadcast_sd(double const *__a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000745{
Adam Nemet286ae082014-05-29 20:47:29 +0000746 double __d = *__a;
747 return (__m256d)(__v4df){ __d, __d, __d, __d };
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000748}
749
750static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000751_mm256_broadcast_ss(float const *__a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000752{
Adam Nemet286ae082014-05-29 20:47:29 +0000753 float __f = *__a;
754 return (__m256)(__v8sf){ __f, __f, __f, __f, __f, __f, __f, __f };
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000755}
756
757static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000758_mm256_broadcast_pd(__m128d const *__a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000759{
David Blaikie3302f2b2013-01-16 23:08:36 +0000760 return (__m256d)__builtin_ia32_vbroadcastf128_pd256(__a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000761}
762
763static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000764_mm256_broadcast_ps(__m128 const *__a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000765{
David Blaikie3302f2b2013-01-16 23:08:36 +0000766 return (__m256)__builtin_ia32_vbroadcastf128_ps256(__a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000767}
768
769/* SIMD load ops */
770static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000771_mm256_load_pd(double const *__p)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000772{
David Blaikie3302f2b2013-01-16 23:08:36 +0000773 return *(__m256d *)__p;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000774}
775
776static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000777_mm256_load_ps(float const *__p)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000778{
David Blaikie3302f2b2013-01-16 23:08:36 +0000779 return *(__m256 *)__p;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000780}
781
782static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000783_mm256_loadu_pd(double const *__p)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000784{
Craig Topper9e9301a2012-01-25 04:26:17 +0000785 struct __loadu_pd {
David Blaikie3302f2b2013-01-16 23:08:36 +0000786 __m256d __v;
Craig Topper9e9301a2012-01-25 04:26:17 +0000787 } __attribute__((packed, may_alias));
David Blaikie3302f2b2013-01-16 23:08:36 +0000788 return ((struct __loadu_pd*)__p)->__v;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000789}
790
791static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000792_mm256_loadu_ps(float const *__p)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000793{
Craig Topper9e9301a2012-01-25 04:26:17 +0000794 struct __loadu_ps {
David Blaikie3302f2b2013-01-16 23:08:36 +0000795 __m256 __v;
Craig Topper9e9301a2012-01-25 04:26:17 +0000796 } __attribute__((packed, may_alias));
David Blaikie3302f2b2013-01-16 23:08:36 +0000797 return ((struct __loadu_ps*)__p)->__v;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000798}
799
800static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000801_mm256_load_si256(__m256i const *__p)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000802{
David Blaikie3302f2b2013-01-16 23:08:36 +0000803 return *__p;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000804}
805
806static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000807_mm256_loadu_si256(__m256i const *__p)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000808{
Craig Topper9e9301a2012-01-25 04:26:17 +0000809 struct __loadu_si256 {
David Blaikie3302f2b2013-01-16 23:08:36 +0000810 __m256i __v;
Craig Topper9e9301a2012-01-25 04:26:17 +0000811 } __attribute__((packed, may_alias));
David Blaikie3302f2b2013-01-16 23:08:36 +0000812 return ((struct __loadu_si256*)__p)->__v;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000813}
814
815static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000816_mm256_lddqu_si256(__m256i const *__p)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000817{
David Blaikie3302f2b2013-01-16 23:08:36 +0000818 return (__m256i)__builtin_ia32_lddqu256((char const *)__p);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000819}
820
821/* SIMD store ops */
822static __inline void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000823_mm256_store_pd(double *__p, __m256d __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000824{
David Blaikie3302f2b2013-01-16 23:08:36 +0000825 *(__m256d *)__p = __a;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000826}
827
828static __inline void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000829_mm256_store_ps(float *__p, __m256 __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000830{
David Blaikie3302f2b2013-01-16 23:08:36 +0000831 *(__m256 *)__p = __a;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000832}
833
834static __inline void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000835_mm256_storeu_pd(double *__p, __m256d __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000836{
David Blaikie3302f2b2013-01-16 23:08:36 +0000837 __builtin_ia32_storeupd256(__p, (__v4df)__a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000838}
839
840static __inline void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000841_mm256_storeu_ps(float *__p, __m256 __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000842{
David Blaikie3302f2b2013-01-16 23:08:36 +0000843 __builtin_ia32_storeups256(__p, (__v8sf)__a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000844}
845
846static __inline void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000847_mm256_store_si256(__m256i *__p, __m256i __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000848{
David Blaikie3302f2b2013-01-16 23:08:36 +0000849 *__p = __a;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000850}
851
852static __inline void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000853_mm256_storeu_si256(__m256i *__p, __m256i __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000854{
David Blaikie3302f2b2013-01-16 23:08:36 +0000855 __builtin_ia32_storedqu256((char *)__p, (__v32qi)__a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000856}
857
858/* Conditional load ops */
859static __inline __m128d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000860_mm_maskload_pd(double const *__p, __m128d __m)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000861{
David Blaikie3302f2b2013-01-16 23:08:36 +0000862 return (__m128d)__builtin_ia32_maskloadpd((const __v2df *)__p, (__v2df)__m);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000863}
864
865static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000866_mm256_maskload_pd(double const *__p, __m256d __m)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000867{
David Blaikie3302f2b2013-01-16 23:08:36 +0000868 return (__m256d)__builtin_ia32_maskloadpd256((const __v4df *)__p,
869 (__v4df)__m);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000870}
871
872static __inline __m128 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000873_mm_maskload_ps(float const *__p, __m128 __m)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000874{
David Blaikie3302f2b2013-01-16 23:08:36 +0000875 return (__m128)__builtin_ia32_maskloadps((const __v4sf *)__p, (__v4sf)__m);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000876}
877
878static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000879_mm256_maskload_ps(float const *__p, __m256 __m)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000880{
David Blaikie3302f2b2013-01-16 23:08:36 +0000881 return (__m256)__builtin_ia32_maskloadps256((const __v8sf *)__p, (__v8sf)__m);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000882}
883
884/* Conditional store ops */
885static __inline void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000886_mm256_maskstore_ps(float *__p, __m256 __m, __m256 __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000887{
David Blaikie3302f2b2013-01-16 23:08:36 +0000888 __builtin_ia32_maskstoreps256((__v8sf *)__p, (__v8sf)__m, (__v8sf)__a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000889}
890
891static __inline void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000892_mm_maskstore_pd(double *__p, __m128d __m, __m128d __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000893{
David Blaikie3302f2b2013-01-16 23:08:36 +0000894 __builtin_ia32_maskstorepd((__v2df *)__p, (__v2df)__m, (__v2df)__a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000895}
896
897static __inline void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000898_mm256_maskstore_pd(double *__p, __m256d __m, __m256d __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000899{
David Blaikie3302f2b2013-01-16 23:08:36 +0000900 __builtin_ia32_maskstorepd256((__v4df *)__p, (__v4df)__m, (__v4df)__a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000901}
902
903static __inline void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000904_mm_maskstore_ps(float *__p, __m128 __m, __m128 __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000905{
David Blaikie3302f2b2013-01-16 23:08:36 +0000906 __builtin_ia32_maskstoreps((__v4sf *)__p, (__v4sf)__m, (__v4sf)__a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000907}
908
909/* Cacheability support ops */
910static __inline void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000911_mm256_stream_si256(__m256i *__a, __m256i __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000912{
David Blaikie3302f2b2013-01-16 23:08:36 +0000913 __builtin_ia32_movntdq256((__v4di *)__a, (__v4di)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000914}
915
916static __inline void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000917_mm256_stream_pd(double *__a, __m256d __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000918{
David Blaikie3302f2b2013-01-16 23:08:36 +0000919 __builtin_ia32_movntpd256(__a, (__v4df)__b);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000920}
921
922static __inline void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000923_mm256_stream_ps(float *__p, __m256 __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000924{
David Blaikie3302f2b2013-01-16 23:08:36 +0000925 __builtin_ia32_movntps256(__p, (__v8sf)__a);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000926}
927
928/* Create vectors */
929static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000930_mm256_set_pd(double __a, double __b, double __c, double __d)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000931{
David Blaikie3302f2b2013-01-16 23:08:36 +0000932 return (__m256d){ __d, __c, __b, __a };
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000933}
934
935static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000936_mm256_set_ps(float __a, float __b, float __c, float __d,
Craig Topper9fee8ab2015-01-31 06:33:59 +0000937 float __e, float __f, float __g, float __h)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000938{
David Blaikie3302f2b2013-01-16 23:08:36 +0000939 return (__m256){ __h, __g, __f, __e, __d, __c, __b, __a };
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000940}
941
942static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000943_mm256_set_epi32(int __i0, int __i1, int __i2, int __i3,
Craig Topper9fee8ab2015-01-31 06:33:59 +0000944 int __i4, int __i5, int __i6, int __i7)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000945{
David Blaikie3302f2b2013-01-16 23:08:36 +0000946 return (__m256i)(__v8si){ __i7, __i6, __i5, __i4, __i3, __i2, __i1, __i0 };
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000947}
948
949static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000950_mm256_set_epi16(short __w15, short __w14, short __w13, short __w12,
Craig Topper9fee8ab2015-01-31 06:33:59 +0000951 short __w11, short __w10, short __w09, short __w08,
952 short __w07, short __w06, short __w05, short __w04,
953 short __w03, short __w02, short __w01, short __w00)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000954{
David Blaikie3302f2b2013-01-16 23:08:36 +0000955 return (__m256i)(__v16hi){ __w00, __w01, __w02, __w03, __w04, __w05, __w06,
956 __w07, __w08, __w09, __w10, __w11, __w12, __w13, __w14, __w15 };
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000957}
958
959static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000960_mm256_set_epi8(char __b31, char __b30, char __b29, char __b28,
Craig Topper9fee8ab2015-01-31 06:33:59 +0000961 char __b27, char __b26, char __b25, char __b24,
962 char __b23, char __b22, char __b21, char __b20,
963 char __b19, char __b18, char __b17, char __b16,
964 char __b15, char __b14, char __b13, char __b12,
965 char __b11, char __b10, char __b09, char __b08,
966 char __b07, char __b06, char __b05, char __b04,
967 char __b03, char __b02, char __b01, char __b00)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000968{
969 return (__m256i)(__v32qi){
David Blaikie3302f2b2013-01-16 23:08:36 +0000970 __b00, __b01, __b02, __b03, __b04, __b05, __b06, __b07,
971 __b08, __b09, __b10, __b11, __b12, __b13, __b14, __b15,
972 __b16, __b17, __b18, __b19, __b20, __b21, __b22, __b23,
973 __b24, __b25, __b26, __b27, __b28, __b29, __b30, __b31
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000974 };
975}
976
977static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000978_mm256_set_epi64x(long long __a, long long __b, long long __c, long long __d)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000979{
David Blaikie3302f2b2013-01-16 23:08:36 +0000980 return (__m256i)(__v4di){ __d, __c, __b, __a };
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000981}
982
983/* Create vectors with elements in reverse order */
984static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000985_mm256_setr_pd(double __a, double __b, double __c, double __d)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000986{
David Blaikie3302f2b2013-01-16 23:08:36 +0000987 return (__m256d){ __a, __b, __c, __d };
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000988}
989
990static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000991_mm256_setr_ps(float __a, float __b, float __c, float __d,
Craig Topper9fee8ab2015-01-31 06:33:59 +0000992 float __e, float __f, float __g, float __h)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000993{
David Blaikie3302f2b2013-01-16 23:08:36 +0000994 return (__m256){ __a, __b, __c, __d, __e, __f, __g, __h };
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +0000995}
996
997static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +0000998_mm256_setr_epi32(int __i0, int __i1, int __i2, int __i3,
Craig Topper9fee8ab2015-01-31 06:33:59 +0000999 int __i4, int __i5, int __i6, int __i7)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001000{
David Blaikie3302f2b2013-01-16 23:08:36 +00001001 return (__m256i)(__v8si){ __i0, __i1, __i2, __i3, __i4, __i5, __i6, __i7 };
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001002}
1003
1004static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001005_mm256_setr_epi16(short __w15, short __w14, short __w13, short __w12,
Craig Topper9fee8ab2015-01-31 06:33:59 +00001006 short __w11, short __w10, short __w09, short __w08,
1007 short __w07, short __w06, short __w05, short __w04,
1008 short __w03, short __w02, short __w01, short __w00)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001009{
David Blaikie3302f2b2013-01-16 23:08:36 +00001010 return (__m256i)(__v16hi){ __w15, __w14, __w13, __w12, __w11, __w10, __w09,
1011 __w08, __w07, __w06, __w05, __w04, __w03, __w02, __w01, __w00 };
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001012}
1013
1014static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001015_mm256_setr_epi8(char __b31, char __b30, char __b29, char __b28,
Craig Topper9fee8ab2015-01-31 06:33:59 +00001016 char __b27, char __b26, char __b25, char __b24,
1017 char __b23, char __b22, char __b21, char __b20,
1018 char __b19, char __b18, char __b17, char __b16,
1019 char __b15, char __b14, char __b13, char __b12,
1020 char __b11, char __b10, char __b09, char __b08,
1021 char __b07, char __b06, char __b05, char __b04,
1022 char __b03, char __b02, char __b01, char __b00)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001023{
1024 return (__m256i)(__v32qi){
David Blaikie3302f2b2013-01-16 23:08:36 +00001025 __b31, __b30, __b29, __b28, __b27, __b26, __b25, __b24,
Craig Topper9fee8ab2015-01-31 06:33:59 +00001026 __b23, __b22, __b21, __b20, __b19, __b18, __b17, __b16,
1027 __b15, __b14, __b13, __b12, __b11, __b10, __b09, __b08,
1028 __b07, __b06, __b05, __b04, __b03, __b02, __b01, __b00 };
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001029}
1030
1031static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001032_mm256_setr_epi64x(long long __a, long long __b, long long __c, long long __d)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001033{
David Blaikie3302f2b2013-01-16 23:08:36 +00001034 return (__m256i)(__v4di){ __a, __b, __c, __d };
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001035}
1036
1037/* Create vectors with repeated elements */
1038static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001039_mm256_set1_pd(double __w)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001040{
David Blaikie3302f2b2013-01-16 23:08:36 +00001041 return (__m256d){ __w, __w, __w, __w };
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001042}
1043
1044static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001045_mm256_set1_ps(float __w)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001046{
David Blaikie3302f2b2013-01-16 23:08:36 +00001047 return (__m256){ __w, __w, __w, __w, __w, __w, __w, __w };
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001048}
1049
1050static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001051_mm256_set1_epi32(int __i)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001052{
David Blaikie3302f2b2013-01-16 23:08:36 +00001053 return (__m256i)(__v8si){ __i, __i, __i, __i, __i, __i, __i, __i };
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001054}
1055
1056static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001057_mm256_set1_epi16(short __w)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001058{
David Blaikie3302f2b2013-01-16 23:08:36 +00001059 return (__m256i)(__v16hi){ __w, __w, __w, __w, __w, __w, __w, __w, __w, __w,
1060 __w, __w, __w, __w, __w, __w };
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001061}
1062
1063static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001064_mm256_set1_epi8(char __b)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001065{
David Blaikie3302f2b2013-01-16 23:08:36 +00001066 return (__m256i)(__v32qi){ __b, __b, __b, __b, __b, __b, __b, __b, __b, __b,
1067 __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b,
1068 __b, __b, __b, __b, __b, __b, __b };
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001069}
1070
1071static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001072_mm256_set1_epi64x(long long __q)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001073{
David Blaikie3302f2b2013-01-16 23:08:36 +00001074 return (__m256i)(__v4di){ __q, __q, __q, __q };
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001075}
1076
David Blaikie3302f2b2013-01-16 23:08:36 +00001077/* Create __zeroed vectors */
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001078static __inline __m256d __attribute__((__always_inline__, __nodebug__))
1079_mm256_setzero_pd(void)
1080{
1081 return (__m256d){ 0, 0, 0, 0 };
1082}
1083
1084static __inline __m256 __attribute__((__always_inline__, __nodebug__))
1085_mm256_setzero_ps(void)
1086{
1087 return (__m256){ 0, 0, 0, 0, 0, 0, 0, 0 };
1088}
1089
1090static __inline __m256i __attribute__((__always_inline__, __nodebug__))
1091_mm256_setzero_si256(void)
1092{
1093 return (__m256i){ 0LL, 0LL, 0LL, 0LL };
1094}
1095
1096/* Cast between vector types */
1097static __inline __m256 __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001098_mm256_castpd_ps(__m256d __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001099{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001100 return (__m256)__a;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001101}
1102
1103static __inline __m256i __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001104_mm256_castpd_si256(__m256d __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001105{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001106 return (__m256i)__a;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001107}
1108
1109static __inline __m256d __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001110_mm256_castps_pd(__m256 __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001111{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001112 return (__m256d)__a;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001113}
1114
1115static __inline __m256i __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001116_mm256_castps_si256(__m256 __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001117{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001118 return (__m256i)__a;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001119}
1120
1121static __inline __m256 __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001122_mm256_castsi256_ps(__m256i __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001123{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001124 return (__m256)__a;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001125}
1126
1127static __inline __m256d __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001128_mm256_castsi256_pd(__m256i __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001129{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001130 return (__m256d)__a;
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001131}
1132
1133static __inline __m128d __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001134_mm256_castpd256_pd128(__m256d __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001135{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001136 return __builtin_shufflevector(__a, __a, 0, 1);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001137}
1138
1139static __inline __m128 __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001140_mm256_castps256_ps128(__m256 __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001141{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001142 return __builtin_shufflevector(__a, __a, 0, 1, 2, 3);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001143}
1144
1145static __inline __m128i __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001146_mm256_castsi256_si128(__m256i __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001147{
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001148 return __builtin_shufflevector(__a, __a, 0, 1);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001149}
1150
1151static __inline __m256d __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001152_mm256_castpd128_pd256(__m128d __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001153{
Craig Topperc5244512013-08-05 06:17:21 +00001154 return __builtin_shufflevector(__a, __a, 0, 1, -1, -1);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001155}
1156
1157static __inline __m256 __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001158_mm256_castps128_ps256(__m128 __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001159{
Craig Topperc5244512013-08-05 06:17:21 +00001160 return __builtin_shufflevector(__a, __a, 0, 1, 2, 3, -1, -1, -1, -1);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001161}
1162
1163static __inline __m256i __attribute__((__always_inline__, __nodebug__))
Reid Kleckner7ab75b32013-04-19 17:00:14 +00001164_mm256_castsi128_si256(__m128i __a)
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001165{
Craig Topperc5244512013-08-05 06:17:21 +00001166 return __builtin_shufflevector(__a, __a, 0, 1, -1, -1);
Bruno Cardoso Lopes7c4b5132010-08-04 22:03:36 +00001167}
Chad Rosierf8df4f42012-03-20 16:40:00 +00001168
1169/* SIMD load ops (unaligned) */
1170static __inline __m256 __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001171_mm256_loadu2_m128(float const *__addr_hi, float const *__addr_lo)
Chad Rosierf8df4f42012-03-20 16:40:00 +00001172{
1173 struct __loadu_ps {
David Blaikie3302f2b2013-01-16 23:08:36 +00001174 __m128 __v;
Chad Rosierf8df4f42012-03-20 16:40:00 +00001175 } __attribute__((__packed__, __may_alias__));
1176
David Blaikie3302f2b2013-01-16 23:08:36 +00001177 __m256 __v256 = _mm256_castps128_ps256(((struct __loadu_ps*)__addr_lo)->__v);
1178 return _mm256_insertf128_ps(__v256, ((struct __loadu_ps*)__addr_hi)->__v, 1);
Chad Rosierf8df4f42012-03-20 16:40:00 +00001179}
1180
1181static __inline __m256d __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001182_mm256_loadu2_m128d(double const *__addr_hi, double const *__addr_lo)
Chad Rosierf8df4f42012-03-20 16:40:00 +00001183{
1184 struct __loadu_pd {
David Blaikie3302f2b2013-01-16 23:08:36 +00001185 __m128d __v;
Chad Rosierf8df4f42012-03-20 16:40:00 +00001186 } __attribute__((__packed__, __may_alias__));
1187
David Blaikie3302f2b2013-01-16 23:08:36 +00001188 __m256d __v256 = _mm256_castpd128_pd256(((struct __loadu_pd*)__addr_lo)->__v);
1189 return _mm256_insertf128_pd(__v256, ((struct __loadu_pd*)__addr_hi)->__v, 1);
Chad Rosierf8df4f42012-03-20 16:40:00 +00001190}
1191
1192static __inline __m256i __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001193_mm256_loadu2_m128i(__m128i const *__addr_hi, __m128i const *__addr_lo)
Chad Rosierf8df4f42012-03-20 16:40:00 +00001194{
1195 struct __loadu_si128 {
David Blaikie3302f2b2013-01-16 23:08:36 +00001196 __m128i __v;
Chad Rosierf8df4f42012-03-20 16:40:00 +00001197 } __attribute__((packed, may_alias));
David Blaikie3302f2b2013-01-16 23:08:36 +00001198 __m256i __v256 = _mm256_castsi128_si256(
1199 ((struct __loadu_si128*)__addr_lo)->__v);
1200 return _mm256_insertf128_si256(__v256,
1201 ((struct __loadu_si128*)__addr_hi)->__v, 1);
Chad Rosierf8df4f42012-03-20 16:40:00 +00001202}
1203
1204/* SIMD store ops (unaligned) */
1205static __inline void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001206_mm256_storeu2_m128(float *__addr_hi, float *__addr_lo, __m256 __a)
Chad Rosierf8df4f42012-03-20 16:40:00 +00001207{
David Blaikie3302f2b2013-01-16 23:08:36 +00001208 __m128 __v128;
Chad Rosierf8df4f42012-03-20 16:40:00 +00001209
David Blaikie3302f2b2013-01-16 23:08:36 +00001210 __v128 = _mm256_castps256_ps128(__a);
1211 __builtin_ia32_storeups(__addr_lo, __v128);
1212 __v128 = _mm256_extractf128_ps(__a, 1);
1213 __builtin_ia32_storeups(__addr_hi, __v128);
Chad Rosierf8df4f42012-03-20 16:40:00 +00001214}
1215
1216static __inline void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001217_mm256_storeu2_m128d(double *__addr_hi, double *__addr_lo, __m256d __a)
Chad Rosierf8df4f42012-03-20 16:40:00 +00001218{
David Blaikie3302f2b2013-01-16 23:08:36 +00001219 __m128d __v128;
Chad Rosierf8df4f42012-03-20 16:40:00 +00001220
David Blaikie3302f2b2013-01-16 23:08:36 +00001221 __v128 = _mm256_castpd256_pd128(__a);
1222 __builtin_ia32_storeupd(__addr_lo, __v128);
1223 __v128 = _mm256_extractf128_pd(__a, 1);
1224 __builtin_ia32_storeupd(__addr_hi, __v128);
Chad Rosierf8df4f42012-03-20 16:40:00 +00001225}
1226
1227static __inline void __attribute__((__always_inline__, __nodebug__))
David Blaikie3302f2b2013-01-16 23:08:36 +00001228_mm256_storeu2_m128i(__m128i *__addr_hi, __m128i *__addr_lo, __m256i __a)
Chad Rosierf8df4f42012-03-20 16:40:00 +00001229{
David Blaikie3302f2b2013-01-16 23:08:36 +00001230 __m128i __v128;
Chad Rosierf8df4f42012-03-20 16:40:00 +00001231
David Blaikie3302f2b2013-01-16 23:08:36 +00001232 __v128 = _mm256_castsi256_si128(__a);
1233 __builtin_ia32_storedqu((char *)__addr_lo, (__v16qi)__v128);
1234 __v128 = _mm256_extractf128_si256(__a, 1);
1235 __builtin_ia32_storedqu((char *)__addr_hi, (__v16qi)__v128);
Chad Rosierf8df4f42012-03-20 16:40:00 +00001236}
Richard Smith49e56442013-07-14 05:41:45 +00001237
1238#endif /* __AVXINTRIN_H */