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