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