[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / X86 / avx512-trunc.ll
blobbf49987aba4f7f00b74551ab7764c7c92a9a5db9
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:    vpmovqb %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:    vpmovqb %zmm0, %xmm0
62 ; KNL-NEXT:    vzeroupper
63 ; KNL-NEXT:    retq
65 ; SKX-LABEL: trunc_qb_256:
66 ; SKX:       ## %bb.0:
67 ; SKX-NEXT:    vpmovqb %ymm0, %xmm0
68 ; SKX-NEXT:    vzeroupper
69 ; SKX-NEXT:    retq
70   %x = trunc <4 x i64> %i to <4 x i8>
71   ret <4 x i8> %x
74 define void @trunc_qb_256_mem(<4 x i64> %i, <4 x i8>* %res) #0 {
75 ; KNL-LABEL: trunc_qb_256_mem:
76 ; KNL:       ## %bb.0:
77 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
78 ; KNL-NEXT:    vpmovqb %zmm0, %xmm0
79 ; KNL-NEXT:    vmovd %xmm0, (%rdi)
80 ; KNL-NEXT:    vzeroupper
81 ; KNL-NEXT:    retq
83 ; SKX-LABEL: trunc_qb_256_mem:
84 ; SKX:       ## %bb.0:
85 ; SKX-NEXT:    vpmovqb %ymm0, (%rdi)
86 ; SKX-NEXT:    vzeroupper
87 ; SKX-NEXT:    retq
88     %x = trunc <4 x i64> %i to <4 x i8>
89     store <4 x i8> %x, <4 x i8>* %res
90     ret void
93 define <2 x i8> @trunc_qb_128(<2 x i64> %i) #0 {
94 ; ALL-LABEL: trunc_qb_128:
95 ; ALL:       ## %bb.0:
96 ; ALL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
97 ; ALL-NEXT:    retq
98   %x = trunc <2 x i64> %i to <2 x i8>
99   ret <2 x i8> %x
102 define void @trunc_qb_128_mem(<2 x i64> %i, <2 x i8>* %res) #0 {
103 ; KNL-LABEL: trunc_qb_128_mem:
104 ; KNL:       ## %bb.0:
105 ; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
106 ; KNL-NEXT:    vpextrw $0, %xmm0, (%rdi)
107 ; KNL-NEXT:    retq
109 ; SKX-LABEL: trunc_qb_128_mem:
110 ; SKX:       ## %bb.0:
111 ; SKX-NEXT:    vpmovqb %xmm0, (%rdi)
112 ; SKX-NEXT:    retq
113     %x = trunc <2 x i64> %i to <2 x i8>
114     store <2 x i8> %x, <2 x i8>* %res
115     ret void
118 define <8 x i16> @trunc_qw_512(<8 x i64> %i) #0 {
119 ; ALL-LABEL: trunc_qw_512:
120 ; ALL:       ## %bb.0:
121 ; ALL-NEXT:    vpmovqw %zmm0, %xmm0
122 ; ALL-NEXT:    vzeroupper
123 ; ALL-NEXT:    retq
124   %x = trunc <8 x i64> %i to <8 x i16>
125   ret <8 x i16> %x
128 define void @trunc_qw_512_mem(<8 x i64> %i, <8 x i16>* %res) #0 {
129 ; ALL-LABEL: trunc_qw_512_mem:
130 ; ALL:       ## %bb.0:
131 ; ALL-NEXT:    vpmovqw %zmm0, (%rdi)
132 ; ALL-NEXT:    vzeroupper
133 ; ALL-NEXT:    retq
134     %x = trunc <8 x i64> %i to <8 x i16>
135     store <8 x i16> %x, <8 x i16>* %res
136     ret void
139 define <4 x i16> @trunc_qw_256(<4 x i64> %i) #0 {
140 ; KNL-LABEL: trunc_qw_256:
141 ; KNL:       ## %bb.0:
142 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
143 ; KNL-NEXT:    vpmovqw %zmm0, %xmm0
144 ; KNL-NEXT:    vzeroupper
145 ; KNL-NEXT:    retq
147 ; SKX-LABEL: trunc_qw_256:
148 ; SKX:       ## %bb.0:
149 ; SKX-NEXT:    vpmovqw %ymm0, %xmm0
150 ; SKX-NEXT:    vzeroupper
151 ; SKX-NEXT:    retq
152   %x = trunc <4 x i64> %i to <4 x i16>
153   ret <4 x i16> %x
156 define void @trunc_qw_256_mem(<4 x i64> %i, <4 x i16>* %res) #0 {
157 ; KNL-LABEL: trunc_qw_256_mem:
158 ; KNL:       ## %bb.0:
159 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
160 ; KNL-NEXT:    vpmovqw %zmm0, %xmm0
161 ; KNL-NEXT:    vmovq %xmm0, (%rdi)
162 ; KNL-NEXT:    vzeroupper
163 ; KNL-NEXT:    retq
165 ; SKX-LABEL: trunc_qw_256_mem:
166 ; SKX:       ## %bb.0:
167 ; SKX-NEXT:    vpmovqw %ymm0, (%rdi)
168 ; SKX-NEXT:    vzeroupper
169 ; SKX-NEXT:    retq
170     %x = trunc <4 x i64> %i to <4 x i16>
171     store <4 x i16> %x, <4 x i16>* %res
172     ret void
175 define <2 x i16> @trunc_qw_128(<2 x i64> %i) #0 {
176 ; KNL-LABEL: trunc_qw_128:
177 ; KNL:       ## %bb.0:
178 ; KNL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
179 ; KNL-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
180 ; KNL-NEXT:    retq
182 ; SKX-LABEL: trunc_qw_128:
183 ; SKX:       ## %bb.0:
184 ; SKX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
185 ; SKX-NEXT:    retq
186   %x = trunc <2 x i64> %i to <2 x i16>
187   ret <2 x i16> %x
190 define void @trunc_qw_128_mem(<2 x i64> %i, <2 x i16>* %res) #0 {
191 ; KNL-LABEL: trunc_qw_128_mem:
192 ; KNL:       ## %bb.0:
193 ; KNL-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
194 ; KNL-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
195 ; KNL-NEXT:    vmovd %xmm0, (%rdi)
196 ; KNL-NEXT:    retq
198 ; SKX-LABEL: trunc_qw_128_mem:
199 ; SKX:       ## %bb.0:
200 ; SKX-NEXT:    vpmovqw %xmm0, (%rdi)
201 ; SKX-NEXT:    retq
202     %x = trunc <2 x i64> %i to <2 x i16>
203     store <2 x i16> %x, <2 x i16>* %res
204     ret void
207 define <8 x i32> @trunc_qd_512(<8 x i64> %i) #0 {
208 ; ALL-LABEL: trunc_qd_512:
209 ; ALL:       ## %bb.0:
210 ; ALL-NEXT:    vpmovqd %zmm0, %ymm0
211 ; ALL-NEXT:    retq
212   %x = trunc <8 x i64> %i to <8 x i32>
213   ret <8 x i32> %x
216 define void @trunc_qd_512_mem(<8 x i64> %i, <8 x i32>* %res) #0 {
217 ; ALL-LABEL: trunc_qd_512_mem:
218 ; ALL:       ## %bb.0:
219 ; ALL-NEXT:    vpmovqd %zmm0, (%rdi)
220 ; ALL-NEXT:    vzeroupper
221 ; ALL-NEXT:    retq
222     %x = trunc <8 x i64> %i to <8 x i32>
223     store <8 x i32> %x, <8 x i32>* %res
224     ret void
227 define <4 x i32> @trunc_qd_256(<4 x i64> %i) #0 {
228 ; KNL-LABEL: trunc_qd_256:
229 ; KNL:       ## %bb.0:
230 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
231 ; KNL-NEXT:    vpmovqd %zmm0, %ymm0
232 ; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $ymm0
233 ; KNL-NEXT:    vzeroupper
234 ; KNL-NEXT:    retq
236 ; SKX-LABEL: trunc_qd_256:
237 ; SKX:       ## %bb.0:
238 ; SKX-NEXT:    vpmovqd %ymm0, %xmm0
239 ; SKX-NEXT:    vzeroupper
240 ; SKX-NEXT:    retq
241   %x = trunc <4 x i64> %i to <4 x i32>
242   ret <4 x i32> %x
245 define void @trunc_qd_256_mem(<4 x i64> %i, <4 x i32>* %res) #0 {
246 ; KNL-LABEL: trunc_qd_256_mem:
247 ; KNL:       ## %bb.0:
248 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
249 ; KNL-NEXT:    vpmovqd %zmm0, %ymm0
250 ; KNL-NEXT:    vmovdqa %xmm0, (%rdi)
251 ; KNL-NEXT:    vzeroupper
252 ; KNL-NEXT:    retq
254 ; SKX-LABEL: trunc_qd_256_mem:
255 ; SKX:       ## %bb.0:
256 ; SKX-NEXT:    vpmovqd %ymm0, (%rdi)
257 ; SKX-NEXT:    vzeroupper
258 ; SKX-NEXT:    retq
259     %x = trunc <4 x i64> %i to <4 x i32>
260     store <4 x i32> %x, <4 x i32>* %res
261     ret void
264 define <2 x i32> @trunc_qd_128(<2 x i64> %i) #0 {
265 ; ALL-LABEL: trunc_qd_128:
266 ; ALL:       ## %bb.0:
267 ; ALL-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
268 ; ALL-NEXT:    retq
269   %x = trunc <2 x i64> %i to <2 x i32>
270   ret <2 x i32> %x
273 define void @trunc_qd_128_mem(<2 x i64> %i, <2 x i32>* %res) #0 {
274 ; KNL-LABEL: trunc_qd_128_mem:
275 ; KNL:       ## %bb.0:
276 ; KNL-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
277 ; KNL-NEXT:    vmovlps %xmm0, (%rdi)
278 ; KNL-NEXT:    retq
280 ; SKX-LABEL: trunc_qd_128_mem:
281 ; SKX:       ## %bb.0:
282 ; SKX-NEXT:    vpmovqd %xmm0, (%rdi)
283 ; SKX-NEXT:    retq
284     %x = trunc <2 x i64> %i to <2 x i32>
285     store <2 x i32> %x, <2 x i32>* %res
286     ret void
289 define <16 x i8> @trunc_db_512(<16 x i32> %i) #0 {
290 ; ALL-LABEL: trunc_db_512:
291 ; ALL:       ## %bb.0:
292 ; ALL-NEXT:    vpmovdb %zmm0, %xmm0
293 ; ALL-NEXT:    vzeroupper
294 ; ALL-NEXT:    retq
295   %x = trunc <16 x i32> %i to <16 x i8>
296   ret <16 x i8> %x
299 define void @trunc_db_512_mem(<16 x i32> %i, <16 x i8>* %res) #0 {
300 ; ALL-LABEL: trunc_db_512_mem:
301 ; ALL:       ## %bb.0:
302 ; ALL-NEXT:    vpmovdb %zmm0, (%rdi)
303 ; ALL-NEXT:    vzeroupper
304 ; ALL-NEXT:    retq
305     %x = trunc <16 x i32> %i to <16 x i8>
306     store <16 x i8> %x, <16 x i8>* %res
307     ret void
310 define <8 x i8> @trunc_db_256(<8 x i32> %i) #0 {
311 ; KNL-LABEL: trunc_db_256:
312 ; KNL:       ## %bb.0:
313 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
314 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
315 ; KNL-NEXT:    vzeroupper
316 ; KNL-NEXT:    retq
318 ; SKX-LABEL: trunc_db_256:
319 ; SKX:       ## %bb.0:
320 ; SKX-NEXT:    vpmovdb %ymm0, %xmm0
321 ; SKX-NEXT:    vzeroupper
322 ; SKX-NEXT:    retq
323   %x = trunc <8 x i32> %i to <8 x i8>
324   ret <8 x i8> %x
327 define void @trunc_db_256_mem(<8 x i32> %i, <8 x i8>* %res) #0 {
328 ; KNL-LABEL: trunc_db_256_mem:
329 ; KNL:       ## %bb.0:
330 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
331 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
332 ; KNL-NEXT:    vmovq %xmm0, (%rdi)
333 ; KNL-NEXT:    vzeroupper
334 ; KNL-NEXT:    retq
336 ; SKX-LABEL: trunc_db_256_mem:
337 ; SKX:       ## %bb.0:
338 ; SKX-NEXT:    vpmovdb %ymm0, (%rdi)
339 ; SKX-NEXT:    vzeroupper
340 ; SKX-NEXT:    retq
341     %x = trunc <8 x i32> %i to <8 x i8>
342     store <8 x i8> %x, <8 x i8>* %res
343     ret void
346 define <4 x i8> @trunc_db_128(<4 x i32> %i) #0 {
347 ; ALL-LABEL: trunc_db_128:
348 ; ALL:       ## %bb.0:
349 ; ALL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
350 ; ALL-NEXT:    retq
351   %x = trunc <4 x i32> %i to <4 x i8>
352   ret <4 x i8> %x
355 define void @trunc_db_128_mem(<4 x i32> %i, <4 x i8>* %res) #0 {
356 ; KNL-LABEL: trunc_db_128_mem:
357 ; KNL:       ## %bb.0:
358 ; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
359 ; KNL-NEXT:    vmovd %xmm0, (%rdi)
360 ; KNL-NEXT:    retq
362 ; SKX-LABEL: trunc_db_128_mem:
363 ; SKX:       ## %bb.0:
364 ; SKX-NEXT:    vpmovdb %xmm0, (%rdi)
365 ; SKX-NEXT:    retq
366     %x = trunc <4 x i32> %i to <4 x i8>
367     store <4 x i8> %x, <4 x i8>* %res
368     ret void
371 define <16 x i16> @trunc_dw_512(<16 x i32> %i) #0 {
372 ; ALL-LABEL: trunc_dw_512:
373 ; ALL:       ## %bb.0:
374 ; ALL-NEXT:    vpmovdw %zmm0, %ymm0
375 ; ALL-NEXT:    retq
376   %x = trunc <16 x i32> %i to <16 x i16>
377   ret <16 x i16> %x
380 define void @trunc_dw_512_mem(<16 x i32> %i, <16 x i16>* %res) #0 {
381 ; ALL-LABEL: trunc_dw_512_mem:
382 ; ALL:       ## %bb.0:
383 ; ALL-NEXT:    vpmovdw %zmm0, (%rdi)
384 ; ALL-NEXT:    vzeroupper
385 ; ALL-NEXT:    retq
386     %x = trunc <16 x i32> %i to <16 x i16>
387     store <16 x i16> %x, <16 x i16>* %res
388     ret void
391 define <8 x i16> @trunc_dw_256(<8 x i32> %i) #0 {
392 ; KNL-LABEL: trunc_dw_256:
393 ; KNL:       ## %bb.0:
394 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
395 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0
396 ; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $ymm0
397 ; KNL-NEXT:    vzeroupper
398 ; KNL-NEXT:    retq
400 ; SKX-LABEL: trunc_dw_256:
401 ; SKX:       ## %bb.0:
402 ; SKX-NEXT:    vpmovdw %ymm0, %xmm0
403 ; SKX-NEXT:    vzeroupper
404 ; SKX-NEXT:    retq
405   %x = trunc <8 x i32> %i to <8 x i16>
406   ret <8 x i16> %x
409 define void @trunc_dw_256_mem(<8 x i32> %i, <8 x i16>* %res) #0 {
410 ; KNL-LABEL: trunc_dw_256_mem:
411 ; KNL:       ## %bb.0:
412 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
413 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0
414 ; KNL-NEXT:    vmovdqa %xmm0, (%rdi)
415 ; KNL-NEXT:    vzeroupper
416 ; KNL-NEXT:    retq
418 ; SKX-LABEL: trunc_dw_256_mem:
419 ; SKX:       ## %bb.0:
420 ; SKX-NEXT:    vpmovdw %ymm0, (%rdi)
421 ; SKX-NEXT:    vzeroupper
422 ; SKX-NEXT:    retq
423     %x = trunc <8 x i32> %i to <8 x i16>
424     store <8 x i16> %x, <8 x i16>* %res
425     ret void
428 define void @trunc_dw_128_mem(<4 x i32> %i, <4 x i16>* %res) #0 {
429 ; KNL-LABEL: trunc_dw_128_mem:
430 ; KNL:       ## %bb.0:
431 ; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
432 ; KNL-NEXT:    vmovq %xmm0, (%rdi)
433 ; KNL-NEXT:    retq
435 ; SKX-LABEL: trunc_dw_128_mem:
436 ; SKX:       ## %bb.0:
437 ; SKX-NEXT:    vpmovdw %xmm0, (%rdi)
438 ; SKX-NEXT:    retq
439     %x = trunc <4 x i32> %i to <4 x i16>
440     store <4 x i16> %x, <4 x i16>* %res
441     ret void
444 define <32 x i8> @trunc_wb_512(<32 x i16> %i) #0 {
445 ; KNL-LABEL: trunc_wb_512:
446 ; KNL:       ## %bb.0:
447 ; KNL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
448 ; 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
449 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
450 ; 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
451 ; KNL-NEXT:    vpmovdb %zmm1, %xmm1
452 ; KNL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
453 ; KNL-NEXT:    retq
455 ; SKX-LABEL: trunc_wb_512:
456 ; SKX:       ## %bb.0:
457 ; SKX-NEXT:    vpmovwb %zmm0, %ymm0
458 ; SKX-NEXT:    retq
459   %x = trunc <32 x i16> %i to <32 x i8>
460   ret <32 x i8> %x
463 define void @trunc_wb_512_mem(<32 x i16> %i, <32 x i8>* %res) #0 {
464 ; KNL-LABEL: trunc_wb_512_mem:
465 ; KNL:       ## %bb.0:
466 ; KNL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
467 ; 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
468 ; KNL-NEXT:    vpmovdb %zmm1, 16(%rdi)
469 ; 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
470 ; KNL-NEXT:    vpmovdb %zmm0, (%rdi)
471 ; KNL-NEXT:    vzeroupper
472 ; KNL-NEXT:    retq
474 ; SKX-LABEL: trunc_wb_512_mem:
475 ; SKX:       ## %bb.0:
476 ; SKX-NEXT:    vpmovwb %zmm0, (%rdi)
477 ; SKX-NEXT:    vzeroupper
478 ; SKX-NEXT:    retq
479     %x = trunc <32 x i16> %i to <32 x i8>
480     store <32 x i8> %x, <32 x i8>* %res
481     ret void
484 define <16 x i8> @trunc_wb_256(<16 x i16> %i) #0 {
485 ; KNL-LABEL: trunc_wb_256:
486 ; KNL:       ## %bb.0:
487 ; 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
488 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
489 ; KNL-NEXT:    vzeroupper
490 ; KNL-NEXT:    retq
492 ; SKX-LABEL: trunc_wb_256:
493 ; SKX:       ## %bb.0:
494 ; SKX-NEXT:    vpmovwb %ymm0, %xmm0
495 ; SKX-NEXT:    vzeroupper
496 ; SKX-NEXT:    retq
497   %x = trunc <16 x i16> %i to <16 x i8>
498   ret <16 x i8> %x
501 define void @trunc_wb_256_mem(<16 x i16> %i, <16 x i8>* %res) #0 {
502 ; KNL-LABEL: trunc_wb_256_mem:
503 ; KNL:       ## %bb.0:
504 ; 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
505 ; KNL-NEXT:    vpmovdb %zmm0, (%rdi)
506 ; KNL-NEXT:    vzeroupper
507 ; KNL-NEXT:    retq
509 ; SKX-LABEL: trunc_wb_256_mem:
510 ; SKX:       ## %bb.0:
511 ; SKX-NEXT:    vpmovwb %ymm0, (%rdi)
512 ; SKX-NEXT:    vzeroupper
513 ; SKX-NEXT:    retq
514     %x = trunc <16 x i16> %i to <16 x i8>
515     store <16 x i8> %x, <16 x i8>* %res
516     ret void
519 define <16 x i8> @trunc_wb_256_mem_and_ret(<16 x i16> %i, <16 x i8>* %res) #0 {
520 ; KNL-LABEL: trunc_wb_256_mem_and_ret:
521 ; KNL:       ## %bb.0:
522 ; 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
523 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
524 ; KNL-NEXT:    vmovdqa %xmm0, (%rdi)
525 ; KNL-NEXT:    vzeroupper
526 ; KNL-NEXT:    retq
528 ; SKX-LABEL: trunc_wb_256_mem_and_ret:
529 ; SKX:       ## %bb.0:
530 ; SKX-NEXT:    vpmovwb %ymm0, %xmm0
531 ; SKX-NEXT:    vmovdqa %xmm0, (%rdi)
532 ; SKX-NEXT:    vzeroupper
533 ; SKX-NEXT:    retq
534     %x = trunc <16 x i16> %i to <16 x i8>
535     store <16 x i8> %x, <16 x i8>* %res
536     ret <16 x i8> %x
539 define <8 x i8> @trunc_wb_128(<8 x i16> %i) #0 {
540 ; ALL-LABEL: trunc_wb_128:
541 ; ALL:       ## %bb.0:
542 ; ALL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
543 ; ALL-NEXT:    retq
544   %x = trunc <8 x i16> %i to <8 x i8>
545   ret <8 x i8> %x
548 define void @trunc_wb_128_mem(<8 x i16> %i, <8 x i8>* %res) #0 {
549 ; KNL-LABEL: trunc_wb_128_mem:
550 ; KNL:       ## %bb.0:
551 ; KNL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
552 ; KNL-NEXT:    vmovq %xmm0, (%rdi)
553 ; KNL-NEXT:    retq
555 ; SKX-LABEL: trunc_wb_128_mem:
556 ; SKX:       ## %bb.0:
557 ; SKX-NEXT:    vpmovwb %xmm0, (%rdi)
558 ; SKX-NEXT:    retq
559     %x = trunc <8 x i16> %i to <8 x i8>
560     store <8 x i8> %x, <8 x i8>* %res
561     ret void
565 define void @usat_trunc_wb_256_mem(<16 x i16> %i, <16 x i8>* %res) {
566 ; KNL-LABEL: usat_trunc_wb_256_mem:
567 ; KNL:       ## %bb.0:
568 ; KNL-NEXT:    vpminuw {{.*}}(%rip), %ymm0, %ymm0
569 ; 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
570 ; KNL-NEXT:    vpmovdb %zmm0, (%rdi)
571 ; KNL-NEXT:    vzeroupper
572 ; KNL-NEXT:    retq
574 ; SKX-LABEL: usat_trunc_wb_256_mem:
575 ; SKX:       ## %bb.0:
576 ; SKX-NEXT:    vpmovuswb %ymm0, (%rdi)
577 ; SKX-NEXT:    vzeroupper
578 ; SKX-NEXT:    retq
579   %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>
580   %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>
581   %x6 = trunc <16 x i16> %x5 to <16 x i8>
582   store <16 x i8> %x6, <16 x i8>* %res, align 1
583   ret void
586 define <16 x i8> @usat_trunc_wb_256(<16 x i16> %i) {
587 ; KNL-LABEL: usat_trunc_wb_256:
588 ; KNL:       ## %bb.0:
589 ; KNL-NEXT:    vpminuw {{.*}}(%rip), %ymm0, %ymm0
590 ; 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
591 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
592 ; KNL-NEXT:    vzeroupper
593 ; KNL-NEXT:    retq
595 ; SKX-LABEL: usat_trunc_wb_256:
596 ; SKX:       ## %bb.0:
597 ; SKX-NEXT:    vpmovuswb %ymm0, %xmm0
598 ; SKX-NEXT:    vzeroupper
599 ; SKX-NEXT:    retq
600   %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>
601   %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>
602   %x6 = trunc <16 x i16> %x5 to <16 x i8>
603   ret <16 x i8> %x6
606 define void @usat_trunc_wb_128_mem(<8 x i16> %i, <8 x i8>* %res) {
607 ; KNL-LABEL: usat_trunc_wb_128_mem:
608 ; KNL:       ## %bb.0:
609 ; KNL-NEXT:    vpminuw {{.*}}(%rip), %xmm0, %xmm0
610 ; KNL-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
611 ; KNL-NEXT:    vmovq %xmm0, (%rdi)
612 ; KNL-NEXT:    retq
614 ; SKX-LABEL: usat_trunc_wb_128_mem:
615 ; SKX:       ## %bb.0:
616 ; SKX-NEXT:    vpmovuswb %xmm0, (%rdi)
617 ; SKX-NEXT:    retq
618   %x3 = icmp ult <8 x i16> %i, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
619   %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>
620   %x6 = trunc <8 x i16> %x5 to <8 x i8>
621   store <8 x i8> %x6, <8 x i8>* %res, align 1
622   ret void
625 define void @usat_trunc_db_512_mem(<16 x i32> %i, <16 x i8>* %res) {
626 ; ALL-LABEL: usat_trunc_db_512_mem:
627 ; ALL:       ## %bb.0:
628 ; ALL-NEXT:    vpmovusdb %zmm0, (%rdi)
629 ; ALL-NEXT:    vzeroupper
630 ; ALL-NEXT:    retq
631   %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>
632   %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>
633   %x6 = trunc <16 x i32> %x5 to <16 x i8>
634   store <16 x i8> %x6, <16 x i8>* %res, align 1
635   ret void
638 define void @usat_trunc_qb_512_mem(<8 x i64> %i, <8 x i8>* %res) {
639 ; ALL-LABEL: usat_trunc_qb_512_mem:
640 ; ALL:       ## %bb.0:
641 ; ALL-NEXT:    vpmovusqb %zmm0, (%rdi)
642 ; ALL-NEXT:    vzeroupper
643 ; ALL-NEXT:    retq
644   %x3 = icmp ult <8 x i64> %i, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
645   %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>
646   %x6 = trunc <8 x i64> %x5 to <8 x i8>
647   store <8 x i8> %x6, <8 x i8>* %res, align 1
648   ret void
651 define void @usat_trunc_qd_512_mem(<8 x i64> %i, <8 x i32>* %res) {
652 ; ALL-LABEL: usat_trunc_qd_512_mem:
653 ; ALL:       ## %bb.0:
654 ; ALL-NEXT:    vpmovusqd %zmm0, (%rdi)
655 ; ALL-NEXT:    vzeroupper
656 ; ALL-NEXT:    retq
657   %x3 = icmp ult <8 x i64> %i, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
658   %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>
659   %x6 = trunc <8 x i64> %x5 to <8 x i32>
660   store <8 x i32> %x6, <8 x i32>* %res, align 1
661   ret void
664 define void @usat_trunc_qw_512_mem(<8 x i64> %i, <8 x i16>* %res) {
665 ; ALL-LABEL: usat_trunc_qw_512_mem:
666 ; ALL:       ## %bb.0:
667 ; ALL-NEXT:    vpmovusqw %zmm0, (%rdi)
668 ; ALL-NEXT:    vzeroupper
669 ; ALL-NEXT:    retq
670   %x3 = icmp ult <8 x i64> %i, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
671   %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>
672   %x6 = trunc <8 x i64> %x5 to <8 x i16>
673   store <8 x i16> %x6, <8 x i16>* %res, align 1
674   ret void
677 define <32 x i8> @usat_trunc_db_1024(<32 x i32> %i) {
678 ; ALL-LABEL: usat_trunc_db_1024:
679 ; ALL:       ## %bb.0:
680 ; ALL-NEXT:    vpmovusdb %zmm0, %xmm0
681 ; ALL-NEXT:    vpmovusdb %zmm1, %xmm1
682 ; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
683 ; ALL-NEXT:    retq
684   %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>
685   %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>
686   %x6 = trunc <32 x i32> %x5 to <32 x i8>
687   ret <32 x i8> %x6
690 define void @usat_trunc_db_1024_mem(<32 x i32> %i, <32 x i8>* %p) {
691 ; ALL-LABEL: usat_trunc_db_1024_mem:
692 ; ALL:       ## %bb.0:
693 ; ALL-NEXT:    vpmovusdb %zmm1, 16(%rdi)
694 ; ALL-NEXT:    vpmovusdb %zmm0, (%rdi)
695 ; ALL-NEXT:    vzeroupper
696 ; ALL-NEXT:    retq
697   %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>
698   %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>
699   %x6 = trunc <32 x i32> %x5 to <32 x i8>
700   store <32 x i8>%x6, <32 x i8>* %p, align 1
701   ret void
704 define <16 x i16> @usat_trunc_dw_512(<16 x i32> %i) {
705 ; ALL-LABEL: usat_trunc_dw_512:
706 ; ALL:       ## %bb.0:
707 ; ALL-NEXT:    vpmovusdw %zmm0, %ymm0
708 ; ALL-NEXT:    retq
709   %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>
710   %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>
711   %x6 = trunc <16 x i32> %x5 to <16 x i16>
712   ret <16 x i16> %x6
715 define <8 x i8> @usat_trunc_wb_128(<8 x i16> %i) {
716 ; KNL-LABEL: usat_trunc_wb_128:
717 ; KNL:       ## %bb.0:
718 ; KNL-NEXT:    vpminuw {{.*}}(%rip), %xmm0, %xmm0
719 ; KNL-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
720 ; KNL-NEXT:    retq
722 ; SKX-LABEL: usat_trunc_wb_128:
723 ; SKX:       ## %bb.0:
724 ; SKX-NEXT:    vpmovuswb %xmm0, %xmm0
725 ; SKX-NEXT:    retq
726   %x3 = icmp ult <8 x i16> %i, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
727   %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>
728   %x6 = trunc <8 x i16> %x5 to <8 x i8>
729   ret <8 x i8>%x6
732 define <16 x i16> @usat_trunc_qw_1024(<16 x i64> %i) {
733 ; ALL-LABEL: usat_trunc_qw_1024:
734 ; ALL:       ## %bb.0:
735 ; ALL-NEXT:    vpmovusqw %zmm0, %xmm0
736 ; ALL-NEXT:    vpmovusqw %zmm1, %xmm1
737 ; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
738 ; ALL-NEXT:    retq
739   %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>
740   %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>
741   %x6 = trunc <16 x i64> %x5 to <16 x i16>
742   ret <16 x i16> %x6
745 define <16 x i8> @usat_trunc_db_256(<8 x i32> %x) {
746 ; KNL-LABEL: usat_trunc_db_256:
747 ; KNL:       ## %bb.0:
748 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
749 ; KNL-NEXT:    vpmovusdb %zmm0, %xmm0
750 ; KNL-NEXT:    vzeroupper
751 ; KNL-NEXT:    retq
753 ; SKX-LABEL: usat_trunc_db_256:
754 ; SKX:       ## %bb.0:
755 ; SKX-NEXT:    vpmovusdb %ymm0, %xmm0
756 ; SKX-NEXT:    vzeroupper
757 ; SKX-NEXT:    retq
758   %tmp1 = icmp ult <8 x i32> %x, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
759   %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>
760   %tmp3 = trunc <8 x i32> %tmp2 to <8 x i8>
761   %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>
762   ret <16 x i8> %tmp4
767 ; Tests for the following unsigned saturation pattern:
769 ; %a = icmp sgt %x, C1
770 ; %b = select %a, %x, C2
771 ; %c = icmp slt %b, C2
772 ; %d = select %c, %b, C2
773 ; %res = trunc %d
776 define void @smax_usat_trunc_wb_256_mem1(<16 x i16> %i, <16 x i8>* %res) {
777 ; KNL-LABEL: smax_usat_trunc_wb_256_mem1:
778 ; KNL:       ## %bb.0:
779 ; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm1
780 ; KNL-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
781 ; KNL-NEXT:    vmovdqu %xmm0, (%rdi)
782 ; KNL-NEXT:    vzeroupper
783 ; KNL-NEXT:    retq
785 ; SKX-LABEL: smax_usat_trunc_wb_256_mem1:
786 ; SKX:       ## %bb.0:
787 ; SKX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
788 ; SKX-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
789 ; SKX-NEXT:    vpmovuswb %ymm0, (%rdi)
790 ; SKX-NEXT:    vzeroupper
791 ; SKX-NEXT:    retq
792   %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>
793   %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>
794   %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>
795   %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>
796   %x6 = trunc <16 x i16> %x5 to <16 x i8>
797   store <16 x i8> %x6, <16 x i8>* %res, align 1
798   ret void
801 ; Test for smax(smin(x, C2), C1).
802 define void @smax_usat_trunc_wb_256_mem2(<16 x i16> %i, <16 x i8>* %res) {
803 ; KNL-LABEL: smax_usat_trunc_wb_256_mem2:
804 ; KNL:       ## %bb.0:
805 ; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm1
806 ; KNL-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
807 ; KNL-NEXT:    vmovdqu %xmm0, (%rdi)
808 ; KNL-NEXT:    vzeroupper
809 ; KNL-NEXT:    retq
811 ; SKX-LABEL: smax_usat_trunc_wb_256_mem2:
812 ; SKX:       ## %bb.0:
813 ; SKX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
814 ; SKX-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
815 ; SKX-NEXT:    vpmovuswb %ymm0, (%rdi)
816 ; SKX-NEXT:    vzeroupper
817 ; SKX-NEXT:    retq
818   %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>
819   %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>
820   %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>
821   %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>
822   %x6 = trunc <16 x i16> %x5 to <16 x i8>
823   store <16 x i8> %x6, <16 x i8>* %res, align 1
824   ret void
827 define <16 x i8> @smax_usat_trunc_wb_256(<16 x i16> %i) {
828 ; KNL-LABEL: smax_usat_trunc_wb_256:
829 ; KNL:       ## %bb.0:
830 ; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm1
831 ; KNL-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
832 ; KNL-NEXT:    vzeroupper
833 ; KNL-NEXT:    retq
835 ; SKX-LABEL: smax_usat_trunc_wb_256:
836 ; SKX:       ## %bb.0:
837 ; SKX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
838 ; SKX-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
839 ; SKX-NEXT:    vpmovuswb %ymm0, %xmm0
840 ; SKX-NEXT:    vzeroupper
841 ; SKX-NEXT:    retq
842   %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>
843   %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>
844   %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>
845   %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>
846   %x6 = trunc <16 x i16> %x5 to <16 x i8>
847   ret <16 x i8> %x6
848   }
850 define void @smax_usat_trunc_wb_128_mem(<8 x i16> %i, <8 x i8>* %res) {
851 ; KNL-LABEL: smax_usat_trunc_wb_128_mem:
852 ; KNL:       ## %bb.0:
853 ; KNL-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
854 ; KNL-NEXT:    vmovq %xmm0, (%rdi)
855 ; KNL-NEXT:    retq
857 ; SKX-LABEL: smax_usat_trunc_wb_128_mem:
858 ; SKX:       ## %bb.0:
859 ; SKX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
860 ; SKX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
861 ; SKX-NEXT:    vpmovuswb %xmm0, (%rdi)
862 ; SKX-NEXT:    retq
863   %x1 = icmp sgt <8 x i16> %i, <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
864   %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>
865   %x3 = icmp slt <8 x i16> %x2, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
866   %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>
867   %x6 = trunc <8 x i16> %x5 to <8 x i8>
868   store <8 x i8> %x6, <8 x i8>* %res, align 1
869   ret void
872 define void @smax_usat_trunc_db_512_mem(<16 x i32> %i, <16 x i8>* %res) {
873 ; ALL-LABEL: smax_usat_trunc_db_512_mem:
874 ; ALL:       ## %bb.0:
875 ; ALL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
876 ; ALL-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
877 ; ALL-NEXT:    vpmovusdb %zmm0, (%rdi)
878 ; ALL-NEXT:    vzeroupper
879 ; ALL-NEXT:    retq
880   %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>
881   %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>
882   %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>
883   %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>
884   %x6 = trunc <16 x i32> %x5 to <16 x i8>
885   store <16 x i8> %x6, <16 x i8>* %res, align 1
886   ret void
889 define void @smax_usat_trunc_qb_512_mem(<8 x i64> %i, <8 x i8>* %res) {
890 ; ALL-LABEL: smax_usat_trunc_qb_512_mem:
891 ; ALL:       ## %bb.0:
892 ; ALL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
893 ; ALL-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
894 ; ALL-NEXT:    vpmovusqb %zmm0, (%rdi)
895 ; ALL-NEXT:    vzeroupper
896 ; ALL-NEXT:    retq
897   %x1 = icmp sgt <8 x i64> %i, <i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0>
898   %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>
899   %x3 = icmp slt <8 x i64> %x2, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
900   %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>
901   %x6 = trunc <8 x i64> %x5 to <8 x i8>
902   store <8 x i8> %x6, <8 x i8>* %res, align 1
903   ret void
906 define void @smax_usat_trunc_qd_512_mem(<8 x i64> %i, <8 x i32>* %res) {
907 ; ALL-LABEL: smax_usat_trunc_qd_512_mem:
908 ; ALL:       ## %bb.0:
909 ; ALL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
910 ; ALL-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
911 ; ALL-NEXT:    vpmovusqd %zmm0, (%rdi)
912 ; ALL-NEXT:    vzeroupper
913 ; ALL-NEXT:    retq
914   %x1 = icmp sgt <8 x i64> %i, <i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0>
915   %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>
916   %x3 = icmp slt <8 x i64> %x2, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
917   %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>
918   %x6 = trunc <8 x i64> %x5 to <8 x i32>
919   store <8 x i32> %x6, <8 x i32>* %res, align 1
920   ret void
923 define void @smax_usat_trunc_qw_512_mem(<8 x i64> %i, <8 x i16>* %res) {
924 ; ALL-LABEL: smax_usat_trunc_qw_512_mem:
925 ; ALL:       ## %bb.0:
926 ; ALL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
927 ; ALL-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
928 ; ALL-NEXT:    vpmovusqw %zmm0, (%rdi)
929 ; ALL-NEXT:    vzeroupper
930 ; ALL-NEXT:    retq
931   %x1 = icmp sgt <8 x i64> %i, <i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0>
932   %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>
933   %x3 = icmp slt <8 x i64> %x2, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
934   %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>
935   %x6 = trunc <8 x i64> %x5 to <8 x i16>
936   store <8 x i16> %x6, <8 x i16>* %res, align 1
937   ret void
940 define <32 x i8> @smax_usat_trunc_db_1024(<32 x i32> %i) {
941 ; ALL-LABEL: smax_usat_trunc_db_1024:
942 ; ALL:       ## %bb.0:
943 ; ALL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
944 ; ALL-NEXT:    vpmaxsd %zmm2, %zmm1, %zmm1
945 ; ALL-NEXT:    vpmaxsd %zmm2, %zmm0, %zmm0
946 ; ALL-NEXT:    vpmovusdb %zmm0, %xmm0
947 ; ALL-NEXT:    vpmovusdb %zmm1, %xmm1
948 ; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
949 ; ALL-NEXT:    retq
950   %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>
951   %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>
952   %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>
953   %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>
954   %x6 = trunc <32 x i32> %x5 to <32 x i8>
955   ret <32 x i8> %x6
958 define void @smax_usat_trunc_db_1024_mem(<32 x i32> %i, <32 x i8>* %p) {
959 ; ALL-LABEL: smax_usat_trunc_db_1024_mem:
960 ; ALL:       ## %bb.0:
961 ; ALL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
962 ; ALL-NEXT:    vpmaxsd %zmm2, %zmm0, %zmm0
963 ; ALL-NEXT:    vpmaxsd %zmm2, %zmm1, %zmm1
964 ; ALL-NEXT:    vpmovusdb %zmm1, 16(%rdi)
965 ; ALL-NEXT:    vpmovusdb %zmm0, (%rdi)
966 ; ALL-NEXT:    vzeroupper
967 ; ALL-NEXT:    retq
968   %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>
969   %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>
970   %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>
971   %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>
972   %x6 = trunc <32 x i32> %x5 to <32 x i8>
973   store <32 x i8>%x6, <32 x i8>* %p, align 1
974   ret void
977 define <16 x i16> @smax_usat_trunc_dw_512(<16 x i32> %i) {
978 ; ALL-LABEL: smax_usat_trunc_dw_512:
979 ; ALL:       ## %bb.0:
980 ; ALL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
981 ; ALL-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
982 ; ALL-NEXT:    vpmovusdw %zmm0, %ymm0
983 ; ALL-NEXT:    retq
984   %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>
985   %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>
986   %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>
987   %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>
988   %x6 = trunc <16 x i32> %x5 to <16 x i16>
989   ret <16 x i16> %x6
992 define void @negative_test1_smax_usat_trunc_wb_256_mem(<16 x i16> %i, <16 x i8>* %res) {
993 ; KNL-LABEL: negative_test1_smax_usat_trunc_wb_256_mem:
994 ; KNL:       ## %bb.0:
995 ; KNL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
996 ; KNL-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
997 ; KNL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
998 ; KNL-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
999 ; 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
1000 ; KNL-NEXT:    vpmovdb %zmm0, (%rdi)
1001 ; KNL-NEXT:    vzeroupper
1002 ; KNL-NEXT:    retq
1004 ; SKX-LABEL: negative_test1_smax_usat_trunc_wb_256_mem:
1005 ; SKX:       ## %bb.0:
1006 ; SKX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1007 ; SKX-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
1008 ; SKX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
1009 ; SKX-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
1010 ; SKX-NEXT:    vpmovwb %ymm0, (%rdi)
1011 ; SKX-NEXT:    vzeroupper
1012 ; SKX-NEXT:    retq
1013   %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>
1014   %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>
1015   %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>
1016   %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>
1017   %x6 = trunc <16 x i16> %x5 to <16 x i8>
1018   store <16 x i8> %x6, <16 x i8>* %res, align 1
1019   ret void
1022 define void @negative_test2_smax_usat_trunc_wb_256_mem(<16 x i16> %i, <16 x i8>* %res) {
1023 ; KNL-LABEL: negative_test2_smax_usat_trunc_wb_256_mem:
1024 ; KNL:       ## %bb.0:
1025 ; KNL-NEXT:    vpmaxsw {{.*}}(%rip), %ymm0, %ymm0
1026 ; KNL-NEXT:    vpminsw {{.*}}(%rip), %ymm0, %ymm0
1027 ; 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
1028 ; KNL-NEXT:    vpmovdb %zmm0, (%rdi)
1029 ; KNL-NEXT:    vzeroupper
1030 ; KNL-NEXT:    retq
1032 ; SKX-LABEL: negative_test2_smax_usat_trunc_wb_256_mem:
1033 ; SKX:       ## %bb.0:
1034 ; SKX-NEXT:    vpmaxsw {{.*}}(%rip), %ymm0, %ymm0
1035 ; SKX-NEXT:    vpminsw {{.*}}(%rip), %ymm0, %ymm0
1036 ; SKX-NEXT:    vpmovwb %ymm0, (%rdi)
1037 ; SKX-NEXT:    vzeroupper
1038 ; SKX-NEXT:    retq
1039   %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>
1040   %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>
1041   %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>
1042   %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>
1043   %x6 = trunc <16 x i16> %x5 to <16 x i8>
1044   store <16 x i8> %x6, <16 x i8>* %res, align 1
1045   ret void
1048 define void @ssat_trunc_db_1024_mem(<32 x i32> %i, <32 x i8>* %p) {
1049 ; ALL-LABEL: ssat_trunc_db_1024_mem:
1050 ; ALL:       ## %bb.0:
1051 ; ALL-NEXT:    vpmovsdb %zmm1, 16(%rdi)
1052 ; ALL-NEXT:    vpmovsdb %zmm0, (%rdi)
1053 ; ALL-NEXT:    vzeroupper
1054 ; ALL-NEXT:    retq
1055   %x1 = icmp sgt <32 x i32> %i, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32
1056 -128, i32 -128>
1057   %x2 = select <32 x i1> %x1, <32 x i32> %i, <32 x i32> <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
1058   %x3 = icmp slt <32 x i32> %x2, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
1059   %x5 = select <32 x i1> %x3, <32 x i32> %x2, <32 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
1060   %x6 = trunc <32 x i32> %x5 to <32 x i8>
1061   store <32 x i8>%x6, <32 x i8>* %p, align 1
1062   ret void