1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknwon -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE41
3 ; RUN: llc < %s -mtriple=x86_64-unknwon -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
4 ; RUN: llc < %s -mtriple=x86_64-unknwon -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
5 ; RUN: llc < %s -mtriple=i686-unknwon -mattr=+avx2 | FileCheck %s --check-prefix=X32-AVX2
8 ; These tests inject a store into the chain to test the inreg versions of pmovsx
10 define void @test1(<2 x i8>* %in, <2 x i64>* %out) nounwind {
13 ; SSE41-NEXT: pmovsxbq (%rdi), %xmm0
14 ; SSE41-NEXT: xorps %xmm1, %xmm1
15 ; SSE41-NEXT: movups %xmm1, (%rax)
16 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
21 ; AVX-NEXT: vpmovsxbq (%rdi), %xmm0
22 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
23 ; AVX-NEXT: vmovups %xmm1, (%rax)
24 ; AVX-NEXT: vmovdqu %xmm0, (%rsi)
27 ; X32-AVX2-LABEL: test1:
29 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
30 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
31 ; X32-AVX2-NEXT: vpmovsxbq (%ecx), %xmm0
32 ; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
33 ; X32-AVX2-NEXT: vmovups %xmm1, (%eax)
34 ; X32-AVX2-NEXT: vmovdqu %xmm0, (%eax)
36 %wide.load35 = load <2 x i8>, <2 x i8>* %in, align 1
37 %sext = sext <2 x i8> %wide.load35 to <2 x i64>
38 store <2 x i64> zeroinitializer, <2 x i64>* undef, align 8
39 store <2 x i64> %sext, <2 x i64>* %out, align 8
43 define void @test2(<4 x i8>* %in, <4 x i64>* %out) nounwind {
46 ; SSE41-NEXT: pmovsxbq (%rdi), %xmm0
47 ; SSE41-NEXT: pmovsxbq 2(%rdi), %xmm1
48 ; SSE41-NEXT: xorps %xmm2, %xmm2
49 ; SSE41-NEXT: movups %xmm2, (%rax)
50 ; SSE41-NEXT: movdqu %xmm1, 16(%rsi)
51 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
56 ; AVX1-NEXT: vpmovsxbq (%rdi), %xmm0
57 ; AVX1-NEXT: vpmovsxbq 2(%rdi), %xmm1
58 ; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2
59 ; AVX1-NEXT: vmovups %ymm2, (%rax)
60 ; AVX1-NEXT: vmovdqu %xmm1, 16(%rsi)
61 ; AVX1-NEXT: vmovdqu %xmm0, (%rsi)
62 ; AVX1-NEXT: vzeroupper
67 ; AVX2-NEXT: vpmovsxbq (%rdi), %ymm0
68 ; AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
69 ; AVX2-NEXT: vmovups %ymm1, (%rax)
70 ; AVX2-NEXT: vmovdqu %ymm0, (%rsi)
71 ; AVX2-NEXT: vzeroupper
74 ; X32-AVX2-LABEL: test2:
76 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
77 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
78 ; X32-AVX2-NEXT: vpmovsxbq (%ecx), %ymm0
79 ; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
80 ; X32-AVX2-NEXT: vmovups %ymm1, (%eax)
81 ; X32-AVX2-NEXT: vmovdqu %ymm0, (%eax)
82 ; X32-AVX2-NEXT: vzeroupper
84 %wide.load35 = load <4 x i8>, <4 x i8>* %in, align 1
85 %sext = sext <4 x i8> %wide.load35 to <4 x i64>
86 store <4 x i64> zeroinitializer, <4 x i64>* undef, align 8
87 store <4 x i64> %sext, <4 x i64>* %out, align 8
91 define void @test3(<4 x i8>* %in, <4 x i32>* %out) nounwind {
94 ; SSE41-NEXT: pmovsxbd (%rdi), %xmm0
95 ; SSE41-NEXT: xorps %xmm1, %xmm1
96 ; SSE41-NEXT: movups %xmm1, (%rax)
97 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
102 ; AVX-NEXT: vpmovsxbd (%rdi), %xmm0
103 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
104 ; AVX-NEXT: vmovups %xmm1, (%rax)
105 ; AVX-NEXT: vmovdqu %xmm0, (%rsi)
108 ; X32-AVX2-LABEL: test3:
110 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
111 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
112 ; X32-AVX2-NEXT: vpmovsxbd (%ecx), %xmm0
113 ; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
114 ; X32-AVX2-NEXT: vmovups %xmm1, (%eax)
115 ; X32-AVX2-NEXT: vmovdqu %xmm0, (%eax)
116 ; X32-AVX2-NEXT: retl
117 %wide.load35 = load <4 x i8>, <4 x i8>* %in, align 1
118 %sext = sext <4 x i8> %wide.load35 to <4 x i32>
119 store <4 x i32> zeroinitializer, <4 x i32>* undef, align 8
120 store <4 x i32> %sext, <4 x i32>* %out, align 8
124 define void @test4(<8 x i8>* %in, <8 x i32>* %out) nounwind {
125 ; SSE41-LABEL: test4:
127 ; SSE41-NEXT: pmovsxbd (%rdi), %xmm0
128 ; SSE41-NEXT: pmovsxbd 4(%rdi), %xmm1
129 ; SSE41-NEXT: xorps %xmm2, %xmm2
130 ; SSE41-NEXT: movups %xmm2, (%rax)
131 ; SSE41-NEXT: movdqu %xmm1, 16(%rsi)
132 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
137 ; AVX1-NEXT: vpmovsxbd (%rdi), %xmm0
138 ; AVX1-NEXT: vpmovsxbd 4(%rdi), %xmm1
139 ; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2
140 ; AVX1-NEXT: vmovups %ymm2, (%rax)
141 ; AVX1-NEXT: vmovdqu %xmm1, 16(%rsi)
142 ; AVX1-NEXT: vmovdqu %xmm0, (%rsi)
143 ; AVX1-NEXT: vzeroupper
148 ; AVX2-NEXT: vpmovsxbd (%rdi), %ymm0
149 ; AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
150 ; AVX2-NEXT: vmovups %ymm1, (%rax)
151 ; AVX2-NEXT: vmovdqu %ymm0, (%rsi)
152 ; AVX2-NEXT: vzeroupper
155 ; X32-AVX2-LABEL: test4:
157 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
158 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
159 ; X32-AVX2-NEXT: vpmovsxbd (%ecx), %ymm0
160 ; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
161 ; X32-AVX2-NEXT: vmovups %ymm1, (%eax)
162 ; X32-AVX2-NEXT: vmovdqu %ymm0, (%eax)
163 ; X32-AVX2-NEXT: vzeroupper
164 ; X32-AVX2-NEXT: retl
165 %wide.load35 = load <8 x i8>, <8 x i8>* %in, align 1
166 %sext = sext <8 x i8> %wide.load35 to <8 x i32>
167 store <8 x i32> zeroinitializer, <8 x i32>* undef, align 8
168 store <8 x i32> %sext, <8 x i32>* %out, align 8
172 define void @test5(<8 x i8>* %in, <8 x i16>* %out) nounwind {
173 ; SSE41-LABEL: test5:
175 ; SSE41-NEXT: pmovsxbw (%rdi), %xmm0
176 ; SSE41-NEXT: xorps %xmm1, %xmm1
177 ; SSE41-NEXT: movups %xmm1, (%rax)
178 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
183 ; AVX-NEXT: vpmovsxbw (%rdi), %xmm0
184 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
185 ; AVX-NEXT: vmovups %xmm1, (%rax)
186 ; AVX-NEXT: vmovdqu %xmm0, (%rsi)
189 ; X32-AVX2-LABEL: test5:
191 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
192 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
193 ; X32-AVX2-NEXT: vpmovsxbw (%ecx), %xmm0
194 ; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
195 ; X32-AVX2-NEXT: vmovups %xmm1, (%eax)
196 ; X32-AVX2-NEXT: vmovdqu %xmm0, (%eax)
197 ; X32-AVX2-NEXT: retl
198 %wide.load35 = load <8 x i8>, <8 x i8>* %in, align 1
199 %sext = sext <8 x i8> %wide.load35 to <8 x i16>
200 store <8 x i16> zeroinitializer, <8 x i16>* undef, align 8
201 store <8 x i16> %sext, <8 x i16>* %out, align 8
205 define void @test6(<16 x i8>* %in, <16 x i16>* %out) nounwind {
206 ; SSE41-LABEL: test6:
208 ; SSE41-NEXT: pmovsxbw (%rdi), %xmm0
209 ; SSE41-NEXT: pmovsxbw 8(%rdi), %xmm1
210 ; SSE41-NEXT: xorps %xmm2, %xmm2
211 ; SSE41-NEXT: movups %xmm2, (%rax)
212 ; SSE41-NEXT: movdqu %xmm1, 16(%rsi)
213 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
218 ; AVX1-NEXT: vpmovsxbw (%rdi), %xmm0
219 ; AVX1-NEXT: vpmovsxbw 8(%rdi), %xmm1
220 ; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2
221 ; AVX1-NEXT: vmovups %ymm2, (%rax)
222 ; AVX1-NEXT: vmovdqu %xmm1, 16(%rsi)
223 ; AVX1-NEXT: vmovdqu %xmm0, (%rsi)
224 ; AVX1-NEXT: vzeroupper
229 ; AVX2-NEXT: vpmovsxbw (%rdi), %ymm0
230 ; AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
231 ; AVX2-NEXT: vmovups %ymm1, (%rax)
232 ; AVX2-NEXT: vmovdqu %ymm0, (%rsi)
233 ; AVX2-NEXT: vzeroupper
236 ; X32-AVX2-LABEL: test6:
238 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
239 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
240 ; X32-AVX2-NEXT: vpmovsxbw (%ecx), %ymm0
241 ; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
242 ; X32-AVX2-NEXT: vmovups %ymm1, (%eax)
243 ; X32-AVX2-NEXT: vmovdqu %ymm0, (%eax)
244 ; X32-AVX2-NEXT: vzeroupper
245 ; X32-AVX2-NEXT: retl
246 %wide.load35 = load <16 x i8>, <16 x i8>* %in, align 1
247 %sext = sext <16 x i8> %wide.load35 to <16 x i16>
248 store <16 x i16> zeroinitializer, <16 x i16>* undef, align 8
249 store <16 x i16> %sext, <16 x i16>* %out, align 8
253 define void @test7(<2 x i16>* %in, <2 x i64>* %out) nounwind {
254 ; SSE41-LABEL: test7:
256 ; SSE41-NEXT: pmovsxwq (%rdi), %xmm0
257 ; SSE41-NEXT: xorps %xmm1, %xmm1
258 ; SSE41-NEXT: movups %xmm1, (%rax)
259 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
264 ; AVX-NEXT: vpmovsxwq (%rdi), %xmm0
265 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
266 ; AVX-NEXT: vmovups %xmm1, (%rax)
267 ; AVX-NEXT: vmovdqu %xmm0, (%rsi)
270 ; X32-AVX2-LABEL: test7:
272 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
273 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
274 ; X32-AVX2-NEXT: vpmovsxwq (%ecx), %xmm0
275 ; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
276 ; X32-AVX2-NEXT: vmovups %xmm1, (%eax)
277 ; X32-AVX2-NEXT: vmovdqu %xmm0, (%eax)
278 ; X32-AVX2-NEXT: retl
279 %wide.load35 = load <2 x i16>, <2 x i16>* %in, align 1
280 %sext = sext <2 x i16> %wide.load35 to <2 x i64>
281 store <2 x i64> zeroinitializer, <2 x i64>* undef, align 8
282 store <2 x i64> %sext, <2 x i64>* %out, align 8
286 define void @test8(<4 x i16>* %in, <4 x i64>* %out) nounwind {
287 ; SSE41-LABEL: test8:
289 ; SSE41-NEXT: pmovsxwq (%rdi), %xmm0
290 ; SSE41-NEXT: pmovsxwq 4(%rdi), %xmm1
291 ; SSE41-NEXT: xorps %xmm2, %xmm2
292 ; SSE41-NEXT: movups %xmm2, (%rax)
293 ; SSE41-NEXT: movdqu %xmm1, 16(%rsi)
294 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
299 ; AVX1-NEXT: vpmovsxwq (%rdi), %xmm0
300 ; AVX1-NEXT: vpmovsxwq 4(%rdi), %xmm1
301 ; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2
302 ; AVX1-NEXT: vmovups %ymm2, (%rax)
303 ; AVX1-NEXT: vmovdqu %xmm1, 16(%rsi)
304 ; AVX1-NEXT: vmovdqu %xmm0, (%rsi)
305 ; AVX1-NEXT: vzeroupper
310 ; AVX2-NEXT: vpmovsxwq (%rdi), %ymm0
311 ; AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
312 ; AVX2-NEXT: vmovups %ymm1, (%rax)
313 ; AVX2-NEXT: vmovdqu %ymm0, (%rsi)
314 ; AVX2-NEXT: vzeroupper
317 ; X32-AVX2-LABEL: test8:
319 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
320 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
321 ; X32-AVX2-NEXT: vpmovsxwq (%ecx), %ymm0
322 ; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
323 ; X32-AVX2-NEXT: vmovups %ymm1, (%eax)
324 ; X32-AVX2-NEXT: vmovdqu %ymm0, (%eax)
325 ; X32-AVX2-NEXT: vzeroupper
326 ; X32-AVX2-NEXT: retl
327 %wide.load35 = load <4 x i16>, <4 x i16>* %in, align 1
328 %sext = sext <4 x i16> %wide.load35 to <4 x i64>
329 store <4 x i64> zeroinitializer, <4 x i64>* undef, align 8
330 store <4 x i64> %sext, <4 x i64>* %out, align 8
334 define void @test9(<4 x i16>* %in, <4 x i32>* %out) nounwind {
335 ; SSE41-LABEL: test9:
337 ; SSE41-NEXT: pmovsxwd (%rdi), %xmm0
338 ; SSE41-NEXT: xorps %xmm1, %xmm1
339 ; SSE41-NEXT: movups %xmm1, (%rax)
340 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
345 ; AVX-NEXT: vpmovsxwd (%rdi), %xmm0
346 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
347 ; AVX-NEXT: vmovups %xmm1, (%rax)
348 ; AVX-NEXT: vmovdqu %xmm0, (%rsi)
351 ; X32-AVX2-LABEL: test9:
353 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
354 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
355 ; X32-AVX2-NEXT: vpmovsxwd (%ecx), %xmm0
356 ; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
357 ; X32-AVX2-NEXT: vmovups %xmm1, (%eax)
358 ; X32-AVX2-NEXT: vmovdqu %xmm0, (%eax)
359 ; X32-AVX2-NEXT: retl
360 %wide.load35 = load <4 x i16>, <4 x i16>* %in, align 1
361 %sext = sext <4 x i16> %wide.load35 to <4 x i32>
362 store <4 x i32> zeroinitializer, <4 x i32>* undef, align 8
363 store <4 x i32> %sext, <4 x i32>* %out, align 8
367 define void @test10(<8 x i16>* %in, <8 x i32>* %out) nounwind {
368 ; SSE41-LABEL: test10:
370 ; SSE41-NEXT: pmovsxwd (%rdi), %xmm0
371 ; SSE41-NEXT: pmovsxwd 8(%rdi), %xmm1
372 ; SSE41-NEXT: xorps %xmm2, %xmm2
373 ; SSE41-NEXT: movups %xmm2, (%rax)
374 ; SSE41-NEXT: movdqu %xmm1, 16(%rsi)
375 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
378 ; AVX1-LABEL: test10:
380 ; AVX1-NEXT: vpmovsxwd (%rdi), %xmm0
381 ; AVX1-NEXT: vpmovsxwd 8(%rdi), %xmm1
382 ; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2
383 ; AVX1-NEXT: vmovups %ymm2, (%rax)
384 ; AVX1-NEXT: vmovdqu %xmm1, 16(%rsi)
385 ; AVX1-NEXT: vmovdqu %xmm0, (%rsi)
386 ; AVX1-NEXT: vzeroupper
389 ; AVX2-LABEL: test10:
391 ; AVX2-NEXT: vpmovsxwd (%rdi), %ymm0
392 ; AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
393 ; AVX2-NEXT: vmovups %ymm1, (%rax)
394 ; AVX2-NEXT: vmovdqu %ymm0, (%rsi)
395 ; AVX2-NEXT: vzeroupper
398 ; X32-AVX2-LABEL: test10:
400 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
401 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
402 ; X32-AVX2-NEXT: vpmovsxwd (%ecx), %ymm0
403 ; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
404 ; X32-AVX2-NEXT: vmovups %ymm1, (%eax)
405 ; X32-AVX2-NEXT: vmovdqu %ymm0, (%eax)
406 ; X32-AVX2-NEXT: vzeroupper
407 ; X32-AVX2-NEXT: retl
408 %wide.load35 = load <8 x i16>, <8 x i16>* %in, align 1
409 %sext = sext <8 x i16> %wide.load35 to <8 x i32>
410 store <8 x i32> zeroinitializer, <8 x i32>* undef, align 8
411 store <8 x i32> %sext, <8 x i32>* %out, align 8
415 define void @test11(<2 x i32>* %in, <2 x i64>* %out) nounwind {
416 ; SSE41-LABEL: test11:
418 ; SSE41-NEXT: pmovsxdq (%rdi), %xmm0
419 ; SSE41-NEXT: xorps %xmm1, %xmm1
420 ; SSE41-NEXT: movups %xmm1, (%rax)
421 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
426 ; AVX-NEXT: vpmovsxdq (%rdi), %xmm0
427 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
428 ; AVX-NEXT: vmovups %xmm1, (%rax)
429 ; AVX-NEXT: vmovdqu %xmm0, (%rsi)
432 ; X32-AVX2-LABEL: test11:
434 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
435 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
436 ; X32-AVX2-NEXT: vpmovsxdq (%ecx), %xmm0
437 ; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
438 ; X32-AVX2-NEXT: vmovups %xmm1, (%eax)
439 ; X32-AVX2-NEXT: vmovdqu %xmm0, (%eax)
440 ; X32-AVX2-NEXT: retl
441 %wide.load35 = load <2 x i32>, <2 x i32>* %in, align 1
442 %sext = sext <2 x i32> %wide.load35 to <2 x i64>
443 store <2 x i64> zeroinitializer, <2 x i64>* undef, align 8
444 store <2 x i64> %sext, <2 x i64>* %out, align 8
448 define void @test12(<4 x i32>* %in, <4 x i64>* %out) nounwind {
449 ; SSE41-LABEL: test12:
451 ; SSE41-NEXT: pmovsxdq (%rdi), %xmm0
452 ; SSE41-NEXT: pmovsxdq 8(%rdi), %xmm1
453 ; SSE41-NEXT: xorps %xmm2, %xmm2
454 ; SSE41-NEXT: movups %xmm2, (%rax)
455 ; SSE41-NEXT: movdqu %xmm1, 16(%rsi)
456 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
459 ; AVX1-LABEL: test12:
461 ; AVX1-NEXT: vpmovsxdq (%rdi), %xmm0
462 ; AVX1-NEXT: vpmovsxdq 8(%rdi), %xmm1
463 ; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2
464 ; AVX1-NEXT: vmovups %ymm2, (%rax)
465 ; AVX1-NEXT: vmovdqu %xmm1, 16(%rsi)
466 ; AVX1-NEXT: vmovdqu %xmm0, (%rsi)
467 ; AVX1-NEXT: vzeroupper
470 ; AVX2-LABEL: test12:
472 ; AVX2-NEXT: vpmovsxdq (%rdi), %ymm0
473 ; AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
474 ; AVX2-NEXT: vmovups %ymm1, (%rax)
475 ; AVX2-NEXT: vmovdqu %ymm0, (%rsi)
476 ; AVX2-NEXT: vzeroupper
479 ; X32-AVX2-LABEL: test12:
481 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
482 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
483 ; X32-AVX2-NEXT: vpmovsxdq (%ecx), %ymm0
484 ; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
485 ; X32-AVX2-NEXT: vmovups %ymm1, (%eax)
486 ; X32-AVX2-NEXT: vmovdqu %ymm0, (%eax)
487 ; X32-AVX2-NEXT: vzeroupper
488 ; X32-AVX2-NEXT: retl
489 %wide.load35 = load <4 x i32>, <4 x i32>* %in, align 1
490 %sext = sext <4 x i32> %wide.load35 to <4 x i64>
491 store <4 x i64> zeroinitializer, <4 x i64>* undef, align 8
492 store <4 x i64> %sext, <4 x i64>* %out, align 8