blob: fe6137c47c4340b63d3433040614bb1fbe47987f [file] [log] [blame]
Craig Topper925be542011-12-19 05:04:33 +00001/*===---- avx2intrin.h - AVX2 intrinsics -----------------------------------===
2 *
3 * Permission is hereby granted, free of charge, to any person obtaining a copy
4 * of this software and associated documentation files (the "Software"), to deal
5 * in the Software without restriction, including without limitation the rights
6 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 * copies of the Software, and to permit persons to whom the Software is
8 * furnished to do so, subject to the following conditions:
9 *
10 * The above copyright notice and this permission notice shall be included in
11 * all copies or substantial portions of the Software.
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 * THE SOFTWARE.
20 *
21 *===-----------------------------------------------------------------------===
22 */
23
24#ifndef __IMMINTRIN_H
25#error "Never use <avx2intrin.h> directly; include <immintrin.h> instead."
26#endif
27
28/* SSE4 Multiple Packed Sums of Absolute Difference. */
29#define _mm256_mpsadbw_epu8(X, Y, M) __builtin_ia32_mpsadbw256((X), (Y), (M))
30
31static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
32_mm256_abs_epi8(__m256i a)
33{
34 return (__m256i)__builtin_ia32_pabsb256((__v32qi)a);
35}
36
37static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
38_mm256_abs_epi16(__m256i a)
39{
40 return (__m256i)__builtin_ia32_pabsw256((__v16hi)a);
41}
42
43static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
44_mm256_abs_epi32(__m256i a)
45{
46 return (__m256i)__builtin_ia32_pabsd256((__v8si)a);
47}
48
49static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
50_mm256_packs_epi16(__m256i a, __m256i b)
51{
52 return (__m256i)__builtin_ia32_packsswb256((__v16hi)a, (__v16hi)b);
53}
54
55static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
56_mm256_packs_epi32(__m256i a, __m256i b)
57{
58 return (__m256i)__builtin_ia32_packssdw256((__v8si)a, (__v8si)b);
59}
60
61static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
62_mm256_packus_epi16(__m256i a, __m256i b)
63{
64 return (__m256i)__builtin_ia32_packuswb256((__v16hi)a, (__v16hi)b);
65}
66
67static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
68_mm256_packus_epi32(__m256i __V1, __m256i __V2)
69{
70 return (__m256i) __builtin_ia32_packusdw256((__v8si)__V1, (__v8si)__V2);
71}
72
73static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
74_mm256_add_epi8(__m256i a, __m256i b)
75{
76 return (__m256i)((__v32qi)a + (__v32qi)b);
77}
78
79static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
80_mm256_add_epi16(__m256i a, __m256i b)
81{
82 return (__m256i)((__v16hi)a + (__v16hi)b);
83}
84
85static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
86_mm256_add_epi32(__m256i a, __m256i b)
87{
88 return (__m256i)((__v8si)a + (__v8si)b);
89}
90
91static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
92_mm256_add_epi64(__m256i a, __m256i b)
93{
94 return a + b;
95}
96
97static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
Craig Topper9c2ffd82011-12-19 07:03:25 +000098_mm256_adds_epi8(__m256i a, __m256i b)
99{
100 return (__m256i)__builtin_ia32_paddsb256((__v32qi)a, (__v32qi)b);
101}
102
103static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
104_mm256_adds_epi16(__m256i a, __m256i b)
105{
106 return (__m256i)__builtin_ia32_paddsw256((__v16hi)a, (__v16hi)b);
107}
108
109static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
110_mm256_adds_epu8(__m256i a, __m256i b)
111{
112 return (__m256i)__builtin_ia32_paddusb256((__v32qi)a, (__v32qi)b);
113}
114
115static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
116_mm256_adds_epu16(__m256i a, __m256i b)
117{
118 return (__m256i)__builtin_ia32_paddusw256((__v16hi)a, (__v16hi)b);
119}
120
121#define _mm256_alignr_epi8(a, b, n) __extension__ ({ \
122 __m256i __a = (a); \
123 __m256i __b = (b); \
124 (__m256i)__builtin_ia32_palignr256((__v32qi)__a, (__v32qi)__b, (n)); })
125
126static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
Craig Topper735ceaa2011-12-19 09:03:48 +0000127_mm256_and_si256(__m256i a, __m256i b)
128{
129 return a & b;
130}
131
132static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
133_mm256_andnot_si256(__m256i a, __m256i b)
134{
135 return ~a & b;
136}
137
138static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
Craig Topper4c07c5d2011-12-20 09:55:26 +0000139_mm256_avg_epu8(__m256i a, __m256i b)
140{
141 return (__m256i)__builtin_ia32_pavgb256((__v32qi)a, (__v32qi)b);
142}
143
144static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
145_mm256_avg_epu16(__m256i a, __m256i b)
146{
147 return (__m256i)__builtin_ia32_pavgw256((__v16hi)a, (__v16hi)b);
148}
149
150static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
151_mm256_blendv_epi8(__m256i __V1, __m256i __V2, __m256i __M)
152{
153 return (__m256i)__builtin_ia32_pblendvb256((__v32qi)__V1, (__v32qi)__V2,
154 (__v32qi)__M);
155}
156
157#define _mm256_blend_epi16(V1, V2, M) __extension__ ({ \
158 __m256i __V1 = (V1); \
159 __m256i __V2 = (V2); \
160 (__m256i)__builtin_ia32_pblendw256((__v16hi)__V1, (__v16hi)__V2, M); })
161
162static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
163_mm256_cmpeq_epi8(__m256i a, __m256i b)
164{
165 return (__m256i)((__v32qi)a == (__v32qi)b);
166}
167
168static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
169_mm256_cmpeq_epi16(__m256i a, __m256i b)
170{
171 return (__m256i)((__v16hi)a == (__v16hi)b);
172}
173
174static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
175_mm256_cmpeq_epi32(__m256i a, __m256i b)
176{
177 return (__m256i)((__v8si)a == (__v8si)b);
178}
179
180static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
181_mm256_cmpeq_epi64(__m256i a, __m256i b)
182{
183 return (__m256i)((__v4di)a == (__v4di)b);
184}
185
186static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
187_mm256_cmpgt_epi8(__m256i a, __m256i b)
188{
189 return (__m256i)((__v32qi)a > (__v32qi)b);
190}
191
192static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
193_mm256_cmpgt_epi16(__m256i a, __m256i b)
194{
195 return (__m256i)((__v16hi)a > (__v16hi)b);
196}
197
198static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
199_mm256_cmpgt_epi32(__m256i a, __m256i b)
200{
201 return (__m256i)((__v8si)a > (__v8si)b);
202}
203
204static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
205_mm256_cmpgt_epi64(__m256i a, __m256i b)
206{
207 return (__m256i)((__v4di)a > (__v4di)b);
208}
209
210static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
Craig Topper318e4602011-12-21 08:17:40 +0000211_mm256_hadd_epi16(__m256i a, __m256i b)
212{
213 return (__m256i)__builtin_ia32_phaddw256((__v16hi)a, (__v16hi)b);
214}
215
216static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
217_mm256_hadd_epi32(__m256i a, __m256i b)
218{
219 return (__m256i)__builtin_ia32_phaddd256((__v8si)a, (__v8si)b);
220}
221
222static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
223_mm256_hadds_epi16(__m256i a, __m256i b)
224{
225 return (__m256i)__builtin_ia32_phaddsw256((__v16hi)a, (__v16hi)b);
226}
227
228static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
229_mm256_hsub_epi16(__m256i a, __m256i b)
230{
231 return (__m256i)__builtin_ia32_phsubw256((__v16hi)a, (__v16hi)b);
232}
233
234static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
235_mm256_hsub_epi32(__m256i a, __m256i b)
236{
237 return (__m256i)__builtin_ia32_phsubd256((__v8si)a, (__v8si)b);
238}
239
240static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
241_mm256_hsubs_epi16(__m256i a, __m256i b)
242{
243 return (__m256i)__builtin_ia32_phsubsw256((__v16hi)a, (__v16hi)b);
244}
245
246static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
Craig Topper4a4f25a2011-12-21 08:35:05 +0000247_mm256_maddubs_epi16(__m256i a, __m256i b)
248{
249 return (__m256i)__builtin_ia32_pmaddubsw256((__v32qi)a, (__v32qi)b);
250}
251
252static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
253_mm256_madd_epi16(__m256i a, __m256i b)
254{
255 return (__m256i)__builtin_ia32_pmaddwd256((__v16hi)a, (__v16hi)b);
256}
257
258static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
Craig Topper231f7932011-12-22 09:18:58 +0000259_mm256_max_epi8(__m256i a, __m256i b)
260{
261 return (__m256i)__builtin_ia32_pmaxsb256((__v32qi)a, (__v32qi)b);
262}
263
264static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
265_mm256_max_epi16(__m256i a, __m256i b)
266{
267 return (__m256i)__builtin_ia32_pmaxsw256((__v16hi)a, (__v16hi)b);
268}
269
270static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
271_mm256_max_epi32(__m256i a, __m256i b)
272{
273 return (__m256i)__builtin_ia32_pmaxsd256((__v8si)a, (__v8si)b);
274}
275
276static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
277_mm256_max_epu8(__m256i a, __m256i b)
278{
279 return (__m256i)__builtin_ia32_pmaxub256((__v32qi)a, (__v32qi)b);
280}
281
282static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
283_mm256_max_epu16(__m256i a, __m256i b)
284{
285 return (__m256i)__builtin_ia32_pmaxuw256((__v16hi)a, (__v16hi)b);
286}
287
288static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
289_mm256_max_epu32(__m256i a, __m256i b)
290{
291 return (__m256i)__builtin_ia32_pmaxud256((__v8si)a, (__v8si)b);
292}
293
294static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
295_mm256_min_epi8(__m256i a, __m256i b)
296{
297 return (__m256i)__builtin_ia32_pminsb256((__v32qi)a, (__v32qi)b);
298}
299
300static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
301_mm256_min_epi16(__m256i a, __m256i b)
302{
303 return (__m256i)__builtin_ia32_pminsw256((__v16hi)a, (__v16hi)b);
304}
305
306static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
307_mm256_min_epi32(__m256i a, __m256i b)
308{
309 return (__m256i)__builtin_ia32_pminsd256((__v8si)a, (__v8si)b);
310}
311
312static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
313_mm256_min_epu8(__m256i a, __m256i b)
314{
315 return (__m256i)__builtin_ia32_pminub256((__v32qi)a, (__v32qi)b);
316}
317
318static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
319_mm256_min_epu16(__m256i a, __m256i b)
320{
321 return (__m256i)__builtin_ia32_pminuw256 ((__v16hi)a, (__v16hi)b);
322}
323
324static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
325_mm256_min_epu32(__m256i a, __m256i b)
326{
327 return (__m256i)__builtin_ia32_pminud256((__v8si)a, (__v8si)b);
328}
329
330static __inline__ int __attribute__((__always_inline__, __nodebug__))
331_mm256_movemask_epi8(__m256i a)
332{
333 return __builtin_ia32_pmovmskb256((__v32qi)a);
334}
335
336static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
337_mm256_cvtepi8_epi16(__m128i __V)
338{
339 return (__m256i)__builtin_ia32_pmovsxbw256((__v16qi)__V);
340}
341
342static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
343_mm256_cvtepi8_epi32(__m128i __V)
344{
345 return (__m256i)__builtin_ia32_pmovsxbd256((__v16qi)__V);
346}
347
348static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
349_mm256_cvtepi8_epi64(__m128i __V)
350{
351 return (__m256i)__builtin_ia32_pmovsxbq256((__v16qi)__V);
352}
353
354static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
355_mm256_cvtepi16_epi32(__m128i __V)
356{
357 return (__m256i)__builtin_ia32_pmovsxwd256((__v8hi)__V);
358}
359
360static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
361_mm256_cvtepi16_epi64(__m128i __V)
362{
363 return (__m256i)__builtin_ia32_pmovsxwq256((__v8hi)__V);
364}
365
366static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
367_mm256_cvtepi32_epi64(__m128i __V)
368{
369 return (__m256i)__builtin_ia32_pmovsxdq256((__v4si)__V);
370}
371
372static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
373_mm256_cvtepu8_epi16(__m128i __V)
374{
375 return (__m256i)__builtin_ia32_pmovzxbw256((__v16qi)__V);
376}
377
378static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
379_mm256_cvtepu8_epi32(__m128i __V)
380{
381 return (__m256i)__builtin_ia32_pmovzxbd256((__v16qi)__V);
382}
383
384static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
385_mm256_cvtepu8_epi64(__m128i __V)
386{
387 return (__m256i)__builtin_ia32_pmovzxbq256((__v16qi)__V);
388}
389
390static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
391_mm256_cvtepu16_epi32(__m128i __V)
392{
393 return (__m256i)__builtin_ia32_pmovzxwd256((__v8hi)__V);
394}
395
396static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
397_mm256_cvtepu16_epi64(__m128i __V)
398{
399 return (__m256i)__builtin_ia32_pmovzxwq256((__v8hi)__V);
400}
401
402static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
403_mm256_cvtepu32_epi64(__m128i __V)
404{
405 return (__m256i)__builtin_ia32_pmovzxdq256((__v4si)__V);
406}
407
408static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
Craig Topper735ceaa2011-12-19 09:03:48 +0000409_mm256_or_si256(__m256i a, __m256i b)
410{
411 return a | b;
412}
413
414static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
Craig Topper925be542011-12-19 05:04:33 +0000415_mm256_sub_epi8(__m256i a, __m256i b)
416{
417 return (__m256i)((__v32qi)a - (__v32qi)b);
418}
419
420static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
421_mm256_sub_epi16(__m256i a, __m256i b)
422{
423 return (__m256i)((__v16hi)a - (__v16hi)b);
424}
425
426static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
427_mm256_sub_epi32(__m256i a, __m256i b)
428{
429 return (__m256i)((__v8si)a - (__v8si)b);
430}
431
432static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
433_mm256_sub_epi64(__m256i a, __m256i b)
434{
435 return a - b;
436}
Craig Topper9c2ffd82011-12-19 07:03:25 +0000437
438static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
439_mm256_subs_epi8(__m256i a, __m256i b)
440{
441 return (__m256i)__builtin_ia32_psubsb256((__v32qi)a, (__v32qi)b);
442}
443
444static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
445_mm256_subs_epi16(__m256i a, __m256i b)
446{
447 return (__m256i)__builtin_ia32_psubsw256((__v16hi)a, (__v16hi)b);
448}
449
450static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
451_mm256_subs_epu8(__m256i a, __m256i b)
452{
453 return (__m256i)__builtin_ia32_psubusb256((__v32qi)a, (__v32qi)b);
454}
455
456static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
457_mm256_subs_epu16(__m256i a, __m256i b)
458{
459 return (__m256i)__builtin_ia32_psubusw256((__v16hi)a, (__v16hi)b);
460}
461
Craig Topper735ceaa2011-12-19 09:03:48 +0000462static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
463_mm256_xor_si256(__m256i a, __m256i b)
464{
465 return a ^ b;
466}