[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / pmovsx-inreg.ll
blobf89223fa45834968303b10904ebaf5e9bff4e245
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
7 ; PR14887
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 {
11 ; SSE41-LABEL: test1:
12 ; SSE41:       # %bb.0:
13 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
14 ; SSE41-NEXT:    xorps %xmm1, %xmm1
15 ; SSE41-NEXT:    movups %xmm1, (%rax)
16 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
17 ; SSE41-NEXT:    retq
19 ; AVX-LABEL: test1:
20 ; AVX:       # %bb.0:
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)
25 ; AVX-NEXT:    retq
27 ; X32-AVX2-LABEL: test1:
28 ; X32-AVX2:       # %bb.0:
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)
35 ; X32-AVX2-NEXT:    retl
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
40   ret void
43 define void @test2(<4 x i8>* %in, <4 x i64>* %out) nounwind {
44 ; SSE41-LABEL: test2:
45 ; SSE41:       # %bb.0:
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)
52 ; SSE41-NEXT:    retq
54 ; AVX1-LABEL: test2:
55 ; AVX1:       # %bb.0:
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
63 ; AVX1-NEXT:    retq
65 ; AVX2-LABEL: test2:
66 ; AVX2:       # %bb.0:
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
72 ; AVX2-NEXT:    retq
74 ; X32-AVX2-LABEL: test2:
75 ; X32-AVX2:       # %bb.0:
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
83 ; X32-AVX2-NEXT:    retl
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
88   ret void
91 define void @test3(<4 x i8>* %in, <4 x i32>* %out) nounwind {
92 ; SSE41-LABEL: test3:
93 ; SSE41:       # %bb.0:
94 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
95 ; SSE41-NEXT:    xorps %xmm1, %xmm1
96 ; SSE41-NEXT:    movups %xmm1, (%rax)
97 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
98 ; SSE41-NEXT:    retq
100 ; AVX-LABEL: test3:
101 ; AVX:       # %bb.0:
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)
106 ; AVX-NEXT:    retq
108 ; X32-AVX2-LABEL: test3:
109 ; X32-AVX2:       # %bb.0:
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
121   ret void
124 define void @test4(<8 x i8>* %in, <8 x i32>* %out) nounwind {
125 ; SSE41-LABEL: test4:
126 ; SSE41:       # %bb.0:
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)
133 ; SSE41-NEXT:    retq
135 ; AVX1-LABEL: test4:
136 ; AVX1:       # %bb.0:
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
144 ; AVX1-NEXT:    retq
146 ; AVX2-LABEL: test4:
147 ; AVX2:       # %bb.0:
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
153 ; AVX2-NEXT:    retq
155 ; X32-AVX2-LABEL: test4:
156 ; X32-AVX2:       # %bb.0:
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
169   ret void
172 define void @test5(<8 x i8>* %in, <8 x i16>* %out) nounwind {
173 ; SSE41-LABEL: test5:
174 ; SSE41:       # %bb.0:
175 ; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
176 ; SSE41-NEXT:    xorps %xmm1, %xmm1
177 ; SSE41-NEXT:    movups %xmm1, (%rax)
178 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
179 ; SSE41-NEXT:    retq
181 ; AVX-LABEL: test5:
182 ; AVX:       # %bb.0:
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)
187 ; AVX-NEXT:    retq
189 ; X32-AVX2-LABEL: test5:
190 ; X32-AVX2:       # %bb.0:
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
202   ret void
205 define void @test6(<16 x i8>* %in, <16 x i16>* %out) nounwind {
206 ; SSE41-LABEL: test6:
207 ; SSE41:       # %bb.0:
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)
214 ; SSE41-NEXT:    retq
216 ; AVX1-LABEL: test6:
217 ; AVX1:       # %bb.0:
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
225 ; AVX1-NEXT:    retq
227 ; AVX2-LABEL: test6:
228 ; AVX2:       # %bb.0:
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
234 ; AVX2-NEXT:    retq
236 ; X32-AVX2-LABEL: test6:
237 ; X32-AVX2:       # %bb.0:
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
250   ret void
253 define void @test7(<2 x i16>* %in, <2 x i64>* %out) nounwind {
254 ; SSE41-LABEL: test7:
255 ; SSE41:       # %bb.0:
256 ; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
257 ; SSE41-NEXT:    xorps %xmm1, %xmm1
258 ; SSE41-NEXT:    movups %xmm1, (%rax)
259 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
260 ; SSE41-NEXT:    retq
262 ; AVX-LABEL: test7:
263 ; AVX:       # %bb.0:
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)
268 ; AVX-NEXT:    retq
270 ; X32-AVX2-LABEL: test7:
271 ; X32-AVX2:       # %bb.0:
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
283   ret void
286 define void @test8(<4 x i16>* %in, <4 x i64>* %out) nounwind {
287 ; SSE41-LABEL: test8:
288 ; SSE41:       # %bb.0:
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)
295 ; SSE41-NEXT:    retq
297 ; AVX1-LABEL: test8:
298 ; AVX1:       # %bb.0:
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
306 ; AVX1-NEXT:    retq
308 ; AVX2-LABEL: test8:
309 ; AVX2:       # %bb.0:
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
315 ; AVX2-NEXT:    retq
317 ; X32-AVX2-LABEL: test8:
318 ; X32-AVX2:       # %bb.0:
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
331   ret void
334 define void @test9(<4 x i16>* %in, <4 x i32>* %out) nounwind {
335 ; SSE41-LABEL: test9:
336 ; SSE41:       # %bb.0:
337 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
338 ; SSE41-NEXT:    xorps %xmm1, %xmm1
339 ; SSE41-NEXT:    movups %xmm1, (%rax)
340 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
341 ; SSE41-NEXT:    retq
343 ; AVX-LABEL: test9:
344 ; AVX:       # %bb.0:
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)
349 ; AVX-NEXT:    retq
351 ; X32-AVX2-LABEL: test9:
352 ; X32-AVX2:       # %bb.0:
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
364   ret void
367 define void @test10(<8 x i16>* %in, <8 x i32>* %out) nounwind {
368 ; SSE41-LABEL: test10:
369 ; SSE41:       # %bb.0:
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)
376 ; SSE41-NEXT:    retq
378 ; AVX1-LABEL: test10:
379 ; AVX1:       # %bb.0:
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
387 ; AVX1-NEXT:    retq
389 ; AVX2-LABEL: test10:
390 ; AVX2:       # %bb.0:
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
396 ; AVX2-NEXT:    retq
398 ; X32-AVX2-LABEL: test10:
399 ; X32-AVX2:       # %bb.0:
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
412   ret void
415 define void @test11(<2 x i32>* %in, <2 x i64>* %out) nounwind {
416 ; SSE41-LABEL: test11:
417 ; SSE41:       # %bb.0:
418 ; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
419 ; SSE41-NEXT:    xorps %xmm1, %xmm1
420 ; SSE41-NEXT:    movups %xmm1, (%rax)
421 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
422 ; SSE41-NEXT:    retq
424 ; AVX-LABEL: test11:
425 ; AVX:       # %bb.0:
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)
430 ; AVX-NEXT:    retq
432 ; X32-AVX2-LABEL: test11:
433 ; X32-AVX2:       # %bb.0:
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
445   ret void
448 define void @test12(<4 x i32>* %in, <4 x i64>* %out) nounwind {
449 ; SSE41-LABEL: test12:
450 ; SSE41:       # %bb.0:
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)
457 ; SSE41-NEXT:    retq
459 ; AVX1-LABEL: test12:
460 ; AVX1:       # %bb.0:
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
468 ; AVX1-NEXT:    retq
470 ; AVX2-LABEL: test12:
471 ; AVX2:       # %bb.0:
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
477 ; AVX2-NEXT:    retq
479 ; X32-AVX2-LABEL: test12:
480 ; X32-AVX2:       # %bb.0:
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
493   ret void