blob: b253828013373d02ebaf392d667e35b853d8ebeb [file] [log] [blame]
Zvi Rackovera27442f2018-01-10 14:56:15 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
6
7define <4 x i32> @test1(<8 x i32> %v) {
8; SSE2-LABEL: test1:
9; SSE2: # %bb.0:
Zvi Rackovera27442f2018-01-10 14:56:15 +000010; SSE2-NEXT: retq
11;
Zvi Rackover999e6c22018-01-11 18:02:33 +000012; AVX-LABEL: test1:
13; AVX: # %bb.0:
Puyan Lotfi43e94b12018-01-31 22:04:26 +000014; AVX-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
Zvi Rackover999e6c22018-01-11 18:02:33 +000015; AVX-NEXT: vzeroupper
16; AVX-NEXT: retq
Zvi Rackovera27442f2018-01-10 14:56:15 +000017 %x = sext <8 x i32> %v to <8 x i64>
18 %s = shufflevector <8 x i64> %x, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
19 %t = trunc <4 x i64> %s to <4 x i32>
20 ret <4 x i32> %t
21}
22
23define <4 x i32> @test2(<8 x i32> %v) {
24; SSE2-LABEL: test2:
25; SSE2: # %bb.0:
Zvi Rackover999e6c22018-01-11 18:02:33 +000026; SSE2-NEXT: movaps %xmm1, %xmm0
Zvi Rackovera27442f2018-01-10 14:56:15 +000027; SSE2-NEXT: retq
28;
Zvi Rackover999e6c22018-01-11 18:02:33 +000029; AVX-LABEL: test2:
30; AVX: # %bb.0:
31; AVX-NEXT: vextractf128 $1, %ymm0, %xmm0
32; AVX-NEXT: vzeroupper
33; AVX-NEXT: retq
Zvi Rackovera27442f2018-01-10 14:56:15 +000034 %x = sext <8 x i32> %v to <8 x i64>
35 %s = shufflevector <8 x i64> %x, <8 x i64> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
36 %t = trunc <4 x i64> %s to <4 x i32>
37 ret <4 x i32> %t
38}
39
40define <2 x i32> @test3(<8 x i32> %v) {
41; SSE2-LABEL: test3:
42; SSE2: # %bb.0:
43; SSE2-NEXT: movdqa %xmm1, %xmm0
44; SSE2-NEXT: psrad $31, %xmm0
45; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
46; SSE2-NEXT: movdqa %xmm1, %xmm0
47; SSE2-NEXT: retq
48;
49; AVX2-LABEL: test3:
50; AVX2: # %bb.0:
51; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
52; AVX2-NEXT: vpmovsxdq %xmm0, %ymm0
Puyan Lotfi43e94b12018-01-31 22:04:26 +000053; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
Zvi Rackovera27442f2018-01-10 14:56:15 +000054; AVX2-NEXT: vzeroupper
55; AVX2-NEXT: retq
56;
57; AVX512-LABEL: test3:
58; AVX512: # %bb.0:
59; AVX512-NEXT: vpmovsxdq %ymm0, %zmm0
60; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm0
61; AVX512-NEXT: vzeroupper
62; AVX512-NEXT: retq
63 %x = sext <8 x i32> %v to <8 x i64>
64 %s = shufflevector <8 x i64> %x, <8 x i64> undef, <2 x i32> <i32 4, i32 5>
65 %t = trunc <2 x i64> %s to <2 x i32>
66 ret <2 x i32> %t
67}
68
69define <2 x i32> @test4(<8 x i32> %v) {
70; SSE2-LABEL: test4:
71; SSE2: # %bb.0:
72; SSE2-NEXT: movdqa %xmm0, %xmm1
73; SSE2-NEXT: psrad $31, %xmm1
74; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
75; SSE2-NEXT: retq
76;
77; AVX2-LABEL: test4:
78; AVX2: # %bb.0:
79; AVX2-NEXT: vpmovsxdq %xmm0, %ymm0
Puyan Lotfi43e94b12018-01-31 22:04:26 +000080; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
Zvi Rackovera27442f2018-01-10 14:56:15 +000081; AVX2-NEXT: vzeroupper
82; AVX2-NEXT: retq
83;
84; AVX512-LABEL: test4:
85; AVX512: # %bb.0:
86; AVX512-NEXT: vpmovsxdq %ymm0, %zmm0
Puyan Lotfi43e94b12018-01-31 22:04:26 +000087; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0
Zvi Rackovera27442f2018-01-10 14:56:15 +000088; AVX512-NEXT: vzeroupper
89; AVX512-NEXT: retq
90 %x = sext <8 x i32> %v to <8 x i64>
91 %s = shufflevector <8 x i64> %x, <8 x i64> undef, <2 x i32> <i32 0, i32 1>
92 %t = trunc <2 x i64> %s to <2 x i32>
93 ret <2 x i32> %t
94}
95
96define <2 x i32> @test5(<8 x i32> %v) {
97; SSE2-LABEL: test5:
98; SSE2: # %bb.0:
99; SSE2-NEXT: movdqa %xmm1, %xmm2
100; SSE2-NEXT: psrad $31, %xmm2
101; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
102; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
103; SSE2-NEXT: movdqa %xmm0, %xmm2
104; SSE2-NEXT: psrad $31, %xmm2
105; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
106; SSE2-NEXT: shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
107; SSE2-NEXT: retq
108;
109; AVX2-LABEL: test5:
110; AVX2: # %bb.0:
111; AVX2-NEXT: vpmovsxdq %xmm0, %ymm1
112; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
113; AVX2-NEXT: vpmovsxdq %xmm0, %ymm0
114; AVX2-NEXT: vpalignr {{.*#+}} ymm0 = ymm1[8,9,10,11,12,13,14,15],ymm0[0,1,2,3,4,5,6,7],ymm1[24,25,26,27,28,29,30,31],ymm0[16,17,18,19,20,21,22,23]
115; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[2,1,2,3]
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000116; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
Zvi Rackovera27442f2018-01-10 14:56:15 +0000117; AVX2-NEXT: vzeroupper
118; AVX2-NEXT: retq
119;
120; AVX512-LABEL: test5:
121; AVX512: # %bb.0:
122; AVX512-NEXT: vpmovsxdq %ymm0, %zmm0
123; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm1
124; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm0
125; AVX512-NEXT: vpalignr {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
126; AVX512-NEXT: vzeroupper
127; AVX512-NEXT: retq
128 %x = sext <8 x i32> %v to <8 x i64>
129 %s = shufflevector <8 x i64> %x, <8 x i64> undef, <2 x i32> <i32 3, i32 4>
130 %t = trunc <2 x i64> %s to <2 x i32>
131 ret <2 x i32> %t
132}
Zvi Rackovercf099982018-01-11 17:50:34 +0000133
134define <4 x i32> @test6(<8 x i32> %v) {
135; SSE2-LABEL: test6:
136; SSE2: # %bb.0:
137; SSE2-NEXT: retq
138;
Zvi Rackover999e6c22018-01-11 18:02:33 +0000139; AVX-LABEL: test6:
140; AVX: # %bb.0:
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000141; AVX-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
Zvi Rackover999e6c22018-01-11 18:02:33 +0000142; AVX-NEXT: vzeroupper
143; AVX-NEXT: retq
Zvi Rackovercf099982018-01-11 17:50:34 +0000144 %x = zext <8 x i32> %v to <8 x i64>
145 %s = shufflevector <8 x i64> %x, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
146 %t = trunc <4 x i64> %s to <4 x i32>
147 ret <4 x i32> %t
148}
149
150define <4 x i32> @test7(<8 x i32> %v) {
151; SSE2-LABEL: test7:
152; SSE2: # %bb.0:
153; SSE2-NEXT: movaps %xmm1, %xmm0
154; SSE2-NEXT: retq
155;
Zvi Rackover999e6c22018-01-11 18:02:33 +0000156; AVX-LABEL: test7:
157; AVX: # %bb.0:
158; AVX-NEXT: vextractf128 $1, %ymm0, %xmm0
159; AVX-NEXT: vzeroupper
160; AVX-NEXT: retq
Zvi Rackovercf099982018-01-11 17:50:34 +0000161 %x = zext <8 x i32> %v to <8 x i64>
162 %s = shufflevector <8 x i64> %x, <8 x i64> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
163 %t = trunc <4 x i64> %s to <4 x i32>
164 ret <4 x i32> %t
165}
166
167define <2 x i32> @test8(<8 x i32> %v) {
168; SSE2-LABEL: test8:
169; SSE2: # %bb.0:
170; SSE2-NEXT: xorps %xmm0, %xmm0
171; SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
172; SSE2-NEXT: movaps %xmm1, %xmm0
173; SSE2-NEXT: retq
174;
175; AVX2-LABEL: test8:
176; AVX2: # %bb.0:
177; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
178; AVX2-NEXT: vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000179; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
Zvi Rackovercf099982018-01-11 17:50:34 +0000180; AVX2-NEXT: vzeroupper
181; AVX2-NEXT: retq
182;
183; AVX512-LABEL: test8:
184; AVX512: # %bb.0:
185; AVX512-NEXT: vpmovzxdq {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero
186; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm0
187; AVX512-NEXT: vzeroupper
188; AVX512-NEXT: retq
189 %x = zext <8 x i32> %v to <8 x i64>
190 %s = shufflevector <8 x i64> %x, <8 x i64> undef, <2 x i32> <i32 4, i32 5>
191 %t = trunc <2 x i64> %s to <2 x i32>
192 ret <2 x i32> %t
193}
194
195define <2 x i32> @test9(<8 x i32> %v) {
196; SSE2-LABEL: test9:
197; SSE2: # %bb.0:
198; SSE2-NEXT: xorps %xmm1, %xmm1
199; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
200; SSE2-NEXT: retq
201;
202; AVX2-LABEL: test9:
203; AVX2: # %bb.0:
204; AVX2-NEXT: vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000205; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
Zvi Rackovercf099982018-01-11 17:50:34 +0000206; AVX2-NEXT: vzeroupper
207; AVX2-NEXT: retq
208;
209; AVX512-LABEL: test9:
210; AVX512: # %bb.0:
211; AVX512-NEXT: vpmovzxdq {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000212; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0
Zvi Rackovercf099982018-01-11 17:50:34 +0000213; AVX512-NEXT: vzeroupper
214; AVX512-NEXT: retq
215 %x = zext <8 x i32> %v to <8 x i64>
216 %s = shufflevector <8 x i64> %x, <8 x i64> undef, <2 x i32> <i32 0, i32 1>
217 %t = trunc <2 x i64> %s to <2 x i32>
218 ret <2 x i32> %t
219}
220
221define <2 x i32> @test10(<8 x i32> %v) {
222; SSE2-LABEL: test10:
223; SSE2: # %bb.0:
224; SSE2-NEXT: xorpd %xmm2, %xmm2
225; SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
226; SSE2-NEXT: unpckhps {{.*#+}} xmm0 = xmm0[2],xmm2[2],xmm0[3],xmm2[3]
227; SSE2-NEXT: shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0]
228; SSE2-NEXT: retq
229;
230; AVX2-LABEL: test10:
231; AVX2: # %bb.0:
232; AVX2-NEXT: vpmovzxdq {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
233; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
234; AVX2-NEXT: vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
235; AVX2-NEXT: vpalignr {{.*#+}} ymm0 = ymm1[8,9,10,11,12,13,14,15],ymm0[0,1,2,3,4,5,6,7],ymm1[24,25,26,27,28,29,30,31],ymm0[16,17,18,19,20,21,22,23]
236; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[2,1,2,3]
Puyan Lotfi43e94b12018-01-31 22:04:26 +0000237; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
Zvi Rackovercf099982018-01-11 17:50:34 +0000238; AVX2-NEXT: vzeroupper
239; AVX2-NEXT: retq
240;
241; AVX512-LABEL: test10:
242; AVX512: # %bb.0:
243; AVX512-NEXT: vpmovzxdq {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero
244; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm1
245; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm0
246; AVX512-NEXT: vpalignr {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7]
247; AVX512-NEXT: vzeroupper
248; AVX512-NEXT: retq
249 %x = zext <8 x i32> %v to <8 x i64>
250 %s = shufflevector <8 x i64> %x, <8 x i64> undef, <2 x i32> <i32 3, i32 4>
251 %t = trunc <2 x i64> %s to <2 x i32>
252 ret <2 x i32> %t
253}