Revert r242990: "AVX-512: Implemented encoding , DAG lowering and ..."
[oota-llvm.git] / test / CodeGen / X86 / avx512-trunc-ext.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s --check-prefix=KNL
2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s --check-prefix=SKX 
3  
4  
5 ; KNL-LABEL: trunc_16x32_to_16x8
6 ; KNL: vpmovdb
7 ; KNL: ret
8 define <16 x i8> @trunc_16x32_to_16x8(<16 x i32> %i) nounwind readnone {
9   %x = trunc <16 x i32> %i to <16 x i8>
10   ret <16 x i8> %x
11 }
12
13 ; KNL-LABEL: trunc_8x64_to_8x16
14 ; KNL: vpmovqw
15 ; KNL: ret
16 define <8 x i16> @trunc_8x64_to_8x16(<8 x i64> %i) nounwind readnone {
17   %x = trunc <8 x i64> %i to <8 x i16>
18   ret <8 x i16> %x
19 }
20
21 ;SKX-LABEL: zext_8x8mem_to_8x16:                  
22 ;SKX:       ## BB#0:
23 ;SKX-NEXT:  vpmovw2m  %xmm0, %k1     
24 ;SKX-NEXT:  vpmovzxbw (%rdi), %xmm0 {%k1} {z} 
25 ;SKX-NEXT:  retq                            
26 define <8 x i16> @zext_8x8mem_to_8x16(<8 x i8> *%i , <8 x i1> %mask) nounwind readnone {
27   %a   = load <8 x i8>,<8 x i8> *%i,align 1
28   %x   = zext <8 x i8> %a to <8 x i16>  
29   %ret = select <8 x i1> %mask, <8 x i16> %x, <8 x i16> zeroinitializer  
30   ret <8 x i16> %ret
31 }
32
33 ;SKX-LABEL: sext_8x8mem_to_8x16:                  
34 ;SKX:       ## BB#0:
35 ;SKX-NEXT:  vpmovw2m  %xmm0, %k1     
36 ;SKX-NEXT:  vpmovsxbw (%rdi), %xmm0 {%k1} {z} 
37 ;SKX-NEXT:  retq                       
38 define <8 x i16> @sext_8x8mem_to_8x16(<8 x i8> *%i , <8 x i1> %mask) nounwind readnone {
39   %a   = load <8 x i8>,<8 x i8> *%i,align 1
40   %x   = sext <8 x i8> %a to <8 x i16>  
41   %ret = select <8 x i1> %mask, <8 x i16> %x, <8 x i16> zeroinitializer  
42   ret <8 x i16> %ret
43 }
44
45 ;SKX-LABEL: zext_16x8mem_to_16x16:                
46 ;SKX:       ## BB#0:
47 ;SKX-NEXT:  vpmovb2m  %xmm0, %k1     
48 ;SKX-NEXT:  vpmovzxbw (%rdi), %ymm0 {%k1} {z} 
49 ;SKX-NEXT:  retq            
50 define <16 x i16> @zext_16x8mem_to_16x16(<16 x i8> *%i , <16 x i1> %mask) nounwind readnone {
51   %a   = load <16 x i8>,<16 x i8> *%i,align 1
52   %x   = zext <16 x i8> %a to <16 x i16>  
53   %ret = select <16 x i1> %mask, <16 x i16> %x, <16 x i16> zeroinitializer  
54   ret <16 x i16> %ret
55 }
56
57 ;SKX-LABEL: sext_16x8mem_to_16x16:                
58 ;SKX:       ## BB#0:
59 ;SKX-NEXT:  vpmovb2m  %xmm0, %k1     
60 ;SKX-NEXT:  vpmovsxbw (%rdi), %ymm0 {%k1} {z} 
61 ;SKX-NEXT:  retq  
62 define <16 x i16> @sext_16x8mem_to_16x16(<16 x i8> *%i , <16 x i1> %mask) nounwind readnone {
63   %a   = load <16 x i8>,<16 x i8> *%i,align 1
64   %x   = sext <16 x i8> %a to <16 x i16>  
65   %ret = select <16 x i1> %mask, <16 x i16> %x, <16 x i16> zeroinitializer  
66   ret <16 x i16> %ret
67 }
68
69 ;SKX-LABEL: zext_16x8_to_16x16:                   
70 ;SKX:       ## BB#0:
71 ;SKX-NEXT:  vpmovzxbw %xmm0, %ymm0    
72 ;SKX-NEXT:  retq  
73 define <16 x i16> @zext_16x8_to_16x16(<16 x i8> %a ) nounwind readnone {  
74   %x   = zext <16 x i8> %a to <16 x i16>  
75   ret <16 x i16> %x
76 }
77
78 ;SKX-LABEL: zext_16x8_to_16x16_mask:              
79 ;SKX:       ## BB#0:
80 ;SKX-NEXT:  vpmovb2m  %xmm1, %k1     
81 ;SKX-NEXT:  vpmovzxbw %xmm0, %ymm0 {%k1} {z} 
82 ;SKX-NEXT:  retq 
83 define <16 x i16> @zext_16x8_to_16x16_mask(<16 x i8> %a ,<16 x i1> %mask) nounwind readnone {  
84   %x   = zext <16 x i8> %a to <16 x i16> 
85   %ret = select <16 x i1> %mask, <16 x i16> %x, <16 x i16> zeroinitializer   
86   ret <16 x i16> %ret
87 }
88
89 ;SKX-LABEL: sext_16x8_to_16x16:                   
90 ;SKX:       ## BB#0:
91 ;SKX-NEXT:  vpmovsxbw %xmm0, %ymm0    
92 ;SKX-NEXT:  retq
93 define <16 x i16> @sext_16x8_to_16x16(<16 x i8> %a ) nounwind readnone {  
94   %x   = sext <16 x i8> %a to <16 x i16>  
95   ret <16 x i16> %x
96 }
97
98 ;SKX-LABEL: sext_16x8_to_16x16_mask:              
99 ;SKX:       ## BB#0:
100 ;SKX-NEXT:  vpmovb2m  %xmm1, %k1     
101 ;SKX-NEXT:  vpmovsxbw %xmm0, %ymm0 {%k1} {z} 
102 ;SKX-NEXT:  retq 
103 define <16 x i16> @sext_16x8_to_16x16_mask(<16 x i8> %a ,<16 x i1> %mask) nounwind readnone {  
104   %x   = sext <16 x i8> %a to <16 x i16> 
105   %ret = select <16 x i1> %mask, <16 x i16> %x, <16 x i16> zeroinitializer   
106   ret <16 x i16> %ret
107 }
108
109 ;SKX-LABEL: zext_32x8mem_to_32x16:                
110 ;SKX:       ## BB#0:
111 ;SKX-NEXT:  vpmovb2m  %ymm0, %k1     
112 ;SKX-NEXT:  vpmovzxbw (%rdi), %zmm0 {%k1} {z} 
113 ;SKX-NEXT:  retq                       
114 define <32 x i16> @zext_32x8mem_to_32x16(<32 x i8> *%i , <32 x i1> %mask) nounwind readnone {
115   %a   = load <32 x i8>,<32 x i8> *%i,align 1
116   %x   = zext <32 x i8> %a to <32 x i16>  
117   %ret = select <32 x i1> %mask, <32 x i16> %x, <32 x i16> zeroinitializer  
118   ret <32 x i16> %ret
119 }
120
121 ;SKX-LABEL: sext_32x8mem_to_32x16:                
122 ;SKX:       ## BB#0:
123 ;SKX-NEXT:  vpmovb2m  %ymm0, %k1     
124 ;SKX-NEXT:  vpmovsxbw (%rdi), %zmm0 {%k1} {z} 
125 ;SKX-NEXT:  retq
126 define <32 x i16> @sext_32x8mem_to_32x16(<32 x i8> *%i , <32 x i1> %mask) nounwind readnone {
127   %a   = load <32 x i8>,<32 x i8> *%i,align 1
128   %x   = sext <32 x i8> %a to <32 x i16>  
129   %ret = select <32 x i1> %mask, <32 x i16> %x, <32 x i16> zeroinitializer  
130   ret <32 x i16> %ret
131 }
132
133 ;SKX-LABEL: zext_32x8_to_32x16:                   
134 ;SKX:       ## BB#0:
135 ;SKX-NEXT:  vpmovzxbw %ymm0, %zmm0    
136 ;SKX-NEXT:  retq 
137 define <32 x i16> @zext_32x8_to_32x16(<32 x i8> %a ) nounwind readnone {  
138   %x   = zext <32 x i8> %a to <32 x i16>  
139   ret <32 x i16> %x
140 }
141
142 ;SKX-LABEL: zext_32x8_to_32x16_mask:              
143 ;SKX:       ## BB#0:
144 ;SKX-NEXT:  vpmovb2m  %ymm1, %k1    
145 ;SKX-NEXT:  vpmovzxbw %ymm0, %zmm0 {%k1} {z} 
146 ;SKX-NEXT:  retq
147 define <32 x i16> @zext_32x8_to_32x16_mask(<32 x i8> %a ,<32 x i1> %mask) nounwind readnone {  
148   %x   = zext <32 x i8> %a to <32 x i16>
149   %ret = select <32 x i1> %mask, <32 x i16> %x, <32 x i16> zeroinitializer  
150   ret <32 x i16> %ret
151 }
152
153 ;SKX-LABEL: sext_32x8_to_32x16:                   
154 ;SKX:       ## BB#0:
155 ;SKX-NEXT:  vpmovsxbw %ymm0, %zmm0    
156 ;SKX-NEXT:  retq
157 define <32 x i16> @sext_32x8_to_32x16(<32 x i8> %a ) nounwind readnone {  
158   %x   = sext <32 x i8> %a to <32 x i16>  
159   ret <32 x i16> %x
160 }
161
162 ;SKX-LABEL: sext_32x8_to_32x16_mask:              
163 ;SKX:       ## BB#0:
164 ;SKX-NEXT:  vpmovb2m  %ymm1, %k1     
165 ;SKX-NEXT:  vpmovsxbw %ymm0, %zmm0 {%k1} {z} 
166 ;SKX-NEXT:  retq
167 define <32 x i16> @sext_32x8_to_32x16_mask(<32 x i8> %a ,<32 x i1> %mask) nounwind readnone {  
168   %x   = sext <32 x i8> %a to <32 x i16>
169   %ret = select <32 x i1> %mask, <32 x i16> %x, <32 x i16> zeroinitializer  
170   ret <32 x i16> %ret
171 }
172
173 ;SKX-LABEL: zext_4x8mem_to_4x32:
174 ;SKX:       ## BB#0:
175 ;SKX-NEXT:  vpmovd2m    %xmm0, %k1      
176 ;SKX-NEXT:  vpmovzxbd    (%rdi), %xmm0 {%k1} {z} 
177 ;SKX-NEXT:  retq                            
178 define <4 x i32> @zext_4x8mem_to_4x32(<4 x i8> *%i , <4 x i1> %mask) nounwind readnone {
179   %a   = load <4 x i8>,<4 x i8> *%i,align 1
180   %x   = zext <4 x i8> %a to <4 x i32>  
181   %ret = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> zeroinitializer  
182   ret <4 x i32> %ret
183 }
184
185 ;SKX-LABEL: sext_4x8mem_to_4x32:
186 ;SKX:       ## BB#0:
187 ;SKX-NEXT:  vpmovd2m    %xmm0, %k1      
188 ;SKX-NEXT:  vpmovsxbd    (%rdi), %xmm0 {%k1} {z} 
189 ;SKX-NEXT:  retq       
190 define <4 x i32> @sext_4x8mem_to_4x32(<4 x i8> *%i , <4 x i1> %mask) nounwind readnone {
191   %a   = load <4 x i8>,<4 x i8> *%i,align 1
192   %x   = sext <4 x i8> %a to <4 x i32>  
193   %ret = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> zeroinitializer  
194   ret <4 x i32> %ret
195 }
196
197 ;SKX-LABEL: zext_8x8mem_to_8x32:
198 ;SKX:       ## BB#0:
199 ;SKX-NEXT:  vpmovw2m    %xmm0, %k1      
200 ;SKX-NEXT:  vpmovzxbd    (%rdi), %ymm0 {%k1} {z} 
201 ;SKX-NEXT:  retq    
202 define <8 x i32> @zext_8x8mem_to_8x32(<8 x i8> *%i , <8 x i1> %mask) nounwind readnone {
203   %a   = load <8 x i8>,<8 x i8> *%i,align 1
204   %x   = zext <8 x i8> %a to <8 x i32>  
205   %ret = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> zeroinitializer  
206   ret <8 x i32> %ret
207 }
208
209 ;SKX-LABEL: sext_8x8mem_to_8x32:
210 ;SKX:       ## BB#0:
211 ;SKX-NEXT:  vpmovw2m    %xmm0, %k1      
212 ;SKX-NEXT:  vpmovsxbd    (%rdi), %ymm0 {%k1} {z} 
213 ;SKX-NEXT:  retq         
214 define <8 x i32> @sext_8x8mem_to_8x32(<8 x i8> *%i , <8 x i1> %mask) nounwind readnone {
215   %a   = load <8 x i8>,<8 x i8> *%i,align 1
216   %x   = sext <8 x i8> %a to <8 x i32>  
217   %ret = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> zeroinitializer  
218   ret <8 x i32> %ret
219 }
220
221 ;KNL-LABEL: zext_16x8mem_to_16x32:   
222 ;KNL:       vpmovzxbd    (%rdi), %zmm0 {%k1} {z} 
223 ;KNL-NEXT:  retq 
224 define <16 x i32> @zext_16x8mem_to_16x32(<16 x i8> *%i , <16 x i1> %mask) nounwind readnone {
225   %a   = load <16 x i8>,<16 x i8> *%i,align 1
226   %x   = zext <16 x i8> %a to <16 x i32>
227   %ret = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> zeroinitializer
228   ret <16 x i32> %ret
229 }
230
231 ;KNL-LABEL: sext_16x8mem_to_16x32:   
232 ;KNL:       vpmovsxbd    (%rdi), %zmm0 {%k1} {z} 
233 ;KNL-NEXT:  retq  
234 define <16 x i32> @sext_16x8mem_to_16x32(<16 x i8> *%i , <16 x i1> %mask) nounwind readnone {
235   %a   = load <16 x i8>,<16 x i8> *%i,align 1
236   %x   = sext <16 x i8> %a to <16 x i32>
237   %ret = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> zeroinitializer
238   ret <16 x i32> %ret
239 }
240
241 ;KNL-LABEL: zext_16x8_to_16x32_mask:                    
242 ;KNL:       vpmovzxbd %xmm0, %zmm0 {%k1} {z} 
243 ;KNL-NEXT:  retq                
244 define <16 x i32> @zext_16x8_to_16x32_mask(<16 x i8> %a , <16 x i1> %mask) nounwind readnone {
245   %x   = zext <16 x i8> %a to <16 x i32>
246   %ret = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> zeroinitializer
247   ret <16 x i32> %ret
248 }
249
250 ;KNL-LABEL: sext_16x8_to_16x32_mask:                    
251 ;KNL:       vpmovsxbd %xmm0, %zmm0 {%k1} {z} 
252 ;KNL-NEXT:  retq
253 define <16 x i32> @sext_16x8_to_16x32_mask(<16 x i8> %a , <16 x i1> %mask) nounwind readnone {
254   %x   = sext <16 x i8> %a to <16 x i32>
255   %ret = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> zeroinitializer
256   ret <16 x i32> %ret
257 }
258
259 ; KNL-LABEL: zext_16x8_to_16x32
260 ; KNL: vpmovzxbd {{.*}}%zmm
261 ; KNL: ret
262 define <16 x i32> @zext_16x8_to_16x32(<16 x i8> %i) nounwind readnone {
263   %x = zext <16 x i8> %i to <16 x i32>
264   ret <16 x i32> %x
265 }
266
267 ; KNL-LABEL: sext_16x8_to_16x32
268 ; KNL: vpmovsxbd {{.*}}%zmm
269 ; KNL: ret
270 define <16 x i32> @sext_16x8_to_16x32(<16 x i8> %i) nounwind readnone {
271   %x = sext <16 x i8> %i to <16 x i32>
272   ret <16 x i32> %x
273 }
274
275 ;SKX-LABEL: zext_2x8mem_to_2x64:
276 ;SKX:       ## BB#0:
277 ;SKX-NEXT:  vpmovq2m  %xmm0, %k1
278 ;SKX-NEXT:  vpmovzxbq (%rdi), %xmm0 {%k1} {z} 
279 ;SKX-NEXT:  retq
280 define <2 x i64> @zext_2x8mem_to_2x64(<2 x i8> *%i , <2 x i1> %mask) nounwind readnone {
281   %a   = load <2 x i8>,<2 x i8> *%i,align 1
282   %x   = zext <2 x i8> %a to <2 x i64>
283   %ret = select <2 x  i1> %mask, <2 x i64> %x, <2 x i64> zeroinitializer
284   ret <2 x i64> %ret
285 }
286 ;SKX-LABEL: sext_2x8mem_to_2x64mask:
287 ;SKX:       ## BB#0:
288 ;SKX-NEXT:  vpmovq2m  %xmm0, %k1
289 ;SKX-NEXT:  vpmovsxbq (%rdi), %xmm0 {%k1} {z} 
290 ;SKX-NEXT:  retq
291 define <2 x i64> @sext_2x8mem_to_2x64mask(<2 x i8> *%i , <2 x i1> %mask) nounwind readnone {
292   %a   = load <2 x i8>,<2 x i8> *%i,align 1
293   %x   = sext <2 x i8> %a to <2 x i64>
294   %ret = select <2 x i1> %mask, <2 x i64> %x, <2 x i64> zeroinitializer
295   ret <2 x i64> %ret
296 }
297 ;SKX-LABEL: sext_2x8mem_to_2x64:
298 ;SKX:       ## BB#0:
299 ;SKX-NEXT:  vpmovsxbq (%rdi), %xmm0   
300 ;SKX-NEXT:  retq
301 define <2 x i64> @sext_2x8mem_to_2x64(<2 x i8> *%i) nounwind readnone {
302   %a   = load <2 x i8>,<2 x i8> *%i,align 1
303   %x   = sext <2 x i8> %a to <2 x i64>
304   ret <2 x i64> %x
305 }
306
307 ;SKX-LABEL: zext_4x8mem_to_4x64:
308 ;SKX:       ## BB#0:
309 ;SKX-NEXT:  vpmovd2m  %xmm0, %k1
310 ;SKX-NEXT:  vpmovzxbq (%rdi), %ymm0 {%k1} {z} 
311 ;SKX-NEXT:  retq
312 define <4 x i64> @zext_4x8mem_to_4x64(<4 x i8> *%i , <4 x i1> %mask) nounwind readnone {
313   %a   = load <4 x i8>,<4 x i8> *%i,align 1
314   %x   = zext <4 x i8> %a to <4 x i64>
315   %ret = select <4 x  i1> %mask, <4 x i64> %x, <4 x i64> zeroinitializer
316   ret <4 x i64> %ret
317 }
318
319 ;SKX-LABEL: sext_4x8mem_to_4x64mask:
320 ;SKX:       ## BB#0:
321 ;SKX-NEXT:  vpmovd2m  %xmm0, %k1
322 ;SKX-NEXT:  vpmovsxbq (%rdi), %ymm0 {%k1} {z} 
323 ;SKX-NEXT:  retq
324 define <4 x i64> @sext_4x8mem_to_4x64mask(<4 x i8> *%i , <4 x i1> %mask) nounwind readnone {
325   %a   = load <4 x i8>,<4 x i8> *%i,align 1
326   %x   = sext <4 x i8> %a to <4 x i64>
327   %ret = select <4 x i1> %mask, <4 x i64> %x, <4 x i64> zeroinitializer
328   ret <4 x i64> %ret
329 }
330
331 ;SKX-LABEL: sext_4x8mem_to_4x64:
332 ;SKX:       ## BB#0:
333 ;SKX-NEXT:  vpmovsxbq (%rdi), %ymm0   
334 ;SKX-NEXT:  retq
335 define <4 x i64> @sext_4x8mem_to_4x64(<4 x i8> *%i) nounwind readnone {
336   %a   = load <4 x i8>,<4 x i8> *%i,align 1
337   %x   = sext <4 x i8> %a to <4 x i64>
338   ret <4 x i64> %x
339 }
340
341 ;KNL-LABEL: zext_8x8mem_to_8x64:
342 ;KNL:       vpmovzxbq (%rdi), %zmm0 {%k1} {z} 
343 ;KNL-NEXT:  retq
344 define <8 x i64> @zext_8x8mem_to_8x64(<8 x i8> *%i , <8 x i1> %mask) nounwind readnone {
345   %a   = load <8 x i8>,<8 x i8> *%i,align 1
346   %x   = zext <8 x i8> %a to <8 x i64>
347   %ret = select <8 x  i1> %mask, <8 x i64> %x, <8 x i64> zeroinitializer
348   ret <8 x i64> %ret
349 }
350
351 ;KNL-LABEL: sext_8x8mem_to_8x64mask:
352 ;KNL:       vpmovsxbq (%rdi), %zmm0 {%k1} {z} 
353 ;KNL-NEXT:  retq
354 define <8 x i64> @sext_8x8mem_to_8x64mask(<8 x i8> *%i , <8 x i1> %mask) nounwind readnone {
355   %a   = load <8 x i8>,<8 x i8> *%i,align 1
356   %x   = sext <8 x i8> %a to <8 x i64>
357   %ret = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> zeroinitializer
358   ret <8 x i64> %ret
359 }
360
361 ;KNL-LABEL: sext_8x8mem_to_8x64:
362 ;KNL:       vpmovsxbq (%rdi), %zmm0   
363 ;KNL-NEXT:  retq
364 define <8 x i64> @sext_8x8mem_to_8x64(<8 x i8> *%i) nounwind readnone {
365   %a   = load <8 x i8>,<8 x i8> *%i,align 1
366   %x   = sext <8 x i8> %a to <8 x i64>
367   ret <8 x i64> %x
368 }
369
370 ;SKX-LABEL: zext_4x16mem_to_4x32:
371 ;SKX:       ## BB#0:
372 ;SKX-NEXT:  vpmovd2m  %xmm0, %k1
373 ;SKX-NEXT:  vpmovzxwd (%rdi), %xmm0 {%k1} {z} 
374 ;SKX-NEXT:  retq
375 define <4 x i32> @zext_4x16mem_to_4x32(<4 x i16> *%i , <4 x i1> %mask) nounwind readnone {
376   %a   = load <4 x i16>,<4 x i16> *%i,align 1
377   %x   = zext <4 x i16> %a to <4 x i32>
378   %ret = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> zeroinitializer
379   ret <4 x i32> %ret
380 }
381
382 ;SKX-LABEL: sext_4x16mem_to_4x32mask:
383 ;SKX:       ## BB#0:
384 ;SKX-NEXT:  vpmovd2m  %xmm0, %k1
385 ;SKX-NEXT:  vpmovsxwd (%rdi), %xmm0 {%k1} {z} 
386 ;SKX-NEXT:  retq
387 define <4 x i32> @sext_4x16mem_to_4x32mask(<4 x i16> *%i , <4 x i1> %mask) nounwind readnone {
388   %a   = load <4 x i16>,<4 x i16> *%i,align 1
389   %x   = sext <4 x i16> %a to <4 x i32>
390   %ret = select <4 x i1> %mask, <4 x i32> %x, <4 x i32> zeroinitializer
391   ret <4 x i32> %ret
392 }
393
394 ;SKX-LABEL: sext_4x16mem_to_4x32:
395 ;SKX:       ## BB#0:
396 ;SKX-NEXT:  vpmovsxwd (%rdi), %xmm0   
397 ;SKX-NEXT:  retq
398 define <4 x i32> @sext_4x16mem_to_4x32(<4 x i16> *%i) nounwind readnone {
399   %a   = load <4 x i16>,<4 x i16> *%i,align 1
400   %x   = sext <4 x i16> %a to <4 x i32>
401   ret <4 x i32> %x
402 }
403
404
405 ;SKX-LABEL: zext_8x16mem_to_8x32:
406 ;SKX:       ## BB#0:
407 ;SKX-NEXT:  vpmovw2m  %xmm0, %k1
408 ;SKX-NEXT:  vpmovzxwd (%rdi), %ymm0 {%k1} {z} 
409 ;SKX-NEXT:  retq
410 define <8 x i32> @zext_8x16mem_to_8x32(<8 x i16> *%i , <8 x i1> %mask) nounwind readnone {
411   %a   = load <8 x i16>,<8 x i16> *%i,align 1
412   %x   = zext <8 x i16> %a to <8 x i32>
413   %ret = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> zeroinitializer
414   ret <8 x i32> %ret
415 }
416
417 ;SKX-LABEL: sext_8x16mem_to_8x32mask:
418 ;SKX:       ## BB#0:
419 ;SKX-NEXT:  vpmovw2m  %xmm0, %k1
420 ;SKX-NEXT:  vpmovsxwd (%rdi), %ymm0 {%k1} {z} 
421 ;SKX-NEXT:  retq
422 define <8 x i32> @sext_8x16mem_to_8x32mask(<8 x i16> *%i , <8 x i1> %mask) nounwind readnone {
423   %a   = load <8 x i16>,<8 x i16> *%i,align 1
424   %x   = sext <8 x i16> %a to <8 x i32>
425   %ret = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> zeroinitializer
426   ret <8 x i32> %ret
427 }
428
429 ;SKX-LABEL: sext_8x16mem_to_8x32:
430 ;SKX:       ## BB#0:
431 ;SKX-NEXT:  vpmovsxwd (%rdi), %ymm0   
432 ;SKX-NEXT:  retq
433 define <8 x i32> @sext_8x16mem_to_8x32(<8 x i16> *%i) nounwind readnone {
434   %a   = load <8 x i16>,<8 x i16> *%i,align 1
435   %x   = sext <8 x i16> %a to <8 x i32>
436   ret <8 x i32> %x
437 }
438
439 ;SKX-LABEL: zext_8x16_to_8x32mask:
440 ;SKX:       ## BB#0:
441 ;SKX-NEXT:  vpmovw2m  %xmm1, %k1
442 ;SKX-NEXT:  vpmovzxwd %xmm0, %ymm0 {%k1} {z} 
443 ;SKX-NEXT:  retq
444 define <8 x i32> @zext_8x16_to_8x32mask(<8 x i16> %a , <8 x i1> %mask) nounwind readnone {
445   %x   = zext <8 x i16> %a to <8 x i32>
446   %ret = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> zeroinitializer
447   ret <8 x i32> %ret
448 }
449
450 ;SKX-LABEL: zext_8x16_to_8x32:
451 ;SKX:       ## BB#0:
452 ;SKX-NEXT:  vpmovzxwd %xmm0, %ymm0    
453 ;SKX-NEXT:  retq
454 define <8 x i32> @zext_8x16_to_8x32(<8 x i16> %a ) nounwind readnone {
455   %x   = zext <8 x i16> %a to <8 x i32>
456   ret <8 x i32> %x
457 }
458
459 ;SKX-LABEL: zext_16x16mem_to_16x32:
460 ;KNL-LABEL: zext_16x16mem_to_16x32:
461 ;SKX:       ## BB#0:
462 ;SKX-NEXT:  vpmovb2m  %xmm0, %k1
463 ;SKX-NEXT:  vpmovzxwd (%rdi), %zmm0 {%k1} {z} 
464 ;KNL:       vpmovzxwd (%rdi), %zmm0 {%k1} {z} 
465 ;SKX-NEXT:  retq
466 define <16 x i32> @zext_16x16mem_to_16x32(<16 x i16> *%i , <16 x i1> %mask) nounwind readnone {
467   %a   = load <16 x i16>,<16 x i16> *%i,align 1
468   %x   = zext <16 x i16> %a to <16 x i32>
469   %ret = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> zeroinitializer
470   ret <16 x i32> %ret
471 }
472
473 ;SKX-LABEL: sext_16x16mem_to_16x32mask:
474 ;KNL-LABEL: sext_16x16mem_to_16x32mask:
475 ;SKX:       ## BB#0:
476 ;SKX-NEXT:  vpmovb2m  %xmm0, %k1
477 ;SKX-NEXT:  vpmovsxwd (%rdi), %zmm0 {%k1} {z} 
478 ;KNL:       vpmovsxwd (%rdi), %zmm0 {%k1} {z} 
479 ;SKX-NEXT:  retq
480 define <16 x i32> @sext_16x16mem_to_16x32mask(<16 x i16> *%i , <16 x i1> %mask) nounwind readnone {
481   %a   = load <16 x i16>,<16 x i16> *%i,align 1
482   %x   = sext <16 x i16> %a to <16 x i32>
483   %ret = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> zeroinitializer
484   ret <16 x i32> %ret
485 }
486
487 ;SKX-LABEL: sext_16x16mem_to_16x32:
488 ;KNL-LABEL: sext_16x16mem_to_16x32:
489 ;SKX:       ## BB#0:
490 ;SKX-NEXT:  vpmovsxwd (%rdi), %zmm0   
491 ;KNL:       vpmovsxwd (%rdi), %zmm0   
492 ;SKX-NEXT:  retq
493 define <16 x i32> @sext_16x16mem_to_16x32(<16 x i16> *%i) nounwind readnone {
494   %a   = load <16 x i16>,<16 x i16> *%i,align 1
495   %x   = sext <16 x i16> %a to <16 x i32>
496   ret <16 x i32> %x
497 }
498 ;SKX-LABEL: zext_16x16_to_16x32mask:
499 ;KNL-LABEL: zext_16x16_to_16x32mask:
500 ;SKX:       ## BB#0:
501 ;SKX-NEXT:  vpmovb2m  %xmm1, %k1
502 ;SKX-NEXT:  vpmovzxwd %ymm0, %zmm0 {%k1} {z} 
503 ;KNL:       vpmovzxwd %ymm0, %zmm0 {%k1} {z} 
504 ;SKX-NEXT:  retq
505 define <16 x i32> @zext_16x16_to_16x32mask(<16 x i16> %a , <16 x i1> %mask) nounwind readnone {
506   %x   = zext <16 x i16> %a to <16 x i32>
507   %ret = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> zeroinitializer
508   ret <16 x i32> %ret
509 }
510
511 ;SKX-LABEL: zext_16x16_to_16x32:
512 ;KNL-LABEL: zext_16x16_to_16x32:
513 ;SKX:       ## BB#0:
514 ;SKX-NEXT:  vpmovzxwd %ymm0, %zmm0    
515 ;KNL:       vpmovzxwd %ymm0, %zmm0    
516 ;SKX-NEXT:  retq
517 define <16 x i32> @zext_16x16_to_16x32(<16 x i16> %a ) nounwind readnone {
518   %x   = zext <16 x i16> %a to <16 x i32>
519   ret <16 x i32> %x
520 }
521
522 ;SKX-LABEL: zext_2x16mem_to_2x64:
523 ;SKX:       ## BB#0:
524 ;SKX-NEXT:  vpmovq2m  %xmm0, %k1
525 ;SKX-NEXT:  vpmovzxwq (%rdi), %xmm0 {%k1} {z} 
526 ;SKX-NEXT:  retq
527 define <2 x i64> @zext_2x16mem_to_2x64(<2 x i16> *%i , <2 x i1> %mask) nounwind readnone {
528   %a   = load <2 x i16>,<2 x i16> *%i,align 1
529   %x   = zext <2 x i16> %a to <2 x i64>
530   %ret = select <2 x  i1> %mask, <2 x i64> %x, <2 x i64> zeroinitializer
531   ret <2 x i64> %ret
532 }
533
534 ;SKX-LABEL: sext_2x16mem_to_2x64mask:
535 ;SKX:       ## BB#0:
536 ;SKX-NEXT:  vpmovq2m  %xmm0, %k1
537 ;SKX-NEXT:  vpmovsxwq (%rdi), %xmm0 {%k1} {z} 
538 ;SKX-NEXT:  retq
539 define <2 x i64> @sext_2x16mem_to_2x64mask(<2 x i16> *%i , <2 x i1> %mask) nounwind readnone {
540   %a   = load <2 x i16>,<2 x i16> *%i,align 1
541   %x   = sext <2 x i16> %a to <2 x i64>
542   %ret = select <2 x i1> %mask, <2 x i64> %x, <2 x i64> zeroinitializer
543   ret <2 x i64> %ret
544 }
545
546 ;SKX-LABEL: sext_2x16mem_to_2x64:
547 ;SKX:       ## BB#0:
548 ;SKX-NEXT:  vpmovsxwq (%rdi), %xmm0   
549 ;SKX-NEXT:  retq
550 define <2 x i64> @sext_2x16mem_to_2x64(<2 x i16> *%i) nounwind readnone {
551   %a   = load <2 x i16>,<2 x i16> *%i,align 1
552   %x   = sext <2 x i16> %a to <2 x i64>
553   ret <2 x i64> %x
554 }
555
556 ;SKX-LABEL: zext_4x16mem_to_4x64:
557 ;SKX:       ## BB#0:
558 ;SKX-NEXT:  vpmovd2m  %xmm0, %k1
559 ;SKX-NEXT:  vpmovzxwq (%rdi), %ymm0 {%k1} {z} 
560 ;SKX-NEXT:  retq
561 define <4 x i64> @zext_4x16mem_to_4x64(<4 x i16> *%i , <4 x i1> %mask) nounwind readnone {
562   %a   = load <4 x i16>,<4 x i16> *%i,align 1
563   %x   = zext <4 x i16> %a to <4 x i64>
564   %ret = select <4 x  i1> %mask, <4 x i64> %x, <4 x i64> zeroinitializer
565   ret <4 x i64> %ret
566 }
567
568 ;SKX-LABEL: sext_4x16mem_to_4x64mask:
569 ;SKX:       ## BB#0:
570 ;SKX-NEXT:  vpmovd2m  %xmm0, %k1
571 ;SKX-NEXT:  vpmovsxwq (%rdi), %ymm0 {%k1} {z} 
572 ;SKX-NEXT:  retq
573 define <4 x i64> @sext_4x16mem_to_4x64mask(<4 x i16> *%i , <4 x i1> %mask) nounwind readnone {
574   %a   = load <4 x i16>,<4 x i16> *%i,align 1
575   %x   = sext <4 x i16> %a to <4 x i64>
576   %ret = select <4 x i1> %mask, <4 x i64> %x, <4 x i64> zeroinitializer
577   ret <4 x i64> %ret
578 }
579
580 ;SKX-LABEL: sext_4x16mem_to_4x64:
581 ;SKX:       ## BB#0:
582 ;SKX-NEXT:  vpmovsxwq (%rdi), %ymm0   
583 ;SKX-NEXT:  retq
584 define <4 x i64> @sext_4x16mem_to_4x64(<4 x i16> *%i) nounwind readnone {
585   %a   = load <4 x i16>,<4 x i16> *%i,align 1
586   %x   = sext <4 x i16> %a to <4 x i64>
587   ret <4 x i64> %x
588 }
589
590 ;SKX-LABEL: zext_8x16mem_to_8x64:
591 ;KNL-LABEL: zext_8x16mem_to_8x64:
592 ;SKX:       ## BB#0:
593 ;SKX-NEXT:  vpmovw2m  %xmm0, %k1
594 ;SKX-NEXT:  vpmovzxwq (%rdi), %zmm0 {%k1} {z} 
595 ;KNL:       vpmovzxwq (%rdi), %zmm0 {%k1} {z} 
596 ;SKX-NEXT:  retq
597 define <8 x i64> @zext_8x16mem_to_8x64(<8 x i16> *%i , <8 x i1> %mask) nounwind readnone {
598   %a   = load <8 x i16>,<8 x i16> *%i,align 1
599   %x   = zext <8 x i16> %a to <8 x i64>
600   %ret = select <8 x  i1> %mask, <8 x i64> %x, <8 x i64> zeroinitializer
601   ret <8 x i64> %ret
602 }
603
604 ;SKX-LABEL: sext_8x16mem_to_8x64mask:
605 ;KNL-LABEL: sext_8x16mem_to_8x64mask:
606 ;SKX:       ## BB#0:
607 ;SKX-NEXT:  vpmovw2m  %xmm0, %k1
608 ;SKX-NEXT:  vpmovsxwq (%rdi), %zmm0 {%k1} {z} 
609 ;KNL:       vpmovsxwq (%rdi), %zmm0 {%k1} {z} 
610 ;SKX-NEXT:  retq
611 define <8 x i64> @sext_8x16mem_to_8x64mask(<8 x i16> *%i , <8 x i1> %mask) nounwind readnone {
612   %a   = load <8 x i16>,<8 x i16> *%i,align 1
613   %x   = sext <8 x i16> %a to <8 x i64>
614   %ret = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> zeroinitializer
615   ret <8 x i64> %ret
616 }
617
618 ;SKX-LABEL: sext_8x16mem_to_8x64:
619 ;KNL-LABEL: sext_8x16mem_to_8x64:
620 ;SKX:       ## BB#0:
621 ;SKX-NEXT:  vpmovsxwq (%rdi), %zmm0   
622 ;KNL:       vpmovsxwq (%rdi), %zmm0   
623 ;SKX-NEXT:  retq
624 define <8 x i64> @sext_8x16mem_to_8x64(<8 x i16> *%i) nounwind readnone {
625   %a   = load <8 x i16>,<8 x i16> *%i,align 1
626   %x   = sext <8 x i16> %a to <8 x i64>
627   ret <8 x i64> %x
628 }
629
630 ;SKX-LABEL: zext_8x16_to_8x64mask:
631 ;KNL-LABEL: zext_8x16_to_8x64mask:
632 ;SKX:       ## BB#0:
633 ;SKX-NEXT:  vpmovw2m  %xmm1, %k1
634 ;SKX-NEXT:  vpmovzxwq %xmm0, %zmm0 {%k1} {z} 
635 ;KNL:       vpmovzxwq %xmm0, %zmm0 {%k1} {z} 
636 ;SKX-NEXT:  retq
637 define <8 x i64> @zext_8x16_to_8x64mask(<8 x i16> %a , <8 x i1> %mask) nounwind readnone {
638   %x   = zext <8 x i16> %a to <8 x i64>
639   %ret = select <8 x  i1> %mask, <8 x i64> %x, <8 x i64> zeroinitializer
640   ret <8 x i64> %ret
641 }
642
643 ;SKX-LABEL: zext_8x16_to_8x64:
644 ;KNL-LABEL: zext_8x16_to_8x64:
645 ;SKX:       ## BB#0:
646 ;SKX-NEXT:  vpmovzxwq %xmm0, %zmm0    
647 ;KNL:       vpmovzxwq %xmm0, %zmm0    
648 ;SKX-NEXT:  retq
649 ; KNL: ret
650 define <8 x i64> @zext_8x16_to_8x64(<8 x i16> %a) nounwind readnone {
651   %ret   = zext <8 x i16> %a to <8 x i64>
652   ret <8 x i64> %ret
653 }
654
655 ;SKX-LABEL: zext_2x32mem_to_2x64:
656 ;SKX:       ## BB#0:
657 ;SKX-NEXT:  vpmovq2m  %xmm0, %k1
658 ;SKX-NEXT:  vpmovzxdq (%rdi), %xmm0 {%k1} {z} 
659 ;SKX-NEXT:  retq
660 define <2 x i64> @zext_2x32mem_to_2x64(<2 x i32> *%i , <2 x i1> %mask) nounwind readnone {
661   %a   = load <2 x i32>,<2 x i32> *%i,align 1
662   %x   = zext <2 x i32> %a to <2 x i64>
663   %ret = select <2 x  i1> %mask, <2 x i64> %x, <2 x i64> zeroinitializer
664   ret <2 x i64> %ret
665 }
666
667 ;SKX-LABEL: sext_2x32mem_to_2x64mask:
668 ;SKX:       ## BB#0:
669 ;SKX-NEXT:  vpmovq2m  %xmm0, %k1
670 ;SKX-NEXT:  vpmovsxdq (%rdi), %xmm0 {%k1} {z} 
671 ;SKX-NEXT:  retq
672 define <2 x i64> @sext_2x32mem_to_2x64mask(<2 x i32> *%i , <2 x i1> %mask) nounwind readnone {
673   %a   = load <2 x i32>,<2 x i32> *%i,align 1
674   %x   = sext <2 x i32> %a to <2 x i64>
675   %ret = select <2 x i1> %mask, <2 x i64> %x, <2 x i64> zeroinitializer
676   ret <2 x i64> %ret
677 }
678
679 ;SKX-LABEL: sext_2x32mem_to_2x64:
680 ;SKX:       ## BB#0:
681 ;SKX-NEXT:  vpmovsxdq (%rdi), %xmm0   
682 ;SKX-NEXT:  retq
683 define <2 x i64> @sext_2x32mem_to_2x64(<2 x i32> *%i) nounwind readnone {
684   %a   = load <2 x i32>,<2 x i32> *%i,align 1
685   %x   = sext <2 x i32> %a to <2 x i64>
686   ret <2 x i64> %x
687 }
688
689 ;SKX-LABEL: zext_4x32mem_to_4x64:
690 ;SKX:       ## BB#0:
691 ;SKX-NEXT:  vpmovd2m  %xmm0, %k1
692 ;SKX-NEXT:  vpmovzxdq (%rdi), %ymm0 {%k1} {z} 
693 ;SKX-NEXT:  retq
694 define <4 x i64> @zext_4x32mem_to_4x64(<4 x i32> *%i , <4 x i1> %mask) nounwind readnone {
695   %a   = load <4 x i32>,<4 x i32> *%i,align 1
696   %x   = zext <4 x i32> %a to <4 x i64>
697   %ret = select <4 x  i1> %mask, <4 x i64> %x, <4 x i64> zeroinitializer
698   ret <4 x i64> %ret
699 }
700
701 ;SKX-LABEL: sext_4x32mem_to_4x64mask:
702 ;SKX:       ## BB#0:
703 ;SKX-NEXT:  vpmovd2m  %xmm0, %k1
704 ;SKX-NEXT:  vpmovsxdq (%rdi), %ymm0 {%k1} {z} 
705 ;SKX-NEXT:  retq
706 define <4 x i64> @sext_4x32mem_to_4x64mask(<4 x i32> *%i , <4 x i1> %mask) nounwind readnone {
707   %a   = load <4 x i32>,<4 x i32> *%i,align 1
708   %x   = sext <4 x i32> %a to <4 x i64>
709   %ret = select <4 x i1> %mask, <4 x i64> %x, <4 x i64> zeroinitializer
710   ret <4 x i64> %ret
711 }
712
713 ;SKX-LABEL: sext_4x32mem_to_4x64:
714 ;SKX:       ## BB#0:
715 ;SKX-NEXT:  vpmovsxdq (%rdi), %ymm0   
716 ;SKX-NEXT:  retq
717 define <4 x i64> @sext_4x32mem_to_4x64(<4 x i32> *%i) nounwind readnone {
718   %a   = load <4 x i32>,<4 x i32> *%i,align 1
719   %x   = sext <4 x i32> %a to <4 x i64>
720   ret <4 x i64> %x
721 }
722
723 ;SKX-LABEL: sext_4x32_to_4x64:
724 ;SKX:       ## BB#0:
725 ;SKX-NEXT:  vpmovsxdq %xmm0, %ymm0    
726 ;SKX-NEXT:  retq
727 define <4 x i64> @sext_4x32_to_4x64(<4 x i32> %a) nounwind readnone {
728   %x   = sext <4 x i32> %a to <4 x i64>
729   ret <4 x i64> %x
730 }
731
732 ;SKX-LABEL: zext_4x32_to_4x64mask:
733 ;SKX:       ## BB#0:
734 ;SKX-NEXT:  vpmovd2m  %xmm1, %k1
735 ;SKX-NEXT:  vpmovzxdq %xmm0, %ymm0 {%k1} {z} 
736 ;SKX-NEXT:  retq
737 define <4 x i64> @zext_4x32_to_4x64mask(<4 x i32> %a , <4 x i1> %mask) nounwind readnone {
738   %x   = zext <4 x i32> %a to <4 x i64>
739   %ret = select <4 x  i1> %mask, <4 x i64> %x, <4 x i64> zeroinitializer
740   ret <4 x i64> %ret
741 }
742
743 ;SKX-LABEL: zext_8x32mem_to_8x64:
744 ;SKX:       ## BB#0:
745 ;SKX-NEXT:  vpmovw2m  %xmm0, %k1
746 ;SKX-NEXT:  vpmovzxdq (%rdi), %zmm0 {%k1} {z} 
747 ;SKX-NEXT:  retq
748 define <8 x i64> @zext_8x32mem_to_8x64(<8 x i32> *%i , <8 x i1> %mask) nounwind readnone {
749   %a   = load <8 x i32>,<8 x i32> *%i,align 1
750   %x   = zext <8 x i32> %a to <8 x i64>
751   %ret = select <8 x  i1> %mask, <8 x i64> %x, <8 x i64> zeroinitializer
752   ret <8 x i64> %ret
753 }
754
755 ;SKX-LABEL: sext_8x32mem_to_8x64mask:
756 ;SKX:       ## BB#0:
757 ;SKX-NEXT:  vpmovw2m  %xmm0, %k1
758 ;SKX-NEXT:  vpmovsxdq (%rdi), %zmm0 {%k1} {z} 
759 ;SKX-NEXT:  retq
760 define <8 x i64> @sext_8x32mem_to_8x64mask(<8 x i32> *%i , <8 x i1> %mask) nounwind readnone {
761   %a   = load <8 x i32>,<8 x i32> *%i,align 1
762   %x   = sext <8 x i32> %a to <8 x i64>
763   %ret = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> zeroinitializer
764   ret <8 x i64> %ret
765 }
766
767 ;SKX-LABEL: sext_8x32mem_to_8x64:
768 ;KNL-LABEL: sext_8x32mem_to_8x64:
769 ;SKX:       ## BB#0:
770 ;SKX-NEXT:  vpmovsxdq (%rdi), %zmm0   
771 ;KNL:       vpmovsxdq (%rdi), %zmm0   
772 ;SKX-NEXT:  retq
773 define <8 x i64> @sext_8x32mem_to_8x64(<8 x i32> *%i) nounwind readnone {
774   %a   = load <8 x i32>,<8 x i32> *%i,align 1
775   %x   = sext <8 x i32> %a to <8 x i64>
776   ret <8 x i64> %x
777 }
778
779 ;SKX-LABEL: sext_8x32_to_8x64:
780 ;KNL-LABEL: sext_8x32_to_8x64:
781 ;SKX:       ## BB#0:
782 ;SKX-NEXT:  vpmovsxdq %ymm0, %zmm0    
783 ;KNL:       vpmovsxdq %ymm0, %zmm0    
784 ;SKX-NEXT:  retq
785 define <8 x i64> @sext_8x32_to_8x64(<8 x i32> %a) nounwind readnone {
786   %x   = sext <8 x i32> %a to <8 x i64>
787   ret <8 x i64> %x
788 }
789
790 ;SKX-LABEL: zext_8x32_to_8x64mask:
791 ;KNL-LABEL: zext_8x32_to_8x64mask:
792 ;SKX:       ## BB#0:
793 ;SKX-NEXT:  vpmovw2m  %xmm1, %k1
794 ;SKX-NEXT:  vpmovzxdq %ymm0, %zmm0 {%k1} {z} 
795 ;KNL:       vpmovzxdq %ymm0, %zmm0 {%k1} {z} 
796 ;SKX-NEXT:  retq
797 define <8 x i64> @zext_8x32_to_8x64mask(<8 x i32> %a , <8 x i1> %mask) nounwind readnone {
798   %x   = zext <8 x i32> %a to <8 x i64>
799   %ret = select <8 x  i1> %mask, <8 x i64> %x, <8 x i64> zeroinitializer
800   ret <8 x i64> %ret
801 }
802 ;KNL-LABEL: fptrunc_test
803 ;KNL: vcvtpd2ps {{.*}}%zmm
804 ;KNL: ret
805 define <8 x float> @fptrunc_test(<8 x double> %a) nounwind readnone {
806   %b = fptrunc <8 x double> %a to <8 x float>
807   ret <8 x float> %b
808 }
809
810 ;KNL-LABEL: fpext_test
811 ;KNL: vcvtps2pd {{.*}}%zmm
812 ;KNL: ret
813 define <8 x double> @fpext_test(<8 x float> %a) nounwind readnone {
814   %b = fpext <8 x float> %a to <8 x double>
815   ret <8 x double> %b
816 }
817
818 ; KNL-LABEL: zext_16i1_to_16xi32
819 ; KNL: vpbroadcastd LCP{{.*}}(%rip), %zmm0 {%k1} {z}
820 ; KNL: ret
821 define   <16 x i32> @zext_16i1_to_16xi32(i16 %b) {
822   %a = bitcast i16 %b to <16 x i1>
823   %c = zext <16 x i1> %a to <16 x i32>
824   ret <16 x i32> %c
825 }
826
827 ; KNL-LABEL: zext_8i1_to_8xi64
828 ; KNL: vpbroadcastq LCP{{.*}}(%rip), %zmm0 {%k1} {z}
829 ; KNL: ret
830 define   <8 x i64> @zext_8i1_to_8xi64(i8 %b) {
831   %a = bitcast i8 %b to <8 x i1>
832   %c = zext <8 x i1> %a to <8 x i64>
833   ret <8 x i64> %c
834 }
835
836 ; KNL-LABEL: trunc_16i8_to_16i1
837 ; KNL: vpmovsxbd
838 ; KNL: vpandd
839 ; KNL: vptestmd
840 ; KNL: ret
841 ; SKX-LABEL: trunc_16i8_to_16i1
842 ; SKX: vpmovb2m %xmm
843 define i16 @trunc_16i8_to_16i1(<16 x i8> %a) {
844   %mask_b = trunc <16 x i8>%a to <16 x i1>
845   %mask = bitcast <16 x i1> %mask_b to i16
846   ret i16 %mask
847 }
848
849 ; KNL-LABEL: trunc_16i32_to_16i1
850 ; KNL: vpandd
851 ; KNL: vptestmd
852 ; KNL: ret
853 ; SKX-LABEL: trunc_16i32_to_16i1
854 ; SKX: vpmovd2m %zmm
855 define i16 @trunc_16i32_to_16i1(<16 x i32> %a) {
856   %mask_b = trunc <16 x i32>%a to <16 x i1>
857   %mask = bitcast <16 x i1> %mask_b to i16
858   ret i16 %mask
859 }
860
861 ; SKX-LABEL: trunc_4i32_to_4i1
862 ; SKX: vpmovd2m        %xmm
863 ; SKX: kandw
864 ; SKX: vpmovm2d
865 define <4 x i32> @trunc_4i32_to_4i1(<4 x i32> %a, <4 x i32> %b) {
866   %mask_a = trunc <4 x i32>%a to <4 x i1>
867   %mask_b = trunc <4 x i32>%b to <4 x i1>
868   %a_and_b = and <4 x i1>%mask_a, %mask_b
869   %res = sext <4 x i1>%a_and_b to <4 x i32>
870   ret <4 x i32>%res
871 }
872
873 ; KNL-LABEL: trunc_8i16_to_8i1
874 ; KNL: vpmovsxwq
875 ; KNL: vpandq LCP{{.*}}(%rip){1to8}
876 ; KNL: vptestmq
877 ; KNL: ret
878
879 ; SKX-LABEL: trunc_8i16_to_8i1
880 ; SKX: vpmovw2m %xmm
881 define i8 @trunc_8i16_to_8i1(<8 x i16> %a) {
882   %mask_b = trunc <8 x i16>%a to <8 x i1>
883   %mask = bitcast <8 x i1> %mask_b to i8
884   ret i8 %mask
885 }
886
887 ; KNL-LABEL: sext_8i1_8i32
888 ; KNL: vpbroadcastq  LCP{{.*}}(%rip), %zmm0 {%k1} {z}
889 ; SKX: vpmovm2d
890 ; KNL: ret
891 define <8 x i32> @sext_8i1_8i32(<8 x i32> %a1, <8 x i32> %a2) nounwind {
892   %x = icmp slt <8 x i32> %a1, %a2
893   %x1 = xor <8 x i1>%x, <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>
894   %y = sext <8 x i1> %x1 to <8 x i32>
895   ret <8 x i32> %y
896 }
897
898 ; KNL-LABEL: trunc_v16i32_to_v16i16
899 ; KNL: vpmovdw
900 ; KNL: ret
901 define <16 x i16> @trunc_v16i32_to_v16i16(<16 x i32> %x) {
902   %1 = trunc <16 x i32> %x to <16 x i16>
903   ret <16 x i16> %1
904 }
905
906 ; KNL-LABEL: trunc_i32_to_i1
907 ; KNL: movw    $-4, %ax
908 ; KNL: kmovw   %eax, %k1
909 ; KNL: korw
910 define i16 @trunc_i32_to_i1(i32 %a) {
911   %a_i = trunc i32 %a to i1
912   %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
913   %res = bitcast <16 x i1> %maskv to i16
914   ret i16 %res
915 }
916
917 ; KNL-LABEL: sext_8i1_8i16
918 ; SKX: vpmovm2w
919 ; KNL: ret
920 define <8 x i16> @sext_8i1_8i16(<8 x i32> %a1, <8 x i32> %a2) nounwind {
921   %x = icmp slt <8 x i32> %a1, %a2
922   %y = sext <8 x i1> %x to <8 x i16>
923   ret <8 x i16> %y
924 }
925
926 ; KNL-LABEL: sext_16i1_16i32
927 ; SKX: vpmovm2d
928 ; KNL: ret
929 define <16 x i32> @sext_16i1_16i32(<16 x i32> %a1, <16 x i32> %a2) nounwind {
930   %x = icmp slt <16 x i32> %a1, %a2
931   %y = sext <16 x i1> %x to <16 x i32>
932   ret <16 x i32> %y
933 }
934
935 ; KNL-LABEL: sext_8i1_8i64
936 ; SKX: vpmovm2q
937 ; KNL: ret
938 define <8 x i64> @sext_8i1_8i64(<8 x i32> %a1, <8 x i32> %a2) nounwind {
939   %x = icmp slt <8 x i32> %a1, %a2
940   %y = sext <8 x i1> %x to <8 x i64>
941   ret <8 x i64> %y
942 }
943
944 ; KNL-LABEL: @extload_v8i64
945 ; KNL: vpmovsxbq
946 define void @extload_v8i64(<8 x i8>* %a, <8 x i64>* %res) {
947   %sign_load = load <8 x i8>, <8 x i8>* %a
948   %c = sext <8 x i8> %sign_load to <8 x i64>
949   store <8 x i64> %c, <8 x i64>* %res
950   ret void
951 }
952
953 ;SKX-LABEL: test21:
954 ;SKX:       vmovdqu16 %zmm0, %zmm3 {%k1}
955 ;SKX-NEXT:  kshiftrq  $32, %k1, %k1
956 ;SKX-NEXT:  vmovdqu16 %zmm1, %zmm2 {%k1}
957 define <64 x i16> @test21(<64 x i16> %x , <64 x i1> %mask) nounwind readnone {
958   %ret = select <64 x i1> %mask, <64 x i16> %x, <64 x i16> zeroinitializer
959   ret <64 x i16> %ret
960 }  
961