OSDN Git Service

PR target/51393
[pf3gnuchains/gcc-fork.git] / gcc / config / i386 / avxintrin.h
1 /* Copyright (C) 2008, 2009 Free Software Foundation, Inc.
2
3    This file is part of GCC.
4
5    GCC is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 3, or (at your option)
8    any later version.
9
10    GCC is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14
15    Under Section 7 of GPL version 3, you are granted additional
16    permissions described in the GCC Runtime Library Exception, version
17    3.1, as published by the Free Software Foundation.
18
19    You should have received a copy of the GNU General Public License and
20    a copy of the GCC Runtime Library Exception along with this program;
21    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
22    <http://www.gnu.org/licenses/>.  */
23
24 /* Implemented from the specification included in the Intel C++ Compiler
25    User Guide and Reference, version 11.0.  */
26
27 #ifndef _IMMINTRIN_H_INCLUDED
28 # error "Never use <avxintrin.h> directly; include <immintrin.h> instead."
29 #endif
30
31 /* Internal data types for implementing the intrinsics.  */
32 typedef double __v4df __attribute__ ((__vector_size__ (32)));
33 typedef float __v8sf __attribute__ ((__vector_size__ (32)));
34 typedef long long __v4di __attribute__ ((__vector_size__ (32)));
35 typedef int __v8si __attribute__ ((__vector_size__ (32)));
36 typedef short __v16hi __attribute__ ((__vector_size__ (32)));
37 typedef char __v32qi __attribute__ ((__vector_size__ (32)));
38
39 /* The Intel API is flexible enough that we must allow aliasing with other
40    vector types, and their scalar components.  */
41 typedef float __m256 __attribute__ ((__vector_size__ (32),
42                                      __may_alias__));
43 typedef long long __m256i __attribute__ ((__vector_size__ (32),
44                                           __may_alias__));
45 typedef double __m256d __attribute__ ((__vector_size__ (32),
46                                        __may_alias__));
47
48 /* Compare predicates for scalar and packed compare intrinsics.  */
49
50 /* Equal (ordered, non-signaling)  */
51 #define _CMP_EQ_OQ      0x00
52 /* Less-than (ordered, signaling)  */
53 #define _CMP_LT_OS      0x01
54 /* Less-than-or-equal (ordered, signaling)  */
55 #define _CMP_LE_OS      0x02
56 /* Unordered (non-signaling)  */
57 #define _CMP_UNORD_Q    0x03
58 /* Not-equal (unordered, non-signaling)  */
59 #define _CMP_NEQ_UQ     0x04
60 /* Not-less-than (unordered, signaling)  */
61 #define _CMP_NLT_US     0x05
62 /* Not-less-than-or-equal (unordered, signaling)  */
63 #define _CMP_NLE_US     0x06
64 /* Ordered (nonsignaling)   */
65 #define _CMP_ORD_Q      0x07
66 /* Equal (unordered, non-signaling)  */
67 #define _CMP_EQ_UQ      0x08
68 /* Not-greater-than-or-equal (unordered, signaling)  */
69 #define _CMP_NGE_US     0x09
70 /* Not-greater-than (unordered, signaling)  */
71 #define _CMP_NGT_US     0x0a
72 /* False (ordered, non-signaling)  */
73 #define _CMP_FALSE_OQ   0x0b
74 /* Not-equal (ordered, non-signaling)  */
75 #define _CMP_NEQ_OQ     0x0c
76 /* Greater-than-or-equal (ordered, signaling)  */
77 #define _CMP_GE_OS      0x0d
78 /* Greater-than (ordered, signaling)  */
79 #define _CMP_GT_OS      0x0e
80 /* True (unordered, non-signaling)  */
81 #define _CMP_TRUE_UQ    0x0f
82 /* Equal (ordered, signaling)  */
83 #define _CMP_EQ_OS      0x10
84 /* Less-than (ordered, non-signaling)  */
85 #define _CMP_LT_OQ      0x11
86 /* Less-than-or-equal (ordered, non-signaling)  */
87 #define _CMP_LE_OQ      0x12
88 /* Unordered (signaling)  */
89 #define _CMP_UNORD_S    0x13
90 /* Not-equal (unordered, signaling)  */
91 #define _CMP_NEQ_US     0x14
92 /* Not-less-than (unordered, non-signaling)  */
93 #define _CMP_NLT_UQ     0x15
94 /* Not-less-than-or-equal (unordered, non-signaling)  */
95 #define _CMP_NLE_UQ     0x16
96 /* Ordered (signaling)  */
97 #define _CMP_ORD_S      0x17
98 /* Equal (unordered, signaling)  */
99 #define _CMP_EQ_US      0x18
100 /* Not-greater-than-or-equal (unordered, non-signaling)  */
101 #define _CMP_NGE_UQ     0x19
102 /* Not-greater-than (unordered, non-signaling)  */
103 #define _CMP_NGT_UQ     0x1a
104 /* False (ordered, signaling)  */
105 #define _CMP_FALSE_OS   0x1b
106 /* Not-equal (ordered, signaling)  */
107 #define _CMP_NEQ_OS     0x1c
108 /* Greater-than-or-equal (ordered, non-signaling)  */
109 #define _CMP_GE_OQ      0x1d
110 /* Greater-than (ordered, non-signaling)  */
111 #define _CMP_GT_OQ      0x1e
112 /* True (unordered, signaling)  */
113 #define _CMP_TRUE_US    0x1f
114
115 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
116 _mm256_add_pd (__m256d __A, __m256d __B)
117 {
118   return (__m256d) __builtin_ia32_addpd256 ((__v4df)__A, (__v4df)__B);
119 }
120
121 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
122 _mm256_add_ps (__m256 __A, __m256 __B)
123 {
124   return (__m256) __builtin_ia32_addps256 ((__v8sf)__A, (__v8sf)__B);
125 }
126
127 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
128 _mm256_addsub_pd (__m256d __A, __m256d __B)
129 {
130   return (__m256d) __builtin_ia32_addsubpd256 ((__v4df)__A, (__v4df)__B);
131 }
132
133 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
134 _mm256_addsub_ps (__m256 __A, __m256 __B)
135 {
136   return (__m256) __builtin_ia32_addsubps256 ((__v8sf)__A, (__v8sf)__B);
137 }
138
139
140 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
141 _mm256_and_pd (__m256d __A, __m256d __B)
142 {
143   return (__m256d) __builtin_ia32_andpd256 ((__v4df)__A, (__v4df)__B);
144 }
145
146 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
147 _mm256_and_ps (__m256 __A, __m256 __B)
148 {
149   return (__m256) __builtin_ia32_andps256 ((__v8sf)__A, (__v8sf)__B);
150 }
151
152 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
153 _mm256_andnot_pd (__m256d __A, __m256d __B)
154 {
155   return (__m256d) __builtin_ia32_andnpd256 ((__v4df)__A, (__v4df)__B);
156 }
157
158 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
159 _mm256_andnot_ps (__m256 __A, __m256 __B)
160 {
161   return (__m256) __builtin_ia32_andnps256 ((__v8sf)__A, (__v8sf)__B);
162 }
163
164 /* Double/single precision floating point blend instructions - select
165    data from 2 sources using constant/variable mask.  */
166
167 #ifdef __OPTIMIZE__
168 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
169 _mm256_blend_pd (__m256d __X, __m256d __Y, const int __M)
170 {
171   return (__m256d) __builtin_ia32_blendpd256 ((__v4df)__X,
172                                               (__v4df)__Y,
173                                               __M);
174 }
175
176 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
177 _mm256_blend_ps (__m256 __X, __m256 __Y, const int __M)
178 {
179   return (__m256) __builtin_ia32_blendps256 ((__v8sf)__X,
180                                              (__v8sf)__Y,
181                                              __M);
182 }
183 #else
184 #define _mm256_blend_pd(X, Y, M)                                        \
185   ((__m256d) __builtin_ia32_blendpd256 ((__v4df)(__m256d)(X),           \
186                                         (__v4df)(__m256d)(Y), (int)(M)))
187
188 #define _mm256_blend_ps(X, Y, M)                                        \
189   ((__m256) __builtin_ia32_blendps256 ((__v8sf)(__m256)(X),             \
190                                        (__v8sf)(__m256)(Y), (int)(M)))
191 #endif
192
193 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
194 _mm256_blendv_pd (__m256d __X, __m256d __Y, __m256d __M)
195 {
196   return (__m256d) __builtin_ia32_blendvpd256 ((__v4df)__X,
197                                                (__v4df)__Y,
198                                                (__v4df)__M);
199 }
200
201 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
202 _mm256_blendv_ps (__m256 __X, __m256 __Y, __m256 __M)
203 {
204   return (__m256) __builtin_ia32_blendvps256 ((__v8sf)__X,
205                                               (__v8sf)__Y,
206                                               (__v8sf)__M);
207 }
208
209 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
210 _mm256_div_pd (__m256d __A, __m256d __B)
211 {
212   return (__m256d) __builtin_ia32_divpd256 ((__v4df)__A, (__v4df)__B);
213 }
214
215 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
216 _mm256_div_ps (__m256 __A, __m256 __B)
217 {
218   return (__m256) __builtin_ia32_divps256 ((__v8sf)__A, (__v8sf)__B);
219 }
220
221 /* Dot product instructions with mask-defined summing and zeroing parts
222    of result.  */
223
224 #ifdef __OPTIMIZE__
225 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
226 _mm256_dp_ps (__m256 __X, __m256 __Y, const int __M)
227 {
228   return (__m256) __builtin_ia32_dpps256 ((__v8sf)__X,
229                                           (__v8sf)__Y,
230                                           __M);
231 }
232 #else
233 #define _mm256_dp_ps(X, Y, M)                                           \
234   ((__m256) __builtin_ia32_dpps256 ((__v8sf)(__m256)(X),                \
235                                     (__v8sf)(__m256)(Y), (int)(M)))
236 #endif
237
238 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
239 _mm256_hadd_pd (__m256d __X, __m256d __Y)
240 {
241   return (__m256d) __builtin_ia32_haddpd256 ((__v4df)__X, (__v4df)__Y);
242 }
243
244 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
245 _mm256_hadd_ps (__m256 __X, __m256 __Y)
246 {
247   return (__m256) __builtin_ia32_haddps256 ((__v8sf)__X, (__v8sf)__Y);
248 }
249
250 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
251 _mm256_hsub_pd (__m256d __X, __m256d __Y)
252 {
253   return (__m256d) __builtin_ia32_hsubpd256 ((__v4df)__X, (__v4df)__Y);
254 }
255
256 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
257 _mm256_hsub_ps (__m256 __X, __m256 __Y)
258 {
259   return (__m256) __builtin_ia32_hsubps256 ((__v8sf)__X, (__v8sf)__Y);
260 }
261
262 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
263 _mm256_max_pd (__m256d __A, __m256d __B)
264 {
265   return (__m256d) __builtin_ia32_maxpd256 ((__v4df)__A, (__v4df)__B);
266 }
267
268 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
269 _mm256_max_ps (__m256 __A, __m256 __B)
270 {
271   return (__m256) __builtin_ia32_maxps256 ((__v8sf)__A, (__v8sf)__B);
272 }
273
274 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
275 _mm256_min_pd (__m256d __A, __m256d __B)
276 {
277   return (__m256d) __builtin_ia32_minpd256 ((__v4df)__A, (__v4df)__B);
278 }
279
280 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
281 _mm256_min_ps (__m256 __A, __m256 __B)
282 {
283   return (__m256) __builtin_ia32_minps256 ((__v8sf)__A, (__v8sf)__B);
284 }
285
286 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
287 _mm256_mul_pd (__m256d __A, __m256d __B)
288 {
289   return (__m256d) __builtin_ia32_mulpd256 ((__v4df)__A, (__v4df)__B);
290 }
291
292 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
293 _mm256_mul_ps (__m256 __A, __m256 __B)
294 {
295   return (__m256) __builtin_ia32_mulps256 ((__v8sf)__A, (__v8sf)__B);
296 }
297
298 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
299 _mm256_or_pd (__m256d __A, __m256d __B)
300 {
301   return (__m256d) __builtin_ia32_orpd256 ((__v4df)__A, (__v4df)__B);
302 }
303
304 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
305 _mm256_or_ps (__m256 __A, __m256 __B)
306 {
307   return (__m256) __builtin_ia32_orps256 ((__v8sf)__A, (__v8sf)__B);
308 }
309
310 #ifdef __OPTIMIZE__
311 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
312 _mm256_shuffle_pd (__m256d __A, __m256d __B, const int __mask)
313 {
314   return (__m256d) __builtin_ia32_shufpd256 ((__v4df)__A, (__v4df)__B,
315                                              __mask);
316 }
317
318 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
319 _mm256_shuffle_ps (__m256 __A, __m256 __B, const int __mask)
320 {
321   return (__m256) __builtin_ia32_shufps256 ((__v8sf)__A, (__v8sf)__B,
322                                             __mask);
323 }
324 #else
325 #define _mm256_shuffle_pd(A, B, N)                                      \
326   ((__m256d)__builtin_ia32_shufpd256 ((__v4df)(__m256d)(A),             \
327                                       (__v4df)(__m256d)(B), (int)(N)))
328
329 #define _mm256_shuffle_ps(A, B, N)                                      \
330   ((__m256) __builtin_ia32_shufps256 ((__v8sf)(__m256)(A),              \
331                                       (__v8sf)(__m256)(B), (int)(N)))
332 #endif
333
334 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
335 _mm256_sub_pd (__m256d __A, __m256d __B)
336 {
337   return (__m256d) __builtin_ia32_subpd256 ((__v4df)__A, (__v4df)__B);
338 }
339
340 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
341 _mm256_sub_ps (__m256 __A, __m256 __B)
342 {
343   return (__m256) __builtin_ia32_subps256 ((__v8sf)__A, (__v8sf)__B);
344 }
345
346 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
347 _mm256_xor_pd (__m256d __A, __m256d __B)
348 {
349   return (__m256d) __builtin_ia32_xorpd256 ((__v4df)__A, (__v4df)__B);
350 }
351
352 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
353 _mm256_xor_ps (__m256 __A, __m256 __B)
354 {
355   return (__m256) __builtin_ia32_xorps256 ((__v8sf)__A, (__v8sf)__B);
356 }
357
358 #ifdef __OPTIMIZE__
359 extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
360 _mm_cmp_pd (__m128d __X, __m128d __Y, const int __P)
361 {
362   return (__m128d) __builtin_ia32_cmppd ((__v2df)__X, (__v2df)__Y, __P);
363 }
364
365 extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
366 _mm_cmp_ps (__m128 __X, __m128 __Y, const int __P)
367 {
368   return (__m128) __builtin_ia32_cmpps ((__v4sf)__X, (__v4sf)__Y, __P);
369 }
370
371 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
372 _mm256_cmp_pd (__m256d __X, __m256d __Y, const int __P)
373 {
374   return (__m256d) __builtin_ia32_cmppd256 ((__v4df)__X, (__v4df)__Y,
375                                             __P);
376 }
377
378 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
379 _mm256_cmp_ps (__m256 __X, __m256 __Y, const int __P)
380 {
381   return (__m256) __builtin_ia32_cmpps256 ((__v8sf)__X, (__v8sf)__Y,
382                                            __P);
383 }
384
385 extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
386 _mm_cmp_sd (__m128d __X, __m128d __Y, const int __P)
387 {
388   return (__m128d) __builtin_ia32_cmpsd ((__v2df)__X, (__v2df)__Y, __P);
389 }
390
391 extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
392 _mm_cmp_ss (__m128 __X, __m128 __Y, const int __P)
393 {
394   return (__m128) __builtin_ia32_cmpss ((__v4sf)__X, (__v4sf)__Y, __P);
395 }
396 #else
397 #define _mm_cmp_pd(X, Y, P)                                             \
398   ((__m128d) __builtin_ia32_cmppd ((__v2df)(__m128d)(X),                \
399                                    (__v2df)(__m128d)(Y), (int)(P)))
400
401 #define _mm_cmp_ps(X, Y, P)                                             \
402   ((__m128) __builtin_ia32_cmpps ((__v4sf)(__m128)(X),                  \
403                                   (__v4sf)(__m128)(Y), (int)(P)))
404
405 #define _mm256_cmp_pd(X, Y, P)                                          \
406   ((__m256d) __builtin_ia32_cmppd256 ((__v4df)(__m256d)(X),             \
407                                       (__v4df)(__m256d)(Y), (int)(P)))
408
409 #define _mm256_cmp_ps(X, Y, P)                                          \
410   ((__m256) __builtin_ia32_cmpps256 ((__v8sf)(__m256)(X),               \
411                                      (__v8sf)(__m256)(Y), (int)(P)))
412
413 #define _mm_cmp_sd(X, Y, P)                                             \
414   ((__m128d) __builtin_ia32_cmpsd ((__v2df)(__m128d)(X),                \
415                                    (__v2df)(__m128d)(Y), (int)(P)))
416
417 #define _mm_cmp_ss(X, Y, P)                                             \
418   ((__m128) __builtin_ia32_cmpss ((__v4sf)(__m128)(X),                  \
419                                   (__v4sf)(__m128)(Y), (int)(P)))
420 #endif
421
422 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
423 _mm256_cvtepi32_pd (__m128i __A)
424 {
425   return (__m256d)__builtin_ia32_cvtdq2pd256 ((__v4si) __A);
426 }
427
428 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
429 _mm256_cvtepi32_ps (__m256i __A)
430 {
431   return (__m256)__builtin_ia32_cvtdq2ps256 ((__v8si) __A);
432 }
433
434 extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
435 _mm256_cvtpd_ps (__m256d __A)
436 {
437   return (__m128)__builtin_ia32_cvtpd2ps256 ((__v4df) __A);
438 }
439
440 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
441 _mm256_cvtps_epi32 (__m256 __A)
442 {
443   return (__m256i)__builtin_ia32_cvtps2dq256 ((__v8sf) __A);
444 }
445
446 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
447 _mm256_cvtps_pd (__m128 __A)
448 {
449   return (__m256d)__builtin_ia32_cvtps2pd256 ((__v4sf) __A);
450 }
451
452 extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
453 _mm256_cvttpd_epi32 (__m256d __A)
454 {
455   return (__m128i)__builtin_ia32_cvttpd2dq256 ((__v4df) __A);
456 }
457
458 extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
459 _mm256_cvtpd_epi32 (__m256d __A)
460 {
461   return (__m128i)__builtin_ia32_cvtpd2dq256 ((__v4df) __A);
462 }
463
464 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
465 _mm256_cvttps_epi32 (__m256 __A)
466 {
467   return (__m256i)__builtin_ia32_cvttps2dq256 ((__v8sf) __A);
468 }
469
470 #ifdef __OPTIMIZE__
471 extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
472 _mm256_extractf128_pd (__m256d __X, const int __N)
473 {
474   return (__m128d) __builtin_ia32_vextractf128_pd256 ((__v4df)__X, __N);
475 }
476
477 extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
478 _mm256_extractf128_ps (__m256 __X, const int __N)
479 {
480   return (__m128) __builtin_ia32_vextractf128_ps256 ((__v8sf)__X, __N);
481 }
482
483 extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
484 _mm256_extractf128_si256 (__m256i __X, const int __N)
485 {
486   return (__m128i) __builtin_ia32_vextractf128_si256 ((__v8si)__X, __N);
487 }
488
489 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
490 _mm256_extract_epi32 (__m256i __X, int const __N)
491 {
492   __m128i __Y = _mm256_extractf128_si256 (__X, __N >> 2);
493   return _mm_extract_epi32 (__Y, __N % 4);
494 }
495
496 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
497 _mm256_extract_epi16 (__m256i __X, int const __N)
498 {
499   __m128i __Y = _mm256_extractf128_si256 (__X, __N >> 3);
500   return _mm_extract_epi16 (__Y, __N % 8);
501 }
502
503 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
504 _mm256_extract_epi8 (__m256i __X, int const __N)
505 {
506   __m128i __Y = _mm256_extractf128_si256 (__X, __N >> 4);
507   return _mm_extract_epi8 (__Y, __N % 16);
508 }
509
510 #ifdef __x86_64__
511 extern __inline long long  __attribute__((__gnu_inline__, __always_inline__, __artificial__))
512 _mm256_extract_epi64 (__m256i __X, const int __N)
513 {
514   __m128i __Y = _mm256_extractf128_si256 (__X, __N >> 1);
515   return _mm_extract_epi64 (__Y, __N % 2);
516 }
517 #endif
518 #else
519 #define _mm256_extractf128_pd(X, N)                                     \
520   ((__m128d) __builtin_ia32_vextractf128_pd256 ((__v4df)(__m256d)(X),   \
521                                                 (int)(N)))
522
523 #define _mm256_extractf128_ps(X, N)                                     \
524   ((__m128) __builtin_ia32_vextractf128_ps256 ((__v8sf)(__m256)(X),     \
525                                                (int)(N)))
526
527 #define _mm256_extractf128_si256(X, N)                                  \
528   ((__m128i) __builtin_ia32_vextractf128_si256 ((__v8si)(__m256i)(X),   \
529                                                 (int)(N)))
530
531 #define _mm256_extract_epi32(X, N)                                      \
532   (__extension__                                                        \
533    ({                                                                   \
534       __m128i __Y = _mm256_extractf128_si256 ((X), (N) >> 2);           \
535       _mm_extract_epi32 (__Y, (N) % 4);                                 \
536     }))
537
538 #define _mm256_extract_epi16(X, N)                                      \
539   (__extension__                                                        \
540    ({                                                                   \
541       __m128i __Y = _mm256_extractf128_si256 ((X), (N) >> 3);           \
542       _mm_extract_epi16 (__Y, (N) % 8);                                 \
543     }))
544
545 #define _mm256_extract_epi8(X, N)                                       \
546   (__extension__                                                        \
547    ({                                                                   \
548       __m128i __Y = _mm256_extractf128_si256 ((X), (N) >> 4);           \
549       _mm_extract_epi8 (__Y, (N) % 16);                                 \
550     }))
551
552 #ifdef __x86_64__
553 #define _mm256_extract_epi64(X, N)                                      \
554   (__extension__                                                        \
555    ({                                                                   \
556       __m128i __Y = _mm256_extractf128_si256 ((X), (N) >> 1);           \
557       _mm_extract_epi64 (__Y, (N) % 2);                                 \
558     }))
559 #endif
560 #endif
561
562 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
563 _mm256_zeroall (void)
564 {
565   __builtin_ia32_vzeroall ();
566 }
567
568 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
569 _mm256_zeroupper (void)
570 {
571   __builtin_ia32_vzeroupper ();
572 }
573
574 extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
575 _mm_permutevar_pd (__m128d __A, __m128i __C)
576 {
577   return (__m128d) __builtin_ia32_vpermilvarpd ((__v2df)__A,
578                                                 (__v2di)__C);
579 }
580
581 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
582 _mm256_permutevar_pd (__m256d __A, __m256i __C)
583 {
584   return (__m256d) __builtin_ia32_vpermilvarpd256 ((__v4df)__A,
585                                                    (__v4di)__C);
586 }
587
588 extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
589 _mm_permutevar_ps (__m128 __A, __m128i __C)
590 {
591   return (__m128) __builtin_ia32_vpermilvarps ((__v4sf)__A,
592                                                (__v4si)__C);
593 }
594
595 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
596 _mm256_permutevar_ps (__m256 __A, __m256i __C)
597 {
598   return (__m256) __builtin_ia32_vpermilvarps256 ((__v8sf)__A,
599                                                   (__v8si)__C);
600 }
601
602 #ifdef __OPTIMIZE__
603 extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
604 _mm_permute_pd (__m128d __X, const int __C)
605 {
606   return (__m128d) __builtin_ia32_vpermilpd ((__v2df)__X, __C);
607 }
608
609 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
610 _mm256_permute_pd (__m256d __X, const int __C)
611 {
612   return (__m256d) __builtin_ia32_vpermilpd256 ((__v4df)__X, __C);
613 }
614
615 extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
616 _mm_permute_ps (__m128 __X, const int __C)
617 {
618   return (__m128) __builtin_ia32_vpermilps ((__v4sf)__X, __C);
619 }
620
621 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
622 _mm256_permute_ps (__m256 __X, const int __C)
623 {
624   return (__m256) __builtin_ia32_vpermilps256 ((__v8sf)__X, __C);
625 }
626 #else
627 #define _mm_permute_pd(X, C)                                            \
628   ((__m128d) __builtin_ia32_vpermilpd ((__v2df)(__m128d)(X), (int)(C)))
629
630 #define _mm256_permute_pd(X, C)                                         \
631   ((__m256d) __builtin_ia32_vpermilpd256 ((__v4df)(__m256d)(X), (int)(C)))
632
633 #define _mm_permute_ps(X, C)                                            \
634   ((__m128) __builtin_ia32_vpermilps ((__v4sf)(__m128)(X), (int)(C)))
635
636 #define _mm256_permute_ps(X, C)                                         \
637   ((__m256) __builtin_ia32_vpermilps256 ((__v8sf)(__m256)(X), (int)(C)))
638 #endif
639
640 #ifdef __OPTIMIZE__
641 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
642 _mm256_permute2f128_pd (__m256d __X, __m256d __Y, const int __C)
643 {
644   return (__m256d) __builtin_ia32_vperm2f128_pd256 ((__v4df)__X,
645                                                     (__v4df)__Y,
646                                                     __C);
647 }
648
649 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
650 _mm256_permute2f128_ps (__m256 __X, __m256 __Y, const int __C)
651 {
652   return (__m256) __builtin_ia32_vperm2f128_ps256 ((__v8sf)__X,
653                                                    (__v8sf)__Y,
654                                                    __C);
655 }
656
657 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
658 _mm256_permute2f128_si256 (__m256i __X, __m256i __Y, const int __C)
659 {
660   return (__m256i) __builtin_ia32_vperm2f128_si256 ((__v8si)__X,
661                                                     (__v8si)__Y,
662                                                     __C);
663 }
664 #else
665 #define _mm256_permute2f128_pd(X, Y, C)                                 \
666   ((__m256d) __builtin_ia32_vperm2f128_pd256 ((__v4df)(__m256d)(X),     \
667                                               (__v4df)(__m256d)(Y),     \
668                                               (int)(C)))
669
670 #define _mm256_permute2f128_ps(X, Y, C)                                 \
671   ((__m256) __builtin_ia32_vperm2f128_ps256 ((__v8sf)(__m256)(X),       \
672                                              (__v8sf)(__m256)(Y),       \
673                                              (int)(C)))
674
675 #define _mm256_permute2f128_si256(X, Y, C)                              \
676   ((__m256i) __builtin_ia32_vperm2f128_si256 ((__v8si)(__m256i)(X),     \
677                                               (__v8si)(__m256i)(Y),     \
678                                               (int)(C)))
679 #endif
680
681 extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
682 _mm_broadcast_ss (float const *__X)
683 {
684   return (__m128) __builtin_ia32_vbroadcastss (__X);
685 }
686
687 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
688 _mm256_broadcast_sd (double const *__X)
689 {
690   return (__m256d) __builtin_ia32_vbroadcastsd256 (__X);
691 }
692
693 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
694 _mm256_broadcast_ss (float const *__X)
695 {
696   return (__m256) __builtin_ia32_vbroadcastss256 (__X);
697 }
698
699 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
700 _mm256_broadcast_pd (__m128d const *__X)
701 {
702   return (__m256d) __builtin_ia32_vbroadcastf128_pd256 (__X);
703 }
704
705 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
706 _mm256_broadcast_ps (__m128 const *__X)
707 {
708   return (__m256) __builtin_ia32_vbroadcastf128_ps256 (__X);
709 }
710
711 #ifdef __OPTIMIZE__
712 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
713 _mm256_insertf128_pd (__m256d __X, __m128d __Y, const int __O)
714 {
715   return (__m256d) __builtin_ia32_vinsertf128_pd256 ((__v4df)__X,
716                                                      (__v2df)__Y,
717                                                      __O);
718 }
719
720 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
721 _mm256_insertf128_ps (__m256 __X, __m128 __Y, const int __O)
722 {
723   return (__m256) __builtin_ia32_vinsertf128_ps256 ((__v8sf)__X,
724                                                     (__v4sf)__Y,
725                                                     __O);
726 }
727
728 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
729 _mm256_insertf128_si256 (__m256i __X, __m128i __Y, const int __O)
730 {
731   return (__m256i) __builtin_ia32_vinsertf128_si256 ((__v8si)__X,
732                                                      (__v4si)__Y,
733                                                      __O);
734 }
735
736 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
737 _mm256_insert_epi32 (__m256i __X, int __D, int const __N)
738 {
739   __m128i __Y = _mm256_extractf128_si256 (__X, __N >> 2);
740   __Y = _mm_insert_epi32 (__Y, __D, __N % 4);
741   return _mm256_insertf128_si256 (__X, __Y, __N >> 2);
742 }
743
744 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
745 _mm256_insert_epi16 (__m256i __X, int __D, int const __N)
746 {
747   __m128i __Y = _mm256_extractf128_si256 (__X, __N >> 3);
748   __Y = _mm_insert_epi16 (__Y, __D, __N % 8);
749   return _mm256_insertf128_si256 (__X, __Y, __N >> 3);
750 }
751
752 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
753 _mm256_insert_epi8 (__m256i __X, int __D, int const __N)
754 {
755   __m128i __Y = _mm256_extractf128_si256 (__X, __N >> 4);
756   __Y = _mm_insert_epi8 (__Y, __D, __N % 16);
757   return _mm256_insertf128_si256 (__X, __Y, __N >> 4);
758 }
759
760 #ifdef __x86_64__
761 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
762 _mm256_insert_epi64 (__m256i __X, long long __D, int const __N)
763 {
764   __m128i __Y = _mm256_extractf128_si256 (__X, __N >> 1);
765   __Y = _mm_insert_epi64 (__Y, __D, __N % 2);
766   return _mm256_insertf128_si256 (__X, __Y, __N >> 1);
767 }
768 #endif
769 #else
770 #define _mm256_insertf128_pd(X, Y, O)                                   \
771   ((__m256d) __builtin_ia32_vinsertf128_pd256 ((__v4df)(__m256d)(X),    \
772                                                (__v2df)(__m128d)(Y),    \
773                                                (int)(O)))
774
775 #define _mm256_insertf128_ps(X, Y, O)                                   \
776   ((__m256) __builtin_ia32_vinsertf128_ps256 ((__v8sf)(__m256)(X),      \
777                                               (__v4sf)(__m128)(Y),      \
778                                               (int)(O)))
779
780 #define _mm256_insertf128_si256(X, Y, O)                                \
781   ((__m256i) __builtin_ia32_vinsertf128_si256 ((__v8si)(__m256i)(X),    \
782                                                (__v4si)(__m128i)(Y),    \
783                                                (int)(O)))
784
785 #define _mm256_insert_epi32(X, D, N)                                    \
786   (__extension__                                                        \
787    ({                                                                   \
788       __m128i __Y = _mm256_extractf128_si256 ((X), (N) >> 2);           \
789       __Y = _mm_insert_epi32 (__Y, (D), (N) % 4);                       \
790       _mm256_insertf128_si256 ((X), __Y, (N) >> 2);                     \
791     }))
792
793 #define _mm256_insert_epi16(X, D, N)                                    \
794   (__extension__                                                        \
795    ({                                                                   \
796       __m128i __Y = _mm256_extractf128_si256 ((X), (N) >> 3);           \
797       __Y = _mm_insert_epi16 (__Y, (D), (N) % 8);                       \
798       _mm256_insertf128_si256 ((X), __Y, (N) >> 3);                     \
799     }))
800
801 #define _mm256_insert_epi8(X, D, N)                                     \
802   (__extension__                                                        \
803    ({                                                                   \
804       __m128i __Y = _mm256_extractf128_si256 ((X), (N) >> 4);           \
805       __Y = _mm_insert_epi8 (__Y, (D), (N) % 16);                       \
806       _mm256_insertf128_si256 ((X), __Y, (N) >> 4);                     \
807     }))
808
809 #ifdef __x86_64__
810 #define _mm256_insert_epi64(X, D, N)                                    \
811   (__extension__                                                        \
812    ({                                                                   \
813       __m128i __Y = _mm256_extractf128_si256 ((X), (N) >> 1);           \
814       __Y = _mm_insert_epi64 (__Y, (D), (N) % 2);                       \
815       _mm256_insertf128_si256 ((X), __Y, (N) >> 1);                     \
816     }))
817 #endif
818 #endif
819
820 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
821 _mm256_load_pd (double const *__P)
822 {
823   return *(__m256d *)__P;
824 }
825
826 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
827 _mm256_store_pd (double *__P, __m256d __A)
828 {
829   *(__m256d *)__P = __A;
830 }
831
832 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
833 _mm256_load_ps (float const *__P)
834 {
835   return *(__m256 *)__P;
836 }
837
838 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
839 _mm256_store_ps (float *__P, __m256 __A)
840 {
841   *(__m256 *)__P = __A;
842 }
843
844 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
845 _mm256_loadu_pd (double const *__P)
846 {
847   return (__m256d) __builtin_ia32_loadupd256 (__P);
848 }
849
850 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
851 _mm256_storeu_pd (double *__P, __m256d __A)
852 {
853   __builtin_ia32_storeupd256 (__P, (__v4df)__A);
854 }
855
856 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
857 _mm256_loadu_ps (float const *__P)
858 {
859   return (__m256) __builtin_ia32_loadups256 (__P);
860 }
861
862 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
863 _mm256_storeu_ps (float *__P, __m256 __A)
864 {
865   __builtin_ia32_storeups256 (__P, (__v8sf)__A);
866 }
867
868 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
869 _mm256_load_si256 (__m256i const *__P)
870 {
871   return *__P;
872 }
873
874 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
875 _mm256_store_si256 (__m256i *__P, __m256i __A)
876 {
877   *__P = __A;
878 }
879
880 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
881 _mm256_loadu_si256 (__m256i const *__P)
882 {
883   return (__m256i) __builtin_ia32_loaddqu256 ((char const *)__P);
884 }
885
886 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
887 _mm256_storeu_si256 (__m256i *__P, __m256i __A)
888 {
889   __builtin_ia32_storedqu256 ((char *)__P, (__v32qi)__A);
890 }
891
892 extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
893 _mm_maskload_pd (double const *__P, __m128i __M)
894 {
895   return (__m128d) __builtin_ia32_maskloadpd ((const __v2df *)__P,
896                                               (__v2di)__M);
897 }
898
899 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
900 _mm_maskstore_pd (double *__P, __m128i __M, __m128d __A)
901 {
902   __builtin_ia32_maskstorepd ((__v2df *)__P, (__v2di)__M, (__v2df)__A);
903 }
904
905 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
906 _mm256_maskload_pd (double const *__P, __m256i __M)
907 {
908   return (__m256d) __builtin_ia32_maskloadpd256 ((const __v4df *)__P,
909                                                  (__v4di)__M);
910 }
911
912 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
913 _mm256_maskstore_pd (double *__P, __m256i __M, __m256d __A)
914 {
915   __builtin_ia32_maskstorepd256 ((__v4df *)__P, (__v4di)__M, (__v4df)__A);
916 }
917
918 extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
919 _mm_maskload_ps (float const *__P, __m128i __M)
920 {
921   return (__m128) __builtin_ia32_maskloadps ((const __v4sf *)__P,
922                                              (__v4si)__M);
923 }
924
925 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
926 _mm_maskstore_ps (float *__P, __m128i __M, __m128 __A)
927 {
928   __builtin_ia32_maskstoreps ((__v4sf *)__P, (__v4si)__M, (__v4sf)__A);
929 }
930
931 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
932 _mm256_maskload_ps (float const *__P, __m256i __M)
933 {
934   return (__m256) __builtin_ia32_maskloadps256 ((const __v8sf *)__P,
935                                                 (__v8si)__M);
936 }
937
938 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
939 _mm256_maskstore_ps (float *__P, __m256i __M, __m256 __A)
940 {
941   __builtin_ia32_maskstoreps256 ((__v8sf *)__P, (__v8si)__M, (__v8sf)__A);
942 }
943
944 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
945 _mm256_movehdup_ps (__m256 __X)
946 {
947   return (__m256) __builtin_ia32_movshdup256 ((__v8sf)__X);
948 }
949
950 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
951 _mm256_moveldup_ps (__m256 __X)
952 {
953   return (__m256) __builtin_ia32_movsldup256 ((__v8sf)__X);
954 }
955
956 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
957 _mm256_movedup_pd (__m256d __X)
958 {
959   return (__m256d) __builtin_ia32_movddup256 ((__v4df)__X);
960 }
961
962 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
963 _mm256_lddqu_si256 (__m256i const *__P)
964 {
965   return (__m256i) __builtin_ia32_lddqu256 ((char const *)__P);
966 }
967
968 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
969 _mm256_stream_si256 (__m256i *__A, __m256i __B)
970 {
971   __builtin_ia32_movntdq256 ((__v4di *)__A, (__v4di)__B);
972 }
973
974 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
975 _mm256_stream_pd (double *__A, __m256d __B)
976 {
977   __builtin_ia32_movntpd256 (__A, (__v4df)__B);
978 }
979
980 extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
981 _mm256_stream_ps (float *__P, __m256 __A)
982 {
983   __builtin_ia32_movntps256 (__P, (__v8sf)__A);
984 }
985
986 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
987 _mm256_rcp_ps (__m256 __A)
988 {
989   return (__m256) __builtin_ia32_rcpps256 ((__v8sf)__A);
990 }
991
992 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
993 _mm256_rsqrt_ps (__m256 __A)
994 {
995   return (__m256) __builtin_ia32_rsqrtps256 ((__v8sf)__A);
996 }
997
998 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
999 _mm256_sqrt_pd (__m256d __A)
1000 {
1001   return (__m256d) __builtin_ia32_sqrtpd256 ((__v4df)__A);
1002 }
1003
1004 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1005 _mm256_sqrt_ps (__m256 __A)
1006 {
1007   return (__m256) __builtin_ia32_sqrtps256 ((__v8sf)__A);
1008 }
1009
1010 #ifdef __OPTIMIZE__
1011 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1012 _mm256_round_pd (__m256d __V, const int __M)
1013 {
1014   return (__m256d) __builtin_ia32_roundpd256 ((__v4df)__V, __M);
1015 }
1016
1017 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1018 _mm256_round_ps (__m256 __V, const int __M)
1019 {
1020   return (__m256) __builtin_ia32_roundps256 ((__v8sf)__V, __M);
1021 }
1022 #else
1023 #define _mm256_round_pd(V, M) \
1024   ((__m256d) __builtin_ia32_roundpd256 ((__v4df)(__m256d)(V), (int)(M)))
1025
1026 #define _mm256_round_ps(V, M) \
1027   ((__m256) __builtin_ia32_roundps256 ((__v8sf)(__m256)(V), (int)(M)))
1028 #endif
1029
1030 #define _mm256_ceil_pd(V)       _mm256_round_pd ((V), _MM_FROUND_CEIL)
1031 #define _mm256_floor_pd(V)      _mm256_round_pd ((V), _MM_FROUND_FLOOR)
1032 #define _mm256_ceil_ps(V)       _mm256_round_ps ((V), _MM_FROUND_CEIL)
1033 #define _mm256_floor_ps(V)      _mm256_round_ps ((V), _MM_FROUND_FLOOR)
1034
1035 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1036 _mm256_unpackhi_pd (__m256d __A, __m256d __B)
1037 {
1038   return (__m256d) __builtin_ia32_unpckhpd256 ((__v4df)__A, (__v4df)__B);
1039 }
1040
1041 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1042 _mm256_unpacklo_pd (__m256d __A, __m256d __B)
1043 {
1044   return (__m256d) __builtin_ia32_unpcklpd256 ((__v4df)__A, (__v4df)__B);
1045 }
1046
1047 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1048 _mm256_unpackhi_ps (__m256 __A, __m256 __B)
1049 {
1050   return (__m256) __builtin_ia32_unpckhps256 ((__v8sf)__A, (__v8sf)__B);
1051 }
1052
1053 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1054 _mm256_unpacklo_ps (__m256 __A, __m256 __B)
1055 {
1056   return (__m256) __builtin_ia32_unpcklps256 ((__v8sf)__A, (__v8sf)__B);
1057 }
1058
1059 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1060 _mm_testz_pd (__m128d __M, __m128d __V)
1061 {
1062   return __builtin_ia32_vtestzpd ((__v2df)__M, (__v2df)__V);
1063 }
1064
1065 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1066 _mm_testc_pd (__m128d __M, __m128d __V)
1067 {
1068   return __builtin_ia32_vtestcpd ((__v2df)__M, (__v2df)__V);
1069 }
1070
1071 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1072 _mm_testnzc_pd (__m128d __M, __m128d __V)
1073 {
1074   return __builtin_ia32_vtestnzcpd ((__v2df)__M, (__v2df)__V);
1075 }
1076
1077 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1078 _mm_testz_ps (__m128 __M, __m128 __V)
1079 {
1080   return __builtin_ia32_vtestzps ((__v4sf)__M, (__v4sf)__V);
1081 }
1082
1083 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1084 _mm_testc_ps (__m128 __M, __m128 __V)
1085 {
1086   return __builtin_ia32_vtestcps ((__v4sf)__M, (__v4sf)__V);
1087 }
1088
1089 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1090 _mm_testnzc_ps (__m128 __M, __m128 __V)
1091 {
1092   return __builtin_ia32_vtestnzcps ((__v4sf)__M, (__v4sf)__V);
1093 }
1094
1095 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1096 _mm256_testz_pd (__m256d __M, __m256d __V)
1097 {
1098   return __builtin_ia32_vtestzpd256 ((__v4df)__M, (__v4df)__V);
1099 }
1100
1101 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1102 _mm256_testc_pd (__m256d __M, __m256d __V)
1103 {
1104   return __builtin_ia32_vtestcpd256 ((__v4df)__M, (__v4df)__V);
1105 }
1106
1107 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1108 _mm256_testnzc_pd (__m256d __M, __m256d __V)
1109 {
1110   return __builtin_ia32_vtestnzcpd256 ((__v4df)__M, (__v4df)__V);
1111 }
1112
1113 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1114 _mm256_testz_ps (__m256 __M, __m256 __V)
1115 {
1116   return __builtin_ia32_vtestzps256 ((__v8sf)__M, (__v8sf)__V);
1117 }
1118
1119 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1120 _mm256_testc_ps (__m256 __M, __m256 __V)
1121 {
1122   return __builtin_ia32_vtestcps256 ((__v8sf)__M, (__v8sf)__V);
1123 }
1124
1125 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1126 _mm256_testnzc_ps (__m256 __M, __m256 __V)
1127 {
1128   return __builtin_ia32_vtestnzcps256 ((__v8sf)__M, (__v8sf)__V);
1129 }
1130
1131 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1132 _mm256_testz_si256 (__m256i __M, __m256i __V)
1133 {
1134   return __builtin_ia32_ptestz256 ((__v4di)__M, (__v4di)__V);
1135 }
1136
1137 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1138 _mm256_testc_si256 (__m256i __M, __m256i __V)
1139 {
1140   return __builtin_ia32_ptestc256 ((__v4di)__M, (__v4di)__V);
1141 }
1142
1143 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1144 _mm256_testnzc_si256 (__m256i __M, __m256i __V)
1145 {
1146   return __builtin_ia32_ptestnzc256 ((__v4di)__M, (__v4di)__V);
1147 }
1148
1149 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1150 _mm256_movemask_pd (__m256d __A)
1151 {
1152   return __builtin_ia32_movmskpd256 ((__v4df)__A);
1153 }
1154
1155 extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1156 _mm256_movemask_ps (__m256 __A)
1157 {
1158   return __builtin_ia32_movmskps256 ((__v8sf)__A);
1159 }
1160
1161 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1162 _mm256_setzero_pd (void)
1163 {
1164   return __extension__ (__m256d){ 0.0, 0.0, 0.0, 0.0 };
1165 }
1166
1167 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1168 _mm256_setzero_ps (void)
1169 {
1170   return __extension__ (__m256){ 0.0, 0.0, 0.0, 0.0,
1171                                  0.0, 0.0, 0.0, 0.0 };
1172 }
1173
1174 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1175 _mm256_setzero_si256 (void)
1176 {
1177   return __extension__ (__m256i)(__v4di){ 0, 0, 0, 0 };
1178 }
1179
1180 /* Create the vector [A B C D].  */
1181 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1182 _mm256_set_pd (double __A, double __B, double __C, double __D)
1183 {
1184   return __extension__ (__m256d){ __D, __C, __B, __A };
1185 }
1186
1187 /* Create the vector [A B C D E F G H].  */
1188 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1189 _mm256_set_ps (float __A, float __B, float __C, float __D,
1190                float __E, float __F, float __G, float __H)
1191 {
1192   return __extension__ (__m256){ __H, __G, __F, __E,
1193                                  __D, __C, __B, __A };
1194 }
1195
1196 /* Create the vector [A B C D E F G H].  */
1197 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1198 _mm256_set_epi32 (int __A, int __B, int __C, int __D,
1199                   int __E, int __F, int __G, int __H)
1200 {
1201   return __extension__ (__m256i)(__v8si){ __H, __G, __F, __E,
1202                                           __D, __C, __B, __A };
1203 }
1204
1205 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1206 _mm256_set_epi16 (short __q15, short __q14, short __q13, short __q12,
1207                   short __q11, short __q10, short __q09, short __q08,
1208                   short __q07, short __q06, short __q05, short __q04,
1209                   short __q03, short __q02, short __q01, short __q00)
1210 {
1211   return __extension__ (__m256i)(__v16hi){
1212     __q00, __q01, __q02, __q03, __q04, __q05, __q06, __q07,
1213     __q08, __q09, __q10, __q11, __q12, __q13, __q14, __q15
1214   };
1215 }
1216
1217 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1218 _mm256_set_epi8  (char __q31, char __q30, char __q29, char __q28,
1219                   char __q27, char __q26, char __q25, char __q24,
1220                   char __q23, char __q22, char __q21, char __q20,
1221                   char __q19, char __q18, char __q17, char __q16,
1222                   char __q15, char __q14, char __q13, char __q12,
1223                   char __q11, char __q10, char __q09, char __q08,
1224                   char __q07, char __q06, char __q05, char __q04,
1225                   char __q03, char __q02, char __q01, char __q00)
1226 {
1227   return __extension__ (__m256i)(__v32qi){
1228     __q00, __q01, __q02, __q03, __q04, __q05, __q06, __q07,
1229     __q08, __q09, __q10, __q11, __q12, __q13, __q14, __q15,
1230     __q16, __q17, __q18, __q19, __q20, __q21, __q22, __q23,
1231     __q24, __q25, __q26, __q27, __q28, __q29, __q30, __q31
1232   };
1233 }
1234
1235 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1236 _mm256_set_epi64x (long long __A, long long __B, long long __C,
1237                    long long __D)
1238 {
1239   return __extension__ (__m256i)(__v4di){ __D, __C, __B, __A };
1240 }
1241
1242 /* Create a vector with all elements equal to A.  */
1243 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1244 _mm256_set1_pd (double __A)
1245 {
1246   return __extension__ (__m256d){ __A, __A, __A, __A };
1247 }
1248
1249 /* Create a vector with all elements equal to A.  */
1250 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1251 _mm256_set1_ps (float __A)
1252 {
1253   return __extension__ (__m256){ __A, __A, __A, __A,
1254                                  __A, __A, __A, __A };
1255 }
1256
1257 /* Create a vector with all elements equal to A.  */
1258 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1259 _mm256_set1_epi32 (int __A)
1260 {
1261   return __extension__ (__m256i)(__v8si){ __A, __A, __A, __A,
1262                                           __A, __A, __A, __A };
1263 }
1264
1265 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1266 _mm256_set1_epi16 (short __A)
1267 {
1268   return _mm256_set_epi16 (__A, __A, __A, __A, __A, __A, __A, __A,
1269                            __A, __A, __A, __A, __A, __A, __A, __A);
1270 }
1271
1272 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1273 _mm256_set1_epi8 (char __A)
1274 {
1275   return _mm256_set_epi8 (__A, __A, __A, __A, __A, __A, __A, __A,
1276                           __A, __A, __A, __A, __A, __A, __A, __A,
1277                           __A, __A, __A, __A, __A, __A, __A, __A,
1278                           __A, __A, __A, __A, __A, __A, __A, __A);
1279 }
1280
1281 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1282 _mm256_set1_epi64x (long long __A)
1283 {
1284   return __extension__ (__m256i)(__v4di){ __A, __A, __A, __A };
1285 }
1286
1287 /* Create vectors of elements in the reversed order from the
1288    _mm256_set_XXX functions.  */
1289
1290 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1291 _mm256_setr_pd (double __A, double __B, double __C, double __D)
1292 {
1293   return _mm256_set_pd (__D, __C, __B, __A);
1294 }
1295
1296 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1297 _mm256_setr_ps (float __A, float __B, float __C, float __D,
1298                 float __E, float __F, float __G, float __H)
1299 {
1300   return _mm256_set_ps (__H, __G, __F, __E, __D, __C, __B, __A);
1301 }
1302
1303 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1304 _mm256_setr_epi32 (int __A, int __B, int __C, int __D,
1305                    int __E, int __F, int __G, int __H)
1306 {
1307   return _mm256_set_epi32 (__H, __G, __F, __E, __D, __C, __B, __A);
1308 }
1309
1310 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1311 _mm256_setr_epi16 (short __q15, short __q14, short __q13, short __q12,
1312                    short __q11, short __q10, short __q09, short __q08,
1313                    short __q07, short __q06, short __q05, short __q04,
1314                    short __q03, short __q02, short __q01, short __q00)
1315 {
1316   return _mm256_set_epi16 (__q00, __q01, __q02, __q03,
1317                            __q04, __q05, __q06, __q07,
1318                            __q08, __q09, __q10, __q11,
1319                            __q12, __q13, __q14, __q15);
1320 }
1321
1322 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1323 _mm256_setr_epi8  (char __q31, char __q30, char __q29, char __q28,
1324                    char __q27, char __q26, char __q25, char __q24,
1325                    char __q23, char __q22, char __q21, char __q20,
1326                    char __q19, char __q18, char __q17, char __q16,
1327                    char __q15, char __q14, char __q13, char __q12,
1328                    char __q11, char __q10, char __q09, char __q08,
1329                    char __q07, char __q06, char __q05, char __q04,
1330                    char __q03, char __q02, char __q01, char __q00)
1331 {
1332   return _mm256_set_epi8 (__q00, __q01, __q02, __q03,
1333                           __q04, __q05, __q06, __q07,
1334                           __q08, __q09, __q10, __q11,
1335                           __q12, __q13, __q14, __q15,
1336                           __q16, __q17, __q18, __q19,
1337                           __q20, __q21, __q22, __q23,
1338                           __q24, __q25, __q26, __q27,
1339                           __q28, __q29, __q30, __q31);
1340 }
1341
1342 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1343 _mm256_setr_epi64x (long long __A, long long __B, long long __C,
1344                     long long __D)
1345 {
1346   return _mm256_set_epi64x (__D, __C, __B, __A);
1347 }
1348
1349 /* Casts between various SP, DP, INT vector types.  Note that these do no
1350    conversion of values, they just change the type.  */
1351 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1352 _mm256_castpd_ps (__m256d __A)
1353 {
1354   return (__m256) __A;
1355 }
1356
1357 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1358 _mm256_castpd_si256 (__m256d __A)
1359 {
1360   return (__m256i) __A;
1361 }
1362
1363 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1364 _mm256_castps_pd (__m256 __A)
1365 {
1366   return (__m256d) __A;
1367 }
1368
1369 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1370 _mm256_castps_si256(__m256 __A)
1371 {
1372   return (__m256i) __A;
1373 }
1374
1375 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1376 _mm256_castsi256_ps (__m256i __A)
1377 {
1378   return (__m256) __A;
1379 }
1380
1381 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1382 _mm256_castsi256_pd (__m256i __A)
1383 {
1384   return (__m256d) __A;
1385 }
1386
1387 extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1388 _mm256_castpd256_pd128 (__m256d __A)
1389 {
1390   return (__m128d) __builtin_ia32_pd_pd256 ((__v4df)__A);
1391 }
1392
1393 extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1394 _mm256_castps256_ps128 (__m256 __A)
1395 {
1396   return (__m128) __builtin_ia32_ps_ps256 ((__v8sf)__A);
1397 }
1398
1399 extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1400 _mm256_castsi256_si128 (__m256i __A)
1401 {
1402   return (__m128i) __builtin_ia32_si_si256 ((__v8si)__A);
1403 }
1404
1405 /* When cast is done from a 128 to 256-bit type, the low 128 bits of
1406    the 256-bit result contain source parameter value and the upper 128
1407    bits of the result are undefined.  Those intrinsics shouldn't
1408    generate any extra moves.  */
1409
1410 extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1411 _mm256_castpd128_pd256 (__m128d __A)
1412 {
1413   return (__m256d) __builtin_ia32_pd256_pd ((__v2df)__A);
1414 }
1415
1416 extern __inline __m256 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1417 _mm256_castps128_ps256 (__m128 __A)
1418 {
1419   return (__m256) __builtin_ia32_ps256_ps ((__v4sf)__A);
1420 }
1421
1422 extern __inline __m256i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
1423 _mm256_castsi128_si256 (__m128i __A)
1424 {
1425   return (__m256i) __builtin_ia32_si256_si ((__v4si)__A);
1426 }