[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / X86 / buildvec-extract.ll
blob4826b959e39b14bcb5d5036eeafb6867889e5755
1 ; 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=SSE,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41
4 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx    | FileCheck %s --check-prefix=AVX
6 define <2 x i64> @extract0_i32_zext_insert0_i64_undef(<4 x i32> %x) {
7 ; 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
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
18 ; AVX-LABEL: extract0_i32_zext_insert0_i64_undef:
19 ; AVX:       # %bb.0:
20 ; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
21 ; 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
28 define <2 x i64> @extract0_i32_zext_insert0_i64_zero(<4 x i32> %x) {
29 ; SSE2-LABEL: extract0_i32_zext_insert0_i64_zero:
30 ; SSE2:       # %bb.0:
31 ; SSE2-NEXT:    xorps %xmm1, %xmm1
32 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
33 ; SSE2-NEXT:    movaps %xmm1, %xmm0
34 ; SSE2-NEXT:    retq
36 ; SSE41-LABEL: extract0_i32_zext_insert0_i64_zero:
37 ; SSE41:       # %bb.0:
38 ; SSE41-NEXT:    xorps %xmm1, %xmm1
39 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
40 ; SSE41-NEXT:    retq
42 ; AVX-LABEL: extract0_i32_zext_insert0_i64_zero:
43 ; AVX:       # %bb.0:
44 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
45 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
46 ; AVX-NEXT:    retq
47   %e = extractelement <4 x i32> %x, i32 0
48   %z = zext i32 %e to i64
49   %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0
50   ret <2 x i64> %r
53 define <2 x i64> @extract1_i32_zext_insert0_i64_undef(<4 x i32> %x) {
54 ; SSE-LABEL: extract1_i32_zext_insert0_i64_undef:
55 ; SSE:       # %bb.0:
56 ; SSE-NEXT:    psrlq $32, %xmm0
57 ; SSE-NEXT:    retq
59 ; AVX-LABEL: extract1_i32_zext_insert0_i64_undef:
60 ; AVX:       # %bb.0:
61 ; AVX-NEXT:    vpsrlq $32, %xmm0, %xmm0
62 ; AVX-NEXT:    retq
63   %e = extractelement <4 x i32> %x, i32 1
64   %z = zext i32 %e to i64
65   %r = insertelement <2 x i64> undef, i64 %z, i32 0
66   ret <2 x i64> %r
69 define <2 x i64> @extract1_i32_zext_insert0_i64_zero(<4 x i32> %x) {
70 ; SSE2-LABEL: extract1_i32_zext_insert0_i64_zero:
71 ; SSE2:       # %bb.0:
72 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
73 ; SSE2-NEXT:    pxor %xmm0, %xmm0
74 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
75 ; SSE2-NEXT:    retq
77 ; SSE41-LABEL: extract1_i32_zext_insert0_i64_zero:
78 ; SSE41:       # %bb.0:
79 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
80 ; SSE41-NEXT:    pxor %xmm0, %xmm0
81 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7]
82 ; SSE41-NEXT:    retq
84 ; AVX-LABEL: extract1_i32_zext_insert0_i64_zero:
85 ; AVX:       # %bb.0:
86 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[1,1,1,1]
87 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
88 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
89 ; AVX-NEXT:    retq
90   %e = extractelement <4 x i32> %x, i32 1
91   %z = zext i32 %e to i64
92   %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0
93   ret <2 x i64> %r
96 define <2 x i64> @extract2_i32_zext_insert0_i64_undef(<4 x i32> %x) {
97 ; SSE-LABEL: extract2_i32_zext_insert0_i64_undef:
98 ; SSE:       # %bb.0:
99 ; SSE-NEXT:    xorps %xmm1, %xmm1
100 ; SSE-NEXT:    unpckhps {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
101 ; SSE-NEXT:    retq
103 ; AVX-LABEL: extract2_i32_zext_insert0_i64_undef:
104 ; AVX:       # %bb.0:
105 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
106 ; AVX-NEXT:    vunpckhps {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
107 ; AVX-NEXT:    retq
108   %e = extractelement <4 x i32> %x, i32 2
109   %z = zext i32 %e to i64
110   %r = insertelement <2 x i64> undef, i64 %z, i32 0
111   ret <2 x i64> %r
114 define <2 x i64> @extract2_i32_zext_insert0_i64_zero(<4 x i32> %x) {
115 ; SSE2-LABEL: extract2_i32_zext_insert0_i64_zero:
116 ; SSE2:       # %bb.0:
117 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
118 ; SSE2-NEXT:    pxor %xmm0, %xmm0
119 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
120 ; SSE2-NEXT:    retq
122 ; SSE41-LABEL: extract2_i32_zext_insert0_i64_zero:
123 ; SSE41:       # %bb.0:
124 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
125 ; SSE41-NEXT:    pxor %xmm0, %xmm0
126 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7]
127 ; SSE41-NEXT:    retq
129 ; AVX-LABEL: extract2_i32_zext_insert0_i64_zero:
130 ; AVX:       # %bb.0:
131 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[2,3,2,3]
132 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
133 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
134 ; AVX-NEXT:    retq
135   %e = extractelement <4 x i32> %x, i32 2
136   %z = zext i32 %e to i64
137   %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0
138   ret <2 x i64> %r
141 define <2 x i64> @extract3_i32_zext_insert0_i64_undef(<4 x i32> %x) {
142 ; SSE-LABEL: extract3_i32_zext_insert0_i64_undef:
143 ; SSE:       # %bb.0:
144 ; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
145 ; SSE-NEXT:    retq
147 ; AVX-LABEL: extract3_i32_zext_insert0_i64_undef:
148 ; AVX:       # %bb.0:
149 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
150 ; AVX-NEXT:    retq
151   %e = extractelement <4 x i32> %x, i32 3
152   %z = zext i32 %e to i64
153   %r = insertelement <2 x i64> undef, i64 %z, i32 0
154   ret <2 x i64> %r
157 define <2 x i64> @extract3_i32_zext_insert0_i64_zero(<4 x i32> %x) {
158 ; SSE-LABEL: extract3_i32_zext_insert0_i64_zero:
159 ; SSE:       # %bb.0:
160 ; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
161 ; SSE-NEXT:    retq
163 ; AVX-LABEL: extract3_i32_zext_insert0_i64_zero:
164 ; AVX:       # %bb.0:
165 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
166 ; AVX-NEXT:    retq
167   %e = extractelement <4 x i32> %x, i32 3
168   %z = zext i32 %e to i64
169   %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0
170   ret <2 x i64> %r
173 define <2 x i64> @extract0_i32_zext_insert1_i64_undef(<4 x i32> %x) {
174 ; SSE2-LABEL: extract0_i32_zext_insert1_i64_undef:
175 ; SSE2:       # %bb.0:
176 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]
177 ; SSE2-NEXT:    pxor %xmm1, %xmm1
178 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
179 ; SSE2-NEXT:    retq
181 ; SSE41-LABEL: extract0_i32_zext_insert1_i64_undef:
182 ; SSE41:       # %bb.0:
183 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]
184 ; SSE41-NEXT:    pxor %xmm0, %xmm0
185 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3,4,5],xmm0[6,7]
186 ; SSE41-NEXT:    retq
188 ; AVX-LABEL: extract0_i32_zext_insert1_i64_undef:
189 ; AVX:       # %bb.0:
190 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,1,0,1]
191 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
192 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3]
193 ; AVX-NEXT:    retq
194   %e = extractelement <4 x i32> %x, i32 0
195   %z = zext i32 %e to i64
196   %r = insertelement <2 x i64> undef, i64 %z, i32 1
197   ret <2 x i64> %r
200 define <2 x i64> @extract0_i32_zext_insert1_i64_zero(<4 x i32> %x) {
201 ; SSE-LABEL: extract0_i32_zext_insert1_i64_zero:
202 ; SSE:       # %bb.0:
203 ; SSE-NEXT:    movd %xmm0, %eax
204 ; SSE-NEXT:    movq %rax, %xmm0
205 ; SSE-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
206 ; SSE-NEXT:    retq
208 ; AVX-LABEL: extract0_i32_zext_insert1_i64_zero:
209 ; AVX:       # %bb.0:
210 ; AVX-NEXT:    vmovd %xmm0, %eax
211 ; AVX-NEXT:    vmovq %rax, %xmm0
212 ; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
213 ; AVX-NEXT:    retq
214   %e = extractelement <4 x i32> %x, i32 0
215   %z = zext i32 %e to i64
216   %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1
217   ret <2 x i64> %r
220 define <2 x i64> @extract1_i32_zext_insert1_i64_undef(<4 x i32> %x) {
221 ; SSE2-LABEL: extract1_i32_zext_insert1_i64_undef:
222 ; SSE2:       # %bb.0:
223 ; SSE2-NEXT:    xorps %xmm1, %xmm1
224 ; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
225 ; SSE2-NEXT:    retq
227 ; SSE41-LABEL: extract1_i32_zext_insert1_i64_undef:
228 ; SSE41:       # %bb.0:
229 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
230 ; SSE41-NEXT:    retq
232 ; AVX-LABEL: extract1_i32_zext_insert1_i64_undef:
233 ; AVX:       # %bb.0:
234 ; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
235 ; AVX-NEXT:    retq
236   %e = extractelement <4 x i32> %x, i32 1
237   %z = zext i32 %e to i64
238   %r = insertelement <2 x i64> undef, i64 %z, i32 1
239   ret <2 x i64> %r
242 define <2 x i64> @extract1_i32_zext_insert1_i64_zero(<4 x i32> %x) {
243 ; SSE2-LABEL: extract1_i32_zext_insert1_i64_zero:
244 ; SSE2:       # %bb.0:
245 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
246 ; SSE2-NEXT:    movd %xmm0, %eax
247 ; SSE2-NEXT:    movq %rax, %xmm0
248 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
249 ; SSE2-NEXT:    retq
251 ; SSE41-LABEL: extract1_i32_zext_insert1_i64_zero:
252 ; SSE41:       # %bb.0:
253 ; SSE41-NEXT:    extractps $1, %xmm0, %eax
254 ; SSE41-NEXT:    movq %rax, %xmm0
255 ; SSE41-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
256 ; SSE41-NEXT:    retq
258 ; AVX-LABEL: extract1_i32_zext_insert1_i64_zero:
259 ; AVX:       # %bb.0:
260 ; AVX-NEXT:    vextractps $1, %xmm0, %eax
261 ; AVX-NEXT:    vmovq %rax, %xmm0
262 ; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
263 ; AVX-NEXT:    retq
264   %e = extractelement <4 x i32> %x, i32 1
265   %z = zext i32 %e to i64
266   %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1
267   ret <2 x i64> %r
270 define <2 x i64> @extract2_i32_zext_insert1_i64_undef(<4 x i32> %x) {
271 ; SSE2-LABEL: extract2_i32_zext_insert1_i64_undef:
272 ; SSE2:       # %bb.0:
273 ; SSE2-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
274 ; SSE2-NEXT:    retq
276 ; SSE41-LABEL: extract2_i32_zext_insert1_i64_undef:
277 ; SSE41:       # %bb.0:
278 ; SSE41-NEXT:    xorps %xmm1, %xmm1
279 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3]
280 ; SSE41-NEXT:    retq
282 ; AVX-LABEL: extract2_i32_zext_insert1_i64_undef:
283 ; AVX:       # %bb.0:
284 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
285 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[3]
286 ; AVX-NEXT:    retq
287   %e = extractelement <4 x i32> %x, i32 2
288   %z = zext i32 %e to i64
289   %r = insertelement <2 x i64> undef, i64 %z, i32 1
290   ret <2 x i64> %r
293 define <2 x i64> @extract2_i32_zext_insert1_i64_zero(<4 x i32> %x) {
294 ; SSE2-LABEL: extract2_i32_zext_insert1_i64_zero:
295 ; SSE2:       # %bb.0:
296 ; SSE2-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
297 ; SSE2-NEXT:    retq
299 ; SSE41-LABEL: extract2_i32_zext_insert1_i64_zero:
300 ; SSE41:       # %bb.0:
301 ; SSE41-NEXT:    xorps %xmm1, %xmm1
302 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm1[0,1],xmm0[2],xmm1[3]
303 ; SSE41-NEXT:    retq
305 ; AVX-LABEL: extract2_i32_zext_insert1_i64_zero:
306 ; AVX:       # %bb.0:
307 ; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
308 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0,1],xmm0[2],xmm1[3]
309 ; AVX-NEXT:    retq
310   %e = extractelement <4 x i32> %x, i32 2
311   %z = zext i32 %e to i64
312   %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1
313   ret <2 x i64> %r
316 define <2 x i64> @extract3_i32_zext_insert1_i64_undef(<4 x i32> %x) {
317 ; SSE-LABEL: extract3_i32_zext_insert1_i64_undef:
318 ; SSE:       # %bb.0:
319 ; SSE-NEXT:    psrlq $32, %xmm0
320 ; SSE-NEXT:    retq
322 ; AVX-LABEL: extract3_i32_zext_insert1_i64_undef:
323 ; AVX:       # %bb.0:
324 ; AVX-NEXT:    vpsrlq $32, %xmm0, %xmm0
325 ; AVX-NEXT:    retq
326   %e = extractelement <4 x i32> %x, i32 3
327   %z = zext i32 %e to i64
328   %r = insertelement <2 x i64> undef, i64 %z, i32 1
329   ret <2 x i64> %r
332 define <2 x i64> @extract3_i32_zext_insert1_i64_zero(<4 x i32> %x) {
333 ; SSE2-LABEL: extract3_i32_zext_insert1_i64_zero:
334 ; SSE2:       # %bb.0:
335 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
336 ; SSE2-NEXT:    movd %xmm0, %eax
337 ; SSE2-NEXT:    movq %rax, %xmm0
338 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
339 ; SSE2-NEXT:    retq
341 ; SSE41-LABEL: extract3_i32_zext_insert1_i64_zero:
342 ; SSE41:       # %bb.0:
343 ; SSE41-NEXT:    extractps $3, %xmm0, %eax
344 ; SSE41-NEXT:    movq %rax, %xmm0
345 ; SSE41-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
346 ; SSE41-NEXT:    retq
348 ; AVX-LABEL: extract3_i32_zext_insert1_i64_zero:
349 ; AVX:       # %bb.0:
350 ; AVX-NEXT:    vextractps $3, %xmm0, %eax
351 ; AVX-NEXT:    vmovq %rax, %xmm0
352 ; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
353 ; AVX-NEXT:    retq
354   %e = extractelement <4 x i32> %x, i32 3
355   %z = zext i32 %e to i64
356   %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1
357   ret <2 x i64> %r
360 define <2 x i64> @extract0_i16_zext_insert0_i64_undef(<8 x i16> %x) {
361 ; SSE2-LABEL: extract0_i16_zext_insert0_i64_undef:
362 ; SSE2:       # %bb.0:
363 ; SSE2-NEXT:    pxor %xmm1, %xmm1
364 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
365 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
366 ; SSE2-NEXT:    retq
368 ; SSE41-LABEL: extract0_i16_zext_insert0_i64_undef:
369 ; SSE41:       # %bb.0:
370 ; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
371 ; SSE41-NEXT:    retq
373 ; AVX-LABEL: extract0_i16_zext_insert0_i64_undef:
374 ; AVX:       # %bb.0:
375 ; AVX-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
376 ; AVX-NEXT:    retq
377   %e = extractelement <8 x i16> %x, i32 0
378   %z = zext i16 %e to i64
379   %r = insertelement <2 x i64> undef, i64 %z, i32 0
380   ret <2 x i64> %r
383 define <2 x i64> @extract0_i16_zext_insert0_i64_zero(<8 x i16> %x) {
384 ; SSE2-LABEL: extract0_i16_zext_insert0_i64_zero:
385 ; SSE2:       # %bb.0:
386 ; SSE2-NEXT:    pextrw $0, %xmm0, %eax
387 ; SSE2-NEXT:    movd %eax, %xmm0
388 ; SSE2-NEXT:    retq
390 ; SSE41-LABEL: extract0_i16_zext_insert0_i64_zero:
391 ; SSE41:       # %bb.0:
392 ; SSE41-NEXT:    pxor %xmm1, %xmm1
393 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]
394 ; SSE41-NEXT:    retq
396 ; AVX-LABEL: extract0_i16_zext_insert0_i64_zero:
397 ; AVX:       # %bb.0:
398 ; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
399 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]
400 ; AVX-NEXT:    retq
401   %e = extractelement <8 x i16> %x, i32 0
402   %z = zext i16 %e to i64
403   %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0
404   ret <2 x i64> %r
407 define <2 x i64> @extract1_i16_zext_insert0_i64_undef(<8 x i16> %x) {
408 ; SSE-LABEL: extract1_i16_zext_insert0_i64_undef:
409 ; SSE:       # %bb.0:
410 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
411 ; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
412 ; SSE-NEXT:    retq
414 ; AVX-LABEL: extract1_i16_zext_insert0_i64_undef:
415 ; AVX:       # %bb.0:
416 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
417 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
418 ; AVX-NEXT:    retq
419   %e = extractelement <8 x i16> %x, i32 1
420   %z = zext i16 %e to i64
421   %r = insertelement <2 x i64> undef, i64 %z, i32 0
422   ret <2 x i64> %r
425 define <2 x i64> @extract1_i16_zext_insert0_i64_zero(<8 x i16> %x) {
426 ; SSE-LABEL: extract1_i16_zext_insert0_i64_zero:
427 ; SSE:       # %bb.0:
428 ; SSE-NEXT:    pextrw $1, %xmm0, %eax
429 ; SSE-NEXT:    movd %eax, %xmm0
430 ; SSE-NEXT:    retq
432 ; AVX-LABEL: extract1_i16_zext_insert0_i64_zero:
433 ; AVX:       # %bb.0:
434 ; AVX-NEXT:    vpextrw $1, %xmm0, %eax
435 ; AVX-NEXT:    vmovd %eax, %xmm0
436 ; AVX-NEXT:    retq
437   %e = extractelement <8 x i16> %x, i32 1
438   %z = zext i16 %e to i64
439   %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0
440   ret <2 x i64> %r
443 define <2 x i64> @extract2_i16_zext_insert0_i64_undef(<8 x i16> %x) {
444 ; SSE-LABEL: extract2_i16_zext_insert0_i64_undef:
445 ; SSE:       # %bb.0:
446 ; SSE-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5]
447 ; SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
448 ; SSE-NEXT:    retq
450 ; AVX-LABEL: extract2_i16_zext_insert0_i64_undef:
451 ; AVX:       # %bb.0:
452 ; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5]
453 ; AVX-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
454 ; AVX-NEXT:    retq
455   %e = extractelement <8 x i16> %x, i32 2
456   %z = zext i16 %e to i64
457   %r = insertelement <2 x i64> undef, i64 %z, i32 0
458   ret <2 x i64> %r
461 define <2 x i64> @extract2_i16_zext_insert0_i64_zero(<8 x i16> %x) {
462 ; SSE-LABEL: extract2_i16_zext_insert0_i64_zero:
463 ; SSE:       # %bb.0:
464 ; SSE-NEXT:    pextrw $2, %xmm0, %eax
465 ; SSE-NEXT:    movd %eax, %xmm0
466 ; SSE-NEXT:    retq
468 ; AVX-LABEL: extract2_i16_zext_insert0_i64_zero:
469 ; AVX:       # %bb.0:
470 ; AVX-NEXT:    vpextrw $2, %xmm0, %eax
471 ; AVX-NEXT:    vmovd %eax, %xmm0
472 ; AVX-NEXT:    retq
473   %e = extractelement <8 x i16> %x, i32 2
474   %z = zext i16 %e to i64
475   %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0
476   ret <2 x i64> %r
479 define <2 x i64> @extract3_i16_zext_insert0_i64_undef(<8 x i16> %x) {
480 ; SSE-LABEL: extract3_i16_zext_insert0_i64_undef:
481 ; SSE:       # %bb.0:
482 ; SSE-NEXT:    psrlq $48, %xmm0
483 ; SSE-NEXT:    retq
485 ; AVX-LABEL: extract3_i16_zext_insert0_i64_undef:
486 ; AVX:       # %bb.0:
487 ; AVX-NEXT:    vpsrlq $48, %xmm0, %xmm0
488 ; AVX-NEXT:    retq
489   %e = extractelement <8 x i16> %x, i32 3
490   %z = zext i16 %e to i64
491   %r = insertelement <2 x i64> undef, i64 %z, i32 0
492   ret <2 x i64> %r
495 define <2 x i64> @extract3_i16_zext_insert0_i64_zero(<8 x i16> %x) {
496 ; SSE-LABEL: extract3_i16_zext_insert0_i64_zero:
497 ; SSE:       # %bb.0:
498 ; SSE-NEXT:    pextrw $3, %xmm0, %eax
499 ; SSE-NEXT:    movd %eax, %xmm0
500 ; SSE-NEXT:    retq
502 ; AVX-LABEL: extract3_i16_zext_insert0_i64_zero:
503 ; AVX:       # %bb.0:
504 ; AVX-NEXT:    vpextrw $3, %xmm0, %eax
505 ; AVX-NEXT:    vmovd %eax, %xmm0
506 ; AVX-NEXT:    retq
507   %e = extractelement <8 x i16> %x, i32 3
508   %z = zext i16 %e to i64
509   %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0
510   ret <2 x i64> %r
513 define <2 x i64> @extract0_i16_zext_insert1_i64_undef(<8 x i16> %x) {
514 ; SSE2-LABEL: extract0_i16_zext_insert1_i64_undef:
515 ; SSE2:       # %bb.0:
516 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1]
517 ; SSE2-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
518 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
519 ; SSE2-NEXT:    retq
521 ; SSE41-LABEL: extract0_i16_zext_insert1_i64_undef:
522 ; SSE41:       # %bb.0:
523 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]
524 ; SSE41-NEXT:    pxor %xmm0, %xmm0
525 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4],xmm0[5,6,7]
526 ; SSE41-NEXT:    retq
528 ; AVX-LABEL: extract0_i16_zext_insert1_i64_undef:
529 ; AVX:       # %bb.0:
530 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
531 ; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
532 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4],xmm1[5,6,7]
533 ; AVX-NEXT:    retq
534   %e = extractelement <8 x i16> %x, i32 0
535   %z = zext i16 %e to i64
536   %r = insertelement <2 x i64> undef, i64 %z, i32 1
537   ret <2 x i64> %r
540 define <2 x i64> @extract0_i16_zext_insert1_i64_zero(<8 x i16> %x) {
541 ; SSE-LABEL: extract0_i16_zext_insert1_i64_zero:
542 ; SSE:       # %bb.0:
543 ; SSE-NEXT:    pextrw $0, %xmm0, %eax
544 ; SSE-NEXT:    movq %rax, %xmm0
545 ; SSE-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
546 ; SSE-NEXT:    retq
548 ; AVX-LABEL: extract0_i16_zext_insert1_i64_zero:
549 ; AVX:       # %bb.0:
550 ; AVX-NEXT:    vpextrw $0, %xmm0, %eax
551 ; AVX-NEXT:    vmovq %rax, %xmm0
552 ; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
553 ; AVX-NEXT:    retq
554   %e = extractelement <8 x i16> %x, i32 0
555   %z = zext i16 %e to i64
556   %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1
557   ret <2 x i64> %r
560 define <2 x i64> @extract1_i16_zext_insert1_i64_undef(<8 x i16> %x) {
561 ; SSE2-LABEL: extract1_i16_zext_insert1_i64_undef:
562 ; SSE2:       # %bb.0:
563 ; SSE2-NEXT:    pxor %xmm1, %xmm1
564 ; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
565 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
566 ; SSE2-NEXT:    retq
568 ; SSE41-LABEL: extract1_i16_zext_insert1_i64_undef:
569 ; SSE41:       # %bb.0:
570 ; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
571 ; SSE41-NEXT:    retq
573 ; AVX-LABEL: extract1_i16_zext_insert1_i64_undef:
574 ; AVX:       # %bb.0:
575 ; AVX-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
576 ; AVX-NEXT:    retq
577   %e = extractelement <8 x i16> %x, i32 1
578   %z = zext i16 %e to i64
579   %r = insertelement <2 x i64> undef, i64 %z, i32 1
580   ret <2 x i64> %r
583 define <2 x i64> @extract1_i16_zext_insert1_i64_zero(<8 x i16> %x) {
584 ; SSE-LABEL: extract1_i16_zext_insert1_i64_zero:
585 ; SSE:       # %bb.0:
586 ; SSE-NEXT:    pextrw $1, %xmm0, %eax
587 ; SSE-NEXT:    movq %rax, %xmm0
588 ; SSE-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
589 ; SSE-NEXT:    retq
591 ; AVX-LABEL: extract1_i16_zext_insert1_i64_zero:
592 ; AVX:       # %bb.0:
593 ; AVX-NEXT:    vpextrw $1, %xmm0, %eax
594 ; AVX-NEXT:    vmovq %rax, %xmm0
595 ; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
596 ; AVX-NEXT:    retq
597   %e = extractelement <8 x i16> %x, i32 1
598   %z = zext i16 %e to i64
599   %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1
600   ret <2 x i64> %r
603 define <2 x i64> @extract2_i16_zext_insert1_i64_undef(<8 x i16> %x) {
604 ; SSE2-LABEL: extract2_i16_zext_insert1_i64_undef:
605 ; SSE2:       # %bb.0:
606 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5]
607 ; SSE2-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
608 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
609 ; SSE2-NEXT:    retq
611 ; SSE41-LABEL: extract2_i16_zext_insert1_i64_undef:
612 ; SSE41:       # %bb.0:
613 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero
614 ; SSE41-NEXT:    pxor %xmm0, %xmm0
615 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4],xmm0[5,6,7]
616 ; SSE41-NEXT:    retq
618 ; AVX-LABEL: extract2_i16_zext_insert1_i64_undef:
619 ; AVX:       # %bb.0:
620 ; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
621 ; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
622 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4],xmm1[5,6,7]
623 ; AVX-NEXT:    retq
624   %e = extractelement <8 x i16> %x, i32 2
625   %z = zext i16 %e to i64
626   %r = insertelement <2 x i64> undef, i64 %z, i32 1
627   ret <2 x i64> %r
630 define <2 x i64> @extract2_i16_zext_insert1_i64_zero(<8 x i16> %x) {
631 ; SSE-LABEL: extract2_i16_zext_insert1_i64_zero:
632 ; SSE:       # %bb.0:
633 ; SSE-NEXT:    pextrw $2, %xmm0, %eax
634 ; SSE-NEXT:    movq %rax, %xmm0
635 ; SSE-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
636 ; SSE-NEXT:    retq
638 ; AVX-LABEL: extract2_i16_zext_insert1_i64_zero:
639 ; AVX:       # %bb.0:
640 ; AVX-NEXT:    vpextrw $2, %xmm0, %eax
641 ; AVX-NEXT:    vmovq %rax, %xmm0
642 ; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
643 ; AVX-NEXT:    retq
644   %e = extractelement <8 x i16> %x, i32 2
645   %z = zext i16 %e to i64
646   %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1
647   ret <2 x i64> %r
650 define <2 x i64> @extract3_i16_zext_insert1_i64_undef(<8 x i16> %x) {
651 ; SSE2-LABEL: extract3_i16_zext_insert1_i64_undef:
652 ; SSE2:       # %bb.0:
653 ; SSE2-NEXT:    psrlq $48, %xmm0
654 ; SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
655 ; SSE2-NEXT:    retq
657 ; SSE41-LABEL: extract3_i16_zext_insert1_i64_undef:
658 ; SSE41:       # %bb.0:
659 ; SSE41-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
660 ; SSE41-NEXT:    pxor %xmm1, %xmm1
661 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4],xmm1[5,6,7]
662 ; SSE41-NEXT:    retq
664 ; AVX-LABEL: extract3_i16_zext_insert1_i64_undef:
665 ; AVX:       # %bb.0:
666 ; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
667 ; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
668 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4],xmm1[5,6,7]
669 ; AVX-NEXT:    retq
670   %e = extractelement <8 x i16> %x, i32 3
671   %z = zext i16 %e to i64
672   %r = insertelement <2 x i64> undef, i64 %z, i32 1
673   ret <2 x i64> %r
676 define <2 x i64> @extract3_i16_zext_insert1_i64_zero(<8 x i16> %x) {
677 ; SSE-LABEL: extract3_i16_zext_insert1_i64_zero:
678 ; SSE:       # %bb.0:
679 ; SSE-NEXT:    pextrw $3, %xmm0, %eax
680 ; SSE-NEXT:    movq %rax, %xmm0
681 ; SSE-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
682 ; SSE-NEXT:    retq
684 ; AVX-LABEL: extract3_i16_zext_insert1_i64_zero:
685 ; AVX:       # %bb.0:
686 ; AVX-NEXT:    vpextrw $3, %xmm0, %eax
687 ; AVX-NEXT:    vmovq %rax, %xmm0
688 ; AVX-NEXT:    vpslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
689 ; AVX-NEXT:    retq
690   %e = extractelement <8 x i16> %x, i32 3
691   %z = zext i16 %e to i64
692   %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1
693   ret <2 x i64> %r