]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/X86/pmovsx-inreg.ll
Vendor import of llvm trunk r291274:
[FreeBSD/FreeBSD.git] / test / CodeGen / X86 / pmovsx-inreg.ll
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
6
7 ; PR14887
8 ; These tests inject a store into the chain to test the inreg versions of pmovsx
9
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
18 ;
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
26 ;
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
41 }
42
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
53 ;
54 ; AVX1-LABEL: test2:
55 ; AVX1:       # BB#0:
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
65 ; AVX1-NEXT:    retq
66 ;
67 ; AVX2-LABEL: test2:
68 ; AVX2:       # BB#0:
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
74 ; AVX2-NEXT:    retq
75 ;
76 ; X32-AVX2-LABEL: test2:
77 ; X32-AVX2:       # BB#0:
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
85 ; X32-AVX2-NEXT:    retl
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
90   ret void
91 }
92
93 define void @test3(<4 x i8>* %in, <4 x i32>* %out) nounwind {
94 ; SSE41-LABEL: test3:
95 ; SSE41:       # BB#0:
96 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
97 ; SSE41-NEXT:    xorps %xmm1, %xmm1
98 ; SSE41-NEXT:    movups %xmm1, (%rax)
99 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
100 ; SSE41-NEXT:    retq
101 ;
102 ; AVX-LABEL: test3:
103 ; AVX:       # BB#0:
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)
108 ; AVX-NEXT:    retq
109 ;
110 ; X32-AVX2-LABEL: test3:
111 ; X32-AVX2:       # BB#0:
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
123   ret void
124 }
125
126 define void @test4(<8 x i8>* %in, <8 x i32>* %out) nounwind {
127 ; SSE41-LABEL: test4:
128 ; SSE41:       # BB#0:
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)
135 ; SSE41-NEXT:    retq
136 ;
137 ; AVX1-LABEL: test4:
138 ; AVX1:       # BB#0:
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
148 ; AVX1-NEXT:    retq
149 ;
150 ; AVX2-LABEL: test4:
151 ; AVX2:       # BB#0:
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
157 ; AVX2-NEXT:    retq
158 ;
159 ; X32-AVX2-LABEL: test4:
160 ; X32-AVX2:       # BB#0:
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
173   ret void
174 }
175
176 define void @test5(<8 x i8>* %in, <8 x i16>* %out) nounwind {
177 ; SSE41-LABEL: test5:
178 ; SSE41:       # BB#0:
179 ; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
180 ; SSE41-NEXT:    xorps %xmm1, %xmm1
181 ; SSE41-NEXT:    movups %xmm1, (%rax)
182 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
183 ; SSE41-NEXT:    retq
184 ;
185 ; AVX-LABEL: test5:
186 ; AVX:       # BB#0:
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)
191 ; AVX-NEXT:    retq
192 ;
193 ; X32-AVX2-LABEL: test5:
194 ; X32-AVX2:       # BB#0:
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
206   ret void
207 }
208
209 define void @test6(<16 x i8>* %in, <16 x i16>* %out) nounwind {
210 ; SSE41-LABEL: test6:
211 ; SSE41:       # BB#0:
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)
218 ; SSE41-NEXT:    retq
219 ;
220 ; AVX1-LABEL: test6:
221 ; AVX1:       # BB#0:
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
229 ; AVX1-NEXT:    retq
230 ;
231 ; AVX2-LABEL: test6:
232 ; AVX2:       # BB#0:
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
238 ; AVX2-NEXT:    retq
239 ;
240 ; X32-AVX2-LABEL: test6:
241 ; X32-AVX2:       # BB#0:
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
254   ret void
255 }
256
257 define void @test7(<2 x i16>* %in, <2 x i64>* %out) nounwind {
258 ; SSE41-LABEL: test7:
259 ; SSE41:       # BB#0:
260 ; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
261 ; SSE41-NEXT:    xorps %xmm1, %xmm1
262 ; SSE41-NEXT:    movups %xmm1, (%rax)
263 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
264 ; SSE41-NEXT:    retq
265 ;
266 ; AVX-LABEL: test7:
267 ; AVX:       # BB#0:
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)
272 ; AVX-NEXT:    retq
273 ;
274 ; X32-AVX2-LABEL: test7:
275 ; X32-AVX2:       # BB#0:
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
287   ret void
288 }
289
290 define void @test8(<4 x i16>* %in, <4 x i64>* %out) nounwind {
291 ; SSE41-LABEL: test8:
292 ; SSE41:       # BB#0:
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)
299 ; SSE41-NEXT:    retq
300 ;
301 ; AVX1-LABEL: test8:
302 ; AVX1:       # BB#0:
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
312 ; AVX1-NEXT:    retq
313 ;
314 ; AVX2-LABEL: test8:
315 ; AVX2:       # BB#0:
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
321 ; AVX2-NEXT:    retq
322 ;
323 ; X32-AVX2-LABEL: test8:
324 ; X32-AVX2:       # BB#0:
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
337   ret void
338 }
339
340 define void @test9(<4 x i16>* %in, <4 x i32>* %out) nounwind {
341 ; SSE41-LABEL: test9:
342 ; SSE41:       # BB#0:
343 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
344 ; SSE41-NEXT:    xorps %xmm1, %xmm1
345 ; SSE41-NEXT:    movups %xmm1, (%rax)
346 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
347 ; SSE41-NEXT:    retq
348 ;
349 ; AVX-LABEL: test9:
350 ; AVX:       # BB#0:
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)
355 ; AVX-NEXT:    retq
356 ;
357 ; X32-AVX2-LABEL: test9:
358 ; X32-AVX2:       # BB#0:
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
370   ret void
371 }
372
373 define void @test10(<8 x i16>* %in, <8 x i32>* %out) nounwind {
374 ; SSE41-LABEL: test10:
375 ; SSE41:       # BB#0:
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)
382 ; SSE41-NEXT:    retq
383 ;
384 ; AVX1-LABEL: test10:
385 ; AVX1:       # BB#0:
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
393 ; AVX1-NEXT:    retq
394 ;
395 ; AVX2-LABEL: test10:
396 ; AVX2:       # BB#0:
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
402 ; AVX2-NEXT:    retq
403 ;
404 ; X32-AVX2-LABEL: test10:
405 ; X32-AVX2:       # BB#0:
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
418   ret void
419 }
420
421 define void @test11(<2 x i32>* %in, <2 x i64>* %out) nounwind {
422 ; SSE41-LABEL: test11:
423 ; SSE41:       # BB#0:
424 ; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
425 ; SSE41-NEXT:    xorps %xmm1, %xmm1
426 ; SSE41-NEXT:    movups %xmm1, (%rax)
427 ; SSE41-NEXT:    movdqu %xmm0, (%rsi)
428 ; SSE41-NEXT:    retq
429 ;
430 ; AVX-LABEL: test11:
431 ; AVX:       # BB#0:
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)
436 ; AVX-NEXT:    retq
437 ;
438 ; X32-AVX2-LABEL: test11:
439 ; X32-AVX2:       # BB#0:
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
451   ret void
452 }
453
454 define void @test12(<4 x i32>* %in, <4 x i64>* %out) nounwind {
455 ; SSE41-LABEL: test12:
456 ; SSE41:       # BB#0:
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)
463 ; SSE41-NEXT:    retq
464 ;
465 ; AVX1-LABEL: test12:
466 ; AVX1:       # BB#0:
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
474 ; AVX1-NEXT:    retq
475 ;
476 ; AVX2-LABEL: test12:
477 ; AVX2:       # BB#0:
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
483 ; AVX2-NEXT:    retq
484 ;
485 ; X32-AVX2-LABEL: test12:
486 ; X32-AVX2:       # BB#0:
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
499   ret void
500 }