1// RUN: %clang_cc1 %s -O0 -triple=x86_64-apple-darwin -target-feature +avx2 -emit-llvm -o - -Werror | FileCheck %s
2
3// Don't include mm_malloc.h, it's system specific.
4#define __MM_MALLOC_H
5
6#include <immintrin.h>
7
8__m256i test_mm256_mpsadbw_epu8(__m256i x, __m256i y) {
9  // CHECK: @llvm.x86.avx2.mpsadbw({{.*}}, {{.*}}, i32 3)
10  return _mm256_mpsadbw_epu8(x, y, 3);
11}
12
13__m256i test_mm256_sad_epu8(__m256i x, __m256i y) {
14  // CHECK: @llvm.x86.avx2.psad.bw
15  return _mm256_sad_epu8(x, y);
16}
17
18__m256i test_mm256_abs_epi8(__m256i a) {
19  // CHECK: @llvm.x86.avx2.pabs.b
20  return _mm256_abs_epi8(a);
21}
22
23__m256i test_mm256_abs_epi16(__m256i a) {
24  // CHECK: @llvm.x86.avx2.pabs.w
25  return _mm256_abs_epi16(a);
26}
27
28__m256i test_mm256_abs_epi32(__m256i a) {
29  // CHECK: @llvm.x86.avx2.pabs.d
30  return _mm256_abs_epi32(a);
31}
32
33__m256i test_mm256_packs_epi16(__m256i a, __m256i b) {
34  // CHECK: @llvm.x86.avx2.packsswb
35  return _mm256_packs_epi16(a, b);
36}
37
38__m256i test_mm256_packs_epi32(__m256i a, __m256i b) {
39  // CHECK: @llvm.x86.avx2.packssdw
40  return _mm256_packs_epi32(a, b);
41}
42
43__m256i test_mm256_packs_epu16(__m256i a, __m256i b) {
44  // CHECK: @llvm.x86.avx2.packuswb
45  return _mm256_packus_epi16(a, b);
46}
47
48__m256i test_mm256_packs_epu32(__m256i a, __m256i b) {
49  // CHECK: @llvm.x86.avx2.packusdw
50  return _mm256_packus_epi32(a, b);
51}
52
53__m256i test_mm256_add_epi8(__m256i a, __m256i b) {
54  // CHECK: add <32 x i8>
55  return _mm256_add_epi8(a, b);
56}
57
58__m256i test_mm256_add_epi16(__m256i a, __m256i b) {
59  // CHECK: add <16 x i16>
60  return _mm256_add_epi16(a, b);
61}
62
63__m256i test_mm256_add_epi32(__m256i a, __m256i b) {
64  // CHECK: add <8 x i32>
65  return _mm256_add_epi32(a, b);
66}
67
68__m256i test_mm256_add_epi64(__m256i a, __m256i b) {
69  // CHECK: add <4 x i64>
70  return _mm256_add_epi64(a, b);
71}
72
73__m256i test_mm256_adds_epi8(__m256i a, __m256i b) {
74  // CHECK: @llvm.x86.avx2.padds.b
75  return _mm256_adds_epi8(a, b);
76}
77
78__m256i test_mm256_adds_epi16(__m256i a, __m256i b) {
79  // CHECK: @llvm.x86.avx2.padds.w
80  return _mm256_adds_epi16(a, b);
81}
82
83__m256i test_mm256_adds_epu8(__m256i a, __m256i b) {
84  // CHECK: @llvm.x86.avx2.paddus.b
85  return _mm256_adds_epu8(a, b);
86}
87
88__m256i test_mm256_adds_epu16(__m256i a, __m256i b) {
89  // CHECK: @llvm.x86.avx2.paddus.w
90  return _mm256_adds_epu16(a, b);
91}
92
93__m256i test_mm256_alignr_epi8(__m256i a, __m256i b) {
94  // CHECK: shufflevector <32 x i8> %{{.*}}, <32 x i8> %{{.*}}, <32 x i32> <i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 32, i32 33, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 48, i32 49>
95  return _mm256_alignr_epi8(a, b, 2);
96}
97
98__m256i test2_mm256_alignr_epi8(__m256i a, __m256i b) {
99  // CHECK: @llvm.x86.avx2.psrl.dq({{.*}}, i32 8)
100  return _mm256_alignr_epi8(a, b, 17);
101}
102
103__m256i test_mm256_sub_epi8(__m256i a, __m256i b) {
104  // CHECK: sub <32 x i8>
105  return _mm256_sub_epi8(a, b);
106}
107
108__m256i test_mm256_sub_epi16(__m256i a, __m256i b) {
109  // CHECK: sub <16 x i16>
110  return _mm256_sub_epi16(a, b);
111}
112
113__m256i test_mm256_sub_epi32(__m256i a, __m256i b) {
114  // CHECK: sub <8 x i32>
115  return _mm256_sub_epi32(a, b);
116}
117
118__m256i test_mm256_sub_epi64(__m256i a, __m256i b) {
119  // CHECK: sub <4 x i64>
120  return _mm256_sub_epi64(a, b);
121}
122
123__m256i test_mm256_subs_epi8(__m256i a, __m256i b) {
124  // CHECK: @llvm.x86.avx2.psubs.b
125  return _mm256_subs_epi8(a, b);
126}
127
128__m256i test_mm256_subs_epi16(__m256i a, __m256i b) {
129  // CHECK: @llvm.x86.avx2.psubs.w
130  return _mm256_subs_epi16(a, b);
131}
132
133__m256i test_mm256_subs_epu8(__m256i a, __m256i b) {
134  // CHECK: @llvm.x86.avx2.psubus.b
135  return _mm256_subs_epu8(a, b);
136}
137
138__m256i test_mm256_subs_epu16(__m256i a, __m256i b) {
139  // CHECK: @llvm.x86.avx2.psubus.w
140  return _mm256_subs_epu16(a, b);
141}
142
143__m256i test_mm256_and_si256(__m256i a, __m256i b) {
144  // CHECK: and <4 x i64>
145  return _mm256_and_si256(a, b);
146}
147
148__m256i test_mm256_andnot_si256(__m256i a, __m256i b) {
149  // CHECK: xor <4 x i64>
150  // CHECK: and <4 x i64>
151  return _mm256_andnot_si256(a, b);
152}
153
154__m256i test_mm256_or_si256(__m256i a, __m256i b) {
155  // CHECK: or <4 x i64>
156  return _mm256_or_si256(a, b);
157}
158
159__m256i test_mm256_xor_si256(__m256i a, __m256i b) {
160  // CHECK: xor <4 x i64>
161  return _mm256_xor_si256(a, b);
162}
163
164__m256i test_mm256_avg_epu8(__m256i a, __m256i b) {
165  // CHECK: @llvm.x86.avx2.pavg.b
166  return _mm256_avg_epu8(a, b);
167}
168
169__m256i test_mm256_avg_epu16(__m256i a, __m256i b) {
170  // CHECK: @llvm.x86.avx2.pavg.w
171  return _mm256_avg_epu16(a, b);
172}
173
174__m256i test_mm256_blendv_epi8(__m256i a, __m256i b, __m256i m) {
175  // CHECK: @llvm.x86.avx2.pblendvb
176  return _mm256_blendv_epi8(a, b, m);
177}
178
179// FIXME: We should also lower the __builtin_ia32_pblendw128 (and similar)
180// functions to this IR. In the future we could delete the corresponding
181// intrinsic in LLVM if it's not being used anymore.
182__m256i test_mm256_blend_epi16(__m256i a, __m256i b) {
183  // CHECK-LABEL: test_mm256_blend_epi16
184  // CHECK-NOT: @llvm.x86.avx2.pblendw
185  // CHECK: shufflevector <16 x i16> %{{.*}}, <16 x i16> %{{.*}}, <16 x i32> <i32 0, i32 17, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 25, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
186  return _mm256_blend_epi16(a, b, 2);
187}
188
189__m256i test_mm256_cmpeq_epi8(__m256i a, __m256i b) {
190  // CHECK: icmp eq <32 x i8>
191  return _mm256_cmpeq_epi8(a, b);
192}
193
194__m256i test_mm256_cmpeq_epi16(__m256i a, __m256i b) {
195  // CHECK: icmp eq <16 x i16>
196  return _mm256_cmpeq_epi16(a, b);
197}
198
199__m256i test_mm256_cmpeq_epi32(__m256i a, __m256i b) {
200  // CHECK: icmp eq <8 x i32>
201  return _mm256_cmpeq_epi32(a, b);
202}
203
204__m256i test_mm256_cmpeq_epi64(__m256i a, __m256i b) {
205  // CHECK: icmp eq <4 x i64>
206  return _mm256_cmpeq_epi64(a, b);
207}
208
209__m256i test_mm256_cmpgt_epi8(__m256i a, __m256i b) {
210  // CHECK: icmp sgt <32 x i8>
211  return _mm256_cmpgt_epi8(a, b);
212}
213
214__m256i test_mm256_cmpgt_epi16(__m256i a, __m256i b) {
215  // CHECK: icmp sgt <16 x i16>
216  return _mm256_cmpgt_epi16(a, b);
217}
218
219__m256i test_mm256_cmpgt_epi32(__m256i a, __m256i b) {
220  // CHECK: icmp sgt <8 x i32>
221  return _mm256_cmpgt_epi32(a, b);
222}
223
224__m256i test_mm256_cmpgt_epi64(__m256i a, __m256i b) {
225  // CHECK: icmp sgt <4 x i64>
226  return _mm256_cmpgt_epi64(a, b);
227}
228
229__m256i test_mm256_hadd_epi16(__m256i a, __m256i b) {
230  // CHECK: @llvm.x86.avx2.phadd.w
231  return _mm256_hadd_epi16(a, b);
232}
233
234__m256i test_mm256_hadd_epi32(__m256i a, __m256i b) {
235  // CHECK: @llvm.x86.avx2.phadd.d
236  return _mm256_hadd_epi32(a, b);
237}
238
239__m256i test_mm256_hadds_epi16(__m256i a, __m256i b) {
240  // CHECK: @llvm.x86.avx2.phadd.sw
241  return _mm256_hadds_epi16(a, b);
242}
243
244__m256i test_mm256_hsub_epi16(__m256i a, __m256i b) {
245  // CHECK: @llvm.x86.avx2.phsub.w
246  return _mm256_hsub_epi16(a, b);
247}
248
249__m256i test_mm256_hsub_epi32(__m256i a, __m256i b) {
250  // CHECK: @llvm.x86.avx2.phsub.d
251  return _mm256_hsub_epi32(a, b);
252}
253
254__m256i test_mm256_hsubs_epi16(__m256i a, __m256i b) {
255  // CHECK: @llvm.x86.avx2.phsub.sw
256  return _mm256_hsubs_epi16(a, b);
257}
258
259__m256i test_mm256_maddubs_epi16(__m256i a, __m256i b) {
260  // CHECK: @llvm.x86.avx2.pmadd.ub.sw
261  return _mm256_maddubs_epi16(a, b);
262}
263
264__m256i test_mm256_madd_epi16(__m256i a, __m256i b) {
265  // CHECK: @llvm.x86.avx2.pmadd.wd
266  return _mm256_madd_epi16(a, b);
267}
268
269__m256i test_mm256_max_epi8(__m256i a, __m256i b) {
270  // CHECK: @llvm.x86.avx2.pmaxs.b
271  return _mm256_max_epi8(a, b);
272}
273
274__m256i test_mm256_max_epi16(__m256i a, __m256i b) {
275  // CHECK: @llvm.x86.avx2.pmaxs.w
276  return _mm256_max_epi16(a, b);
277}
278
279__m256i test_mm256_max_epi32(__m256i a, __m256i b) {
280  // CHECK: @llvm.x86.avx2.pmaxs.d
281  return _mm256_max_epi32(a, b);
282}
283
284__m256i test_mm256_max_epu8(__m256i a, __m256i b) {
285  // CHECK: @llvm.x86.avx2.pmaxu.b
286  return _mm256_max_epu8(a, b);
287}
288
289__m256i test_mm256_max_epu16(__m256i a, __m256i b) {
290  // CHECK: @llvm.x86.avx2.pmaxu.w
291  return _mm256_max_epu16(a, b);
292}
293
294__m256i test_mm256_max_epu32(__m256i a, __m256i b) {
295  // CHECK: @llvm.x86.avx2.pmaxu.d
296  return _mm256_max_epu32(a, b);
297}
298
299__m256i test_mm256_min_epi8(__m256i a, __m256i b) {
300  // CHECK: @llvm.x86.avx2.pmins.b
301  return _mm256_min_epi8(a, b);
302}
303
304__m256i test_mm256_min_epi16(__m256i a, __m256i b) {
305  // CHECK: @llvm.x86.avx2.pmins.w
306  return _mm256_min_epi16(a, b);
307}
308
309__m256i test_mm256_min_epi32(__m256i a, __m256i b) {
310  // CHECK: @llvm.x86.avx2.pmins.d
311  return _mm256_min_epi32(a, b);
312}
313
314__m256i test_mm256_min_epu8(__m256i a, __m256i b) {
315  // CHECK: @llvm.x86.avx2.pminu.b
316  return _mm256_min_epu8(a, b);
317}
318
319__m256i test_mm256_min_epu16(__m256i a, __m256i b) {
320  // CHECK: @llvm.x86.avx2.pminu.w
321  return _mm256_min_epu16(a, b);
322}
323
324__m256i test_mm256_min_epu32(__m256i a, __m256i b) {
325  // CHECK: @llvm.x86.avx2.pminu.d
326  return _mm256_min_epu32(a, b);
327}
328
329int test_mm256_movemask_epi8(__m256i a) {
330  // CHECK: @llvm.x86.avx2.pmovmskb
331  return _mm256_movemask_epi8(a);
332}
333
334__m256i test_mm256_cvtepi8_epi16(__m128i a) {
335  // CHECK: @llvm.x86.avx2.pmovsxbw
336  return _mm256_cvtepi8_epi16(a);
337}
338
339__m256i test_mm256_cvtepi8_epi32(__m128i a) {
340  // CHECK: @llvm.x86.avx2.pmovsxbd
341  return _mm256_cvtepi8_epi32(a);
342}
343
344__m256i test_mm256_cvtepi8_epi64(__m128i a) {
345  // CHECK: @llvm.x86.avx2.pmovsxbq
346  return _mm256_cvtepi8_epi64(a);
347}
348
349__m256i test_mm256_cvtepi16_epi32(__m128i a) {
350  // CHECK: @llvm.x86.avx2.pmovsxwd
351  return _mm256_cvtepi16_epi32(a);
352}
353
354__m256i test_mm256_cvtepi16_epi64(__m128i a) {
355  // CHECK: @llvm.x86.avx2.pmovsxwq
356  return _mm256_cvtepi16_epi64(a);
357}
358
359__m256i test_mm256_cvtepi32_epi64(__m128i a) {
360  // CHECK: @llvm.x86.avx2.pmovsxdq
361  return _mm256_cvtepi32_epi64(a);
362}
363
364__m256i test_mm256_cvtepu8_epi16(__m128i a) {
365  // CHECK: @llvm.x86.avx2.pmovzxbw
366  return _mm256_cvtepu8_epi16(a);
367}
368
369__m256i test_mm256_cvtepu8_epi32(__m128i a) {
370  // CHECK: @llvm.x86.avx2.pmovzxbd
371  return _mm256_cvtepu8_epi32(a);
372}
373
374__m256i test_mm256_cvtepu8_epi64(__m128i a) {
375  // CHECK: @llvm.x86.avx2.pmovzxbq
376  return _mm256_cvtepu8_epi64(a);
377}
378
379__m256i test_mm256_cvtepu16_epi32(__m128i a) {
380  // CHECK: @llvm.x86.avx2.pmovzxwd
381  return _mm256_cvtepu16_epi32(a);
382}
383
384__m256i test_mm256_cvtepu16_epi64(__m128i a) {
385  // CHECK: @llvm.x86.avx2.pmovzxwq
386  return _mm256_cvtepu16_epi64(a);
387}
388
389__m256i test_mm256_cvtepu32_epi64(__m128i a) {
390  // CHECK: @llvm.x86.avx2.pmovzxdq
391  return _mm256_cvtepu32_epi64(a);
392}
393
394__m256i test_mm256_mul_epi32(__m256i a, __m256i b) {
395  // CHECK: @llvm.x86.avx2.pmul.dq
396  return _mm256_mul_epi32(a, b);
397}
398
399__m256i test_mm256_mulhrs_epi16(__m256i a, __m256i b) {
400  // CHECK: @llvm.x86.avx2.pmul.hr.sw
401  return _mm256_mulhrs_epi16(a, b);
402}
403
404__m256i test_mm256_mulhi_epu16(__m256i a, __m256i b) {
405  // CHECK: @llvm.x86.avx2.pmulhu.w
406  return _mm256_mulhi_epu16(a, b);
407}
408
409__m256i test_mm256_mulhi_epi16(__m256i a, __m256i b) {
410  // CHECK: @llvm.x86.avx2.pmulh.w
411  return _mm256_mulhi_epi16(a, b);
412}
413
414__m256i test_mm256_mullo_epi16(__m256i a, __m256i b) {
415  // CHECK: mul <16 x i16>
416  return _mm256_mullo_epi16(a, b);
417}
418
419__m256i test_mm256_mullo_epi32(__m256i a, __m256i b) {
420  // CHECK: mul <8 x i32>
421  return _mm256_mullo_epi32(a, b);
422}
423
424__m256i test_mm256_mul_epu32(__m256i a, __m256i b) {
425  // CHECK: @llvm.x86.avx2.pmulu.dq
426  return _mm256_mul_epu32(a, b);
427}
428
429__m256i test_mm256_shuffle_epi8(__m256i a, __m256i b) {
430  // CHECK: @llvm.x86.avx2.pshuf.b
431  return _mm256_shuffle_epi8(a, b);
432}
433
434__m256i test_mm256_shuffle_epi32(__m256i a) {
435  // CHECK: shufflevector <8 x i32> %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> <i32 3, i32 3, i32 0, i32 0, i32 7, i32 7, i32 4, i32 4>
436  return _mm256_shuffle_epi32(a, 15);
437}
438
439__m256i test_mm256_shufflehi_epi16(__m256i a) {
440  // CHECK: shufflevector <16 x i16> %{{.*}}, <16 x i16> %{{.*}}, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 7, i32 6, i32 6, i32 5, i32 8, i32 9, i32 10, i32 11, i32 15, i32 14, i32 14, i32 13>
441  return _mm256_shufflehi_epi16(a, 107);
442}
443
444__m256i test_mm256_shufflelo_epi16(__m256i a) {
445  // CHECK: shufflevector <16 x i16> %{{.*}}, <16 x i16> %{{.*}}, <16 x i32> <i32 3, i32 0, i32 1, i32 1, i32 4, i32 5, i32 6, i32 7, i32 11, i32 8, i32 9, i32 9, i32 12, i32 13, i32 14, i32 15>
446  return _mm256_shufflelo_epi16(a, 83);
447}
448
449__m256i test_mm256_sign_epi8(__m256i a, __m256i b) {
450  // CHECK: @llvm.x86.avx2.psign.b
451  return _mm256_sign_epi8(a, b);
452}
453
454__m256i test_mm256_sign_epi16(__m256i a, __m256i b) {
455  // CHECK: @llvm.x86.avx2.psign.w
456  return _mm256_sign_epi16(a, b);
457}
458
459__m256i test_mm256_sign_epi32(__m256i a, __m256i b) {
460  // CHECK: @llvm.x86.avx2.psign.d
461  return _mm256_sign_epi32(a, b);
462}
463
464__m256i test_mm256_slli_si256(__m256i a) {
465  // CHECK: @llvm.x86.avx2.psll.dq
466  return _mm256_slli_si256(a, 3);
467}
468
469__m256i test_mm256_slli_epi16(__m256i a) {
470  // CHECK: @llvm.x86.avx2.pslli.w
471  return _mm256_slli_epi16(a, 3);
472}
473
474__m256i test_mm256_sll_epi16(__m256i a, __m128i b) {
475  // CHECK: @llvm.x86.avx2.psll.w
476  return _mm256_sll_epi16(a, b);
477}
478
479__m256i test_mm256_slli_epi32(__m256i a) {
480  // CHECK: @llvm.x86.avx2.pslli.d
481  return _mm256_slli_epi32(a, 3);
482}
483
484__m256i test_mm256_sll_epi32(__m256i a, __m128i b) {
485  // CHECK: @llvm.x86.avx2.psll.d
486  return _mm256_sll_epi32(a, b);
487}
488
489__m256i test_mm256_slli_epi64(__m256i a) {
490  // CHECK: @llvm.x86.avx2.pslli.q
491  return _mm256_slli_epi64(a, 3);
492}
493
494__m256i test_mm256_sll_epi64(__m256i a, __m128i b) {
495  // CHECK: @llvm.x86.avx2.psll.q
496  return _mm256_sll_epi64(a, b);
497}
498
499__m256i test_mm256_srai_epi16(__m256i a) {
500  // CHECK: @llvm.x86.avx2.psrai.w
501  return _mm256_srai_epi16(a, 3);
502}
503
504__m256i test_mm256_sra_epi16(__m256i a, __m128i b) {
505  // CHECK: @llvm.x86.avx2.psra.w
506  return _mm256_sra_epi16(a, b);
507}
508
509__m256i test_mm256_srai_epi32(__m256i a) {
510  // CHECK: @llvm.x86.avx2.psrai.d
511  return _mm256_srai_epi32(a, 3);
512}
513
514__m256i test_mm256_sra_epi32(__m256i a, __m128i b) {
515  // CHECK: @llvm.x86.avx2.psra.d
516  return _mm256_sra_epi32(a, b);
517}
518
519__m256i test_mm256_srli_si256(__m256i a) {
520  // CHECK: @llvm.x86.avx2.psrl.dq
521  return _mm256_srli_si256(a, 3);
522}
523
524__m256i test_mm256_srli_epi16(__m256i a) {
525  // CHECK: @llvm.x86.avx2.psrli.w
526  return _mm256_srli_epi16(a, 3);
527}
528
529__m256i test_mm256_srl_epi16(__m256i a, __m128i b) {
530  // CHECK: @llvm.x86.avx2.psrl.w
531  return _mm256_srl_epi16(a, b);
532}
533
534__m256i test_mm256_srli_epi32(__m256i a) {
535  // CHECK: @llvm.x86.avx2.psrli.d
536  return _mm256_srli_epi32(a, 3);
537}
538
539__m256i test_mm256_srl_epi32(__m256i a, __m128i b) {
540  // CHECK: @llvm.x86.avx2.psrl.d
541  return _mm256_srl_epi32(a, b);
542}
543
544__m256i test_mm256_srli_epi64(__m256i a) {
545  // CHECK: @llvm.x86.avx2.psrli.q
546  return _mm256_srli_epi64(a, 3);
547}
548
549__m256i test_mm256_srl_epi64(__m256i a, __m128i b) {
550  // CHECK: @llvm.x86.avx2.psrl.q
551  return _mm256_srl_epi64(a, b);
552}
553
554__m256i test_mm256_unpackhi_epi8(__m256i a, __m256i b) {
555  // CHECK: shufflevector <32 x i8> %{{.*}}, <32 x i8> %{{.*}}, <32 x i32> <i32 8, i32 40, i32 9, i32 41, i32 10, i32 42, i32 11, i32 43, i32 12, i32 44, i32 13, i32 45, i32 14, i32 46, i32 15, i32 47, i32 24, i32 56, i32 25, i32 57, i32 26, i32 58, i32 27, i32 59, i32 28, i32 60, i32 29, i32 61, i32 30, i32 62, i32 31, i32 63>
556  return _mm256_unpackhi_epi8(a, b);
557}
558
559__m256i test_mm256_unpackhi_epi16(__m256i a, __m256i b) {
560  // CHECK: shufflevector <16 x i16> %{{.*}}, <16 x i16> %{{.*}}, <16 x i32> <i32 4, i32 20, i32 5, i32 21, i32 6, i32 22, i32 7, i32 23, i32 12, i32 28, i32 13, i32 29, i32 14, i32 30, i32 15, i32 31>
561  return _mm256_unpackhi_epi16(a, b);
562}
563
564__m256i test_mm256_unpackhi_epi32(__m256i a, __m256i b) {
565  // CHECK: shufflevector <8 x i32> %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> <i32 2, i32 10, i32 3, i32 11, i32 6, i32 14, i32 7, i32 15>
566  return _mm256_unpackhi_epi32(a, b);
567}
568
569__m256i test_mm256_unpackhi_epi64(__m256i a, __m256i b) {
570  // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> %{{.*}}, <4 x i32> <i32 1, i32 5, i32 3, i32 7>
571  return _mm256_unpackhi_epi64(a, b);
572}
573
574__m256i test_mm256_unpacklo_epi8(__m256i a, __m256i b) {
575  // CHECK: shufflevector <32 x i8> %{{.*}}, <32 x i8> %{{.*}}, <32 x i32> <i32 0, i32 32, i32 1, i32 33, i32 2, i32 34, i32 3, i32 35, i32 4, i32 36, i32 5, i32 37, i32 6, i32 38, i32 7, i32 39, i32 16, i32 48, i32 17, i32 49, i32 18, i32 50, i32 19, i32 51, i32 20, i32 52, i32 21, i32 53, i32 22, i32 54, i32 23, i32 55>
576  return _mm256_unpacklo_epi8(a, b);
577}
578
579__m256i test_mm256_unpacklo_epi16(__m256i a, __m256i b) {
580  // CHECK: shufflevector <16 x i16> %{{.*}}, <16 x i16> %{{.*}}, <16 x i32> <i32 0, i32 16, i32 1, i32 17, i32 2, i32 18, i32 3, i32 19, i32 8, i32 24, i32 9, i32 25, i32 10, i32 26, i32 11, i32 27>
581  return _mm256_unpacklo_epi16(a, b);
582}
583
584__m256i test_mm256_unpacklo_epi32(__m256i a, __m256i b) {
585  // CHECK: shufflevector <8 x i32> %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> <i32 0, i32 8, i32 1, i32 9, i32 4, i32 12, i32 5, i32 13>
586  return _mm256_unpacklo_epi32(a, b);
587}
588
589__m256i test_mm256_unpacklo_epi64(__m256i a, __m256i b) {
590  // CHECK: shufflevector <4 x i64> %{{.*}}, <4 x i64> %{{.*}}, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
591  return _mm256_unpacklo_epi64(a, b);
592}
593
594__m256i test_mm256_stream_load_si256(__m256i *a) {
595  // CHECK: @llvm.x86.avx2.movntdqa
596  return _mm256_stream_load_si256(a);
597}
598
599__m128 test_mm_broadcastss_ps(__m128 a) {
600  // CHECK: @llvm.x86.avx2.vbroadcast.ss.ps
601  return _mm_broadcastss_ps(a);
602}
603
604__m256 test_mm256_broadcastss_ps(__m128 a) {
605  // CHECK: @llvm.x86.avx2.vbroadcast.ss.ps.256
606  return _mm256_broadcastss_ps(a);
607}
608
609__m256d test_mm256_broadcastsd_pd(__m128d a) {
610  // check: @llvm.x86.avx2.vbroadcast.sd.pd.256
611  return _mm256_broadcastsd_pd(a);
612}
613
614__m256i test_mm256_broadcastsi128_si256(__m128i a) {
615  // CHECK: @llvm.x86.avx2.vbroadcasti128
616  return _mm256_broadcastsi128_si256(a);
617}
618
619__m128i test_mm_blend_epi32(__m128i a, __m128i b) {
620  // CHECK-LABEL: test_mm_blend_epi32
621  // CHECK-NOT: @llvm.x86.avx2.pblendd.128
622  // CHECK: shufflevector <4 x i32> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
623  return _mm_blend_epi32(a, b, 0x35);
624}
625
626__m256i test_mm256_blend_epi32(__m256i a, __m256i b) {
627  // CHECK-LABEL: test_mm256_blend_epi32
628  // CHECK-NOT: @llvm.x86.avx2.pblendd.256
629  // CHECK: shufflevector <8 x i32> %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> <i32 8, i32 1, i32 10, i32 3, i32 12, i32 13, i32 6, i32 7>
630  return _mm256_blend_epi32(a, b, 0x35);
631}
632
633__m256i test_mm256_broadcastb_epi8(__m128i a) {
634  // CHECK: @llvm.x86.avx2.pbroadcastb.256
635  return _mm256_broadcastb_epi8(a);
636}
637
638__m256i test_mm256_broadcastw_epi16(__m128i a) {
639  // CHECK: @llvm.x86.avx2.pbroadcastw.256
640  return _mm256_broadcastw_epi16(a);
641}
642
643__m256i test_mm256_broadcastd_epi32(__m128i a) {
644  // CHECK: @llvm.x86.avx2.pbroadcastd.256
645  return _mm256_broadcastd_epi32(a);
646}
647
648__m256i test_mm256_broadcastq_epi64(__m128i a) {
649  // CHECK: @llvm.x86.avx2.pbroadcastq.256
650  return _mm256_broadcastq_epi64(a);
651}
652
653__m128i test_mm_broadcastb_epi8(__m128i a) {
654  // CHECK: @llvm.x86.avx2.pbroadcastb.128
655  return _mm_broadcastb_epi8(a);
656}
657
658__m128i test_mm_broadcastw_epi16(__m128i a) {
659  // CHECK: @llvm.x86.avx2.pbroadcastw.128
660  return _mm_broadcastw_epi16(a);
661}
662
663__m128i test_mm_broadcastd_epi32(__m128i a) {
664  // CHECK: @llvm.x86.avx2.pbroadcastd.128
665  return _mm_broadcastd_epi32(a);
666}
667
668__m128i test_mm_broadcastq_epi64(__m128i a) {
669  // CHECK: @llvm.x86.avx2.pbroadcastq.128
670  return _mm_broadcastq_epi64(a);
671}
672
673__m256i test_mm256_permutevar8x32_epi32(__m256i a, __m256i b) {
674  // CHECK: @llvm.x86.avx2.permd
675  return _mm256_permutevar8x32_epi32(a, b);
676}
677
678__m256d test_mm256_permute4x64_pd(__m256d a) {
679  // CHECK: shufflevector{{.*}}<i32 1, i32 2, i32 1, i32 0>
680  return _mm256_permute4x64_pd(a, 25);
681}
682
683__m256 test_mm256_permutevar8x32_ps(__m256 a, __m256 b) {
684  // CHECK: @llvm.x86.avx2.permps
685  return _mm256_permutevar8x32_ps(a, b);
686}
687
688__m256i test_mm256_permute4x64_epi64(__m256i a) {
689  // CHECK: shufflevector{{.*}}<i32 3, i32 0, i32 2, i32 0>
690  return _mm256_permute4x64_epi64(a, 35);
691}
692
693__m256i test_mm256_permute2x128_si256(__m256i a, __m256i b) {
694  // CHECK: @llvm.x86.avx2.vperm2i128
695  return _mm256_permute2x128_si256(a, b, 0x31);
696}
697
698__m128i test_mm256_extracti128_si256(__m256i a) {
699  // CHECK: @llvm.x86.avx2.vextracti128
700  return _mm256_extracti128_si256(a, 1);
701}
702
703__m256i test_mm256_inserti128_si256(__m256i a, __m128i b) {
704  // CHECK: @llvm.x86.avx2.vinserti128
705  return _mm256_inserti128_si256(a, b, 1);
706}
707
708__m256i test_mm256_maskload_epi32(int const *a, __m256i m) {
709  // CHECK: @llvm.x86.avx2.maskload.d.256
710  return _mm256_maskload_epi32(a, m);
711}
712
713__m256i test_mm256_maskload_epi64(long long const *a, __m256i m) {
714  // CHECK: @llvm.x86.avx2.maskload.q.256
715  return _mm256_maskload_epi64(a, m);
716}
717
718__m128i test_mm_maskload_epi32(int const *a, __m128i m) {
719  // CHECK: @llvm.x86.avx2.maskload.d
720  return _mm_maskload_epi32(a, m);
721}
722
723__m128i test_mm_maskload_epi64(long long const *a, __m128i m) {
724  // CHECK: @llvm.x86.avx2.maskload.q
725  return _mm_maskload_epi64(a, m);
726}
727
728void test_mm256_maskstore_epi32(int *a, __m256i m, __m256i b) {
729  // CHECK: @llvm.x86.avx2.maskstore.d.256
730  _mm256_maskstore_epi32(a, m, b);
731}
732
733void test_mm256_maskstore_epi64(long long *a, __m256i m, __m256i b) {
734  // CHECK: @llvm.x86.avx2.maskstore.q.256
735  _mm256_maskstore_epi64(a, m, b);
736}
737
738void test_mm_maskstore_epi32(int *a, __m128i m, __m128i b) {
739  // CHECK: @llvm.x86.avx2.maskstore.d
740  _mm_maskstore_epi32(a, m, b);
741}
742
743void test_mm_maskstore_epi64(long long *a, __m128i m, __m128i b) {
744  // CHECK: @llvm.x86.avx2.maskstore.q
745  _mm_maskstore_epi64(a, m, b);
746}
747
748__m256i test_mm256_sllv_epi32(__m256i a, __m256i b) {
749  // CHECK: @llvm.x86.avx2.psllv.d.256
750  return _mm256_sllv_epi32(a, b);
751}
752
753__m128i test_mm_sllv_epi32(__m128i a, __m128i b) {
754  // CHECK: @llvm.x86.avx2.psllv.d
755  return _mm_sllv_epi32(a, b);
756}
757
758__m256i test_mm256_sllv_epi64(__m256i a, __m256i b) {
759  // CHECK: @llvm.x86.avx2.psllv.q.256
760  return _mm256_sllv_epi64(a, b);
761}
762
763__m128i test_mm_sllv_epi64(__m128i a, __m128i b) {
764  // CHECK: @llvm.x86.avx2.psllv.q
765  return _mm_sllv_epi64(a, b);
766}
767
768__m256i test_mm256_srav_epi32(__m256i a, __m256i b) {
769  // CHECK: @llvm.x86.avx2.psrav.d.256
770  return _mm256_srav_epi32(a, b);
771}
772
773__m128i test_mm_srav_epi32(__m128i a, __m128i b) {
774  // CHECK: @llvm.x86.avx2.psrav.d
775  return _mm_srav_epi32(a, b);
776}
777
778__m256i test_mm256_srlv_epi32(__m256i a, __m256i b) {
779  // CHECK: @llvm.x86.avx2.psrlv.d.256
780  return _mm256_srlv_epi32(a, b);
781}
782
783__m128i test_mm_srlv_epi32(__m128i a, __m128i b) {
784  // CHECK: @llvm.x86.avx2.psrlv.d
785  return _mm_srlv_epi32(a, b);
786}
787
788__m256i test_mm256_srlv_epi64(__m256i a, __m256i b) {
789  // CHECK: @llvm.x86.avx2.psrlv.q.256
790  return _mm256_srlv_epi64(a, b);
791}
792
793__m128i test_mm_srlv_epi64(__m128i a, __m128i b) {
794  // CHECK: @llvm.x86.avx2.psrlv.q
795  return _mm_srlv_epi64(a, b);
796}
797
798__m128d test_mm_mask_i32gather_pd(__m128d a, double const *b, __m128i c,
799                                  __m128d d) {
800  // CHECK: @llvm.x86.avx2.gather.d.pd
801  return _mm_mask_i32gather_pd(a, b, c, d, 2);
802}
803
804__m256d test_mm256_mask_i32gather_pd(__m256d a, double const *b, __m128i c,
805                                      __m256d d) {
806  // CHECK: @llvm.x86.avx2.gather.d.pd.256
807  return _mm256_mask_i32gather_pd(a, b, c, d, 2);
808}
809__m128d test_mm_mask_i64gather_pd(__m128d a, double const *b, __m128i c,
810                                  __m128d d) {
811  // CHECK: @llvm.x86.avx2.gather.q.pd
812  return _mm_mask_i64gather_pd(a, b, c, d, 2);
813}
814__m256d test_mm256_mask_i64gather_pd(__m256d a, double const *b, __m256i c,
815                                      __m256d d) {
816  // CHECK: @llvm.x86.avx2.gather.q.pd.256
817  return _mm256_mask_i64gather_pd(a, b, c, d, 2);
818}
819
820__m128 test_mm_mask_i32gather_ps(__m128 a, float const *b, __m128i c,
821                                 __m128 d) {
822  // CHECK: @llvm.x86.avx2.gather.d.ps
823  return _mm_mask_i32gather_ps(a, b, c, d, 2);
824}
825__m256 test_mm256_mask_i32gather_ps(__m256 a, float const *b, __m256i c,
826                                     __m256 d) {
827  // CHECK: @llvm.x86.avx2.gather.d.ps.256
828  return _mm256_mask_i32gather_ps(a, b, c, d, 2);
829}
830__m128 test_mm_mask_i64gather_ps(__m128 a, float const *b, __m128i c,
831                                 __m128 d) {
832  // CHECK: @llvm.x86.avx2.gather.q.ps
833  return _mm_mask_i64gather_ps(a, b, c, d, 2);
834}
835__m128 test_mm256_mask_i64gather_ps(__m128 a, float const *b, __m256i c,
836                                    __m128 d) {
837  // CHECK: @llvm.x86.avx2.gather.q.ps.256
838  return _mm256_mask_i64gather_ps(a, b, c, d, 2);
839}
840
841__m128i test_mm_mask_i32gather_epi32(__m128i a, int const *b, __m128i c,
842                                     __m128i d) {
843  // CHECK: @llvm.x86.avx2.gather.d.d
844  return _mm_mask_i32gather_epi32(a, b, c, d, 2);
845}
846__m256i test_mm256_mask_i32gather_epi32(__m256i a, int const *b, __m256i c,
847                                        __m256i d) {
848  // CHECK: @llvm.x86.avx2.gather.d.d.256
849  return _mm256_mask_i32gather_epi32(a, b, c, d, 2);
850}
851__m128i test_mm_mask_i64gather_epi32(__m128i a, int const *b, __m128i c,
852                                     __m128i d) {
853  // CHECK: @llvm.x86.avx2.gather.q.d
854  return _mm_mask_i64gather_epi32(a, b, c, d, 2);
855}
856__m128i test_mm256_mask_i64gather_epi32(__m128i a, int const *b, __m256i c,
857                                        __m128i d) {
858  // CHECK: @llvm.x86.avx2.gather.q.d.256
859  return _mm256_mask_i64gather_epi32(a, b, c, d, 2);
860}
861
862__m128i test_mm_mask_i32gather_epi64(__m128i a, long long const *b, __m128i c,
863                                     __m128i d) {
864  // CHECK: @llvm.x86.avx2.gather.d.q
865  return _mm_mask_i32gather_epi64(a, b, c, d, 2);
866}
867__m256i test_mm256_mask_i32gather_epi64(__m256i a, long long const *b, __m128i c,
868                                        __m256i d) {
869  // CHECK: @llvm.x86.avx2.gather.d.q.256
870  return _mm256_mask_i32gather_epi64(a, b, c, d, 2);
871}
872__m128i test_mm_mask_i64gather_epi64(__m128i a, long long const *b, __m128i c,
873                                     __m128i d) {
874  // CHECK: @llvm.x86.avx2.gather.q.q
875  return _mm_mask_i64gather_epi64(a, b, c, d, 2);
876}
877__m256i test_mm256_mask_i64gather_epi64(__m256i a, long long const *b, __m256i c,
878                                        __m256i d) {
879  // CHECK: @llvm.x86.avx2.gather.q.q.256
880  return _mm256_mask_i64gather_epi64(a, b, c, d, 2);
881}
882
883__m128d test_mm_i32gather_pd(double const *b, __m128i c) {
884  // CHECK: @llvm.x86.avx2.gather.d.pd
885  return _mm_i32gather_pd(b, c, 2);
886}
887__m256d test_mm256_i32gather_pd(double const *b, __m128i c) {
888  // CHECK: @llvm.x86.avx2.gather.d.pd.256
889  return _mm256_i32gather_pd(b, c, 2);
890}
891__m128d test_mm_i64gather_pd(double const *b, __m128i c) {
892  // CHECK: @llvm.x86.avx2.gather.q.pd
893  return _mm_i64gather_pd(b, c, 2);
894}
895__m256d test_mm256_i64gather_pd(double const *b, __m256i c) {
896  // CHECK: @llvm.x86.avx2.gather.q.pd.256
897  return _mm256_i64gather_pd(b, c, 2);
898}
899__m128 test_mm_i32gather_ps(float const *b, __m128i c) {
900  // CHECK: @llvm.x86.avx2.gather.d.ps
901  return _mm_i32gather_ps(b, c, 2);
902}
903__m256 test_mm256_i32gather_ps(float const *b, __m256i c) {
904  // CHECK: @llvm.x86.avx2.gather.d.ps.256
905  return _mm256_i32gather_ps(b, c, 2);
906}
907__m128 test_mm_i64gather_ps(float const *b, __m128i c) {
908  // CHECK: @llvm.x86.avx2.gather.q.ps
909  return _mm_i64gather_ps(b, c, 2);
910}
911__m128 test_mm256_i64gather_ps(float const *b, __m256i c) {
912  // CHECK: @llvm.x86.avx2.gather.q.ps.256
913  return _mm256_i64gather_ps(b, c, 2);
914}
915
916__m128i test_mm_i32gather_epi32(int const *b, __m128i c) {
917  // CHECK: @llvm.x86.avx2.gather.d.d
918  return _mm_i32gather_epi32(b, c, 2);
919}
920__m256i test_mm256_i32gather_epi32(int const *b, __m256i c) {
921  // CHECK: @llvm.x86.avx2.gather.d.d.256
922  return _mm256_i32gather_epi32(b, c, 2);
923}
924__m128i test_mm_i64gather_epi32(int const *b, __m128i c) {
925  // CHECK: @llvm.x86.avx2.gather.q.d
926  return _mm_i64gather_epi32(b, c, 2);
927}
928__m128i test_mm256_i64gather_epi32(int const *b, __m256i c) {
929  // CHECK: @llvm.x86.avx2.gather.q.d.256
930  return _mm256_i64gather_epi32(b, c, 2);
931}
932__m128i test_mm_i32gather_epi64(long long const *b, __m128i c) {
933  // CHECK: @llvm.x86.avx2.gather.d.q
934  return _mm_i32gather_epi64(b, c, 2);
935}
936__m256i test_mm256_i32gather_epi64(long long const *b, __m128i c) {
937  // CHECK: @llvm.x86.avx2.gather.d.q.256
938  return _mm256_i32gather_epi64(b, c, 2);
939}
940__m128i test_mm_i64gather_epi64(long long const *b, __m128i c) {
941  // CHECK: @llvm.x86.avx2.gather.q.q
942  return _mm_i64gather_epi64(b, c, 2);
943}
944__m256i test_mm256_i64gather_epi64(long long const *b, __m256i c) {
945  // CHECK: @llvm.x86.avx2.gather.q.q.256
946  return _mm256_i64gather_epi64(b, c, 2);
947}
948