[ARM] Split large truncating MVE stores
[llvm-complete.git] / test / CodeGen / X86 / avx512-trunc.ll
blob57cabca007661b60b5fb563b2148545b6e55e98e
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 %zmm0, %xmm0
694 ; ALL-NEXT:    vpmovusdb %zmm1, %xmm1
695 ; ALL-NEXT:    vmovdqu %xmm1, 16(%rdi)
696 ; ALL-NEXT:    vmovdqu %xmm0, (%rdi)
697 ; ALL-NEXT:    vzeroupper
698 ; ALL-NEXT:    retq
699   %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>
700   %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>
701   %x6 = trunc <32 x i32> %x5 to <32 x i8>
702   store <32 x i8>%x6, <32 x i8>* %p, align 1
703   ret void
706 define <16 x i16> @usat_trunc_dw_512(<16 x i32> %i) {
707 ; ALL-LABEL: usat_trunc_dw_512:
708 ; ALL:       ## %bb.0:
709 ; ALL-NEXT:    vpmovusdw %zmm0, %ymm0
710 ; ALL-NEXT:    retq
711   %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>
712   %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>
713   %x6 = trunc <16 x i32> %x5 to <16 x i16>
714   ret <16 x i16> %x6
717 define <8 x i8> @usat_trunc_wb_128(<8 x i16> %i) {
718 ; ALL-LABEL: usat_trunc_wb_128:
719 ; ALL:       ## %bb.0:
720 ; ALL-NEXT:    vpminuw {{.*}}(%rip), %xmm0, %xmm0
721 ; ALL-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
722 ; ALL-NEXT:    retq
723   %x3 = icmp ult <8 x i16> %i, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
724   %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>
725   %x6 = trunc <8 x i16> %x5 to <8 x i8>
726   ret <8 x i8>%x6
729 define <16 x i16> @usat_trunc_qw_1024(<16 x i64> %i) {
730 ; ALL-LABEL: usat_trunc_qw_1024:
731 ; ALL:       ## %bb.0:
732 ; ALL-NEXT:    vpmovusqw %zmm0, %xmm0
733 ; ALL-NEXT:    vpmovusqw %zmm1, %xmm1
734 ; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
735 ; ALL-NEXT:    retq
736   %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>
737   %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>
738   %x6 = trunc <16 x i64> %x5 to <16 x i16>
739   ret <16 x i16> %x6
742 define <16 x i8> @usat_trunc_db_256(<8 x i32> %x) {
743 ; KNL-LABEL: usat_trunc_db_256:
744 ; KNL:       ## %bb.0:
745 ; KNL-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
746 ; KNL-NEXT:    vpminud %ymm1, %ymm0, %ymm0
747 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
748 ; KNL-NEXT:    vzeroupper
749 ; KNL-NEXT:    retq
751 ; SKX-LABEL: usat_trunc_db_256:
752 ; SKX:       ## %bb.0:
753 ; SKX-NEXT:    vpminud {{.*}}(%rip){1to8}, %ymm0, %ymm0
754 ; SKX-NEXT:    vpmovdb %ymm0, %xmm0
755 ; SKX-NEXT:    vzeroupper
756 ; SKX-NEXT:    retq
757   %tmp1 = icmp ult <8 x i32> %x, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
758   %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>
759   %tmp3 = trunc <8 x i32> %tmp2 to <8 x i8>
760   %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>
761   ret <16 x i8> %tmp4
766 ; Tests for the following unsigned saturation pattern:
768 ; %a = icmp sgt %x, C1
769 ; %b = select %a, %x, C2
770 ; %c = icmp slt %b, C2
771 ; %d = select %c, %b, C2
772 ; %res = trunc %d
775 define void @smax_usat_trunc_wb_256_mem1(<16 x i16> %i, <16 x i8>* %res) {
776 ; KNL-LABEL: smax_usat_trunc_wb_256_mem1:
777 ; KNL:       ## %bb.0:
778 ; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm1
779 ; KNL-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
780 ; KNL-NEXT:    vmovdqu %xmm0, (%rdi)
781 ; KNL-NEXT:    vzeroupper
782 ; KNL-NEXT:    retq
784 ; SKX-LABEL: smax_usat_trunc_wb_256_mem1:
785 ; SKX:       ## %bb.0:
786 ; SKX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
787 ; SKX-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
788 ; SKX-NEXT:    vpmovuswb %ymm0, (%rdi)
789 ; SKX-NEXT:    vzeroupper
790 ; SKX-NEXT:    retq
791   %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>
792   %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>
793   %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>
794   %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>
795   %x6 = trunc <16 x i16> %x5 to <16 x i8>
796   store <16 x i8> %x6, <16 x i8>* %res, align 1
797   ret void
800 ; Test for smax(smin(x, C2), C1).
801 define void @smax_usat_trunc_wb_256_mem2(<16 x i16> %i, <16 x i8>* %res) {
802 ; KNL-LABEL: smax_usat_trunc_wb_256_mem2:
803 ; KNL:       ## %bb.0:
804 ; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm1
805 ; KNL-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
806 ; KNL-NEXT:    vmovdqu %xmm0, (%rdi)
807 ; KNL-NEXT:    vzeroupper
808 ; KNL-NEXT:    retq
810 ; SKX-LABEL: smax_usat_trunc_wb_256_mem2:
811 ; SKX:       ## %bb.0:
812 ; SKX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
813 ; SKX-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
814 ; SKX-NEXT:    vpmovuswb %ymm0, (%rdi)
815 ; SKX-NEXT:    vzeroupper
816 ; SKX-NEXT:    retq
817   %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>
818   %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>
819   %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>
820   %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>
821   %x6 = trunc <16 x i16> %x5 to <16 x i8>
822   store <16 x i8> %x6, <16 x i8>* %res, align 1
823   ret void
826 define <16 x i8> @smax_usat_trunc_wb_256(<16 x i16> %i) {
827 ; KNL-LABEL: smax_usat_trunc_wb_256:
828 ; KNL:       ## %bb.0:
829 ; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm1
830 ; KNL-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
831 ; KNL-NEXT:    vzeroupper
832 ; KNL-NEXT:    retq
834 ; SKX-LABEL: smax_usat_trunc_wb_256:
835 ; SKX:       ## %bb.0:
836 ; SKX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
837 ; SKX-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
838 ; SKX-NEXT:    vpmovuswb %ymm0, %xmm0
839 ; SKX-NEXT:    vzeroupper
840 ; SKX-NEXT:    retq
841   %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>
842   %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>
843   %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>
844   %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>
845   %x6 = trunc <16 x i16> %x5 to <16 x i8>
846   ret <16 x i8> %x6
847   }
849 define void @smax_usat_trunc_wb_128_mem(<8 x i16> %i, <8 x i8>* %res) {
850 ; KNL-LABEL: smax_usat_trunc_wb_128_mem:
851 ; KNL:       ## %bb.0:
852 ; KNL-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
853 ; KNL-NEXT:    vmovq %xmm0, (%rdi)
854 ; KNL-NEXT:    retq
856 ; SKX-LABEL: smax_usat_trunc_wb_128_mem:
857 ; SKX:       ## %bb.0:
858 ; SKX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
859 ; SKX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
860 ; SKX-NEXT:    vpmovuswb %xmm0, (%rdi)
861 ; SKX-NEXT:    retq
862   %x1 = icmp sgt <8 x i16> %i, <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
863   %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>
864   %x3 = icmp slt <8 x i16> %x2, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
865   %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>
866   %x6 = trunc <8 x i16> %x5 to <8 x i8>
867   store <8 x i8> %x6, <8 x i8>* %res, align 1
868   ret void
871 define void @smax_usat_trunc_db_512_mem(<16 x i32> %i, <16 x i8>* %res) {
872 ; ALL-LABEL: smax_usat_trunc_db_512_mem:
873 ; ALL:       ## %bb.0:
874 ; ALL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
875 ; ALL-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
876 ; ALL-NEXT:    vpmovusdb %zmm0, (%rdi)
877 ; ALL-NEXT:    vzeroupper
878 ; ALL-NEXT:    retq
879   %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>
880   %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>
881   %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>
882   %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>
883   %x6 = trunc <16 x i32> %x5 to <16 x i8>
884   store <16 x i8> %x6, <16 x i8>* %res, align 1
885   ret void
888 define void @smax_usat_trunc_qb_512_mem(<8 x i64> %i, <8 x i8>* %res) {
889 ; ALL-LABEL: smax_usat_trunc_qb_512_mem:
890 ; ALL:       ## %bb.0:
891 ; ALL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
892 ; ALL-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
893 ; ALL-NEXT:    vpmovusqb %zmm0, (%rdi)
894 ; ALL-NEXT:    vzeroupper
895 ; ALL-NEXT:    retq
896   %x1 = icmp sgt <8 x i64> %i, <i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0>
897   %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>
898   %x3 = icmp slt <8 x i64> %x2, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
899   %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>
900   %x6 = trunc <8 x i64> %x5 to <8 x i8>
901   store <8 x i8> %x6, <8 x i8>* %res, align 1
902   ret void
905 define void @smax_usat_trunc_qd_512_mem(<8 x i64> %i, <8 x i32>* %res) {
906 ; ALL-LABEL: smax_usat_trunc_qd_512_mem:
907 ; ALL:       ## %bb.0:
908 ; ALL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
909 ; ALL-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
910 ; ALL-NEXT:    vpmovusqd %zmm0, (%rdi)
911 ; ALL-NEXT:    vzeroupper
912 ; ALL-NEXT:    retq
913   %x1 = icmp sgt <8 x i64> %i, <i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0>
914   %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>
915   %x3 = icmp slt <8 x i64> %x2, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
916   %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>
917   %x6 = trunc <8 x i64> %x5 to <8 x i32>
918   store <8 x i32> %x6, <8 x i32>* %res, align 1
919   ret void
922 define void @smax_usat_trunc_qw_512_mem(<8 x i64> %i, <8 x i16>* %res) {
923 ; ALL-LABEL: smax_usat_trunc_qw_512_mem:
924 ; ALL:       ## %bb.0:
925 ; ALL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
926 ; ALL-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
927 ; ALL-NEXT:    vpmovusqw %zmm0, (%rdi)
928 ; ALL-NEXT:    vzeroupper
929 ; ALL-NEXT:    retq
930   %x1 = icmp sgt <8 x i64> %i, <i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0>
931   %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>
932   %x3 = icmp slt <8 x i64> %x2, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
933   %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>
934   %x6 = trunc <8 x i64> %x5 to <8 x i16>
935   store <8 x i16> %x6, <8 x i16>* %res, align 1
936   ret void
939 define <32 x i8> @smax_usat_trunc_db_1024(<32 x i32> %i) {
940 ; ALL-LABEL: smax_usat_trunc_db_1024:
941 ; ALL:       ## %bb.0:
942 ; ALL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
943 ; ALL-NEXT:    vpmaxsd %zmm2, %zmm1, %zmm1
944 ; ALL-NEXT:    vpmaxsd %zmm2, %zmm0, %zmm0
945 ; ALL-NEXT:    vpmovusdb %zmm0, %xmm0
946 ; ALL-NEXT:    vpmovusdb %zmm1, %xmm1
947 ; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
948 ; ALL-NEXT:    retq
949   %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>
950   %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>
951   %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>
952   %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>
953   %x6 = trunc <32 x i32> %x5 to <32 x i8>
954   ret <32 x i8> %x6
957 define void @smax_usat_trunc_db_1024_mem(<32 x i32> %i, <32 x i8>* %p) {
958 ; ALL-LABEL: smax_usat_trunc_db_1024_mem:
959 ; ALL:       ## %bb.0:
960 ; ALL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
961 ; ALL-NEXT:    vpmaxsd %zmm2, %zmm1, %zmm1
962 ; ALL-NEXT:    vpmaxsd %zmm2, %zmm0, %zmm0
963 ; ALL-NEXT:    vpmovusdb %zmm0, %xmm0
964 ; ALL-NEXT:    vpmovusdb %zmm1, %xmm1
965 ; ALL-NEXT:    vmovdqu %xmm1, 16(%rdi)
966 ; ALL-NEXT:    vmovdqu %xmm0, (%rdi)
967 ; ALL-NEXT:    vzeroupper
968 ; ALL-NEXT:    retq
969   %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>
970   %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>
971   %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>
972   %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>
973   %x6 = trunc <32 x i32> %x5 to <32 x i8>
974   store <32 x i8>%x6, <32 x i8>* %p, align 1
975   ret void
978 define <16 x i16> @smax_usat_trunc_dw_512(<16 x i32> %i) {
979 ; ALL-LABEL: smax_usat_trunc_dw_512:
980 ; ALL:       ## %bb.0:
981 ; ALL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
982 ; ALL-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
983 ; ALL-NEXT:    vpmovusdw %zmm0, %ymm0
984 ; ALL-NEXT:    retq
985   %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>
986   %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>
987   %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>
988   %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>
989   %x6 = trunc <16 x i32> %x5 to <16 x i16>
990   ret <16 x i16> %x6
993 define void @negative_test1_smax_usat_trunc_wb_256_mem(<16 x i16> %i, <16 x i8>* %res) {
994 ; KNL-LABEL: negative_test1_smax_usat_trunc_wb_256_mem:
995 ; KNL:       ## %bb.0:
996 ; KNL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
997 ; KNL-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
998 ; KNL-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
999 ; KNL-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
1000 ; 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
1001 ; KNL-NEXT:    vpmovdb %zmm0, (%rdi)
1002 ; KNL-NEXT:    vzeroupper
1003 ; KNL-NEXT:    retq
1005 ; SKX-LABEL: negative_test1_smax_usat_trunc_wb_256_mem:
1006 ; SKX:       ## %bb.0:
1007 ; SKX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1008 ; SKX-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
1009 ; SKX-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
1010 ; SKX-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
1011 ; SKX-NEXT:    vpmovwb %ymm0, (%rdi)
1012 ; SKX-NEXT:    vzeroupper
1013 ; SKX-NEXT:    retq
1014   %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>
1015   %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>
1016   %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>
1017   %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>
1018   %x6 = trunc <16 x i16> %x5 to <16 x i8>
1019   store <16 x i8> %x6, <16 x i8>* %res, align 1
1020   ret void
1023 define void @negative_test2_smax_usat_trunc_wb_256_mem(<16 x i16> %i, <16 x i8>* %res) {
1024 ; KNL-LABEL: negative_test2_smax_usat_trunc_wb_256_mem:
1025 ; KNL:       ## %bb.0:
1026 ; KNL-NEXT:    vpmaxsw {{.*}}(%rip), %ymm0, %ymm0
1027 ; KNL-NEXT:    vpminsw {{.*}}(%rip), %ymm0, %ymm0
1028 ; 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
1029 ; KNL-NEXT:    vpmovdb %zmm0, (%rdi)
1030 ; KNL-NEXT:    vzeroupper
1031 ; KNL-NEXT:    retq
1033 ; SKX-LABEL: negative_test2_smax_usat_trunc_wb_256_mem:
1034 ; SKX:       ## %bb.0:
1035 ; SKX-NEXT:    vpmaxsw {{.*}}(%rip), %ymm0, %ymm0
1036 ; SKX-NEXT:    vpminsw {{.*}}(%rip), %ymm0, %ymm0
1037 ; SKX-NEXT:    vpmovwb %ymm0, (%rdi)
1038 ; SKX-NEXT:    vzeroupper
1039 ; SKX-NEXT:    retq
1040   %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>
1041   %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>
1042   %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>
1043   %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>
1044   %x6 = trunc <16 x i16> %x5 to <16 x i8>
1045   store <16 x i8> %x6, <16 x i8>* %res, align 1
1046   ret void