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