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