1; 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=SSE --check-prefix=SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 --check-prefix=AVX2-SLOW
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-shuffle | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 --check-prefix=AVX2-FAST
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F
9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
10
11define <8 x i16> @zext_16i8_to_8i16(<16 x i8> %A) nounwind uwtable readnone ssp {
12; SSE2-LABEL: zext_16i8_to_8i16:
13; SSE2:       # %bb.0: # %entry
14; SSE2-NEXT:    pxor %xmm1, %xmm1
15; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
16; SSE2-NEXT:    retq
17;
18; SSSE3-LABEL: zext_16i8_to_8i16:
19; SSSE3:       # %bb.0: # %entry
20; SSSE3-NEXT:    pxor %xmm1, %xmm1
21; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
22; SSSE3-NEXT:    retq
23;
24; SSE41-LABEL: zext_16i8_to_8i16:
25; SSE41:       # %bb.0: # %entry
26; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
27; SSE41-NEXT:    retq
28;
29; AVX-LABEL: zext_16i8_to_8i16:
30; AVX:       # %bb.0: # %entry
31; AVX-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
32; AVX-NEXT:    retq
33entry:
34  %B = shufflevector <16 x i8> %A, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
35  %C = zext <8 x i8> %B to <8 x i16>
36  ret <8 x i16> %C
37}
38
39; PR17654
40define <16 x i16> @zext_16i8_to_16i16(<16 x i8> %A) {
41; SSE2-LABEL: zext_16i8_to_16i16:
42; SSE2:       # %bb.0: # %entry
43; SSE2-NEXT:    movdqa %xmm0, %xmm1
44; SSE2-NEXT:    pxor %xmm2, %xmm2
45; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
46; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]
47; SSE2-NEXT:    retq
48;
49; SSSE3-LABEL: zext_16i8_to_16i16:
50; SSSE3:       # %bb.0: # %entry
51; SSSE3-NEXT:    movdqa %xmm0, %xmm1
52; SSSE3-NEXT:    pxor %xmm2, %xmm2
53; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
54; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]
55; SSSE3-NEXT:    retq
56;
57; SSE41-LABEL: zext_16i8_to_16i16:
58; SSE41:       # %bb.0: # %entry
59; SSE41-NEXT:    movdqa %xmm0, %xmm1
60; SSE41-NEXT:    pxor %xmm2, %xmm2
61; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
62; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]
63; SSE41-NEXT:    retq
64;
65; AVX1-LABEL: zext_16i8_to_16i16:
66; AVX1:       # %bb.0: # %entry
67; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
68; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
69; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
70; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
71; AVX1-NEXT:    retq
72;
73; AVX2-LABEL: zext_16i8_to_16i16:
74; AVX2:       # %bb.0: # %entry
75; AVX2-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
76; AVX2-NEXT:    retq
77;
78; AVX512-LABEL: zext_16i8_to_16i16:
79; AVX512:       # %bb.0: # %entry
80; AVX512-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
81; AVX512-NEXT:    retq
82entry:
83  %B = zext <16 x i8> %A to <16 x i16>
84  ret <16 x i16> %B
85}
86
87define <32 x i16> @zext_32i8_to_32i16(<32 x i8> %A) {
88; SSE2-LABEL: zext_32i8_to_32i16:
89; SSE2:       # %bb.0: # %entry
90; SSE2-NEXT:    movdqa %xmm1, %xmm3
91; SSE2-NEXT:    movdqa %xmm0, %xmm1
92; SSE2-NEXT:    pxor %xmm4, %xmm4
93; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
94; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm4[8],xmm1[9],xmm4[9],xmm1[10],xmm4[10],xmm1[11],xmm4[11],xmm1[12],xmm4[12],xmm1[13],xmm4[13],xmm1[14],xmm4[14],xmm1[15],xmm4[15]
95; SSE2-NEXT:    movdqa %xmm3, %xmm2
96; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3],xmm2[4],xmm4[4],xmm2[5],xmm4[5],xmm2[6],xmm4[6],xmm2[7],xmm4[7]
97; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm4[8],xmm3[9],xmm4[9],xmm3[10],xmm4[10],xmm3[11],xmm4[11],xmm3[12],xmm4[12],xmm3[13],xmm4[13],xmm3[14],xmm4[14],xmm3[15],xmm4[15]
98; SSE2-NEXT:    retq
99;
100; SSSE3-LABEL: zext_32i8_to_32i16:
101; SSSE3:       # %bb.0: # %entry
102; SSSE3-NEXT:    movdqa %xmm1, %xmm3
103; SSSE3-NEXT:    movdqa %xmm0, %xmm1
104; SSSE3-NEXT:    pxor %xmm4, %xmm4
105; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
106; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm4[8],xmm1[9],xmm4[9],xmm1[10],xmm4[10],xmm1[11],xmm4[11],xmm1[12],xmm4[12],xmm1[13],xmm4[13],xmm1[14],xmm4[14],xmm1[15],xmm4[15]
107; SSSE3-NEXT:    movdqa %xmm3, %xmm2
108; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3],xmm2[4],xmm4[4],xmm2[5],xmm4[5],xmm2[6],xmm4[6],xmm2[7],xmm4[7]
109; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm4[8],xmm3[9],xmm4[9],xmm3[10],xmm4[10],xmm3[11],xmm4[11],xmm3[12],xmm4[12],xmm3[13],xmm4[13],xmm3[14],xmm4[14],xmm3[15],xmm4[15]
110; SSSE3-NEXT:    retq
111;
112; SSE41-LABEL: zext_32i8_to_32i16:
113; SSE41:       # %bb.0: # %entry
114; SSE41-NEXT:    movdqa %xmm1, %xmm3
115; SSE41-NEXT:    movdqa %xmm0, %xmm1
116; SSE41-NEXT:    pxor %xmm4, %xmm4
117; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
118; SSE41-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm4[8],xmm1[9],xmm4[9],xmm1[10],xmm4[10],xmm1[11],xmm4[11],xmm1[12],xmm4[12],xmm1[13],xmm4[13],xmm1[14],xmm4[14],xmm1[15],xmm4[15]
119; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
120; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm4[8],xmm3[9],xmm4[9],xmm3[10],xmm4[10],xmm3[11],xmm4[11],xmm3[12],xmm4[12],xmm3[13],xmm4[13],xmm3[14],xmm4[14],xmm3[15],xmm4[15]
121; SSE41-NEXT:    retq
122;
123; AVX1-LABEL: zext_32i8_to_32i16:
124; AVX1:       # %bb.0: # %entry
125; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
126; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
127; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
128; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
129; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
130; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
131; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
132; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm1
133; AVX1-NEXT:    vmovaps %ymm2, %ymm0
134; AVX1-NEXT:    retq
135;
136; AVX2-LABEL: zext_32i8_to_32i16:
137; AVX2:       # %bb.0: # %entry
138; AVX2-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
139; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
140; AVX2-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
141; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
142; AVX2-NEXT:    retq
143;
144; AVX512F-LABEL: zext_32i8_to_32i16:
145; AVX512F:       # %bb.0: # %entry
146; AVX512F-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
147; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0
148; AVX512F-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
149; AVX512F-NEXT:    vmovdqa %ymm2, %ymm0
150; AVX512F-NEXT:    retq
151;
152; AVX512BW-LABEL: zext_32i8_to_32i16:
153; AVX512BW:       # %bb.0: # %entry
154; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} 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,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
155; AVX512BW-NEXT:    retq
156entry:
157  %B = zext <32 x i8> %A to <32 x i16>
158  ret <32 x i16> %B
159}
160
161define <4 x i32> @zext_16i8_to_4i32(<16 x i8> %A) nounwind uwtable readnone ssp {
162; SSE2-LABEL: zext_16i8_to_4i32:
163; SSE2:       # %bb.0: # %entry
164; SSE2-NEXT:    pxor %xmm1, %xmm1
165; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
166; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
167; SSE2-NEXT:    retq
168;
169; SSSE3-LABEL: zext_16i8_to_4i32:
170; SSSE3:       # %bb.0: # %entry
171; SSSE3-NEXT:    pxor %xmm1, %xmm1
172; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
173; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
174; SSSE3-NEXT:    retq
175;
176; SSE41-LABEL: zext_16i8_to_4i32:
177; SSE41:       # %bb.0: # %entry
178; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
179; SSE41-NEXT:    retq
180;
181; AVX-LABEL: zext_16i8_to_4i32:
182; AVX:       # %bb.0: # %entry
183; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
184; AVX-NEXT:    retq
185entry:
186  %B = shufflevector <16 x i8> %A, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
187  %C = zext <4 x i8> %B to <4 x i32>
188  ret <4 x i32> %C
189}
190
191define <8 x i32> @zext_16i8_to_8i32(<16 x i8> %A) nounwind uwtable readnone ssp {
192; SSE2-LABEL: zext_16i8_to_8i32:
193; SSE2:       # %bb.0: # %entry
194; SSE2-NEXT:    movdqa %xmm0, %xmm1
195; SSE2-NEXT:    pxor %xmm2, %xmm2
196; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
197; SSE2-NEXT:    movdqa %xmm1, %xmm0
198; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
199; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
200; SSE2-NEXT:    retq
201;
202; SSSE3-LABEL: zext_16i8_to_8i32:
203; SSSE3:       # %bb.0: # %entry
204; SSSE3-NEXT:    movdqa %xmm0, %xmm1
205; SSSE3-NEXT:    pxor %xmm2, %xmm2
206; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
207; SSSE3-NEXT:    movdqa %xmm1, %xmm0
208; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
209; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
210; SSSE3-NEXT:    retq
211;
212; SSE41-LABEL: zext_16i8_to_8i32:
213; SSE41:       # %bb.0: # %entry
214; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm2 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
215; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
216; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
217; SSE41-NEXT:    movdqa %xmm2, %xmm0
218; SSE41-NEXT:    retq
219;
220; AVX1-LABEL: zext_16i8_to_8i32:
221; AVX1:       # %bb.0: # %entry
222; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
223; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
224; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
225; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
226; AVX1-NEXT:    retq
227;
228; AVX2-LABEL: zext_16i8_to_8i32:
229; AVX2:       # %bb.0: # %entry
230; AVX2-NEXT:    vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
231; AVX2-NEXT:    retq
232;
233; AVX512-LABEL: zext_16i8_to_8i32:
234; AVX512:       # %bb.0: # %entry
235; AVX512-NEXT:    vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
236; AVX512-NEXT:    retq
237entry:
238  %B = shufflevector <16 x i8> %A, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
239  %C = zext <8 x i8> %B to <8 x i32>
240  ret <8 x i32> %C
241}
242
243define <16 x i32> @zext_16i8_to_16i32(<16 x i8> %A) nounwind uwtable readnone ssp {
244; SSE2-LABEL: zext_16i8_to_16i32:
245; SSE2:       # %bb.0: # %entry
246; SSE2-NEXT:    movdqa %xmm0, %xmm3
247; SSE2-NEXT:    pxor %xmm4, %xmm4
248; SSE2-NEXT:    movdqa %xmm0, %xmm1
249; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3],xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]
250; SSE2-NEXT:    movdqa %xmm1, %xmm0
251; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3]
252; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]
253; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm4[8],xmm3[9],xmm4[9],xmm3[10],xmm4[10],xmm3[11],xmm4[11],xmm3[12],xmm4[12],xmm3[13],xmm4[13],xmm3[14],xmm4[14],xmm3[15],xmm4[15]
254; SSE2-NEXT:    movdqa %xmm3, %xmm2
255; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]
256; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
257; SSE2-NEXT:    retq
258;
259; SSSE3-LABEL: zext_16i8_to_16i32:
260; SSSE3:       # %bb.0: # %entry
261; SSSE3-NEXT:    movdqa %xmm0, %xmm3
262; SSSE3-NEXT:    pxor %xmm4, %xmm4
263; SSSE3-NEXT:    movdqa %xmm0, %xmm1
264; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3],xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]
265; SSSE3-NEXT:    movdqa %xmm1, %xmm0
266; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3]
267; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]
268; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm4[8],xmm3[9],xmm4[9],xmm3[10],xmm4[10],xmm3[11],xmm4[11],xmm3[12],xmm4[12],xmm3[13],xmm4[13],xmm3[14],xmm4[14],xmm3[15],xmm4[15]
269; SSSE3-NEXT:    movdqa %xmm3, %xmm2
270; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]
271; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
272; SSSE3-NEXT:    retq
273;
274; SSE41-LABEL: zext_16i8_to_16i32:
275; SSE41:       # %bb.0: # %entry
276; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm4 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
277; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
278; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
279; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
280; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
281; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
282; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm3 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
283; SSE41-NEXT:    movdqa %xmm4, %xmm0
284; SSE41-NEXT:    retq
285;
286; AVX1-LABEL: zext_16i8_to_16i32:
287; AVX1:       # %bb.0: # %entry
288; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
289; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
290; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
291; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
292; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
293; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
294; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[3,3,0,1]
295; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
296; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
297; AVX1-NEXT:    vmovaps %ymm2, %ymm0
298; AVX1-NEXT:    retq
299;
300; AVX2-LABEL: zext_16i8_to_16i32:
301; AVX2:       # %bb.0: # %entry
302; AVX2-NEXT:    vpmovzxbd {{.*#+}} ymm2 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
303; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
304; AVX2-NEXT:    vpmovzxbd {{.*#+}} ymm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
305; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
306; AVX2-NEXT:    retq
307;
308; AVX512-LABEL: zext_16i8_to_16i32:
309; AVX512:       # %bb.0: # %entry
310; AVX512-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
311; AVX512-NEXT:    retq
312entry:
313  %B = zext <16 x i8> %A to <16 x i32>
314  ret <16 x i32> %B
315}
316
317define <2 x i64> @zext_16i8_to_2i64(<16 x i8> %A) nounwind uwtable readnone ssp {
318; SSE2-LABEL: zext_16i8_to_2i64:
319; SSE2:       # %bb.0: # %entry
320; SSE2-NEXT:    pxor %xmm1, %xmm1
321; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
322; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
323; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
324; SSE2-NEXT:    retq
325;
326; SSSE3-LABEL: zext_16i8_to_2i64:
327; SSSE3:       # %bb.0: # %entry
328; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
329; SSSE3-NEXT:    retq
330;
331; SSE41-LABEL: zext_16i8_to_2i64:
332; SSE41:       # %bb.0: # %entry
333; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
334; SSE41-NEXT:    retq
335;
336; AVX-LABEL: zext_16i8_to_2i64:
337; AVX:       # %bb.0: # %entry
338; AVX-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
339; AVX-NEXT:    retq
340entry:
341  %B = shufflevector <16 x i8> %A, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
342  %C = zext <2 x i8> %B to <2 x i64>
343  ret <2 x i64> %C
344}
345
346define <4 x i64> @zext_16i8_to_4i64(<16 x i8> %A) nounwind uwtable readnone ssp {
347; SSE2-LABEL: zext_16i8_to_4i64:
348; SSE2:       # %bb.0: # %entry
349; SSE2-NEXT:    movdqa %xmm0, %xmm1
350; SSE2-NEXT:    pxor %xmm2, %xmm2
351; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
352; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
353; SSE2-NEXT:    movdqa %xmm1, %xmm0
354; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
355; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
356; SSE2-NEXT:    retq
357;
358; SSSE3-LABEL: zext_16i8_to_4i64:
359; SSSE3:       # %bb.0: # %entry
360; SSSE3-NEXT:    movdqa %xmm0, %xmm1
361; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
362; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[2],zero,zero,zero,zero,zero,zero,zero,xmm1[3],zero,zero,zero,zero,zero,zero,zero
363; SSSE3-NEXT:    retq
364;
365; SSE41-LABEL: zext_16i8_to_4i64:
366; SSE41:       # %bb.0: # %entry
367; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm2 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
368; SSE41-NEXT:    psrld $16, %xmm0
369; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
370; SSE41-NEXT:    movdqa %xmm2, %xmm0
371; SSE41-NEXT:    retq
372;
373; AVX1-LABEL: zext_16i8_to_4i64:
374; AVX1:       # %bb.0: # %entry
375; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
376; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
377; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
378; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
379; AVX1-NEXT:    retq
380;
381; AVX2-LABEL: zext_16i8_to_4i64:
382; AVX2:       # %bb.0: # %entry
383; AVX2-NEXT:    vpmovzxbq {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero,xmm0[2],zero,zero,zero,zero,zero,zero,zero,xmm0[3],zero,zero,zero,zero,zero,zero,zero
384; AVX2-NEXT:    retq
385;
386; AVX512-LABEL: zext_16i8_to_4i64:
387; AVX512:       # %bb.0: # %entry
388; AVX512-NEXT:    vpmovzxbq {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero,xmm0[2],zero,zero,zero,zero,zero,zero,zero,xmm0[3],zero,zero,zero,zero,zero,zero,zero
389; AVX512-NEXT:    retq
390entry:
391  %B = shufflevector <16 x i8> %A, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
392  %C = zext <4 x i8> %B to <4 x i64>
393  ret <4 x i64> %C
394}
395
396define <8 x i64> @zext_16i8_to_8i64(<16 x i8> %A) nounwind uwtable readnone ssp {
397; SSE2-LABEL: zext_16i8_to_8i64:
398; SSE2:       # %bb.0: # %entry
399; SSE2-NEXT:    movdqa %xmm0, %xmm1
400; SSE2-NEXT:    pxor %xmm4, %xmm4
401; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,2,3]
402; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3],xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]
403; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3]
404; SSE2-NEXT:    movdqa %xmm1, %xmm0
405; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
406; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm4[2],xmm1[3],xmm4[3]
407; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
408; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3]
409; SSE2-NEXT:    movdqa %xmm3, %xmm2
410; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
411; SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]
412; SSE2-NEXT:    retq
413;
414; SSSE3-LABEL: zext_16i8_to_8i64:
415; SSSE3:       # %bb.0: # %entry
416; SSSE3-NEXT:    movdqa %xmm0, %xmm1
417; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [0,128,128,128,128,128,128,128,1,128,128,128,128,128,128,128]
418; SSSE3-NEXT:    pshufb %xmm4, %xmm0
419; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2,128,128,128,128,128,128,128,3,128,128,128,128,128,128,128]
420; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,2,3]
421; SSSE3-NEXT:    pshufb %xmm5, %xmm1
422; SSSE3-NEXT:    movdqa %xmm3, %xmm2
423; SSSE3-NEXT:    pshufb %xmm4, %xmm2
424; SSSE3-NEXT:    pshufb %xmm5, %xmm3
425; SSSE3-NEXT:    retq
426;
427; SSE41-LABEL: zext_16i8_to_8i64:
428; SSE41:       # %bb.0: # %entry
429; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm4 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
430; SSE41-NEXT:    movdqa %xmm0, %xmm1
431; SSE41-NEXT:    psrld $16, %xmm1
432; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
433; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
434; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
435; SSE41-NEXT:    psrlq $48, %xmm0
436; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm3 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
437; SSE41-NEXT:    movdqa %xmm4, %xmm0
438; SSE41-NEXT:    retq
439;
440; AVX1-LABEL: zext_16i8_to_8i64:
441; AVX1:       # %bb.0: # %entry
442; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
443; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm2
444; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,zero,zero,zero,zero,xmm2[1],zero,zero,zero,zero,zero,zero,zero
445; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
446; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
447; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
448; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
449; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
450; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
451; AVX1-NEXT:    vmovaps %ymm2, %ymm0
452; AVX1-NEXT:    retq
453;
454; AVX2-LABEL: zext_16i8_to_8i64:
455; AVX2:       # %bb.0: # %entry
456; AVX2-NEXT:    vpmovzxbq {{.*#+}} ymm2 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero,xmm0[2],zero,zero,zero,zero,zero,zero,zero,xmm0[3],zero,zero,zero,zero,zero,zero,zero
457; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
458; AVX2-NEXT:    vpmovzxbq {{.*#+}} ymm1 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero,xmm0[2],zero,zero,zero,zero,zero,zero,zero,xmm0[3],zero,zero,zero,zero,zero,zero,zero
459; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
460; AVX2-NEXT:    retq
461;
462; AVX512-LABEL: zext_16i8_to_8i64:
463; AVX512:       # %bb.0: # %entry
464; AVX512-NEXT:    vpmovzxbq {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero,xmm0[2],zero,zero,zero,zero,zero,zero,zero,xmm0[3],zero,zero,zero,zero,zero,zero,zero,xmm0[4],zero,zero,zero,zero,zero,zero,zero,xmm0[5],zero,zero,zero,zero,zero,zero,zero,xmm0[6],zero,zero,zero,zero,zero,zero,zero,xmm0[7],zero,zero,zero,zero,zero,zero,zero
465; AVX512-NEXT:    retq
466entry:
467  %B = shufflevector <16 x i8> %A, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
468  %C = zext <8 x i8> %B to <8 x i64>
469  ret <8 x i64> %C
470}
471
472define <4 x i32> @zext_8i16_to_4i32(<8 x i16> %A) nounwind uwtable readnone ssp {
473; SSE2-LABEL: zext_8i16_to_4i32:
474; SSE2:       # %bb.0: # %entry
475; SSE2-NEXT:    pxor %xmm1, %xmm1
476; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
477; SSE2-NEXT:    retq
478;
479; SSSE3-LABEL: zext_8i16_to_4i32:
480; SSSE3:       # %bb.0: # %entry
481; SSSE3-NEXT:    pxor %xmm1, %xmm1
482; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
483; SSSE3-NEXT:    retq
484;
485; SSE41-LABEL: zext_8i16_to_4i32:
486; SSE41:       # %bb.0: # %entry
487; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
488; SSE41-NEXT:    retq
489;
490; AVX-LABEL: zext_8i16_to_4i32:
491; AVX:       # %bb.0: # %entry
492; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
493; AVX-NEXT:    retq
494entry:
495  %B = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
496  %C = zext <4 x i16> %B to <4 x i32>
497  ret <4 x i32> %C
498}
499
500define <8 x i32> @zext_8i16_to_8i32(<8 x i16> %A) nounwind uwtable readnone ssp {
501; SSE2-LABEL: zext_8i16_to_8i32:
502; SSE2:       # %bb.0: # %entry
503; SSE2-NEXT:    movdqa %xmm0, %xmm1
504; SSE2-NEXT:    pxor %xmm2, %xmm2
505; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
506; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
507; SSE2-NEXT:    retq
508;
509; SSSE3-LABEL: zext_8i16_to_8i32:
510; SSSE3:       # %bb.0: # %entry
511; SSSE3-NEXT:    movdqa %xmm0, %xmm1
512; SSSE3-NEXT:    pxor %xmm2, %xmm2
513; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
514; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
515; SSSE3-NEXT:    retq
516;
517; SSE41-LABEL: zext_8i16_to_8i32:
518; SSE41:       # %bb.0: # %entry
519; SSE41-NEXT:    movdqa %xmm0, %xmm1
520; SSE41-NEXT:    pxor %xmm2, %xmm2
521; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
522; SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
523; SSE41-NEXT:    retq
524;
525; AVX1-LABEL: zext_8i16_to_8i32:
526; AVX1:       # %bb.0: # %entry
527; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
528; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
529; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
530; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
531; AVX1-NEXT:    retq
532;
533; AVX2-LABEL: zext_8i16_to_8i32:
534; AVX2:       # %bb.0: # %entry
535; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
536; AVX2-NEXT:    retq
537;
538; AVX512-LABEL: zext_8i16_to_8i32:
539; AVX512:       # %bb.0: # %entry
540; AVX512-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
541; AVX512-NEXT:    retq
542entry:
543  %B = zext <8 x i16> %A to <8 x i32>
544  ret <8 x i32>%B
545}
546
547define <16 x i32> @zext_16i16_to_16i32(<16 x i16> %A) nounwind uwtable readnone ssp {
548; SSE2-LABEL: zext_16i16_to_16i32:
549; SSE2:       # %bb.0: # %entry
550; SSE2-NEXT:    movdqa %xmm1, %xmm3
551; SSE2-NEXT:    movdqa %xmm0, %xmm1
552; SSE2-NEXT:    pxor %xmm4, %xmm4
553; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3]
554; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]
555; SSE2-NEXT:    movdqa %xmm3, %xmm2
556; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]
557; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
558; SSE2-NEXT:    retq
559;
560; SSSE3-LABEL: zext_16i16_to_16i32:
561; SSSE3:       # %bb.0: # %entry
562; SSSE3-NEXT:    movdqa %xmm1, %xmm3
563; SSSE3-NEXT:    movdqa %xmm0, %xmm1
564; SSSE3-NEXT:    pxor %xmm4, %xmm4
565; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3]
566; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]
567; SSSE3-NEXT:    movdqa %xmm3, %xmm2
568; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]
569; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
570; SSSE3-NEXT:    retq
571;
572; SSE41-LABEL: zext_16i16_to_16i32:
573; SSE41:       # %bb.0: # %entry
574; SSE41-NEXT:    movdqa %xmm1, %xmm3
575; SSE41-NEXT:    movdqa %xmm0, %xmm1
576; SSE41-NEXT:    pxor %xmm4, %xmm4
577; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
578; SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]
579; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm2 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero
580; SSE41-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
581; SSE41-NEXT:    retq
582;
583; AVX1-LABEL: zext_16i16_to_16i32:
584; AVX1:       # %bb.0: # %entry
585; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
586; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm2 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
587; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
588; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
589; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
590; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
591; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
592; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm1
593; AVX1-NEXT:    vmovaps %ymm2, %ymm0
594; AVX1-NEXT:    retq
595;
596; AVX2-LABEL: zext_16i16_to_16i32:
597; AVX2:       # %bb.0: # %entry
598; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
599; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
600; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
601; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
602; AVX2-NEXT:    retq
603;
604; AVX512-LABEL: zext_16i16_to_16i32:
605; AVX512:       # %bb.0: # %entry
606; AVX512-NEXT:    vpmovzxwd {{.*#+}} 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,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
607; AVX512-NEXT:    retq
608entry:
609  %B = zext <16 x i16> %A to <16 x i32>
610  ret <16 x i32> %B
611}
612
613define <2 x i64> @zext_8i16_to_2i64(<8 x i16> %A) nounwind uwtable readnone ssp {
614; SSE2-LABEL: zext_8i16_to_2i64:
615; SSE2:       # %bb.0: # %entry
616; SSE2-NEXT:    pxor %xmm1, %xmm1
617; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
618; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
619; SSE2-NEXT:    retq
620;
621; SSSE3-LABEL: zext_8i16_to_2i64:
622; SSSE3:       # %bb.0: # %entry
623; SSSE3-NEXT:    pxor %xmm1, %xmm1
624; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
625; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
626; SSSE3-NEXT:    retq
627;
628; SSE41-LABEL: zext_8i16_to_2i64:
629; SSE41:       # %bb.0: # %entry
630; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
631; SSE41-NEXT:    retq
632;
633; AVX-LABEL: zext_8i16_to_2i64:
634; AVX:       # %bb.0: # %entry
635; AVX-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
636; AVX-NEXT:    retq
637entry:
638  %B = shufflevector <8 x i16> %A, <8 x i16> undef, <2 x i32> <i32 0, i32 1>
639  %C = zext <2 x i16> %B to <2 x i64>
640  ret <2 x i64> %C
641}
642
643define <4 x i64> @zext_8i16_to_4i64(<8 x i16> %A) nounwind uwtable readnone ssp {
644; SSE2-LABEL: zext_8i16_to_4i64:
645; SSE2:       # %bb.0: # %entry
646; SSE2-NEXT:    movdqa %xmm0, %xmm1
647; SSE2-NEXT:    pxor %xmm2, %xmm2
648; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
649; SSE2-NEXT:    movdqa %xmm1, %xmm0
650; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
651; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
652; SSE2-NEXT:    retq
653;
654; SSSE3-LABEL: zext_8i16_to_4i64:
655; SSSE3:       # %bb.0: # %entry
656; SSSE3-NEXT:    movdqa %xmm0, %xmm1
657; SSSE3-NEXT:    pxor %xmm2, %xmm2
658; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
659; SSSE3-NEXT:    movdqa %xmm1, %xmm0
660; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
661; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
662; SSSE3-NEXT:    retq
663;
664; SSE41-LABEL: zext_8i16_to_4i64:
665; SSE41:       # %bb.0: # %entry
666; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm2 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
667; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
668; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
669; SSE41-NEXT:    movdqa %xmm2, %xmm0
670; SSE41-NEXT:    retq
671;
672; AVX1-LABEL: zext_8i16_to_4i64:
673; AVX1:       # %bb.0: # %entry
674; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
675; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
676; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
677; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
678; AVX1-NEXT:    retq
679;
680; AVX2-LABEL: zext_8i16_to_4i64:
681; AVX2:       # %bb.0: # %entry
682; AVX2-NEXT:    vpmovzxwq {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
683; AVX2-NEXT:    retq
684;
685; AVX512-LABEL: zext_8i16_to_4i64:
686; AVX512:       # %bb.0: # %entry
687; AVX512-NEXT:    vpmovzxwq {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
688; AVX512-NEXT:    retq
689entry:
690  %B = shufflevector <8 x i16> %A, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
691  %C = zext <4 x i16> %B to <4 x i64>
692  ret <4 x i64> %C
693}
694
695define <8 x i64> @zext_8i16_to_8i64(<8 x i16> %A) nounwind uwtable readnone ssp {
696; SSE2-LABEL: zext_8i16_to_8i64:
697; SSE2:       # %bb.0: # %entry
698; SSE2-NEXT:    movdqa %xmm0, %xmm3
699; SSE2-NEXT:    pxor %xmm4, %xmm4
700; SSE2-NEXT:    movdqa %xmm0, %xmm1
701; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3]
702; SSE2-NEXT:    movdqa %xmm1, %xmm0
703; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
704; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm4[2],xmm1[3],xmm4[3]
705; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
706; SSE2-NEXT:    movdqa %xmm3, %xmm2
707; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
708; SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]
709; SSE2-NEXT:    retq
710;
711; SSSE3-LABEL: zext_8i16_to_8i64:
712; SSSE3:       # %bb.0: # %entry
713; SSSE3-NEXT:    movdqa %xmm0, %xmm3
714; SSSE3-NEXT:    pxor %xmm4, %xmm4
715; SSSE3-NEXT:    movdqa %xmm0, %xmm1
716; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3]
717; SSSE3-NEXT:    movdqa %xmm1, %xmm0
718; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
719; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm4[2],xmm1[3],xmm4[3]
720; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
721; SSSE3-NEXT:    movdqa %xmm3, %xmm2
722; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
723; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]
724; SSSE3-NEXT:    retq
725;
726; SSE41-LABEL: zext_8i16_to_8i64:
727; SSE41:       # %bb.0: # %entry
728; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm4 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
729; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
730; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
731; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
732; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
733; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
734; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm3 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
735; SSE41-NEXT:    movdqa %xmm4, %xmm0
736; SSE41-NEXT:    retq
737;
738; AVX1-LABEL: zext_8i16_to_8i64:
739; AVX1:       # %bb.0: # %entry
740; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
741; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
742; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
743; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
744; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
745; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
746; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[3,3,0,1]
747; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
748; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
749; AVX1-NEXT:    vmovaps %ymm2, %ymm0
750; AVX1-NEXT:    retq
751;
752; AVX2-LABEL: zext_8i16_to_8i64:
753; AVX2:       # %bb.0: # %entry
754; AVX2-NEXT:    vpmovzxwq {{.*#+}} ymm2 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
755; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
756; AVX2-NEXT:    vpmovzxwq {{.*#+}} ymm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
757; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
758; AVX2-NEXT:    retq
759;
760; AVX512-LABEL: zext_8i16_to_8i64:
761; AVX512:       # %bb.0: # %entry
762; AVX512-NEXT:    vpmovzxwq {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
763; AVX512-NEXT:    retq
764entry:
765  %B = zext <8 x i16> %A to <8 x i64>
766  ret <8 x i64> %B
767}
768
769define <2 x i64> @zext_4i32_to_2i64(<4 x i32> %A) nounwind uwtable readnone ssp {
770; SSE2-LABEL: zext_4i32_to_2i64:
771; SSE2:       # %bb.0: # %entry
772; SSE2-NEXT:    xorps %xmm1, %xmm1
773; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
774; SSE2-NEXT:    retq
775;
776; SSSE3-LABEL: zext_4i32_to_2i64:
777; SSSE3:       # %bb.0: # %entry
778; SSSE3-NEXT:    xorps %xmm1, %xmm1
779; SSSE3-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
780; SSSE3-NEXT:    retq
781;
782; SSE41-LABEL: zext_4i32_to_2i64:
783; SSE41:       # %bb.0: # %entry
784; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
785; SSE41-NEXT:    retq
786;
787; AVX-LABEL: zext_4i32_to_2i64:
788; AVX:       # %bb.0: # %entry
789; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
790; AVX-NEXT:    retq
791entry:
792  %B = shufflevector <4 x i32> %A, <4 x i32> undef, <2 x i32> <i32 0, i32 1>
793  %C = zext <2 x i32> %B to <2 x i64>
794  ret <2 x i64> %C
795}
796
797define <4 x i64> @zext_4i32_to_4i64(<4 x i32> %A) nounwind uwtable readnone ssp {
798; SSE2-LABEL: zext_4i32_to_4i64:
799; SSE2:       # %bb.0: # %entry
800; SSE2-NEXT:    movaps %xmm0, %xmm1
801; SSE2-NEXT:    xorps %xmm2, %xmm2
802; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
803; SSE2-NEXT:    unpckhps {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
804; SSE2-NEXT:    retq
805;
806; SSSE3-LABEL: zext_4i32_to_4i64:
807; SSSE3:       # %bb.0: # %entry
808; SSSE3-NEXT:    movaps %xmm0, %xmm1
809; SSSE3-NEXT:    xorps %xmm2, %xmm2
810; SSSE3-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
811; SSSE3-NEXT:    unpckhps {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
812; SSSE3-NEXT:    retq
813;
814; SSE41-LABEL: zext_4i32_to_4i64:
815; SSE41:       # %bb.0: # %entry
816; SSE41-NEXT:    movdqa %xmm0, %xmm1
817; SSE41-NEXT:    pxor %xmm2, %xmm2
818; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
819; SSE41-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
820; SSE41-NEXT:    retq
821;
822; AVX1-LABEL: zext_4i32_to_4i64:
823; AVX1:       # %bb.0: # %entry
824; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
825; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm1 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
826; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
827; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
828; AVX1-NEXT:    retq
829;
830; AVX2-LABEL: zext_4i32_to_4i64:
831; AVX2:       # %bb.0: # %entry
832; AVX2-NEXT:    vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
833; AVX2-NEXT:    retq
834;
835; AVX512-LABEL: zext_4i32_to_4i64:
836; AVX512:       # %bb.0: # %entry
837; AVX512-NEXT:    vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
838; AVX512-NEXT:    retq
839entry:
840  %B = zext <4 x i32> %A to <4 x i64>
841  ret <4 x i64>%B
842}
843
844define <8 x i64> @zext_8i32_to_8i64(<8 x i32> %A) nounwind uwtable readnone ssp {
845; SSE2-LABEL: zext_8i32_to_8i64:
846; SSE2:       # %bb.0: # %entry
847; SSE2-NEXT:    movaps %xmm1, %xmm3
848; SSE2-NEXT:    movaps %xmm0, %xmm1
849; SSE2-NEXT:    xorps %xmm4, %xmm4
850; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
851; SSE2-NEXT:    unpckhps {{.*#+}} xmm1 = xmm1[2],xmm4[2],xmm1[3],xmm4[3]
852; SSE2-NEXT:    movaps %xmm3, %xmm2
853; SSE2-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
854; SSE2-NEXT:    unpckhps {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]
855; SSE2-NEXT:    retq
856;
857; SSSE3-LABEL: zext_8i32_to_8i64:
858; SSSE3:       # %bb.0: # %entry
859; SSSE3-NEXT:    movaps %xmm1, %xmm3
860; SSSE3-NEXT:    movaps %xmm0, %xmm1
861; SSSE3-NEXT:    xorps %xmm4, %xmm4
862; SSSE3-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
863; SSSE3-NEXT:    unpckhps {{.*#+}} xmm1 = xmm1[2],xmm4[2],xmm1[3],xmm4[3]
864; SSSE3-NEXT:    movaps %xmm3, %xmm2
865; SSSE3-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
866; SSSE3-NEXT:    unpckhps {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]
867; SSSE3-NEXT:    retq
868;
869; SSE41-LABEL: zext_8i32_to_8i64:
870; SSE41:       # %bb.0: # %entry
871; SSE41-NEXT:    movdqa %xmm1, %xmm3
872; SSE41-NEXT:    movdqa %xmm0, %xmm1
873; SSE41-NEXT:    pxor %xmm4, %xmm4
874; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
875; SSE41-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm4[2],xmm1[3],xmm4[3]
876; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm2 = xmm3[0],zero,xmm3[1],zero
877; SSE41-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]
878; SSE41-NEXT:    retq
879;
880; AVX1-LABEL: zext_8i32_to_8i64:
881; AVX1:       # %bb.0: # %entry
882; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
883; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm2 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
884; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero
885; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
886; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
887; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm1 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
888; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
889; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm1
890; AVX1-NEXT:    vmovaps %ymm2, %ymm0
891; AVX1-NEXT:    retq
892;
893; AVX2-LABEL: zext_8i32_to_8i64:
894; AVX2:       # %bb.0: # %entry
895; AVX2-NEXT:    vpmovzxdq {{.*#+}} ymm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
896; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
897; AVX2-NEXT:    vpmovzxdq {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
898; AVX2-NEXT:    vmovdqa %ymm2, %ymm0
899; AVX2-NEXT:    retq
900;
901; AVX512-LABEL: zext_8i32_to_8i64:
902; AVX512:       # %bb.0: # %entry
903; 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
904; AVX512-NEXT:    retq
905entry:
906  %B = zext <8 x i32> %A to <8 x i64>
907  ret <8 x i64>%B
908}
909
910define <2 x i64> @load_zext_2i8_to_2i64(<2 x i8> *%ptr) {
911; SSE2-LABEL: load_zext_2i8_to_2i64:
912; SSE2:       # %bb.0: # %entry
913; SSE2-NEXT:    movzwl (%rdi), %eax
914; SSE2-NEXT:    movd %eax, %xmm0
915; SSE2-NEXT:    pxor %xmm1, %xmm1
916; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
917; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
918; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
919; SSE2-NEXT:    retq
920;
921; SSSE3-LABEL: load_zext_2i8_to_2i64:
922; SSSE3:       # %bb.0: # %entry
923; SSSE3-NEXT:    movzwl (%rdi), %eax
924; SSSE3-NEXT:    movd %eax, %xmm0
925; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
926; SSSE3-NEXT:    retq
927;
928; SSE41-LABEL: load_zext_2i8_to_2i64:
929; SSE41:       # %bb.0: # %entry
930; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
931; SSE41-NEXT:    retq
932;
933; AVX-LABEL: load_zext_2i8_to_2i64:
934; AVX:       # %bb.0: # %entry
935; AVX-NEXT:    vpmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
936; AVX-NEXT:    retq
937entry:
938 %X = load <2 x i8>, <2 x i8>* %ptr
939 %Y = zext <2 x i8> %X to <2 x i64>
940 ret <2 x i64> %Y
941}
942
943define <4 x i32> @load_zext_4i8_to_4i32(<4 x i8> *%ptr) {
944; SSE2-LABEL: load_zext_4i8_to_4i32:
945; SSE2:       # %bb.0: # %entry
946; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
947; SSE2-NEXT:    pxor %xmm1, %xmm1
948; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
949; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
950; SSE2-NEXT:    retq
951;
952; SSSE3-LABEL: load_zext_4i8_to_4i32:
953; SSSE3:       # %bb.0: # %entry
954; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
955; SSSE3-NEXT:    pxor %xmm1, %xmm1
956; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
957; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
958; SSSE3-NEXT:    retq
959;
960; SSE41-LABEL: load_zext_4i8_to_4i32:
961; SSE41:       # %bb.0: # %entry
962; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
963; SSE41-NEXT:    retq
964;
965; AVX-LABEL: load_zext_4i8_to_4i32:
966; AVX:       # %bb.0: # %entry
967; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
968; AVX-NEXT:    retq
969entry:
970 %X = load <4 x i8>, <4 x i8>* %ptr
971 %Y = zext <4 x i8> %X to <4 x i32>
972 ret <4 x i32> %Y
973}
974
975define <4 x i64> @load_zext_4i8_to_4i64(<4 x i8> *%ptr) {
976; SSE2-LABEL: load_zext_4i8_to_4i64:
977; SSE2:       # %bb.0: # %entry
978; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
979; SSE2-NEXT:    pxor %xmm2, %xmm2
980; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
981; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
982; SSE2-NEXT:    movdqa %xmm1, %xmm0
983; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
984; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
985; SSE2-NEXT:    retq
986;
987; SSSE3-LABEL: load_zext_4i8_to_4i64:
988; SSSE3:       # %bb.0: # %entry
989; SSSE3-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
990; SSSE3-NEXT:    movdqa %xmm1, %xmm0
991; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
992; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[2],zero,zero,zero,zero,zero,zero,zero,xmm1[3],zero,zero,zero,zero,zero,zero,zero
993; SSSE3-NEXT:    retq
994;
995; SSE41-LABEL: load_zext_4i8_to_4i64:
996; SSE41:       # %bb.0: # %entry
997; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
998; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm1 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
999; SSE41-NEXT:    retq
1000;
1001; AVX1-LABEL: load_zext_4i8_to_4i64:
1002; AVX1:       # %bb.0: # %entry
1003; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
1004; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm1 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
1005; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1006; AVX1-NEXT:    retq
1007;
1008; AVX2-LABEL: load_zext_4i8_to_4i64:
1009; AVX2:       # %bb.0: # %entry
1010; AVX2-NEXT:    vpmovzxbq {{.*#+}} ymm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero,mem[2],zero,zero,zero,zero,zero,zero,zero,mem[3],zero,zero,zero,zero,zero,zero,zero
1011; AVX2-NEXT:    retq
1012;
1013; AVX512-LABEL: load_zext_4i8_to_4i64:
1014; AVX512:       # %bb.0: # %entry
1015; AVX512-NEXT:    vpmovzxbq {{.*#+}} ymm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero,mem[2],zero,zero,zero,zero,zero,zero,zero,mem[3],zero,zero,zero,zero,zero,zero,zero
1016; AVX512-NEXT:    retq
1017entry:
1018 %X = load <4 x i8>, <4 x i8>* %ptr
1019 %Y = zext <4 x i8> %X to <4 x i64>
1020 ret <4 x i64> %Y
1021}
1022
1023define <8 x i16> @load_zext_8i8_to_8i16(<8 x i8> *%ptr) {
1024; SSE2-LABEL: load_zext_8i8_to_8i16:
1025; SSE2:       # %bb.0: # %entry
1026; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
1027; SSE2-NEXT:    pxor %xmm1, %xmm1
1028; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1029; SSE2-NEXT:    retq
1030;
1031; SSSE3-LABEL: load_zext_8i8_to_8i16:
1032; SSSE3:       # %bb.0: # %entry
1033; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
1034; SSSE3-NEXT:    pxor %xmm1, %xmm1
1035; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1036; SSSE3-NEXT:    retq
1037;
1038; SSE41-LABEL: load_zext_8i8_to_8i16:
1039; SSE41:       # %bb.0: # %entry
1040; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
1041; SSE41-NEXT:    retq
1042;
1043; AVX-LABEL: load_zext_8i8_to_8i16:
1044; AVX:       # %bb.0: # %entry
1045; AVX-NEXT:    vpmovzxbw {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
1046; AVX-NEXT:    retq
1047entry:
1048 %X = load <8 x i8>, <8 x i8>* %ptr
1049 %Y = zext <8 x i8> %X to <8 x i16>
1050 ret <8 x i16> %Y
1051}
1052
1053define <8 x i32> @load_zext_8i8_to_8i32(<8 x i8> *%ptr) {
1054; SSE2-LABEL: load_zext_8i8_to_8i32:
1055; SSE2:       # %bb.0: # %entry
1056; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
1057; SSE2-NEXT:    pxor %xmm2, %xmm2
1058; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1059; SSE2-NEXT:    movdqa %xmm1, %xmm0
1060; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1061; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1062; SSE2-NEXT:    retq
1063;
1064; SSSE3-LABEL: load_zext_8i8_to_8i32:
1065; SSSE3:       # %bb.0: # %entry
1066; SSSE3-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
1067; SSSE3-NEXT:    pxor %xmm2, %xmm2
1068; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1069; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1070; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1071; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1072; SSSE3-NEXT:    retq
1073;
1074; SSE41-LABEL: load_zext_8i8_to_8i32:
1075; SSE41:       # %bb.0: # %entry
1076; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
1077; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
1078; SSE41-NEXT:    retq
1079;
1080; AVX1-LABEL: load_zext_8i8_to_8i32:
1081; AVX1:       # %bb.0: # %entry
1082; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
1083; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
1084; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1085; AVX1-NEXT:    retq
1086;
1087; AVX2-LABEL: load_zext_8i8_to_8i32:
1088; AVX2:       # %bb.0: # %entry
1089; AVX2-NEXT:    vpmovzxbd {{.*#+}} ymm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero
1090; AVX2-NEXT:    retq
1091;
1092; AVX512-LABEL: load_zext_8i8_to_8i32:
1093; AVX512:       # %bb.0: # %entry
1094; AVX512-NEXT:    vpmovzxbd {{.*#+}} ymm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero
1095; AVX512-NEXT:    retq
1096entry:
1097 %X = load <8 x i8>, <8 x i8>* %ptr
1098 %Y = zext <8 x i8> %X to <8 x i32>
1099 ret <8 x i32> %Y
1100}
1101
1102define <8 x i32> @load_zext_16i8_to_8i32(<16 x i8> *%ptr) {
1103; SSE2-LABEL: load_zext_16i8_to_8i32:
1104; SSE2:       # %bb.0: # %entry
1105; SSE2-NEXT:    movdqa (%rdi), %xmm1
1106; SSE2-NEXT:    pxor %xmm2, %xmm2
1107; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1108; SSE2-NEXT:    movdqa %xmm1, %xmm0
1109; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1110; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1111; SSE2-NEXT:    retq
1112;
1113; SSSE3-LABEL: load_zext_16i8_to_8i32:
1114; SSSE3:       # %bb.0: # %entry
1115; SSSE3-NEXT:    movdqa (%rdi), %xmm1
1116; SSSE3-NEXT:    pxor %xmm2, %xmm2
1117; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1118; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1119; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1120; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1121; SSSE3-NEXT:    retq
1122;
1123; SSE41-LABEL: load_zext_16i8_to_8i32:
1124; SSE41:       # %bb.0: # %entry
1125; SSE41-NEXT:    movdqa (%rdi), %xmm1
1126; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
1127; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,2,3]
1128; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
1129; SSE41-NEXT:    retq
1130;
1131; AVX1-LABEL: load_zext_16i8_to_8i32:
1132; AVX1:       # %bb.0: # %entry
1133; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
1134; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1135; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1136; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1137; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1138; AVX1-NEXT:    retq
1139;
1140; AVX2-LABEL: load_zext_16i8_to_8i32:
1141; AVX2:       # %bb.0: # %entry
1142; AVX2-NEXT:    vpmovzxbd {{.*#+}} ymm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero
1143; AVX2-NEXT:    retq
1144;
1145; AVX512-LABEL: load_zext_16i8_to_8i32:
1146; AVX512:       # %bb.0: # %entry
1147; AVX512-NEXT:    vpmovzxbd {{.*#+}} ymm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero
1148; AVX512-NEXT:    retq
1149entry:
1150 %X = load <16 x i8>, <16 x i8>* %ptr
1151 %Y = shufflevector <16 x i8> %X, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1152 %Z = zext <8 x i8> %Y to <8 x i32>
1153 ret <8 x i32> %Z
1154}
1155
1156define <8 x i64> @load_zext_8i8_to_8i64(<8 x i8> *%ptr) {
1157; SSE2-LABEL: load_zext_8i8_to_8i64:
1158; SSE2:       # %bb.0: # %entry
1159; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
1160; SSE2-NEXT:    pxor %xmm4, %xmm4
1161; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,2,3]
1162; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3],xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]
1163; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3]
1164; SSE2-NEXT:    movdqa %xmm1, %xmm0
1165; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
1166; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm4[2],xmm1[3],xmm4[3]
1167; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
1168; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3]
1169; SSE2-NEXT:    movdqa %xmm3, %xmm2
1170; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
1171; SSE2-NEXT:    punpckhdq {{.*#+}} xmm3 = xmm3[2],xmm4[2],xmm3[3],xmm4[3]
1172; SSE2-NEXT:    retq
1173;
1174; SSSE3-LABEL: load_zext_8i8_to_8i64:
1175; SSSE3:       # %bb.0: # %entry
1176; SSSE3-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
1177; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [0,128,128,128,128,128,128,128,1,128,128,128,128,128,128,128]
1178; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1179; SSSE3-NEXT:    pshufb %xmm4, %xmm0
1180; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2,128,128,128,128,128,128,128,3,128,128,128,128,128,128,128]
1181; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,2,3]
1182; SSSE3-NEXT:    pshufb %xmm5, %xmm1
1183; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1184; SSSE3-NEXT:    pshufb %xmm4, %xmm2
1185; SSSE3-NEXT:    pshufb %xmm5, %xmm3
1186; SSSE3-NEXT:    retq
1187;
1188; SSE41-LABEL: load_zext_8i8_to_8i64:
1189; SSE41:       # %bb.0: # %entry
1190; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
1191; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm1 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
1192; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm2 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
1193; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm3 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
1194; SSE41-NEXT:    retq
1195;
1196; AVX1-LABEL: load_zext_8i8_to_8i64:
1197; AVX1:       # %bb.0: # %entry
1198; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm1 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
1199; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm2 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
1200; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
1201; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm3 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
1202; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm3, %ymm0
1203; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
1204; AVX1-NEXT:    retq
1205;
1206; AVX2-LABEL: load_zext_8i8_to_8i64:
1207; AVX2:       # %bb.0: # %entry
1208; AVX2-NEXT:    vpmovzxbq {{.*#+}} ymm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero,mem[2],zero,zero,zero,zero,zero,zero,zero,mem[3],zero,zero,zero,zero,zero,zero,zero
1209; AVX2-NEXT:    vpmovzxbq {{.*#+}} ymm1 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero,mem[2],zero,zero,zero,zero,zero,zero,zero,mem[3],zero,zero,zero,zero,zero,zero,zero
1210; AVX2-NEXT:    retq
1211;
1212; AVX512-LABEL: load_zext_8i8_to_8i64:
1213; AVX512:       # %bb.0: # %entry
1214; AVX512-NEXT:    vpmovzxbq {{.*#+}} zmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero,mem[2],zero,zero,zero,zero,zero,zero,zero,mem[3],zero,zero,zero,zero,zero,zero,zero,mem[4],zero,zero,zero,zero,zero,zero,zero,mem[5],zero,zero,zero,zero,zero,zero,zero,mem[6],zero,zero,zero,zero,zero,zero,zero,mem[7],zero,zero,zero,zero,zero,zero,zero
1215; AVX512-NEXT:    retq
1216entry:
1217 %X = load <8 x i8>, <8 x i8>* %ptr
1218 %Y = zext <8 x i8> %X to <8 x i64>
1219 ret <8 x i64> %Y
1220}
1221
1222define <16 x i16> @load_zext_16i8_to_16i16(<16 x i8> *%ptr) {
1223; SSE2-LABEL: load_zext_16i8_to_16i16:
1224; SSE2:       # %bb.0: # %entry
1225; SSE2-NEXT:    movdqa (%rdi), %xmm1
1226; SSE2-NEXT:    pxor %xmm2, %xmm2
1227; SSE2-NEXT:    movdqa %xmm1, %xmm0
1228; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1229; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]
1230; SSE2-NEXT:    retq
1231;
1232; SSSE3-LABEL: load_zext_16i8_to_16i16:
1233; SSSE3:       # %bb.0: # %entry
1234; SSSE3-NEXT:    movdqa (%rdi), %xmm1
1235; SSSE3-NEXT:    pxor %xmm2, %xmm2
1236; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1237; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
1238; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]
1239; SSSE3-NEXT:    retq
1240;
1241; SSE41-LABEL: load_zext_16i8_to_16i16:
1242; SSE41:       # %bb.0: # %entry
1243; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
1244; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
1245; SSE41-NEXT:    retq
1246;
1247; AVX1-LABEL: load_zext_16i8_to_16i16:
1248; AVX1:       # %bb.0: # %entry
1249; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
1250; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
1251; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1252; AVX1-NEXT:    retq
1253;
1254; AVX2-LABEL: load_zext_16i8_to_16i16:
1255; AVX2:       # %bb.0: # %entry
1256; AVX2-NEXT:    vpmovzxbw {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero,mem[8],zero,mem[9],zero,mem[10],zero,mem[11],zero,mem[12],zero,mem[13],zero,mem[14],zero,mem[15],zero
1257; AVX2-NEXT:    retq
1258;
1259; AVX512-LABEL: load_zext_16i8_to_16i16:
1260; AVX512:       # %bb.0: # %entry
1261; AVX512-NEXT:    vpmovzxbw {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero,mem[8],zero,mem[9],zero,mem[10],zero,mem[11],zero,mem[12],zero,mem[13],zero,mem[14],zero,mem[15],zero
1262; AVX512-NEXT:    retq
1263entry:
1264 %X = load <16 x i8>, <16 x i8>* %ptr
1265 %Y = zext <16 x i8> %X to <16 x i16>
1266 ret <16 x i16> %Y
1267}
1268
1269define <2 x i64> @load_zext_2i16_to_2i64(<2 x i16> *%ptr) {
1270; SSE2-LABEL: load_zext_2i16_to_2i64:
1271; SSE2:       # %bb.0: # %entry
1272; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1273; SSE2-NEXT:    pxor %xmm1, %xmm1
1274; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1275; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1276; SSE2-NEXT:    retq
1277;
1278; SSSE3-LABEL: load_zext_2i16_to_2i64:
1279; SSSE3:       # %bb.0: # %entry
1280; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1281; SSSE3-NEXT:    pxor %xmm1, %xmm1
1282; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1283; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1284; SSSE3-NEXT:    retq
1285;
1286; SSE41-LABEL: load_zext_2i16_to_2i64:
1287; SSE41:       # %bb.0: # %entry
1288; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero
1289; SSE41-NEXT:    retq
1290;
1291; AVX-LABEL: load_zext_2i16_to_2i64:
1292; AVX:       # %bb.0: # %entry
1293; AVX-NEXT:    vpmovzxwq {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero
1294; AVX-NEXT:    retq
1295entry:
1296 %X = load <2 x i16>, <2 x i16>* %ptr
1297 %Y = zext <2 x i16> %X to <2 x i64>
1298 ret <2 x i64> %Y
1299}
1300
1301define <4 x i32> @load_zext_4i16_to_4i32(<4 x i16> *%ptr) {
1302; SSE2-LABEL: load_zext_4i16_to_4i32:
1303; SSE2:       # %bb.0: # %entry
1304; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
1305; SSE2-NEXT:    pxor %xmm1, %xmm1
1306; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1307; SSE2-NEXT:    retq
1308;
1309; SSSE3-LABEL: load_zext_4i16_to_4i32:
1310; SSSE3:       # %bb.0: # %entry
1311; SSSE3-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
1312; SSSE3-NEXT:    pxor %xmm1, %xmm1
1313; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1314; SSSE3-NEXT:    retq
1315;
1316; SSE41-LABEL: load_zext_4i16_to_4i32:
1317; SSE41:       # %bb.0: # %entry
1318; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
1319; SSE41-NEXT:    retq
1320;
1321; AVX-LABEL: load_zext_4i16_to_4i32:
1322; AVX:       # %bb.0: # %entry
1323; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
1324; AVX-NEXT:    retq
1325entry:
1326 %X = load <4 x i16>, <4 x i16>* %ptr
1327 %Y = zext <4 x i16> %X to <4 x i32>
1328 ret <4 x i32> %Y
1329}
1330
1331define <4 x i64> @load_zext_4i16_to_4i64(<4 x i16> *%ptr) {
1332; SSE2-LABEL: load_zext_4i16_to_4i64:
1333; SSE2:       # %bb.0: # %entry
1334; SSE2-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
1335; SSE2-NEXT:    pxor %xmm2, %xmm2
1336; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1337; SSE2-NEXT:    movdqa %xmm1, %xmm0
1338; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1339; SSE2-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1340; SSE2-NEXT:    retq
1341;
1342; SSSE3-LABEL: load_zext_4i16_to_4i64:
1343; SSSE3:       # %bb.0: # %entry
1344; SSSE3-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
1345; SSSE3-NEXT:    pxor %xmm2, %xmm2
1346; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1347; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1348; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1349; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1350; SSSE3-NEXT:    retq
1351;
1352; SSE41-LABEL: load_zext_4i16_to_4i64:
1353; SSE41:       # %bb.0: # %entry
1354; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero
1355; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero
1356; SSE41-NEXT:    retq
1357;
1358; AVX1-LABEL: load_zext_4i16_to_4i64:
1359; AVX1:       # %bb.0: # %entry
1360; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero
1361; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero
1362; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1363; AVX1-NEXT:    retq
1364;
1365; AVX2-LABEL: load_zext_4i16_to_4i64:
1366; AVX2:       # %bb.0: # %entry
1367; AVX2-NEXT:    vpmovzxwq {{.*#+}} ymm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
1368; AVX2-NEXT:    retq
1369;
1370; AVX512-LABEL: load_zext_4i16_to_4i64:
1371; AVX512:       # %bb.0: # %entry
1372; AVX512-NEXT:    vpmovzxwq {{.*#+}} ymm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
1373; AVX512-NEXT:    retq
1374entry:
1375 %X = load <4 x i16>, <4 x i16>* %ptr
1376 %Y = zext <4 x i16> %X to <4 x i64>
1377 ret <4 x i64> %Y
1378}
1379
1380define <8 x i32> @load_zext_8i16_to_8i32(<8 x i16> *%ptr) {
1381; SSE2-LABEL: load_zext_8i16_to_8i32:
1382; SSE2:       # %bb.0: # %entry
1383; SSE2-NEXT:    movdqa (%rdi), %xmm1
1384; SSE2-NEXT:    pxor %xmm2, %xmm2
1385; SSE2-NEXT:    movdqa %xmm1, %xmm0
1386; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1387; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1388; SSE2-NEXT:    retq
1389;
1390; SSSE3-LABEL: load_zext_8i16_to_8i32:
1391; SSSE3:       # %bb.0: # %entry
1392; SSSE3-NEXT:    movdqa (%rdi), %xmm1
1393; SSSE3-NEXT:    pxor %xmm2, %xmm2
1394; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1395; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1396; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1397; SSSE3-NEXT:    retq
1398;
1399; SSE41-LABEL: load_zext_8i16_to_8i32:
1400; SSE41:       # %bb.0: # %entry
1401; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
1402; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
1403; SSE41-NEXT:    retq
1404;
1405; AVX1-LABEL: load_zext_8i16_to_8i32:
1406; AVX1:       # %bb.0: # %entry
1407; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
1408; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
1409; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1410; AVX1-NEXT:    retq
1411;
1412; AVX2-LABEL: load_zext_8i16_to_8i32:
1413; AVX2:       # %bb.0: # %entry
1414; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
1415; AVX2-NEXT:    retq
1416;
1417; AVX512-LABEL: load_zext_8i16_to_8i32:
1418; AVX512:       # %bb.0: # %entry
1419; AVX512-NEXT:    vpmovzxwd {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
1420; AVX512-NEXT:    retq
1421entry:
1422 %X = load <8 x i16>, <8 x i16>* %ptr
1423 %Y = zext <8 x i16> %X to <8 x i32>
1424 ret <8 x i32> %Y
1425}
1426
1427define <2 x i64> @load_zext_2i32_to_2i64(<2 x i32> *%ptr) {
1428; SSE2-LABEL: load_zext_2i32_to_2i64:
1429; SSE2:       # %bb.0: # %entry
1430; SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
1431; SSE2-NEXT:    xorps %xmm1, %xmm1
1432; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1433; SSE2-NEXT:    retq
1434;
1435; SSSE3-LABEL: load_zext_2i32_to_2i64:
1436; SSSE3:       # %bb.0: # %entry
1437; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
1438; SSSE3-NEXT:    xorps %xmm1, %xmm1
1439; SSSE3-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1440; SSSE3-NEXT:    retq
1441;
1442; SSE41-LABEL: load_zext_2i32_to_2i64:
1443; SSE41:       # %bb.0: # %entry
1444; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
1445; SSE41-NEXT:    retq
1446;
1447; AVX-LABEL: load_zext_2i32_to_2i64:
1448; AVX:       # %bb.0: # %entry
1449; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
1450; AVX-NEXT:    retq
1451entry:
1452 %X = load <2 x i32>, <2 x i32>* %ptr
1453 %Y = zext <2 x i32> %X to <2 x i64>
1454 ret <2 x i64> %Y
1455}
1456
1457define <4 x i64> @load_zext_4i32_to_4i64(<4 x i32> *%ptr) {
1458; SSE2-LABEL: load_zext_4i32_to_4i64:
1459; SSE2:       # %bb.0: # %entry
1460; SSE2-NEXT:    movaps (%rdi), %xmm1
1461; SSE2-NEXT:    xorps %xmm2, %xmm2
1462; SSE2-NEXT:    movaps %xmm1, %xmm0
1463; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1464; SSE2-NEXT:    unpckhps {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1465; SSE2-NEXT:    retq
1466;
1467; SSSE3-LABEL: load_zext_4i32_to_4i64:
1468; SSSE3:       # %bb.0: # %entry
1469; SSSE3-NEXT:    movaps (%rdi), %xmm1
1470; SSSE3-NEXT:    xorps %xmm2, %xmm2
1471; SSSE3-NEXT:    movaps %xmm1, %xmm0
1472; SSSE3-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1473; SSSE3-NEXT:    unpckhps {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1474; SSSE3-NEXT:    retq
1475;
1476; SSE41-LABEL: load_zext_4i32_to_4i64:
1477; SSE41:       # %bb.0: # %entry
1478; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
1479; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm1 = mem[0],zero,mem[1],zero
1480; SSE41-NEXT:    retq
1481;
1482; AVX1-LABEL: load_zext_4i32_to_4i64:
1483; AVX1:       # %bb.0: # %entry
1484; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
1485; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm1 = mem[0],zero,mem[1],zero
1486; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1487; AVX1-NEXT:    retq
1488;
1489; AVX2-LABEL: load_zext_4i32_to_4i64:
1490; AVX2:       # %bb.0: # %entry
1491; AVX2-NEXT:    vpmovzxdq {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
1492; AVX2-NEXT:    retq
1493;
1494; AVX512-LABEL: load_zext_4i32_to_4i64:
1495; AVX512:       # %bb.0: # %entry
1496; AVX512-NEXT:    vpmovzxdq {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
1497; AVX512-NEXT:    retq
1498entry:
1499 %X = load <4 x i32>, <4 x i32>* %ptr
1500 %Y = zext <4 x i32> %X to <4 x i64>
1501 ret <4 x i64> %Y
1502}
1503
1504define <8 x i32> @zext_8i8_to_8i32(<8 x i8> %z) {
1505; SSE2-LABEL: zext_8i8_to_8i32:
1506; SSE2:       # %bb.0: # %entry
1507; SSE2-NEXT:    movdqa %xmm0, %xmm1
1508; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
1509; SSE2-NEXT:    pxor %xmm2, %xmm2
1510; SSE2-NEXT:    movdqa %xmm1, %xmm0
1511; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1512; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1513; SSE2-NEXT:    retq
1514;
1515; SSSE3-LABEL: zext_8i8_to_8i32:
1516; SSSE3:       # %bb.0: # %entry
1517; SSSE3-NEXT:    movdqa %xmm0, %xmm1
1518; SSSE3-NEXT:    pand {{.*}}(%rip), %xmm1
1519; SSSE3-NEXT:    pxor %xmm2, %xmm2
1520; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1521; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1522; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1523; SSSE3-NEXT:    retq
1524;
1525; SSE41-LABEL: zext_8i8_to_8i32:
1526; SSE41:       # %bb.0: # %entry
1527; SSE41-NEXT:    movdqa %xmm0, %xmm1
1528; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
1529; SSE41-NEXT:    pxor %xmm2, %xmm2
1530; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
1531; SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1532; SSE41-NEXT:    retq
1533;
1534; AVX1-LABEL: zext_8i8_to_8i32:
1535; AVX1:       # %bb.0: # %entry
1536; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1537; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1538; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1539; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1540; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1541; AVX1-NEXT:    retq
1542;
1543; AVX2-LABEL: zext_8i8_to_8i32:
1544; AVX2:       # %bb.0: # %entry
1545; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1546; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1547; AVX2-NEXT:    retq
1548;
1549; AVX512-LABEL: zext_8i8_to_8i32:
1550; AVX512:       # %bb.0: # %entry
1551; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
1552; AVX512-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1553; AVX512-NEXT:    retq
1554entry:
1555  %t = zext <8 x i8> %z to <8 x i32>
1556  ret <8 x i32> %t
1557}
1558
1559define <8 x i32> @shuf_zext_8i16_to_8i32(<8 x i16> %A) nounwind uwtable readnone ssp {
1560; SSE2-LABEL: shuf_zext_8i16_to_8i32:
1561; SSE2:       # %bb.0: # %entry
1562; SSE2-NEXT:    movdqa %xmm0, %xmm1
1563; SSE2-NEXT:    pxor %xmm2, %xmm2
1564; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1565; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1566; SSE2-NEXT:    retq
1567;
1568; SSSE3-LABEL: shuf_zext_8i16_to_8i32:
1569; SSSE3:       # %bb.0: # %entry
1570; SSSE3-NEXT:    movdqa %xmm0, %xmm1
1571; SSSE3-NEXT:    pxor %xmm2, %xmm2
1572; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1573; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1574; SSSE3-NEXT:    retq
1575;
1576; SSE41-LABEL: shuf_zext_8i16_to_8i32:
1577; SSE41:       # %bb.0: # %entry
1578; SSE41-NEXT:    movdqa %xmm0, %xmm1
1579; SSE41-NEXT:    pxor %xmm2, %xmm2
1580; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1581; SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1582; SSE41-NEXT:    retq
1583;
1584; AVX1-LABEL: shuf_zext_8i16_to_8i32:
1585; AVX1:       # %bb.0: # %entry
1586; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1587; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1588; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1589; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1590; AVX1-NEXT:    retq
1591;
1592; AVX2-LABEL: shuf_zext_8i16_to_8i32:
1593; AVX2:       # %bb.0: # %entry
1594; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1595; AVX2-NEXT:    retq
1596;
1597; AVX512-LABEL: shuf_zext_8i16_to_8i32:
1598; AVX512:       # %bb.0: # %entry
1599; AVX512-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1600; AVX512-NEXT:    retq
1601entry:
1602  %B = shufflevector <8 x i16> %A, <8 x i16> zeroinitializer, <16 x i32> <i32 0, i32 8, i32 1, i32 8, i32 2, i32 8, i32 3, i32 8, i32 4, i32 8, i32 5, i32 8, i32 6, i32 8, i32 7, i32 8>
1603  %Z = bitcast <16 x i16> %B to <8 x i32>
1604  ret <8 x i32> %Z
1605}
1606
1607define <4 x i64> @shuf_zext_4i32_to_4i64(<4 x i32> %A) nounwind uwtable readnone ssp {
1608; SSE2-LABEL: shuf_zext_4i32_to_4i64:
1609; SSE2:       # %bb.0: # %entry
1610; SSE2-NEXT:    movaps %xmm0, %xmm1
1611; SSE2-NEXT:    xorps %xmm2, %xmm2
1612; SSE2-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1613; SSE2-NEXT:    unpckhps {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1614; SSE2-NEXT:    retq
1615;
1616; SSSE3-LABEL: shuf_zext_4i32_to_4i64:
1617; SSSE3:       # %bb.0: # %entry
1618; SSSE3-NEXT:    movaps %xmm0, %xmm1
1619; SSSE3-NEXT:    xorps %xmm2, %xmm2
1620; SSSE3-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1621; SSSE3-NEXT:    unpckhps {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1622; SSSE3-NEXT:    retq
1623;
1624; SSE41-LABEL: shuf_zext_4i32_to_4i64:
1625; SSE41:       # %bb.0: # %entry
1626; SSE41-NEXT:    movdqa %xmm0, %xmm1
1627; SSE41-NEXT:    pxor %xmm2, %xmm2
1628; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1629; SSE41-NEXT:    punpckhdq {{.*#+}} xmm1 = xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1630; SSE41-NEXT:    retq
1631;
1632; AVX1-LABEL: shuf_zext_4i32_to_4i64:
1633; AVX1:       # %bb.0: # %entry
1634; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1635; AVX1-NEXT:    vpunpckhdq {{.*#+}} xmm1 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1636; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1637; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1638; AVX1-NEXT:    retq
1639;
1640; AVX2-LABEL: shuf_zext_4i32_to_4i64:
1641; AVX2:       # %bb.0: # %entry
1642; AVX2-NEXT:    vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1643; AVX2-NEXT:    retq
1644;
1645; AVX512-LABEL: shuf_zext_4i32_to_4i64:
1646; AVX512:       # %bb.0: # %entry
1647; AVX512-NEXT:    vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1648; AVX512-NEXT:    retq
1649entry:
1650  %B = shufflevector <4 x i32> %A, <4 x i32> zeroinitializer, <8 x i32> <i32 0, i32 4, i32 1, i32 4, i32 2, i32 4, i32 3, i32 4>
1651  %Z = bitcast <8 x i32> %B to <4 x i64>
1652  ret <4 x i64> %Z
1653}
1654
1655define <8 x i32> @shuf_zext_8i8_to_8i32(<8 x i8> %A) {
1656; SSE2-LABEL: shuf_zext_8i8_to_8i32:
1657; SSE2:       # %bb.0: # %entry
1658; SSE2-NEXT:    movdqa %xmm0, %xmm1
1659; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
1660; SSE2-NEXT:    packuswb %xmm1, %xmm1
1661; SSE2-NEXT:    pxor %xmm2, %xmm2
1662; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1663; SSE2-NEXT:    movdqa %xmm1, %xmm0
1664; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1665; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1666; SSE2-NEXT:    retq
1667;
1668; SSSE3-LABEL: shuf_zext_8i8_to_8i32:
1669; SSSE3:       # %bb.0: # %entry
1670; SSSE3-NEXT:    movdqa %xmm0, %xmm1
1671; SSSE3-NEXT:    pand {{.*}}(%rip), %xmm1
1672; SSSE3-NEXT:    pxor %xmm2, %xmm2
1673; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1674; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1675; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1676; SSSE3-NEXT:    retq
1677;
1678; SSE41-LABEL: shuf_zext_8i8_to_8i32:
1679; SSE41:       # %bb.0: # %entry
1680; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
1681; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm2 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1682; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1683; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1684; SSE41-NEXT:    movdqa %xmm2, %xmm0
1685; SSE41-NEXT:    retq
1686;
1687; AVX1-LABEL: shuf_zext_8i8_to_8i32:
1688; AVX1:       # %bb.0: # %entry
1689; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
1690; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1691; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
1692; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1693; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1694; AVX1-NEXT:    retq
1695;
1696; AVX2-LABEL: shuf_zext_8i8_to_8i32:
1697; AVX2:       # %bb.0: # %entry
1698; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
1699; AVX2-NEXT:    vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
1700; AVX2-NEXT:    retq
1701;
1702; AVX512-LABEL: shuf_zext_8i8_to_8i32:
1703; AVX512:       # %bb.0: # %entry
1704; AVX512-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
1705; AVX512-NEXT:    vpmovzxbd {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
1706; AVX512-NEXT:    retq
1707entry:
1708  %B = shufflevector <8 x i8> %A, <8 x i8> zeroinitializer, <32 x i32> <i32 0, i32 8, i32 8, i32 8, i32 1, i32 8, i32 8, i32 8, i32 2, i32 8, i32 8, i32 8, i32 3, i32 8, i32 8, i32 8, i32 4, i32 8, i32 8, i32 8, i32 5, i32 8, i32 8, i32 8, i32 6, i32 8, i32 8, i32 8, i32 7, i32 8, i32 8, i32 8>
1709  %Z = bitcast <32 x i8> %B to <8 x i32>
1710  ret <8 x i32> %Z
1711}
1712
1713define <2 x i64> @shuf_zext_16i8_to_2i64_offset6(<16 x i8> %A) nounwind uwtable readnone ssp {
1714; SSE2-LABEL: shuf_zext_16i8_to_2i64_offset6:
1715; SSE2:       # %bb.0: # %entry
1716; SSE2-NEXT:    pxor %xmm1, %xmm1
1717; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1718; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
1719; SSE2-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1720; SSE2-NEXT:    retq
1721;
1722; SSSE3-LABEL: shuf_zext_16i8_to_2i64_offset6:
1723; SSSE3:       # %bb.0: # %entry
1724; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[6],zero,zero,zero,zero,zero,zero,zero,xmm0[7],zero,zero,zero,zero,zero,zero,zero
1725; SSSE3-NEXT:    retq
1726;
1727; SSE41-LABEL: shuf_zext_16i8_to_2i64_offset6:
1728; SSE41:       # %bb.0: # %entry
1729; SSE41-NEXT:    psrlq $48, %xmm0
1730; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1731; SSE41-NEXT:    retq
1732;
1733; AVX1-LABEL: shuf_zext_16i8_to_2i64_offset6:
1734; AVX1:       # %bb.0: # %entry
1735; AVX1-NEXT:    vpsrlq $48, %xmm0, %xmm0
1736; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1737; AVX1-NEXT:    retq
1738;
1739; AVX2-SLOW-LABEL: shuf_zext_16i8_to_2i64_offset6:
1740; AVX2-SLOW:       # %bb.0: # %entry
1741; AVX2-SLOW-NEXT:    vpsrlq $48, %xmm0, %xmm0
1742; AVX2-SLOW-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1743; AVX2-SLOW-NEXT:    retq
1744;
1745; AVX2-FAST-LABEL: shuf_zext_16i8_to_2i64_offset6:
1746; AVX2-FAST:       # %bb.0: # %entry
1747; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[6],zero,zero,zero,zero,zero,zero,zero,xmm0[7],zero,zero,zero,zero,zero,zero,zero
1748; AVX2-FAST-NEXT:    retq
1749;
1750; AVX512F-LABEL: shuf_zext_16i8_to_2i64_offset6:
1751; AVX512F:       # %bb.0: # %entry
1752; AVX512F-NEXT:    vpsrlq $48, %xmm0, %xmm0
1753; AVX512F-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1754; AVX512F-NEXT:    retq
1755;
1756; AVX512BW-LABEL: shuf_zext_16i8_to_2i64_offset6:
1757; AVX512BW:       # %bb.0: # %entry
1758; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[6],zero,zero,zero,zero,zero,zero,zero,xmm0[7],zero,zero,zero,zero,zero,zero,zero
1759; AVX512BW-NEXT:    retq
1760entry:
1761  %B = shufflevector <16 x i8> %A, <16 x i8> zeroinitializer, <16 x i32> <i32 6, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 7, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
1762  %Z = bitcast <16 x i8> %B to <2 x i64>
1763  ret <2 x i64> %Z
1764}
1765
1766define <4 x i64> @shuf_zext_16i8_to_4i64_offset11(<16 x i8> %A) nounwind uwtable readnone ssp {
1767; SSE2-LABEL: shuf_zext_16i8_to_4i64_offset11:
1768; SSE2:       # %bb.0: # %entry
1769; SSE2-NEXT:    movdqa %xmm0, %xmm1
1770; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
1771; SSE2-NEXT:    pxor %xmm2, %xmm2
1772; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]
1773; SSE2-NEXT:    movdqa %xmm1, %xmm0
1774; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1775; SSE2-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1776; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1777; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1778; SSE2-NEXT:    retq
1779;
1780; SSSE3-LABEL: shuf_zext_16i8_to_4i64_offset11:
1781; SSSE3:       # %bb.0: # %entry
1782; SSSE3-NEXT:    movdqa %xmm0, %xmm1
1783; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[11],zero,zero,zero,zero,zero,zero,zero,xmm0[12],zero,zero,zero,zero,zero,zero,zero
1784; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[13],zero,zero,zero,zero,zero,zero,zero,xmm1[14],zero,zero,zero,zero,zero,zero,zero
1785; SSSE3-NEXT:    retq
1786;
1787; SSE41-LABEL: shuf_zext_16i8_to_4i64_offset11:
1788; SSE41:       # %bb.0: # %entry
1789; SSE41-NEXT:    movdqa %xmm0, %xmm1
1790; SSE41-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1791; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
1792; SSE41-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1793; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1794; SSE41-NEXT:    movdqa %xmm2, %xmm0
1795; SSE41-NEXT:    retq
1796;
1797; AVX1-LABEL: shuf_zext_16i8_to_4i64_offset11:
1798; AVX1:       # %bb.0: # %entry
1799; AVX1-NEXT:    vpsrldq {{.*#+}} xmm1 = xmm0[11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1800; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,zero,zero,zero,zero,xmm1[1],zero,zero,zero,zero,zero,zero,zero
1801; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1802; AVX1-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
1803; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1804; AVX1-NEXT:    retq
1805;
1806; AVX2-LABEL: shuf_zext_16i8_to_4i64_offset11:
1807; AVX2:       # %bb.0: # %entry
1808; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1809; AVX2-NEXT:    vpmovzxbq {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero,xmm0[2],zero,zero,zero,zero,zero,zero,zero,xmm0[3],zero,zero,zero,zero,zero,zero,zero
1810; AVX2-NEXT:    retq
1811;
1812; AVX512-LABEL: shuf_zext_16i8_to_4i64_offset11:
1813; AVX512:       # %bb.0: # %entry
1814; AVX512-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1815; AVX512-NEXT:    vpmovzxbq {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero,xmm0[2],zero,zero,zero,zero,zero,zero,zero,xmm0[3],zero,zero,zero,zero,zero,zero,zero
1816; AVX512-NEXT:    retq
1817entry:
1818  %B = shufflevector <16 x i8> %A, <16 x i8> zeroinitializer, <32 x i32> <i32 11, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 12, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 13, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 14, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
1819  %Z = bitcast <32 x i8> %B to <4 x i64>
1820  ret <4 x i64> %Z
1821}
1822
1823define <2 x i64> @shuf_zext_8i16_to_2i64_offset6(<8 x i16> %A) nounwind uwtable readnone ssp {
1824; SSE2-LABEL: shuf_zext_8i16_to_2i64_offset6:
1825; SSE2:       # %bb.0: # %entry
1826; SSE2-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
1827; SSE2-NEXT:    pxor %xmm1, %xmm1
1828; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1829; SSE2-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1830; SSE2-NEXT:    retq
1831;
1832; SSSE3-LABEL: shuf_zext_8i16_to_2i64_offset6:
1833; SSSE3:       # %bb.0: # %entry
1834; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[6,7],zero,zero,zero,zero,zero,zero,xmm0[8,9],zero,zero,zero,zero,zero,zero
1835; SSSE3-NEXT:    retq
1836;
1837; SSE41-LABEL: shuf_zext_8i16_to_2i64_offset6:
1838; SSE41:       # %bb.0: # %entry
1839; SSE41-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
1840; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
1841; SSE41-NEXT:    retq
1842;
1843; AVX1-LABEL: shuf_zext_8i16_to_2i64_offset6:
1844; AVX1:       # %bb.0: # %entry
1845; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
1846; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
1847; AVX1-NEXT:    retq
1848;
1849; AVX2-SLOW-LABEL: shuf_zext_8i16_to_2i64_offset6:
1850; AVX2-SLOW:       # %bb.0: # %entry
1851; AVX2-SLOW-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
1852; AVX2-SLOW-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
1853; AVX2-SLOW-NEXT:    retq
1854;
1855; AVX2-FAST-LABEL: shuf_zext_8i16_to_2i64_offset6:
1856; AVX2-FAST:       # %bb.0: # %entry
1857; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[6,7],zero,zero,zero,zero,zero,zero,xmm0[8,9],zero,zero,zero,zero,zero,zero
1858; AVX2-FAST-NEXT:    retq
1859;
1860; AVX512F-LABEL: shuf_zext_8i16_to_2i64_offset6:
1861; AVX512F:       # %bb.0: # %entry
1862; AVX512F-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
1863; AVX512F-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
1864; AVX512F-NEXT:    retq
1865;
1866; AVX512BW-LABEL: shuf_zext_8i16_to_2i64_offset6:
1867; AVX512BW:       # %bb.0: # %entry
1868; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[6,7],zero,zero,zero,zero,zero,zero,xmm0[8,9],zero,zero,zero,zero,zero,zero
1869; AVX512BW-NEXT:    retq
1870entry:
1871  %B = shufflevector <8 x i16> %A, <8 x i16> zeroinitializer, <8 x i32> <i32 3, i32 8, i32 8, i32 8, i32 4, i32 8, i32 8, i32 8>
1872  %Z = bitcast <8 x i16> %B to <2 x i64>
1873  ret <2 x i64> %Z
1874}
1875
1876define <4 x i64> @shuf_zext_8i16_to_4i64_offset2(<8 x i16> %A) nounwind uwtable readnone ssp {
1877; SSE2-LABEL: shuf_zext_8i16_to_4i64_offset2:
1878; SSE2:       # %bb.0: # %entry
1879; SSE2-NEXT:    movdqa %xmm0, %xmm1
1880; SSE2-NEXT:    pxor %xmm2, %xmm2
1881; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1882; SSE2-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1883; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1884; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1885; SSE2-NEXT:    retq
1886;
1887; SSSE3-LABEL: shuf_zext_8i16_to_4i64_offset2:
1888; SSSE3:       # %bb.0: # %entry
1889; SSSE3-NEXT:    movdqa %xmm0, %xmm1
1890; SSSE3-NEXT:    pxor %xmm2, %xmm2
1891; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1892; SSSE3-NEXT:    punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1893; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
1894; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1895; SSSE3-NEXT:    retq
1896;
1897; SSE41-LABEL: shuf_zext_8i16_to_4i64_offset2:
1898; SSE41:       # %bb.0: # %entry
1899; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1900; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm2 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
1901; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1902; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
1903; SSE41-NEXT:    movdqa %xmm2, %xmm0
1904; SSE41-NEXT:    retq
1905;
1906; AVX1-LABEL: shuf_zext_8i16_to_4i64_offset2:
1907; AVX1:       # %bb.0: # %entry
1908; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1909; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
1910; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1911; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
1912; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1913; AVX1-NEXT:    retq
1914;
1915; AVX2-LABEL: shuf_zext_8i16_to_4i64_offset2:
1916; AVX2:       # %bb.0: # %entry
1917; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,2,2,3]
1918; AVX2-NEXT:    vpmovzxwq {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1919; AVX2-NEXT:    retq
1920;
1921; AVX512-LABEL: shuf_zext_8i16_to_4i64_offset2:
1922; AVX512:       # %bb.0: # %entry
1923; AVX512-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,2,2,3]
1924; AVX512-NEXT:    vpmovzxwq {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1925; AVX512-NEXT:    retq
1926entry:
1927  %B = shufflevector <8 x i16> %A, <8 x i16> zeroinitializer, <16 x i32> <i32 2, i32 8, i32 8, i32 8, i32 3, i32 8, i32 8, i32 8, i32 4, i32 8, i32 8, i32 8, i32 5, i32 8, i32 8, i32 8>
1928  %Z = bitcast <16 x i16> %B to <4 x i64>
1929  ret <4 x i64> %Z
1930}
1931
1932define <4 x i32> @shuf_zext_8i16_to_4i32_offset1(<8 x i16> %A) nounwind uwtable readnone ssp {
1933; SSE2-LABEL: shuf_zext_8i16_to_4i32_offset1:
1934; SSE2:       # %bb.0: # %entry
1935; SSE2-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
1936; SSE2-NEXT:    pxor %xmm1, %xmm1
1937; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1938; SSE2-NEXT:    retq
1939;
1940; SSSE3-LABEL: shuf_zext_8i16_to_4i32_offset1:
1941; SSSE3:       # %bb.0: # %entry
1942; SSSE3-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
1943; SSSE3-NEXT:    pxor %xmm1, %xmm1
1944; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1945; SSSE3-NEXT:    retq
1946;
1947; SSE41-LABEL: shuf_zext_8i16_to_4i32_offset1:
1948; SSE41:       # %bb.0: # %entry
1949; SSE41-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
1950; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1951; SSE41-NEXT:    retq
1952;
1953; AVX1-LABEL: shuf_zext_8i16_to_4i32_offset1:
1954; AVX1:       # %bb.0: # %entry
1955; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
1956; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1957; AVX1-NEXT:    retq
1958;
1959; AVX2-SLOW-LABEL: shuf_zext_8i16_to_4i32_offset1:
1960; AVX2-SLOW:       # %bb.0: # %entry
1961; AVX2-SLOW-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
1962; AVX2-SLOW-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1963; AVX2-SLOW-NEXT:    retq
1964;
1965; AVX2-FAST-LABEL: shuf_zext_8i16_to_4i32_offset1:
1966; AVX2-FAST:       # %bb.0: # %entry
1967; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[2,3],zero,zero,xmm0[4,5],zero,zero,xmm0[6,7],zero,zero,xmm0[8,9],zero,zero
1968; AVX2-FAST-NEXT:    retq
1969;
1970; AVX512F-LABEL: shuf_zext_8i16_to_4i32_offset1:
1971; AVX512F:       # %bb.0: # %entry
1972; AVX512F-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
1973; AVX512F-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1974; AVX512F-NEXT:    retq
1975;
1976; AVX512BW-LABEL: shuf_zext_8i16_to_4i32_offset1:
1977; AVX512BW:       # %bb.0: # %entry
1978; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[2,3],zero,zero,xmm0[4,5],zero,zero,xmm0[6,7],zero,zero,xmm0[8,9],zero,zero
1979; AVX512BW-NEXT:    retq
1980entry:
1981  %B = shufflevector <8 x i16> %A, <8 x i16> zeroinitializer, <8 x i32> <i32 1, i32 8, i32 2, i32 8, i32 3, i32 8, i32 4, i32 8>
1982  %Z = bitcast <8 x i16> %B to <4 x i32>
1983  ret <4 x i32> %Z
1984}
1985
1986define <8 x i32> @shuf_zext_8i16_to_8i32_offset3(<8 x i16> %A) nounwind uwtable readnone ssp {
1987; SSE2-LABEL: shuf_zext_8i16_to_8i32_offset3:
1988; SSE2:       # %bb.0: # %entry
1989; SSE2-NEXT:    movdqa %xmm0, %xmm1
1990; SSE2-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
1991; SSE2-NEXT:    pxor %xmm2, %xmm2
1992; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1993; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1994; SSE2-NEXT:    retq
1995;
1996; SSSE3-LABEL: shuf_zext_8i16_to_8i32_offset3:
1997; SSSE3:       # %bb.0: # %entry
1998; SSSE3-NEXT:    movdqa %xmm0, %xmm1
1999; SSSE3-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
2000; SSSE3-NEXT:    pxor %xmm2, %xmm2
2001; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
2002; SSSE3-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
2003; SSSE3-NEXT:    retq
2004;
2005; SSE41-LABEL: shuf_zext_8i16_to_8i32_offset3:
2006; SSE41:       # %bb.0: # %entry
2007; SSE41-NEXT:    movdqa %xmm0, %xmm1
2008; SSE41-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
2009; SSE41-NEXT:    pxor %xmm2, %xmm2
2010; SSE41-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
2011; SSE41-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
2012; SSE41-NEXT:    retq
2013;
2014; AVX1-LABEL: shuf_zext_8i16_to_8i32_offset3:
2015; AVX1:       # %bb.0: # %entry
2016; AVX1-NEXT:    vpslldq {{.*#+}} xmm1 = zero,zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13]
2017; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2018; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
2019; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
2020; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2021; AVX1-NEXT:    retq
2022;
2023; AVX2-LABEL: shuf_zext_8i16_to_8i32_offset3:
2024; AVX2:       # %bb.0: # %entry
2025; AVX2-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
2026; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2027; AVX2-NEXT:    retq
2028;
2029; AVX512-LABEL: shuf_zext_8i16_to_8i32_offset3:
2030; AVX512:       # %bb.0: # %entry
2031; AVX512-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
2032; AVX512-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2033; AVX512-NEXT:    retq
2034entry:
2035  %B = shufflevector <8 x i16> %A, <8 x i16> zeroinitializer, <16 x i32> <i32 3, i32 8, i32 4, i32 8, i32 5, i32 8, i32 6, i32 8, i32 7, i32 8, i32 undef, i32 8, i32 undef, i32 8, i32 undef, i32 8>
2036  %Z = bitcast <16 x i16> %B to <8 x i32>
2037  ret <8 x i32> %Z
2038}
2039
2040define <8 x i32> @shuf_zext_16i16_to_8i32_offset8(<16 x i16> %A) nounwind uwtable readnone ssp {
2041; SSE2-LABEL: shuf_zext_16i16_to_8i32_offset8:
2042; SSE2:       # %bb.0: # %entry
2043; SSE2-NEXT:    pxor %xmm2, %xmm2
2044; SSE2-NEXT:    movdqa %xmm1, %xmm0
2045; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
2046; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
2047; SSE2-NEXT:    retq
2048;
2049; SSSE3-LABEL: shuf_zext_16i16_to_8i32_offset8:
2050; SSSE3:       # %bb.0: # %entry
2051; SSSE3-NEXT:    pxor %xmm2, %xmm2
2052; SSSE3-NEXT:    movdqa %xmm1, %xmm0
2053; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
2054; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
2055; SSSE3-NEXT:    retq
2056;
2057; SSE41-LABEL: shuf_zext_16i16_to_8i32_offset8:
2058; SSE41:       # %bb.0: # %entry
2059; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,2,3,3]
2060; SSE41-NEXT:    pxor %xmm2, %xmm2
2061; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3],xmm0[4],xmm2[5,6,7]
2062; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero
2063; SSE41-NEXT:    movdqa %xmm2, %xmm1
2064; SSE41-NEXT:    retq
2065;
2066; AVX1-LABEL: shuf_zext_16i16_to_8i32_offset8:
2067; AVX1:       # %bb.0: # %entry
2068; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2069; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,2,3,3]
2070; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2071; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3],xmm1[4],xmm2[5,6,7]
2072; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2073; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2074; AVX1-NEXT:    retq
2075;
2076; AVX2-LABEL: shuf_zext_16i16_to_8i32_offset8:
2077; AVX2:       # %bb.0: # %entry
2078; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
2079; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2080; AVX2-NEXT:    retq
2081;
2082; AVX512-LABEL: shuf_zext_16i16_to_8i32_offset8:
2083; AVX512:       # %bb.0: # %entry
2084; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm0
2085; AVX512-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2086; AVX512-NEXT:    retq
2087entry:
2088  %B = shufflevector <16 x i16> %A, <16 x i16> zeroinitializer, <16 x i32> <i32 8, i32 16, i32 9, i32 16, i32 10, i32 16, i32 11, i32 16, i32 12, i32 16, i32 undef, i32 16, i32 14, i32 16, i32 undef, i32 16>
2089  %Z = bitcast <16 x i16> %B to <8 x i32>
2090  ret <8 x i32> %Z
2091}
2092
2093define <2 x i64> @shuf_zext_4i32_to_2i64_offset2(<4 x i32> %A) nounwind uwtable readnone ssp {
2094; SSE-LABEL: shuf_zext_4i32_to_2i64_offset2:
2095; SSE:       # %bb.0: # %entry
2096; SSE-NEXT:    xorps %xmm1, %xmm1
2097; SSE-NEXT:    unpckhps {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2098; SSE-NEXT:    retq
2099;
2100; AVX-LABEL: shuf_zext_4i32_to_2i64_offset2:
2101; AVX:       # %bb.0: # %entry
2102; AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm1
2103; AVX-NEXT:    vunpckhps {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2104; AVX-NEXT:    retq
2105entry:
2106  %B = shufflevector <4 x i32> %A, <4 x i32> zeroinitializer, <4 x i32> <i32 2, i32 4, i32 3, i32 4>
2107  %Z = bitcast <4 x i32> %B to <2 x i64>
2108  ret <2 x i64> %Z
2109}
2110
2111define <4 x i64> @shuf_zext_4i32_to_4i64_offset1(<4 x i32> %A) nounwind uwtable readnone ssp {
2112; SSE2-LABEL: shuf_zext_4i32_to_4i64_offset1:
2113; SSE2:       # %bb.0: # %entry
2114; SSE2-NEXT:    movdqa %xmm0, %xmm1
2115; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [0,0,4294967295,0]
2116; SSE2-NEXT:    pand %xmm1, %xmm0
2117; SSE2-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
2118; SSE2-NEXT:    retq
2119;
2120; SSSE3-LABEL: shuf_zext_4i32_to_4i64_offset1:
2121; SSSE3:       # %bb.0: # %entry
2122; SSSE3-NEXT:    movdqa %xmm0, %xmm1
2123; SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [0,0,4294967295,0]
2124; SSSE3-NEXT:    pand %xmm1, %xmm0
2125; SSSE3-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
2126; SSSE3-NEXT:    retq
2127;
2128; SSE41-LABEL: shuf_zext_4i32_to_4i64_offset1:
2129; SSE41:       # %bb.0: # %entry
2130; SSE41-NEXT:    movdqa %xmm0, %xmm1
2131; SSE41-NEXT:    pxor %xmm0, %xmm0
2132; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5],xmm0[6,7]
2133; SSE41-NEXT:    psrldq {{.*#+}} xmm1 = xmm1[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
2134; SSE41-NEXT:    retq
2135;
2136; AVX1-LABEL: shuf_zext_4i32_to_4i64_offset1:
2137; AVX1:       # %bb.0: # %entry
2138; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2139; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2,3],xmm0[4,5],xmm1[6,7]
2140; AVX1-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
2141; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2142; AVX1-NEXT:    retq
2143;
2144; AVX2-LABEL: shuf_zext_4i32_to_4i64_offset1:
2145; AVX2:       # %bb.0: # %entry
2146; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,2,3,3]
2147; AVX2-NEXT:    vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2148; AVX2-NEXT:    retq
2149;
2150; AVX512-LABEL: shuf_zext_4i32_to_4i64_offset1:
2151; AVX512:       # %bb.0: # %entry
2152; AVX512-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,2,3,3]
2153; AVX512-NEXT:    vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
2154; AVX512-NEXT:    retq
2155entry:
2156  %B = shufflevector <4 x i32> %A, <4 x i32> zeroinitializer, <8 x i32> <i32 undef, i32 4, i32 2, i32 4, i32 3, i32 4, i32 undef, i32 4>
2157  %Z = bitcast <8 x i32> %B to <4 x i64>
2158  ret <4 x i64> %Z
2159}
2160
2161define <32 x i32> @zext_32i8_to_32i32(<32 x i8> %x) {
2162; SSE2-LABEL: zext_32i8_to_32i32:
2163; SSE2:       # %bb.0:
2164; SSE2-NEXT:    movq %rdi, %rax
2165; SSE2-NEXT:    pxor %xmm2, %xmm2
2166; SSE2-NEXT:    movdqa %xmm0, %xmm3
2167; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
2168; SSE2-NEXT:    movdqa %xmm3, %xmm8
2169; SSE2-NEXT:    punpcklwd {{.*#+}} xmm8 = xmm8[0],xmm2[0],xmm8[1],xmm2[1],xmm8[2],xmm2[2],xmm8[3],xmm2[3]
2170; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
2171; SSE2-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm2[8],xmm0[9],xmm2[9],xmm0[10],xmm2[10],xmm0[11],xmm2[11],xmm0[12],xmm2[12],xmm0[13],xmm2[13],xmm0[14],xmm2[14],xmm0[15],xmm2[15]
2172; SSE2-NEXT:    movdqa %xmm0, %xmm5
2173; SSE2-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1],xmm5[2],xmm2[2],xmm5[3],xmm2[3]
2174; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
2175; SSE2-NEXT:    movdqa %xmm1, %xmm6
2176; SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm2[0],xmm6[1],xmm2[1],xmm6[2],xmm2[2],xmm6[3],xmm2[3],xmm6[4],xmm2[4],xmm6[5],xmm2[5],xmm6[6],xmm2[6],xmm6[7],xmm2[7]
2177; SSE2-NEXT:    movdqa %xmm6, %xmm7
2178; SSE2-NEXT:    punpcklwd {{.*#+}} xmm7 = xmm7[0],xmm2[0],xmm7[1],xmm2[1],xmm7[2],xmm2[2],xmm7[3],xmm2[3]
2179; SSE2-NEXT:    punpckhwd {{.*#+}} xmm6 = xmm6[4],xmm2[4],xmm6[5],xmm2[5],xmm6[6],xmm2[6],xmm6[7],xmm2[7]
2180; SSE2-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]
2181; SSE2-NEXT:    movdqa %xmm1, %xmm4
2182; SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3]
2183; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
2184; SSE2-NEXT:    movdqa %xmm1, 112(%rdi)
2185; SSE2-NEXT:    movdqa %xmm4, 96(%rdi)
2186; SSE2-NEXT:    movdqa %xmm6, 80(%rdi)
2187; SSE2-NEXT:    movdqa %xmm7, 64(%rdi)
2188; SSE2-NEXT:    movdqa %xmm0, 48(%rdi)
2189; SSE2-NEXT:    movdqa %xmm5, 32(%rdi)
2190; SSE2-NEXT:    movdqa %xmm3, 16(%rdi)
2191; SSE2-NEXT:    movdqa %xmm8, (%rdi)
2192; SSE2-NEXT:    retq
2193;
2194; SSSE3-LABEL: zext_32i8_to_32i32:
2195; SSSE3:       # %bb.0:
2196; SSSE3-NEXT:    movq %rdi, %rax
2197; SSSE3-NEXT:    pxor %xmm2, %xmm2
2198; SSSE3-NEXT:    movdqa %xmm0, %xmm3
2199; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
2200; SSSE3-NEXT:    movdqa %xmm3, %xmm8
2201; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm8 = xmm8[0],xmm2[0],xmm8[1],xmm2[1],xmm8[2],xmm2[2],xmm8[3],xmm2[3]
2202; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
2203; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm2[8],xmm0[9],xmm2[9],xmm0[10],xmm2[10],xmm0[11],xmm2[11],xmm0[12],xmm2[12],xmm0[13],xmm2[13],xmm0[14],xmm2[14],xmm0[15],xmm2[15]
2204; SSSE3-NEXT:    movdqa %xmm0, %xmm5
2205; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1],xmm5[2],xmm2[2],xmm5[3],xmm2[3]
2206; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
2207; SSSE3-NEXT:    movdqa %xmm1, %xmm6
2208; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm2[0],xmm6[1],xmm2[1],xmm6[2],xmm2[2],xmm6[3],xmm2[3],xmm6[4],xmm2[4],xmm6[5],xmm2[5],xmm6[6],xmm2[6],xmm6[7],xmm2[7]
2209; SSSE3-NEXT:    movdqa %xmm6, %xmm7
2210; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm7 = xmm7[0],xmm2[0],xmm7[1],xmm2[1],xmm7[2],xmm2[2],xmm7[3],xmm2[3]
2211; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm6 = xmm6[4],xmm2[4],xmm6[5],xmm2[5],xmm6[6],xmm2[6],xmm6[7],xmm2[7]
2212; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm2[8],xmm1[9],xmm2[9],xmm1[10],xmm2[10],xmm1[11],xmm2[11],xmm1[12],xmm2[12],xmm1[13],xmm2[13],xmm1[14],xmm2[14],xmm1[15],xmm2[15]
2213; SSSE3-NEXT:    movdqa %xmm1, %xmm4
2214; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3]
2215; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
2216; SSSE3-NEXT:    movdqa %xmm1, 112(%rdi)
2217; SSSE3-NEXT:    movdqa %xmm4, 96(%rdi)
2218; SSSE3-NEXT:    movdqa %xmm6, 80(%rdi)
2219; SSSE3-NEXT:    movdqa %xmm7, 64(%rdi)
2220; SSSE3-NEXT:    movdqa %xmm0, 48(%rdi)
2221; SSSE3-NEXT:    movdqa %xmm5, 32(%rdi)
2222; SSSE3-NEXT:    movdqa %xmm3, 16(%rdi)
2223; SSSE3-NEXT:    movdqa %xmm8, (%rdi)
2224; SSSE3-NEXT:    retq
2225;
2226; SSE41-LABEL: zext_32i8_to_32i32:
2227; SSE41:       # %bb.0:
2228; SSE41-NEXT:    movq %rdi, %rax
2229; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm2 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2230; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,2,3]
2231; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
2232; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[2,3,0,1]
2233; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero,xmm4[2],zero,zero,zero,xmm4[3],zero,zero,zero
2234; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
2235; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2236; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm5 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
2237; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,2,3]
2238; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm6 = xmm6[0],zero,zero,zero,xmm6[1],zero,zero,zero,xmm6[2],zero,zero,zero,xmm6[3],zero,zero,zero
2239; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[2,3,0,1]
2240; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm7 = xmm7[0],zero,zero,zero,xmm7[1],zero,zero,zero,xmm7[2],zero,zero,zero,xmm7[3],zero,zero,zero
2241; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[3,1,2,3]
2242; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
2243; SSE41-NEXT:    movdqa %xmm1, 112(%rdi)
2244; SSE41-NEXT:    movdqa %xmm7, 96(%rdi)
2245; SSE41-NEXT:    movdqa %xmm6, 80(%rdi)
2246; SSE41-NEXT:    movdqa %xmm5, 64(%rdi)
2247; SSE41-NEXT:    movdqa %xmm0, 48(%rdi)
2248; SSE41-NEXT:    movdqa %xmm4, 32(%rdi)
2249; SSE41-NEXT:    movdqa %xmm3, 16(%rdi)
2250; SSE41-NEXT:    movdqa %xmm2, (%rdi)
2251; SSE41-NEXT:    retq
2252;
2253; AVX1-LABEL: zext_32i8_to_32i32:
2254; AVX1:       # %bb.0:
2255; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2256; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
2257; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
2258; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm4
2259; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2260; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
2261; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm3[1,1,2,3]
2262; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
2263; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm2
2264; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2265; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
2266; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[3,3,0,1]
2267; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2268; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm1
2269; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm3[2,3,0,1]
2270; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2271; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[3,3,0,1]
2272; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
2273; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm3
2274; AVX1-NEXT:    vmovaps %ymm4, %ymm0
2275; AVX1-NEXT:    retq
2276;
2277; AVX2-LABEL: zext_32i8_to_32i32:
2278; AVX2:       # %bb.0:
2279; AVX2-NEXT:    vpmovzxbd {{.*#+}} ymm4 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
2280; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2281; AVX2-NEXT:    vpmovzxbd {{.*#+}} ymm2 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero
2282; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
2283; AVX2-NEXT:    vpmovzxbd {{.*#+}} ymm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero
2284; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[3,1,2,3]
2285; AVX2-NEXT:    vpmovzxbd {{.*#+}} ymm3 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
2286; AVX2-NEXT:    vmovdqa %ymm4, %ymm0
2287; AVX2-NEXT:    retq
2288;
2289; AVX512-LABEL: zext_32i8_to_32i32:
2290; AVX512:       # %bb.0:
2291; AVX512-NEXT:    vpmovzxbd {{.*#+}} zmm2 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
2292; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm0
2293; AVX512-NEXT:    vpmovzxbd {{.*#+}} zmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
2294; AVX512-NEXT:    vmovdqa64 %zmm2, %zmm0
2295; AVX512-NEXT:    retq
2296  %res = zext <32 x i8>%x to <32 x i32>
2297  ret <32 x i32> %res
2298}
2299
2300define <2 x i32> @zext_2i8_to_2i32(<2 x i8>* %addr) {
2301; SSE2-LABEL: zext_2i8_to_2i32:
2302; SSE2:       # %bb.0:
2303; SSE2-NEXT:    movzwl (%rdi), %eax
2304; SSE2-NEXT:    movd %eax, %xmm0
2305; SSE2-NEXT:    pxor %xmm1, %xmm1
2306; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
2307; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2308; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
2309; SSE2-NEXT:    paddq %xmm0, %xmm0
2310; SSE2-NEXT:    retq
2311;
2312; SSSE3-LABEL: zext_2i8_to_2i32:
2313; SSSE3:       # %bb.0:
2314; SSSE3-NEXT:    movzwl (%rdi), %eax
2315; SSSE3-NEXT:    movd %eax, %xmm0
2316; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[3],zero,zero,zero
2317; SSSE3-NEXT:    paddq %xmm0, %xmm0
2318; SSSE3-NEXT:    retq
2319;
2320; SSE41-LABEL: zext_2i8_to_2i32:
2321; SSE41:       # %bb.0:
2322; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
2323; SSE41-NEXT:    paddq %xmm0, %xmm0
2324; SSE41-NEXT:    retq
2325;
2326; AVX-LABEL: zext_2i8_to_2i32:
2327; AVX:       # %bb.0:
2328; AVX-NEXT:    vpmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
2329; AVX-NEXT:    vpaddq %xmm0, %xmm0, %xmm0
2330; AVX-NEXT:    retq
2331  %x = load <2 x i8>, <2 x i8>* %addr, align 1
2332  %y = zext <2 x i8> %x to <2 x i32>
2333  %z = add <2 x i32>%y, %y
2334  ret <2 x i32>%z
2335}
2336
2337define <4 x i32> @zext_4i17_to_4i32(<4 x i17>* %ptr) {
2338; SSE2-LABEL: zext_4i17_to_4i32:
2339; SSE2:       # %bb.0:
2340; SSE2-NEXT:    movq (%rdi), %rax
2341; SSE2-NEXT:    movd %eax, %xmm0
2342; SSE2-NEXT:    movq %rax, %rcx
2343; SSE2-NEXT:    shrq $17, %rcx
2344; SSE2-NEXT:    movd %ecx, %xmm1
2345; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2346; SSE2-NEXT:    movl 8(%rdi), %ecx
2347; SSE2-NEXT:    shll $13, %ecx
2348; SSE2-NEXT:    movq %rax, %rdx
2349; SSE2-NEXT:    shrq $51, %rdx
2350; SSE2-NEXT:    orl %ecx, %edx
2351; SSE2-NEXT:    movd %edx, %xmm1
2352; SSE2-NEXT:    shrq $34, %rax
2353; SSE2-NEXT:    movd %eax, %xmm2
2354; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
2355; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
2356; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
2357; SSE2-NEXT:    retq
2358;
2359; SSSE3-LABEL: zext_4i17_to_4i32:
2360; SSSE3:       # %bb.0:
2361; SSSE3-NEXT:    movq (%rdi), %rax
2362; SSSE3-NEXT:    movd %eax, %xmm0
2363; SSSE3-NEXT:    movq %rax, %rcx
2364; SSSE3-NEXT:    shrq $17, %rcx
2365; SSSE3-NEXT:    movd %ecx, %xmm1
2366; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2367; SSSE3-NEXT:    movl 8(%rdi), %ecx
2368; SSSE3-NEXT:    shll $13, %ecx
2369; SSSE3-NEXT:    movq %rax, %rdx
2370; SSSE3-NEXT:    shrq $51, %rdx
2371; SSSE3-NEXT:    orl %ecx, %edx
2372; SSSE3-NEXT:    movd %edx, %xmm1
2373; SSSE3-NEXT:    shrq $34, %rax
2374; SSSE3-NEXT:    movd %eax, %xmm2
2375; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
2376; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
2377; SSSE3-NEXT:    pand {{.*}}(%rip), %xmm0
2378; SSSE3-NEXT:    retq
2379;
2380; SSE41-LABEL: zext_4i17_to_4i32:
2381; SSE41:       # %bb.0:
2382; SSE41-NEXT:    movl 8(%rdi), %eax
2383; SSE41-NEXT:    shll $13, %eax
2384; SSE41-NEXT:    movq (%rdi), %rcx
2385; SSE41-NEXT:    movq %rcx, %rdx
2386; SSE41-NEXT:    shrq $51, %rdx
2387; SSE41-NEXT:    orl %eax, %edx
2388; SSE41-NEXT:    movq %rcx, %rax
2389; SSE41-NEXT:    shrq $17, %rax
2390; SSE41-NEXT:    movd %ecx, %xmm0
2391; SSE41-NEXT:    pinsrd $1, %eax, %xmm0
2392; SSE41-NEXT:    shrq $34, %rcx
2393; SSE41-NEXT:    pinsrd $2, %ecx, %xmm0
2394; SSE41-NEXT:    pinsrd $3, %edx, %xmm0
2395; SSE41-NEXT:    pand {{.*}}(%rip), %xmm0
2396; SSE41-NEXT:    retq
2397;
2398; AVX1-LABEL: zext_4i17_to_4i32:
2399; AVX1:       # %bb.0:
2400; AVX1-NEXT:    movl 8(%rdi), %eax
2401; AVX1-NEXT:    shll $13, %eax
2402; AVX1-NEXT:    movq (%rdi), %rcx
2403; AVX1-NEXT:    movq %rcx, %rdx
2404; AVX1-NEXT:    shrq $51, %rdx
2405; AVX1-NEXT:    orl %eax, %edx
2406; AVX1-NEXT:    movq %rcx, %rax
2407; AVX1-NEXT:    shrq $17, %rax
2408; AVX1-NEXT:    vmovd %ecx, %xmm0
2409; AVX1-NEXT:    vpinsrd $1, %eax, %xmm0, %xmm0
2410; AVX1-NEXT:    shrq $34, %rcx
2411; AVX1-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
2412; AVX1-NEXT:    vpinsrd $3, %edx, %xmm0, %xmm0
2413; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
2414; AVX1-NEXT:    retq
2415;
2416; AVX2-LABEL: zext_4i17_to_4i32:
2417; AVX2:       # %bb.0:
2418; AVX2-NEXT:    movl 8(%rdi), %eax
2419; AVX2-NEXT:    shll $13, %eax
2420; AVX2-NEXT:    movq (%rdi), %rcx
2421; AVX2-NEXT:    movq %rcx, %rdx
2422; AVX2-NEXT:    shrq $51, %rdx
2423; AVX2-NEXT:    orl %eax, %edx
2424; AVX2-NEXT:    movq %rcx, %rax
2425; AVX2-NEXT:    shrq $17, %rax
2426; AVX2-NEXT:    vmovd %ecx, %xmm0
2427; AVX2-NEXT:    vpinsrd $1, %eax, %xmm0, %xmm0
2428; AVX2-NEXT:    shrq $34, %rcx
2429; AVX2-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
2430; AVX2-NEXT:    vpinsrd $3, %edx, %xmm0, %xmm0
2431; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [131071,131071,131071,131071]
2432; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
2433; AVX2-NEXT:    retq
2434;
2435; AVX512-LABEL: zext_4i17_to_4i32:
2436; AVX512:       # %bb.0:
2437; AVX512-NEXT:    movl 8(%rdi), %eax
2438; AVX512-NEXT:    shll $13, %eax
2439; AVX512-NEXT:    movq (%rdi), %rcx
2440; AVX512-NEXT:    movq %rcx, %rdx
2441; AVX512-NEXT:    shrq $51, %rdx
2442; AVX512-NEXT:    orl %eax, %edx
2443; AVX512-NEXT:    movq %rcx, %rax
2444; AVX512-NEXT:    shrq $17, %rax
2445; AVX512-NEXT:    vmovd %ecx, %xmm0
2446; AVX512-NEXT:    vpinsrd $1, %eax, %xmm0, %xmm0
2447; AVX512-NEXT:    shrq $34, %rcx
2448; AVX512-NEXT:    vpinsrd $2, %ecx, %xmm0, %xmm0
2449; AVX512-NEXT:    vpinsrd $3, %edx, %xmm0, %xmm0
2450; AVX512-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [131071,131071,131071,131071]
2451; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
2452; AVX512-NEXT:    retq
2453  %a = load <4 x i17>, <4 x i17>* %ptr
2454  %b = zext <4 x i17> %a to <4 x i32>
2455  ret <4 x i32> %b
2456}
2457
2458define <8 x i64> @zext_8i6_to_8i64(i32 %x) nounwind uwtable readnone ssp {
2459; SSE2-LABEL: zext_8i6_to_8i64:
2460; SSE2:       # %bb.0: # %entry
2461; SSE2-NEXT:    movd %edi, %xmm0
2462; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
2463; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0]
2464; SSE2-NEXT:    paddw {{.*}}(%rip), %xmm3
2465; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,1,0,3]
2466; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,6,7]
2467; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [63,63]
2468; SSE2-NEXT:    pand %xmm4, %xmm0
2469; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,1,3]
2470; SSE2-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,5,6,7]
2471; SSE2-NEXT:    pand %xmm4, %xmm1
2472; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,1,2,3]
2473; SSE2-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,5,6,7]
2474; SSE2-NEXT:    pand %xmm4, %xmm2
2475; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[3,1,3,3]
2476; SSE2-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,5,5,6,7]
2477; SSE2-NEXT:    pand %xmm4, %xmm3
2478; SSE2-NEXT:    retq
2479;
2480; SSSE3-LABEL: zext_8i6_to_8i64:
2481; SSSE3:       # %bb.0: # %entry
2482; SSSE3-NEXT:    movd %edi, %xmm0
2483; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
2484; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0]
2485; SSSE3-NEXT:    paddw {{.*}}(%rip), %xmm3
2486; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,1,0,3]
2487; SSSE3-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,6,7]
2488; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [63,63]
2489; SSSE3-NEXT:    pand %xmm4, %xmm0
2490; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,1,3]
2491; SSSE3-NEXT:    pshufhw {{.*#+}} xmm1 = xmm1[0,1,2,3,5,5,6,7]
2492; SSSE3-NEXT:    pand %xmm4, %xmm1
2493; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,1,2,3]
2494; SSSE3-NEXT:    pshufhw {{.*#+}} xmm2 = xmm2[0,1,2,3,5,5,6,7]
2495; SSSE3-NEXT:    pand %xmm4, %xmm2
2496; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[3,1,3,3]
2497; SSSE3-NEXT:    pshufhw {{.*#+}} xmm3 = xmm3[0,1,2,3,5,5,6,7]
2498; SSSE3-NEXT:    pand %xmm4, %xmm3
2499; SSSE3-NEXT:    retq
2500;
2501; SSE41-LABEL: zext_8i6_to_8i64:
2502; SSE41:       # %bb.0: # %entry
2503; SSE41-NEXT:    movd %edi, %xmm0
2504; SSE41-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
2505; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,0,0]
2506; SSE41-NEXT:    paddw {{.*}}(%rip), %xmm3
2507; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm0 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero
2508; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [63,63]
2509; SSE41-NEXT:    pand %xmm4, %xmm0
2510; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,2,3]
2511; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
2512; SSE41-NEXT:    pand %xmm4, %xmm1
2513; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,0,1]
2514; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
2515; SSE41-NEXT:    pand %xmm4, %xmm2
2516; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[3,1,2,3]
2517; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero
2518; SSE41-NEXT:    pand %xmm4, %xmm3
2519; SSE41-NEXT:    retq
2520;
2521; AVX1-LABEL: zext_8i6_to_8i64:
2522; AVX1:       # %bb.0: # %entry
2523; AVX1-NEXT:    vmovd %edi, %xmm0
2524; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7]
2525; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
2526; AVX1-NEXT:    vpaddw {{.*}}(%rip), %xmm0, %xmm0
2527; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm1
2528; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
2529; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,2,3]
2530; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
2531; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2532; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
2533; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero
2534; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[3,3,0,1]
2535; AVX1-NEXT:    vpmovzxwq {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero
2536; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
2537; AVX1-NEXT:    retq
2538;
2539; AVX2-LABEL: zext_8i6_to_8i64:
2540; AVX2:       # %bb.0: # %entry
2541; AVX2-NEXT:    vmovd %edi, %xmm0
2542; AVX2-NEXT:    vpbroadcastw %xmm0, %xmm0
2543; AVX2-NEXT:    vpaddw {{.*}}(%rip), %xmm0, %xmm0
2544; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm1
2545; AVX2-NEXT:    vpmovzxwq {{.*#+}} ymm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
2546; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
2547; AVX2-NEXT:    vpmovzxwq {{.*#+}} ymm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
2548; AVX2-NEXT:    retq
2549;
2550; AVX512-LABEL: zext_8i6_to_8i64:
2551; AVX512:       # %bb.0: # %entry
2552; AVX512-NEXT:    vmovd %edi, %xmm0
2553; AVX512-NEXT:    vpbroadcastw %xmm0, %xmm0
2554; AVX512-NEXT:    vpaddw {{.*}}(%rip), %xmm0, %xmm0
2555; AVX512-NEXT:    vpmovzxwq {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
2556; AVX512-NEXT:    vpandq {{.*}}(%rip){1to8}, %zmm0, %zmm0
2557; AVX512-NEXT:    retq
2558entry:
2559  %a = trunc i32 %x to i6
2560  %b = insertelement <8 x i6> undef, i6 %a, i32 0
2561  %c = shufflevector <8 x i6> %b, <8 x i6> undef, <8 x i32> zeroinitializer
2562  %d = add <8 x i6> %c, <i6 0, i6 1, i6 2, i6 3, i6 4, i6 5, i6 6, i6 7>
2563  %e = zext <8 x i6> %d to <8 x i64>
2564  ret <8 x i64> %e
2565}
2566