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
10define 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
43define 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:    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
64;
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
73;
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
89}
90
91define 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
99;
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
107;
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
122}
123
124define 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
134;
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
145;
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
154;
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
170}
171
172define 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
180;
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
188;
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
203}
204
205define 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
215;
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
226;
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
235;
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
251}
252
253define 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
261;
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
269;
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
284}
285
286define 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
296;
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
307;
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
316;
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
332}
333
334define 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
342;
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
350;
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
365}
366
367define 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
377;
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
388;
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
397;
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
413}
414
415define 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
423;
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
431;
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
446}
447
448define 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
458;
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
469;
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
478;
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
494}
495