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