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: vpmovsxbd (%rdi), %xmm0
57 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm1
58 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
59 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0
60 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
61 ; AVX1-NEXT: vxorps %ymm1, %ymm1, %ymm1
62 ; AVX1-NEXT: vmovups %ymm1, (%rax)
63 ; AVX1-NEXT: vmovups %ymm0, (%rsi)
64 ; AVX1-NEXT: vzeroupper
69 ; AVX2-NEXT: vpmovsxbq (%rdi), %ymm0
70 ; AVX2-NEXT: vxorps %ymm1, %ymm1, %ymm1
71 ; AVX2-NEXT: vmovups %ymm1, (%rax)
72 ; AVX2-NEXT: vmovdqu %ymm0, (%rsi)
73 ; AVX2-NEXT: vzeroupper
76 ; X32-AVX2-LABEL: test2:
78 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
79 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
80 ; X32-AVX2-NEXT: vpmovsxbq (%ecx), %ymm0
81 ; X32-AVX2-NEXT: vxorps %ymm1, %ymm1, %ymm1
82 ; X32-AVX2-NEXT: vmovups %ymm1, (%eax)
83 ; X32-AVX2-NEXT: vmovdqu %ymm0, (%eax)
84 ; X32-AVX2-NEXT: vzeroupper
86 %wide.load35 = load <4 x i8>, <4 x i8>* %in, align 1
87 %sext = sext <4 x i8> %wide.load35 to <4 x i64>
88 store <4 x i64> zeroinitializer, <4 x i64>* undef, align 8
89 store <4 x i64> %sext, <4 x i64>* %out, align 8
93 define void @test3(<4 x i8>* %in, <4 x i32>* %out) nounwind {
96 ; SSE41-NEXT: pmovsxbd (%rdi), %xmm0
97 ; SSE41-NEXT: xorps %xmm1, %xmm1
98 ; SSE41-NEXT: movups %xmm1, (%rax)
99 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
104 ; AVX-NEXT: vpmovsxbd (%rdi), %xmm0
105 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
106 ; AVX-NEXT: vmovups %xmm1, (%rax)
107 ; AVX-NEXT: vmovdqu %xmm0, (%rsi)
110 ; X32-AVX2-LABEL: test3:
112 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
113 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
114 ; X32-AVX2-NEXT: vpmovsxbd (%ecx), %xmm0
115 ; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
116 ; X32-AVX2-NEXT: vmovups %xmm1, (%eax)
117 ; X32-AVX2-NEXT: vmovdqu %xmm0, (%eax)
118 ; X32-AVX2-NEXT: retl
119 %wide.load35 = load <4 x i8>, <4 x i8>* %in, align 1
120 %sext = sext <4 x i8> %wide.load35 to <4 x i32>
121 store <4 x i32> zeroinitializer, <4 x i32>* undef, align 8
122 store <4 x i32> %sext, <4 x i32>* %out, align 8
126 define void @test4(<8 x i8>* %in, <8 x i32>* %out) nounwind {
127 ; SSE41-LABEL: test4:
129 ; SSE41-NEXT: pmovsxbd (%rdi), %xmm0
130 ; SSE41-NEXT: pmovsxbd 4(%rdi), %xmm1
131 ; SSE41-NEXT: xorps %xmm2, %xmm2
132 ; SSE41-NEXT: movups %xmm2, (%rax)
133 ; SSE41-NEXT: movdqu %xmm1, 16(%rsi)
134 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
139 ; AVX1-NEXT: vpmovsxbw (%rdi), %xmm0
140 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm1
141 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
142 ; AVX1-NEXT: vpmovsxwd %xmm0, %xmm0
143 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
144 ; AVX1-NEXT: vxorps %ymm1, %ymm1, %ymm1
145 ; AVX1-NEXT: vmovups %ymm1, (%rax)
146 ; AVX1-NEXT: vmovups %ymm0, (%rsi)
147 ; AVX1-NEXT: vzeroupper
152 ; AVX2-NEXT: vpmovsxbd (%rdi), %ymm0
153 ; AVX2-NEXT: vxorps %ymm1, %ymm1, %ymm1
154 ; AVX2-NEXT: vmovups %ymm1, (%rax)
155 ; AVX2-NEXT: vmovdqu %ymm0, (%rsi)
156 ; AVX2-NEXT: vzeroupper
159 ; X32-AVX2-LABEL: test4:
161 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
162 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
163 ; X32-AVX2-NEXT: vpmovsxbd (%ecx), %ymm0
164 ; X32-AVX2-NEXT: vxorps %ymm1, %ymm1, %ymm1
165 ; X32-AVX2-NEXT: vmovups %ymm1, (%eax)
166 ; X32-AVX2-NEXT: vmovdqu %ymm0, (%eax)
167 ; X32-AVX2-NEXT: vzeroupper
168 ; X32-AVX2-NEXT: retl
169 %wide.load35 = load <8 x i8>, <8 x i8>* %in, align 1
170 %sext = sext <8 x i8> %wide.load35 to <8 x i32>
171 store <8 x i32> zeroinitializer, <8 x i32>* undef, align 8
172 store <8 x i32> %sext, <8 x i32>* %out, align 8
176 define void @test5(<8 x i8>* %in, <8 x i16>* %out) nounwind {
177 ; SSE41-LABEL: test5:
179 ; SSE41-NEXT: pmovsxbw (%rdi), %xmm0
180 ; SSE41-NEXT: xorps %xmm1, %xmm1
181 ; SSE41-NEXT: movups %xmm1, (%rax)
182 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
187 ; AVX-NEXT: vpmovsxbw (%rdi), %xmm0
188 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
189 ; AVX-NEXT: vmovups %xmm1, (%rax)
190 ; AVX-NEXT: vmovdqu %xmm0, (%rsi)
193 ; X32-AVX2-LABEL: test5:
195 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
196 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
197 ; X32-AVX2-NEXT: vpmovsxbw (%ecx), %xmm0
198 ; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
199 ; X32-AVX2-NEXT: vmovups %xmm1, (%eax)
200 ; X32-AVX2-NEXT: vmovdqu %xmm0, (%eax)
201 ; X32-AVX2-NEXT: retl
202 %wide.load35 = load <8 x i8>, <8 x i8>* %in, align 1
203 %sext = sext <8 x i8> %wide.load35 to <8 x i16>
204 store <8 x i16> zeroinitializer, <8 x i16>* undef, align 8
205 store <8 x i16> %sext, <8 x i16>* %out, align 8
209 define void @test6(<16 x i8>* %in, <16 x i16>* %out) nounwind {
210 ; SSE41-LABEL: test6:
212 ; SSE41-NEXT: pmovsxbw (%rdi), %xmm0
213 ; SSE41-NEXT: pmovsxbw 8(%rdi), %xmm1
214 ; SSE41-NEXT: xorps %xmm2, %xmm2
215 ; SSE41-NEXT: movups %xmm2, (%rax)
216 ; SSE41-NEXT: movdqu %xmm1, 16(%rsi)
217 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
222 ; AVX1-NEXT: vpmovsxbw (%rdi), %xmm0
223 ; AVX1-NEXT: vpmovsxbw 8(%rdi), %xmm1
224 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
225 ; AVX1-NEXT: vxorps %ymm1, %ymm1, %ymm1
226 ; AVX1-NEXT: vmovups %ymm1, (%rax)
227 ; AVX1-NEXT: vmovups %ymm0, (%rsi)
228 ; AVX1-NEXT: vzeroupper
233 ; AVX2-NEXT: vpmovsxbw (%rdi), %ymm0
234 ; AVX2-NEXT: vxorps %ymm1, %ymm1, %ymm1
235 ; AVX2-NEXT: vmovups %ymm1, (%rax)
236 ; AVX2-NEXT: vmovdqu %ymm0, (%rsi)
237 ; AVX2-NEXT: vzeroupper
240 ; X32-AVX2-LABEL: test6:
242 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
243 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
244 ; X32-AVX2-NEXT: vpmovsxbw (%ecx), %ymm0
245 ; X32-AVX2-NEXT: vxorps %ymm1, %ymm1, %ymm1
246 ; X32-AVX2-NEXT: vmovups %ymm1, (%eax)
247 ; X32-AVX2-NEXT: vmovdqu %ymm0, (%eax)
248 ; X32-AVX2-NEXT: vzeroupper
249 ; X32-AVX2-NEXT: retl
250 %wide.load35 = load <16 x i8>, <16 x i8>* %in, align 1
251 %sext = sext <16 x i8> %wide.load35 to <16 x i16>
252 store <16 x i16> zeroinitializer, <16 x i16>* undef, align 8
253 store <16 x i16> %sext, <16 x i16>* %out, align 8
257 define void @test7(<2 x i16>* %in, <2 x i64>* %out) nounwind {
258 ; SSE41-LABEL: test7:
260 ; SSE41-NEXT: pmovsxwq (%rdi), %xmm0
261 ; SSE41-NEXT: xorps %xmm1, %xmm1
262 ; SSE41-NEXT: movups %xmm1, (%rax)
263 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
268 ; AVX-NEXT: vpmovsxwq (%rdi), %xmm0
269 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
270 ; AVX-NEXT: vmovups %xmm1, (%rax)
271 ; AVX-NEXT: vmovdqu %xmm0, (%rsi)
274 ; X32-AVX2-LABEL: test7:
276 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
277 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
278 ; X32-AVX2-NEXT: vpmovsxwq (%ecx), %xmm0
279 ; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
280 ; X32-AVX2-NEXT: vmovups %xmm1, (%eax)
281 ; X32-AVX2-NEXT: vmovdqu %xmm0, (%eax)
282 ; X32-AVX2-NEXT: retl
283 %wide.load35 = load <2 x i16>, <2 x i16>* %in, align 1
284 %sext = sext <2 x i16> %wide.load35 to <2 x i64>
285 store <2 x i64> zeroinitializer, <2 x i64>* undef, align 8
286 store <2 x i64> %sext, <2 x i64>* %out, align 8
290 define void @test8(<4 x i16>* %in, <4 x i64>* %out) nounwind {
291 ; SSE41-LABEL: test8:
293 ; SSE41-NEXT: pmovsxwq (%rdi), %xmm0
294 ; SSE41-NEXT: pmovsxwq 4(%rdi), %xmm1
295 ; SSE41-NEXT: xorps %xmm2, %xmm2
296 ; SSE41-NEXT: movups %xmm2, (%rax)
297 ; SSE41-NEXT: movdqu %xmm1, 16(%rsi)
298 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
303 ; AVX1-NEXT: vpmovsxwd (%rdi), %xmm0
304 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm1
305 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
306 ; AVX1-NEXT: vpmovsxdq %xmm0, %xmm0
307 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
308 ; AVX1-NEXT: vxorps %ymm1, %ymm1, %ymm1
309 ; AVX1-NEXT: vmovups %ymm1, (%rax)
310 ; AVX1-NEXT: vmovups %ymm0, (%rsi)
311 ; AVX1-NEXT: vzeroupper
316 ; AVX2-NEXT: vpmovsxwq (%rdi), %ymm0
317 ; AVX2-NEXT: vxorps %ymm1, %ymm1, %ymm1
318 ; AVX2-NEXT: vmovups %ymm1, (%rax)
319 ; AVX2-NEXT: vmovdqu %ymm0, (%rsi)
320 ; AVX2-NEXT: vzeroupper
323 ; X32-AVX2-LABEL: test8:
325 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
326 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
327 ; X32-AVX2-NEXT: vpmovsxwq (%ecx), %ymm0
328 ; X32-AVX2-NEXT: vxorps %ymm1, %ymm1, %ymm1
329 ; X32-AVX2-NEXT: vmovups %ymm1, (%eax)
330 ; X32-AVX2-NEXT: vmovdqu %ymm0, (%eax)
331 ; X32-AVX2-NEXT: vzeroupper
332 ; X32-AVX2-NEXT: retl
333 %wide.load35 = load <4 x i16>, <4 x i16>* %in, align 1
334 %sext = sext <4 x i16> %wide.load35 to <4 x i64>
335 store <4 x i64> zeroinitializer, <4 x i64>* undef, align 8
336 store <4 x i64> %sext, <4 x i64>* %out, align 8
340 define void @test9(<4 x i16>* %in, <4 x i32>* %out) nounwind {
341 ; SSE41-LABEL: test9:
343 ; SSE41-NEXT: pmovsxwd (%rdi), %xmm0
344 ; SSE41-NEXT: xorps %xmm1, %xmm1
345 ; SSE41-NEXT: movups %xmm1, (%rax)
346 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
351 ; AVX-NEXT: vpmovsxwd (%rdi), %xmm0
352 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
353 ; AVX-NEXT: vmovups %xmm1, (%rax)
354 ; AVX-NEXT: vmovdqu %xmm0, (%rsi)
357 ; X32-AVX2-LABEL: test9:
359 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
360 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
361 ; X32-AVX2-NEXT: vpmovsxwd (%ecx), %xmm0
362 ; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
363 ; X32-AVX2-NEXT: vmovups %xmm1, (%eax)
364 ; X32-AVX2-NEXT: vmovdqu %xmm0, (%eax)
365 ; X32-AVX2-NEXT: retl
366 %wide.load35 = load <4 x i16>, <4 x i16>* %in, align 1
367 %sext = sext <4 x i16> %wide.load35 to <4 x i32>
368 store <4 x i32> zeroinitializer, <4 x i32>* undef, align 8
369 store <4 x i32> %sext, <4 x i32>* %out, align 8
373 define void @test10(<8 x i16>* %in, <8 x i32>* %out) nounwind {
374 ; SSE41-LABEL: test10:
376 ; SSE41-NEXT: pmovsxwd (%rdi), %xmm0
377 ; SSE41-NEXT: pmovsxwd 8(%rdi), %xmm1
378 ; SSE41-NEXT: xorps %xmm2, %xmm2
379 ; SSE41-NEXT: movups %xmm2, (%rax)
380 ; SSE41-NEXT: movdqu %xmm1, 16(%rsi)
381 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
384 ; AVX1-LABEL: test10:
386 ; AVX1-NEXT: vpmovsxwd (%rdi), %xmm0
387 ; AVX1-NEXT: vpmovsxwd 8(%rdi), %xmm1
388 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
389 ; AVX1-NEXT: vxorps %ymm1, %ymm1, %ymm1
390 ; AVX1-NEXT: vmovups %ymm1, (%rax)
391 ; AVX1-NEXT: vmovups %ymm0, (%rsi)
392 ; AVX1-NEXT: vzeroupper
395 ; AVX2-LABEL: test10:
397 ; AVX2-NEXT: vpmovsxwd (%rdi), %ymm0
398 ; AVX2-NEXT: vxorps %ymm1, %ymm1, %ymm1
399 ; AVX2-NEXT: vmovups %ymm1, (%rax)
400 ; AVX2-NEXT: vmovdqu %ymm0, (%rsi)
401 ; AVX2-NEXT: vzeroupper
404 ; X32-AVX2-LABEL: test10:
406 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
407 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
408 ; X32-AVX2-NEXT: vpmovsxwd (%ecx), %ymm0
409 ; X32-AVX2-NEXT: vxorps %ymm1, %ymm1, %ymm1
410 ; X32-AVX2-NEXT: vmovups %ymm1, (%eax)
411 ; X32-AVX2-NEXT: vmovdqu %ymm0, (%eax)
412 ; X32-AVX2-NEXT: vzeroupper
413 ; X32-AVX2-NEXT: retl
414 %wide.load35 = load <8 x i16>, <8 x i16>* %in, align 1
415 %sext = sext <8 x i16> %wide.load35 to <8 x i32>
416 store <8 x i32> zeroinitializer, <8 x i32>* undef, align 8
417 store <8 x i32> %sext, <8 x i32>* %out, align 8
421 define void @test11(<2 x i32>* %in, <2 x i64>* %out) nounwind {
422 ; SSE41-LABEL: test11:
424 ; SSE41-NEXT: pmovsxdq (%rdi), %xmm0
425 ; SSE41-NEXT: xorps %xmm1, %xmm1
426 ; SSE41-NEXT: movups %xmm1, (%rax)
427 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
432 ; AVX-NEXT: vpmovsxdq (%rdi), %xmm0
433 ; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
434 ; AVX-NEXT: vmovups %xmm1, (%rax)
435 ; AVX-NEXT: vmovdqu %xmm0, (%rsi)
438 ; X32-AVX2-LABEL: test11:
440 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
441 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
442 ; X32-AVX2-NEXT: vpmovsxdq (%ecx), %xmm0
443 ; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1
444 ; X32-AVX2-NEXT: vmovups %xmm1, (%eax)
445 ; X32-AVX2-NEXT: vmovdqu %xmm0, (%eax)
446 ; X32-AVX2-NEXT: retl
447 %wide.load35 = load <2 x i32>, <2 x i32>* %in, align 1
448 %sext = sext <2 x i32> %wide.load35 to <2 x i64>
449 store <2 x i64> zeroinitializer, <2 x i64>* undef, align 8
450 store <2 x i64> %sext, <2 x i64>* %out, align 8
454 define void @test12(<4 x i32>* %in, <4 x i64>* %out) nounwind {
455 ; SSE41-LABEL: test12:
457 ; SSE41-NEXT: pmovsxdq (%rdi), %xmm0
458 ; SSE41-NEXT: pmovsxdq 8(%rdi), %xmm1
459 ; SSE41-NEXT: xorps %xmm2, %xmm2
460 ; SSE41-NEXT: movups %xmm2, (%rax)
461 ; SSE41-NEXT: movdqu %xmm1, 16(%rsi)
462 ; SSE41-NEXT: movdqu %xmm0, (%rsi)
465 ; AVX1-LABEL: test12:
467 ; AVX1-NEXT: vpmovsxdq (%rdi), %xmm0
468 ; AVX1-NEXT: vpmovsxdq 8(%rdi), %xmm1
469 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
470 ; AVX1-NEXT: vxorps %ymm1, %ymm1, %ymm1
471 ; AVX1-NEXT: vmovups %ymm1, (%rax)
472 ; AVX1-NEXT: vmovups %ymm0, (%rsi)
473 ; AVX1-NEXT: vzeroupper
476 ; AVX2-LABEL: test12:
478 ; AVX2-NEXT: vpmovsxdq (%rdi), %ymm0
479 ; AVX2-NEXT: vxorps %ymm1, %ymm1, %ymm1
480 ; AVX2-NEXT: vmovups %ymm1, (%rax)
481 ; AVX2-NEXT: vmovdqu %ymm0, (%rsi)
482 ; AVX2-NEXT: vzeroupper
485 ; X32-AVX2-LABEL: test12:
487 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
488 ; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
489 ; X32-AVX2-NEXT: vpmovsxdq (%ecx), %ymm0
490 ; X32-AVX2-NEXT: vxorps %ymm1, %ymm1, %ymm1
491 ; X32-AVX2-NEXT: vmovups %ymm1, (%eax)
492 ; X32-AVX2-NEXT: vmovdqu %ymm0, (%eax)
493 ; X32-AVX2-NEXT: vzeroupper
494 ; X32-AVX2-NEXT: retl
495 %wide.load35 = load <4 x i32>, <4 x i32>* %in, align 1
496 %sext = sext <4 x i32> %wide.load35 to <4 x i64>
497 store <4 x i64> zeroinitializer, <4 x i64>* undef, align 8
498 store <4 x i64> %sext, <4 x i64>* %out, align 8