blob: 267eec4bdab4d6a60430854de92e7e2506be3a7b [file] [log] [blame]
Sanjay Patel4e71ff22019-01-03 17:55:32 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2 | FileCheck %s --check-prefixes=ANY,SSE,SSE2
3; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=ANY,SSE,SSE41
4; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx | FileCheck %s --check-prefixes=ANY,AVX
5
6define <2 x i64> @extract0_i32_zext_insert0_i64_undef(<4 x i32> %x) {
Sanjay Patelfad5bda2019-01-15 16:11:05 +00007; SSE2-LABEL: extract0_i32_zext_insert0_i64_undef:
8; SSE2: # %bb.0:
9; SSE2-NEXT: xorps %xmm1, %xmm1
10; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
11; SSE2-NEXT: retq
12;
13; SSE41-LABEL: extract0_i32_zext_insert0_i64_undef:
14; SSE41: # %bb.0:
15; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
16; SSE41-NEXT: retq
Sanjay Patel4e71ff22019-01-03 17:55:32 +000017;
18; AVX-LABEL: extract0_i32_zext_insert0_i64_undef:
19; AVX: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +000020; AVX-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
Sanjay Patel4e71ff22019-01-03 17:55:32 +000021; AVX-NEXT: retq
22 %e = extractelement <4 x i32> %x, i32 0
23 %z = zext i32 %e to i64
24 %r = insertelement <2 x i64> undef, i64 %z, i32 0
25 ret <2 x i64> %r
26}
27
28define <2 x i64> @extract0_i32_zext_insert0_i64_zero(<4 x i32> %x) {
29; SSE-LABEL: extract0_i32_zext_insert0_i64_zero:
30; SSE: # %bb.0:
31; SSE-NEXT: movd %xmm0, %eax
32; SSE-NEXT: movq %rax, %xmm0
33; SSE-NEXT: retq
34;
35; AVX-LABEL: extract0_i32_zext_insert0_i64_zero:
36; AVX: # %bb.0:
37; AVX-NEXT: vmovd %xmm0, %eax
38; AVX-NEXT: vmovq %rax, %xmm0
39; AVX-NEXT: retq
40 %e = extractelement <4 x i32> %x, i32 0
41 %z = zext i32 %e to i64
42 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0
43 ret <2 x i64> %r
44}
45
46define <2 x i64> @extract1_i32_zext_insert0_i64_undef(<4 x i32> %x) {
Sanjay Patelfad5bda2019-01-15 16:11:05 +000047; SSE-LABEL: extract1_i32_zext_insert0_i64_undef:
48; SSE: # %bb.0:
49; SSE-NEXT: psrlq $32, %xmm0
50; SSE-NEXT: retq
Sanjay Patel4e71ff22019-01-03 17:55:32 +000051;
52; AVX-LABEL: extract1_i32_zext_insert0_i64_undef:
53; AVX: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +000054; AVX-NEXT: vpsrlq $32, %xmm0, %xmm0
Sanjay Patel4e71ff22019-01-03 17:55:32 +000055; AVX-NEXT: retq
56 %e = extractelement <4 x i32> %x, i32 1
57 %z = zext i32 %e to i64
58 %r = insertelement <2 x i64> undef, i64 %z, i32 0
59 ret <2 x i64> %r
60}
61
62define <2 x i64> @extract1_i32_zext_insert0_i64_zero(<4 x i32> %x) {
63; SSE2-LABEL: extract1_i32_zext_insert0_i64_zero:
64; SSE2: # %bb.0:
65; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
66; SSE2-NEXT: movd %xmm0, %eax
67; SSE2-NEXT: movq %rax, %xmm0
68; SSE2-NEXT: retq
69;
70; SSE41-LABEL: extract1_i32_zext_insert0_i64_zero:
71; SSE41: # %bb.0:
72; SSE41-NEXT: extractps $1, %xmm0, %eax
73; SSE41-NEXT: movq %rax, %xmm0
74; SSE41-NEXT: retq
75;
76; AVX-LABEL: extract1_i32_zext_insert0_i64_zero:
77; AVX: # %bb.0:
78; AVX-NEXT: vextractps $1, %xmm0, %eax
79; AVX-NEXT: vmovq %rax, %xmm0
80; AVX-NEXT: retq
81 %e = extractelement <4 x i32> %x, i32 1
82 %z = zext i32 %e to i64
83 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0
84 ret <2 x i64> %r
85}
86
87define <2 x i64> @extract2_i32_zext_insert0_i64_undef(<4 x i32> %x) {
Sanjay Patelfad5bda2019-01-15 16:11:05 +000088; SSE-LABEL: extract2_i32_zext_insert0_i64_undef:
89; SSE: # %bb.0:
90; SSE-NEXT: xorps %xmm1, %xmm1
91; SSE-NEXT: unpckhps {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
92; SSE-NEXT: retq
Sanjay Patel4e71ff22019-01-03 17:55:32 +000093;
94; AVX-LABEL: extract2_i32_zext_insert0_i64_undef:
95; AVX: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +000096; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
97; AVX-NEXT: vunpckhps {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
Sanjay Patel4e71ff22019-01-03 17:55:32 +000098; AVX-NEXT: retq
99 %e = extractelement <4 x i32> %x, i32 2
100 %z = zext i32 %e to i64
101 %r = insertelement <2 x i64> undef, i64 %z, i32 0
102 ret <2 x i64> %r
103}
104
105define <2 x i64> @extract2_i32_zext_insert0_i64_zero(<4 x i32> %x) {
106; SSE2-LABEL: extract2_i32_zext_insert0_i64_zero:
107; SSE2: # %bb.0:
108; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
109; SSE2-NEXT: movd %xmm0, %eax
110; SSE2-NEXT: movq %rax, %xmm0
111; SSE2-NEXT: retq
112;
113; SSE41-LABEL: extract2_i32_zext_insert0_i64_zero:
114; SSE41: # %bb.0:
115; SSE41-NEXT: extractps $2, %xmm0, %eax
116; SSE41-NEXT: movq %rax, %xmm0
117; SSE41-NEXT: retq
118;
119; AVX-LABEL: extract2_i32_zext_insert0_i64_zero:
120; AVX: # %bb.0:
121; AVX-NEXT: vextractps $2, %xmm0, %eax
122; AVX-NEXT: vmovq %rax, %xmm0
123; AVX-NEXT: retq
124 %e = extractelement <4 x i32> %x, i32 2
125 %z = zext i32 %e to i64
126 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0
127 ret <2 x i64> %r
128}
129
130define <2 x i64> @extract3_i32_zext_insert0_i64_undef(<4 x i32> %x) {
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000131; SSE-LABEL: extract3_i32_zext_insert0_i64_undef:
132; SSE: # %bb.0:
133; SSE-NEXT: psrldq {{.*#+}} xmm0 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
134; SSE-NEXT: retq
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000135;
136; AVX-LABEL: extract3_i32_zext_insert0_i64_undef:
137; AVX: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000138; AVX-NEXT: vpsrldq {{.*#+}} xmm0 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000139; AVX-NEXT: retq
140 %e = extractelement <4 x i32> %x, i32 3
141 %z = zext i32 %e to i64
142 %r = insertelement <2 x i64> undef, i64 %z, i32 0
143 ret <2 x i64> %r
144}
145
146define <2 x i64> @extract3_i32_zext_insert0_i64_zero(<4 x i32> %x) {
147; SSE2-LABEL: extract3_i32_zext_insert0_i64_zero:
148; SSE2: # %bb.0:
149; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
150; SSE2-NEXT: movd %xmm0, %eax
151; SSE2-NEXT: movq %rax, %xmm0
152; SSE2-NEXT: retq
153;
154; SSE41-LABEL: extract3_i32_zext_insert0_i64_zero:
155; SSE41: # %bb.0:
156; SSE41-NEXT: extractps $3, %xmm0, %eax
157; SSE41-NEXT: movq %rax, %xmm0
158; SSE41-NEXT: retq
159;
160; AVX-LABEL: extract3_i32_zext_insert0_i64_zero:
161; AVX: # %bb.0:
162; AVX-NEXT: vextractps $3, %xmm0, %eax
163; AVX-NEXT: vmovq %rax, %xmm0
164; AVX-NEXT: retq
165 %e = extractelement <4 x i32> %x, i32 3
166 %z = zext i32 %e to i64
167 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0
168 ret <2 x i64> %r
169}
170
171define <2 x i64> @extract0_i32_zext_insert1_i64_undef(<4 x i32> %x) {
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000172; SSE2-LABEL: extract0_i32_zext_insert1_i64_undef:
173; SSE2: # %bb.0:
174; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
175; SSE2-NEXT: pxor %xmm1, %xmm1
176; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
177; SSE2-NEXT: retq
178;
179; SSE41-LABEL: extract0_i32_zext_insert1_i64_undef:
180; SSE41: # %bb.0:
181; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]
182; SSE41-NEXT: pxor %xmm0, %xmm0
183; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4,5],xmm0[6,7]
184; SSE41-NEXT: retq
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000185;
186; AVX-LABEL: extract0_i32_zext_insert1_i64_undef:
187; AVX: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000188; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,1,0,1]
189; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
190; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3]
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000191; AVX-NEXT: retq
192 %e = extractelement <4 x i32> %x, i32 0
193 %z = zext i32 %e to i64
194 %r = insertelement <2 x i64> undef, i64 %z, i32 1
195 ret <2 x i64> %r
196}
197
198define <2 x i64> @extract0_i32_zext_insert1_i64_zero(<4 x i32> %x) {
199; SSE-LABEL: extract0_i32_zext_insert1_i64_zero:
200; SSE: # %bb.0:
201; SSE-NEXT: movd %xmm0, %eax
202; SSE-NEXT: movq %rax, %xmm0
203; SSE-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
204; SSE-NEXT: retq
205;
206; AVX-LABEL: extract0_i32_zext_insert1_i64_zero:
207; AVX: # %bb.0:
208; AVX-NEXT: vmovd %xmm0, %eax
209; AVX-NEXT: vmovq %rax, %xmm0
210; AVX-NEXT: vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
211; AVX-NEXT: retq
212 %e = extractelement <4 x i32> %x, i32 0
213 %z = zext i32 %e to i64
214 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1
215 ret <2 x i64> %r
216}
217
218define <2 x i64> @extract1_i32_zext_insert1_i64_undef(<4 x i32> %x) {
219; SSE2-LABEL: extract1_i32_zext_insert1_i64_undef:
220; SSE2: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000221; SSE2-NEXT: xorps %xmm1, %xmm1
222; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000223; SSE2-NEXT: retq
224;
225; SSE41-LABEL: extract1_i32_zext_insert1_i64_undef:
226; SSE41: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000227; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000228; SSE41-NEXT: retq
229;
230; AVX-LABEL: extract1_i32_zext_insert1_i64_undef:
231; AVX: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000232; AVX-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000233; AVX-NEXT: retq
234 %e = extractelement <4 x i32> %x, i32 1
235 %z = zext i32 %e to i64
236 %r = insertelement <2 x i64> undef, i64 %z, i32 1
237 ret <2 x i64> %r
238}
239
240define <2 x i64> @extract1_i32_zext_insert1_i64_zero(<4 x i32> %x) {
241; SSE2-LABEL: extract1_i32_zext_insert1_i64_zero:
242; SSE2: # %bb.0:
243; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
244; SSE2-NEXT: movd %xmm0, %eax
245; SSE2-NEXT: movq %rax, %xmm0
246; SSE2-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
247; SSE2-NEXT: retq
248;
249; SSE41-LABEL: extract1_i32_zext_insert1_i64_zero:
250; SSE41: # %bb.0:
251; SSE41-NEXT: extractps $1, %xmm0, %eax
252; SSE41-NEXT: movq %rax, %xmm0
253; SSE41-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
254; SSE41-NEXT: retq
255;
256; AVX-LABEL: extract1_i32_zext_insert1_i64_zero:
257; AVX: # %bb.0:
258; AVX-NEXT: vextractps $1, %xmm0, %eax
259; AVX-NEXT: vmovq %rax, %xmm0
260; AVX-NEXT: vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
261; AVX-NEXT: retq
262 %e = extractelement <4 x i32> %x, i32 1
263 %z = zext i32 %e to i64
264 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1
265 ret <2 x i64> %r
266}
267
268define <2 x i64> @extract2_i32_zext_insert1_i64_undef(<4 x i32> %x) {
269; SSE2-LABEL: extract2_i32_zext_insert1_i64_undef:
270; SSE2: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000271; SSE2-NEXT: andps {{.*}}(%rip), %xmm0
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000272; SSE2-NEXT: retq
273;
274; SSE41-LABEL: extract2_i32_zext_insert1_i64_undef:
275; SSE41: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000276; SSE41-NEXT: xorps %xmm1, %xmm1
277; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3]
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000278; SSE41-NEXT: retq
279;
280; AVX-LABEL: extract2_i32_zext_insert1_i64_undef:
281; AVX: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000282; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1
283; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3]
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000284; AVX-NEXT: retq
285 %e = extractelement <4 x i32> %x, i32 2
286 %z = zext i32 %e to i64
287 %r = insertelement <2 x i64> undef, i64 %z, i32 1
288 ret <2 x i64> %r
289}
290
291define <2 x i64> @extract2_i32_zext_insert1_i64_zero(<4 x i32> %x) {
292; SSE2-LABEL: extract2_i32_zext_insert1_i64_zero:
293; SSE2: # %bb.0:
294; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
295; SSE2-NEXT: movd %xmm0, %eax
296; SSE2-NEXT: movq %rax, %xmm0
297; SSE2-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
298; SSE2-NEXT: retq
299;
300; SSE41-LABEL: extract2_i32_zext_insert1_i64_zero:
301; SSE41: # %bb.0:
302; SSE41-NEXT: extractps $2, %xmm0, %eax
303; SSE41-NEXT: movq %rax, %xmm0
304; SSE41-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
305; SSE41-NEXT: retq
306;
307; AVX-LABEL: extract2_i32_zext_insert1_i64_zero:
308; AVX: # %bb.0:
309; AVX-NEXT: vextractps $2, %xmm0, %eax
310; AVX-NEXT: vmovq %rax, %xmm0
311; AVX-NEXT: vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
312; AVX-NEXT: retq
313 %e = extractelement <4 x i32> %x, i32 2
314 %z = zext i32 %e to i64
315 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1
316 ret <2 x i64> %r
317}
318
319define <2 x i64> @extract3_i32_zext_insert1_i64_undef(<4 x i32> %x) {
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000320; SSE-LABEL: extract3_i32_zext_insert1_i64_undef:
321; SSE: # %bb.0:
322; SSE-NEXT: psrlq $32, %xmm0
323; SSE-NEXT: retq
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000324;
325; AVX-LABEL: extract3_i32_zext_insert1_i64_undef:
326; AVX: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000327; AVX-NEXT: vpsrlq $32, %xmm0, %xmm0
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000328; AVX-NEXT: retq
329 %e = extractelement <4 x i32> %x, i32 3
330 %z = zext i32 %e to i64
331 %r = insertelement <2 x i64> undef, i64 %z, i32 1
332 ret <2 x i64> %r
333}
334
335define <2 x i64> @extract3_i32_zext_insert1_i64_zero(<4 x i32> %x) {
336; SSE2-LABEL: extract3_i32_zext_insert1_i64_zero:
337; SSE2: # %bb.0:
338; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
339; SSE2-NEXT: movd %xmm0, %eax
340; SSE2-NEXT: movq %rax, %xmm0
341; SSE2-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
342; SSE2-NEXT: retq
343;
344; SSE41-LABEL: extract3_i32_zext_insert1_i64_zero:
345; SSE41: # %bb.0:
346; SSE41-NEXT: extractps $3, %xmm0, %eax
347; SSE41-NEXT: movq %rax, %xmm0
348; SSE41-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
349; SSE41-NEXT: retq
350;
351; AVX-LABEL: extract3_i32_zext_insert1_i64_zero:
352; AVX: # %bb.0:
353; AVX-NEXT: vextractps $3, %xmm0, %eax
354; AVX-NEXT: vmovq %rax, %xmm0
355; AVX-NEXT: vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
356; AVX-NEXT: retq
357 %e = extractelement <4 x i32> %x, i32 3
358 %z = zext i32 %e to i64
359 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1
360 ret <2 x i64> %r
361}
362
363define <2 x i64> @extract0_i16_zext_insert0_i64_undef(<8 x i16> %x) {
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000364; SSE2-LABEL: extract0_i16_zext_insert0_i64_undef:
365; SSE2: # %bb.0:
366; SSE2-NEXT: pxor %xmm1, %xmm1
367; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
368; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
369; SSE2-NEXT: retq
370;
371; SSE41-LABEL: extract0_i16_zext_insert0_i64_undef:
372; SSE41: # %bb.0:
373; SSE41-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
374; SSE41-NEXT: retq
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000375;
376; AVX-LABEL: extract0_i16_zext_insert0_i64_undef:
377; AVX: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000378; AVX-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000379; AVX-NEXT: retq
380 %e = extractelement <8 x i16> %x, i32 0
381 %z = zext i16 %e to i64
382 %r = insertelement <2 x i64> undef, i64 %z, i32 0
383 ret <2 x i64> %r
384}
385
386define <2 x i64> @extract0_i16_zext_insert0_i64_zero(<8 x i16> %x) {
387; SSE-LABEL: extract0_i16_zext_insert0_i64_zero:
388; SSE: # %bb.0:
389; SSE-NEXT: pextrw $0, %xmm0, %eax
390; SSE-NEXT: movq %rax, %xmm0
391; SSE-NEXT: retq
392;
393; AVX-LABEL: extract0_i16_zext_insert0_i64_zero:
394; AVX: # %bb.0:
395; AVX-NEXT: vpextrw $0, %xmm0, %eax
396; AVX-NEXT: vmovq %rax, %xmm0
397; AVX-NEXT: retq
398 %e = extractelement <8 x i16> %x, i32 0
399 %z = zext i16 %e to i64
400 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0
401 ret <2 x i64> %r
402}
403
404define <2 x i64> @extract1_i16_zext_insert0_i64_undef(<8 x i16> %x) {
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000405; SSE2-LABEL: extract1_i16_zext_insert0_i64_undef:
406; SSE2: # %bb.0:
407; SSE2-NEXT: pxor %xmm1, %xmm1
408; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
409; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm1[0,1,2,3,4,6,6,7]
410; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,1,2,3]
411; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,0,1,4,5,6,7]
412; SSE2-NEXT: retq
413;
414; SSE41-LABEL: extract1_i16_zext_insert0_i64_undef:
415; SSE41: # %bb.0:
416; SSE41-NEXT: psrld $16, %xmm0
417; SSE41-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
418; SSE41-NEXT: retq
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000419;
420; AVX-LABEL: extract1_i16_zext_insert0_i64_undef:
421; AVX: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000422; AVX-NEXT: vpsrld $16, %xmm0, %xmm0
423; AVX-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000424; AVX-NEXT: retq
425 %e = extractelement <8 x i16> %x, i32 1
426 %z = zext i16 %e to i64
427 %r = insertelement <2 x i64> undef, i64 %z, i32 0
428 ret <2 x i64> %r
429}
430
431define <2 x i64> @extract1_i16_zext_insert0_i64_zero(<8 x i16> %x) {
432; SSE-LABEL: extract1_i16_zext_insert0_i64_zero:
433; SSE: # %bb.0:
434; SSE-NEXT: pextrw $1, %xmm0, %eax
435; SSE-NEXT: movq %rax, %xmm0
436; SSE-NEXT: retq
437;
438; AVX-LABEL: extract1_i16_zext_insert0_i64_zero:
439; AVX: # %bb.0:
440; AVX-NEXT: vpextrw $1, %xmm0, %eax
441; AVX-NEXT: vmovq %rax, %xmm0
442; AVX-NEXT: retq
443 %e = extractelement <8 x i16> %x, i32 1
444 %z = zext i16 %e to i64
445 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0
446 ret <2 x i64> %r
447}
448
449define <2 x i64> @extract2_i16_zext_insert0_i64_undef(<8 x i16> %x) {
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000450; SSE2-LABEL: extract2_i16_zext_insert0_i64_undef:
451; SSE2: # %bb.0:
452; SSE2-NEXT: pxor %xmm1, %xmm1
453; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
454; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[3,1,2,0]
455; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
456; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
457; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,1,2,0,4,5,6,7]
458; SSE2-NEXT: retq
459;
460; SSE41-LABEL: extract2_i16_zext_insert0_i64_undef:
461; SSE41: # %bb.0:
462; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
463; SSE41-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
464; SSE41-NEXT: retq
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000465;
466; AVX-LABEL: extract2_i16_zext_insert0_i64_undef:
467; AVX: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000468; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
469; AVX-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000470; AVX-NEXT: retq
471 %e = extractelement <8 x i16> %x, i32 2
472 %z = zext i16 %e to i64
473 %r = insertelement <2 x i64> undef, i64 %z, i32 0
474 ret <2 x i64> %r
475}
476
477define <2 x i64> @extract2_i16_zext_insert0_i64_zero(<8 x i16> %x) {
478; SSE-LABEL: extract2_i16_zext_insert0_i64_zero:
479; SSE: # %bb.0:
480; SSE-NEXT: pextrw $2, %xmm0, %eax
481; SSE-NEXT: movq %rax, %xmm0
482; SSE-NEXT: retq
483;
484; AVX-LABEL: extract2_i16_zext_insert0_i64_zero:
485; AVX: # %bb.0:
486; AVX-NEXT: vpextrw $2, %xmm0, %eax
487; AVX-NEXT: vmovq %rax, %xmm0
488; AVX-NEXT: retq
489 %e = extractelement <8 x i16> %x, i32 2
490 %z = zext i16 %e to i64
491 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0
492 ret <2 x i64> %r
493}
494
495define <2 x i64> @extract3_i16_zext_insert0_i64_undef(<8 x i16> %x) {
496; SSE-LABEL: extract3_i16_zext_insert0_i64_undef:
497; SSE: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000498; SSE-NEXT: psrlq $48, %xmm0
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000499; SSE-NEXT: retq
500;
501; AVX-LABEL: extract3_i16_zext_insert0_i64_undef:
502; AVX: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000503; AVX-NEXT: vpsrlq $48, %xmm0, %xmm0
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000504; AVX-NEXT: retq
505 %e = extractelement <8 x i16> %x, i32 3
506 %z = zext i16 %e to i64
507 %r = insertelement <2 x i64> undef, i64 %z, i32 0
508 ret <2 x i64> %r
509}
510
511define <2 x i64> @extract3_i16_zext_insert0_i64_zero(<8 x i16> %x) {
512; SSE-LABEL: extract3_i16_zext_insert0_i64_zero:
513; SSE: # %bb.0:
514; SSE-NEXT: pextrw $3, %xmm0, %eax
515; SSE-NEXT: movq %rax, %xmm0
516; SSE-NEXT: retq
517;
518; AVX-LABEL: extract3_i16_zext_insert0_i64_zero:
519; AVX: # %bb.0:
520; AVX-NEXT: vpextrw $3, %xmm0, %eax
521; AVX-NEXT: vmovq %rax, %xmm0
522; AVX-NEXT: retq
523 %e = extractelement <8 x i16> %x, i32 3
524 %z = zext i16 %e to i64
525 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0
526 ret <2 x i64> %r
527}
528
529define <2 x i64> @extract0_i16_zext_insert1_i64_undef(<8 x i16> %x) {
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000530; SSE2-LABEL: extract0_i16_zext_insert1_i64_undef:
531; SSE2: # %bb.0:
532; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
533; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
534; SSE2-NEXT: retq
535;
536; SSE41-LABEL: extract0_i16_zext_insert1_i64_undef:
537; SSE41: # %bb.0:
538; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]
539; SSE41-NEXT: pxor %xmm0, %xmm0
540; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4],xmm0[5,6,7]
541; SSE41-NEXT: retq
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000542;
543; AVX-LABEL: extract0_i16_zext_insert1_i64_undef:
544; AVX: # %bb.0:
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000545; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000546; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
547; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4],xmm1[5,6,7]
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000548; AVX-NEXT: retq
549 %e = extractelement <8 x i16> %x, i32 0
550 %z = zext i16 %e to i64
551 %r = insertelement <2 x i64> undef, i64 %z, i32 1
552 ret <2 x i64> %r
553}
554
555define <2 x i64> @extract0_i16_zext_insert1_i64_zero(<8 x i16> %x) {
556; SSE-LABEL: extract0_i16_zext_insert1_i64_zero:
557; SSE: # %bb.0:
558; SSE-NEXT: pextrw $0, %xmm0, %eax
559; SSE-NEXT: movq %rax, %xmm0
560; SSE-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
561; SSE-NEXT: retq
562;
563; AVX-LABEL: extract0_i16_zext_insert1_i64_zero:
564; AVX: # %bb.0:
565; AVX-NEXT: vpextrw $0, %xmm0, %eax
566; AVX-NEXT: vmovq %rax, %xmm0
567; AVX-NEXT: vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
568; AVX-NEXT: retq
569 %e = extractelement <8 x i16> %x, i32 0
570 %z = zext i16 %e to i64
571 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1
572 ret <2 x i64> %r
573}
574
575define <2 x i64> @extract1_i16_zext_insert1_i64_undef(<8 x i16> %x) {
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000576; SSE2-LABEL: extract1_i16_zext_insert1_i64_undef:
577; SSE2: # %bb.0:
578; SSE2-NEXT: pxor %xmm1, %xmm1
579; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
580; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
581; SSE2-NEXT: retq
582;
583; SSE41-LABEL: extract1_i16_zext_insert1_i64_undef:
584; SSE41: # %bb.0:
585; SSE41-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
586; SSE41-NEXT: retq
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000587;
588; AVX-LABEL: extract1_i16_zext_insert1_i64_undef:
589; AVX: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000590; AVX-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000591; AVX-NEXT: retq
592 %e = extractelement <8 x i16> %x, i32 1
593 %z = zext i16 %e to i64
594 %r = insertelement <2 x i64> undef, i64 %z, i32 1
595 ret <2 x i64> %r
596}
597
598define <2 x i64> @extract1_i16_zext_insert1_i64_zero(<8 x i16> %x) {
599; SSE-LABEL: extract1_i16_zext_insert1_i64_zero:
600; SSE: # %bb.0:
601; SSE-NEXT: pextrw $1, %xmm0, %eax
602; SSE-NEXT: movq %rax, %xmm0
603; SSE-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
604; SSE-NEXT: retq
605;
606; AVX-LABEL: extract1_i16_zext_insert1_i64_zero:
607; AVX: # %bb.0:
608; AVX-NEXT: vpextrw $1, %xmm0, %eax
609; AVX-NEXT: vmovq %rax, %xmm0
610; AVX-NEXT: vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
611; AVX-NEXT: retq
612 %e = extractelement <8 x i16> %x, i32 1
613 %z = zext i16 %e to i64
614 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1
615 ret <2 x i64> %r
616}
617
618define <2 x i64> @extract2_i16_zext_insert1_i64_undef(<8 x i16> %x) {
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000619; SSE2-LABEL: extract2_i16_zext_insert1_i64_undef:
620; SSE2: # %bb.0:
621; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
622; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
623; SSE2-NEXT: retq
624;
625; SSE41-LABEL: extract2_i16_zext_insert1_i64_undef:
626; SSE41: # %bb.0:
627; SSE41-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero
628; SSE41-NEXT: pxor %xmm0, %xmm0
629; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4],xmm0[5,6,7]
630; SSE41-NEXT: retq
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000631;
632; AVX-LABEL: extract2_i16_zext_insert1_i64_undef:
633; AVX: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000634; AVX-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
635; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
636; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4],xmm1[5,6,7]
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000637; AVX-NEXT: retq
638 %e = extractelement <8 x i16> %x, i32 2
639 %z = zext i16 %e to i64
640 %r = insertelement <2 x i64> undef, i64 %z, i32 1
641 ret <2 x i64> %r
642}
643
644define <2 x i64> @extract2_i16_zext_insert1_i64_zero(<8 x i16> %x) {
645; SSE-LABEL: extract2_i16_zext_insert1_i64_zero:
646; SSE: # %bb.0:
647; SSE-NEXT: pextrw $2, %xmm0, %eax
648; SSE-NEXT: movq %rax, %xmm0
649; SSE-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
650; SSE-NEXT: retq
651;
652; AVX-LABEL: extract2_i16_zext_insert1_i64_zero:
653; AVX: # %bb.0:
654; AVX-NEXT: vpextrw $2, %xmm0, %eax
655; AVX-NEXT: vmovq %rax, %xmm0
656; AVX-NEXT: vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
657; AVX-NEXT: retq
658 %e = extractelement <8 x i16> %x, i32 2
659 %z = zext i16 %e to i64
660 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1
661 ret <2 x i64> %r
662}
663
664define <2 x i64> @extract3_i16_zext_insert1_i64_undef(<8 x i16> %x) {
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000665; SSE2-LABEL: extract3_i16_zext_insert1_i64_undef:
666; SSE2: # %bb.0:
667; SSE2-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
668; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
669; SSE2-NEXT: retq
670;
671; SSE41-LABEL: extract3_i16_zext_insert1_i64_undef:
672; SSE41: # %bb.0:
673; SSE41-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
674; SSE41-NEXT: pxor %xmm1, %xmm1
675; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4],xmm1[5,6,7]
676; SSE41-NEXT: retq
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000677;
678; AVX-LABEL: extract3_i16_zext_insert1_i64_undef:
679; AVX: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000680; AVX-NEXT: vpslldq {{.*#+}} xmm0 = zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
681; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
682; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4],xmm1[5,6,7]
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000683; AVX-NEXT: retq
684 %e = extractelement <8 x i16> %x, i32 3
685 %z = zext i16 %e to i64
686 %r = insertelement <2 x i64> undef, i64 %z, i32 1
687 ret <2 x i64> %r
688}
689
690define <2 x i64> @extract3_i16_zext_insert1_i64_zero(<8 x i16> %x) {
691; SSE-LABEL: extract3_i16_zext_insert1_i64_zero:
692; SSE: # %bb.0:
693; SSE-NEXT: pextrw $3, %xmm0, %eax
694; SSE-NEXT: movq %rax, %xmm0
695; SSE-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
696; SSE-NEXT: retq
697;
698; AVX-LABEL: extract3_i16_zext_insert1_i64_zero:
699; AVX: # %bb.0:
700; AVX-NEXT: vpextrw $3, %xmm0, %eax
701; AVX-NEXT: vmovq %rax, %xmm0
702; AVX-NEXT: vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
703; AVX-NEXT: retq
704 %e = extractelement <8 x i16> %x, i32 3
705 %z = zext i16 %e to i64
706 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1
707 ret <2 x i64> %r
708}
709