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