1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s --check-prefix=ALL --check-prefix=KNL
3; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s --check-prefix=ALL --check-prefix=SKX
4
5define <8 x i16> @zext_8x8mem_to_8x16(<8 x i8> *%i , <8 x i1> %mask) nounwind readnone {
6; KNL-LABEL: zext_8x8mem_to_8x16:
7; KNL:       ## BB#0:
8; KNL-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
9; KNL-NEXT:    vpsllw $15, %xmm0, %xmm0
10; KNL-NEXT:    vpsraw $15, %xmm0, %xmm0
11; KNL-NEXT:    vpand %xmm1, %xmm0, %xmm0
12; KNL-NEXT:    retq
13;
14; SKX-LABEL: zext_8x8mem_to_8x16:
15; SKX:       ## BB#0:
16; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
17; SKX-NEXT:    vpmovw2m %xmm0, %k1
18; SKX-NEXT:    vpmovzxbw {{.*#+}} xmm0 {%k1} {z} = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
19; SKX-NEXT:    retq
20  %a   = load <8 x i8>,<8 x i8> *%i,align 1
21  %x   = zext <8 x i8> %a to <8 x i16>
22  %ret = select <8 x i1> %mask, <8 x i16> %x, <8 x i16> zeroinitializer
23  ret <8 x i16> %ret
24}
25
26define <8 x i16> @sext_8x8mem_to_8x16(<8 x i8> *%i , <8 x i1> %mask) nounwind readnone {
27; KNL-LABEL: sext_8x8mem_to_8x16:
28; KNL:       ## BB#0:
29; KNL-NEXT:    vpmovsxbw (%rdi), %xmm1
30; KNL-NEXT:    vpsllw $15, %xmm0, %xmm0
31; KNL-NEXT:    vpsraw $15, %xmm0, %xmm0
32; KNL-NEXT:    vpand %xmm1, %xmm0, %xmm0
33; KNL-NEXT:    retq
34;
35; SKX-LABEL: sext_8x8mem_to_8x16:
36; SKX:       ## BB#0:
37; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
38; SKX-NEXT:    vpmovw2m %xmm0, %k1
39; SKX-NEXT:    vpmovsxbw (%rdi), %xmm0 {%k1} {z}
40; SKX-NEXT:    retq
41  %a   = load <8 x i8>,<8 x i8> *%i,align 1
42  %x   = sext <8 x i8> %a to <8 x i16>
43  %ret = select <8 x i1> %mask, <8 x i16> %x, <8 x i16> zeroinitializer
44  ret <8 x i16> %ret
45}
46
47
48define <16 x i16> @zext_16x8mem_to_16x16(<16 x i8> *%i , <16 x i1> %mask) nounwind readnone {
49; KNL-LABEL: zext_16x8mem_to_16x16:
50; KNL:       ## BB#0:
51; KNL-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
52; KNL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = 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
53; KNL-NEXT:    vpsllw $15, %ymm0, %ymm0
54; KNL-NEXT:    vpsraw $15, %ymm0, %ymm0
55; KNL-NEXT:    vpand %ymm1, %ymm0, %ymm0
56; KNL-NEXT:    retq
57;
58; SKX-LABEL: zext_16x8mem_to_16x16:
59; SKX:       ## BB#0:
60; SKX-NEXT:    vpsllw $7, %xmm0, %xmm0
61; SKX-NEXT:    vpmovb2m %xmm0, %k1
62; SKX-NEXT:    vpmovzxbw {{.*#+}} ymm0 {%k1} {z} = 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
63; SKX-NEXT:    retq
64  %a   = load <16 x i8>,<16 x i8> *%i,align 1
65  %x   = zext <16 x i8> %a to <16 x i16>
66  %ret = select <16 x i1> %mask, <16 x i16> %x, <16 x i16> zeroinitializer
67  ret <16 x i16> %ret
68}
69
70define <16 x i16> @sext_16x8mem_to_16x16(<16 x i8> *%i , <16 x i1> %mask) nounwind readnone {
71; KNL-LABEL: sext_16x8mem_to_16x16:
72; KNL:       ## BB#0:
73; KNL-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
74; KNL-NEXT:    vpmovsxbw (%rdi), %ymm1
75; KNL-NEXT:    vpsllw $15, %ymm0, %ymm0
76; KNL-NEXT:    vpsraw $15, %ymm0, %ymm0
77; KNL-NEXT:    vpand %ymm1, %ymm0, %ymm0
78; KNL-NEXT:    retq
79;
80; SKX-LABEL: sext_16x8mem_to_16x16:
81; SKX:       ## BB#0:
82; SKX-NEXT:    vpsllw $7, %xmm0, %xmm0
83; SKX-NEXT:    vpmovb2m %xmm0, %k1
84; SKX-NEXT:    vpmovsxbw (%rdi), %ymm0 {%k1} {z}
85; SKX-NEXT:    retq
86  %a   = load <16 x i8>,<16 x i8> *%i,align 1
87  %x   = sext <16 x i8> %a to <16 x i16>
88  %ret = select <16 x i1> %mask, <16 x i16> %x, <16 x i16> zeroinitializer
89  ret <16 x i16> %ret
90}
91
92define <16 x i16> @zext_16x8_to_16x16(<16 x i8> %a ) nounwind readnone {
93; ALL-LABEL: zext_16x8_to_16x16:
94; ALL:       ## BB#0:
95; ALL-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
96; ALL-NEXT:    retq
97  %x   = zext <16 x i8> %a to <16 x i16>
98  ret <16 x i16> %x
99}
100
101define <16 x i16> @zext_16x8_to_16x16_mask(<16 x i8> %a ,<16 x i1> %mask) nounwind readnone {
102; KNL-LABEL: zext_16x8_to_16x16_mask:
103; KNL:       ## BB#0:
104; KNL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
105; KNL-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
106; KNL-NEXT:    vpsllw $15, %ymm1, %ymm1
107; KNL-NEXT:    vpsraw $15, %ymm1, %ymm1
108; KNL-NEXT:    vpand %ymm0, %ymm1, %ymm0
109; KNL-NEXT:    retq
110;
111; SKX-LABEL: zext_16x8_to_16x16_mask:
112; SKX:       ## BB#0:
113; SKX-NEXT:    vpsllw $7, %xmm1, %xmm1
114; SKX-NEXT:    vpmovb2m %xmm1, %k1
115; SKX-NEXT:    vpmovzxbw {{.*#+}} ymm0 {%k1} {z} = 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
116; SKX-NEXT:    retq
117  %x   = zext <16 x i8> %a to <16 x i16>
118  %ret = select <16 x i1> %mask, <16 x i16> %x, <16 x i16> zeroinitializer
119  ret <16 x i16> %ret
120}
121
122define <16 x i16> @sext_16x8_to_16x16(<16 x i8> %a ) nounwind readnone {
123; ALL-LABEL: sext_16x8_to_16x16:
124; ALL:       ## BB#0:
125; ALL-NEXT:    vpmovsxbw %xmm0, %ymm0
126; ALL-NEXT:    retq
127  %x   = sext <16 x i8> %a to <16 x i16>
128  ret <16 x i16> %x
129}
130
131define <16 x i16> @sext_16x8_to_16x16_mask(<16 x i8> %a ,<16 x i1> %mask) nounwind readnone {
132; KNL-LABEL: sext_16x8_to_16x16_mask:
133; KNL:       ## BB#0:
134; KNL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
135; KNL-NEXT:    vpmovsxbw %xmm0, %ymm0
136; KNL-NEXT:    vpsllw $15, %ymm1, %ymm1
137; KNL-NEXT:    vpsraw $15, %ymm1, %ymm1
138; KNL-NEXT:    vpand %ymm0, %ymm1, %ymm0
139; KNL-NEXT:    retq
140;
141; SKX-LABEL: sext_16x8_to_16x16_mask:
142; SKX:       ## BB#0:
143; SKX-NEXT:    vpsllw $7, %xmm1, %xmm1
144; SKX-NEXT:    vpmovb2m %xmm1, %k1
145; SKX-NEXT:    vpmovsxbw %xmm0, %ymm0 {%k1} {z}
146; SKX-NEXT:    retq
147  %x   = sext <16 x i8> %a to <16 x i16>
148  %ret = select <16 x i1> %mask, <16 x i16> %x, <16 x i16> zeroinitializer
149  ret <16 x i16> %ret
150}
151
152define <32 x i16> @zext_32x8mem_to_32x16(<32 x i8> *%i , <32 x i1> %mask) nounwind readnone {
153; KNL-LABEL: zext_32x8mem_to_32x16:
154; KNL:       ## BB#0:
155; KNL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = 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
156; KNL-NEXT:    vpmovzxbw {{.*#+}} ymm2 = 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
157; KNL-NEXT:    vpmovzxbw {{.*#+}} ymm3 = 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
158; KNL-NEXT:    vpsllw $15, %ymm3, %ymm3
159; KNL-NEXT:    vpsraw $15, %ymm3, %ymm3
160; KNL-NEXT:    vpand %ymm2, %ymm3, %ymm2
161; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm0
162; KNL-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
163; KNL-NEXT:    vpsllw $15, %ymm0, %ymm0
164; KNL-NEXT:    vpsraw $15, %ymm0, %ymm0
165; KNL-NEXT:    vpand %ymm1, %ymm0, %ymm1
166; KNL-NEXT:    vmovdqa %ymm2, %ymm0
167; KNL-NEXT:    retq
168;
169; SKX-LABEL: zext_32x8mem_to_32x16:
170; SKX:       ## BB#0:
171; SKX-NEXT:    vpsllw $7, %ymm0, %ymm0
172; SKX-NEXT:    vpmovb2m %ymm0, %k1
173; SKX-NEXT:    vpmovzxbw {{.*#+}} zmm0 {%k1} {z} = 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,mem[16],zero,mem[17],zero,mem[18],zero,mem[19],zero,mem[20],zero,mem[21],zero,mem[22],zero,mem[23],zero,mem[24],zero,mem[25],zero,mem[26],zero,mem[27],zero,mem[28],zero,mem[29],zero,mem[30],zero,mem[31],zero
174; SKX-NEXT:    retq
175  %a   = load <32 x i8>,<32 x i8> *%i,align 1
176  %x   = zext <32 x i8> %a to <32 x i16>
177  %ret = select <32 x i1> %mask, <32 x i16> %x, <32 x i16> zeroinitializer
178  ret <32 x i16> %ret
179}
180
181define <32 x i16> @sext_32x8mem_to_32x16(<32 x i8> *%i , <32 x i1> %mask) nounwind readnone {
182; KNL-LABEL: sext_32x8mem_to_32x16:
183; KNL:       ## BB#0:
184; KNL-NEXT:    vpmovsxbw 16(%rdi), %ymm1
185; KNL-NEXT:    vpmovsxbw (%rdi), %ymm2
186; KNL-NEXT:    vpmovzxbw {{.*#+}} ymm3 = 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
187; KNL-NEXT:    vpsllw $15, %ymm3, %ymm3
188; KNL-NEXT:    vpsraw $15, %ymm3, %ymm3
189; KNL-NEXT:    vpand %ymm2, %ymm3, %ymm2
190; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm0
191; KNL-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
192; KNL-NEXT:    vpsllw $15, %ymm0, %ymm0
193; KNL-NEXT:    vpsraw $15, %ymm0, %ymm0
194; KNL-NEXT:    vpand %ymm1, %ymm0, %ymm1
195; KNL-NEXT:    vmovdqa %ymm2, %ymm0
196; KNL-NEXT:    retq
197;
198; SKX-LABEL: sext_32x8mem_to_32x16:
199; SKX:       ## BB#0:
200; SKX-NEXT:    vpsllw $7, %ymm0, %ymm0
201; SKX-NEXT:    vpmovb2m %ymm0, %k1
202; SKX-NEXT:    vpmovsxbw (%rdi), %zmm0 {%k1} {z}
203; SKX-NEXT:    retq
204  %a   = load <32 x i8>,<32 x i8> *%i,align 1
205  %x   = sext <32 x i8> %a to <32 x i16>
206  %ret = select <32 x i1> %mask, <32 x i16> %x, <32 x i16> zeroinitializer
207  ret <32 x i16> %ret
208}
209
210define <32 x i16> @zext_32x8_to_32x16(<32 x i8> %a ) nounwind readnone {
211; KNL-LABEL: zext_32x8_to_32x16:
212; KNL:       ## BB#0:
213; KNL-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
214; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm0
215; KNL-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
216; KNL-NEXT:    vmovdqa %ymm2, %ymm0
217; KNL-NEXT:    retq
218;
219; SKX-LABEL: zext_32x8_to_32x16:
220; SKX:       ## BB#0:
221; SKX-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
222; SKX-NEXT:    retq
223  %x   = zext <32 x i8> %a to <32 x i16>
224  ret <32 x i16> %x
225}
226
227define <32 x i16> @zext_32x8_to_32x16_mask(<32 x i8> %a ,<32 x i1> %mask) nounwind readnone {
228; KNL-LABEL: zext_32x8_to_32x16_mask:
229; KNL:       ## BB#0:
230; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm2
231; KNL-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
232; KNL-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
233; KNL-NEXT:    vpmovzxbw {{.*#+}} ymm3 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
234; KNL-NEXT:    vpsllw $15, %ymm3, %ymm3
235; KNL-NEXT:    vpsraw $15, %ymm3, %ymm3
236; KNL-NEXT:    vpand %ymm0, %ymm3, %ymm0
237; KNL-NEXT:    vextracti128 $1, %ymm1, %xmm1
238; KNL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
239; KNL-NEXT:    vpsllw $15, %ymm1, %ymm1
240; KNL-NEXT:    vpsraw $15, %ymm1, %ymm1
241; KNL-NEXT:    vpand %ymm2, %ymm1, %ymm1
242; KNL-NEXT:    retq
243;
244; SKX-LABEL: zext_32x8_to_32x16_mask:
245; SKX:       ## BB#0:
246; SKX-NEXT:    vpsllw $7, %ymm1, %ymm1
247; SKX-NEXT:    vpmovb2m %ymm1, %k1
248; SKX-NEXT:    vpmovzxbw {{.*#+}} zmm0 {%k1} {z} = 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
249; SKX-NEXT:    retq
250  %x   = zext <32 x i8> %a to <32 x i16>
251  %ret = select <32 x i1> %mask, <32 x i16> %x, <32 x i16> zeroinitializer
252  ret <32 x i16> %ret
253}
254
255define <32 x i16> @sext_32x8_to_32x16(<32 x i8> %a ) nounwind readnone {
256; KNL-LABEL: sext_32x8_to_32x16:
257; KNL:       ## BB#0:
258; KNL-NEXT:    vpmovsxbw %xmm0, %ymm2
259; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm0
260; KNL-NEXT:    vpmovsxbw %xmm0, %ymm1
261; KNL-NEXT:    vmovdqa %ymm2, %ymm0
262; KNL-NEXT:    retq
263;
264; SKX-LABEL: sext_32x8_to_32x16:
265; SKX:       ## BB#0:
266; SKX-NEXT:    vpmovsxbw %ymm0, %zmm0
267; SKX-NEXT:    retq
268  %x   = sext <32 x i8> %a to <32 x i16>
269  ret <32 x i16> %x
270}
271
272define <32 x i16> @sext_32x8_to_32x16_mask(<32 x i8> %a ,<32 x i1> %mask) nounwind readnone {
273; KNL-LABEL: sext_32x8_to_32x16_mask:
274; KNL:       ## BB#0:
275; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm2
276; KNL-NEXT:    vpmovsxbw %xmm2, %ymm2
277; KNL-NEXT:    vpmovsxbw %xmm0, %ymm0
278; KNL-NEXT:    vpmovzxbw {{.*#+}} ymm3 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
279; KNL-NEXT:    vpsllw $15, %ymm3, %ymm3
280; KNL-NEXT:    vpsraw $15, %ymm3, %ymm3
281; KNL-NEXT:    vpand %ymm0, %ymm3, %ymm0
282; KNL-NEXT:    vextracti128 $1, %ymm1, %xmm1
283; KNL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
284; KNL-NEXT:    vpsllw $15, %ymm1, %ymm1
285; KNL-NEXT:    vpsraw $15, %ymm1, %ymm1
286; KNL-NEXT:    vpand %ymm2, %ymm1, %ymm1
287; KNL-NEXT:    retq
288;
289; SKX-LABEL: sext_32x8_to_32x16_mask:
290; SKX:       ## BB#0:
291; SKX-NEXT:    vpsllw $7, %ymm1, %ymm1
292; SKX-NEXT:    vpmovb2m %ymm1, %k1
293; SKX-NEXT:    vpmovsxbw %ymm0, %zmm0 {%k1} {z}
294; SKX-NEXT:    retq
295  %x   = sext <32 x i8> %a to <32 x i16>
296  %ret = select <32 x i1> %mask, <32 x i16> %x, <32 x i16> zeroinitializer
297  ret <32 x i16> %ret
298}
299
300define <4 x i32> @zext_4x8mem_to_4x32(<4 x i8> *%i , <4 x i1> %mask) nounwind readnone {
301; KNL-LABEL: zext_4x8mem_to_4x32:
302; KNL:       ## BB#0:
303; KNL-NEXT:    vpslld $31, %xmm0, %xmm0
304; KNL-NEXT:    vpsrad $31, %xmm0, %xmm0
305; KNL-NEXT:    vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
306; KNL-NEXT:    vpand %xmm1, %xmm0, %xmm0
307; KNL-NEXT:    retq
308;
309; SKX-LABEL: zext_4x8mem_to_4x32:
310; SKX:       ## BB#0:
311; SKX-NEXT:    vpslld $31, %xmm0, %xmm0
312; SKX-NEXT:    vptestmd %xmm0, %xmm0, %k1
313; SKX-NEXT:    vpmovzxbd {{.*#+}} xmm0 {%k1} {z} = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
314; SKX-NEXT:    retq
315  %a   = load <4 x i8>,<4 x i8> *%i,align 1
316  %x   = zext <4 x i8> %a to <4 x i32>
317  %ret = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> zeroinitializer
318  ret <4 x i32> %ret
319}
320
321define <4 x i32> @sext_4x8mem_to_4x32(<4 x i8> *%i , <4 x i1> %mask) nounwind readnone {
322; KNL-LABEL: sext_4x8mem_to_4x32:
323; KNL:       ## BB#0:
324; KNL-NEXT:    vpslld $31, %xmm0, %xmm0
325; KNL-NEXT:    vpsrad $31, %xmm0, %xmm0
326; KNL-NEXT:    vpmovsxbd (%rdi), %xmm1
327; KNL-NEXT:    vpand %xmm1, %xmm0, %xmm0
328; KNL-NEXT:    retq
329;
330; SKX-LABEL: sext_4x8mem_to_4x32:
331; SKX:       ## BB#0:
332; SKX-NEXT:    vpslld $31, %xmm0, %xmm0
333; SKX-NEXT:    vptestmd %xmm0, %xmm0, %k1
334; SKX-NEXT:    vpmovsxbd (%rdi), %xmm0 {%k1} {z}
335; SKX-NEXT:    retq
336  %a   = load <4 x i8>,<4 x i8> *%i,align 1
337  %x   = sext <4 x i8> %a to <4 x i32>
338  %ret = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> zeroinitializer
339  ret <4 x i32> %ret
340}
341
342define <8 x i32> @zext_8x8mem_to_8x32(<8 x i8> *%i , <8 x i1> %mask) nounwind readnone {
343; KNL-LABEL: zext_8x8mem_to_8x32:
344; KNL:       ## BB#0:
345; KNL-NEXT:    vpmovsxwq %xmm0, %zmm0
346; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
347; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k1
348; KNL-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
349; KNL-NEXT:    vpxor %ymm1, %ymm1, %ymm1
350; KNL-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
351; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
352; KNL-NEXT:    retq
353;
354; SKX-LABEL: zext_8x8mem_to_8x32:
355; SKX:       ## BB#0:
356; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
357; SKX-NEXT:    vpmovw2m %xmm0, %k1
358; SKX-NEXT:    vpmovzxbd {{.*#+}} ymm0 {%k1} {z} = 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
359; SKX-NEXT:    retq
360  %a   = load <8 x i8>,<8 x i8> *%i,align 1
361  %x   = zext <8 x i8> %a to <8 x i32>
362  %ret = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> zeroinitializer
363  ret <8 x i32> %ret
364}
365
366define <8 x i32> @sext_8x8mem_to_8x32(<8 x i8> *%i , <8 x i1> %mask) nounwind readnone {
367; KNL-LABEL: sext_8x8mem_to_8x32:
368; KNL:       ## BB#0:
369; KNL-NEXT:    vpmovsxwq %xmm0, %zmm0
370; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
371; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k1
372; KNL-NEXT:    vpmovsxbd (%rdi), %ymm0
373; KNL-NEXT:    vpxor %ymm1, %ymm1, %ymm1
374; KNL-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
375; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
376; KNL-NEXT:    retq
377;
378; SKX-LABEL: sext_8x8mem_to_8x32:
379; SKX:       ## BB#0:
380; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
381; SKX-NEXT:    vpmovw2m %xmm0, %k1
382; SKX-NEXT:    vpmovsxbd (%rdi), %ymm0 {%k1} {z}
383; SKX-NEXT:    retq
384  %a   = load <8 x i8>,<8 x i8> *%i,align 1
385  %x   = sext <8 x i8> %a to <8 x i32>
386  %ret = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> zeroinitializer
387  ret <8 x i32> %ret
388}
389
390define <16 x i32> @zext_16x8mem_to_16x32(<16 x i8> *%i , <16 x i1> %mask) nounwind readnone {
391; KNL-LABEL: zext_16x8mem_to_16x32:
392; KNL:       ## BB#0:
393; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0
394; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
395; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k1
396; KNL-NEXT:    vpmovzxbd {{.*#+}} zmm0 {%k1} {z} = 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,mem[8],zero,zero,zero,mem[9],zero,zero,zero,mem[10],zero,zero,zero,mem[11],zero,zero,zero,mem[12],zero,zero,zero,mem[13],zero,zero,zero,mem[14],zero,zero,zero,mem[15],zero,zero,zero
397; KNL-NEXT:    retq
398;
399; SKX-LABEL: zext_16x8mem_to_16x32:
400; SKX:       ## BB#0:
401; SKX-NEXT:    vpsllw $7, %xmm0, %xmm0
402; SKX-NEXT:    vpmovb2m %xmm0, %k1
403; SKX-NEXT:    vpmovzxbd {{.*#+}} zmm0 {%k1} {z} = 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,mem[8],zero,zero,zero,mem[9],zero,zero,zero,mem[10],zero,zero,zero,mem[11],zero,zero,zero,mem[12],zero,zero,zero,mem[13],zero,zero,zero,mem[14],zero,zero,zero,mem[15],zero,zero,zero
404; SKX-NEXT:    retq
405  %a   = load <16 x i8>,<16 x i8> *%i,align 1
406  %x   = zext <16 x i8> %a to <16 x i32>
407  %ret = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> zeroinitializer
408  ret <16 x i32> %ret
409}
410
411define <16 x i32> @sext_16x8mem_to_16x32(<16 x i8> *%i , <16 x i1> %mask) nounwind readnone {
412; KNL-LABEL: sext_16x8mem_to_16x32:
413; KNL:       ## BB#0:
414; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0
415; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
416; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k1
417; KNL-NEXT:    vpmovsxbd (%rdi), %zmm0 {%k1} {z}
418; KNL-NEXT:    retq
419;
420; SKX-LABEL: sext_16x8mem_to_16x32:
421; SKX:       ## BB#0:
422; SKX-NEXT:    vpsllw $7, %xmm0, %xmm0
423; SKX-NEXT:    vpmovb2m %xmm0, %k1
424; SKX-NEXT:    vpmovsxbd (%rdi), %zmm0 {%k1} {z}
425; SKX-NEXT:    retq
426  %a   = load <16 x i8>,<16 x i8> *%i,align 1
427  %x   = sext <16 x i8> %a to <16 x i32>
428  %ret = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> zeroinitializer
429  ret <16 x i32> %ret
430}
431
432define <16 x i32> @zext_16x8_to_16x32_mask(<16 x i8> %a , <16 x i1> %mask) nounwind readnone {
433; KNL-LABEL: zext_16x8_to_16x32_mask:
434; KNL:       ## BB#0:
435; KNL-NEXT:    vpmovsxbd %xmm1, %zmm1
436; KNL-NEXT:    vpslld $31, %zmm1, %zmm1
437; KNL-NEXT:    vptestmd %zmm1, %zmm1, %k1
438; KNL-NEXT:    vpmovzxbd {{.*#+}} zmm0 {%k1} {z} = 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
439; KNL-NEXT:    retq
440;
441; SKX-LABEL: zext_16x8_to_16x32_mask:
442; SKX:       ## BB#0:
443; SKX-NEXT:    vpsllw $7, %xmm1, %xmm1
444; SKX-NEXT:    vpmovb2m %xmm1, %k1
445; SKX-NEXT:    vpmovzxbd {{.*#+}} zmm0 {%k1} {z} = 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
446; SKX-NEXT:    retq
447  %x   = zext <16 x i8> %a to <16 x i32>
448  %ret = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> zeroinitializer
449  ret <16 x i32> %ret
450}
451
452define <16 x i32> @sext_16x8_to_16x32_mask(<16 x i8> %a , <16 x i1> %mask) nounwind readnone {
453; KNL-LABEL: sext_16x8_to_16x32_mask:
454; KNL:       ## BB#0:
455; KNL-NEXT:    vpmovsxbd %xmm1, %zmm1
456; KNL-NEXT:    vpslld $31, %zmm1, %zmm1
457; KNL-NEXT:    vptestmd %zmm1, %zmm1, %k1
458; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0 {%k1} {z}
459; KNL-NEXT:    retq
460;
461; SKX-LABEL: sext_16x8_to_16x32_mask:
462; SKX:       ## BB#0:
463; SKX-NEXT:    vpsllw $7, %xmm1, %xmm1
464; SKX-NEXT:    vpmovb2m %xmm1, %k1
465; SKX-NEXT:    vpmovsxbd %xmm0, %zmm0 {%k1} {z}
466; SKX-NEXT:    retq
467  %x   = sext <16 x i8> %a to <16 x i32>
468  %ret = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> zeroinitializer
469  ret <16 x i32> %ret
470}
471
472define <16 x i32> @zext_16x8_to_16x32(<16 x i8> %i) nounwind readnone {
473; ALL-LABEL: zext_16x8_to_16x32:
474; ALL:       ## BB#0:
475; ALL-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
476; ALL-NEXT:    retq
477  %x = zext <16 x i8> %i to <16 x i32>
478  ret <16 x i32> %x
479}
480
481define <16 x i32> @sext_16x8_to_16x32(<16 x i8> %i) nounwind readnone {
482; ALL-LABEL: sext_16x8_to_16x32:
483; ALL:       ## BB#0:
484; ALL-NEXT:    vpmovsxbd %xmm0, %zmm0
485; ALL-NEXT:    retq
486  %x = sext <16 x i8> %i to <16 x i32>
487  ret <16 x i32> %x
488}
489
490define <2 x i64> @zext_2x8mem_to_2x64(<2 x i8> *%i , <2 x i1> %mask) nounwind readnone {
491; KNL-LABEL: zext_2x8mem_to_2x64:
492; KNL:       ## BB#0:
493; KNL-NEXT:    vpsllq $63, %xmm0, %xmm0
494; KNL-NEXT:    vpsrad $31, %xmm0, %xmm0
495; KNL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
496; KNL-NEXT:    vpmovzxbq {{.*#+}} xmm1 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
497; KNL-NEXT:    vpand %xmm1, %xmm0, %xmm0
498; KNL-NEXT:    retq
499;
500; SKX-LABEL: zext_2x8mem_to_2x64:
501; SKX:       ## BB#0:
502; SKX-NEXT:    vpsllq $63, %xmm0, %xmm0
503; SKX-NEXT:    vptestmq %xmm0, %xmm0, %k1
504; SKX-NEXT:    vpmovzxbq {{.*#+}} xmm0 {%k1} {z} = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
505; SKX-NEXT:    retq
506  %a   = load <2 x i8>,<2 x i8> *%i,align 1
507  %x   = zext <2 x i8> %a to <2 x i64>
508  %ret = select <2 x  i1> %mask, <2 x i64> %x, <2 x i64> zeroinitializer
509  ret <2 x i64> %ret
510}
511define <2 x i64> @sext_2x8mem_to_2x64mask(<2 x i8> *%i , <2 x i1> %mask) nounwind readnone {
512; KNL-LABEL: sext_2x8mem_to_2x64mask:
513; KNL:       ## BB#0:
514; KNL-NEXT:    vpsllq $63, %xmm0, %xmm0
515; KNL-NEXT:    vpsrad $31, %xmm0, %xmm0
516; KNL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
517; KNL-NEXT:    vpmovsxbq (%rdi), %xmm1
518; KNL-NEXT:    vpand %xmm1, %xmm0, %xmm0
519; KNL-NEXT:    retq
520;
521; SKX-LABEL: sext_2x8mem_to_2x64mask:
522; SKX:       ## BB#0:
523; SKX-NEXT:    vpsllq $63, %xmm0, %xmm0
524; SKX-NEXT:    vptestmq %xmm0, %xmm0, %k1
525; SKX-NEXT:    vpmovsxbq (%rdi), %xmm0 {%k1} {z}
526; SKX-NEXT:    retq
527  %a   = load <2 x i8>,<2 x i8> *%i,align 1
528  %x   = sext <2 x i8> %a to <2 x i64>
529  %ret = select <2 x i1> %mask, <2 x i64> %x, <2 x i64> zeroinitializer
530  ret <2 x i64> %ret
531}
532define <2 x i64> @sext_2x8mem_to_2x64(<2 x i8> *%i) nounwind readnone {
533; ALL-LABEL: sext_2x8mem_to_2x64:
534; ALL:       ## BB#0:
535; ALL-NEXT:    vpmovsxbq (%rdi), %xmm0
536; ALL-NEXT:    retq
537  %a   = load <2 x i8>,<2 x i8> *%i,align 1
538  %x   = sext <2 x i8> %a to <2 x i64>
539  ret <2 x i64> %x
540}
541
542define <4 x i64> @zext_4x8mem_to_4x64(<4 x i8> *%i , <4 x i1> %mask) nounwind readnone {
543; KNL-LABEL: zext_4x8mem_to_4x64:
544; KNL:       ## BB#0:
545; KNL-NEXT:    vpslld $31, %xmm0, %xmm0
546; KNL-NEXT:    vpsrad $31, %xmm0, %xmm0
547; KNL-NEXT:    vpmovsxdq %xmm0, %ymm0
548; KNL-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
549; KNL-NEXT:    vpand %ymm1, %ymm0, %ymm0
550; KNL-NEXT:    retq
551;
552; SKX-LABEL: zext_4x8mem_to_4x64:
553; SKX:       ## BB#0:
554; SKX-NEXT:    vpslld $31, %xmm0, %xmm0
555; SKX-NEXT:    vptestmd %xmm0, %xmm0, %k1
556; SKX-NEXT:    vpmovzxbq {{.*#+}} ymm0 {%k1} {z} = 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
557; SKX-NEXT:    retq
558  %a   = load <4 x i8>,<4 x i8> *%i,align 1
559  %x   = zext <4 x i8> %a to <4 x i64>
560  %ret = select <4 x  i1> %mask, <4 x i64> %x, <4 x i64> zeroinitializer
561  ret <4 x i64> %ret
562}
563
564define <4 x i64> @sext_4x8mem_to_4x64mask(<4 x i8> *%i , <4 x i1> %mask) nounwind readnone {
565; KNL-LABEL: sext_4x8mem_to_4x64mask:
566; KNL:       ## BB#0:
567; KNL-NEXT:    vpslld $31, %xmm0, %xmm0
568; KNL-NEXT:    vpsrad $31, %xmm0, %xmm0
569; KNL-NEXT:    vpmovsxdq %xmm0, %ymm0
570; KNL-NEXT:    vpmovsxbq (%rdi), %ymm1
571; KNL-NEXT:    vpand %ymm1, %ymm0, %ymm0
572; KNL-NEXT:    retq
573;
574; SKX-LABEL: sext_4x8mem_to_4x64mask:
575; SKX:       ## BB#0:
576; SKX-NEXT:    vpslld $31, %xmm0, %xmm0
577; SKX-NEXT:    vptestmd %xmm0, %xmm0, %k1
578; SKX-NEXT:    vpmovsxbq (%rdi), %ymm0 {%k1} {z}
579; SKX-NEXT:    retq
580  %a   = load <4 x i8>,<4 x i8> *%i,align 1
581  %x   = sext <4 x i8> %a to <4 x i64>
582  %ret = select <4 x i1> %mask, <4 x i64> %x, <4 x i64> zeroinitializer
583  ret <4 x i64> %ret
584}
585
586define <4 x i64> @sext_4x8mem_to_4x64(<4 x i8> *%i) nounwind readnone {
587; ALL-LABEL: sext_4x8mem_to_4x64:
588; ALL:       ## BB#0:
589; ALL-NEXT:    vpmovsxbq (%rdi), %ymm0
590; ALL-NEXT:    retq
591  %a   = load <4 x i8>,<4 x i8> *%i,align 1
592  %x   = sext <4 x i8> %a to <4 x i64>
593  ret <4 x i64> %x
594}
595
596define <8 x i64> @zext_8x8mem_to_8x64(<8 x i8> *%i , <8 x i1> %mask) nounwind readnone {
597; KNL-LABEL: zext_8x8mem_to_8x64:
598; KNL:       ## BB#0:
599; KNL-NEXT:    vpmovsxwq %xmm0, %zmm0
600; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
601; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k1
602; KNL-NEXT:    vpmovzxbq {{.*#+}} zmm0 {%k1} {z} = 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
603; KNL-NEXT:    retq
604;
605; SKX-LABEL: zext_8x8mem_to_8x64:
606; SKX:       ## BB#0:
607; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
608; SKX-NEXT:    vpmovw2m %xmm0, %k1
609; SKX-NEXT:    vpmovzxbq {{.*#+}} zmm0 {%k1} {z} = 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
610; SKX-NEXT:    retq
611  %a   = load <8 x i8>,<8 x i8> *%i,align 1
612  %x   = zext <8 x i8> %a to <8 x i64>
613  %ret = select <8 x  i1> %mask, <8 x i64> %x, <8 x i64> zeroinitializer
614  ret <8 x i64> %ret
615}
616
617define <8 x i64> @sext_8x8mem_to_8x64mask(<8 x i8> *%i , <8 x i1> %mask) nounwind readnone {
618; KNL-LABEL: sext_8x8mem_to_8x64mask:
619; KNL:       ## BB#0:
620; KNL-NEXT:    vpmovsxwq %xmm0, %zmm0
621; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
622; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k1
623; KNL-NEXT:    vpmovsxbq (%rdi), %zmm0 {%k1} {z}
624; KNL-NEXT:    retq
625;
626; SKX-LABEL: sext_8x8mem_to_8x64mask:
627; SKX:       ## BB#0:
628; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
629; SKX-NEXT:    vpmovw2m %xmm0, %k1
630; SKX-NEXT:    vpmovsxbq (%rdi), %zmm0 {%k1} {z}
631; SKX-NEXT:    retq
632  %a   = load <8 x i8>,<8 x i8> *%i,align 1
633  %x   = sext <8 x i8> %a to <8 x i64>
634  %ret = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> zeroinitializer
635  ret <8 x i64> %ret
636}
637
638define <8 x i64> @sext_8x8mem_to_8x64(<8 x i8> *%i) nounwind readnone {
639; ALL-LABEL: sext_8x8mem_to_8x64:
640; ALL:       ## BB#0:
641; ALL-NEXT:    vpmovsxbq (%rdi), %zmm0
642; ALL-NEXT:    retq
643  %a   = load <8 x i8>,<8 x i8> *%i,align 1
644  %x   = sext <8 x i8> %a to <8 x i64>
645  ret <8 x i64> %x
646}
647
648define <4 x i32> @zext_4x16mem_to_4x32(<4 x i16> *%i , <4 x i1> %mask) nounwind readnone {
649; KNL-LABEL: zext_4x16mem_to_4x32:
650; KNL:       ## BB#0:
651; KNL-NEXT:    vpslld $31, %xmm0, %xmm0
652; KNL-NEXT:    vpsrad $31, %xmm0, %xmm0
653; KNL-NEXT:    vpmovzxwd {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
654; KNL-NEXT:    vpand %xmm1, %xmm0, %xmm0
655; KNL-NEXT:    retq
656;
657; SKX-LABEL: zext_4x16mem_to_4x32:
658; SKX:       ## BB#0:
659; SKX-NEXT:    vpslld $31, %xmm0, %xmm0
660; SKX-NEXT:    vptestmd %xmm0, %xmm0, %k1
661; SKX-NEXT:    vpmovzxwd {{.*#+}} xmm0 {%k1} {z} = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
662; SKX-NEXT:    retq
663  %a   = load <4 x i16>,<4 x i16> *%i,align 1
664  %x   = zext <4 x i16> %a to <4 x i32>
665  %ret = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> zeroinitializer
666  ret <4 x i32> %ret
667}
668
669define <4 x i32> @sext_4x16mem_to_4x32mask(<4 x i16> *%i , <4 x i1> %mask) nounwind readnone {
670; KNL-LABEL: sext_4x16mem_to_4x32mask:
671; KNL:       ## BB#0:
672; KNL-NEXT:    vpslld $31, %xmm0, %xmm0
673; KNL-NEXT:    vpsrad $31, %xmm0, %xmm0
674; KNL-NEXT:    vpmovsxwd (%rdi), %xmm1
675; KNL-NEXT:    vpand %xmm1, %xmm0, %xmm0
676; KNL-NEXT:    retq
677;
678; SKX-LABEL: sext_4x16mem_to_4x32mask:
679; SKX:       ## BB#0:
680; SKX-NEXT:    vpslld $31, %xmm0, %xmm0
681; SKX-NEXT:    vptestmd %xmm0, %xmm0, %k1
682; SKX-NEXT:    vpmovsxwd (%rdi), %xmm0 {%k1} {z}
683; SKX-NEXT:    retq
684  %a   = load <4 x i16>,<4 x i16> *%i,align 1
685  %x   = sext <4 x i16> %a to <4 x i32>
686  %ret = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> zeroinitializer
687  ret <4 x i32> %ret
688}
689
690define <4 x i32> @sext_4x16mem_to_4x32(<4 x i16> *%i) nounwind readnone {
691; ALL-LABEL: sext_4x16mem_to_4x32:
692; ALL:       ## BB#0:
693; ALL-NEXT:    vpmovsxwd (%rdi), %xmm0
694; ALL-NEXT:    retq
695  %a   = load <4 x i16>,<4 x i16> *%i,align 1
696  %x   = sext <4 x i16> %a to <4 x i32>
697  ret <4 x i32> %x
698}
699
700
701define <8 x i32> @zext_8x16mem_to_8x32(<8 x i16> *%i , <8 x i1> %mask) nounwind readnone {
702; KNL-LABEL: zext_8x16mem_to_8x32:
703; KNL:       ## BB#0:
704; KNL-NEXT:    vpmovsxwq %xmm0, %zmm0
705; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
706; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k1
707; KNL-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
708; KNL-NEXT:    vpxor %ymm1, %ymm1, %ymm1
709; KNL-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
710; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
711; KNL-NEXT:    retq
712;
713; SKX-LABEL: zext_8x16mem_to_8x32:
714; SKX:       ## BB#0:
715; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
716; SKX-NEXT:    vpmovw2m %xmm0, %k1
717; SKX-NEXT:    vpmovzxwd {{.*#+}} ymm0 {%k1} {z} = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
718; SKX-NEXT:    retq
719  %a   = load <8 x i16>,<8 x i16> *%i,align 1
720  %x   = zext <8 x i16> %a to <8 x i32>
721  %ret = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> zeroinitializer
722  ret <8 x i32> %ret
723}
724
725define <8 x i32> @sext_8x16mem_to_8x32mask(<8 x i16> *%i , <8 x i1> %mask) nounwind readnone {
726; KNL-LABEL: sext_8x16mem_to_8x32mask:
727; KNL:       ## BB#0:
728; KNL-NEXT:    vpmovsxwq %xmm0, %zmm0
729; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
730; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k1
731; KNL-NEXT:    vpmovsxwd (%rdi), %ymm0
732; KNL-NEXT:    vpxor %ymm1, %ymm1, %ymm1
733; KNL-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
734; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
735; KNL-NEXT:    retq
736;
737; SKX-LABEL: sext_8x16mem_to_8x32mask:
738; SKX:       ## BB#0:
739; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
740; SKX-NEXT:    vpmovw2m %xmm0, %k1
741; SKX-NEXT:    vpmovsxwd (%rdi), %ymm0 {%k1} {z}
742; SKX-NEXT:    retq
743  %a   = load <8 x i16>,<8 x i16> *%i,align 1
744  %x   = sext <8 x i16> %a to <8 x i32>
745  %ret = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> zeroinitializer
746  ret <8 x i32> %ret
747}
748
749define <8 x i32> @sext_8x16mem_to_8x32(<8 x i16> *%i) nounwind readnone {
750; ALL-LABEL: sext_8x16mem_to_8x32:
751; ALL:       ## BB#0:
752; ALL-NEXT:    vpmovsxwd (%rdi), %ymm0
753; ALL-NEXT:    retq
754  %a   = load <8 x i16>,<8 x i16> *%i,align 1
755  %x   = sext <8 x i16> %a to <8 x i32>
756  ret <8 x i32> %x
757}
758
759define <8 x i32> @zext_8x16_to_8x32mask(<8 x i16> %a , <8 x i1> %mask) nounwind readnone {
760; KNL-LABEL: zext_8x16_to_8x32mask:
761; KNL:       ## BB#0:
762; KNL-NEXT:    vpmovsxwq %xmm1, %zmm1
763; KNL-NEXT:    vpsllq $63, %zmm1, %zmm1
764; KNL-NEXT:    vptestmq %zmm1, %zmm1, %k1
765; KNL-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
766; KNL-NEXT:    vpxor %ymm1, %ymm1, %ymm1
767; KNL-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}
768; KNL-NEXT:    ## kill: %YMM0<def> %YMM0<kill> %ZMM0<kill>
769; KNL-NEXT:    retq
770;
771; SKX-LABEL: zext_8x16_to_8x32mask:
772; SKX:       ## BB#0:
773; SKX-NEXT:    vpsllw $15, %xmm1, %xmm1
774; SKX-NEXT:    vpmovw2m %xmm1, %k1
775; SKX-NEXT:    vpmovzxwd {{.*#+}} ymm0 {%k1} {z} = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
776; SKX-NEXT:    retq
777  %x   = zext <8 x i16> %a to <8 x i32>
778  %ret = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> zeroinitializer
779  ret <8 x i32> %ret
780}
781
782define <8 x i32> @zext_8x16_to_8x32(<8 x i16> %a ) nounwind readnone {
783; ALL-LABEL: zext_8x16_to_8x32:
784; ALL:       ## BB#0:
785; ALL-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
786; ALL-NEXT:    retq
787  %x   = zext <8 x i16> %a to <8 x i32>
788  ret <8 x i32> %x
789}
790
791define <16 x i32> @zext_16x16mem_to_16x32(<16 x i16> *%i , <16 x i1> %mask) nounwind readnone {
792; KNL-LABEL: zext_16x16mem_to_16x32:
793; KNL:       ## BB#0:
794; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0
795; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
796; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k1
797; KNL-NEXT:    vpmovzxwd {{.*#+}} zmm0 {%k1} {z} = 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
798; KNL-NEXT:    retq
799;
800; SKX-LABEL: zext_16x16mem_to_16x32:
801; SKX:       ## BB#0:
802; SKX-NEXT:    vpsllw $7, %xmm0, %xmm0
803; SKX-NEXT:    vpmovb2m %xmm0, %k1
804; SKX-NEXT:    vpmovzxwd {{.*#+}} zmm0 {%k1} {z} = 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
805; SKX-NEXT:    retq
806  %a   = load <16 x i16>,<16 x i16> *%i,align 1
807  %x   = zext <16 x i16> %a to <16 x i32>
808  %ret = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> zeroinitializer
809  ret <16 x i32> %ret
810}
811
812define <16 x i32> @sext_16x16mem_to_16x32mask(<16 x i16> *%i , <16 x i1> %mask) nounwind readnone {
813; KNL-LABEL: sext_16x16mem_to_16x32mask:
814; KNL:       ## BB#0:
815; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0
816; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
817; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k1
818; KNL-NEXT:    vpmovsxwd (%rdi), %zmm0 {%k1} {z}
819; KNL-NEXT:    retq
820;
821; SKX-LABEL: sext_16x16mem_to_16x32mask:
822; SKX:       ## BB#0:
823; SKX-NEXT:    vpsllw $7, %xmm0, %xmm0
824; SKX-NEXT:    vpmovb2m %xmm0, %k1
825; SKX-NEXT:    vpmovsxwd (%rdi), %zmm0 {%k1} {z}
826; SKX-NEXT:    retq
827  %a   = load <16 x i16>,<16 x i16> *%i,align 1
828  %x   = sext <16 x i16> %a to <16 x i32>
829  %ret = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> zeroinitializer
830  ret <16 x i32> %ret
831}
832
833define <16 x i32> @sext_16x16mem_to_16x32(<16 x i16> *%i) nounwind readnone {
834; ALL-LABEL: sext_16x16mem_to_16x32:
835; ALL:       ## BB#0:
836; ALL-NEXT:    vpmovsxwd (%rdi), %zmm0
837; ALL-NEXT:    retq
838  %a   = load <16 x i16>,<16 x i16> *%i,align 1
839  %x   = sext <16 x i16> %a to <16 x i32>
840  ret <16 x i32> %x
841}
842define <16 x i32> @zext_16x16_to_16x32mask(<16 x i16> %a , <16 x i1> %mask) nounwind readnone {
843; KNL-LABEL: zext_16x16_to_16x32mask:
844; KNL:       ## BB#0:
845; KNL-NEXT:    vpmovsxbd %xmm1, %zmm1
846; KNL-NEXT:    vpslld $31, %zmm1, %zmm1
847; KNL-NEXT:    vptestmd %zmm1, %zmm1, %k1
848; KNL-NEXT:    vpmovzxwd {{.*#+}} zmm0 {%k1} {z} = 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
849; KNL-NEXT:    retq
850;
851; SKX-LABEL: zext_16x16_to_16x32mask:
852; SKX:       ## BB#0:
853; SKX-NEXT:    vpsllw $7, %xmm1, %xmm1
854; SKX-NEXT:    vpmovb2m %xmm1, %k1
855; SKX-NEXT:    vpmovzxwd {{.*#+}} zmm0 {%k1} {z} = 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
856; SKX-NEXT:    retq
857  %x   = zext <16 x i16> %a to <16 x i32>
858  %ret = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> zeroinitializer
859  ret <16 x i32> %ret
860}
861
862define <16 x i32> @zext_16x16_to_16x32(<16 x i16> %a ) nounwind readnone {
863; ALL-LABEL: zext_16x16_to_16x32:
864; ALL:       ## BB#0:
865; ALL-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
866; ALL-NEXT:    retq
867  %x   = zext <16 x i16> %a to <16 x i32>
868  ret <16 x i32> %x
869}
870
871define <2 x i64> @zext_2x16mem_to_2x64(<2 x i16> *%i , <2 x i1> %mask) nounwind readnone {
872; KNL-LABEL: zext_2x16mem_to_2x64:
873; KNL:       ## BB#0:
874; KNL-NEXT:    vpsllq $63, %xmm0, %xmm0
875; KNL-NEXT:    vpsrad $31, %xmm0, %xmm0
876; KNL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
877; KNL-NEXT:    vpmovzxwq {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero
878; KNL-NEXT:    vpand %xmm1, %xmm0, %xmm0
879; KNL-NEXT:    retq
880;
881; SKX-LABEL: zext_2x16mem_to_2x64:
882; SKX:       ## BB#0:
883; SKX-NEXT:    vpsllq $63, %xmm0, %xmm0
884; SKX-NEXT:    vptestmq %xmm0, %xmm0, %k1
885; SKX-NEXT:    vpmovzxwq {{.*#+}} xmm0 {%k1} {z} = mem[0],zero,zero,zero,mem[1],zero,zero,zero
886; SKX-NEXT:    retq
887  %a   = load <2 x i16>,<2 x i16> *%i,align 1
888  %x   = zext <2 x i16> %a to <2 x i64>
889  %ret = select <2 x  i1> %mask, <2 x i64> %x, <2 x i64> zeroinitializer
890  ret <2 x i64> %ret
891}
892
893define <2 x i64> @sext_2x16mem_to_2x64mask(<2 x i16> *%i , <2 x i1> %mask) nounwind readnone {
894; KNL-LABEL: sext_2x16mem_to_2x64mask:
895; KNL:       ## BB#0:
896; KNL-NEXT:    vpsllq $63, %xmm0, %xmm0
897; KNL-NEXT:    vpsrad $31, %xmm0, %xmm0
898; KNL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
899; KNL-NEXT:    vpmovsxwq (%rdi), %xmm1
900; KNL-NEXT:    vpand %xmm1, %xmm0, %xmm0
901; KNL-NEXT:    retq
902;
903; SKX-LABEL: sext_2x16mem_to_2x64mask:
904; SKX:       ## BB#0:
905; SKX-NEXT:    vpsllq $63, %xmm0, %xmm0
906; SKX-NEXT:    vptestmq %xmm0, %xmm0, %k1
907; SKX-NEXT:    vpmovsxwq (%rdi), %xmm0 {%k1} {z}
908; SKX-NEXT:    retq
909  %a   = load <2 x i16>,<2 x i16> *%i,align 1
910  %x   = sext <2 x i16> %a to <2 x i64>
911  %ret = select <2 x i1> %mask, <2 x i64> %x, <2 x i64> zeroinitializer
912  ret <2 x i64> %ret
913}
914
915define <2 x i64> @sext_2x16mem_to_2x64(<2 x i16> *%i) nounwind readnone {
916; ALL-LABEL: sext_2x16mem_to_2x64:
917; ALL:       ## BB#0:
918; ALL-NEXT:    vpmovsxwq (%rdi), %xmm0
919; ALL-NEXT:    retq
920  %a   = load <2 x i16>,<2 x i16> *%i,align 1
921  %x   = sext <2 x i16> %a to <2 x i64>
922  ret <2 x i64> %x
923}
924
925define <4 x i64> @zext_4x16mem_to_4x64(<4 x i16> *%i , <4 x i1> %mask) nounwind readnone {
926; KNL-LABEL: zext_4x16mem_to_4x64:
927; KNL:       ## BB#0:
928; KNL-NEXT:    vpslld $31, %xmm0, %xmm0
929; KNL-NEXT:    vpsrad $31, %xmm0, %xmm0
930; KNL-NEXT:    vpmovsxdq %xmm0, %ymm0
931; KNL-NEXT:    vpmovzxwq {{.*#+}} ymm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
932; KNL-NEXT:    vpand %ymm1, %ymm0, %ymm0
933; KNL-NEXT:    retq
934;
935; SKX-LABEL: zext_4x16mem_to_4x64:
936; SKX:       ## BB#0:
937; SKX-NEXT:    vpslld $31, %xmm0, %xmm0
938; SKX-NEXT:    vptestmd %xmm0, %xmm0, %k1
939; SKX-NEXT:    vpmovzxwq {{.*#+}} ymm0 {%k1} {z} = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
940; SKX-NEXT:    retq
941  %a   = load <4 x i16>,<4 x i16> *%i,align 1
942  %x   = zext <4 x i16> %a to <4 x i64>
943  %ret = select <4 x  i1> %mask, <4 x i64> %x, <4 x i64> zeroinitializer
944  ret <4 x i64> %ret
945}
946
947define <4 x i64> @sext_4x16mem_to_4x64mask(<4 x i16> *%i , <4 x i1> %mask) nounwind readnone {
948; KNL-LABEL: sext_4x16mem_to_4x64mask:
949; KNL:       ## BB#0:
950; KNL-NEXT:    vpslld $31, %xmm0, %xmm0
951; KNL-NEXT:    vpsrad $31, %xmm0, %xmm0
952; KNL-NEXT:    vpmovsxdq %xmm0, %ymm0
953; KNL-NEXT:    vpmovsxwq (%rdi), %ymm1
954; KNL-NEXT:    vpand %ymm1, %ymm0, %ymm0
955; KNL-NEXT:    retq
956;
957; SKX-LABEL: sext_4x16mem_to_4x64mask:
958; SKX:       ## BB#0:
959; SKX-NEXT:    vpslld $31, %xmm0, %xmm0
960; SKX-NEXT:    vptestmd %xmm0, %xmm0, %k1
961; SKX-NEXT:    vpmovsxwq (%rdi), %ymm0 {%k1} {z}
962; SKX-NEXT:    retq
963  %a   = load <4 x i16>,<4 x i16> *%i,align 1
964  %x   = sext <4 x i16> %a to <4 x i64>
965  %ret = select <4 x i1> %mask, <4 x i64> %x, <4 x i64> zeroinitializer
966  ret <4 x i64> %ret
967}
968
969define <4 x i64> @sext_4x16mem_to_4x64(<4 x i16> *%i) nounwind readnone {
970; ALL-LABEL: sext_4x16mem_to_4x64:
971; ALL:       ## BB#0:
972; ALL-NEXT:    vpmovsxwq (%rdi), %ymm0
973; ALL-NEXT:    retq
974  %a   = load <4 x i16>,<4 x i16> *%i,align 1
975  %x   = sext <4 x i16> %a to <4 x i64>
976  ret <4 x i64> %x
977}
978
979define <8 x i64> @zext_8x16mem_to_8x64(<8 x i16> *%i , <8 x i1> %mask) nounwind readnone {
980; KNL-LABEL: zext_8x16mem_to_8x64:
981; KNL:       ## BB#0:
982; KNL-NEXT:    vpmovsxwq %xmm0, %zmm0
983; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
984; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k1
985; KNL-NEXT:    vpmovzxwq {{.*#+}} zmm0 {%k1} {z} = 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
986; KNL-NEXT:    retq
987;
988; SKX-LABEL: zext_8x16mem_to_8x64:
989; SKX:       ## BB#0:
990; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
991; SKX-NEXT:    vpmovw2m %xmm0, %k1
992; SKX-NEXT:    vpmovzxwq {{.*#+}} zmm0 {%k1} {z} = 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
993; SKX-NEXT:    retq
994  %a   = load <8 x i16>,<8 x i16> *%i,align 1
995  %x   = zext <8 x i16> %a to <8 x i64>
996  %ret = select <8 x  i1> %mask, <8 x i64> %x, <8 x i64> zeroinitializer
997  ret <8 x i64> %ret
998}
999
1000define <8 x i64> @sext_8x16mem_to_8x64mask(<8 x i16> *%i , <8 x i1> %mask) nounwind readnone {
1001; KNL-LABEL: sext_8x16mem_to_8x64mask:
1002; KNL:       ## BB#0:
1003; KNL-NEXT:    vpmovsxwq %xmm0, %zmm0
1004; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
1005; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k1
1006; KNL-NEXT:    vpmovsxwq (%rdi), %zmm0 {%k1} {z}
1007; KNL-NEXT:    retq
1008;
1009; SKX-LABEL: sext_8x16mem_to_8x64mask:
1010; SKX:       ## BB#0:
1011; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
1012; SKX-NEXT:    vpmovw2m %xmm0, %k1
1013; SKX-NEXT:    vpmovsxwq (%rdi), %zmm0 {%k1} {z}
1014; SKX-NEXT:    retq
1015  %a   = load <8 x i16>,<8 x i16> *%i,align 1
1016  %x   = sext <8 x i16> %a to <8 x i64>
1017  %ret = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> zeroinitializer
1018  ret <8 x i64> %ret
1019}
1020
1021define <8 x i64> @sext_8x16mem_to_8x64(<8 x i16> *%i) nounwind readnone {
1022; ALL-LABEL: sext_8x16mem_to_8x64:
1023; ALL:       ## BB#0:
1024; ALL-NEXT:    vpmovsxwq (%rdi), %zmm0
1025; ALL-NEXT:    retq
1026  %a   = load <8 x i16>,<8 x i16> *%i,align 1
1027  %x   = sext <8 x i16> %a to <8 x i64>
1028  ret <8 x i64> %x
1029}
1030
1031define <8 x i64> @zext_8x16_to_8x64mask(<8 x i16> %a , <8 x i1> %mask) nounwind readnone {
1032; KNL-LABEL: zext_8x16_to_8x64mask:
1033; KNL:       ## BB#0:
1034; KNL-NEXT:    vpmovsxwq %xmm1, %zmm1
1035; KNL-NEXT:    vpsllq $63, %zmm1, %zmm1
1036; KNL-NEXT:    vptestmq %zmm1, %zmm1, %k1
1037; KNL-NEXT:    vpmovzxwq {{.*#+}} zmm0 {%k1} {z} = 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
1038; KNL-NEXT:    retq
1039;
1040; SKX-LABEL: zext_8x16_to_8x64mask:
1041; SKX:       ## BB#0:
1042; SKX-NEXT:    vpsllw $15, %xmm1, %xmm1
1043; SKX-NEXT:    vpmovw2m %xmm1, %k1
1044; SKX-NEXT:    vpmovzxwq {{.*#+}} zmm0 {%k1} {z} = 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
1045; SKX-NEXT:    retq
1046  %x   = zext <8 x i16> %a to <8 x i64>
1047  %ret = select <8 x  i1> %mask, <8 x i64> %x, <8 x i64> zeroinitializer
1048  ret <8 x i64> %ret
1049}
1050
1051define <8 x i64> @zext_8x16_to_8x64(<8 x i16> %a) nounwind readnone {
1052; ALL-LABEL: zext_8x16_to_8x64:
1053; ALL:       ## BB#0:
1054; ALL-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
1055; ALL-NEXT:    retq
1056  %ret   = zext <8 x i16> %a to <8 x i64>
1057  ret <8 x i64> %ret
1058}
1059
1060define <2 x i64> @zext_2x32mem_to_2x64(<2 x i32> *%i , <2 x i1> %mask) nounwind readnone {
1061; KNL-LABEL: zext_2x32mem_to_2x64:
1062; KNL:       ## BB#0:
1063; KNL-NEXT:    vpsllq $63, %xmm0, %xmm0
1064; KNL-NEXT:    vpsrad $31, %xmm0, %xmm0
1065; KNL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1066; KNL-NEXT:    vpmovzxdq {{.*#+}} xmm1 = mem[0],zero,mem[1],zero
1067; KNL-NEXT:    vpand %xmm1, %xmm0, %xmm0
1068; KNL-NEXT:    retq
1069;
1070; SKX-LABEL: zext_2x32mem_to_2x64:
1071; SKX:       ## BB#0:
1072; SKX-NEXT:    vpsllq $63, %xmm0, %xmm0
1073; SKX-NEXT:    vptestmq %xmm0, %xmm0, %k1
1074; SKX-NEXT:    vpmovzxdq {{.*#+}} xmm0 {%k1} {z} = mem[0],zero,mem[1],zero
1075; SKX-NEXT:    retq
1076  %a   = load <2 x i32>,<2 x i32> *%i,align 1
1077  %x   = zext <2 x i32> %a to <2 x i64>
1078  %ret = select <2 x  i1> %mask, <2 x i64> %x, <2 x i64> zeroinitializer
1079  ret <2 x i64> %ret
1080}
1081
1082define <2 x i64> @sext_2x32mem_to_2x64mask(<2 x i32> *%i , <2 x i1> %mask) nounwind readnone {
1083; KNL-LABEL: sext_2x32mem_to_2x64mask:
1084; KNL:       ## BB#0:
1085; KNL-NEXT:    vpsllq $63, %xmm0, %xmm0
1086; KNL-NEXT:    vpsrad $31, %xmm0, %xmm0
1087; KNL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1088; KNL-NEXT:    vpmovsxdq (%rdi), %xmm1
1089; KNL-NEXT:    vpand %xmm1, %xmm0, %xmm0
1090; KNL-NEXT:    retq
1091;
1092; SKX-LABEL: sext_2x32mem_to_2x64mask:
1093; SKX:       ## BB#0:
1094; SKX-NEXT:    vpsllq $63, %xmm0, %xmm0
1095; SKX-NEXT:    vptestmq %xmm0, %xmm0, %k1
1096; SKX-NEXT:    vpmovsxdq (%rdi), %xmm0 {%k1} {z}
1097; SKX-NEXT:    retq
1098  %a   = load <2 x i32>,<2 x i32> *%i,align 1
1099  %x   = sext <2 x i32> %a to <2 x i64>
1100  %ret = select <2 x i1> %mask, <2 x i64> %x, <2 x i64> zeroinitializer
1101  ret <2 x i64> %ret
1102}
1103
1104define <2 x i64> @sext_2x32mem_to_2x64(<2 x i32> *%i) nounwind readnone {
1105; ALL-LABEL: sext_2x32mem_to_2x64:
1106; ALL:       ## BB#0:
1107; ALL-NEXT:    vpmovsxdq (%rdi), %xmm0
1108; ALL-NEXT:    retq
1109  %a   = load <2 x i32>,<2 x i32> *%i,align 1
1110  %x   = sext <2 x i32> %a to <2 x i64>
1111  ret <2 x i64> %x
1112}
1113
1114define <4 x i64> @zext_4x32mem_to_4x64(<4 x i32> *%i , <4 x i1> %mask) nounwind readnone {
1115; KNL-LABEL: zext_4x32mem_to_4x64:
1116; KNL:       ## BB#0:
1117; KNL-NEXT:    vpslld $31, %xmm0, %xmm0
1118; KNL-NEXT:    vpsrad $31, %xmm0, %xmm0
1119; KNL-NEXT:    vpmovsxdq %xmm0, %ymm0
1120; KNL-NEXT:    vpmovzxdq {{.*#+}} ymm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
1121; KNL-NEXT:    vpand %ymm1, %ymm0, %ymm0
1122; KNL-NEXT:    retq
1123;
1124; SKX-LABEL: zext_4x32mem_to_4x64:
1125; SKX:       ## BB#0:
1126; SKX-NEXT:    vpslld $31, %xmm0, %xmm0
1127; SKX-NEXT:    vptestmd %xmm0, %xmm0, %k1
1128; SKX-NEXT:    vpmovzxdq {{.*#+}} ymm0 {%k1} {z} = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
1129; SKX-NEXT:    retq
1130  %a   = load <4 x i32>,<4 x i32> *%i,align 1
1131  %x   = zext <4 x i32> %a to <4 x i64>
1132  %ret = select <4 x  i1> %mask, <4 x i64> %x, <4 x i64> zeroinitializer
1133  ret <4 x i64> %ret
1134}
1135
1136define <4 x i64> @sext_4x32mem_to_4x64mask(<4 x i32> *%i , <4 x i1> %mask) nounwind readnone {
1137; KNL-LABEL: sext_4x32mem_to_4x64mask:
1138; KNL:       ## BB#0:
1139; KNL-NEXT:    vpslld $31, %xmm0, %xmm0
1140; KNL-NEXT:    vpsrad $31, %xmm0, %xmm0
1141; KNL-NEXT:    vpmovsxdq %xmm0, %ymm0
1142; KNL-NEXT:    vpmovsxdq (%rdi), %ymm1
1143; KNL-NEXT:    vpand %ymm1, %ymm0, %ymm0
1144; KNL-NEXT:    retq
1145;
1146; SKX-LABEL: sext_4x32mem_to_4x64mask:
1147; SKX:       ## BB#0:
1148; SKX-NEXT:    vpslld $31, %xmm0, %xmm0
1149; SKX-NEXT:    vptestmd %xmm0, %xmm0, %k1
1150; SKX-NEXT:    vpmovsxdq (%rdi), %ymm0 {%k1} {z}
1151; SKX-NEXT:    retq
1152  %a   = load <4 x i32>,<4 x i32> *%i,align 1
1153  %x   = sext <4 x i32> %a to <4 x i64>
1154  %ret = select <4 x i1> %mask, <4 x i64> %x, <4 x i64> zeroinitializer
1155  ret <4 x i64> %ret
1156}
1157
1158define <4 x i64> @sext_4x32mem_to_4x64(<4 x i32> *%i) nounwind readnone {
1159; ALL-LABEL: sext_4x32mem_to_4x64:
1160; ALL:       ## BB#0:
1161; ALL-NEXT:    vpmovsxdq (%rdi), %ymm0
1162; ALL-NEXT:    retq
1163  %a   = load <4 x i32>,<4 x i32> *%i,align 1
1164  %x   = sext <4 x i32> %a to <4 x i64>
1165  ret <4 x i64> %x
1166}
1167
1168define <4 x i64> @sext_4x32_to_4x64(<4 x i32> %a) nounwind readnone {
1169; ALL-LABEL: sext_4x32_to_4x64:
1170; ALL:       ## BB#0:
1171; ALL-NEXT:    vpmovsxdq %xmm0, %ymm0
1172; ALL-NEXT:    retq
1173  %x   = sext <4 x i32> %a to <4 x i64>
1174  ret <4 x i64> %x
1175}
1176
1177define <4 x i64> @zext_4x32_to_4x64mask(<4 x i32> %a , <4 x i1> %mask) nounwind readnone {
1178; KNL-LABEL: zext_4x32_to_4x64mask:
1179; KNL:       ## BB#0:
1180; KNL-NEXT:    vpslld $31, %xmm1, %xmm1
1181; KNL-NEXT:    vpsrad $31, %xmm1, %xmm1
1182; KNL-NEXT:    vpmovsxdq %xmm1, %ymm1
1183; KNL-NEXT:    vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1184; KNL-NEXT:    vpand %ymm0, %ymm1, %ymm0
1185; KNL-NEXT:    retq
1186;
1187; SKX-LABEL: zext_4x32_to_4x64mask:
1188; SKX:       ## BB#0:
1189; SKX-NEXT:    vpslld $31, %xmm1, %xmm1
1190; SKX-NEXT:    vptestmd %xmm1, %xmm1, %k1
1191; SKX-NEXT:    vpmovzxdq {{.*#+}} ymm0 {%k1} {z} = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1192; SKX-NEXT:    retq
1193  %x   = zext <4 x i32> %a to <4 x i64>
1194  %ret = select <4 x  i1> %mask, <4 x i64> %x, <4 x i64> zeroinitializer
1195  ret <4 x i64> %ret
1196}
1197
1198define <8 x i64> @zext_8x32mem_to_8x64(<8 x i32> *%i , <8 x i1> %mask) nounwind readnone {
1199; KNL-LABEL: zext_8x32mem_to_8x64:
1200; KNL:       ## BB#0:
1201; KNL-NEXT:    vpmovsxwq %xmm0, %zmm0
1202; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
1203; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k1
1204; KNL-NEXT:    vpmovzxdq {{.*#+}} zmm0 {%k1} {z} = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
1205; KNL-NEXT:    retq
1206;
1207; SKX-LABEL: zext_8x32mem_to_8x64:
1208; SKX:       ## BB#0:
1209; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
1210; SKX-NEXT:    vpmovw2m %xmm0, %k1
1211; SKX-NEXT:    vpmovzxdq {{.*#+}} zmm0 {%k1} {z} = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
1212; SKX-NEXT:    retq
1213  %a   = load <8 x i32>,<8 x i32> *%i,align 1
1214  %x   = zext <8 x i32> %a to <8 x i64>
1215  %ret = select <8 x  i1> %mask, <8 x i64> %x, <8 x i64> zeroinitializer
1216  ret <8 x i64> %ret
1217}
1218
1219define <8 x i64> @sext_8x32mem_to_8x64mask(<8 x i32> *%i , <8 x i1> %mask) nounwind readnone {
1220; KNL-LABEL: sext_8x32mem_to_8x64mask:
1221; KNL:       ## BB#0:
1222; KNL-NEXT:    vpmovsxwq %xmm0, %zmm0
1223; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
1224; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k1
1225; KNL-NEXT:    vpmovsxdq (%rdi), %zmm0 {%k1} {z}
1226; KNL-NEXT:    retq
1227;
1228; SKX-LABEL: sext_8x32mem_to_8x64mask:
1229; SKX:       ## BB#0:
1230; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
1231; SKX-NEXT:    vpmovw2m %xmm0, %k1
1232; SKX-NEXT:    vpmovsxdq (%rdi), %zmm0 {%k1} {z}
1233; SKX-NEXT:    retq
1234  %a   = load <8 x i32>,<8 x i32> *%i,align 1
1235  %x   = sext <8 x i32> %a to <8 x i64>
1236  %ret = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> zeroinitializer
1237  ret <8 x i64> %ret
1238}
1239
1240define <8 x i64> @sext_8x32mem_to_8x64(<8 x i32> *%i) nounwind readnone {
1241; ALL-LABEL: sext_8x32mem_to_8x64:
1242; ALL:       ## BB#0:
1243; ALL-NEXT:    vpmovsxdq (%rdi), %zmm0
1244; ALL-NEXT:    retq
1245  %a   = load <8 x i32>,<8 x i32> *%i,align 1
1246  %x   = sext <8 x i32> %a to <8 x i64>
1247  ret <8 x i64> %x
1248}
1249
1250define <8 x i64> @sext_8x32_to_8x64(<8 x i32> %a) nounwind readnone {
1251; ALL-LABEL: sext_8x32_to_8x64:
1252; ALL:       ## BB#0:
1253; ALL-NEXT:    vpmovsxdq %ymm0, %zmm0
1254; ALL-NEXT:    retq
1255  %x   = sext <8 x i32> %a to <8 x i64>
1256  ret <8 x i64> %x
1257}
1258
1259define <8 x i64> @zext_8x32_to_8x64mask(<8 x i32> %a , <8 x i1> %mask) nounwind readnone {
1260; KNL-LABEL: zext_8x32_to_8x64mask:
1261; KNL:       ## BB#0:
1262; KNL-NEXT:    vpmovsxwq %xmm1, %zmm1
1263; KNL-NEXT:    vpsllq $63, %zmm1, %zmm1
1264; KNL-NEXT:    vptestmq %zmm1, %zmm1, %k1
1265; KNL-NEXT:    vpmovzxdq {{.*#+}} zmm0 {%k1} {z} = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero
1266; KNL-NEXT:    retq
1267;
1268; SKX-LABEL: zext_8x32_to_8x64mask:
1269; SKX:       ## BB#0:
1270; SKX-NEXT:    vpsllw $15, %xmm1, %xmm1
1271; SKX-NEXT:    vpmovw2m %xmm1, %k1
1272; SKX-NEXT:    vpmovzxdq {{.*#+}} zmm0 {%k1} {z} = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero
1273; SKX-NEXT:    retq
1274  %x   = zext <8 x i32> %a to <8 x i64>
1275  %ret = select <8 x  i1> %mask, <8 x i64> %x, <8 x i64> zeroinitializer
1276  ret <8 x i64> %ret
1277}
1278define <8 x float> @fptrunc_test(<8 x double> %a) nounwind readnone {
1279; ALL-LABEL: fptrunc_test:
1280; ALL:       ## BB#0:
1281; ALL-NEXT:    vcvtpd2ps %zmm0, %ymm0
1282; ALL-NEXT:    retq
1283  %b = fptrunc <8 x double> %a to <8 x float>
1284  ret <8 x float> %b
1285}
1286
1287define <8 x double> @fpext_test(<8 x float> %a) nounwind readnone {
1288; ALL-LABEL: fpext_test:
1289; ALL:       ## BB#0:
1290; ALL-NEXT:    vcvtps2pd %ymm0, %zmm0
1291; ALL-NEXT:    retq
1292  %b = fpext <8 x float> %a to <8 x double>
1293  ret <8 x double> %b
1294}
1295
1296define   <16 x i32> @zext_16i1_to_16xi32(i16 %b) {
1297; ALL-LABEL: zext_16i1_to_16xi32:
1298; ALL:       ## BB#0:
1299; ALL-NEXT:    kmovw %edi, %k1
1300; ALL-NEXT:    vpbroadcastd {{.*}}(%rip), %zmm0 {%k1} {z}
1301; ALL-NEXT:    retq
1302  %a = bitcast i16 %b to <16 x i1>
1303  %c = zext <16 x i1> %a to <16 x i32>
1304  ret <16 x i32> %c
1305}
1306
1307define   <8 x i64> @zext_8i1_to_8xi64(i8 %b) {
1308; KNL-LABEL: zext_8i1_to_8xi64:
1309; KNL:       ## BB#0:
1310; KNL-NEXT:    kmovw %edi, %k1
1311; KNL-NEXT:    vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z}
1312; KNL-NEXT:    retq
1313;
1314; SKX-LABEL: zext_8i1_to_8xi64:
1315; SKX:       ## BB#0:
1316; SKX-NEXT:    kmovb %edi, %k1
1317; SKX-NEXT:    vpbroadcastq {{.*}}(%rip), %zmm0 {%k1} {z}
1318; SKX-NEXT:    retq
1319  %a = bitcast i8 %b to <8 x i1>
1320  %c = zext <8 x i1> %a to <8 x i64>
1321  ret <8 x i64> %c
1322}
1323
1324define i16 @trunc_16i8_to_16i1(<16 x i8> %a) {
1325; KNL-LABEL: trunc_16i8_to_16i1:
1326; KNL:       ## BB#0:
1327; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0
1328; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
1329; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1330; KNL-NEXT:    kmovw %k0, %eax
1331; KNL-NEXT:    retq
1332;
1333; SKX-LABEL: trunc_16i8_to_16i1:
1334; SKX:       ## BB#0:
1335; SKX-NEXT:    vpsllw $7, %xmm0, %xmm0
1336; SKX-NEXT:    vpmovb2m %xmm0, %k0
1337; SKX-NEXT:    kmovw %k0, %eax
1338; SKX-NEXT:    retq
1339  %mask_b = trunc <16 x i8>%a to <16 x i1>
1340  %mask = bitcast <16 x i1> %mask_b to i16
1341  ret i16 %mask
1342}
1343
1344define i16 @trunc_16i32_to_16i1(<16 x i32> %a) {
1345; ALL-LABEL: trunc_16i32_to_16i1:
1346; ALL:       ## BB#0:
1347; ALL-NEXT:    vpslld $31, %zmm0, %zmm0
1348; ALL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1349; ALL-NEXT:    kmovw %k0, %eax
1350; ALL-NEXT:    retq
1351  %mask_b = trunc <16 x i32>%a to <16 x i1>
1352  %mask = bitcast <16 x i1> %mask_b to i16
1353  ret i16 %mask
1354}
1355
1356define <4 x i32> @trunc_4i32_to_4i1(<4 x i32> %a, <4 x i32> %b) {
1357; KNL-LABEL: trunc_4i32_to_4i1:
1358; KNL:       ## BB#0:
1359; KNL-NEXT:    vpand %xmm1, %xmm0, %xmm0
1360; KNL-NEXT:    vpslld $31, %xmm0, %xmm0
1361; KNL-NEXT:    vpsrad $31, %xmm0, %xmm0
1362; KNL-NEXT:    retq
1363;
1364; SKX-LABEL: trunc_4i32_to_4i1:
1365; SKX:       ## BB#0:
1366; SKX-NEXT:    vpslld $31, %xmm0, %xmm0
1367; SKX-NEXT:    vptestmd %xmm0, %xmm0, %k1
1368; SKX-NEXT:    vpslld $31, %xmm1, %xmm0
1369; SKX-NEXT:    vptestmd %xmm0, %xmm0, %k0 {%k1}
1370; SKX-NEXT:    vpmovm2d %k0, %xmm0
1371; SKX-NEXT:    retq
1372  %mask_a = trunc <4 x i32>%a to <4 x i1>
1373  %mask_b = trunc <4 x i32>%b to <4 x i1>
1374  %a_and_b = and <4 x i1>%mask_a, %mask_b
1375  %res = sext <4 x i1>%a_and_b to <4 x i32>
1376  ret <4 x i32>%res
1377}
1378
1379
1380define i8 @trunc_8i16_to_8i1(<8 x i16> %a) {
1381; KNL-LABEL: trunc_8i16_to_8i1:
1382; KNL:       ## BB#0:
1383; KNL-NEXT:    vpmovsxwq %xmm0, %zmm0
1384; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
1385; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k0
1386; KNL-NEXT:    kmovw %k0, %eax
1387; KNL-NEXT:    retq
1388;
1389; SKX-LABEL: trunc_8i16_to_8i1:
1390; SKX:       ## BB#0:
1391; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
1392; SKX-NEXT:    vpmovw2m %xmm0, %k0
1393; SKX-NEXT:    kmovb %k0, %eax
1394; SKX-NEXT:    retq
1395  %mask_b = trunc <8 x i16>%a to <8 x i1>
1396  %mask = bitcast <8 x i1> %mask_b to i8
1397  ret i8 %mask
1398}
1399
1400define <8 x i32> @sext_8i1_8i32(<8 x i32> %a1, <8 x i32> %a2) nounwind {
1401; KNL-LABEL: sext_8i1_8i32:
1402; KNL:       ## BB#0:
1403; KNL-NEXT:    vpcmpgtd %ymm0, %ymm1, %ymm0
1404; KNL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
1405; KNL-NEXT:    vpxor %ymm1, %ymm0, %ymm0
1406; KNL-NEXT:    retq
1407;
1408; SKX-LABEL: sext_8i1_8i32:
1409; SKX:       ## BB#0:
1410; SKX-NEXT:    vpcmpled %ymm0, %ymm1, %k0
1411; SKX-NEXT:    vpmovm2d %k0, %ymm0
1412; SKX-NEXT:    retq
1413  %x = icmp slt <8 x i32> %a1, %a2
1414  %x1 = xor <8 x i1>%x, <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>
1415  %y = sext <8 x i1> %x1 to <8 x i32>
1416  ret <8 x i32> %y
1417}
1418
1419
1420define i16 @trunc_i32_to_i1(i32 %a) {
1421; ALL-LABEL: trunc_i32_to_i1:
1422; ALL:       ## BB#0:
1423; ALL-NEXT:    andl $1, %edi
1424; ALL-NEXT:    kmovw %edi, %k0
1425; ALL-NEXT:    movw $-4, %ax
1426; ALL-NEXT:    kmovw %eax, %k1
1427; ALL-NEXT:    kshiftrw $1, %k1, %k1
1428; ALL-NEXT:    kshiftlw $1, %k1, %k1
1429; ALL-NEXT:    korw %k0, %k1, %k0
1430; ALL-NEXT:    kmovw %k0, %eax
1431; ALL-NEXT:    retq
1432  %a_i = trunc i32 %a to i1
1433  %maskv = insertelement <16 x i1> <i1 true, i1 false, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, i1 %a_i, i32 0
1434  %res = bitcast <16 x i1> %maskv to i16
1435  ret i16 %res
1436}
1437
1438define <8 x i16> @sext_8i1_8i16(<8 x i32> %a1, <8 x i32> %a2) nounwind {
1439; KNL-LABEL: sext_8i1_8i16:
1440; KNL:       ## BB#0:
1441; KNL-NEXT:    vpcmpgtd %ymm0, %ymm1, %ymm0
1442; KNL-NEXT:    vpmovdw %zmm0, %ymm0
1443; KNL-NEXT:    ## kill: %XMM0<def> %XMM0<kill> %YMM0<kill>
1444; KNL-NEXT:    retq
1445;
1446; SKX-LABEL: sext_8i1_8i16:
1447; SKX:       ## BB#0:
1448; SKX-NEXT:    vpcmpgtd %ymm0, %ymm1, %k0
1449; SKX-NEXT:    vpmovm2w %k0, %xmm0
1450; SKX-NEXT:    retq
1451  %x = icmp slt <8 x i32> %a1, %a2
1452  %y = sext <8 x i1> %x to <8 x i16>
1453  ret <8 x i16> %y
1454}
1455
1456define <16 x i32> @sext_16i1_16i32(<16 x i32> %a1, <16 x i32> %a2) nounwind {
1457; KNL-LABEL: sext_16i1_16i32:
1458; KNL:       ## BB#0:
1459; KNL-NEXT:    vpcmpgtd %zmm0, %zmm1, %k1
1460; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0
1461; KNL-NEXT:    vmovdqa32 %zmm0, %zmm0 {%k1} {z}
1462; KNL-NEXT:    retq
1463;
1464; SKX-LABEL: sext_16i1_16i32:
1465; SKX:       ## BB#0:
1466; SKX-NEXT:    vpcmpgtd %zmm0, %zmm1, %k0
1467; SKX-NEXT:    vpmovm2d %k0, %zmm0
1468; SKX-NEXT:    retq
1469  %x = icmp slt <16 x i32> %a1, %a2
1470  %y = sext <16 x i1> %x to <16 x i32>
1471  ret <16 x i32> %y
1472}
1473
1474define <8 x i64> @sext_8i1_8i64(<8 x i32> %a1, <8 x i32> %a2) nounwind {
1475; KNL-LABEL: sext_8i1_8i64:
1476; KNL:       ## BB#0:
1477; KNL-NEXT:    vpcmpgtd %ymm0, %ymm1, %ymm0
1478; KNL-NEXT:    vpmovsxdq %ymm0, %zmm0
1479; KNL-NEXT:    retq
1480;
1481; SKX-LABEL: sext_8i1_8i64:
1482; SKX:       ## BB#0:
1483; SKX-NEXT:    vpcmpgtd %ymm0, %ymm1, %k0
1484; SKX-NEXT:    vpmovm2q %k0, %zmm0
1485; SKX-NEXT:    retq
1486  %x = icmp slt <8 x i32> %a1, %a2
1487  %y = sext <8 x i1> %x to <8 x i64>
1488  ret <8 x i64> %y
1489}
1490
1491define void @extload_v8i64(<8 x i8>* %a, <8 x i64>* %res) {
1492; ALL-LABEL: extload_v8i64:
1493; ALL:       ## BB#0:
1494; ALL-NEXT:    vpmovsxbq (%rdi), %zmm0
1495; ALL-NEXT:    vmovdqa64 %zmm0, (%rsi)
1496; ALL-NEXT:    retq
1497  %sign_load = load <8 x i8>, <8 x i8>* %a
1498  %c = sext <8 x i8> %sign_load to <8 x i64>
1499  store <8 x i64> %c, <8 x i64>* %res
1500  ret void
1501}
1502
1503define <64 x i16> @test21(<64 x i16> %x , <64 x i1> %mask) nounwind readnone {
1504; KNL-LABEL: test21:
1505; KNL:       ## BB#0:
1506; KNL-NEXT:    pushq %rbp
1507; KNL-NEXT:    pushq %r15
1508; KNL-NEXT:    pushq %r14
1509; KNL-NEXT:    pushq %r13
1510; KNL-NEXT:    pushq %r12
1511; KNL-NEXT:    pushq %rbx
1512; KNL-NEXT:    vpmovsxbd %xmm7, %zmm7
1513; KNL-NEXT:    vpslld $31, %zmm7, %zmm7
1514; KNL-NEXT:    vpmovsxbd %xmm6, %zmm6
1515; KNL-NEXT:    vpslld $31, %zmm6, %zmm6
1516; KNL-NEXT:    vpmovsxbd %xmm5, %zmm5
1517; KNL-NEXT:    vpslld $31, %zmm5, %zmm5
1518; KNL-NEXT:    vpmovsxbd %xmm4, %zmm4
1519; KNL-NEXT:    vpslld $31, %zmm4, %zmm4
1520; KNL-NEXT:    vptestmd %zmm4, %zmm4, %k0
1521; KNL-NEXT:    kshiftlw $14, %k0, %k1
1522; KNL-NEXT:    kshiftrw $15, %k1, %k1
1523; KNL-NEXT:    kmovw %k1, %eax
1524; KNL-NEXT:    kshiftlw $15, %k0, %k1
1525; KNL-NEXT:    kshiftrw $15, %k1, %k1
1526; KNL-NEXT:    kmovw %k1, %r13d
1527; KNL-NEXT:    kshiftlw $13, %k0, %k1
1528; KNL-NEXT:    kshiftrw $15, %k1, %k1
1529; KNL-NEXT:    kmovw %k1, %ecx
1530; KNL-NEXT:    kshiftlw $12, %k0, %k1
1531; KNL-NEXT:    kshiftrw $15, %k1, %k1
1532; KNL-NEXT:    kmovw %k1, %r11d
1533; KNL-NEXT:    kshiftlw $11, %k0, %k1
1534; KNL-NEXT:    kshiftrw $15, %k1, %k1
1535; KNL-NEXT:    kmovw %k1, %r8d
1536; KNL-NEXT:    kshiftlw $10, %k0, %k1
1537; KNL-NEXT:    kshiftrw $15, %k1, %k1
1538; KNL-NEXT:    kmovw %k1, %edi
1539; KNL-NEXT:    kshiftlw $9, %k0, %k1
1540; KNL-NEXT:    kshiftrw $15, %k1, %k1
1541; KNL-NEXT:    kmovw %k1, %edx
1542; KNL-NEXT:    kshiftlw $8, %k0, %k1
1543; KNL-NEXT:    kshiftrw $15, %k1, %k1
1544; KNL-NEXT:    kmovw %k1, %esi
1545; KNL-NEXT:    kshiftlw $7, %k0, %k1
1546; KNL-NEXT:    kshiftrw $15, %k1, %k1
1547; KNL-NEXT:    kmovw %k1, %ebx
1548; KNL-NEXT:    kshiftlw $6, %k0, %k1
1549; KNL-NEXT:    kshiftrw $15, %k1, %k1
1550; KNL-NEXT:    kmovw %k1, %ebp
1551; KNL-NEXT:    kshiftlw $5, %k0, %k1
1552; KNL-NEXT:    kshiftrw $15, %k1, %k1
1553; KNL-NEXT:    kmovw %k1, %r14d
1554; KNL-NEXT:    kshiftlw $4, %k0, %k1
1555; KNL-NEXT:    kshiftrw $15, %k1, %k1
1556; KNL-NEXT:    kmovw %k1, %r15d
1557; KNL-NEXT:    kshiftlw $3, %k0, %k1
1558; KNL-NEXT:    kshiftrw $15, %k1, %k1
1559; KNL-NEXT:    kmovw %k1, %r12d
1560; KNL-NEXT:    kshiftlw $2, %k0, %k1
1561; KNL-NEXT:    kshiftrw $15, %k1, %k1
1562; KNL-NEXT:    kmovw %k1, %r10d
1563; KNL-NEXT:    kshiftlw $1, %k0, %k1
1564; KNL-NEXT:    kshiftrw $15, %k1, %k1
1565; KNL-NEXT:    kmovw %k1, %r9d
1566; KNL-NEXT:    vptestmd %zmm5, %zmm5, %k1
1567; KNL-NEXT:    kshiftrw $15, %k0, %k0
1568; KNL-NEXT:    vmovd %r13d, %xmm4
1569; KNL-NEXT:    kmovw %k0, %r13d
1570; KNL-NEXT:    kshiftlw $14, %k1, %k0
1571; KNL-NEXT:    kshiftrw $15, %k0, %k0
1572; KNL-NEXT:    vpinsrb $1, %eax, %xmm4, %xmm4
1573; KNL-NEXT:    kmovw %k0, %eax
1574; KNL-NEXT:    kshiftlw $15, %k1, %k0
1575; KNL-NEXT:    kshiftrw $15, %k0, %k0
1576; KNL-NEXT:    vpinsrb $2, %ecx, %xmm4, %xmm4
1577; KNL-NEXT:    kmovw %k0, %ecx
1578; KNL-NEXT:    kshiftlw $13, %k1, %k0
1579; KNL-NEXT:    kshiftrw $15, %k0, %k0
1580; KNL-NEXT:    vpinsrb $3, %r11d, %xmm4, %xmm4
1581; KNL-NEXT:    kmovw %k0, %r11d
1582; KNL-NEXT:    kshiftlw $12, %k1, %k0
1583; KNL-NEXT:    kshiftrw $15, %k0, %k0
1584; KNL-NEXT:    vpinsrb $4, %r8d, %xmm4, %xmm4
1585; KNL-NEXT:    kmovw %k0, %r8d
1586; KNL-NEXT:    kshiftlw $11, %k1, %k0
1587; KNL-NEXT:    kshiftrw $15, %k0, %k0
1588; KNL-NEXT:    vpinsrb $5, %edi, %xmm4, %xmm4
1589; KNL-NEXT:    kmovw %k0, %edi
1590; KNL-NEXT:    movl %edi, -{{[0-9]+}}(%rsp) ## 4-byte Spill
1591; KNL-NEXT:    kshiftlw $10, %k1, %k0
1592; KNL-NEXT:    kshiftrw $15, %k0, %k0
1593; KNL-NEXT:    vpinsrb $6, %edx, %xmm4, %xmm4
1594; KNL-NEXT:    kmovw %k0, %edx
1595; KNL-NEXT:    kshiftlw $9, %k1, %k0
1596; KNL-NEXT:    kshiftrw $15, %k0, %k0
1597; KNL-NEXT:    vpinsrb $7, %esi, %xmm4, %xmm4
1598; KNL-NEXT:    kmovw %k0, %esi
1599; KNL-NEXT:    kshiftlw $8, %k1, %k0
1600; KNL-NEXT:    kshiftrw $15, %k0, %k0
1601; KNL-NEXT:    vpinsrb $8, %ebx, %xmm4, %xmm4
1602; KNL-NEXT:    kmovw %k0, %ebx
1603; KNL-NEXT:    kshiftlw $7, %k1, %k0
1604; KNL-NEXT:    kshiftrw $15, %k0, %k0
1605; KNL-NEXT:    vpinsrb $9, %ebp, %xmm4, %xmm4
1606; KNL-NEXT:    kmovw %k0, %ebp
1607; KNL-NEXT:    kshiftlw $6, %k1, %k0
1608; KNL-NEXT:    kshiftrw $15, %k0, %k0
1609; KNL-NEXT:    vpinsrb $10, %r14d, %xmm4, %xmm4
1610; KNL-NEXT:    kmovw %k0, %r14d
1611; KNL-NEXT:    kshiftlw $5, %k1, %k0
1612; KNL-NEXT:    kshiftrw $15, %k0, %k0
1613; KNL-NEXT:    vpinsrb $11, %r15d, %xmm4, %xmm4
1614; KNL-NEXT:    kmovw %k0, %r15d
1615; KNL-NEXT:    kshiftlw $4, %k1, %k0
1616; KNL-NEXT:    kshiftrw $15, %k0, %k0
1617; KNL-NEXT:    vpinsrb $12, %r12d, %xmm4, %xmm4
1618; KNL-NEXT:    kmovw %k0, %edi
1619; KNL-NEXT:    kshiftlw $3, %k1, %k0
1620; KNL-NEXT:    kshiftrw $15, %k0, %k0
1621; KNL-NEXT:    vpinsrb $13, %r10d, %xmm4, %xmm4
1622; KNL-NEXT:    kmovw %k0, %r10d
1623; KNL-NEXT:    kshiftlw $2, %k1, %k0
1624; KNL-NEXT:    kshiftrw $15, %k0, %k0
1625; KNL-NEXT:    vpinsrb $14, %r9d, %xmm4, %xmm4
1626; KNL-NEXT:    kmovw %k0, %r9d
1627; KNL-NEXT:    kshiftlw $1, %k1, %k0
1628; KNL-NEXT:    kshiftrw $15, %k0, %k0
1629; KNL-NEXT:    vpinsrb $15, %r13d, %xmm4, %xmm4
1630; KNL-NEXT:    kmovw %k0, %r12d
1631; KNL-NEXT:    vptestmd %zmm6, %zmm6, %k0
1632; KNL-NEXT:    kshiftrw $15, %k1, %k1
1633; KNL-NEXT:    vmovd %ecx, %xmm5
1634; KNL-NEXT:    kmovw %k1, %r13d
1635; KNL-NEXT:    kshiftlw $14, %k0, %k1
1636; KNL-NEXT:    kshiftrw $15, %k1, %k1
1637; KNL-NEXT:    vpinsrb $1, %eax, %xmm5, %xmm5
1638; KNL-NEXT:    kmovw %k1, %eax
1639; KNL-NEXT:    movl %eax, -{{[0-9]+}}(%rsp) ## 4-byte Spill
1640; KNL-NEXT:    kshiftlw $15, %k0, %k1
1641; KNL-NEXT:    kshiftrw $15, %k1, %k1
1642; KNL-NEXT:    vpinsrb $2, %r11d, %xmm5, %xmm5
1643; KNL-NEXT:    kmovw %k1, %eax
1644; KNL-NEXT:    kshiftlw $13, %k0, %k1
1645; KNL-NEXT:    kshiftrw $15, %k1, %k1
1646; KNL-NEXT:    vpinsrb $3, %r8d, %xmm5, %xmm5
1647; KNL-NEXT:    kmovw %k1, %ecx
1648; KNL-NEXT:    movl %ecx, -{{[0-9]+}}(%rsp) ## 4-byte Spill
1649; KNL-NEXT:    kshiftlw $12, %k0, %k1
1650; KNL-NEXT:    kshiftrw $15, %k1, %k1
1651; KNL-NEXT:    vpinsrb $4, -{{[0-9]+}}(%rsp), %xmm5, %xmm5 ## 4-byte Folded Reload
1652; KNL-NEXT:    kmovw %k1, %ecx
1653; KNL-NEXT:    kshiftlw $11, %k0, %k1
1654; KNL-NEXT:    kshiftrw $15, %k1, %k1
1655; KNL-NEXT:    vpinsrb $5, %edx, %xmm5, %xmm5
1656; KNL-NEXT:    kmovw %k1, %r8d
1657; KNL-NEXT:    kshiftlw $10, %k0, %k1
1658; KNL-NEXT:    kshiftrw $15, %k1, %k1
1659; KNL-NEXT:    vpinsrb $6, %esi, %xmm5, %xmm5
1660; KNL-NEXT:    kmovw %k1, %edx
1661; KNL-NEXT:    kshiftlw $9, %k0, %k1
1662; KNL-NEXT:    kshiftrw $15, %k1, %k1
1663; KNL-NEXT:    vpinsrb $7, %ebx, %xmm5, %xmm5
1664; KNL-NEXT:    kmovw %k1, %esi
1665; KNL-NEXT:    kshiftlw $8, %k0, %k1
1666; KNL-NEXT:    kshiftrw $15, %k1, %k1
1667; KNL-NEXT:    vpinsrb $8, %ebp, %xmm5, %xmm5
1668; KNL-NEXT:    kmovw %k1, %ebp
1669; KNL-NEXT:    kshiftlw $7, %k0, %k1
1670; KNL-NEXT:    kshiftrw $15, %k1, %k1
1671; KNL-NEXT:    vpinsrb $9, %r14d, %xmm5, %xmm5
1672; KNL-NEXT:    kmovw %k1, %ebx
1673; KNL-NEXT:    kshiftlw $6, %k0, %k1
1674; KNL-NEXT:    kshiftrw $15, %k1, %k1
1675; KNL-NEXT:    vpinsrb $10, %r15d, %xmm5, %xmm5
1676; KNL-NEXT:    kmovw %k1, %r11d
1677; KNL-NEXT:    kshiftlw $5, %k0, %k1
1678; KNL-NEXT:    kshiftrw $15, %k1, %k1
1679; KNL-NEXT:    vpinsrb $11, %edi, %xmm5, %xmm5
1680; KNL-NEXT:    kmovw %k1, %edi
1681; KNL-NEXT:    kshiftlw $4, %k0, %k1
1682; KNL-NEXT:    kshiftrw $15, %k1, %k1
1683; KNL-NEXT:    vpinsrb $12, %r10d, %xmm5, %xmm5
1684; KNL-NEXT:    kmovw %k1, %r10d
1685; KNL-NEXT:    kshiftlw $3, %k0, %k1
1686; KNL-NEXT:    kshiftrw $15, %k1, %k1
1687; KNL-NEXT:    vpinsrb $13, %r9d, %xmm5, %xmm5
1688; KNL-NEXT:    kmovw %k1, %r9d
1689; KNL-NEXT:    kshiftlw $2, %k0, %k1
1690; KNL-NEXT:    kshiftrw $15, %k1, %k1
1691; KNL-NEXT:    vpinsrb $14, %r12d, %xmm5, %xmm5
1692; KNL-NEXT:    kmovw %k1, %r14d
1693; KNL-NEXT:    kshiftlw $1, %k0, %k1
1694; KNL-NEXT:    kshiftrw $15, %k1, %k1
1695; KNL-NEXT:    vpinsrb $15, %r13d, %xmm5, %xmm5
1696; KNL-NEXT:    kmovw %k1, %r15d
1697; KNL-NEXT:    vptestmd %zmm7, %zmm7, %k1
1698; KNL-NEXT:    kshiftrw $15, %k0, %k0
1699; KNL-NEXT:    vmovd %eax, %xmm6
1700; KNL-NEXT:    kmovw %k0, %r12d
1701; KNL-NEXT:    kshiftlw $14, %k1, %k0
1702; KNL-NEXT:    kshiftrw $15, %k0, %k0
1703; KNL-NEXT:    vpinsrb $1, -{{[0-9]+}}(%rsp), %xmm6, %xmm6 ## 4-byte Folded Reload
1704; KNL-NEXT:    kmovw %k0, %r13d
1705; KNL-NEXT:    kshiftlw $15, %k1, %k0
1706; KNL-NEXT:    kshiftrw $15, %k0, %k0
1707; KNL-NEXT:    vpinsrb $2, -{{[0-9]+}}(%rsp), %xmm6, %xmm6 ## 4-byte Folded Reload
1708; KNL-NEXT:    kmovw %k0, %eax
1709; KNL-NEXT:    kshiftlw $13, %k1, %k0
1710; KNL-NEXT:    kshiftrw $15, %k0, %k0
1711; KNL-NEXT:    vpinsrb $3, %ecx, %xmm6, %xmm6
1712; KNL-NEXT:    kmovw %k0, %ecx
1713; KNL-NEXT:    kshiftlw $12, %k1, %k0
1714; KNL-NEXT:    kshiftrw $15, %k0, %k0
1715; KNL-NEXT:    vpinsrb $4, %r8d, %xmm6, %xmm6
1716; KNL-NEXT:    kmovw %k0, %r8d
1717; KNL-NEXT:    kshiftlw $11, %k1, %k0
1718; KNL-NEXT:    kshiftrw $15, %k0, %k0
1719; KNL-NEXT:    vpinsrb $5, %edx, %xmm6, %xmm6
1720; KNL-NEXT:    kmovw %k0, %edx
1721; KNL-NEXT:    kshiftlw $10, %k1, %k0
1722; KNL-NEXT:    kshiftrw $15, %k0, %k0
1723; KNL-NEXT:    vpinsrb $6, %esi, %xmm6, %xmm6
1724; KNL-NEXT:    kmovw %k0, %esi
1725; KNL-NEXT:    kshiftlw $9, %k1, %k0
1726; KNL-NEXT:    kshiftrw $15, %k0, %k0
1727; KNL-NEXT:    vpinsrb $7, %ebp, %xmm6, %xmm6
1728; KNL-NEXT:    kmovw %k0, %ebp
1729; KNL-NEXT:    kshiftlw $8, %k1, %k0
1730; KNL-NEXT:    kshiftrw $15, %k0, %k0
1731; KNL-NEXT:    vpinsrb $8, %ebx, %xmm6, %xmm6
1732; KNL-NEXT:    kmovw %k0, %ebx
1733; KNL-NEXT:    kshiftlw $7, %k1, %k0
1734; KNL-NEXT:    kshiftrw $15, %k0, %k0
1735; KNL-NEXT:    vpinsrb $9, %r11d, %xmm6, %xmm6
1736; KNL-NEXT:    kmovw %k0, %r11d
1737; KNL-NEXT:    kshiftlw $6, %k1, %k0
1738; KNL-NEXT:    kshiftrw $15, %k0, %k0
1739; KNL-NEXT:    vpinsrb $10, %edi, %xmm6, %xmm6
1740; KNL-NEXT:    kmovw %k0, %edi
1741; KNL-NEXT:    kshiftlw $5, %k1, %k0
1742; KNL-NEXT:    kshiftrw $15, %k0, %k0
1743; KNL-NEXT:    vpinsrb $11, %r10d, %xmm6, %xmm6
1744; KNL-NEXT:    kmovw %k0, %r10d
1745; KNL-NEXT:    kshiftlw $4, %k1, %k0
1746; KNL-NEXT:    kshiftrw $15, %k0, %k0
1747; KNL-NEXT:    vpinsrb $12, %r9d, %xmm6, %xmm6
1748; KNL-NEXT:    kmovw %k0, %r9d
1749; KNL-NEXT:    kshiftlw $3, %k1, %k0
1750; KNL-NEXT:    kshiftrw $15, %k0, %k0
1751; KNL-NEXT:    vpinsrb $13, %r14d, %xmm6, %xmm6
1752; KNL-NEXT:    kmovw %k0, %r14d
1753; KNL-NEXT:    kshiftlw $2, %k1, %k0
1754; KNL-NEXT:    kshiftrw $15, %k0, %k0
1755; KNL-NEXT:    vpinsrb $14, %r15d, %xmm6, %xmm6
1756; KNL-NEXT:    kmovw %k0, %r15d
1757; KNL-NEXT:    kshiftlw $1, %k1, %k0
1758; KNL-NEXT:    kshiftrw $15, %k0, %k0
1759; KNL-NEXT:    vpinsrb $15, %r12d, %xmm6, %xmm6
1760; KNL-NEXT:    kmovw %k0, %r12d
1761; KNL-NEXT:    kshiftrw $15, %k1, %k0
1762; KNL-NEXT:    vmovd %eax, %xmm7
1763; KNL-NEXT:    kmovw %k0, %eax
1764; KNL-NEXT:    vpinsrb $1, %r13d, %xmm7, %xmm7
1765; KNL-NEXT:    vpinsrb $2, %ecx, %xmm7, %xmm7
1766; KNL-NEXT:    vpinsrb $3, %r8d, %xmm7, %xmm7
1767; KNL-NEXT:    vpinsrb $4, %edx, %xmm7, %xmm7
1768; KNL-NEXT:    vpinsrb $5, %esi, %xmm7, %xmm7
1769; KNL-NEXT:    vpinsrb $6, %ebp, %xmm7, %xmm7
1770; KNL-NEXT:    vpinsrb $7, %ebx, %xmm7, %xmm7
1771; KNL-NEXT:    vpinsrb $8, %r11d, %xmm7, %xmm7
1772; KNL-NEXT:    vpinsrb $9, %edi, %xmm7, %xmm7
1773; KNL-NEXT:    vpinsrb $10, %r10d, %xmm7, %xmm7
1774; KNL-NEXT:    vpinsrb $11, %r9d, %xmm7, %xmm7
1775; KNL-NEXT:    vpinsrb $12, %r14d, %xmm7, %xmm7
1776; KNL-NEXT:    vpinsrb $13, %r15d, %xmm7, %xmm7
1777; KNL-NEXT:    vpmovzxbw {{.*#+}} ymm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero,xmm4[8],zero,xmm4[9],zero,xmm4[10],zero,xmm4[11],zero,xmm4[12],zero,xmm4[13],zero,xmm4[14],zero,xmm4[15],zero
1778; KNL-NEXT:    vpsllw $15, %ymm4, %ymm4
1779; KNL-NEXT:    vpsraw $15, %ymm4, %ymm4
1780; KNL-NEXT:    vpand %ymm0, %ymm4, %ymm0
1781; KNL-NEXT:    vpmovzxbw {{.*#+}} ymm4 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero,xmm5[8],zero,xmm5[9],zero,xmm5[10],zero,xmm5[11],zero,xmm5[12],zero,xmm5[13],zero,xmm5[14],zero,xmm5[15],zero
1782; KNL-NEXT:    vpsllw $15, %ymm4, %ymm4
1783; KNL-NEXT:    vpsraw $15, %ymm4, %ymm4
1784; KNL-NEXT:    vpand %ymm1, %ymm4, %ymm1
1785; KNL-NEXT:    vpmovzxbw {{.*#+}} ymm4 = xmm6[0],zero,xmm6[1],zero,xmm6[2],zero,xmm6[3],zero,xmm6[4],zero,xmm6[5],zero,xmm6[6],zero,xmm6[7],zero,xmm6[8],zero,xmm6[9],zero,xmm6[10],zero,xmm6[11],zero,xmm6[12],zero,xmm6[13],zero,xmm6[14],zero,xmm6[15],zero
1786; KNL-NEXT:    vpsllw $15, %ymm4, %ymm4
1787; KNL-NEXT:    vpsraw $15, %ymm4, %ymm4
1788; KNL-NEXT:    vpand %ymm2, %ymm4, %ymm2
1789; KNL-NEXT:    vpinsrb $14, %r12d, %xmm7, %xmm4
1790; KNL-NEXT:    vpinsrb $15, %eax, %xmm4, %xmm4
1791; KNL-NEXT:    vpmovzxbw {{.*#+}} ymm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero,xmm4[8],zero,xmm4[9],zero,xmm4[10],zero,xmm4[11],zero,xmm4[12],zero,xmm4[13],zero,xmm4[14],zero,xmm4[15],zero
1792; KNL-NEXT:    vpsllw $15, %ymm4, %ymm4
1793; KNL-NEXT:    vpsraw $15, %ymm4, %ymm4
1794; KNL-NEXT:    vpand %ymm3, %ymm4, %ymm3
1795; KNL-NEXT:    popq %rbx
1796; KNL-NEXT:    popq %r12
1797; KNL-NEXT:    popq %r13
1798; KNL-NEXT:    popq %r14
1799; KNL-NEXT:    popq %r15
1800; KNL-NEXT:    popq %rbp
1801; KNL-NEXT:    retq
1802;
1803; SKX-LABEL: test21:
1804; SKX:       ## BB#0:
1805; SKX-NEXT:    vpsllw $7, %zmm2, %zmm2
1806; SKX-NEXT:    vpmovb2m %zmm2, %k1
1807; SKX-NEXT:    vmovdqu16 %zmm0, %zmm0 {%k1} {z}
1808; SKX-NEXT:    kshiftrq $32, %k1, %k1
1809; SKX-NEXT:    vmovdqu16 %zmm1, %zmm1 {%k1} {z}
1810; SKX-NEXT:    retq
1811  %ret = select <64 x i1> %mask, <64 x i16> %x, <64 x i16> zeroinitializer
1812  ret <64 x i16> %ret
1813}
1814
1815define <16 x i16> @shuffle_zext_16x8_to_16x16(<16 x i8> %a) nounwind readnone {
1816; ALL-LABEL: shuffle_zext_16x8_to_16x16:
1817; ALL:       ## BB#0:
1818; ALL-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
1819; ALL-NEXT:    retq
1820  %1 = shufflevector <16 x i8> %a, <16 x i8> zeroinitializer, <32 x i32> <i32 0, i32 16, i32 1, i32 16, i32 2, i32 16, i32 3, i32 16, i32 4, i32 16, i32 5, i32 16, i32 6, i32 16, i32 7, i32 16, i32 8, i32 16, i32 9, i32 16, i32 10, i32 16, i32 11, i32 16, i32 12, i32 16, i32 13, i32 16, i32 14, i32 16, i32 15, i32 16>
1821  %2 = bitcast <32 x i8> %1 to <16 x i16>
1822  ret <16 x i16> %2
1823}
1824
1825define <16 x i16> @shuffle_zext_16x8_to_16x16_mask(<16 x i8> %a, <16 x i1> %mask) nounwind readnone {
1826; KNL-LABEL: shuffle_zext_16x8_to_16x16_mask:
1827; KNL:       ## BB#0:
1828; KNL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1829; KNL-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
1830; KNL-NEXT:    vpsllw $15, %ymm1, %ymm1
1831; KNL-NEXT:    vpsraw $15, %ymm1, %ymm1
1832; KNL-NEXT:    vpand %ymm0, %ymm1, %ymm0
1833; KNL-NEXT:    retq
1834;
1835; SKX-LABEL: shuffle_zext_16x8_to_16x16_mask:
1836; SKX:       ## BB#0:
1837; SKX-NEXT:    vpsllw $7, %xmm1, %xmm1
1838; SKX-NEXT:    vpmovb2m %xmm1, %k1
1839; SKX-NEXT:    vpmovzxbw {{.*#+}} ymm0 {%k1} {z} = 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
1840; SKX-NEXT:    retq
1841  %x   = shufflevector <16 x i8> %a, <16 x i8> zeroinitializer, <32 x i32> <i32 0, i32 16, i32 1, i32 16, i32 2, i32 16, i32 3, i32 16, i32 4, i32 16, i32 5, i32 16, i32 6, i32 16, i32 7, i32 16, i32 8, i32 16, i32 9, i32 16, i32 10, i32 16, i32 11, i32 16, i32 12, i32 16, i32 13, i32 16, i32 14, i32 16, i32 15, i32 16>
1842  %bc  = bitcast <32 x i8> %x to <16 x i16>
1843  %ret = select <16 x i1> %mask, <16 x i16> %bc, <16 x i16> zeroinitializer
1844  ret <16 x i16> %ret
1845}
1846
1847define <16 x i16> @zext_32x8_to_16x16(<32 x i8> %a) {
1848; ALL-LABEL: zext_32x8_to_16x16:
1849; ALL:       ## BB#0:
1850; ALL-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
1851; ALL-NEXT:    retq
1852  %1 = shufflevector <32 x i8> %a, <32 x i8> zeroinitializer, <32 x i32> <i32 0, i32 32, i32 1, i32 32, i32 2, i32 32, i32 3, i32 32, i32 4, i32 32, i32 5, i32 32, i32 6, i32 32, i32 7, i32 32, i32 8, i32 32, i32 9, i32 32, i32 10, i32 32, i32 11, i32 32, i32 12, i32 32, i32 13, i32 32, i32 14, i32 32, i32 15, i32 32>
1853  %2 = bitcast <32 x i8> %1 to <16 x i16>
1854  ret <16 x i16> %2
1855}
1856
1857define <8 x i32> @zext_32x8_to_8x32(<32 x i8> %a) {
1858; ALL-LABEL: zext_32x8_to_8x32:
1859; ALL:       ## BB#0:
1860; ALL-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
1861; ALL-NEXT:    retq
1862  %1 = shufflevector <32 x i8> %a, <32 x i8> zeroinitializer, <32 x i32> <i32 0, i32 32, i32 32, i32 32, i32 1, i32 32, i32 32, i32 32, i32 2, i32 32, i32 32, i32 32, i32 3, i32 32, i32 32, i32 32, i32 4, i32 32, i32 32, i32 32, i32 5, i32 32, i32 32, i32 32, i32 6, i32 32, i32 32, i32 32, i32 7, i32 32, i32 32, i32 32>
1863  %2 = bitcast <32 x i8> %1 to <8 x i32>
1864  ret <8 x i32> %2
1865}
1866
1867define <4 x i64> @zext_32x8_to_4x64(<32 x i8> %a) {
1868; ALL-LABEL: zext_32x8_to_4x64:
1869; ALL:       ## BB#0:
1870; ALL-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
1871; ALL-NEXT:    retq
1872  %1 = shufflevector <32 x i8> %a, <32 x i8> zeroinitializer, <32 x i32> <i32 0, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 1, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 2, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 3, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32>
1873  %2 = bitcast <32 x i8> %1 to <4 x i64>
1874  ret <4 x i64> %2
1875}
1876
1877define <8 x i32> @zext_16x16_to_8x32(<16 x i16> %a) {
1878; ALL-LABEL: zext_16x16_to_8x32:
1879; ALL:       ## BB#0:
1880; ALL-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
1881; ALL-NEXT:    retq
1882  %1 = shufflevector <16 x i16> %a, <16 x i16> zeroinitializer, <16 x i32> <i32 0, i32 16, i32 1, i32 16, i32 2, i32 16, i32 3, i32 16, i32 4, i32 16, i32 5, i32 16, i32 6, i32 16, i32 7, i32 16>
1883  %2 = bitcast <16 x i16> %1 to <8 x i32>
1884  ret <8 x i32> %2
1885}
1886
1887define <4 x i64> @zext_16x16_to_4x64(<16 x i16> %a) {
1888; ALL-LABEL: zext_16x16_to_4x64:
1889; ALL:       ## BB#0:
1890; ALL-NEXT:    vpmovzxwq {{.*#+}} ymm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1891; ALL-NEXT:    retq
1892  %1 = shufflevector <16 x i16> %a, <16 x i16> zeroinitializer, <16 x i32> <i32 0, i32 16, i32 16, i32 16, i32 1, i32 16, i32 16, i32 16, i32 2, i32 16, i32 16, i32 16, i32 3, i32 16, i32 16, i32 16>
1893  %2 = bitcast <16 x i16> %1 to <4 x i64>
1894  ret <4 x i64> %2
1895}
1896
1897define <4 x i64> @zext_8x32_to_4x64(<8 x i32> %a) {
1898; ALL-LABEL: zext_8x32_to_4x64:
1899; ALL:       ## BB#0:
1900; ALL-NEXT:    vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1901; ALL-NEXT:    retq
1902  %1 = shufflevector <8 x i32> %a, <8 x i32> zeroinitializer, <8 x i32> <i32 0, i32 8, i32 1, i32 8, i32 2, i32 8, i32 3, i32 8>
1903  %2 = bitcast <8 x i32> %1 to <4 x i64>
1904  ret <4 x i64> %2
1905}
1906
1907define <64 x i8> @zext_64xi1_to_64xi8(<64 x i8> %x, <64 x i8> %y) #0 {
1908; KNL-LABEL: zext_64xi1_to_64xi8:
1909; KNL:       ## BB#0:
1910; KNL-NEXT:    vpcmpeqb %ymm2, %ymm0, %ymm0
1911; KNL-NEXT:    vmovdqa {{.*#+}} ymm2 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
1912; KNL-NEXT:    vpand %ymm2, %ymm0, %ymm0
1913; KNL-NEXT:    vpcmpeqb %ymm3, %ymm1, %ymm1
1914; KNL-NEXT:    vpand %ymm2, %ymm1, %ymm1
1915; KNL-NEXT:    retq
1916;
1917; SKX-LABEL: zext_64xi1_to_64xi8:
1918; SKX:       ## BB#0:
1919; SKX-NEXT:    vpcmpeqb %zmm1, %zmm0, %k1
1920; SKX-NEXT:    vmovdqu8 {{.*}}(%rip), %zmm0 {%k1} {z}
1921; SKX-NEXT:    retq
1922  %mask = icmp eq <64 x i8> %x, %y
1923  %1 = zext <64 x i1> %mask to <64 x i8>
1924  ret <64 x i8> %1
1925}
1926
1927define <32 x i16> @zext_32xi1_to_32xi16(<32 x i16> %x, <32 x i16> %y) #0 {
1928; KNL-LABEL: zext_32xi1_to_32xi16:
1929; KNL:       ## BB#0:
1930; KNL-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm0
1931; KNL-NEXT:    vpsrlw $15, %ymm0, %ymm0
1932; KNL-NEXT:    vpcmpeqw %ymm3, %ymm1, %ymm1
1933; KNL-NEXT:    vpsrlw $15, %ymm1, %ymm1
1934; KNL-NEXT:    retq
1935;
1936; SKX-LABEL: zext_32xi1_to_32xi16:
1937; SKX:       ## BB#0:
1938; SKX-NEXT:    vpcmpeqw %zmm1, %zmm0, %k1
1939; SKX-NEXT:    vmovdqu16 {{.*}}(%rip), %zmm0 {%k1} {z}
1940; SKX-NEXT:    retq
1941  %mask = icmp eq <32 x i16> %x, %y
1942  %1 = zext <32 x i1> %mask to <32 x i16>
1943  ret <32 x i16> %1
1944}
1945
1946define <16 x i16> @zext_16xi1_to_16xi16(<16 x i16> %x, <16 x i16> %y) #0 {
1947; KNL-LABEL: zext_16xi1_to_16xi16:
1948; KNL:       ## BB#0:
1949; KNL-NEXT:    vpcmpeqw %ymm1, %ymm0, %ymm0
1950; KNL-NEXT:    vpsrlw $15, %ymm0, %ymm0
1951; KNL-NEXT:    retq
1952;
1953; SKX-LABEL: zext_16xi1_to_16xi16:
1954; SKX:       ## BB#0:
1955; SKX-NEXT:    vpcmpeqw %ymm1, %ymm0, %k1
1956; SKX-NEXT:    vmovdqu16 {{.*}}(%rip), %ymm0 {%k1} {z}
1957; SKX-NEXT:    retq
1958  %mask = icmp eq <16 x i16> %x, %y
1959  %1 = zext <16 x i1> %mask to <16 x i16>
1960  ret <16 x i16> %1
1961}
1962
1963
1964define <32 x i8> @zext_32xi1_to_32xi8(<32 x i16> %x, <32 x i16> %y) #0 {
1965; KNL-LABEL: zext_32xi1_to_32xi8:
1966; KNL:       ## BB#0:
1967; KNL-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm0
1968; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0
1969; KNL-NEXT:    vpmovdb %zmm0, %xmm0
1970; KNL-NEXT:    vpcmpeqw %ymm3, %ymm1, %ymm1
1971; KNL-NEXT:    vpmovsxwd %ymm1, %zmm1
1972; KNL-NEXT:    vpmovdb %zmm1, %xmm1
1973; KNL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1974; KNL-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1975; KNL-NEXT:    retq
1976;
1977; SKX-LABEL: zext_32xi1_to_32xi8:
1978; SKX:       ## BB#0:
1979; SKX-NEXT:    vpcmpeqw %zmm1, %zmm0, %k1
1980; SKX-NEXT:    vmovdqu8 {{.*}}(%rip), %ymm0 {%k1} {z}
1981; SKX-NEXT:    retq
1982  %mask = icmp eq <32 x i16> %x, %y
1983  %1 = zext <32 x i1> %mask to <32 x i8>
1984  ret <32 x i8> %1
1985}
1986
1987define <4 x i32> @zext_4xi1_to_4x32(<4 x i8> %x, <4 x i8> %y) #0 {
1988; KNL-LABEL: zext_4xi1_to_4x32:
1989; KNL:       ## BB#0:
1990; KNL-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
1991; KNL-NEXT:    vpand %xmm2, %xmm1, %xmm1
1992; KNL-NEXT:    vpand %xmm2, %xmm0, %xmm0
1993; KNL-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
1994; KNL-NEXT:    vpsrld $31, %xmm0, %xmm0
1995; KNL-NEXT:    retq
1996;
1997; SKX-LABEL: zext_4xi1_to_4x32:
1998; SKX:       ## BB#0:
1999; SKX-NEXT:    vmovdqa64 {{.*#+}} xmm2 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
2000; SKX-NEXT:    vpandq %xmm2, %xmm1, %xmm1
2001; SKX-NEXT:    vpandq %xmm2, %xmm0, %xmm0
2002; SKX-NEXT:    vpcmpeqd %xmm1, %xmm0, %k1
2003; SKX-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm0 {%k1} {z}
2004; SKX-NEXT:    retq
2005  %mask = icmp eq <4 x i8> %x, %y
2006  %1 = zext <4 x i1> %mask to <4 x i32>
2007  ret <4 x i32> %1
2008}
2009
2010define <2 x i64> @zext_2xi1_to_2xi64(<2 x i8> %x, <2 x i8> %y) #0 {
2011; KNL-LABEL: zext_2xi1_to_2xi64:
2012; KNL:       ## BB#0:
2013; KNL-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
2014; KNL-NEXT:    vpand %xmm2, %xmm1, %xmm1
2015; KNL-NEXT:    vpand %xmm2, %xmm0, %xmm0
2016; KNL-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
2017; KNL-NEXT:    vpsrlq $63, %xmm0, %xmm0
2018; KNL-NEXT:    retq
2019;
2020; SKX-LABEL: zext_2xi1_to_2xi64:
2021; SKX:       ## BB#0:
2022; SKX-NEXT:    vmovdqa64 {{.*#+}} xmm2 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
2023; SKX-NEXT:    vpandq %xmm2, %xmm1, %xmm1
2024; SKX-NEXT:    vpandq %xmm2, %xmm0, %xmm0
2025; SKX-NEXT:    vpcmpeqq %xmm1, %xmm0, %k1
2026; SKX-NEXT:    vmovdqa64 {{.*}}(%rip), %xmm0 {%k1} {z}
2027; SKX-NEXT:    retq
2028  %mask = icmp eq <2 x i8> %x, %y
2029  %1 = zext <2 x i1> %mask to <2 x i64>
2030  ret <2 x i64> %1
2031}
2032