[DAGCombiner] Eliminate dead stores to stack.
[llvm-complete.git] / test / CodeGen / X86 / avx512-trunc.ll
blobc15d33222ca0e4f3e4b32d8918805f3b33b17844
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f | FileCheck %s --check-prefix=ALL --check-prefix=KNL
3 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f,+avx512vl,+avx512bw,+avx512dq,+fast-variable-shuffle | FileCheck %s --check-prefixes=ALL,SKX
5  attributes #0 = { nounwind }
7 define <16 x i8> @trunc_16x32_to_16x8(<16 x i32> %i) #0 {
8 ; ALL-LABEL: trunc_16x32_to_16x8:
9 ; ALL:       ## %bb.0:
10 ; ALL-NEXT:    vpmovdb %zmm0, %xmm0
11 ; ALL-NEXT:    vzeroupper
12 ; ALL-NEXT:    retq
13   %x = trunc <16 x i32> %i to <16 x i8>
14   ret <16 x i8> %x
17 define <8 x i16> @trunc_8x64_to_8x16(<8 x i64> %i) #0 {
18 ; ALL-LABEL: trunc_8x64_to_8x16:
19 ; ALL:       ## %bb.0:
20 ; ALL-NEXT:    vpmovqw %zmm0, %xmm0
21 ; ALL-NEXT:    vzeroupper
22 ; ALL-NEXT:    retq
23   %x = trunc <8 x i64> %i to <8 x i16>
24   ret <8 x i16> %x
27 define <16 x i16> @trunc_v16i32_to_v16i16(<16 x i32> %x) #0 {
28 ; ALL-LABEL: trunc_v16i32_to_v16i16:
29 ; ALL:       ## %bb.0:
30 ; ALL-NEXT:    vpmovdw %zmm0, %ymm0
31 ; ALL-NEXT:    retq
32   %1 = trunc <16 x i32> %x to <16 x i16>
33   ret <16 x i16> %1
36 define <8 x i8> @trunc_qb_512(<8 x i64> %i) #0 {
37 ; ALL-LABEL: trunc_qb_512:
38 ; ALL:       ## %bb.0:
39 ; ALL-NEXT:    vpmovqw %zmm0, %xmm0
40 ; ALL-NEXT:    vzeroupper
41 ; ALL-NEXT:    retq
42   %x = trunc <8 x i64> %i to <8 x i8>
43   ret <8 x i8> %x
46 define void @trunc_qb_512_mem(<8 x i64> %i, <8 x i8>* %res) #0 {
47 ; ALL-LABEL: trunc_qb_512_mem:
48 ; ALL:       ## %bb.0:
49 ; ALL-NEXT:    vpmovqb %zmm0, (%rdi)
50 ; ALL-NEXT:    vzeroupper
51 ; ALL-NEXT:    retq
52     %x = trunc <8 x i64> %i to <8 x i8>
53     store <8 x i8> %x, <8 x i8>* %res
54     ret void
57 define <4 x i8> @trunc_qb_256(<4 x i64> %i) #0 {
58 ; KNL-LABEL: trunc_qb_256:
59 ; KNL:       ## %bb.0:
60 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
61 ; KNL-NEXT:    vpmovqd %zmm0, %ymm0
62 ; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $ymm0
63 ; KNL-NEXT:    vzeroupper
64 ; KNL-NEXT:    retq
66 ; SKX-LABEL: trunc_qb_256:
67 ; SKX:       ## %bb.0:
68 ; SKX-NEXT:    vpmovqd %ymm0, %xmm0
69 ; SKX-NEXT:    vzeroupper
70 ; SKX-NEXT:    retq
71   %x = trunc <4 x i64> %i to <4 x i8>
72   ret <4 x i8> %x
75 define void @trunc_qb_256_mem(<4 x i64> %i, <4 x i8>* %res) #0 {
76 ; KNL-LABEL: trunc_qb_256_mem:
77 ; KNL:       ## %bb.0:
78 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
79 ; KNL-NEXT:    vpmovqd %zmm0, %ymm0
80 ; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
81 ; KNL-NEXT:    vmovd %xmm0, (%rdi)
82 ; KNL-NEXT:    vzeroupper
83 ; KNL-NEXT:    retq
85 ; SKX-LABEL: trunc_qb_256_mem:
86 ; SKX:       ## %bb.0:
87 ; SKX-NEXT:    vpmovqb %ymm0, (%rdi)
88 ; SKX-NEXT:    vzeroupper
89 ; SKX-NEXT:    retq
90     %x = trunc <4 x i64> %i to <4 x i8>
91     store <4 x i8> %x, <4 x i8>* %res
92     ret void
95 define <2 x i8> @trunc_qb_128(<2 x i64> %i) #0 {
96 ; ALL-LABEL: trunc_qb_128:
97 ; ALL:       ## %bb.0:
98 ; ALL-NEXT:    retq
99   %x = trunc <2 x i64> %i to <2 x i8>
100   ret <2 x i8> %x
103 define void @trunc_qb_128_mem(<2 x i64> %i, <2 x i8>* %res) #0 {
104 ; KNL-LABEL: trunc_qb_128_mem:
105 ; KNL:       ## %bb.0:
106 ; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
107 ; KNL-NEXT:    vpextrw $0, %xmm0, (%rdi)
108 ; KNL-NEXT:    retq
110 ; SKX-LABEL: trunc_qb_128_mem:
111 ; SKX:       ## %bb.0:
112 ; SKX-NEXT:    vpmovqb %xmm0, (%rdi)
113 ; SKX-NEXT:    retq
114     %x = trunc <2 x i64> %i to <2 x i8>
115     store <2 x i8> %x, <2 x i8>* %res
116     ret void
119 define <8 x i16> @trunc_qw_512(<8 x i64> %i) #0 {
120 ; ALL-LABEL: trunc_qw_512:
121 ; ALL:       ## %bb.0:
122 ; ALL-NEXT:    vpmovqw %zmm0, %xmm0
123 ; ALL-NEXT:    vzeroupper
124 ; ALL-NEXT:    retq
125   %x = trunc <8 x i64> %i to <8 x i16>
126   ret <8 x i16> %x
129 define void @trunc_qw_512_mem(<8 x i64> %i, <8 x i16>* %res) #0 {
130 ; ALL-LABEL: trunc_qw_512_mem:
131 ; ALL:       ## %bb.0:
132 ; ALL-NEXT:    vpmovqw %zmm0, (%rdi)
133 ; ALL-NEXT:    vzeroupper
134 ; ALL-NEXT:    retq
135     %x = trunc <8 x i64> %i to <8 x i16>
136     store <8 x i16> %x, <8 x i16>* %res
137     ret void
140 define <4 x i16> @trunc_qw_256(<4 x i64> %i) #0 {
141 ; KNL-LABEL: trunc_qw_256:
142 ; KNL:       ## %bb.0:
143 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
144 ; KNL-NEXT:    vpmovqd %zmm0, %ymm0
145 ; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $ymm0
146 ; KNL-NEXT:    vzeroupper
147 ; KNL-NEXT:    retq
149 ; SKX-LABEL: trunc_qw_256:
150 ; SKX:       ## %bb.0:
151 ; SKX-NEXT:    vpmovqd %ymm0, %xmm0
152 ; SKX-NEXT:    vzeroupper
153 ; SKX-NEXT:    retq
154   %x = trunc <4 x i64> %i to <4 x i16>
155   ret <4 x i16> %x
158 define void @trunc_qw_256_mem(<4 x i64> %i, <4 x i16>* %res) #0 {
159 ; KNL-LABEL: trunc_qw_256_mem:
160 ; KNL:       ## %bb.0:
161 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
162 ; KNL-NEXT:    vpmovqd %zmm0, %ymm0
163 ; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
164 ; KNL-NEXT:    vmovq %xmm0, (%rdi)
165 ; KNL-NEXT:    vzeroupper
166 ; KNL-NEXT:    retq
168 ; SKX-LABEL: trunc_qw_256_mem:
169 ; SKX:       ## %bb.0:
170 ; SKX-NEXT:    vpmovqw %ymm0, (%rdi)
171 ; SKX-NEXT:    vzeroupper
172 ; SKX-NEXT:    retq
173     %x = trunc <4 x i64> %i to <4 x i16>
174     store <4 x i16> %x, <4 x i16>* %res
175     ret void
178 define <2 x i16> @trunc_qw_128(<2 x i64> %i) #0 {
179 ; ALL-LABEL: trunc_qw_128:
180 ; ALL:       ## %bb.0:
181 ; ALL-NEXT:    retq
182   %x = trunc <2 x i64> %i to <2 x i16>
183   ret <2 x i16> %x
186 define void @trunc_qw_128_mem(<2 x i64> %i, <2 x i16>* %res) #0 {
187 ; KNL-LABEL: trunc_qw_128_mem:
188 ; KNL:       ## %bb.0:
189 ; KNL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
190 ; KNL-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
191 ; KNL-NEXT:    vmovd %xmm0, (%rdi)
192 ; KNL-NEXT:    retq
194 ; SKX-LABEL: trunc_qw_128_mem:
195 ; SKX:       ## %bb.0:
196 ; SKX-NEXT:    vpmovqw %xmm0, (%rdi)
197 ; SKX-NEXT:    retq
198     %x = trunc <2 x i64> %i to <2 x i16>
199     store <2 x i16> %x, <2 x i16>* %res
200     ret void
203 define <8 x i32> @trunc_qd_512(<8 x i64> %i) #0 {
204 ; ALL-LABEL: trunc_qd_512:
205 ; ALL:       ## %bb.0:
206 ; ALL-NEXT:    vpmovqd %zmm0, %ymm0
207 ; ALL-NEXT:    retq
208   %x = trunc <8 x i64> %i to <8 x i32>
209   ret <8 x i32> %x
212 define void @trunc_qd_512_mem(<8 x i64> %i, <8 x i32>* %res) #0 {
213 ; ALL-LABEL: trunc_qd_512_mem:
214 ; ALL:       ## %bb.0:
215 ; ALL-NEXT:    vpmovqd %zmm0, (%rdi)
216 ; ALL-NEXT:    vzeroupper
217 ; ALL-NEXT:    retq
218     %x = trunc <8 x i64> %i to <8 x i32>
219     store <8 x i32> %x, <8 x i32>* %res
220     ret void
223 define <4 x i32> @trunc_qd_256(<4 x i64> %i) #0 {
224 ; KNL-LABEL: trunc_qd_256:
225 ; KNL:       ## %bb.0:
226 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
227 ; KNL-NEXT:    vpmovqd %zmm0, %ymm0
228 ; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $ymm0
229 ; KNL-NEXT:    vzeroupper
230 ; KNL-NEXT:    retq
232 ; SKX-LABEL: trunc_qd_256:
233 ; SKX:       ## %bb.0:
234 ; SKX-NEXT:    vpmovqd %ymm0, %xmm0
235 ; SKX-NEXT:    vzeroupper
236 ; SKX-NEXT:    retq
237   %x = trunc <4 x i64> %i to <4 x i32>
238   ret <4 x i32> %x
241 define void @trunc_qd_256_mem(<4 x i64> %i, <4 x i32>* %res) #0 {
242 ; KNL-LABEL: trunc_qd_256_mem:
243 ; KNL:       ## %bb.0:
244 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
245 ; KNL-NEXT:    vpmovqd %zmm0, %ymm0
246 ; KNL-NEXT:    vmovdqa %xmm0, (%rdi)
247 ; KNL-NEXT:    vzeroupper
248 ; KNL-NEXT:    retq
250 ; SKX-LABEL: trunc_qd_256_mem:
251 ; SKX:       ## %bb.0:
252 ; SKX-NEXT:    vpmovqd %ymm0, (%rdi)
253 ; SKX-NEXT:    vzeroupper
254 ; SKX-NEXT:    retq
255     %x = trunc <4 x i64> %i to <4 x i32>
256     store <4 x i32> %x, <4 x i32>* %res
257     ret void
260 define <2 x i32> @trunc_qd_128(<2 x i64> %i) #0 {
261 ; ALL-LABEL: trunc_qd_128:
262 ; ALL:       ## %bb.0:
263 ; ALL-NEXT:    retq
264   %x = trunc <2 x i64> %i to <2 x i32>
265   ret <2 x i32> %x
268 define void @trunc_qd_128_mem(<2 x i64> %i, <2 x i32>* %res) #0 {
269 ; KNL-LABEL: trunc_qd_128_mem:
270 ; KNL:       ## %bb.0:
271 ; KNL-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
272 ; KNL-NEXT:    vmovlps %xmm0, (%rdi)
273 ; KNL-NEXT:    retq
275 ; SKX-LABEL: trunc_qd_128_mem:
276 ; SKX:       ## %bb.0:
277 ; SKX-NEXT:    vpmovqd %xmm0, (%rdi)
278 ; SKX-NEXT:    retq
279     %x = trunc <2 x i64> %i to <2 x i32>
280     store <2 x i32> %x, <2 x i32>* %res
281     ret void
284 define <16 x i8> @trunc_db_512(<16 x i32> %i) #0 {
285 ; ALL-LABEL: trunc_db_512:
286 ; ALL:       ## %bb.0:
287 ; ALL-NEXT:    vpmovdb %zmm0, %xmm0
288 ; ALL-NEXT:    vzeroupper
289 ; ALL-NEXT:    retq
290   %x = trunc <16 x i32> %i to <16 x i8>
291   ret <16 x i8> %x
294 define void @trunc_db_512_mem(<16 x i32> %i, <16 x i8>* %res) #0 {
295 ; ALL-LABEL: trunc_db_512_mem:
296 ; ALL:       ## %bb.0:
297 ; ALL-NEXT:    vpmovdb %zmm0, (%rdi)
298 ; ALL-NEXT:    vzeroupper
299 ; ALL-NEXT:    retq
300     %x = trunc <16 x i32> %i to <16 x i8>
301     store <16 x i8> %x, <16 x i8>* %res
302     ret void
305 define <8 x i8> @trunc_db_256(<8 x i32> %i) #0 {
306 ; KNL-LABEL: trunc_db_256:
307 ; KNL:       ## %bb.0:
308 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
309 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0
310 ; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $ymm0
311 ; KNL-NEXT:    vzeroupper
312 ; KNL-NEXT:    retq
314 ; SKX-LABEL: trunc_db_256:
315 ; SKX:       ## %bb.0:
316 ; SKX-NEXT:    vpmovdw %ymm0, %xmm0
317 ; SKX-NEXT:    vzeroupper
318 ; SKX-NEXT:    retq
319   %x = trunc <8 x i32> %i to <8 x i8>
320   ret <8 x i8> %x
323 define void @trunc_db_256_mem(<8 x i32> %i, <8 x i8>* %res) #0 {
324 ; KNL-LABEL: trunc_db_256_mem:
325 ; KNL:       ## %bb.0:
326 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
327 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0
328 ; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
329 ; KNL-NEXT:    vmovq %xmm0, (%rdi)
330 ; KNL-NEXT:    vzeroupper
331 ; KNL-NEXT:    retq
333 ; SKX-LABEL: trunc_db_256_mem:
334 ; SKX:       ## %bb.0:
335 ; SKX-NEXT:    vpmovdb %ymm0, (%rdi)
336 ; SKX-NEXT:    vzeroupper
337 ; SKX-NEXT:    retq
338     %x = trunc <8 x i32> %i to <8 x i8>
339     store <8 x i8> %x, <8 x i8>* %res
340     ret void
343 define <4 x i8> @trunc_db_128(<4 x i32> %i) #0 {
344 ; ALL-LABEL: trunc_db_128:
345 ; ALL:       ## %bb.0:
346 ; ALL-NEXT:    retq
347   %x = trunc <4 x i32> %i to <4 x i8>
348   ret <4 x i8> %x
351 define void @trunc_db_128_mem(<4 x i32> %i, <4 x i8>* %res) #0 {
352 ; KNL-LABEL: trunc_db_128_mem:
353 ; KNL:       ## %bb.0:
354 ; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
355 ; KNL-NEXT:    vmovd %xmm0, (%rdi)
356 ; KNL-NEXT:    retq
358 ; SKX-LABEL: trunc_db_128_mem:
359 ; SKX:       ## %bb.0:
360 ; SKX-NEXT:    vpmovdb %xmm0, (%rdi)
361 ; SKX-NEXT:    retq
362     %x = trunc <4 x i32> %i to <4 x i8>
363     store <4 x i8> %x, <4 x i8>* %res
364     ret void
367 define <16 x i16> @trunc_dw_512(<16 x i32> %i) #0 {
368 ; ALL-LABEL: trunc_dw_512:
369 ; ALL:       ## %bb.0:
370 ; ALL-NEXT:    vpmovdw %zmm0, %ymm0
371 ; ALL-NEXT:    retq
372   %x = trunc <16 x i32> %i to <16 x i16>
373   ret <16 x i16> %x
376 define void @trunc_dw_512_mem(<16 x i32> %i, <16 x i16>* %res) #0 {
377 ; ALL-LABEL: trunc_dw_512_mem:
378 ; ALL:       ## %bb.0:
379 ; ALL-NEXT:    vpmovdw %zmm0, (%rdi)
380 ; ALL-NEXT:    vzeroupper
381 ; ALL-NEXT:    retq
382     %x = trunc <16 x i32> %i to <16 x i16>
383     store <16 x i16> %x, <16 x i16>* %res
384     ret void
387 define <8 x i16> @trunc_dw_256(<8 x i32> %i) #0 {
388 ; KNL-LABEL: trunc_dw_256:
389 ; KNL:       ## %bb.0:
390 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
391 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0
392 ; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $ymm0
393 ; KNL-NEXT:    vzeroupper
394 ; KNL-NEXT:    retq
396 ; SKX-LABEL: trunc_dw_256:
397 ; SKX:       ## %bb.0:
398 ; SKX-NEXT:    vpmovdw %ymm0, %xmm0
399 ; SKX-NEXT:    vzeroupper
400 ; SKX-NEXT:    retq
401   %x = trunc <8 x i32> %i to <8 x i16>
402   ret <8 x i16> %x
405 define void @trunc_dw_256_mem(<8 x i32> %i, <8 x i16>* %res) #0 {
406 ; KNL-LABEL: trunc_dw_256_mem:
407 ; KNL:       ## %bb.0:
408 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
409 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0
410 ; KNL-NEXT:    vmovdqa %xmm0, (%rdi)
411 ; KNL-NEXT:    vzeroupper
412 ; KNL-NEXT:    retq
414 ; SKX-LABEL: trunc_dw_256_mem:
415 ; SKX:       ## %bb.0:
416 ; SKX-NEXT:    vpmovdw %ymm0, (%rdi)
417 ; SKX-NEXT:    vzeroupper
418 ; SKX-NEXT:    retq
419     %x = trunc <8 x i32> %i to <8 x i16>
420     store <8 x i16> %x, <8 x i16>* %res
421     ret void
424 define void @trunc_dw_128_mem(<4 x i32> %i, <4 x i16>* %res) #0 {
425 ; KNL-LABEL: trunc_dw_128_mem:
426 ; KNL:       ## %bb.0:
427 ; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
428 ; KNL-NEXT:    vmovq %xmm0, (%rdi)
429 ; KNL-NEXT:    retq
431 ; SKX-LABEL: trunc_dw_128_mem:
432 ; SKX:       ## %bb.0:
433 ; SKX-NEXT:    vpmovdw %xmm0, (%rdi)
434 ; SKX-NEXT:    retq
435     %x = trunc <4 x i32> %i to <4 x i16>
436     store <4 x i16> %x, <4 x i16>* %res
437     ret void
440 define <32 x i8> @trunc_wb_512(<32 x i16> %i) #0 {
441 ; KNL-LABEL: trunc_wb_512:
442 ; KNL:       ## %bb.0:
443 ; KNL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
444 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
445 ; KNL-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
446 ; KNL-NEXT:    vpmovdb %zmm1, %xmm1
447 ; KNL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
448 ; KNL-NEXT:    retq
450 ; SKX-LABEL: trunc_wb_512:
451 ; SKX:       ## %bb.0:
452 ; SKX-NEXT:    vpmovwb %zmm0, %ymm0
453 ; SKX-NEXT:    retq
454   %x = trunc <32 x i16> %i to <32 x i8>
455   ret <32 x i8> %x
458 define void @trunc_wb_512_mem(<32 x i16> %i, <32 x i8>* %res) #0 {
459 ; KNL-LABEL: trunc_wb_512_mem:
460 ; KNL:       ## %bb.0:
461 ; KNL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
462 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
463 ; KNL-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
464 ; KNL-NEXT:    vpmovdb %zmm1, %xmm1
465 ; KNL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
466 ; KNL-NEXT:    vmovdqa %ymm0, (%rdi)
467 ; KNL-NEXT:    vzeroupper
468 ; KNL-NEXT:    retq
470 ; SKX-LABEL: trunc_wb_512_mem:
471 ; SKX:       ## %bb.0:
472 ; SKX-NEXT:    vpmovwb %zmm0, (%rdi)
473 ; SKX-NEXT:    vzeroupper
474 ; SKX-NEXT:    retq
475     %x = trunc <32 x i16> %i to <32 x i8>
476     store <32 x i8> %x, <32 x i8>* %res
477     ret void
480 define <16 x i8> @trunc_wb_256(<16 x i16> %i) #0 {
481 ; KNL-LABEL: trunc_wb_256:
482 ; KNL:       ## %bb.0:
483 ; KNL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
484 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
485 ; KNL-NEXT:    vzeroupper
486 ; KNL-NEXT:    retq
488 ; SKX-LABEL: trunc_wb_256:
489 ; SKX:       ## %bb.0:
490 ; SKX-NEXT:    vpmovwb %ymm0, %xmm0
491 ; SKX-NEXT:    vzeroupper
492 ; SKX-NEXT:    retq
493   %x = trunc <16 x i16> %i to <16 x i8>
494   ret <16 x i8> %x
497 define void @trunc_wb_256_mem(<16 x i16> %i, <16 x i8>* %res) #0 {
498 ; KNL-LABEL: trunc_wb_256_mem:
499 ; KNL:       ## %bb.0:
500 ; KNL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
501 ; KNL-NEXT:    vpmovdb %zmm0, (%rdi)
502 ; KNL-NEXT:    vzeroupper
503 ; KNL-NEXT:    retq
505 ; SKX-LABEL: trunc_wb_256_mem:
506 ; SKX:       ## %bb.0:
507 ; SKX-NEXT:    vpmovwb %ymm0, (%rdi)
508 ; SKX-NEXT:    vzeroupper
509 ; SKX-NEXT:    retq
510     %x = trunc <16 x i16> %i to <16 x i8>
511     store <16 x i8> %x, <16 x i8>* %res
512     ret void
515 define <8 x i8> @trunc_wb_128(<8 x i16> %i) #0 {
516 ; ALL-LABEL: trunc_wb_128:
517 ; ALL:       ## %bb.0:
518 ; ALL-NEXT:    retq
519   %x = trunc <8 x i16> %i to <8 x i8>
520   ret <8 x i8> %x
523 define void @trunc_wb_128_mem(<8 x i16> %i, <8 x i8>* %res) #0 {
524 ; KNL-LABEL: trunc_wb_128_mem:
525 ; KNL:       ## %bb.0:
526 ; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
527 ; KNL-NEXT:    vmovq %xmm0, (%rdi)
528 ; KNL-NEXT:    retq
530 ; SKX-LABEL: trunc_wb_128_mem:
531 ; SKX:       ## %bb.0:
532 ; SKX-NEXT:    vpmovwb %xmm0, (%rdi)
533 ; SKX-NEXT:    retq
534     %x = trunc <8 x i16> %i to <8 x i8>
535     store <8 x i8> %x, <8 x i8>* %res
536     ret void
540 define void @usat_trunc_wb_256_mem(<16 x i16> %i, <16 x i8>* %res) {
541 ; KNL-LABEL: usat_trunc_wb_256_mem:
542 ; KNL:       ## %bb.0:
543 ; KNL-NEXT:    vpminuw {{.*}}(%rip), %ymm0, %ymm0
544 ; KNL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
545 ; KNL-NEXT:    vpmovdb %zmm0, (%rdi)
546 ; KNL-NEXT:    vzeroupper
547 ; KNL-NEXT:    retq
549 ; SKX-LABEL: usat_trunc_wb_256_mem:
550 ; SKX:       ## %bb.0:
551 ; SKX-NEXT:    vpmovuswb %ymm0, (%rdi)
552 ; SKX-NEXT:    vzeroupper
553 ; SKX-NEXT:    retq
554   %x3 = icmp ult <16 x i16> %i, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
555   %x5 = select <16 x i1> %x3, <16 x i16> %i, <16 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
556   %x6 = trunc <16 x i16> %x5 to <16 x i8>
557   store <16 x i8> %x6, <16 x i8>* %res, align 1
558   ret void
561 define <16 x i8> @usat_trunc_wb_256(<16 x i16> %i) {
562 ; KNL-LABEL: usat_trunc_wb_256:
563 ; KNL:       ## %bb.0:
564 ; KNL-NEXT:    vpminuw {{.*}}(%rip), %ymm0, %ymm0
565 ; KNL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
566 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
567 ; KNL-NEXT:    vzeroupper
568 ; KNL-NEXT:    retq
570 ; SKX-LABEL: usat_trunc_wb_256:
571 ; SKX:       ## %bb.0:
572 ; SKX-NEXT:    vpmovuswb %ymm0, %xmm0
573 ; SKX-NEXT:    vzeroupper
574 ; SKX-NEXT:    retq
575   %x3 = icmp ult <16 x i16> %i, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
576   %x5 = select <16 x i1> %x3, <16 x i16> %i, <16 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
577   %x6 = trunc <16 x i16> %x5 to <16 x i8>
578   ret <16 x i8> %x6
581 define void @usat_trunc_wb_128_mem(<8 x i16> %i, <8 x i8>* %res) {
582 ; KNL-LABEL: usat_trunc_wb_128_mem:
583 ; KNL:       ## %bb.0:
584 ; KNL-NEXT:    vpminuw {{.*}}(%rip), %xmm0, %xmm0
585 ; KNL-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
586 ; KNL-NEXT:    vmovq %xmm0, (%rdi)
587 ; KNL-NEXT:    retq
589 ; SKX-LABEL: usat_trunc_wb_128_mem:
590 ; SKX:       ## %bb.0:
591 ; SKX-NEXT:    vpmovuswb %xmm0, (%rdi)
592 ; SKX-NEXT:    retq
593   %x3 = icmp ult <8 x i16> %i, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
594   %x5 = select <8 x i1> %x3, <8 x i16> %i, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
595   %x6 = trunc <8 x i16> %x5 to <8 x i8>
596   store <8 x i8> %x6, <8 x i8>* %res, align 1
597   ret void
600 define void @usat_trunc_db_512_mem(<16 x i32> %i, <16 x i8>* %res) {
601 ; ALL-LABEL: usat_trunc_db_512_mem:
602 ; ALL:       ## %bb.0:
603 ; ALL-NEXT:    vpmovusdb %zmm0, (%rdi)
604 ; ALL-NEXT:    vzeroupper
605 ; ALL-NEXT:    retq
606   %x3 = icmp ult <16 x i32> %i, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
607   %x5 = select <16 x i1> %x3, <16 x i32> %i, <16 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
608   %x6 = trunc <16 x i32> %x5 to <16 x i8>
609   store <16 x i8> %x6, <16 x i8>* %res, align 1
610   ret void
613 define void @usat_trunc_qb_512_mem(<8 x i64> %i, <8 x i8>* %res) {
614 ; ALL-LABEL: usat_trunc_qb_512_mem:
615 ; ALL:       ## %bb.0:
616 ; ALL-NEXT:    vpmovusqb %zmm0, (%rdi)
617 ; ALL-NEXT:    vzeroupper
618 ; ALL-NEXT:    retq
619   %x3 = icmp ult <8 x i64> %i, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
620   %x5 = select <8 x i1> %x3, <8 x i64> %i, <8 x i64> <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
621   %x6 = trunc <8 x i64> %x5 to <8 x i8>
622   store <8 x i8> %x6, <8 x i8>* %res, align 1
623   ret void
626 define void @usat_trunc_qd_512_mem(<8 x i64> %i, <8 x i32>* %res) {
627 ; ALL-LABEL: usat_trunc_qd_512_mem:
628 ; ALL:       ## %bb.0:
629 ; ALL-NEXT:    vpmovusqd %zmm0, (%rdi)
630 ; ALL-NEXT:    vzeroupper
631 ; ALL-NEXT:    retq
632   %x3 = icmp ult <8 x i64> %i, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
633   %x5 = select <8 x i1> %x3, <8 x i64> %i, <8 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
634   %x6 = trunc <8 x i64> %x5 to <8 x i32>
635   store <8 x i32> %x6, <8 x i32>* %res, align 1
636   ret void
639 define void @usat_trunc_qw_512_mem(<8 x i64> %i, <8 x i16>* %res) {
640 ; ALL-LABEL: usat_trunc_qw_512_mem:
641 ; ALL:       ## %bb.0:
642 ; ALL-NEXT:    vpmovusqw %zmm0, (%rdi)
643 ; ALL-NEXT:    vzeroupper
644 ; ALL-NEXT:    retq
645   %x3 = icmp ult <8 x i64> %i, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
646   %x5 = select <8 x i1> %x3, <8 x i64> %i, <8 x i64> <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
647   %x6 = trunc <8 x i64> %x5 to <8 x i16>
648   store <8 x i16> %x6, <8 x i16>* %res, align 1
649   ret void
652 define <32 x i8> @usat_trunc_db_1024(<32 x i32> %i) {
653 ; ALL-LABEL: usat_trunc_db_1024:
654 ; ALL:       ## %bb.0:
655 ; ALL-NEXT:    vpmovusdb %zmm0, %xmm0
656 ; ALL-NEXT:    vpmovusdb %zmm1, %xmm1
657 ; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
658 ; ALL-NEXT:    retq
659   %x3 = icmp ult <32 x i32> %i, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
660   %x5 = select <32 x i1> %x3, <32 x i32> %i, <32 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
661   %x6 = trunc <32 x i32> %x5 to <32 x i8>
662   ret <32 x i8> %x6
665 define void @usat_trunc_db_1024_mem(<32 x i32> %i, <32 x i8>* %p) {
666 ; ALL-LABEL: usat_trunc_db_1024_mem:
667 ; ALL:       ## %bb.0:
668 ; ALL-NEXT:    vpmovusdb %zmm0, %xmm0
669 ; ALL-NEXT:    vpmovusdb %zmm1, %xmm1
670 ; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
671 ; ALL-NEXT:    vmovdqu %ymm0, (%rdi)
672 ; ALL-NEXT:    vzeroupper
673 ; ALL-NEXT:    retq
674   %x3 = icmp ult <32 x i32> %i, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
675   %x5 = select <32 x i1> %x3, <32 x i32> %i, <32 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
676   %x6 = trunc <32 x i32> %x5 to <32 x i8>
677   store <32 x i8>%x6, <32 x i8>* %p, align 1
678   ret void
681 define <16 x i16> @usat_trunc_dw_512(<16 x i32> %i) {
682 ; ALL-LABEL: usat_trunc_dw_512:
683 ; ALL:       ## %bb.0:
684 ; ALL-NEXT:    vpmovusdw %zmm0, %ymm0
685 ; ALL-NEXT:    retq
686   %x3 = icmp ult <16 x i32> %i, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
687   %x5 = select <16 x i1> %x3, <16 x i32> %i, <16 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
688   %x6 = trunc <16 x i32> %x5 to <16 x i16>
689   ret <16 x i16> %x6
692 define <8 x i8> @usat_trunc_wb_128(<8 x i16> %i) {
693 ; ALL-LABEL: usat_trunc_wb_128:
694 ; ALL:       ## %bb.0:
695 ; ALL-NEXT:    vpminuw {{.*}}(%rip), %xmm0, %xmm0
696 ; ALL-NEXT:    retq
697   %x3 = icmp ult <8 x i16> %i, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
698   %x5 = select <8 x i1> %x3, <8 x i16> %i, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
699   %x6 = trunc <8 x i16> %x5 to <8 x i8>
700   ret <8 x i8>%x6
703 define <16 x i16> @usat_trunc_qw_1024(<16 x i64> %i) {
704 ; ALL-LABEL: usat_trunc_qw_1024:
705 ; ALL:       ## %bb.0:
706 ; ALL-NEXT:    vpmovusqw %zmm0, %xmm0
707 ; ALL-NEXT:    vpmovusqw %zmm1, %xmm1
708 ; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
709 ; ALL-NEXT:    retq
710   %x3 = icmp ult <16 x i64> %i, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
711   %x5 = select <16 x i1> %x3, <16 x i64> %i, <16 x i64> <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
712   %x6 = trunc <16 x i64> %x5 to <16 x i16>
713   ret <16 x i16> %x6
716 define <16 x i8> @usat_trunc_db_256(<8 x i32> %x) {
717 ; KNL-LABEL: usat_trunc_db_256:
718 ; KNL:       ## %bb.0:
719 ; KNL-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
720 ; KNL-NEXT:    vpminud %ymm1, %ymm0, %ymm0
721 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0
722 ; KNL-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
723 ; KNL-NEXT:    vzeroupper
724 ; KNL-NEXT:    retq
726 ; SKX-LABEL: usat_trunc_db_256:
727 ; SKX:       ## %bb.0:
728 ; SKX-NEXT:    vpminud {{.*}}(%rip){1to8}, %ymm0, %ymm0
729 ; SKX-NEXT:    vpmovdw %ymm0, %xmm0
730 ; SKX-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
731 ; SKX-NEXT:    vzeroupper
732 ; SKX-NEXT:    retq
733   %tmp1 = icmp ult <8 x i32> %x, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
734   %tmp2 = select <8 x i1> %tmp1, <8 x i32> %x, <8 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
735   %tmp3 = trunc <8 x i32> %tmp2 to <8 x i8>
736   %tmp4 = shufflevector <8 x i8> %tmp3, <8 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
737   ret <16 x i8> %tmp4
742 ; Tests for the following unsigned saturation pattern:
744 ; %a = icmp sgt %x, C1
745 ; %b = select %a, %x, C2
746 ; %c = icmp slt %b, C2
747 ; %d = select %c, %b, C2
748 ; %res = trunc %d
751 define void @smax_usat_trunc_wb_256_mem1(<16 x i16> %i, <16 x i8>* %res) {
752 ; KNL-LABEL: smax_usat_trunc_wb_256_mem1:
753 ; KNL:       ## %bb.0:
754 ; KNL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
755 ; KNL-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
756 ; KNL-NEXT:    vpminsw {{.*}}(%rip), %ymm0, %ymm0
757 ; KNL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
758 ; KNL-NEXT:    vpmovdb %zmm0, (%rdi)
759 ; KNL-NEXT:    vzeroupper
760 ; KNL-NEXT:    retq
762 ; SKX-LABEL: smax_usat_trunc_wb_256_mem1:
763 ; SKX:       ## %bb.0:
764 ; SKX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
765 ; SKX-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
766 ; SKX-NEXT:    vpmovuswb %ymm0, (%rdi)
767 ; SKX-NEXT:    vzeroupper
768 ; SKX-NEXT:    retq
769   %x1 = icmp sgt <16 x i16> %i, <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
770   %x2 = select <16 x i1> %x1, <16 x i16> %i, <16 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
771   %x3 = icmp slt <16 x i16> %x2, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
772   %x5 = select <16 x i1> %x3, <16 x i16> %x2, <16 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
773   %x6 = trunc <16 x i16> %x5 to <16 x i8>
774   store <16 x i8> %x6, <16 x i8>* %res, align 1
775   ret void
778 ; Test for smax(smin(x, C2), C1).
779 define void @smax_usat_trunc_wb_256_mem2(<16 x i16> %i, <16 x i8>* %res) {
780 ; KNL-LABEL: smax_usat_trunc_wb_256_mem2:
781 ; KNL:       ## %bb.0:
782 ; KNL-NEXT:    vpminsw {{.*}}(%rip), %ymm0, %ymm0
783 ; KNL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
784 ; KNL-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
785 ; KNL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
786 ; KNL-NEXT:    vpmovdb %zmm0, (%rdi)
787 ; KNL-NEXT:    vzeroupper
788 ; KNL-NEXT:    retq
790 ; SKX-LABEL: smax_usat_trunc_wb_256_mem2:
791 ; SKX:       ## %bb.0:
792 ; SKX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
793 ; SKX-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
794 ; SKX-NEXT:    vpmovuswb %ymm0, (%rdi)
795 ; SKX-NEXT:    vzeroupper
796 ; SKX-NEXT:    retq
797   %x1 = icmp slt <16 x i16> %i, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
798   %x2 = select <16 x i1> %x1, <16 x i16> %i, <16 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
799   %x3 = icmp sgt <16 x i16> %x2, <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
800   %x5 = select <16 x i1> %x3, <16 x i16> %x2, <16 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
801   %x6 = trunc <16 x i16> %x5 to <16 x i8>
802   store <16 x i8> %x6, <16 x i8>* %res, align 1
803   ret void
806 define <16 x i8> @smax_usat_trunc_wb_256(<16 x i16> %i) {
807 ; KNL-LABEL: smax_usat_trunc_wb_256:
808 ; KNL:       ## %bb.0:
809 ; KNL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
810 ; KNL-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
811 ; KNL-NEXT:    vpminsw {{.*}}(%rip), %ymm0, %ymm0
812 ; KNL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
813 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
814 ; KNL-NEXT:    vzeroupper
815 ; KNL-NEXT:    retq
817 ; SKX-LABEL: smax_usat_trunc_wb_256:
818 ; SKX:       ## %bb.0:
819 ; SKX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
820 ; SKX-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
821 ; SKX-NEXT:    vpmovuswb %ymm0, %xmm0
822 ; SKX-NEXT:    vzeroupper
823 ; SKX-NEXT:    retq
824   %x1 = icmp sgt <16 x i16> %i, <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
825   %x2 = select <16 x i1> %x1, <16 x i16> %i, <16 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
826   %x3 = icmp slt <16 x i16> %x2, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
827   %x5 = select <16 x i1> %x3, <16 x i16> %x2, <16 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
828   %x6 = trunc <16 x i16> %x5 to <16 x i8>
829   ret <16 x i8> %x6
830   }
832 define void @smax_usat_trunc_wb_128_mem(<8 x i16> %i, <8 x i8>* %res) {
833 ; KNL-LABEL: smax_usat_trunc_wb_128_mem:
834 ; KNL:       ## %bb.0:
835 ; KNL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
836 ; KNL-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
837 ; KNL-NEXT:    vpminsw {{.*}}(%rip), %xmm0, %xmm0
838 ; KNL-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
839 ; KNL-NEXT:    vmovq %xmm0, (%rdi)
840 ; KNL-NEXT:    retq
842 ; SKX-LABEL: smax_usat_trunc_wb_128_mem:
843 ; SKX:       ## %bb.0:
844 ; SKX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
845 ; SKX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
846 ; SKX-NEXT:    vpmovuswb %xmm0, (%rdi)
847 ; SKX-NEXT:    retq
848   %x1 = icmp sgt <8 x i16> %i, <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
849   %x2 = select <8 x i1> %x1, <8 x i16> %i, <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
850   %x3 = icmp slt <8 x i16> %x2, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
851   %x5 = select <8 x i1> %x3, <8 x i16> %x2, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
852   %x6 = trunc <8 x i16> %x5 to <8 x i8>
853   store <8 x i8> %x6, <8 x i8>* %res, align 1
854   ret void
857 define void @smax_usat_trunc_db_512_mem(<16 x i32> %i, <16 x i8>* %res) {
858 ; ALL-LABEL: smax_usat_trunc_db_512_mem:
859 ; ALL:       ## %bb.0:
860 ; ALL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
861 ; ALL-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
862 ; ALL-NEXT:    vpmovusdb %zmm0, (%rdi)
863 ; ALL-NEXT:    vzeroupper
864 ; ALL-NEXT:    retq
865   %x1 = icmp sgt <16 x i32> %i, <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
866   %x2 = select <16 x i1> %x1, <16 x i32> %i, <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
867   %x3 = icmp slt <16 x i32> %x2, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
868   %x5 = select <16 x i1> %x3, <16 x i32> %x2, <16 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
869   %x6 = trunc <16 x i32> %x5 to <16 x i8>
870   store <16 x i8> %x6, <16 x i8>* %res, align 1
871   ret void
874 define void @smax_usat_trunc_qb_512_mem(<8 x i64> %i, <8 x i8>* %res) {
875 ; ALL-LABEL: smax_usat_trunc_qb_512_mem:
876 ; ALL:       ## %bb.0:
877 ; ALL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
878 ; ALL-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
879 ; ALL-NEXT:    vpmovusqb %zmm0, (%rdi)
880 ; ALL-NEXT:    vzeroupper
881 ; ALL-NEXT:    retq
882   %x1 = icmp sgt <8 x i64> %i, <i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0>
883   %x2 = select <8 x i1> %x1, <8 x i64> %i, <8 x i64> <i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0>
884   %x3 = icmp slt <8 x i64> %x2, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
885   %x5 = select <8 x i1> %x3, <8 x i64> %x2, <8 x i64> <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
886   %x6 = trunc <8 x i64> %x5 to <8 x i8>
887   store <8 x i8> %x6, <8 x i8>* %res, align 1
888   ret void
891 define void @smax_usat_trunc_qd_512_mem(<8 x i64> %i, <8 x i32>* %res) {
892 ; ALL-LABEL: smax_usat_trunc_qd_512_mem:
893 ; ALL:       ## %bb.0:
894 ; ALL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
895 ; ALL-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
896 ; ALL-NEXT:    vpmovusqd %zmm0, (%rdi)
897 ; ALL-NEXT:    vzeroupper
898 ; ALL-NEXT:    retq
899   %x1 = icmp sgt <8 x i64> %i, <i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0>
900   %x2 = select <8 x i1> %x1, <8 x i64> %i, <8 x i64> <i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0>
901   %x3 = icmp slt <8 x i64> %x2, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
902   %x5 = select <8 x i1> %x3, <8 x i64> %x2, <8 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
903   %x6 = trunc <8 x i64> %x5 to <8 x i32>
904   store <8 x i32> %x6, <8 x i32>* %res, align 1
905   ret void
908 define void @smax_usat_trunc_qw_512_mem(<8 x i64> %i, <8 x i16>* %res) {
909 ; ALL-LABEL: smax_usat_trunc_qw_512_mem:
910 ; ALL:       ## %bb.0:
911 ; ALL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
912 ; ALL-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
913 ; ALL-NEXT:    vpmovusqw %zmm0, (%rdi)
914 ; ALL-NEXT:    vzeroupper
915 ; ALL-NEXT:    retq
916   %x1 = icmp sgt <8 x i64> %i, <i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0>
917   %x2 = select <8 x i1> %x1, <8 x i64> %i, <8 x i64> <i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0>
918   %x3 = icmp slt <8 x i64> %x2, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
919   %x5 = select <8 x i1> %x3, <8 x i64> %x2, <8 x i64> <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
920   %x6 = trunc <8 x i64> %x5 to <8 x i16>
921   store <8 x i16> %x6, <8 x i16>* %res, align 1
922   ret void
925 define <32 x i8> @smax_usat_trunc_db_1024(<32 x i32> %i) {
926 ; ALL-LABEL: smax_usat_trunc_db_1024:
927 ; ALL:       ## %bb.0:
928 ; ALL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
929 ; ALL-NEXT:    vpmaxsd %zmm2, %zmm1, %zmm1
930 ; ALL-NEXT:    vpmaxsd %zmm2, %zmm0, %zmm0
931 ; ALL-NEXT:    vpmovusdb %zmm0, %xmm0
932 ; ALL-NEXT:    vpmovusdb %zmm1, %xmm1
933 ; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
934 ; ALL-NEXT:    retq
935   %x1 = icmp sgt <32 x i32> %i, <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
936   %x2 = select <32 x i1> %x1, <32 x i32> %i, <32 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
937   %x3 = icmp slt <32 x i32> %x2, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
938   %x5 = select <32 x i1> %x3, <32 x i32> %x2, <32 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
939   %x6 = trunc <32 x i32> %x5 to <32 x i8>
940   ret <32 x i8> %x6
943 define void @smax_usat_trunc_db_1024_mem(<32 x i32> %i, <32 x i8>* %p) {
944 ; ALL-LABEL: smax_usat_trunc_db_1024_mem:
945 ; ALL:       ## %bb.0:
946 ; ALL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
947 ; ALL-NEXT:    vpmaxsd %zmm2, %zmm1, %zmm1
948 ; ALL-NEXT:    vpmaxsd %zmm2, %zmm0, %zmm0
949 ; ALL-NEXT:    vpmovusdb %zmm0, %xmm0
950 ; ALL-NEXT:    vpmovusdb %zmm1, %xmm1
951 ; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
952 ; ALL-NEXT:    vmovdqu %ymm0, (%rdi)
953 ; ALL-NEXT:    vzeroupper
954 ; ALL-NEXT:    retq
955   %x1 = icmp sgt <32 x i32> %i, <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
956   %x2 = select <32 x i1> %x1, <32 x i32> %i, <32 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
957   %x3 = icmp slt <32 x i32> %x2, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
958   %x5 = select <32 x i1> %x3, <32 x i32> %x2, <32 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
959   %x6 = trunc <32 x i32> %x5 to <32 x i8>
960   store <32 x i8>%x6, <32 x i8>* %p, align 1
961   ret void
964 define <16 x i16> @smax_usat_trunc_dw_512(<16 x i32> %i) {
965 ; ALL-LABEL: smax_usat_trunc_dw_512:
966 ; ALL:       ## %bb.0:
967 ; ALL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
968 ; ALL-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
969 ; ALL-NEXT:    vpmovusdw %zmm0, %ymm0
970 ; ALL-NEXT:    retq
971   %x1 = icmp sgt <16 x i32> %i, <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
972   %x2 = select <16 x i1> %x1, <16 x i32> %i, <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
973   %x3 = icmp slt <16 x i32> %x2, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
974   %x5 = select <16 x i1> %x3, <16 x i32> %x2, <16 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
975   %x6 = trunc <16 x i32> %x5 to <16 x i16>
976   ret <16 x i16> %x6
979 define void @negative_test1_smax_usat_trunc_wb_256_mem(<16 x i16> %i, <16 x i8>* %res) {
980 ; KNL-LABEL: negative_test1_smax_usat_trunc_wb_256_mem:
981 ; KNL:       ## %bb.0:
982 ; KNL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
983 ; KNL-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
984 ; KNL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
985 ; KNL-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
986 ; KNL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
987 ; KNL-NEXT:    vpmovdb %zmm0, (%rdi)
988 ; KNL-NEXT:    vzeroupper
989 ; KNL-NEXT:    retq
991 ; SKX-LABEL: negative_test1_smax_usat_trunc_wb_256_mem:
992 ; SKX:       ## %bb.0:
993 ; SKX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
994 ; SKX-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
995 ; SKX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
996 ; SKX-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
997 ; SKX-NEXT:    vpmovwb %ymm0, (%rdi)
998 ; SKX-NEXT:    vzeroupper
999 ; SKX-NEXT:    retq
1000   %x1 = icmp sgt <16 x i16> %i, <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
1001   %x2 = select <16 x i1> %x1, <16 x i16> %i, <16 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
1002   %x3 = icmp slt <16 x i16> %x2, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
1003   %x5 = select <16 x i1> %x3, <16 x i16> %x2, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
1004   %x6 = trunc <16 x i16> %x5 to <16 x i8>
1005   store <16 x i8> %x6, <16 x i8>* %res, align 1
1006   ret void
1009 define void @negative_test2_smax_usat_trunc_wb_256_mem(<16 x i16> %i, <16 x i8>* %res) {
1010 ; KNL-LABEL: negative_test2_smax_usat_trunc_wb_256_mem:
1011 ; KNL:       ## %bb.0:
1012 ; KNL-NEXT:    vpmaxsw {{.*}}(%rip), %ymm0, %ymm0
1013 ; KNL-NEXT:    vpminsw {{.*}}(%rip), %ymm0, %ymm0
1014 ; KNL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1015 ; KNL-NEXT:    vpmovdb %zmm0, (%rdi)
1016 ; KNL-NEXT:    vzeroupper
1017 ; KNL-NEXT:    retq
1019 ; SKX-LABEL: negative_test2_smax_usat_trunc_wb_256_mem:
1020 ; SKX:       ## %bb.0:
1021 ; SKX-NEXT:    vpmaxsw {{.*}}(%rip), %ymm0, %ymm0
1022 ; SKX-NEXT:    vpminsw {{.*}}(%rip), %ymm0, %ymm0
1023 ; SKX-NEXT:    vpmovwb %ymm0, (%rdi)
1024 ; SKX-NEXT:    vzeroupper
1025 ; SKX-NEXT:    retq
1026   %x1 = icmp sgt <16 x i16> %i, <i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10>
1027   %x2 = select <16 x i1> %x1, <16 x i16> %i, <16 x i16> <i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10>
1028   %x3 = icmp slt <16 x i16> %x2, <i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5>
1029   %x5 = select <16 x i1> %x3, <16 x i16> %x2, <16 x i16> <i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5>
1030   %x6 = trunc <16 x i16> %x5 to <16 x i8>
1031   store <16 x i8> %x6, <16 x i8>* %res, align 1
1032   ret void