blob: b3045800c64b4173f38195b40efe0781fe4dc382 [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:
Simon Pilgrimb8f08c82019-01-15 16:56:55 +0000407; SSE2-NEXT: psrld $16, %xmm0
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000408; SSE2-NEXT: pxor %xmm1, %xmm1
Simon Pilgrimb8f08c82019-01-15 16:56:55 +0000409; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
410; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000411; SSE2-NEXT: retq
412;
413; SSE41-LABEL: extract1_i16_zext_insert0_i64_undef:
414; SSE41: # %bb.0:
415; SSE41-NEXT: psrld $16, %xmm0
416; SSE41-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
417; SSE41-NEXT: retq
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000418;
419; AVX-LABEL: extract1_i16_zext_insert0_i64_undef:
420; AVX: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000421; AVX-NEXT: vpsrld $16, %xmm0, %xmm0
422; AVX-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000423; AVX-NEXT: retq
424 %e = extractelement <8 x i16> %x, i32 1
425 %z = zext i16 %e to i64
426 %r = insertelement <2 x i64> undef, i64 %z, i32 0
427 ret <2 x i64> %r
428}
429
430define <2 x i64> @extract1_i16_zext_insert0_i64_zero(<8 x i16> %x) {
431; SSE-LABEL: extract1_i16_zext_insert0_i64_zero:
432; SSE: # %bb.0:
433; SSE-NEXT: pextrw $1, %xmm0, %eax
434; SSE-NEXT: movq %rax, %xmm0
435; SSE-NEXT: retq
436;
437; AVX-LABEL: extract1_i16_zext_insert0_i64_zero:
438; AVX: # %bb.0:
439; AVX-NEXT: vpextrw $1, %xmm0, %eax
440; AVX-NEXT: vmovq %rax, %xmm0
441; AVX-NEXT: retq
442 %e = extractelement <8 x i16> %x, i32 1
443 %z = zext i16 %e to i64
444 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0
445 ret <2 x i64> %r
446}
447
448define <2 x i64> @extract2_i16_zext_insert0_i64_undef(<8 x i16> %x) {
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000449; SSE2-LABEL: extract2_i16_zext_insert0_i64_undef:
450; SSE2: # %bb.0:
Simon Pilgrimb8f08c82019-01-15 16:56:55 +0000451; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000452; SSE2-NEXT: pxor %xmm1, %xmm1
Simon Pilgrimb8f08c82019-01-15 16:56:55 +0000453; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
454; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000455; SSE2-NEXT: retq
456;
457; SSE41-LABEL: extract2_i16_zext_insert0_i64_undef:
458; SSE41: # %bb.0:
459; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
460; SSE41-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
461; SSE41-NEXT: retq
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000462;
463; AVX-LABEL: extract2_i16_zext_insert0_i64_undef:
464; AVX: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000465; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
466; AVX-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000467; AVX-NEXT: retq
468 %e = extractelement <8 x i16> %x, i32 2
469 %z = zext i16 %e to i64
470 %r = insertelement <2 x i64> undef, i64 %z, i32 0
471 ret <2 x i64> %r
472}
473
474define <2 x i64> @extract2_i16_zext_insert0_i64_zero(<8 x i16> %x) {
475; SSE-LABEL: extract2_i16_zext_insert0_i64_zero:
476; SSE: # %bb.0:
477; SSE-NEXT: pextrw $2, %xmm0, %eax
478; SSE-NEXT: movq %rax, %xmm0
479; SSE-NEXT: retq
480;
481; AVX-LABEL: extract2_i16_zext_insert0_i64_zero:
482; AVX: # %bb.0:
483; AVX-NEXT: vpextrw $2, %xmm0, %eax
484; AVX-NEXT: vmovq %rax, %xmm0
485; AVX-NEXT: retq
486 %e = extractelement <8 x i16> %x, i32 2
487 %z = zext i16 %e to i64
488 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0
489 ret <2 x i64> %r
490}
491
492define <2 x i64> @extract3_i16_zext_insert0_i64_undef(<8 x i16> %x) {
493; SSE-LABEL: extract3_i16_zext_insert0_i64_undef:
494; SSE: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000495; SSE-NEXT: psrlq $48, %xmm0
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000496; SSE-NEXT: retq
497;
498; AVX-LABEL: extract3_i16_zext_insert0_i64_undef:
499; AVX: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000500; AVX-NEXT: vpsrlq $48, %xmm0, %xmm0
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000501; AVX-NEXT: retq
502 %e = extractelement <8 x i16> %x, i32 3
503 %z = zext i16 %e to i64
504 %r = insertelement <2 x i64> undef, i64 %z, i32 0
505 ret <2 x i64> %r
506}
507
508define <2 x i64> @extract3_i16_zext_insert0_i64_zero(<8 x i16> %x) {
509; SSE-LABEL: extract3_i16_zext_insert0_i64_zero:
510; SSE: # %bb.0:
511; SSE-NEXT: pextrw $3, %xmm0, %eax
512; SSE-NEXT: movq %rax, %xmm0
513; SSE-NEXT: retq
514;
515; AVX-LABEL: extract3_i16_zext_insert0_i64_zero:
516; AVX: # %bb.0:
517; AVX-NEXT: vpextrw $3, %xmm0, %eax
518; AVX-NEXT: vmovq %rax, %xmm0
519; AVX-NEXT: retq
520 %e = extractelement <8 x i16> %x, i32 3
521 %z = zext i16 %e to i64
522 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0
523 ret <2 x i64> %r
524}
525
526define <2 x i64> @extract0_i16_zext_insert1_i64_undef(<8 x i16> %x) {
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000527; SSE2-LABEL: extract0_i16_zext_insert1_i64_undef:
528; SSE2: # %bb.0:
529; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
530; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
531; SSE2-NEXT: retq
532;
533; SSE41-LABEL: extract0_i16_zext_insert1_i64_undef:
534; SSE41: # %bb.0:
535; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]
536; SSE41-NEXT: pxor %xmm0, %xmm0
537; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4],xmm0[5,6,7]
538; SSE41-NEXT: retq
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000539;
540; AVX-LABEL: extract0_i16_zext_insert1_i64_undef:
541; AVX: # %bb.0:
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000542; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000543; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
544; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4],xmm1[5,6,7]
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000545; AVX-NEXT: retq
546 %e = extractelement <8 x i16> %x, i32 0
547 %z = zext i16 %e to i64
548 %r = insertelement <2 x i64> undef, i64 %z, i32 1
549 ret <2 x i64> %r
550}
551
552define <2 x i64> @extract0_i16_zext_insert1_i64_zero(<8 x i16> %x) {
553; SSE-LABEL: extract0_i16_zext_insert1_i64_zero:
554; SSE: # %bb.0:
555; SSE-NEXT: pextrw $0, %xmm0, %eax
556; SSE-NEXT: movq %rax, %xmm0
557; SSE-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
558; SSE-NEXT: retq
559;
560; AVX-LABEL: extract0_i16_zext_insert1_i64_zero:
561; AVX: # %bb.0:
562; AVX-NEXT: vpextrw $0, %xmm0, %eax
563; AVX-NEXT: vmovq %rax, %xmm0
564; AVX-NEXT: vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
565; AVX-NEXT: retq
566 %e = extractelement <8 x i16> %x, i32 0
567 %z = zext i16 %e to i64
568 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1
569 ret <2 x i64> %r
570}
571
572define <2 x i64> @extract1_i16_zext_insert1_i64_undef(<8 x i16> %x) {
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000573; SSE2-LABEL: extract1_i16_zext_insert1_i64_undef:
574; SSE2: # %bb.0:
575; SSE2-NEXT: pxor %xmm1, %xmm1
576; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
577; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
578; SSE2-NEXT: retq
579;
580; SSE41-LABEL: extract1_i16_zext_insert1_i64_undef:
581; SSE41: # %bb.0:
582; SSE41-NEXT: pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
583; SSE41-NEXT: retq
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000584;
585; AVX-LABEL: extract1_i16_zext_insert1_i64_undef:
586; AVX: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000587; AVX-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000588; AVX-NEXT: retq
589 %e = extractelement <8 x i16> %x, i32 1
590 %z = zext i16 %e to i64
591 %r = insertelement <2 x i64> undef, i64 %z, i32 1
592 ret <2 x i64> %r
593}
594
595define <2 x i64> @extract1_i16_zext_insert1_i64_zero(<8 x i16> %x) {
596; SSE-LABEL: extract1_i16_zext_insert1_i64_zero:
597; SSE: # %bb.0:
598; SSE-NEXT: pextrw $1, %xmm0, %eax
599; SSE-NEXT: movq %rax, %xmm0
600; SSE-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
601; SSE-NEXT: retq
602;
603; AVX-LABEL: extract1_i16_zext_insert1_i64_zero:
604; AVX: # %bb.0:
605; AVX-NEXT: vpextrw $1, %xmm0, %eax
606; AVX-NEXT: vmovq %rax, %xmm0
607; AVX-NEXT: vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
608; AVX-NEXT: retq
609 %e = extractelement <8 x i16> %x, i32 1
610 %z = zext i16 %e to i64
611 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1
612 ret <2 x i64> %r
613}
614
615define <2 x i64> @extract2_i16_zext_insert1_i64_undef(<8 x i16> %x) {
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000616; SSE2-LABEL: extract2_i16_zext_insert1_i64_undef:
617; SSE2: # %bb.0:
618; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
619; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
620; SSE2-NEXT: retq
621;
622; SSE41-LABEL: extract2_i16_zext_insert1_i64_undef:
623; SSE41: # %bb.0:
624; SSE41-NEXT: pmovzxdq {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero
625; SSE41-NEXT: pxor %xmm0, %xmm0
626; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4],xmm0[5,6,7]
627; SSE41-NEXT: retq
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000628;
629; AVX-LABEL: extract2_i16_zext_insert1_i64_undef:
630; AVX: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000631; AVX-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
632; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
633; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4],xmm1[5,6,7]
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000634; AVX-NEXT: retq
635 %e = extractelement <8 x i16> %x, i32 2
636 %z = zext i16 %e to i64
637 %r = insertelement <2 x i64> undef, i64 %z, i32 1
638 ret <2 x i64> %r
639}
640
641define <2 x i64> @extract2_i16_zext_insert1_i64_zero(<8 x i16> %x) {
642; SSE-LABEL: extract2_i16_zext_insert1_i64_zero:
643; SSE: # %bb.0:
644; SSE-NEXT: pextrw $2, %xmm0, %eax
645; SSE-NEXT: movq %rax, %xmm0
646; SSE-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
647; SSE-NEXT: retq
648;
649; AVX-LABEL: extract2_i16_zext_insert1_i64_zero:
650; AVX: # %bb.0:
651; AVX-NEXT: vpextrw $2, %xmm0, %eax
652; AVX-NEXT: vmovq %rax, %xmm0
653; AVX-NEXT: vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
654; AVX-NEXT: retq
655 %e = extractelement <8 x i16> %x, i32 2
656 %z = zext i16 %e to i64
657 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1
658 ret <2 x i64> %r
659}
660
661define <2 x i64> @extract3_i16_zext_insert1_i64_undef(<8 x i16> %x) {
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000662; SSE2-LABEL: extract3_i16_zext_insert1_i64_undef:
663; SSE2: # %bb.0:
664; SSE2-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
665; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
666; SSE2-NEXT: retq
667;
668; SSE41-LABEL: extract3_i16_zext_insert1_i64_undef:
669; SSE41: # %bb.0:
670; SSE41-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
671; SSE41-NEXT: pxor %xmm1, %xmm1
672; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4],xmm1[5,6,7]
673; SSE41-NEXT: retq
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000674;
675; AVX-LABEL: extract3_i16_zext_insert1_i64_undef:
676; AVX: # %bb.0:
Sanjay Patelfad5bda2019-01-15 16:11:05 +0000677; AVX-NEXT: vpslldq {{.*#+}} xmm0 = zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
678; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
679; AVX-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4],xmm1[5,6,7]
Sanjay Patel4e71ff22019-01-03 17:55:32 +0000680; AVX-NEXT: retq
681 %e = extractelement <8 x i16> %x, i32 3
682 %z = zext i16 %e to i64
683 %r = insertelement <2 x i64> undef, i64 %z, i32 1
684 ret <2 x i64> %r
685}
686
687define <2 x i64> @extract3_i16_zext_insert1_i64_zero(<8 x i16> %x) {
688; SSE-LABEL: extract3_i16_zext_insert1_i64_zero:
689; SSE: # %bb.0:
690; SSE-NEXT: pextrw $3, %xmm0, %eax
691; SSE-NEXT: movq %rax, %xmm0
692; SSE-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
693; SSE-NEXT: retq
694;
695; AVX-LABEL: extract3_i16_zext_insert1_i64_zero:
696; AVX: # %bb.0:
697; AVX-NEXT: vpextrw $3, %xmm0, %eax
698; AVX-NEXT: vmovq %rax, %xmm0
699; AVX-NEXT: vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
700; AVX-NEXT: retq
701 %e = extractelement <8 x i16> %x, i32 3
702 %z = zext i16 %e to i64
703 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1
704 ret <2 x i64> %r
705}
706