xref: /aosp_15_r20/external/clang/lib/Headers/avx2intrin.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li /*===---- avx2intrin.h - AVX2 intrinsics -----------------------------------===
2*67e74705SXin Li  *
3*67e74705SXin Li  * Permission is hereby granted, free of charge, to any person obtaining a copy
4*67e74705SXin Li  * of this software and associated documentation files (the "Software"), to deal
5*67e74705SXin Li  * in the Software without restriction, including without limitation the rights
6*67e74705SXin Li  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7*67e74705SXin Li  * copies of the Software, and to permit persons to whom the Software is
8*67e74705SXin Li  * furnished to do so, subject to the following conditions:
9*67e74705SXin Li  *
10*67e74705SXin Li  * The above copyright notice and this permission notice shall be included in
11*67e74705SXin Li  * all copies or substantial portions of the Software.
12*67e74705SXin Li  *
13*67e74705SXin Li  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14*67e74705SXin Li  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15*67e74705SXin Li  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16*67e74705SXin Li  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17*67e74705SXin Li  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18*67e74705SXin Li  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19*67e74705SXin Li  * THE SOFTWARE.
20*67e74705SXin Li  *
21*67e74705SXin Li  *===-----------------------------------------------------------------------===
22*67e74705SXin Li  */
23*67e74705SXin Li 
24*67e74705SXin Li #ifndef __IMMINTRIN_H
25*67e74705SXin Li #error "Never use <avx2intrin.h> directly; include <immintrin.h> instead."
26*67e74705SXin Li #endif
27*67e74705SXin Li 
28*67e74705SXin Li #ifndef __AVX2INTRIN_H
29*67e74705SXin Li #define __AVX2INTRIN_H
30*67e74705SXin Li 
31*67e74705SXin Li /* Define the default attributes for the functions in this file. */
32*67e74705SXin Li #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("avx2")))
33*67e74705SXin Li 
34*67e74705SXin Li /* SSE4 Multiple Packed Sums of Absolute Difference.  */
35*67e74705SXin Li #define _mm256_mpsadbw_epu8(X, Y, M) \
36*67e74705SXin Li   (__m256i)__builtin_ia32_mpsadbw256((__v32qi)(__m256i)(X), \
37*67e74705SXin Li                                      (__v32qi)(__m256i)(Y), (int)(M))
38*67e74705SXin Li 
39*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_abs_epi8(__m256i __a)40*67e74705SXin Li _mm256_abs_epi8(__m256i __a)
41*67e74705SXin Li {
42*67e74705SXin Li     return (__m256i)__builtin_ia32_pabsb256((__v32qi)__a);
43*67e74705SXin Li }
44*67e74705SXin Li 
45*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_abs_epi16(__m256i __a)46*67e74705SXin Li _mm256_abs_epi16(__m256i __a)
47*67e74705SXin Li {
48*67e74705SXin Li     return (__m256i)__builtin_ia32_pabsw256((__v16hi)__a);
49*67e74705SXin Li }
50*67e74705SXin Li 
51*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_abs_epi32(__m256i __a)52*67e74705SXin Li _mm256_abs_epi32(__m256i __a)
53*67e74705SXin Li {
54*67e74705SXin Li     return (__m256i)__builtin_ia32_pabsd256((__v8si)__a);
55*67e74705SXin Li }
56*67e74705SXin Li 
57*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_packs_epi16(__m256i __a,__m256i __b)58*67e74705SXin Li _mm256_packs_epi16(__m256i __a, __m256i __b)
59*67e74705SXin Li {
60*67e74705SXin Li   return (__m256i)__builtin_ia32_packsswb256((__v16hi)__a, (__v16hi)__b);
61*67e74705SXin Li }
62*67e74705SXin Li 
63*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_packs_epi32(__m256i __a,__m256i __b)64*67e74705SXin Li _mm256_packs_epi32(__m256i __a, __m256i __b)
65*67e74705SXin Li {
66*67e74705SXin Li   return (__m256i)__builtin_ia32_packssdw256((__v8si)__a, (__v8si)__b);
67*67e74705SXin Li }
68*67e74705SXin Li 
69*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_packus_epi16(__m256i __a,__m256i __b)70*67e74705SXin Li _mm256_packus_epi16(__m256i __a, __m256i __b)
71*67e74705SXin Li {
72*67e74705SXin Li   return (__m256i)__builtin_ia32_packuswb256((__v16hi)__a, (__v16hi)__b);
73*67e74705SXin Li }
74*67e74705SXin Li 
75*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_packus_epi32(__m256i __V1,__m256i __V2)76*67e74705SXin Li _mm256_packus_epi32(__m256i __V1, __m256i __V2)
77*67e74705SXin Li {
78*67e74705SXin Li   return (__m256i) __builtin_ia32_packusdw256((__v8si)__V1, (__v8si)__V2);
79*67e74705SXin Li }
80*67e74705SXin Li 
81*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_add_epi8(__m256i __a,__m256i __b)82*67e74705SXin Li _mm256_add_epi8(__m256i __a, __m256i __b)
83*67e74705SXin Li {
84*67e74705SXin Li   return (__m256i)((__v32qu)__a + (__v32qu)__b);
85*67e74705SXin Li }
86*67e74705SXin Li 
87*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_add_epi16(__m256i __a,__m256i __b)88*67e74705SXin Li _mm256_add_epi16(__m256i __a, __m256i __b)
89*67e74705SXin Li {
90*67e74705SXin Li   return (__m256i)((__v16hu)__a + (__v16hu)__b);
91*67e74705SXin Li }
92*67e74705SXin Li 
93*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_add_epi32(__m256i __a,__m256i __b)94*67e74705SXin Li _mm256_add_epi32(__m256i __a, __m256i __b)
95*67e74705SXin Li {
96*67e74705SXin Li   return (__m256i)((__v8su)__a + (__v8su)__b);
97*67e74705SXin Li }
98*67e74705SXin Li 
99*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_add_epi64(__m256i __a,__m256i __b)100*67e74705SXin Li _mm256_add_epi64(__m256i __a, __m256i __b)
101*67e74705SXin Li {
102*67e74705SXin Li   return (__m256i)((__v4du)__a + (__v4du)__b);
103*67e74705SXin Li }
104*67e74705SXin Li 
105*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_adds_epi8(__m256i __a,__m256i __b)106*67e74705SXin Li _mm256_adds_epi8(__m256i __a, __m256i __b)
107*67e74705SXin Li {
108*67e74705SXin Li   return (__m256i)__builtin_ia32_paddsb256((__v32qi)__a, (__v32qi)__b);
109*67e74705SXin Li }
110*67e74705SXin Li 
111*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_adds_epi16(__m256i __a,__m256i __b)112*67e74705SXin Li _mm256_adds_epi16(__m256i __a, __m256i __b)
113*67e74705SXin Li {
114*67e74705SXin Li   return (__m256i)__builtin_ia32_paddsw256((__v16hi)__a, (__v16hi)__b);
115*67e74705SXin Li }
116*67e74705SXin Li 
117*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_adds_epu8(__m256i __a,__m256i __b)118*67e74705SXin Li _mm256_adds_epu8(__m256i __a, __m256i __b)
119*67e74705SXin Li {
120*67e74705SXin Li   return (__m256i)__builtin_ia32_paddusb256((__v32qi)__a, (__v32qi)__b);
121*67e74705SXin Li }
122*67e74705SXin Li 
123*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_adds_epu16(__m256i __a,__m256i __b)124*67e74705SXin Li _mm256_adds_epu16(__m256i __a, __m256i __b)
125*67e74705SXin Li {
126*67e74705SXin Li   return (__m256i)__builtin_ia32_paddusw256((__v16hi)__a, (__v16hi)__b);
127*67e74705SXin Li }
128*67e74705SXin Li 
129*67e74705SXin Li #define _mm256_alignr_epi8(a, b, n) __extension__ ({        \
130*67e74705SXin Li   (__m256i)__builtin_ia32_palignr256((__v32qi)(__m256i)(a), \
131*67e74705SXin Li                                      (__v32qi)(__m256i)(b), (n)); })
132*67e74705SXin Li 
133*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_and_si256(__m256i __a,__m256i __b)134*67e74705SXin Li _mm256_and_si256(__m256i __a, __m256i __b)
135*67e74705SXin Li {
136*67e74705SXin Li   return (__m256i)((__v4du)__a & (__v4du)__b);
137*67e74705SXin Li }
138*67e74705SXin Li 
139*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_andnot_si256(__m256i __a,__m256i __b)140*67e74705SXin Li _mm256_andnot_si256(__m256i __a, __m256i __b)
141*67e74705SXin Li {
142*67e74705SXin Li   return (__m256i)(~(__v4du)__a & (__v4du)__b);
143*67e74705SXin Li }
144*67e74705SXin Li 
145*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_avg_epu8(__m256i __a,__m256i __b)146*67e74705SXin Li _mm256_avg_epu8(__m256i __a, __m256i __b)
147*67e74705SXin Li {
148*67e74705SXin Li   return (__m256i)__builtin_ia32_pavgb256((__v32qi)__a, (__v32qi)__b);
149*67e74705SXin Li }
150*67e74705SXin Li 
151*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_avg_epu16(__m256i __a,__m256i __b)152*67e74705SXin Li _mm256_avg_epu16(__m256i __a, __m256i __b)
153*67e74705SXin Li {
154*67e74705SXin Li   return (__m256i)__builtin_ia32_pavgw256((__v16hi)__a, (__v16hi)__b);
155*67e74705SXin Li }
156*67e74705SXin Li 
157*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_blendv_epi8(__m256i __V1,__m256i __V2,__m256i __M)158*67e74705SXin Li _mm256_blendv_epi8(__m256i __V1, __m256i __V2, __m256i __M)
159*67e74705SXin Li {
160*67e74705SXin Li   return (__m256i)__builtin_ia32_pblendvb256((__v32qi)__V1, (__v32qi)__V2,
161*67e74705SXin Li                                               (__v32qi)__M);
162*67e74705SXin Li }
163*67e74705SXin Li 
164*67e74705SXin Li #define _mm256_blend_epi16(V1, V2, M) __extension__ ({       \
165*67e74705SXin Li   (__m256i)__builtin_shufflevector((__v16hi)(__m256i)(V1),   \
166*67e74705SXin Li                                    (__v16hi)(__m256i)(V2),   \
167*67e74705SXin Li                                    (((M) & 0x01) ? 16 : 0),  \
168*67e74705SXin Li                                    (((M) & 0x02) ? 17 : 1),  \
169*67e74705SXin Li                                    (((M) & 0x04) ? 18 : 2),  \
170*67e74705SXin Li                                    (((M) & 0x08) ? 19 : 3),  \
171*67e74705SXin Li                                    (((M) & 0x10) ? 20 : 4),  \
172*67e74705SXin Li                                    (((M) & 0x20) ? 21 : 5),  \
173*67e74705SXin Li                                    (((M) & 0x40) ? 22 : 6),  \
174*67e74705SXin Li                                    (((M) & 0x80) ? 23 : 7),  \
175*67e74705SXin Li                                    (((M) & 0x01) ? 24 : 8),  \
176*67e74705SXin Li                                    (((M) & 0x02) ? 25 : 9),  \
177*67e74705SXin Li                                    (((M) & 0x04) ? 26 : 10), \
178*67e74705SXin Li                                    (((M) & 0x08) ? 27 : 11), \
179*67e74705SXin Li                                    (((M) & 0x10) ? 28 : 12), \
180*67e74705SXin Li                                    (((M) & 0x20) ? 29 : 13), \
181*67e74705SXin Li                                    (((M) & 0x40) ? 30 : 14), \
182*67e74705SXin Li                                    (((M) & 0x80) ? 31 : 15)); })
183*67e74705SXin Li 
184*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_cmpeq_epi8(__m256i __a,__m256i __b)185*67e74705SXin Li _mm256_cmpeq_epi8(__m256i __a, __m256i __b)
186*67e74705SXin Li {
187*67e74705SXin Li   return (__m256i)((__v32qi)__a == (__v32qi)__b);
188*67e74705SXin Li }
189*67e74705SXin Li 
190*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_cmpeq_epi16(__m256i __a,__m256i __b)191*67e74705SXin Li _mm256_cmpeq_epi16(__m256i __a, __m256i __b)
192*67e74705SXin Li {
193*67e74705SXin Li   return (__m256i)((__v16hi)__a == (__v16hi)__b);
194*67e74705SXin Li }
195*67e74705SXin Li 
196*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_cmpeq_epi32(__m256i __a,__m256i __b)197*67e74705SXin Li _mm256_cmpeq_epi32(__m256i __a, __m256i __b)
198*67e74705SXin Li {
199*67e74705SXin Li   return (__m256i)((__v8si)__a == (__v8si)__b);
200*67e74705SXin Li }
201*67e74705SXin Li 
202*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_cmpeq_epi64(__m256i __a,__m256i __b)203*67e74705SXin Li _mm256_cmpeq_epi64(__m256i __a, __m256i __b)
204*67e74705SXin Li {
205*67e74705SXin Li   return (__m256i)((__v4di)__a == (__v4di)__b);
206*67e74705SXin Li }
207*67e74705SXin Li 
208*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_cmpgt_epi8(__m256i __a,__m256i __b)209*67e74705SXin Li _mm256_cmpgt_epi8(__m256i __a, __m256i __b)
210*67e74705SXin Li {
211*67e74705SXin Li   /* This function always performs a signed comparison, but __v32qi is a char
212*67e74705SXin Li      which may be signed or unsigned, so use __v32qs. */
213*67e74705SXin Li   return (__m256i)((__v32qs)__a > (__v32qs)__b);
214*67e74705SXin Li }
215*67e74705SXin Li 
216*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_cmpgt_epi16(__m256i __a,__m256i __b)217*67e74705SXin Li _mm256_cmpgt_epi16(__m256i __a, __m256i __b)
218*67e74705SXin Li {
219*67e74705SXin Li   return (__m256i)((__v16hi)__a > (__v16hi)__b);
220*67e74705SXin Li }
221*67e74705SXin Li 
222*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_cmpgt_epi32(__m256i __a,__m256i __b)223*67e74705SXin Li _mm256_cmpgt_epi32(__m256i __a, __m256i __b)
224*67e74705SXin Li {
225*67e74705SXin Li   return (__m256i)((__v8si)__a > (__v8si)__b);
226*67e74705SXin Li }
227*67e74705SXin Li 
228*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_cmpgt_epi64(__m256i __a,__m256i __b)229*67e74705SXin Li _mm256_cmpgt_epi64(__m256i __a, __m256i __b)
230*67e74705SXin Li {
231*67e74705SXin Li   return (__m256i)((__v4di)__a > (__v4di)__b);
232*67e74705SXin Li }
233*67e74705SXin Li 
234*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_hadd_epi16(__m256i __a,__m256i __b)235*67e74705SXin Li _mm256_hadd_epi16(__m256i __a, __m256i __b)
236*67e74705SXin Li {
237*67e74705SXin Li     return (__m256i)__builtin_ia32_phaddw256((__v16hi)__a, (__v16hi)__b);
238*67e74705SXin Li }
239*67e74705SXin Li 
240*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_hadd_epi32(__m256i __a,__m256i __b)241*67e74705SXin Li _mm256_hadd_epi32(__m256i __a, __m256i __b)
242*67e74705SXin Li {
243*67e74705SXin Li     return (__m256i)__builtin_ia32_phaddd256((__v8si)__a, (__v8si)__b);
244*67e74705SXin Li }
245*67e74705SXin Li 
246*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_hadds_epi16(__m256i __a,__m256i __b)247*67e74705SXin Li _mm256_hadds_epi16(__m256i __a, __m256i __b)
248*67e74705SXin Li {
249*67e74705SXin Li     return (__m256i)__builtin_ia32_phaddsw256((__v16hi)__a, (__v16hi)__b);
250*67e74705SXin Li }
251*67e74705SXin Li 
252*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_hsub_epi16(__m256i __a,__m256i __b)253*67e74705SXin Li _mm256_hsub_epi16(__m256i __a, __m256i __b)
254*67e74705SXin Li {
255*67e74705SXin Li     return (__m256i)__builtin_ia32_phsubw256((__v16hi)__a, (__v16hi)__b);
256*67e74705SXin Li }
257*67e74705SXin Li 
258*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_hsub_epi32(__m256i __a,__m256i __b)259*67e74705SXin Li _mm256_hsub_epi32(__m256i __a, __m256i __b)
260*67e74705SXin Li {
261*67e74705SXin Li     return (__m256i)__builtin_ia32_phsubd256((__v8si)__a, (__v8si)__b);
262*67e74705SXin Li }
263*67e74705SXin Li 
264*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_hsubs_epi16(__m256i __a,__m256i __b)265*67e74705SXin Li _mm256_hsubs_epi16(__m256i __a, __m256i __b)
266*67e74705SXin Li {
267*67e74705SXin Li     return (__m256i)__builtin_ia32_phsubsw256((__v16hi)__a, (__v16hi)__b);
268*67e74705SXin Li }
269*67e74705SXin Li 
270*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_maddubs_epi16(__m256i __a,__m256i __b)271*67e74705SXin Li _mm256_maddubs_epi16(__m256i __a, __m256i __b)
272*67e74705SXin Li {
273*67e74705SXin Li     return (__m256i)__builtin_ia32_pmaddubsw256((__v32qi)__a, (__v32qi)__b);
274*67e74705SXin Li }
275*67e74705SXin Li 
276*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_madd_epi16(__m256i __a,__m256i __b)277*67e74705SXin Li _mm256_madd_epi16(__m256i __a, __m256i __b)
278*67e74705SXin Li {
279*67e74705SXin Li   return (__m256i)__builtin_ia32_pmaddwd256((__v16hi)__a, (__v16hi)__b);
280*67e74705SXin Li }
281*67e74705SXin Li 
282*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_max_epi8(__m256i __a,__m256i __b)283*67e74705SXin Li _mm256_max_epi8(__m256i __a, __m256i __b)
284*67e74705SXin Li {
285*67e74705SXin Li   return (__m256i)__builtin_ia32_pmaxsb256((__v32qi)__a, (__v32qi)__b);
286*67e74705SXin Li }
287*67e74705SXin Li 
288*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_max_epi16(__m256i __a,__m256i __b)289*67e74705SXin Li _mm256_max_epi16(__m256i __a, __m256i __b)
290*67e74705SXin Li {
291*67e74705SXin Li   return (__m256i)__builtin_ia32_pmaxsw256((__v16hi)__a, (__v16hi)__b);
292*67e74705SXin Li }
293*67e74705SXin Li 
294*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_max_epi32(__m256i __a,__m256i __b)295*67e74705SXin Li _mm256_max_epi32(__m256i __a, __m256i __b)
296*67e74705SXin Li {
297*67e74705SXin Li   return (__m256i)__builtin_ia32_pmaxsd256((__v8si)__a, (__v8si)__b);
298*67e74705SXin Li }
299*67e74705SXin Li 
300*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_max_epu8(__m256i __a,__m256i __b)301*67e74705SXin Li _mm256_max_epu8(__m256i __a, __m256i __b)
302*67e74705SXin Li {
303*67e74705SXin Li   return (__m256i)__builtin_ia32_pmaxub256((__v32qi)__a, (__v32qi)__b);
304*67e74705SXin Li }
305*67e74705SXin Li 
306*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_max_epu16(__m256i __a,__m256i __b)307*67e74705SXin Li _mm256_max_epu16(__m256i __a, __m256i __b)
308*67e74705SXin Li {
309*67e74705SXin Li   return (__m256i)__builtin_ia32_pmaxuw256((__v16hi)__a, (__v16hi)__b);
310*67e74705SXin Li }
311*67e74705SXin Li 
312*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_max_epu32(__m256i __a,__m256i __b)313*67e74705SXin Li _mm256_max_epu32(__m256i __a, __m256i __b)
314*67e74705SXin Li {
315*67e74705SXin Li   return (__m256i)__builtin_ia32_pmaxud256((__v8si)__a, (__v8si)__b);
316*67e74705SXin Li }
317*67e74705SXin Li 
318*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_min_epi8(__m256i __a,__m256i __b)319*67e74705SXin Li _mm256_min_epi8(__m256i __a, __m256i __b)
320*67e74705SXin Li {
321*67e74705SXin Li   return (__m256i)__builtin_ia32_pminsb256((__v32qi)__a, (__v32qi)__b);
322*67e74705SXin Li }
323*67e74705SXin Li 
324*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_min_epi16(__m256i __a,__m256i __b)325*67e74705SXin Li _mm256_min_epi16(__m256i __a, __m256i __b)
326*67e74705SXin Li {
327*67e74705SXin Li   return (__m256i)__builtin_ia32_pminsw256((__v16hi)__a, (__v16hi)__b);
328*67e74705SXin Li }
329*67e74705SXin Li 
330*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_min_epi32(__m256i __a,__m256i __b)331*67e74705SXin Li _mm256_min_epi32(__m256i __a, __m256i __b)
332*67e74705SXin Li {
333*67e74705SXin Li   return (__m256i)__builtin_ia32_pminsd256((__v8si)__a, (__v8si)__b);
334*67e74705SXin Li }
335*67e74705SXin Li 
336*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_min_epu8(__m256i __a,__m256i __b)337*67e74705SXin Li _mm256_min_epu8(__m256i __a, __m256i __b)
338*67e74705SXin Li {
339*67e74705SXin Li   return (__m256i)__builtin_ia32_pminub256((__v32qi)__a, (__v32qi)__b);
340*67e74705SXin Li }
341*67e74705SXin Li 
342*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_min_epu16(__m256i __a,__m256i __b)343*67e74705SXin Li _mm256_min_epu16(__m256i __a, __m256i __b)
344*67e74705SXin Li {
345*67e74705SXin Li   return (__m256i)__builtin_ia32_pminuw256 ((__v16hi)__a, (__v16hi)__b);
346*67e74705SXin Li }
347*67e74705SXin Li 
348*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_min_epu32(__m256i __a,__m256i __b)349*67e74705SXin Li _mm256_min_epu32(__m256i __a, __m256i __b)
350*67e74705SXin Li {
351*67e74705SXin Li   return (__m256i)__builtin_ia32_pminud256((__v8si)__a, (__v8si)__b);
352*67e74705SXin Li }
353*67e74705SXin Li 
354*67e74705SXin Li static __inline__ int __DEFAULT_FN_ATTRS
_mm256_movemask_epi8(__m256i __a)355*67e74705SXin Li _mm256_movemask_epi8(__m256i __a)
356*67e74705SXin Li {
357*67e74705SXin Li   return __builtin_ia32_pmovmskb256((__v32qi)__a);
358*67e74705SXin Li }
359*67e74705SXin Li 
360*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_cvtepi8_epi16(__m128i __V)361*67e74705SXin Li _mm256_cvtepi8_epi16(__m128i __V)
362*67e74705SXin Li {
363*67e74705SXin Li   /* This function always performs a signed extension, but __v16qi is a char
364*67e74705SXin Li      which may be signed or unsigned, so use __v16qs. */
365*67e74705SXin Li   return (__m256i)__builtin_convertvector((__v16qs)__V, __v16hi);
366*67e74705SXin Li }
367*67e74705SXin Li 
368*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_cvtepi8_epi32(__m128i __V)369*67e74705SXin Li _mm256_cvtepi8_epi32(__m128i __V)
370*67e74705SXin Li {
371*67e74705SXin Li   /* This function always performs a signed extension, but __v16qi is a char
372*67e74705SXin Li      which may be signed or unsigned, so use __v16qs. */
373*67e74705SXin Li   return (__m256i)__builtin_convertvector(__builtin_shufflevector((__v16qs)__V, (__v16qs)__V, 0, 1, 2, 3, 4, 5, 6, 7), __v8si);
374*67e74705SXin Li }
375*67e74705SXin Li 
376*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_cvtepi8_epi64(__m128i __V)377*67e74705SXin Li _mm256_cvtepi8_epi64(__m128i __V)
378*67e74705SXin Li {
379*67e74705SXin Li   /* This function always performs a signed extension, but __v16qi is a char
380*67e74705SXin Li      which may be signed or unsigned, so use __v16qs. */
381*67e74705SXin Li   return (__m256i)__builtin_convertvector(__builtin_shufflevector((__v16qs)__V, (__v16qs)__V, 0, 1, 2, 3), __v4di);
382*67e74705SXin Li }
383*67e74705SXin Li 
384*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_cvtepi16_epi32(__m128i __V)385*67e74705SXin Li _mm256_cvtepi16_epi32(__m128i __V)
386*67e74705SXin Li {
387*67e74705SXin Li   return (__m256i)__builtin_convertvector((__v8hi)__V, __v8si);
388*67e74705SXin Li }
389*67e74705SXin Li 
390*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_cvtepi16_epi64(__m128i __V)391*67e74705SXin Li _mm256_cvtepi16_epi64(__m128i __V)
392*67e74705SXin Li {
393*67e74705SXin Li   return (__m256i)__builtin_convertvector(__builtin_shufflevector((__v8hi)__V, (__v8hi)__V, 0, 1, 2, 3), __v4di);
394*67e74705SXin Li }
395*67e74705SXin Li 
396*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_cvtepi32_epi64(__m128i __V)397*67e74705SXin Li _mm256_cvtepi32_epi64(__m128i __V)
398*67e74705SXin Li {
399*67e74705SXin Li   return (__m256i)__builtin_convertvector((__v4si)__V, __v4di);
400*67e74705SXin Li }
401*67e74705SXin Li 
402*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_cvtepu8_epi16(__m128i __V)403*67e74705SXin Li _mm256_cvtepu8_epi16(__m128i __V)
404*67e74705SXin Li {
405*67e74705SXin Li   return (__m256i)__builtin_convertvector((__v16qu)__V, __v16hi);
406*67e74705SXin Li }
407*67e74705SXin Li 
408*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_cvtepu8_epi32(__m128i __V)409*67e74705SXin Li _mm256_cvtepu8_epi32(__m128i __V)
410*67e74705SXin Li {
411*67e74705SXin Li   return (__m256i)__builtin_convertvector(__builtin_shufflevector((__v16qu)__V, (__v16qu)__V, 0, 1, 2, 3, 4, 5, 6, 7), __v8si);
412*67e74705SXin Li }
413*67e74705SXin Li 
414*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_cvtepu8_epi64(__m128i __V)415*67e74705SXin Li _mm256_cvtepu8_epi64(__m128i __V)
416*67e74705SXin Li {
417*67e74705SXin Li   return (__m256i)__builtin_convertvector(__builtin_shufflevector((__v16qu)__V, (__v16qu)__V, 0, 1, 2, 3), __v4di);
418*67e74705SXin Li }
419*67e74705SXin Li 
420*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_cvtepu16_epi32(__m128i __V)421*67e74705SXin Li _mm256_cvtepu16_epi32(__m128i __V)
422*67e74705SXin Li {
423*67e74705SXin Li   return (__m256i)__builtin_convertvector((__v8hu)__V, __v8si);
424*67e74705SXin Li }
425*67e74705SXin Li 
426*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_cvtepu16_epi64(__m128i __V)427*67e74705SXin Li _mm256_cvtepu16_epi64(__m128i __V)
428*67e74705SXin Li {
429*67e74705SXin Li   return (__m256i)__builtin_convertvector(__builtin_shufflevector((__v8hu)__V, (__v8hu)__V, 0, 1, 2, 3), __v4di);
430*67e74705SXin Li }
431*67e74705SXin Li 
432*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_cvtepu32_epi64(__m128i __V)433*67e74705SXin Li _mm256_cvtepu32_epi64(__m128i __V)
434*67e74705SXin Li {
435*67e74705SXin Li   return (__m256i)__builtin_convertvector((__v4su)__V, __v4di);
436*67e74705SXin Li }
437*67e74705SXin Li 
438*67e74705SXin Li static __inline__  __m256i __DEFAULT_FN_ATTRS
_mm256_mul_epi32(__m256i __a,__m256i __b)439*67e74705SXin Li _mm256_mul_epi32(__m256i __a, __m256i __b)
440*67e74705SXin Li {
441*67e74705SXin Li   return (__m256i)__builtin_ia32_pmuldq256((__v8si)__a, (__v8si)__b);
442*67e74705SXin Li }
443*67e74705SXin Li 
444*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_mulhrs_epi16(__m256i __a,__m256i __b)445*67e74705SXin Li _mm256_mulhrs_epi16(__m256i __a, __m256i __b)
446*67e74705SXin Li {
447*67e74705SXin Li   return (__m256i)__builtin_ia32_pmulhrsw256((__v16hi)__a, (__v16hi)__b);
448*67e74705SXin Li }
449*67e74705SXin Li 
450*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_mulhi_epu16(__m256i __a,__m256i __b)451*67e74705SXin Li _mm256_mulhi_epu16(__m256i __a, __m256i __b)
452*67e74705SXin Li {
453*67e74705SXin Li   return (__m256i)__builtin_ia32_pmulhuw256((__v16hi)__a, (__v16hi)__b);
454*67e74705SXin Li }
455*67e74705SXin Li 
456*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_mulhi_epi16(__m256i __a,__m256i __b)457*67e74705SXin Li _mm256_mulhi_epi16(__m256i __a, __m256i __b)
458*67e74705SXin Li {
459*67e74705SXin Li   return (__m256i)__builtin_ia32_pmulhw256((__v16hi)__a, (__v16hi)__b);
460*67e74705SXin Li }
461*67e74705SXin Li 
462*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_mullo_epi16(__m256i __a,__m256i __b)463*67e74705SXin Li _mm256_mullo_epi16(__m256i __a, __m256i __b)
464*67e74705SXin Li {
465*67e74705SXin Li   return (__m256i)((__v16hu)__a * (__v16hu)__b);
466*67e74705SXin Li }
467*67e74705SXin Li 
468*67e74705SXin Li static __inline__  __m256i __DEFAULT_FN_ATTRS
_mm256_mullo_epi32(__m256i __a,__m256i __b)469*67e74705SXin Li _mm256_mullo_epi32 (__m256i __a, __m256i __b)
470*67e74705SXin Li {
471*67e74705SXin Li   return (__m256i)((__v8su)__a * (__v8su)__b);
472*67e74705SXin Li }
473*67e74705SXin Li 
474*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_mul_epu32(__m256i __a,__m256i __b)475*67e74705SXin Li _mm256_mul_epu32(__m256i __a, __m256i __b)
476*67e74705SXin Li {
477*67e74705SXin Li   return __builtin_ia32_pmuludq256((__v8si)__a, (__v8si)__b);
478*67e74705SXin Li }
479*67e74705SXin Li 
480*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_or_si256(__m256i __a,__m256i __b)481*67e74705SXin Li _mm256_or_si256(__m256i __a, __m256i __b)
482*67e74705SXin Li {
483*67e74705SXin Li   return (__m256i)((__v4du)__a | (__v4du)__b);
484*67e74705SXin Li }
485*67e74705SXin Li 
486*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_sad_epu8(__m256i __a,__m256i __b)487*67e74705SXin Li _mm256_sad_epu8(__m256i __a, __m256i __b)
488*67e74705SXin Li {
489*67e74705SXin Li   return __builtin_ia32_psadbw256((__v32qi)__a, (__v32qi)__b);
490*67e74705SXin Li }
491*67e74705SXin Li 
492*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_shuffle_epi8(__m256i __a,__m256i __b)493*67e74705SXin Li _mm256_shuffle_epi8(__m256i __a, __m256i __b)
494*67e74705SXin Li {
495*67e74705SXin Li   return (__m256i)__builtin_ia32_pshufb256((__v32qi)__a, (__v32qi)__b);
496*67e74705SXin Li }
497*67e74705SXin Li 
498*67e74705SXin Li #define _mm256_shuffle_epi32(a, imm) __extension__ ({ \
499*67e74705SXin Li   (__m256i)__builtin_shufflevector((__v8si)(__m256i)(a), \
500*67e74705SXin Li                                    (__v8si)_mm256_undefined_si256(), \
501*67e74705SXin Li                                    0 + (((imm) >> 0) & 0x3), \
502*67e74705SXin Li                                    0 + (((imm) >> 2) & 0x3), \
503*67e74705SXin Li                                    0 + (((imm) >> 4) & 0x3), \
504*67e74705SXin Li                                    0 + (((imm) >> 6) & 0x3), \
505*67e74705SXin Li                                    4 + (((imm) >> 0) & 0x3), \
506*67e74705SXin Li                                    4 + (((imm) >> 2) & 0x3), \
507*67e74705SXin Li                                    4 + (((imm) >> 4) & 0x3), \
508*67e74705SXin Li                                    4 + (((imm) >> 6) & 0x3)); })
509*67e74705SXin Li 
510*67e74705SXin Li #define _mm256_shufflehi_epi16(a, imm) __extension__ ({ \
511*67e74705SXin Li   (__m256i)__builtin_shufflevector((__v16hi)(__m256i)(a), \
512*67e74705SXin Li                                    (__v16hi)_mm256_undefined_si256(), \
513*67e74705SXin Li                                    0, 1, 2, 3, \
514*67e74705SXin Li                                    4  + (((imm) >> 0) & 0x3), \
515*67e74705SXin Li                                    4  + (((imm) >> 2) & 0x3), \
516*67e74705SXin Li                                    4  + (((imm) >> 4) & 0x3), \
517*67e74705SXin Li                                    4  + (((imm) >> 6) & 0x3), \
518*67e74705SXin Li                                    8, 9, 10, 11, \
519*67e74705SXin Li                                    12 + (((imm) >> 0) & 0x3), \
520*67e74705SXin Li                                    12 + (((imm) >> 2) & 0x3), \
521*67e74705SXin Li                                    12 + (((imm) >> 4) & 0x3), \
522*67e74705SXin Li                                    12 + (((imm) >> 6) & 0x3)); })
523*67e74705SXin Li 
524*67e74705SXin Li #define _mm256_shufflelo_epi16(a, imm) __extension__ ({ \
525*67e74705SXin Li   (__m256i)__builtin_shufflevector((__v16hi)(__m256i)(a), \
526*67e74705SXin Li                                    (__v16hi)_mm256_undefined_si256(), \
527*67e74705SXin Li                                    0 + (((imm) >> 0) & 0x3), \
528*67e74705SXin Li                                    0 + (((imm) >> 2) & 0x3), \
529*67e74705SXin Li                                    0 + (((imm) >> 4) & 0x3), \
530*67e74705SXin Li                                    0 + (((imm) >> 6) & 0x3), \
531*67e74705SXin Li                                    4, 5, 6, 7, \
532*67e74705SXin Li                                    8 + (((imm) >> 0) & 0x3), \
533*67e74705SXin Li                                    8 + (((imm) >> 2) & 0x3), \
534*67e74705SXin Li                                    8 + (((imm) >> 4) & 0x3), \
535*67e74705SXin Li                                    8 + (((imm) >> 6) & 0x3), \
536*67e74705SXin Li                                    12, 13, 14, 15); })
537*67e74705SXin Li 
538*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_sign_epi8(__m256i __a,__m256i __b)539*67e74705SXin Li _mm256_sign_epi8(__m256i __a, __m256i __b)
540*67e74705SXin Li {
541*67e74705SXin Li     return (__m256i)__builtin_ia32_psignb256((__v32qi)__a, (__v32qi)__b);
542*67e74705SXin Li }
543*67e74705SXin Li 
544*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_sign_epi16(__m256i __a,__m256i __b)545*67e74705SXin Li _mm256_sign_epi16(__m256i __a, __m256i __b)
546*67e74705SXin Li {
547*67e74705SXin Li     return (__m256i)__builtin_ia32_psignw256((__v16hi)__a, (__v16hi)__b);
548*67e74705SXin Li }
549*67e74705SXin Li 
550*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_sign_epi32(__m256i __a,__m256i __b)551*67e74705SXin Li _mm256_sign_epi32(__m256i __a, __m256i __b)
552*67e74705SXin Li {
553*67e74705SXin Li     return (__m256i)__builtin_ia32_psignd256((__v8si)__a, (__v8si)__b);
554*67e74705SXin Li }
555*67e74705SXin Li 
556*67e74705SXin Li #define _mm256_slli_si256(a, imm) __extension__ ({ \
557*67e74705SXin Li   (__m256i)__builtin_shufflevector(                                          \
558*67e74705SXin Li         (__v32qi)_mm256_setzero_si256(),                                     \
559*67e74705SXin Li         (__v32qi)(__m256i)(a),                                               \
560*67e74705SXin Li         ((char)(imm)&0xF0) ?  0 : ((char)(imm)>0x0 ? 16 : 32) - (char)(imm), \
561*67e74705SXin Li         ((char)(imm)&0xF0) ?  1 : ((char)(imm)>0x1 ? 17 : 33) - (char)(imm), \
562*67e74705SXin Li         ((char)(imm)&0xF0) ?  2 : ((char)(imm)>0x2 ? 18 : 34) - (char)(imm), \
563*67e74705SXin Li         ((char)(imm)&0xF0) ?  3 : ((char)(imm)>0x3 ? 19 : 35) - (char)(imm), \
564*67e74705SXin Li         ((char)(imm)&0xF0) ?  4 : ((char)(imm)>0x4 ? 20 : 36) - (char)(imm), \
565*67e74705SXin Li         ((char)(imm)&0xF0) ?  5 : ((char)(imm)>0x5 ? 21 : 37) - (char)(imm), \
566*67e74705SXin Li         ((char)(imm)&0xF0) ?  6 : ((char)(imm)>0x6 ? 22 : 38) - (char)(imm), \
567*67e74705SXin Li         ((char)(imm)&0xF0) ?  7 : ((char)(imm)>0x7 ? 23 : 39) - (char)(imm), \
568*67e74705SXin Li         ((char)(imm)&0xF0) ?  8 : ((char)(imm)>0x8 ? 24 : 40) - (char)(imm), \
569*67e74705SXin Li         ((char)(imm)&0xF0) ?  9 : ((char)(imm)>0x9 ? 25 : 41) - (char)(imm), \
570*67e74705SXin Li         ((char)(imm)&0xF0) ? 10 : ((char)(imm)>0xA ? 26 : 42) - (char)(imm), \
571*67e74705SXin Li         ((char)(imm)&0xF0) ? 11 : ((char)(imm)>0xB ? 27 : 43) - (char)(imm), \
572*67e74705SXin Li         ((char)(imm)&0xF0) ? 12 : ((char)(imm)>0xC ? 28 : 44) - (char)(imm), \
573*67e74705SXin Li         ((char)(imm)&0xF0) ? 13 : ((char)(imm)>0xD ? 29 : 45) - (char)(imm), \
574*67e74705SXin Li         ((char)(imm)&0xF0) ? 14 : ((char)(imm)>0xE ? 30 : 46) - (char)(imm), \
575*67e74705SXin Li         ((char)(imm)&0xF0) ? 15 : ((char)(imm)>0xF ? 31 : 47) - (char)(imm), \
576*67e74705SXin Li         ((char)(imm)&0xF0) ? 16 : ((char)(imm)>0x0 ? 32 : 48) - (char)(imm), \
577*67e74705SXin Li         ((char)(imm)&0xF0) ? 17 : ((char)(imm)>0x1 ? 33 : 49) - (char)(imm), \
578*67e74705SXin Li         ((char)(imm)&0xF0) ? 18 : ((char)(imm)>0x2 ? 34 : 50) - (char)(imm), \
579*67e74705SXin Li         ((char)(imm)&0xF0) ? 19 : ((char)(imm)>0x3 ? 35 : 51) - (char)(imm), \
580*67e74705SXin Li         ((char)(imm)&0xF0) ? 20 : ((char)(imm)>0x4 ? 36 : 52) - (char)(imm), \
581*67e74705SXin Li         ((char)(imm)&0xF0) ? 21 : ((char)(imm)>0x5 ? 37 : 53) - (char)(imm), \
582*67e74705SXin Li         ((char)(imm)&0xF0) ? 22 : ((char)(imm)>0x6 ? 38 : 54) - (char)(imm), \
583*67e74705SXin Li         ((char)(imm)&0xF0) ? 23 : ((char)(imm)>0x7 ? 39 : 55) - (char)(imm), \
584*67e74705SXin Li         ((char)(imm)&0xF0) ? 24 : ((char)(imm)>0x8 ? 40 : 56) - (char)(imm), \
585*67e74705SXin Li         ((char)(imm)&0xF0) ? 25 : ((char)(imm)>0x9 ? 41 : 57) - (char)(imm), \
586*67e74705SXin Li         ((char)(imm)&0xF0) ? 26 : ((char)(imm)>0xA ? 42 : 58) - (char)(imm), \
587*67e74705SXin Li         ((char)(imm)&0xF0) ? 27 : ((char)(imm)>0xB ? 43 : 59) - (char)(imm), \
588*67e74705SXin Li         ((char)(imm)&0xF0) ? 28 : ((char)(imm)>0xC ? 44 : 60) - (char)(imm), \
589*67e74705SXin Li         ((char)(imm)&0xF0) ? 29 : ((char)(imm)>0xD ? 45 : 61) - (char)(imm), \
590*67e74705SXin Li         ((char)(imm)&0xF0) ? 30 : ((char)(imm)>0xE ? 46 : 62) - (char)(imm), \
591*67e74705SXin Li         ((char)(imm)&0xF0) ? 31 : ((char)(imm)>0xF ? 47 : 63) - (char)(imm)); })
592*67e74705SXin Li 
593*67e74705SXin Li #define _mm256_bslli_epi128(a, count) _mm256_slli_si256((a), (count))
594*67e74705SXin Li 
595*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_slli_epi16(__m256i __a,int __count)596*67e74705SXin Li _mm256_slli_epi16(__m256i __a, int __count)
597*67e74705SXin Li {
598*67e74705SXin Li   return (__m256i)__builtin_ia32_psllwi256((__v16hi)__a, __count);
599*67e74705SXin Li }
600*67e74705SXin Li 
601*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_sll_epi16(__m256i __a,__m128i __count)602*67e74705SXin Li _mm256_sll_epi16(__m256i __a, __m128i __count)
603*67e74705SXin Li {
604*67e74705SXin Li   return (__m256i)__builtin_ia32_psllw256((__v16hi)__a, (__v8hi)__count);
605*67e74705SXin Li }
606*67e74705SXin Li 
607*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_slli_epi32(__m256i __a,int __count)608*67e74705SXin Li _mm256_slli_epi32(__m256i __a, int __count)
609*67e74705SXin Li {
610*67e74705SXin Li   return (__m256i)__builtin_ia32_pslldi256((__v8si)__a, __count);
611*67e74705SXin Li }
612*67e74705SXin Li 
613*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_sll_epi32(__m256i __a,__m128i __count)614*67e74705SXin Li _mm256_sll_epi32(__m256i __a, __m128i __count)
615*67e74705SXin Li {
616*67e74705SXin Li   return (__m256i)__builtin_ia32_pslld256((__v8si)__a, (__v4si)__count);
617*67e74705SXin Li }
618*67e74705SXin Li 
619*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_slli_epi64(__m256i __a,int __count)620*67e74705SXin Li _mm256_slli_epi64(__m256i __a, int __count)
621*67e74705SXin Li {
622*67e74705SXin Li   return __builtin_ia32_psllqi256((__v4di)__a, __count);
623*67e74705SXin Li }
624*67e74705SXin Li 
625*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_sll_epi64(__m256i __a,__m128i __count)626*67e74705SXin Li _mm256_sll_epi64(__m256i __a, __m128i __count)
627*67e74705SXin Li {
628*67e74705SXin Li   return __builtin_ia32_psllq256((__v4di)__a, __count);
629*67e74705SXin Li }
630*67e74705SXin Li 
631*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_srai_epi16(__m256i __a,int __count)632*67e74705SXin Li _mm256_srai_epi16(__m256i __a, int __count)
633*67e74705SXin Li {
634*67e74705SXin Li   return (__m256i)__builtin_ia32_psrawi256((__v16hi)__a, __count);
635*67e74705SXin Li }
636*67e74705SXin Li 
637*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_sra_epi16(__m256i __a,__m128i __count)638*67e74705SXin Li _mm256_sra_epi16(__m256i __a, __m128i __count)
639*67e74705SXin Li {
640*67e74705SXin Li   return (__m256i)__builtin_ia32_psraw256((__v16hi)__a, (__v8hi)__count);
641*67e74705SXin Li }
642*67e74705SXin Li 
643*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_srai_epi32(__m256i __a,int __count)644*67e74705SXin Li _mm256_srai_epi32(__m256i __a, int __count)
645*67e74705SXin Li {
646*67e74705SXin Li   return (__m256i)__builtin_ia32_psradi256((__v8si)__a, __count);
647*67e74705SXin Li }
648*67e74705SXin Li 
649*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_sra_epi32(__m256i __a,__m128i __count)650*67e74705SXin Li _mm256_sra_epi32(__m256i __a, __m128i __count)
651*67e74705SXin Li {
652*67e74705SXin Li   return (__m256i)__builtin_ia32_psrad256((__v8si)__a, (__v4si)__count);
653*67e74705SXin Li }
654*67e74705SXin Li 
655*67e74705SXin Li #define _mm256_srli_si256(a, imm) __extension__ ({ \
656*67e74705SXin Li   (__m256i)__builtin_shufflevector(                                           \
657*67e74705SXin Li         (__v32qi)(__m256i)(a),                                               \
658*67e74705SXin Li         (__v32qi)_mm256_setzero_si256(),                                     \
659*67e74705SXin Li         ((char)(imm)&0xF0) ? 32 : (char)(imm) + ((char)(imm)>0xF ? 16 : 0),  \
660*67e74705SXin Li         ((char)(imm)&0xF0) ? 33 : (char)(imm) + ((char)(imm)>0xE ? 17 : 1),  \
661*67e74705SXin Li         ((char)(imm)&0xF0) ? 34 : (char)(imm) + ((char)(imm)>0xD ? 18 : 2),  \
662*67e74705SXin Li         ((char)(imm)&0xF0) ? 35 : (char)(imm) + ((char)(imm)>0xC ? 19 : 3),  \
663*67e74705SXin Li         ((char)(imm)&0xF0) ? 36 : (char)(imm) + ((char)(imm)>0xB ? 20 : 4),  \
664*67e74705SXin Li         ((char)(imm)&0xF0) ? 37 : (char)(imm) + ((char)(imm)>0xA ? 21 : 5),  \
665*67e74705SXin Li         ((char)(imm)&0xF0) ? 38 : (char)(imm) + ((char)(imm)>0x9 ? 22 : 6),  \
666*67e74705SXin Li         ((char)(imm)&0xF0) ? 39 : (char)(imm) + ((char)(imm)>0x8 ? 23 : 7),  \
667*67e74705SXin Li         ((char)(imm)&0xF0) ? 40 : (char)(imm) + ((char)(imm)>0x7 ? 24 : 8),  \
668*67e74705SXin Li         ((char)(imm)&0xF0) ? 41 : (char)(imm) + ((char)(imm)>0x6 ? 25 : 9),  \
669*67e74705SXin Li         ((char)(imm)&0xF0) ? 42 : (char)(imm) + ((char)(imm)>0x5 ? 26 : 10), \
670*67e74705SXin Li         ((char)(imm)&0xF0) ? 43 : (char)(imm) + ((char)(imm)>0x4 ? 27 : 11), \
671*67e74705SXin Li         ((char)(imm)&0xF0) ? 44 : (char)(imm) + ((char)(imm)>0x3 ? 28 : 12), \
672*67e74705SXin Li         ((char)(imm)&0xF0) ? 45 : (char)(imm) + ((char)(imm)>0x2 ? 29 : 13), \
673*67e74705SXin Li         ((char)(imm)&0xF0) ? 46 : (char)(imm) + ((char)(imm)>0x1 ? 30 : 14), \
674*67e74705SXin Li         ((char)(imm)&0xF0) ? 47 : (char)(imm) + ((char)(imm)>0x0 ? 31 : 15), \
675*67e74705SXin Li         ((char)(imm)&0xF0) ? 48 : (char)(imm) + ((char)(imm)>0xF ? 32 : 16), \
676*67e74705SXin Li         ((char)(imm)&0xF0) ? 49 : (char)(imm) + ((char)(imm)>0xE ? 33 : 17), \
677*67e74705SXin Li         ((char)(imm)&0xF0) ? 50 : (char)(imm) + ((char)(imm)>0xD ? 34 : 18), \
678*67e74705SXin Li         ((char)(imm)&0xF0) ? 51 : (char)(imm) + ((char)(imm)>0xC ? 35 : 19), \
679*67e74705SXin Li         ((char)(imm)&0xF0) ? 52 : (char)(imm) + ((char)(imm)>0xB ? 36 : 20), \
680*67e74705SXin Li         ((char)(imm)&0xF0) ? 53 : (char)(imm) + ((char)(imm)>0xA ? 37 : 21), \
681*67e74705SXin Li         ((char)(imm)&0xF0) ? 54 : (char)(imm) + ((char)(imm)>0x9 ? 38 : 22), \
682*67e74705SXin Li         ((char)(imm)&0xF0) ? 55 : (char)(imm) + ((char)(imm)>0x8 ? 39 : 23), \
683*67e74705SXin Li         ((char)(imm)&0xF0) ? 56 : (char)(imm) + ((char)(imm)>0x7 ? 40 : 24), \
684*67e74705SXin Li         ((char)(imm)&0xF0) ? 57 : (char)(imm) + ((char)(imm)>0x6 ? 41 : 25), \
685*67e74705SXin Li         ((char)(imm)&0xF0) ? 58 : (char)(imm) + ((char)(imm)>0x5 ? 42 : 26), \
686*67e74705SXin Li         ((char)(imm)&0xF0) ? 59 : (char)(imm) + ((char)(imm)>0x4 ? 43 : 27), \
687*67e74705SXin Li         ((char)(imm)&0xF0) ? 60 : (char)(imm) + ((char)(imm)>0x3 ? 44 : 28), \
688*67e74705SXin Li         ((char)(imm)&0xF0) ? 61 : (char)(imm) + ((char)(imm)>0x2 ? 45 : 29), \
689*67e74705SXin Li         ((char)(imm)&0xF0) ? 62 : (char)(imm) + ((char)(imm)>0x1 ? 46 : 30), \
690*67e74705SXin Li         ((char)(imm)&0xF0) ? 63 : (char)(imm) + ((char)(imm)>0x0 ? 47 : 31)); })
691*67e74705SXin Li 
692*67e74705SXin Li #define _mm256_bsrli_epi128(a, count) _mm256_srli_si256((a), (count))
693*67e74705SXin Li 
694*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_srli_epi16(__m256i __a,int __count)695*67e74705SXin Li _mm256_srli_epi16(__m256i __a, int __count)
696*67e74705SXin Li {
697*67e74705SXin Li   return (__m256i)__builtin_ia32_psrlwi256((__v16hi)__a, __count);
698*67e74705SXin Li }
699*67e74705SXin Li 
700*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_srl_epi16(__m256i __a,__m128i __count)701*67e74705SXin Li _mm256_srl_epi16(__m256i __a, __m128i __count)
702*67e74705SXin Li {
703*67e74705SXin Li   return (__m256i)__builtin_ia32_psrlw256((__v16hi)__a, (__v8hi)__count);
704*67e74705SXin Li }
705*67e74705SXin Li 
706*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_srli_epi32(__m256i __a,int __count)707*67e74705SXin Li _mm256_srli_epi32(__m256i __a, int __count)
708*67e74705SXin Li {
709*67e74705SXin Li   return (__m256i)__builtin_ia32_psrldi256((__v8si)__a, __count);
710*67e74705SXin Li }
711*67e74705SXin Li 
712*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_srl_epi32(__m256i __a,__m128i __count)713*67e74705SXin Li _mm256_srl_epi32(__m256i __a, __m128i __count)
714*67e74705SXin Li {
715*67e74705SXin Li   return (__m256i)__builtin_ia32_psrld256((__v8si)__a, (__v4si)__count);
716*67e74705SXin Li }
717*67e74705SXin Li 
718*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_srli_epi64(__m256i __a,int __count)719*67e74705SXin Li _mm256_srli_epi64(__m256i __a, int __count)
720*67e74705SXin Li {
721*67e74705SXin Li   return __builtin_ia32_psrlqi256((__v4di)__a, __count);
722*67e74705SXin Li }
723*67e74705SXin Li 
724*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_srl_epi64(__m256i __a,__m128i __count)725*67e74705SXin Li _mm256_srl_epi64(__m256i __a, __m128i __count)
726*67e74705SXin Li {
727*67e74705SXin Li   return __builtin_ia32_psrlq256((__v4di)__a, __count);
728*67e74705SXin Li }
729*67e74705SXin Li 
730*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_sub_epi8(__m256i __a,__m256i __b)731*67e74705SXin Li _mm256_sub_epi8(__m256i __a, __m256i __b)
732*67e74705SXin Li {
733*67e74705SXin Li   return (__m256i)((__v32qu)__a - (__v32qu)__b);
734*67e74705SXin Li }
735*67e74705SXin Li 
736*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_sub_epi16(__m256i __a,__m256i __b)737*67e74705SXin Li _mm256_sub_epi16(__m256i __a, __m256i __b)
738*67e74705SXin Li {
739*67e74705SXin Li   return (__m256i)((__v16hu)__a - (__v16hu)__b);
740*67e74705SXin Li }
741*67e74705SXin Li 
742*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_sub_epi32(__m256i __a,__m256i __b)743*67e74705SXin Li _mm256_sub_epi32(__m256i __a, __m256i __b)
744*67e74705SXin Li {
745*67e74705SXin Li   return (__m256i)((__v8su)__a - (__v8su)__b);
746*67e74705SXin Li }
747*67e74705SXin Li 
748*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_sub_epi64(__m256i __a,__m256i __b)749*67e74705SXin Li _mm256_sub_epi64(__m256i __a, __m256i __b)
750*67e74705SXin Li {
751*67e74705SXin Li   return (__m256i)((__v4du)__a - (__v4du)__b);
752*67e74705SXin Li }
753*67e74705SXin Li 
754*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_subs_epi8(__m256i __a,__m256i __b)755*67e74705SXin Li _mm256_subs_epi8(__m256i __a, __m256i __b)
756*67e74705SXin Li {
757*67e74705SXin Li   return (__m256i)__builtin_ia32_psubsb256((__v32qi)__a, (__v32qi)__b);
758*67e74705SXin Li }
759*67e74705SXin Li 
760*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_subs_epi16(__m256i __a,__m256i __b)761*67e74705SXin Li _mm256_subs_epi16(__m256i __a, __m256i __b)
762*67e74705SXin Li {
763*67e74705SXin Li   return (__m256i)__builtin_ia32_psubsw256((__v16hi)__a, (__v16hi)__b);
764*67e74705SXin Li }
765*67e74705SXin Li 
766*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_subs_epu8(__m256i __a,__m256i __b)767*67e74705SXin Li _mm256_subs_epu8(__m256i __a, __m256i __b)
768*67e74705SXin Li {
769*67e74705SXin Li   return (__m256i)__builtin_ia32_psubusb256((__v32qi)__a, (__v32qi)__b);
770*67e74705SXin Li }
771*67e74705SXin Li 
772*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_subs_epu16(__m256i __a,__m256i __b)773*67e74705SXin Li _mm256_subs_epu16(__m256i __a, __m256i __b)
774*67e74705SXin Li {
775*67e74705SXin Li   return (__m256i)__builtin_ia32_psubusw256((__v16hi)__a, (__v16hi)__b);
776*67e74705SXin Li }
777*67e74705SXin Li 
778*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_unpackhi_epi8(__m256i __a,__m256i __b)779*67e74705SXin Li _mm256_unpackhi_epi8(__m256i __a, __m256i __b)
780*67e74705SXin Li {
781*67e74705SXin Li   return (__m256i)__builtin_shufflevector((__v32qi)__a, (__v32qi)__b, 8, 32+8, 9, 32+9, 10, 32+10, 11, 32+11, 12, 32+12, 13, 32+13, 14, 32+14, 15, 32+15, 24, 32+24, 25, 32+25, 26, 32+26, 27, 32+27, 28, 32+28, 29, 32+29, 30, 32+30, 31, 32+31);
782*67e74705SXin Li }
783*67e74705SXin Li 
784*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_unpackhi_epi16(__m256i __a,__m256i __b)785*67e74705SXin Li _mm256_unpackhi_epi16(__m256i __a, __m256i __b)
786*67e74705SXin Li {
787*67e74705SXin Li   return (__m256i)__builtin_shufflevector((__v16hi)__a, (__v16hi)__b, 4, 16+4, 5, 16+5, 6, 16+6, 7, 16+7, 12, 16+12, 13, 16+13, 14, 16+14, 15, 16+15);
788*67e74705SXin Li }
789*67e74705SXin Li 
790*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_unpackhi_epi32(__m256i __a,__m256i __b)791*67e74705SXin Li _mm256_unpackhi_epi32(__m256i __a, __m256i __b)
792*67e74705SXin Li {
793*67e74705SXin Li   return (__m256i)__builtin_shufflevector((__v8si)__a, (__v8si)__b, 2, 8+2, 3, 8+3, 6, 8+6, 7, 8+7);
794*67e74705SXin Li }
795*67e74705SXin Li 
796*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_unpackhi_epi64(__m256i __a,__m256i __b)797*67e74705SXin Li _mm256_unpackhi_epi64(__m256i __a, __m256i __b)
798*67e74705SXin Li {
799*67e74705SXin Li   return (__m256i)__builtin_shufflevector((__v4di)__a, (__v4di)__b, 1, 4+1, 3, 4+3);
800*67e74705SXin Li }
801*67e74705SXin Li 
802*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_unpacklo_epi8(__m256i __a,__m256i __b)803*67e74705SXin Li _mm256_unpacklo_epi8(__m256i __a, __m256i __b)
804*67e74705SXin Li {
805*67e74705SXin Li   return (__m256i)__builtin_shufflevector((__v32qi)__a, (__v32qi)__b, 0, 32+0, 1, 32+1, 2, 32+2, 3, 32+3, 4, 32+4, 5, 32+5, 6, 32+6, 7, 32+7, 16, 32+16, 17, 32+17, 18, 32+18, 19, 32+19, 20, 32+20, 21, 32+21, 22, 32+22, 23, 32+23);
806*67e74705SXin Li }
807*67e74705SXin Li 
808*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_unpacklo_epi16(__m256i __a,__m256i __b)809*67e74705SXin Li _mm256_unpacklo_epi16(__m256i __a, __m256i __b)
810*67e74705SXin Li {
811*67e74705SXin Li   return (__m256i)__builtin_shufflevector((__v16hi)__a, (__v16hi)__b, 0, 16+0, 1, 16+1, 2, 16+2, 3, 16+3, 8, 16+8, 9, 16+9, 10, 16+10, 11, 16+11);
812*67e74705SXin Li }
813*67e74705SXin Li 
814*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_unpacklo_epi32(__m256i __a,__m256i __b)815*67e74705SXin Li _mm256_unpacklo_epi32(__m256i __a, __m256i __b)
816*67e74705SXin Li {
817*67e74705SXin Li   return (__m256i)__builtin_shufflevector((__v8si)__a, (__v8si)__b, 0, 8+0, 1, 8+1, 4, 8+4, 5, 8+5);
818*67e74705SXin Li }
819*67e74705SXin Li 
820*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_unpacklo_epi64(__m256i __a,__m256i __b)821*67e74705SXin Li _mm256_unpacklo_epi64(__m256i __a, __m256i __b)
822*67e74705SXin Li {
823*67e74705SXin Li   return (__m256i)__builtin_shufflevector((__v4di)__a, (__v4di)__b, 0, 4+0, 2, 4+2);
824*67e74705SXin Li }
825*67e74705SXin Li 
826*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_xor_si256(__m256i __a,__m256i __b)827*67e74705SXin Li _mm256_xor_si256(__m256i __a, __m256i __b)
828*67e74705SXin Li {
829*67e74705SXin Li   return (__m256i)((__v4du)__a ^ (__v4du)__b);
830*67e74705SXin Li }
831*67e74705SXin Li 
832*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_stream_load_si256(__m256i const * __V)833*67e74705SXin Li _mm256_stream_load_si256(__m256i const *__V)
834*67e74705SXin Li {
835*67e74705SXin Li   return (__m256i)__builtin_ia32_movntdqa256((const __v4di *)__V);
836*67e74705SXin Li }
837*67e74705SXin Li 
838*67e74705SXin Li static __inline__ __m128 __DEFAULT_FN_ATTRS
_mm_broadcastss_ps(__m128 __X)839*67e74705SXin Li _mm_broadcastss_ps(__m128 __X)
840*67e74705SXin Li {
841*67e74705SXin Li   return (__m128)__builtin_shufflevector((__v4sf)__X, (__v4sf)__X, 0, 0, 0, 0);
842*67e74705SXin Li }
843*67e74705SXin Li 
844*67e74705SXin Li static __inline__ __m128d __DEFAULT_FN_ATTRS
_mm_broadcastsd_pd(__m128d __a)845*67e74705SXin Li _mm_broadcastsd_pd(__m128d __a)
846*67e74705SXin Li {
847*67e74705SXin Li   return __builtin_shufflevector((__v2df)__a, (__v2df)__a, 0, 0);
848*67e74705SXin Li }
849*67e74705SXin Li 
850*67e74705SXin Li static __inline__ __m256 __DEFAULT_FN_ATTRS
_mm256_broadcastss_ps(__m128 __X)851*67e74705SXin Li _mm256_broadcastss_ps(__m128 __X)
852*67e74705SXin Li {
853*67e74705SXin Li   return (__m256)__builtin_shufflevector((__v4sf)__X, (__v4sf)__X, 0, 0, 0, 0, 0, 0, 0, 0);
854*67e74705SXin Li }
855*67e74705SXin Li 
856*67e74705SXin Li static __inline__ __m256d __DEFAULT_FN_ATTRS
_mm256_broadcastsd_pd(__m128d __X)857*67e74705SXin Li _mm256_broadcastsd_pd(__m128d __X)
858*67e74705SXin Li {
859*67e74705SXin Li   return (__m256d)__builtin_shufflevector((__v2df)__X, (__v2df)__X, 0, 0, 0, 0);
860*67e74705SXin Li }
861*67e74705SXin Li 
862*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_broadcastsi128_si256(__m128i __X)863*67e74705SXin Li _mm256_broadcastsi128_si256(__m128i __X)
864*67e74705SXin Li {
865*67e74705SXin Li   return (__m256i)__builtin_shufflevector((__v2di)__X, (__v2di)__X, 0, 1, 0, 1);
866*67e74705SXin Li }
867*67e74705SXin Li 
868*67e74705SXin Li #define _mm_blend_epi32(V1, V2, M) __extension__ ({ \
869*67e74705SXin Li   (__m128i)__builtin_shufflevector((__v4si)(__m128i)(V1),  \
870*67e74705SXin Li                                    (__v4si)(__m128i)(V2),  \
871*67e74705SXin Li                                    (((M) & 0x01) ? 4 : 0), \
872*67e74705SXin Li                                    (((M) & 0x02) ? 5 : 1), \
873*67e74705SXin Li                                    (((M) & 0x04) ? 6 : 2), \
874*67e74705SXin Li                                    (((M) & 0x08) ? 7 : 3)); })
875*67e74705SXin Li 
876*67e74705SXin Li #define _mm256_blend_epi32(V1, V2, M) __extension__ ({ \
877*67e74705SXin Li   (__m256i)__builtin_shufflevector((__v8si)(__m256i)(V1),   \
878*67e74705SXin Li                                    (__v8si)(__m256i)(V2),   \
879*67e74705SXin Li                                    (((M) & 0x01) ?  8 : 0), \
880*67e74705SXin Li                                    (((M) & 0x02) ?  9 : 1), \
881*67e74705SXin Li                                    (((M) & 0x04) ? 10 : 2), \
882*67e74705SXin Li                                    (((M) & 0x08) ? 11 : 3), \
883*67e74705SXin Li                                    (((M) & 0x10) ? 12 : 4), \
884*67e74705SXin Li                                    (((M) & 0x20) ? 13 : 5), \
885*67e74705SXin Li                                    (((M) & 0x40) ? 14 : 6), \
886*67e74705SXin Li                                    (((M) & 0x80) ? 15 : 7)); })
887*67e74705SXin Li 
888*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_broadcastb_epi8(__m128i __X)889*67e74705SXin Li _mm256_broadcastb_epi8(__m128i __X)
890*67e74705SXin Li {
891*67e74705SXin Li   return (__m256i)__builtin_shufflevector((__v16qi)__X, (__v16qi)__X, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
892*67e74705SXin Li }
893*67e74705SXin Li 
894*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_broadcastw_epi16(__m128i __X)895*67e74705SXin Li _mm256_broadcastw_epi16(__m128i __X)
896*67e74705SXin Li {
897*67e74705SXin Li   return (__m256i)__builtin_shufflevector((__v8hi)__X, (__v8hi)__X, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
898*67e74705SXin Li }
899*67e74705SXin Li 
900*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_broadcastd_epi32(__m128i __X)901*67e74705SXin Li _mm256_broadcastd_epi32(__m128i __X)
902*67e74705SXin Li {
903*67e74705SXin Li   return (__m256i)__builtin_shufflevector((__v4si)__X, (__v4si)__X, 0, 0, 0, 0, 0, 0, 0, 0);
904*67e74705SXin Li }
905*67e74705SXin Li 
906*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_broadcastq_epi64(__m128i __X)907*67e74705SXin Li _mm256_broadcastq_epi64(__m128i __X)
908*67e74705SXin Li {
909*67e74705SXin Li   return (__m256i)__builtin_shufflevector((__v2di)__X, (__v2di)__X, 0, 0, 0, 0);
910*67e74705SXin Li }
911*67e74705SXin Li 
912*67e74705SXin Li static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_broadcastb_epi8(__m128i __X)913*67e74705SXin Li _mm_broadcastb_epi8(__m128i __X)
914*67e74705SXin Li {
915*67e74705SXin Li   return (__m128i)__builtin_shufflevector((__v16qi)__X, (__v16qi)__X, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
916*67e74705SXin Li }
917*67e74705SXin Li 
918*67e74705SXin Li static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_broadcastw_epi16(__m128i __X)919*67e74705SXin Li _mm_broadcastw_epi16(__m128i __X)
920*67e74705SXin Li {
921*67e74705SXin Li   return (__m128i)__builtin_shufflevector((__v8hi)__X, (__v8hi)__X, 0, 0, 0, 0, 0, 0, 0, 0);
922*67e74705SXin Li }
923*67e74705SXin Li 
924*67e74705SXin Li 
925*67e74705SXin Li static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_broadcastd_epi32(__m128i __X)926*67e74705SXin Li _mm_broadcastd_epi32(__m128i __X)
927*67e74705SXin Li {
928*67e74705SXin Li   return (__m128i)__builtin_shufflevector((__v4si)__X, (__v4si)__X, 0, 0, 0, 0);
929*67e74705SXin Li }
930*67e74705SXin Li 
931*67e74705SXin Li static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_broadcastq_epi64(__m128i __X)932*67e74705SXin Li _mm_broadcastq_epi64(__m128i __X)
933*67e74705SXin Li {
934*67e74705SXin Li   return (__m128i)__builtin_shufflevector((__v2di)__X, (__v2di)__X, 0, 0);
935*67e74705SXin Li }
936*67e74705SXin Li 
937*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_permutevar8x32_epi32(__m256i __a,__m256i __b)938*67e74705SXin Li _mm256_permutevar8x32_epi32(__m256i __a, __m256i __b)
939*67e74705SXin Li {
940*67e74705SXin Li   return (__m256i)__builtin_ia32_permvarsi256((__v8si)__a, (__v8si)__b);
941*67e74705SXin Li }
942*67e74705SXin Li 
943*67e74705SXin Li #define _mm256_permute4x64_pd(V, M) __extension__ ({ \
944*67e74705SXin Li   (__m256d)__builtin_shufflevector((__v4df)(__m256d)(V), \
945*67e74705SXin Li                                    (__v4df)_mm256_undefined_pd(), \
946*67e74705SXin Li                                    ((M) >> 0) & 0x3, \
947*67e74705SXin Li                                    ((M) >> 2) & 0x3, \
948*67e74705SXin Li                                    ((M) >> 4) & 0x3, \
949*67e74705SXin Li                                    ((M) >> 6) & 0x3); })
950*67e74705SXin Li 
951*67e74705SXin Li static __inline__ __m256 __DEFAULT_FN_ATTRS
_mm256_permutevar8x32_ps(__m256 __a,__m256i __b)952*67e74705SXin Li _mm256_permutevar8x32_ps(__m256 __a, __m256i __b)
953*67e74705SXin Li {
954*67e74705SXin Li   return (__m256)__builtin_ia32_permvarsf256((__v8sf)__a, (__v8si)__b);
955*67e74705SXin Li }
956*67e74705SXin Li 
957*67e74705SXin Li #define _mm256_permute4x64_epi64(V, M) __extension__ ({ \
958*67e74705SXin Li   (__m256i)__builtin_shufflevector((__v4di)(__m256i)(V), \
959*67e74705SXin Li                                    (__v4di)_mm256_undefined_si256(), \
960*67e74705SXin Li                                    ((M) >> 0) & 0x3, \
961*67e74705SXin Li                                    ((M) >> 2) & 0x3, \
962*67e74705SXin Li                                    ((M) >> 4) & 0x3, \
963*67e74705SXin Li                                    ((M) >> 6) & 0x3); })
964*67e74705SXin Li 
965*67e74705SXin Li #define _mm256_permute2x128_si256(V1, V2, M) __extension__ ({ \
966*67e74705SXin Li   (__m256i)__builtin_ia32_permti256((__m256i)(V1), (__m256i)(V2), (M)); })
967*67e74705SXin Li 
968*67e74705SXin Li #define _mm256_extracti128_si256(V, M) __extension__ ({ \
969*67e74705SXin Li   (__m128i)__builtin_shufflevector((__v4di)(__m256i)(V), \
970*67e74705SXin Li                                    (__v4di)_mm256_undefined_si256(), \
971*67e74705SXin Li                                    (((M) & 1) ? 2 : 0), \
972*67e74705SXin Li                                    (((M) & 1) ? 3 : 1) ); })
973*67e74705SXin Li 
974*67e74705SXin Li #define _mm256_inserti128_si256(V1, V2, M) __extension__ ({ \
975*67e74705SXin Li   (__m256i)__builtin_shufflevector((__v4di)(__m256i)(V1), \
976*67e74705SXin Li                                    (__v4di)_mm256_castsi128_si256((__m128i)(V2)), \
977*67e74705SXin Li                                    (((M) & 1) ? 0 : 4), \
978*67e74705SXin Li                                    (((M) & 1) ? 1 : 5), \
979*67e74705SXin Li                                    (((M) & 1) ? 4 : 2), \
980*67e74705SXin Li                                    (((M) & 1) ? 5 : 3) ); })
981*67e74705SXin Li 
982*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_maskload_epi32(int const * __X,__m256i __M)983*67e74705SXin Li _mm256_maskload_epi32(int const *__X, __m256i __M)
984*67e74705SXin Li {
985*67e74705SXin Li   return (__m256i)__builtin_ia32_maskloadd256((const __v8si *)__X, (__v8si)__M);
986*67e74705SXin Li }
987*67e74705SXin Li 
988*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_maskload_epi64(long long const * __X,__m256i __M)989*67e74705SXin Li _mm256_maskload_epi64(long long const *__X, __m256i __M)
990*67e74705SXin Li {
991*67e74705SXin Li   return (__m256i)__builtin_ia32_maskloadq256((const __v4di *)__X, (__v4di)__M);
992*67e74705SXin Li }
993*67e74705SXin Li 
994*67e74705SXin Li static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_maskload_epi32(int const * __X,__m128i __M)995*67e74705SXin Li _mm_maskload_epi32(int const *__X, __m128i __M)
996*67e74705SXin Li {
997*67e74705SXin Li   return (__m128i)__builtin_ia32_maskloadd((const __v4si *)__X, (__v4si)__M);
998*67e74705SXin Li }
999*67e74705SXin Li 
1000*67e74705SXin Li static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_maskload_epi64(long long const * __X,__m128i __M)1001*67e74705SXin Li _mm_maskload_epi64(long long const *__X, __m128i __M)
1002*67e74705SXin Li {
1003*67e74705SXin Li   return (__m128i)__builtin_ia32_maskloadq((const __v2di *)__X, (__v2di)__M);
1004*67e74705SXin Li }
1005*67e74705SXin Li 
1006*67e74705SXin Li static __inline__ void __DEFAULT_FN_ATTRS
_mm256_maskstore_epi32(int * __X,__m256i __M,__m256i __Y)1007*67e74705SXin Li _mm256_maskstore_epi32(int *__X, __m256i __M, __m256i __Y)
1008*67e74705SXin Li {
1009*67e74705SXin Li   __builtin_ia32_maskstored256((__v8si *)__X, (__v8si)__M, (__v8si)__Y);
1010*67e74705SXin Li }
1011*67e74705SXin Li 
1012*67e74705SXin Li static __inline__ void __DEFAULT_FN_ATTRS
_mm256_maskstore_epi64(long long * __X,__m256i __M,__m256i __Y)1013*67e74705SXin Li _mm256_maskstore_epi64(long long *__X, __m256i __M, __m256i __Y)
1014*67e74705SXin Li {
1015*67e74705SXin Li   __builtin_ia32_maskstoreq256((__v4di *)__X, (__v4di)__M, (__v4di)__Y);
1016*67e74705SXin Li }
1017*67e74705SXin Li 
1018*67e74705SXin Li static __inline__ void __DEFAULT_FN_ATTRS
_mm_maskstore_epi32(int * __X,__m128i __M,__m128i __Y)1019*67e74705SXin Li _mm_maskstore_epi32(int *__X, __m128i __M, __m128i __Y)
1020*67e74705SXin Li {
1021*67e74705SXin Li   __builtin_ia32_maskstored((__v4si *)__X, (__v4si)__M, (__v4si)__Y);
1022*67e74705SXin Li }
1023*67e74705SXin Li 
1024*67e74705SXin Li static __inline__ void __DEFAULT_FN_ATTRS
_mm_maskstore_epi64(long long * __X,__m128i __M,__m128i __Y)1025*67e74705SXin Li _mm_maskstore_epi64(long long *__X, __m128i __M, __m128i __Y)
1026*67e74705SXin Li {
1027*67e74705SXin Li   __builtin_ia32_maskstoreq(( __v2di *)__X, (__v2di)__M, (__v2di)__Y);
1028*67e74705SXin Li }
1029*67e74705SXin Li 
1030*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_sllv_epi32(__m256i __X,__m256i __Y)1031*67e74705SXin Li _mm256_sllv_epi32(__m256i __X, __m256i __Y)
1032*67e74705SXin Li {
1033*67e74705SXin Li   return (__m256i)__builtin_ia32_psllv8si((__v8si)__X, (__v8si)__Y);
1034*67e74705SXin Li }
1035*67e74705SXin Li 
1036*67e74705SXin Li static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_sllv_epi32(__m128i __X,__m128i __Y)1037*67e74705SXin Li _mm_sllv_epi32(__m128i __X, __m128i __Y)
1038*67e74705SXin Li {
1039*67e74705SXin Li   return (__m128i)__builtin_ia32_psllv4si((__v4si)__X, (__v4si)__Y);
1040*67e74705SXin Li }
1041*67e74705SXin Li 
1042*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_sllv_epi64(__m256i __X,__m256i __Y)1043*67e74705SXin Li _mm256_sllv_epi64(__m256i __X, __m256i __Y)
1044*67e74705SXin Li {
1045*67e74705SXin Li   return (__m256i)__builtin_ia32_psllv4di((__v4di)__X, (__v4di)__Y);
1046*67e74705SXin Li }
1047*67e74705SXin Li 
1048*67e74705SXin Li static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_sllv_epi64(__m128i __X,__m128i __Y)1049*67e74705SXin Li _mm_sllv_epi64(__m128i __X, __m128i __Y)
1050*67e74705SXin Li {
1051*67e74705SXin Li   return (__m128i)__builtin_ia32_psllv2di((__v2di)__X, (__v2di)__Y);
1052*67e74705SXin Li }
1053*67e74705SXin Li 
1054*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_srav_epi32(__m256i __X,__m256i __Y)1055*67e74705SXin Li _mm256_srav_epi32(__m256i __X, __m256i __Y)
1056*67e74705SXin Li {
1057*67e74705SXin Li   return (__m256i)__builtin_ia32_psrav8si((__v8si)__X, (__v8si)__Y);
1058*67e74705SXin Li }
1059*67e74705SXin Li 
1060*67e74705SXin Li static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_srav_epi32(__m128i __X,__m128i __Y)1061*67e74705SXin Li _mm_srav_epi32(__m128i __X, __m128i __Y)
1062*67e74705SXin Li {
1063*67e74705SXin Li   return (__m128i)__builtin_ia32_psrav4si((__v4si)__X, (__v4si)__Y);
1064*67e74705SXin Li }
1065*67e74705SXin Li 
1066*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_srlv_epi32(__m256i __X,__m256i __Y)1067*67e74705SXin Li _mm256_srlv_epi32(__m256i __X, __m256i __Y)
1068*67e74705SXin Li {
1069*67e74705SXin Li   return (__m256i)__builtin_ia32_psrlv8si((__v8si)__X, (__v8si)__Y);
1070*67e74705SXin Li }
1071*67e74705SXin Li 
1072*67e74705SXin Li static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_srlv_epi32(__m128i __X,__m128i __Y)1073*67e74705SXin Li _mm_srlv_epi32(__m128i __X, __m128i __Y)
1074*67e74705SXin Li {
1075*67e74705SXin Li   return (__m128i)__builtin_ia32_psrlv4si((__v4si)__X, (__v4si)__Y);
1076*67e74705SXin Li }
1077*67e74705SXin Li 
1078*67e74705SXin Li static __inline__ __m256i __DEFAULT_FN_ATTRS
_mm256_srlv_epi64(__m256i __X,__m256i __Y)1079*67e74705SXin Li _mm256_srlv_epi64(__m256i __X, __m256i __Y)
1080*67e74705SXin Li {
1081*67e74705SXin Li   return (__m256i)__builtin_ia32_psrlv4di((__v4di)__X, (__v4di)__Y);
1082*67e74705SXin Li }
1083*67e74705SXin Li 
1084*67e74705SXin Li static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_srlv_epi64(__m128i __X,__m128i __Y)1085*67e74705SXin Li _mm_srlv_epi64(__m128i __X, __m128i __Y)
1086*67e74705SXin Li {
1087*67e74705SXin Li   return (__m128i)__builtin_ia32_psrlv2di((__v2di)__X, (__v2di)__Y);
1088*67e74705SXin Li }
1089*67e74705SXin Li 
1090*67e74705SXin Li #define _mm_mask_i32gather_pd(a, m, i, mask, s) __extension__ ({ \
1091*67e74705SXin Li   (__m128d)__builtin_ia32_gatherd_pd((__v2df)(__m128i)(a), \
1092*67e74705SXin Li                                      (double const *)(m), \
1093*67e74705SXin Li                                      (__v4si)(__m128i)(i), \
1094*67e74705SXin Li                                      (__v2df)(__m128d)(mask), (s)); })
1095*67e74705SXin Li 
1096*67e74705SXin Li #define _mm256_mask_i32gather_pd(a, m, i, mask, s) __extension__ ({ \
1097*67e74705SXin Li   (__m256d)__builtin_ia32_gatherd_pd256((__v4df)(__m256d)(a), \
1098*67e74705SXin Li                                         (double const *)(m), \
1099*67e74705SXin Li                                         (__v4si)(__m128i)(i), \
1100*67e74705SXin Li                                         (__v4df)(__m256d)(mask), (s)); })
1101*67e74705SXin Li 
1102*67e74705SXin Li #define _mm_mask_i64gather_pd(a, m, i, mask, s) __extension__ ({ \
1103*67e74705SXin Li   (__m128d)__builtin_ia32_gatherq_pd((__v2df)(__m128d)(a), \
1104*67e74705SXin Li                                      (double const *)(m), \
1105*67e74705SXin Li                                      (__v2di)(__m128i)(i), \
1106*67e74705SXin Li                                      (__v2df)(__m128d)(mask), (s)); })
1107*67e74705SXin Li 
1108*67e74705SXin Li #define _mm256_mask_i64gather_pd(a, m, i, mask, s) __extension__ ({ \
1109*67e74705SXin Li   (__m256d)__builtin_ia32_gatherq_pd256((__v4df)(__m256d)(a), \
1110*67e74705SXin Li                                         (double const *)(m), \
1111*67e74705SXin Li                                         (__v4di)(__m256i)(i), \
1112*67e74705SXin Li                                         (__v4df)(__m256d)(mask), (s)); })
1113*67e74705SXin Li 
1114*67e74705SXin Li #define _mm_mask_i32gather_ps(a, m, i, mask, s) __extension__ ({ \
1115*67e74705SXin Li   (__m128)__builtin_ia32_gatherd_ps((__v4sf)(__m128)(a), \
1116*67e74705SXin Li                                     (float const *)(m), \
1117*67e74705SXin Li                                     (__v4si)(__m128i)(i), \
1118*67e74705SXin Li                                     (__v4sf)(__m128)(mask), (s)); })
1119*67e74705SXin Li 
1120*67e74705SXin Li #define _mm256_mask_i32gather_ps(a, m, i, mask, s) __extension__ ({ \
1121*67e74705SXin Li   (__m256)__builtin_ia32_gatherd_ps256((__v8sf)(__m256)(a), \
1122*67e74705SXin Li                                        (float const *)(m), \
1123*67e74705SXin Li                                        (__v8si)(__m256i)(i), \
1124*67e74705SXin Li                                        (__v8sf)(__m256)(mask), (s)); })
1125*67e74705SXin Li 
1126*67e74705SXin Li #define _mm_mask_i64gather_ps(a, m, i, mask, s) __extension__ ({ \
1127*67e74705SXin Li   (__m128)__builtin_ia32_gatherq_ps((__v4sf)(__m128)(a), \
1128*67e74705SXin Li                                     (float const *)(m), \
1129*67e74705SXin Li                                     (__v2di)(__m128i)(i), \
1130*67e74705SXin Li                                     (__v4sf)(__m128)(mask), (s)); })
1131*67e74705SXin Li 
1132*67e74705SXin Li #define _mm256_mask_i64gather_ps(a, m, i, mask, s) __extension__ ({ \
1133*67e74705SXin Li   (__m128)__builtin_ia32_gatherq_ps256((__v4sf)(__m128)(a), \
1134*67e74705SXin Li                                        (float const *)(m), \
1135*67e74705SXin Li                                        (__v4di)(__m256i)(i), \
1136*67e74705SXin Li                                        (__v4sf)(__m128)(mask), (s)); })
1137*67e74705SXin Li 
1138*67e74705SXin Li #define _mm_mask_i32gather_epi32(a, m, i, mask, s) __extension__ ({ \
1139*67e74705SXin Li   (__m128i)__builtin_ia32_gatherd_d((__v4si)(__m128i)(a), \
1140*67e74705SXin Li                                     (int const *)(m), \
1141*67e74705SXin Li                                     (__v4si)(__m128i)(i), \
1142*67e74705SXin Li                                     (__v4si)(__m128i)(mask), (s)); })
1143*67e74705SXin Li 
1144*67e74705SXin Li #define _mm256_mask_i32gather_epi32(a, m, i, mask, s) __extension__ ({ \
1145*67e74705SXin Li   (__m256i)__builtin_ia32_gatherd_d256((__v8si)(__m256i)(a), \
1146*67e74705SXin Li                                        (int const *)(m), \
1147*67e74705SXin Li                                        (__v8si)(__m256i)(i), \
1148*67e74705SXin Li                                        (__v8si)(__m256i)(mask), (s)); })
1149*67e74705SXin Li 
1150*67e74705SXin Li #define _mm_mask_i64gather_epi32(a, m, i, mask, s) __extension__ ({ \
1151*67e74705SXin Li   (__m128i)__builtin_ia32_gatherq_d((__v4si)(__m128i)(a), \
1152*67e74705SXin Li                                     (int const *)(m), \
1153*67e74705SXin Li                                     (__v2di)(__m128i)(i), \
1154*67e74705SXin Li                                     (__v4si)(__m128i)(mask), (s)); })
1155*67e74705SXin Li 
1156*67e74705SXin Li #define _mm256_mask_i64gather_epi32(a, m, i, mask, s) __extension__ ({ \
1157*67e74705SXin Li   (__m128i)__builtin_ia32_gatherq_d256((__v4si)(__m128i)(a), \
1158*67e74705SXin Li                                        (int const *)(m), \
1159*67e74705SXin Li                                        (__v4di)(__m256i)(i), \
1160*67e74705SXin Li                                        (__v4si)(__m128i)(mask), (s)); })
1161*67e74705SXin Li 
1162*67e74705SXin Li #define _mm_mask_i32gather_epi64(a, m, i, mask, s) __extension__ ({ \
1163*67e74705SXin Li   (__m128i)__builtin_ia32_gatherd_q((__v2di)(__m128i)(a), \
1164*67e74705SXin Li                                     (long long const *)(m), \
1165*67e74705SXin Li                                     (__v4si)(__m128i)(i), \
1166*67e74705SXin Li                                     (__v2di)(__m128i)(mask), (s)); })
1167*67e74705SXin Li 
1168*67e74705SXin Li #define _mm256_mask_i32gather_epi64(a, m, i, mask, s) __extension__ ({ \
1169*67e74705SXin Li   (__m256i)__builtin_ia32_gatherd_q256((__v4di)(__m256i)(a), \
1170*67e74705SXin Li                                        (long long const *)(m), \
1171*67e74705SXin Li                                        (__v4si)(__m128i)(i), \
1172*67e74705SXin Li                                        (__v4di)(__m256i)(mask), (s)); })
1173*67e74705SXin Li 
1174*67e74705SXin Li #define _mm_mask_i64gather_epi64(a, m, i, mask, s) __extension__ ({ \
1175*67e74705SXin Li   (__m128i)__builtin_ia32_gatherq_q((__v2di)(__m128i)(a), \
1176*67e74705SXin Li                                     (long long const *)(m), \
1177*67e74705SXin Li                                     (__v2di)(__m128i)(i), \
1178*67e74705SXin Li                                     (__v2di)(__m128i)(mask), (s)); })
1179*67e74705SXin Li 
1180*67e74705SXin Li #define _mm256_mask_i64gather_epi64(a, m, i, mask, s) __extension__ ({ \
1181*67e74705SXin Li   (__m256i)__builtin_ia32_gatherq_q256((__v4di)(__m256i)(a), \
1182*67e74705SXin Li                                        (long long const *)(m), \
1183*67e74705SXin Li                                        (__v4di)(__m256i)(i), \
1184*67e74705SXin Li                                        (__v4di)(__m256i)(mask), (s)); })
1185*67e74705SXin Li 
1186*67e74705SXin Li #define _mm_i32gather_pd(m, i, s) __extension__ ({ \
1187*67e74705SXin Li   (__m128d)__builtin_ia32_gatherd_pd((__v2df)_mm_undefined_pd(), \
1188*67e74705SXin Li                                      (double const *)(m), \
1189*67e74705SXin Li                                      (__v4si)(__m128i)(i), \
1190*67e74705SXin Li                                      (__v2df)_mm_cmpeq_pd(_mm_setzero_pd(), \
1191*67e74705SXin Li                                                           _mm_setzero_pd()), \
1192*67e74705SXin Li                                      (s)); })
1193*67e74705SXin Li 
1194*67e74705SXin Li #define _mm256_i32gather_pd(m, i, s) __extension__ ({ \
1195*67e74705SXin Li   (__m256d)__builtin_ia32_gatherd_pd256((__v4df)_mm256_undefined_pd(), \
1196*67e74705SXin Li                                         (double const *)(m), \
1197*67e74705SXin Li                                         (__v4si)(__m128i)(i), \
1198*67e74705SXin Li                                         (__v4df)_mm256_cmp_pd(_mm256_setzero_pd(), \
1199*67e74705SXin Li                                                               _mm256_setzero_pd(), \
1200*67e74705SXin Li                                                               _CMP_EQ_OQ), \
1201*67e74705SXin Li                                         (s)); })
1202*67e74705SXin Li 
1203*67e74705SXin Li #define _mm_i64gather_pd(m, i, s) __extension__ ({ \
1204*67e74705SXin Li   (__m128d)__builtin_ia32_gatherq_pd((__v2df)_mm_undefined_pd(), \
1205*67e74705SXin Li                                      (double const *)(m), \
1206*67e74705SXin Li                                      (__v2di)(__m128i)(i), \
1207*67e74705SXin Li                                      (__v2df)_mm_cmpeq_pd(_mm_setzero_pd(), \
1208*67e74705SXin Li                                                           _mm_setzero_pd()), \
1209*67e74705SXin Li                                      (s)); })
1210*67e74705SXin Li 
1211*67e74705SXin Li #define _mm256_i64gather_pd(m, i, s) __extension__ ({ \
1212*67e74705SXin Li   (__m256d)__builtin_ia32_gatherq_pd256((__v4df)_mm256_undefined_pd(), \
1213*67e74705SXin Li                                         (double const *)(m), \
1214*67e74705SXin Li                                         (__v4di)(__m256i)(i), \
1215*67e74705SXin Li                                         (__v4df)_mm256_cmp_pd(_mm256_setzero_pd(), \
1216*67e74705SXin Li                                                               _mm256_setzero_pd(), \
1217*67e74705SXin Li                                                               _CMP_EQ_OQ), \
1218*67e74705SXin Li                                         (s)); })
1219*67e74705SXin Li 
1220*67e74705SXin Li #define _mm_i32gather_ps(m, i, s) __extension__ ({ \
1221*67e74705SXin Li   (__m128)__builtin_ia32_gatherd_ps((__v4sf)_mm_undefined_ps(), \
1222*67e74705SXin Li                                     (float const *)(m), \
1223*67e74705SXin Li                                     (__v4si)(__m128i)(i), \
1224*67e74705SXin Li                                     (__v4sf)_mm_cmpeq_ps(_mm_setzero_ps(), \
1225*67e74705SXin Li                                                          _mm_setzero_ps()), \
1226*67e74705SXin Li                                     (s)); })
1227*67e74705SXin Li 
1228*67e74705SXin Li #define _mm256_i32gather_ps(m, i, s) __extension__ ({ \
1229*67e74705SXin Li   (__m256)__builtin_ia32_gatherd_ps256((__v8sf)_mm256_undefined_ps(), \
1230*67e74705SXin Li                                        (float const *)(m), \
1231*67e74705SXin Li                                        (__v8si)(__m256i)(i), \
1232*67e74705SXin Li                                        (__v8sf)_mm256_cmp_ps(_mm256_setzero_ps(), \
1233*67e74705SXin Li                                                              _mm256_setzero_ps(), \
1234*67e74705SXin Li                                                              _CMP_EQ_OQ), \
1235*67e74705SXin Li                                        (s)); })
1236*67e74705SXin Li 
1237*67e74705SXin Li #define _mm_i64gather_ps(m, i, s) __extension__ ({ \
1238*67e74705SXin Li   (__m128)__builtin_ia32_gatherq_ps((__v4sf)_mm_undefined_ps(), \
1239*67e74705SXin Li                                     (float const *)(m), \
1240*67e74705SXin Li                                     (__v2di)(__m128i)(i), \
1241*67e74705SXin Li                                     (__v4sf)_mm_cmpeq_ps(_mm_setzero_ps(), \
1242*67e74705SXin Li                                                          _mm_setzero_ps()), \
1243*67e74705SXin Li                                     (s)); })
1244*67e74705SXin Li 
1245*67e74705SXin Li #define _mm256_i64gather_ps(m, i, s) __extension__ ({ \
1246*67e74705SXin Li   (__m128)__builtin_ia32_gatherq_ps256((__v4sf)_mm_undefined_ps(), \
1247*67e74705SXin Li                                        (float const *)(m), \
1248*67e74705SXin Li                                        (__v4di)(__m256i)(i), \
1249*67e74705SXin Li                                        (__v4sf)_mm_cmpeq_ps(_mm_setzero_ps(), \
1250*67e74705SXin Li                                                             _mm_setzero_ps()), \
1251*67e74705SXin Li                                        (s)); })
1252*67e74705SXin Li 
1253*67e74705SXin Li #define _mm_i32gather_epi32(m, i, s) __extension__ ({ \
1254*67e74705SXin Li   (__m128i)__builtin_ia32_gatherd_d((__v4si)_mm_undefined_si128(), \
1255*67e74705SXin Li                                     (int const *)(m), (__v4si)(__m128i)(i), \
1256*67e74705SXin Li                                     (__v4si)_mm_set1_epi32(-1), (s)); })
1257*67e74705SXin Li 
1258*67e74705SXin Li #define _mm256_i32gather_epi32(m, i, s) __extension__ ({ \
1259*67e74705SXin Li   (__m256i)__builtin_ia32_gatherd_d256((__v8si)_mm256_undefined_si256(), \
1260*67e74705SXin Li                                        (int const *)(m), (__v8si)(__m256i)(i), \
1261*67e74705SXin Li                                        (__v8si)_mm256_set1_epi32(-1), (s)); })
1262*67e74705SXin Li 
1263*67e74705SXin Li #define _mm_i64gather_epi32(m, i, s) __extension__ ({ \
1264*67e74705SXin Li   (__m128i)__builtin_ia32_gatherq_d((__v4si)_mm_undefined_si128(), \
1265*67e74705SXin Li                                     (int const *)(m), (__v2di)(__m128i)(i), \
1266*67e74705SXin Li                                     (__v4si)_mm_set1_epi32(-1), (s)); })
1267*67e74705SXin Li 
1268*67e74705SXin Li #define _mm256_i64gather_epi32(m, i, s) __extension__ ({ \
1269*67e74705SXin Li   (__m128i)__builtin_ia32_gatherq_d256((__v4si)_mm_undefined_si128(), \
1270*67e74705SXin Li                                        (int const *)(m), (__v4di)(__m256i)(i), \
1271*67e74705SXin Li                                        (__v4si)_mm_set1_epi32(-1), (s)); })
1272*67e74705SXin Li 
1273*67e74705SXin Li #define _mm_i32gather_epi64(m, i, s) __extension__ ({ \
1274*67e74705SXin Li   (__m128i)__builtin_ia32_gatherd_q((__v2di)_mm_undefined_si128(), \
1275*67e74705SXin Li                                     (long long const *)(m), \
1276*67e74705SXin Li                                     (__v4si)(__m128i)(i), \
1277*67e74705SXin Li                                     (__v2di)_mm_set1_epi64x(-1), (s)); })
1278*67e74705SXin Li 
1279*67e74705SXin Li #define _mm256_i32gather_epi64(m, i, s) __extension__ ({ \
1280*67e74705SXin Li   (__m256i)__builtin_ia32_gatherd_q256((__v4di)_mm256_undefined_si256(), \
1281*67e74705SXin Li                                        (long long const *)(m), \
1282*67e74705SXin Li                                        (__v4si)(__m128i)(i), \
1283*67e74705SXin Li                                        (__v4di)_mm256_set1_epi64x(-1), (s)); })
1284*67e74705SXin Li 
1285*67e74705SXin Li #define _mm_i64gather_epi64(m, i, s) __extension__ ({ \
1286*67e74705SXin Li   (__m128i)__builtin_ia32_gatherq_q((__v2di)_mm_undefined_si128(), \
1287*67e74705SXin Li                                     (long long const *)(m), \
1288*67e74705SXin Li                                     (__v2di)(__m128i)(i), \
1289*67e74705SXin Li                                     (__v2di)_mm_set1_epi64x(-1), (s)); })
1290*67e74705SXin Li 
1291*67e74705SXin Li #define _mm256_i64gather_epi64(m, i, s) __extension__ ({ \
1292*67e74705SXin Li   (__m256i)__builtin_ia32_gatherq_q256((__v4di)_mm256_undefined_si256(), \
1293*67e74705SXin Li                                        (long long const *)(m), \
1294*67e74705SXin Li                                        (__v4di)(__m256i)(i), \
1295*67e74705SXin Li                                        (__v4di)_mm256_set1_epi64x(-1), (s)); })
1296*67e74705SXin Li 
1297*67e74705SXin Li #undef __DEFAULT_FN_ATTRS
1298*67e74705SXin Li 
1299*67e74705SXin Li #endif /* __AVX2INTRIN_H */
1300