1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-SLOW
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F
9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL
10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BW
11; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL
12; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=skx | FileCheck %s --check-prefixes=SKX
13
14;
15; Unsigned saturation truncation to vXi32
16;
17
18define <2 x i32> @trunc_usat_v2i64_v2i32(<2 x i64> %a0) {
19; SSE2-LABEL: trunc_usat_v2i64_v2i32:
20; SSE2:       # %bb.0:
21; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
22; SSE2-NEXT:    pxor %xmm0, %xmm1
23; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259455,9223372039002259455]
24; SSE2-NEXT:    movdqa %xmm2, %xmm3
25; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
26; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
27; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
28; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
29; SSE2-NEXT:    pand %xmm4, %xmm1
30; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
31; SSE2-NEXT:    por %xmm1, %xmm2
32; SSE2-NEXT:    pand %xmm2, %xmm0
33; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
34; SSE2-NEXT:    por %xmm0, %xmm2
35; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
36; SSE2-NEXT:    retq
37;
38; SSSE3-LABEL: trunc_usat_v2i64_v2i32:
39; SSSE3:       # %bb.0:
40; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
41; SSSE3-NEXT:    pxor %xmm0, %xmm1
42; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259455,9223372039002259455]
43; SSSE3-NEXT:    movdqa %xmm2, %xmm3
44; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
45; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
46; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm1
47; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
48; SSSE3-NEXT:    pand %xmm4, %xmm1
49; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
50; SSSE3-NEXT:    por %xmm1, %xmm2
51; SSSE3-NEXT:    pand %xmm2, %xmm0
52; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
53; SSSE3-NEXT:    por %xmm0, %xmm2
54; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
55; SSSE3-NEXT:    retq
56;
57; SSE41-LABEL: trunc_usat_v2i64_v2i32:
58; SSE41:       # %bb.0:
59; SSE41-NEXT:    movdqa %xmm0, %xmm1
60; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [4294967295,4294967295]
61; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
62; SSE41-NEXT:    pxor %xmm1, %xmm0
63; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259455,9223372039002259455]
64; SSE41-NEXT:    movdqa %xmm3, %xmm4
65; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
66; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
67; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
68; SSE41-NEXT:    pand %xmm4, %xmm0
69; SSE41-NEXT:    por %xmm3, %xmm0
70; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
71; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
72; SSE41-NEXT:    retq
73;
74; AVX-LABEL: trunc_usat_v2i64_v2i32:
75; AVX:       # %bb.0:
76; AVX-NEXT:    vmovapd {{.*#+}} xmm1 = [4294967295,4294967295]
77; AVX-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm2
78; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372041149743103,9223372041149743103]
79; AVX-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
80; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
81; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
82; AVX-NEXT:    retq
83;
84; AVX512F-LABEL: trunc_usat_v2i64_v2i32:
85; AVX512F:       # %bb.0:
86; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
87; AVX512F-NEXT:    vpmovusqd %zmm0, %ymm0
88; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
89; AVX512F-NEXT:    vzeroupper
90; AVX512F-NEXT:    retq
91;
92; AVX512VL-LABEL: trunc_usat_v2i64_v2i32:
93; AVX512VL:       # %bb.0:
94; AVX512VL-NEXT:    vpmovusqd %xmm0, %xmm0
95; AVX512VL-NEXT:    retq
96;
97; AVX512BW-LABEL: trunc_usat_v2i64_v2i32:
98; AVX512BW:       # %bb.0:
99; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
100; AVX512BW-NEXT:    vpmovusqd %zmm0, %ymm0
101; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
102; AVX512BW-NEXT:    vzeroupper
103; AVX512BW-NEXT:    retq
104;
105; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i32:
106; AVX512BWVL:       # %bb.0:
107; AVX512BWVL-NEXT:    vpmovusqd %xmm0, %xmm0
108; AVX512BWVL-NEXT:    retq
109;
110; SKX-LABEL: trunc_usat_v2i64_v2i32:
111; SKX:       # %bb.0:
112; SKX-NEXT:    vpmovusqd %xmm0, %xmm0
113; SKX-NEXT:    retq
114  %1 = icmp ult <2 x i64> %a0, <i64 4294967295, i64 4294967295>
115  %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 4294967295, i64 4294967295>
116  %3 = trunc <2 x i64> %2 to <2 x i32>
117  ret <2 x i32> %3
118}
119
120define void @trunc_usat_v2i64_v2i32_store(<2 x i64> %a0, <2 x i32>* %p1) {
121; SSE2-LABEL: trunc_usat_v2i64_v2i32_store:
122; SSE2:       # %bb.0:
123; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
124; SSE2-NEXT:    pxor %xmm0, %xmm1
125; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259455,9223372039002259455]
126; SSE2-NEXT:    movdqa %xmm2, %xmm3
127; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
128; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
129; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
130; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
131; SSE2-NEXT:    pand %xmm4, %xmm1
132; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
133; SSE2-NEXT:    por %xmm1, %xmm2
134; SSE2-NEXT:    pand %xmm2, %xmm0
135; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
136; SSE2-NEXT:    por %xmm0, %xmm2
137; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
138; SSE2-NEXT:    movq %xmm0, (%rdi)
139; SSE2-NEXT:    retq
140;
141; SSSE3-LABEL: trunc_usat_v2i64_v2i32_store:
142; SSSE3:       # %bb.0:
143; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
144; SSSE3-NEXT:    pxor %xmm0, %xmm1
145; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259455,9223372039002259455]
146; SSSE3-NEXT:    movdqa %xmm2, %xmm3
147; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
148; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
149; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm1
150; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
151; SSSE3-NEXT:    pand %xmm4, %xmm1
152; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
153; SSSE3-NEXT:    por %xmm1, %xmm2
154; SSSE3-NEXT:    pand %xmm2, %xmm0
155; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
156; SSSE3-NEXT:    por %xmm0, %xmm2
157; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
158; SSSE3-NEXT:    movq %xmm0, (%rdi)
159; SSSE3-NEXT:    retq
160;
161; SSE41-LABEL: trunc_usat_v2i64_v2i32_store:
162; SSE41:       # %bb.0:
163; SSE41-NEXT:    movdqa %xmm0, %xmm1
164; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [4294967295,4294967295]
165; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
166; SSE41-NEXT:    pxor %xmm1, %xmm0
167; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259455,9223372039002259455]
168; SSE41-NEXT:    movdqa %xmm3, %xmm4
169; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
170; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
171; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
172; SSE41-NEXT:    pand %xmm4, %xmm0
173; SSE41-NEXT:    por %xmm3, %xmm0
174; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
175; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
176; SSE41-NEXT:    movq %xmm0, (%rdi)
177; SSE41-NEXT:    retq
178;
179; AVX-LABEL: trunc_usat_v2i64_v2i32_store:
180; AVX:       # %bb.0:
181; AVX-NEXT:    vmovapd {{.*#+}} xmm1 = [4294967295,4294967295]
182; AVX-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm2
183; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372041149743103,9223372041149743103]
184; AVX-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
185; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
186; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
187; AVX-NEXT:    vmovlpd %xmm0, (%rdi)
188; AVX-NEXT:    retq
189;
190; AVX512F-LABEL: trunc_usat_v2i64_v2i32_store:
191; AVX512F:       # %bb.0:
192; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
193; AVX512F-NEXT:    vpmovusqd %zmm0, %ymm0
194; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
195; AVX512F-NEXT:    vzeroupper
196; AVX512F-NEXT:    retq
197;
198; AVX512VL-LABEL: trunc_usat_v2i64_v2i32_store:
199; AVX512VL:       # %bb.0:
200; AVX512VL-NEXT:    vpmovusqd %xmm0, (%rdi)
201; AVX512VL-NEXT:    retq
202;
203; AVX512BW-LABEL: trunc_usat_v2i64_v2i32_store:
204; AVX512BW:       # %bb.0:
205; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
206; AVX512BW-NEXT:    vpmovusqd %zmm0, %ymm0
207; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
208; AVX512BW-NEXT:    vzeroupper
209; AVX512BW-NEXT:    retq
210;
211; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i32_store:
212; AVX512BWVL:       # %bb.0:
213; AVX512BWVL-NEXT:    vpmovusqd %xmm0, (%rdi)
214; AVX512BWVL-NEXT:    retq
215;
216; SKX-LABEL: trunc_usat_v2i64_v2i32_store:
217; SKX:       # %bb.0:
218; SKX-NEXT:    vpmovusqd %xmm0, (%rdi)
219; SKX-NEXT:    retq
220  %1 = icmp ult <2 x i64> %a0, <i64 4294967295, i64 4294967295>
221  %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 4294967295, i64 4294967295>
222  %3 = trunc <2 x i64> %2 to <2 x i32>
223  store <2 x i32> %3, <2 x i32>* %p1
224  ret void
225}
226
227define <4 x i32> @trunc_usat_v4i64_v4i32(<4 x i64> %a0) {
228; SSE2-LABEL: trunc_usat_v4i64_v4i32:
229; SSE2:       # %bb.0:
230; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
231; SSE2-NEXT:    movdqa %xmm0, %xmm3
232; SSE2-NEXT:    pxor %xmm2, %xmm3
233; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259455,9223372039002259455]
234; SSE2-NEXT:    movdqa %xmm4, %xmm5
235; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
236; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
237; SSE2-NEXT:    pcmpeqd %xmm4, %xmm3
238; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
239; SSE2-NEXT:    pand %xmm6, %xmm3
240; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
241; SSE2-NEXT:    por %xmm3, %xmm5
242; SSE2-NEXT:    pxor %xmm1, %xmm2
243; SSE2-NEXT:    movdqa %xmm4, %xmm3
244; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
245; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
246; SSE2-NEXT:    pcmpeqd %xmm4, %xmm2
247; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
248; SSE2-NEXT:    pand %xmm6, %xmm2
249; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
250; SSE2-NEXT:    por %xmm2, %xmm3
251; SSE2-NEXT:    pand %xmm3, %xmm1
252; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm3
253; SSE2-NEXT:    por %xmm1, %xmm3
254; SSE2-NEXT:    pand %xmm5, %xmm0
255; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm5
256; SSE2-NEXT:    por %xmm5, %xmm0
257; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
258; SSE2-NEXT:    retq
259;
260; SSSE3-LABEL: trunc_usat_v4i64_v4i32:
261; SSSE3:       # %bb.0:
262; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
263; SSSE3-NEXT:    movdqa %xmm0, %xmm3
264; SSSE3-NEXT:    pxor %xmm2, %xmm3
265; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259455,9223372039002259455]
266; SSSE3-NEXT:    movdqa %xmm4, %xmm5
267; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
268; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
269; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm3
270; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
271; SSSE3-NEXT:    pand %xmm6, %xmm3
272; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
273; SSSE3-NEXT:    por %xmm3, %xmm5
274; SSSE3-NEXT:    pxor %xmm1, %xmm2
275; SSSE3-NEXT:    movdqa %xmm4, %xmm3
276; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
277; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
278; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm2
279; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
280; SSSE3-NEXT:    pand %xmm6, %xmm2
281; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
282; SSSE3-NEXT:    por %xmm2, %xmm3
283; SSSE3-NEXT:    pand %xmm3, %xmm1
284; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm3
285; SSSE3-NEXT:    por %xmm1, %xmm3
286; SSSE3-NEXT:    pand %xmm5, %xmm0
287; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm5
288; SSSE3-NEXT:    por %xmm5, %xmm0
289; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
290; SSSE3-NEXT:    retq
291;
292; SSE41-LABEL: trunc_usat_v4i64_v4i32:
293; SSE41:       # %bb.0:
294; SSE41-NEXT:    movdqa %xmm0, %xmm2
295; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
296; SSE41-NEXT:    movdqa %xmm2, %xmm3
297; SSE41-NEXT:    pxor %xmm0, %xmm3
298; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259455,9223372039002259455]
299; SSE41-NEXT:    movdqa %xmm4, %xmm5
300; SSE41-NEXT:    pcmpeqd %xmm3, %xmm5
301; SSE41-NEXT:    movdqa %xmm4, %xmm6
302; SSE41-NEXT:    pcmpgtd %xmm3, %xmm6
303; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[0,0,2,2]
304; SSE41-NEXT:    pand %xmm5, %xmm3
305; SSE41-NEXT:    por %xmm6, %xmm3
306; SSE41-NEXT:    pxor %xmm1, %xmm0
307; SSE41-NEXT:    movdqa %xmm4, %xmm5
308; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
309; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
310; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
311; SSE41-NEXT:    pand %xmm5, %xmm0
312; SSE41-NEXT:    por %xmm4, %xmm0
313; SSE41-NEXT:    movapd {{.*#+}} xmm4 = [4294967295,4294967295]
314; SSE41-NEXT:    movapd {{.*#+}} xmm5 = [4294967295,429496729]
315; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
316; SSE41-NEXT:    movdqa %xmm3, %xmm0
317; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
318; SSE41-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,2],xmm5[0,2]
319; SSE41-NEXT:    movaps %xmm4, %xmm0
320; SSE41-NEXT:    retq
321;
322; AVX1-LABEL: trunc_usat_v4i64_v4i32:
323; AVX1:       # %bb.0:
324; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
325; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm2
326; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372041149743103,9223372041149743103]
327; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
328; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
329; AVX1-NEXT:    vpxor %xmm1, %xmm4, %xmm1
330; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
331; AVX1-NEXT:    vmovapd {{.*#+}} xmm3 = [4294967295,429496729]
332; AVX1-NEXT:    vblendvpd %xmm1, %xmm4, %xmm3, %xmm1
333; AVX1-NEXT:    vmovapd {{.*#+}} xmm3 = [4294967295,4294967295]
334; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
335; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
336; AVX1-NEXT:    vzeroupper
337; AVX1-NEXT:    retq
338;
339; AVX2-SLOW-LABEL: trunc_usat_v4i64_v4i32:
340; AVX2-SLOW:       # %bb.0:
341; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
342; AVX2-SLOW-NEXT:    vpxor %ymm1, %ymm0, %ymm1
343; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
344; AVX2-SLOW-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm1
345; AVX2-SLOW-NEXT:    vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,429496729]
346; AVX2-SLOW-NEXT:    vblendvpd %ymm1, %ymm0, %ymm2, %ymm0
347; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1
348; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
349; AVX2-SLOW-NEXT:    vzeroupper
350; AVX2-SLOW-NEXT:    retq
351;
352; AVX2-FAST-LABEL: trunc_usat_v4i64_v4i32:
353; AVX2-FAST:       # %bb.0:
354; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
355; AVX2-FAST-NEXT:    vpxor %ymm1, %ymm0, %ymm1
356; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
357; AVX2-FAST-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm1
358; AVX2-FAST-NEXT:    vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,429496729]
359; AVX2-FAST-NEXT:    vblendvpd %ymm1, %ymm0, %ymm2, %ymm0
360; AVX2-FAST-NEXT:    vmovapd {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7]
361; AVX2-FAST-NEXT:    vpermps %ymm0, %ymm1, %ymm0
362; AVX2-FAST-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
363; AVX2-FAST-NEXT:    vzeroupper
364; AVX2-FAST-NEXT:    retq
365;
366; AVX512F-LABEL: trunc_usat_v4i64_v4i32:
367; AVX512F:       # %bb.0:
368; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
369; AVX512F-NEXT:    vpcmpltuq {{.*}}(%rip){1to8}, %zmm0, %k1
370; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
371; AVX512F-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k1}
372; AVX512F-NEXT:    vpmovqd %zmm1, %ymm0
373; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
374; AVX512F-NEXT:    vzeroupper
375; AVX512F-NEXT:    retq
376;
377; AVX512VL-LABEL: trunc_usat_v4i64_v4i32:
378; AVX512VL:       # %bb.0:
379; AVX512VL-NEXT:    vpcmpltuq {{.*}}(%rip){1to4}, %ymm0, %k1
380; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
381; AVX512VL-NEXT:    vmovdqa64 %ymm0, %ymm1 {%k1}
382; AVX512VL-NEXT:    vpmovqd %ymm1, %xmm0
383; AVX512VL-NEXT:    vzeroupper
384; AVX512VL-NEXT:    retq
385;
386; AVX512BW-LABEL: trunc_usat_v4i64_v4i32:
387; AVX512BW:       # %bb.0:
388; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
389; AVX512BW-NEXT:    vpcmpltuq {{.*}}(%rip){1to8}, %zmm0, %k1
390; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
391; AVX512BW-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k1}
392; AVX512BW-NEXT:    vpmovqd %zmm1, %ymm0
393; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
394; AVX512BW-NEXT:    vzeroupper
395; AVX512BW-NEXT:    retq
396;
397; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i32:
398; AVX512BWVL:       # %bb.0:
399; AVX512BWVL-NEXT:    vpcmpltuq {{.*}}(%rip){1to4}, %ymm0, %k1
400; AVX512BWVL-NEXT:    vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
401; AVX512BWVL-NEXT:    vmovdqa64 %ymm0, %ymm1 {%k1}
402; AVX512BWVL-NEXT:    vpmovqd %ymm1, %xmm0
403; AVX512BWVL-NEXT:    vzeroupper
404; AVX512BWVL-NEXT:    retq
405;
406; SKX-LABEL: trunc_usat_v4i64_v4i32:
407; SKX:       # %bb.0:
408; SKX-NEXT:    vpcmpltuq {{.*}}(%rip){1to4}, %ymm0, %k1
409; SKX-NEXT:    vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
410; SKX-NEXT:    vmovdqa64 %ymm0, %ymm1 {%k1}
411; SKX-NEXT:    vpmovqd %ymm1, %xmm0
412; SKX-NEXT:    vzeroupper
413; SKX-NEXT:    retq
414  %1 = icmp ult <4 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
415  %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 429496729>
416  %3 = trunc <4 x i64> %2 to <4 x i32>
417  ret <4 x i32> %3
418}
419
420define <8 x i32> @trunc_usat_v8i64_v8i32(<8 x i64>* %p0) {
421; SSE2-LABEL: trunc_usat_v8i64_v8i32:
422; SSE2:       # %bb.0:
423; SSE2-NEXT:    movdqa (%rdi), %xmm9
424; SSE2-NEXT:    movdqa 16(%rdi), %xmm5
425; SSE2-NEXT:    movdqa 32(%rdi), %xmm6
426; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
427; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [4294967295,4294967295]
428; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
429; SSE2-NEXT:    movdqa %xmm1, %xmm7
430; SSE2-NEXT:    pxor %xmm0, %xmm7
431; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [9223372039002259455,9223372039002259455]
432; SSE2-NEXT:    movdqa %xmm10, %xmm4
433; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
434; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[0,0,2,2]
435; SSE2-NEXT:    pcmpeqd %xmm10, %xmm7
436; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
437; SSE2-NEXT:    pand %xmm2, %xmm7
438; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
439; SSE2-NEXT:    por %xmm7, %xmm2
440; SSE2-NEXT:    pand %xmm2, %xmm1
441; SSE2-NEXT:    pandn %xmm8, %xmm2
442; SSE2-NEXT:    por %xmm1, %xmm2
443; SSE2-NEXT:    movdqa %xmm6, %xmm1
444; SSE2-NEXT:    pxor %xmm0, %xmm1
445; SSE2-NEXT:    movdqa %xmm10, %xmm4
446; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
447; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
448; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
449; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
450; SSE2-NEXT:    pand %xmm7, %xmm3
451; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
452; SSE2-NEXT:    por %xmm3, %xmm1
453; SSE2-NEXT:    pand %xmm1, %xmm6
454; SSE2-NEXT:    pandn %xmm8, %xmm1
455; SSE2-NEXT:    por %xmm6, %xmm1
456; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
457; SSE2-NEXT:    movdqa %xmm5, %xmm2
458; SSE2-NEXT:    pxor %xmm0, %xmm2
459; SSE2-NEXT:    movdqa %xmm10, %xmm3
460; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
461; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
462; SSE2-NEXT:    pcmpeqd %xmm10, %xmm2
463; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
464; SSE2-NEXT:    pand %xmm4, %xmm2
465; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
466; SSE2-NEXT:    por %xmm2, %xmm3
467; SSE2-NEXT:    pand %xmm3, %xmm5
468; SSE2-NEXT:    pandn %xmm8, %xmm3
469; SSE2-NEXT:    por %xmm5, %xmm3
470; SSE2-NEXT:    pxor %xmm9, %xmm0
471; SSE2-NEXT:    movdqa %xmm10, %xmm2
472; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
473; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
474; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
475; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
476; SSE2-NEXT:    pand %xmm4, %xmm5
477; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
478; SSE2-NEXT:    por %xmm5, %xmm0
479; SSE2-NEXT:    pand %xmm0, %xmm9
480; SSE2-NEXT:    pandn %xmm8, %xmm0
481; SSE2-NEXT:    por %xmm9, %xmm0
482; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
483; SSE2-NEXT:    retq
484;
485; SSSE3-LABEL: trunc_usat_v8i64_v8i32:
486; SSSE3:       # %bb.0:
487; SSSE3-NEXT:    movdqa (%rdi), %xmm9
488; SSSE3-NEXT:    movdqa 16(%rdi), %xmm5
489; SSSE3-NEXT:    movdqa 32(%rdi), %xmm6
490; SSSE3-NEXT:    movdqa 48(%rdi), %xmm1
491; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [4294967295,4294967295]
492; SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
493; SSSE3-NEXT:    movdqa %xmm1, %xmm7
494; SSSE3-NEXT:    pxor %xmm0, %xmm7
495; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [9223372039002259455,9223372039002259455]
496; SSSE3-NEXT:    movdqa %xmm10, %xmm4
497; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm4
498; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[0,0,2,2]
499; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm7
500; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
501; SSSE3-NEXT:    pand %xmm2, %xmm7
502; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
503; SSSE3-NEXT:    por %xmm7, %xmm2
504; SSSE3-NEXT:    pand %xmm2, %xmm1
505; SSSE3-NEXT:    pandn %xmm8, %xmm2
506; SSSE3-NEXT:    por %xmm1, %xmm2
507; SSSE3-NEXT:    movdqa %xmm6, %xmm1
508; SSSE3-NEXT:    pxor %xmm0, %xmm1
509; SSSE3-NEXT:    movdqa %xmm10, %xmm4
510; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
511; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
512; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm1
513; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
514; SSSE3-NEXT:    pand %xmm7, %xmm3
515; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
516; SSSE3-NEXT:    por %xmm3, %xmm1
517; SSSE3-NEXT:    pand %xmm1, %xmm6
518; SSSE3-NEXT:    pandn %xmm8, %xmm1
519; SSSE3-NEXT:    por %xmm6, %xmm1
520; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
521; SSSE3-NEXT:    movdqa %xmm5, %xmm2
522; SSSE3-NEXT:    pxor %xmm0, %xmm2
523; SSSE3-NEXT:    movdqa %xmm10, %xmm3
524; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
525; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
526; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm2
527; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
528; SSSE3-NEXT:    pand %xmm4, %xmm2
529; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
530; SSSE3-NEXT:    por %xmm2, %xmm3
531; SSSE3-NEXT:    pand %xmm3, %xmm5
532; SSSE3-NEXT:    pandn %xmm8, %xmm3
533; SSSE3-NEXT:    por %xmm5, %xmm3
534; SSSE3-NEXT:    pxor %xmm9, %xmm0
535; SSSE3-NEXT:    movdqa %xmm10, %xmm2
536; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
537; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
538; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm0
539; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
540; SSSE3-NEXT:    pand %xmm4, %xmm5
541; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
542; SSSE3-NEXT:    por %xmm5, %xmm0
543; SSSE3-NEXT:    pand %xmm0, %xmm9
544; SSSE3-NEXT:    pandn %xmm8, %xmm0
545; SSSE3-NEXT:    por %xmm9, %xmm0
546; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
547; SSSE3-NEXT:    retq
548;
549; SSE41-LABEL: trunc_usat_v8i64_v8i32:
550; SSE41:       # %bb.0:
551; SSE41-NEXT:    movdqa (%rdi), %xmm8
552; SSE41-NEXT:    movdqa 16(%rdi), %xmm9
553; SSE41-NEXT:    movdqa 32(%rdi), %xmm7
554; SSE41-NEXT:    movdqa 48(%rdi), %xmm1
555; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [4294967295,4294967295]
556; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
557; SSE41-NEXT:    movdqa %xmm1, %xmm0
558; SSE41-NEXT:    pxor %xmm5, %xmm0
559; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259455,9223372039002259455]
560; SSE41-NEXT:    movdqa %xmm3, %xmm6
561; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
562; SSE41-NEXT:    movdqa %xmm3, %xmm4
563; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
564; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
565; SSE41-NEXT:    pand %xmm6, %xmm0
566; SSE41-NEXT:    por %xmm4, %xmm0
567; SSE41-NEXT:    movapd %xmm2, %xmm4
568; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
569; SSE41-NEXT:    movdqa %xmm7, %xmm0
570; SSE41-NEXT:    pxor %xmm5, %xmm0
571; SSE41-NEXT:    movdqa %xmm3, %xmm1
572; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
573; SSE41-NEXT:    movdqa %xmm3, %xmm6
574; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
575; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
576; SSE41-NEXT:    pand %xmm1, %xmm0
577; SSE41-NEXT:    por %xmm6, %xmm0
578; SSE41-NEXT:    movapd %xmm2, %xmm1
579; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
580; SSE41-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm4[0,2]
581; SSE41-NEXT:    movdqa %xmm9, %xmm0
582; SSE41-NEXT:    pxor %xmm5, %xmm0
583; SSE41-NEXT:    movdqa %xmm3, %xmm4
584; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
585; SSE41-NEXT:    movdqa %xmm3, %xmm6
586; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
587; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
588; SSE41-NEXT:    pand %xmm4, %xmm0
589; SSE41-NEXT:    por %xmm6, %xmm0
590; SSE41-NEXT:    movapd %xmm2, %xmm4
591; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm4
592; SSE41-NEXT:    pxor %xmm8, %xmm5
593; SSE41-NEXT:    movdqa %xmm3, %xmm6
594; SSE41-NEXT:    pcmpeqd %xmm5, %xmm6
595; SSE41-NEXT:    pcmpgtd %xmm5, %xmm3
596; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
597; SSE41-NEXT:    pand %xmm6, %xmm0
598; SSE41-NEXT:    por %xmm3, %xmm0
599; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm2
600; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm4[0,2]
601; SSE41-NEXT:    movaps %xmm2, %xmm0
602; SSE41-NEXT:    retq
603;
604; AVX1-LABEL: trunc_usat_v8i64_v8i32:
605; AVX1:       # %bb.0:
606; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
607; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
608; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm2
609; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm3
610; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
611; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm5
612; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [9223372041149743103,9223372041149743103]
613; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm8
614; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm7
615; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm7
616; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm5
617; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
618; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm4
619; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
620; AVX1-NEXT:    vmovapd {{.*#+}} xmm6 = [4294967295,4294967295]
621; AVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm6, %xmm3
622; AVX1-NEXT:    vblendvpd %xmm5, %xmm1, %xmm6, %xmm1
623; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
624; AVX1-NEXT:    vblendvpd %xmm7, %xmm2, %xmm6, %xmm2
625; AVX1-NEXT:    vblendvpd %xmm8, %xmm0, %xmm6, %xmm0
626; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
627; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm1[0,2],ymm0[4,6],ymm1[4,6]
628; AVX1-NEXT:    retq
629;
630; AVX2-SLOW-LABEL: trunc_usat_v8i64_v8i32:
631; AVX2-SLOW:       # %bb.0:
632; AVX2-SLOW-NEXT:    vmovdqa (%rdi), %ymm0
633; AVX2-SLOW-NEXT:    vmovdqa 32(%rdi), %ymm1
634; AVX2-SLOW-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
635; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
636; AVX2-SLOW-NEXT:    vpxor %ymm3, %ymm1, %ymm4
637; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
638; AVX2-SLOW-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
639; AVX2-SLOW-NEXT:    vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
640; AVX2-SLOW-NEXT:    vpxor %ymm3, %ymm0, %ymm3
641; AVX2-SLOW-NEXT:    vpcmpgtq %ymm3, %ymm5, %ymm3
642; AVX2-SLOW-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
643; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
644; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
645; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
646; AVX2-SLOW-NEXT:    retq
647;
648; AVX2-FAST-LABEL: trunc_usat_v8i64_v8i32:
649; AVX2-FAST:       # %bb.0:
650; AVX2-FAST-NEXT:    vmovdqa (%rdi), %ymm0
651; AVX2-FAST-NEXT:    vmovdqa 32(%rdi), %ymm1
652; AVX2-FAST-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
653; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
654; AVX2-FAST-NEXT:    vpxor %ymm3, %ymm1, %ymm4
655; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
656; AVX2-FAST-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
657; AVX2-FAST-NEXT:    vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
658; AVX2-FAST-NEXT:    vpxor %ymm3, %ymm0, %ymm3
659; AVX2-FAST-NEXT:    vpcmpgtq %ymm3, %ymm5, %ymm3
660; AVX2-FAST-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
661; AVX2-FAST-NEXT:    vmovapd {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
662; AVX2-FAST-NEXT:    vpermps %ymm0, %ymm2, %ymm0
663; AVX2-FAST-NEXT:    vpermps %ymm1, %ymm2, %ymm1
664; AVX2-FAST-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
665; AVX2-FAST-NEXT:    retq
666;
667; AVX512-LABEL: trunc_usat_v8i64_v8i32:
668; AVX512:       # %bb.0:
669; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
670; AVX512-NEXT:    vpmovusqd %zmm0, %ymm0
671; AVX512-NEXT:    retq
672;
673; SKX-LABEL: trunc_usat_v8i64_v8i32:
674; SKX:       # %bb.0:
675; SKX-NEXT:    vmovdqa64 (%rdi), %zmm0
676; SKX-NEXT:    vpmovusqd %zmm0, %ymm0
677; SKX-NEXT:    retq
678  %a0 = load <8 x i64>, <8 x i64>* %p0
679  %1 = icmp ult <8 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
680  %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
681  %3 = trunc <8 x i64> %2 to <8 x i32>
682  ret <8 x i32> %3
683}
684
685;
686; Unsigned saturation truncation to vXi16
687;
688
689define <2 x i16> @trunc_usat_v2i64_v2i16(<2 x i64> %a0) {
690; SSE2-LABEL: trunc_usat_v2i64_v2i16:
691; SSE2:       # %bb.0:
692; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
693; SSE2-NEXT:    pxor %xmm0, %xmm1
694; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002324991,9223372039002324991]
695; SSE2-NEXT:    movdqa %xmm2, %xmm3
696; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
697; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
698; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
699; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
700; SSE2-NEXT:    pand %xmm4, %xmm1
701; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
702; SSE2-NEXT:    por %xmm1, %xmm2
703; SSE2-NEXT:    pand %xmm2, %xmm0
704; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
705; SSE2-NEXT:    por %xmm0, %xmm2
706; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
707; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
708; SSE2-NEXT:    retq
709;
710; SSSE3-LABEL: trunc_usat_v2i64_v2i16:
711; SSSE3:       # %bb.0:
712; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
713; SSSE3-NEXT:    pxor %xmm0, %xmm1
714; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002324991,9223372039002324991]
715; SSSE3-NEXT:    movdqa %xmm2, %xmm3
716; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
717; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
718; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm1
719; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
720; SSSE3-NEXT:    pand %xmm4, %xmm1
721; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
722; SSSE3-NEXT:    por %xmm1, %xmm2
723; SSSE3-NEXT:    pand %xmm2, %xmm0
724; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
725; SSSE3-NEXT:    por %xmm0, %xmm2
726; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
727; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
728; SSSE3-NEXT:    retq
729;
730; SSE41-LABEL: trunc_usat_v2i64_v2i16:
731; SSE41:       # %bb.0:
732; SSE41-NEXT:    movdqa %xmm0, %xmm1
733; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [65535,65535]
734; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
735; SSE41-NEXT:    pxor %xmm1, %xmm0
736; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002324991,9223372039002324991]
737; SSE41-NEXT:    movdqa %xmm3, %xmm4
738; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
739; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
740; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
741; SSE41-NEXT:    pand %xmm4, %xmm0
742; SSE41-NEXT:    por %xmm3, %xmm0
743; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
744; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
745; SSE41-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
746; SSE41-NEXT:    retq
747;
748; AVX1-LABEL: trunc_usat_v2i64_v2i16:
749; AVX1:       # %bb.0:
750; AVX1-NEXT:    vmovapd {{.*#+}} xmm1 = [65535,65535]
751; AVX1-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm2
752; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
753; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
754; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
755; AVX1-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
756; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
757; AVX1-NEXT:    retq
758;
759; AVX2-SLOW-LABEL: trunc_usat_v2i64_v2i16:
760; AVX2-SLOW:       # %bb.0:
761; AVX2-SLOW-NEXT:    vmovapd {{.*#+}} xmm1 = [65535,65535]
762; AVX2-SLOW-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm2
763; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
764; AVX2-SLOW-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
765; AVX2-SLOW-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
766; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
767; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
768; AVX2-SLOW-NEXT:    retq
769;
770; AVX2-FAST-LABEL: trunc_usat_v2i64_v2i16:
771; AVX2-FAST:       # %bb.0:
772; AVX2-FAST-NEXT:    vmovapd {{.*#+}} xmm1 = [65535,65535]
773; AVX2-FAST-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm2
774; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
775; AVX2-FAST-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
776; AVX2-FAST-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
777; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
778; AVX2-FAST-NEXT:    retq
779;
780; AVX512F-LABEL: trunc_usat_v2i64_v2i16:
781; AVX512F:       # %bb.0:
782; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
783; AVX512F-NEXT:    vpmovusqw %zmm0, %xmm0
784; AVX512F-NEXT:    vzeroupper
785; AVX512F-NEXT:    retq
786;
787; AVX512VL-LABEL: trunc_usat_v2i64_v2i16:
788; AVX512VL:       # %bb.0:
789; AVX512VL-NEXT:    vpmovusqw %xmm0, %xmm0
790; AVX512VL-NEXT:    retq
791;
792; AVX512BW-LABEL: trunc_usat_v2i64_v2i16:
793; AVX512BW:       # %bb.0:
794; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
795; AVX512BW-NEXT:    vpmovusqw %zmm0, %xmm0
796; AVX512BW-NEXT:    vzeroupper
797; AVX512BW-NEXT:    retq
798;
799; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i16:
800; AVX512BWVL:       # %bb.0:
801; AVX512BWVL-NEXT:    vpmovusqw %xmm0, %xmm0
802; AVX512BWVL-NEXT:    retq
803;
804; SKX-LABEL: trunc_usat_v2i64_v2i16:
805; SKX:       # %bb.0:
806; SKX-NEXT:    vpmovusqw %xmm0, %xmm0
807; SKX-NEXT:    retq
808  %1 = icmp ult <2 x i64> %a0, <i64 65535, i64 65535>
809  %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 65535, i64 65535>
810  %3 = trunc <2 x i64> %2 to <2 x i16>
811  ret <2 x i16> %3
812}
813
814define void @trunc_usat_v2i64_v2i16_store(<2 x i64> %a0, <2 x i16>* %p1) {
815; SSE2-LABEL: trunc_usat_v2i64_v2i16_store:
816; SSE2:       # %bb.0:
817; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
818; SSE2-NEXT:    pxor %xmm0, %xmm1
819; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002324991,9223372039002324991]
820; SSE2-NEXT:    movdqa %xmm2, %xmm3
821; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
822; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
823; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
824; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
825; SSE2-NEXT:    pand %xmm4, %xmm1
826; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
827; SSE2-NEXT:    por %xmm1, %xmm2
828; SSE2-NEXT:    pand %xmm2, %xmm0
829; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
830; SSE2-NEXT:    por %xmm0, %xmm2
831; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
832; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
833; SSE2-NEXT:    movd %xmm0, (%rdi)
834; SSE2-NEXT:    retq
835;
836; SSSE3-LABEL: trunc_usat_v2i64_v2i16_store:
837; SSSE3:       # %bb.0:
838; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
839; SSSE3-NEXT:    pxor %xmm0, %xmm1
840; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002324991,9223372039002324991]
841; SSSE3-NEXT:    movdqa %xmm2, %xmm3
842; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
843; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
844; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm1
845; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
846; SSSE3-NEXT:    pand %xmm4, %xmm1
847; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
848; SSSE3-NEXT:    por %xmm1, %xmm2
849; SSSE3-NEXT:    pand %xmm2, %xmm0
850; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
851; SSSE3-NEXT:    por %xmm0, %xmm2
852; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
853; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
854; SSSE3-NEXT:    movd %xmm0, (%rdi)
855; SSSE3-NEXT:    retq
856;
857; SSE41-LABEL: trunc_usat_v2i64_v2i16_store:
858; SSE41:       # %bb.0:
859; SSE41-NEXT:    movdqa %xmm0, %xmm1
860; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [65535,65535]
861; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
862; SSE41-NEXT:    pxor %xmm1, %xmm0
863; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002324991,9223372039002324991]
864; SSE41-NEXT:    movdqa %xmm3, %xmm4
865; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
866; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
867; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
868; SSE41-NEXT:    pand %xmm4, %xmm0
869; SSE41-NEXT:    por %xmm3, %xmm0
870; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
871; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
872; SSE41-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
873; SSE41-NEXT:    movd %xmm0, (%rdi)
874; SSE41-NEXT:    retq
875;
876; AVX1-LABEL: trunc_usat_v2i64_v2i16_store:
877; AVX1:       # %bb.0:
878; AVX1-NEXT:    vmovapd {{.*#+}} xmm1 = [65535,65535]
879; AVX1-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm2
880; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
881; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
882; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
883; AVX1-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
884; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
885; AVX1-NEXT:    vmovd %xmm0, (%rdi)
886; AVX1-NEXT:    retq
887;
888; AVX2-SLOW-LABEL: trunc_usat_v2i64_v2i16_store:
889; AVX2-SLOW:       # %bb.0:
890; AVX2-SLOW-NEXT:    vmovapd {{.*#+}} xmm1 = [65535,65535]
891; AVX2-SLOW-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm2
892; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
893; AVX2-SLOW-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
894; AVX2-SLOW-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
895; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
896; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
897; AVX2-SLOW-NEXT:    vmovd %xmm0, (%rdi)
898; AVX2-SLOW-NEXT:    retq
899;
900; AVX2-FAST-LABEL: trunc_usat_v2i64_v2i16_store:
901; AVX2-FAST:       # %bb.0:
902; AVX2-FAST-NEXT:    vmovapd {{.*#+}} xmm1 = [65535,65535]
903; AVX2-FAST-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm2
904; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
905; AVX2-FAST-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
906; AVX2-FAST-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
907; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
908; AVX2-FAST-NEXT:    vmovd %xmm0, (%rdi)
909; AVX2-FAST-NEXT:    retq
910;
911; AVX512F-LABEL: trunc_usat_v2i64_v2i16_store:
912; AVX512F:       # %bb.0:
913; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
914; AVX512F-NEXT:    vpmovusqw %zmm0, %xmm0
915; AVX512F-NEXT:    vmovd %xmm0, (%rdi)
916; AVX512F-NEXT:    vzeroupper
917; AVX512F-NEXT:    retq
918;
919; AVX512VL-LABEL: trunc_usat_v2i64_v2i16_store:
920; AVX512VL:       # %bb.0:
921; AVX512VL-NEXT:    vpmovusqw %xmm0, (%rdi)
922; AVX512VL-NEXT:    retq
923;
924; AVX512BW-LABEL: trunc_usat_v2i64_v2i16_store:
925; AVX512BW:       # %bb.0:
926; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
927; AVX512BW-NEXT:    vpmovusqw %zmm0, %xmm0
928; AVX512BW-NEXT:    vmovd %xmm0, (%rdi)
929; AVX512BW-NEXT:    vzeroupper
930; AVX512BW-NEXT:    retq
931;
932; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i16_store:
933; AVX512BWVL:       # %bb.0:
934; AVX512BWVL-NEXT:    vpmovusqw %xmm0, (%rdi)
935; AVX512BWVL-NEXT:    retq
936;
937; SKX-LABEL: trunc_usat_v2i64_v2i16_store:
938; SKX:       # %bb.0:
939; SKX-NEXT:    vpmovusqw %xmm0, (%rdi)
940; SKX-NEXT:    retq
941  %1 = icmp ult <2 x i64> %a0, <i64 65535, i64 65535>
942  %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 65535, i64 65535>
943  %3 = trunc <2 x i64> %2 to <2 x i16>
944  store <2 x i16> %3, <2 x i16>* %p1
945  ret void
946}
947
948define <4 x i16> @trunc_usat_v4i64_v4i16(<4 x i64> %a0) {
949; SSE2-LABEL: trunc_usat_v4i64_v4i16:
950; SSE2:       # %bb.0:
951; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535]
952; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
953; SSE2-NEXT:    movdqa %xmm0, %xmm4
954; SSE2-NEXT:    pxor %xmm3, %xmm4
955; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002324991,9223372039002324991]
956; SSE2-NEXT:    movdqa %xmm5, %xmm6
957; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
958; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
959; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
960; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
961; SSE2-NEXT:    pand %xmm7, %xmm4
962; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
963; SSE2-NEXT:    por %xmm4, %xmm6
964; SSE2-NEXT:    pand %xmm6, %xmm0
965; SSE2-NEXT:    pandn %xmm2, %xmm6
966; SSE2-NEXT:    por %xmm0, %xmm6
967; SSE2-NEXT:    pxor %xmm1, %xmm3
968; SSE2-NEXT:    movdqa %xmm5, %xmm0
969; SSE2-NEXT:    pcmpgtd %xmm3, %xmm0
970; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
971; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
972; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
973; SSE2-NEXT:    pand %xmm4, %xmm3
974; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
975; SSE2-NEXT:    por %xmm3, %xmm0
976; SSE2-NEXT:    pand %xmm0, %xmm1
977; SSE2-NEXT:    pandn %xmm2, %xmm0
978; SSE2-NEXT:    por %xmm1, %xmm0
979; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
980; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,2,2,3,4,5,6,7]
981; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,2,2,3]
982; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
983; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
984; SSE2-NEXT:    retq
985;
986; SSSE3-LABEL: trunc_usat_v4i64_v4i16:
987; SSSE3:       # %bb.0:
988; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535]
989; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
990; SSSE3-NEXT:    movdqa %xmm0, %xmm4
991; SSSE3-NEXT:    pxor %xmm3, %xmm4
992; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002324991,9223372039002324991]
993; SSSE3-NEXT:    movdqa %xmm5, %xmm6
994; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
995; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
996; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm4
997; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
998; SSSE3-NEXT:    pand %xmm7, %xmm4
999; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1000; SSSE3-NEXT:    por %xmm4, %xmm6
1001; SSSE3-NEXT:    pand %xmm6, %xmm0
1002; SSSE3-NEXT:    pandn %xmm2, %xmm6
1003; SSSE3-NEXT:    por %xmm0, %xmm6
1004; SSSE3-NEXT:    pxor %xmm1, %xmm3
1005; SSSE3-NEXT:    movdqa %xmm5, %xmm0
1006; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm0
1007; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1008; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm3
1009; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1010; SSSE3-NEXT:    pand %xmm4, %xmm3
1011; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1012; SSSE3-NEXT:    por %xmm3, %xmm0
1013; SSSE3-NEXT:    pand %xmm0, %xmm1
1014; SSSE3-NEXT:    pandn %xmm2, %xmm0
1015; SSSE3-NEXT:    por %xmm1, %xmm0
1016; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1017; SSSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,2,2,3,4,5,6,7]
1018; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,2,2,3]
1019; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1020; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1021; SSSE3-NEXT:    retq
1022;
1023; SSE41-LABEL: trunc_usat_v4i64_v4i16:
1024; SSE41:       # %bb.0:
1025; SSE41-NEXT:    movdqa %xmm0, %xmm3
1026; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [65535,65535]
1027; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
1028; SSE41-NEXT:    movdqa %xmm1, %xmm0
1029; SSE41-NEXT:    pxor %xmm4, %xmm0
1030; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002324991,9223372039002324991]
1031; SSE41-NEXT:    movdqa %xmm5, %xmm6
1032; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
1033; SSE41-NEXT:    movdqa %xmm5, %xmm7
1034; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
1035; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1036; SSE41-NEXT:    pand %xmm6, %xmm0
1037; SSE41-NEXT:    por %xmm7, %xmm0
1038; SSE41-NEXT:    movapd %xmm2, %xmm6
1039; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm6
1040; SSE41-NEXT:    pxor %xmm3, %xmm4
1041; SSE41-NEXT:    movdqa %xmm5, %xmm1
1042; SSE41-NEXT:    pcmpeqd %xmm4, %xmm1
1043; SSE41-NEXT:    pcmpgtd %xmm4, %xmm5
1044; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1045; SSE41-NEXT:    pand %xmm1, %xmm0
1046; SSE41-NEXT:    por %xmm5, %xmm0
1047; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
1048; SSE41-NEXT:    packusdw %xmm6, %xmm2
1049; SSE41-NEXT:    packusdw %xmm0, %xmm2
1050; SSE41-NEXT:    movdqa %xmm2, %xmm0
1051; SSE41-NEXT:    retq
1052;
1053; AVX1-LABEL: trunc_usat_v4i64_v4i16:
1054; AVX1:       # %bb.0:
1055; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
1056; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm2
1057; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
1058; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
1059; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
1060; AVX1-NEXT:    vpxor %xmm1, %xmm4, %xmm1
1061; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
1062; AVX1-NEXT:    vmovapd {{.*#+}} xmm3 = [65535,65535]
1063; AVX1-NEXT:    vblendvpd %xmm1, %xmm4, %xmm3, %xmm1
1064; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
1065; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1066; AVX1-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
1067; AVX1-NEXT:    vzeroupper
1068; AVX1-NEXT:    retq
1069;
1070; AVX2-LABEL: trunc_usat_v4i64_v4i16:
1071; AVX2:       # %bb.0:
1072; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [65535,65535,65535,65535]
1073; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1074; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm2
1075; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343]
1076; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm3, %ymm2
1077; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1078; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
1079; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1080; AVX2-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
1081; AVX2-NEXT:    vzeroupper
1082; AVX2-NEXT:    retq
1083;
1084; AVX512F-LABEL: trunc_usat_v4i64_v4i16:
1085; AVX512F:       # %bb.0:
1086; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1087; AVX512F-NEXT:    vpmovusqw %zmm0, %xmm0
1088; AVX512F-NEXT:    vzeroupper
1089; AVX512F-NEXT:    retq
1090;
1091; AVX512VL-LABEL: trunc_usat_v4i64_v4i16:
1092; AVX512VL:       # %bb.0:
1093; AVX512VL-NEXT:    vpmovusqw %ymm0, %xmm0
1094; AVX512VL-NEXT:    vzeroupper
1095; AVX512VL-NEXT:    retq
1096;
1097; AVX512BW-LABEL: trunc_usat_v4i64_v4i16:
1098; AVX512BW:       # %bb.0:
1099; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1100; AVX512BW-NEXT:    vpmovusqw %zmm0, %xmm0
1101; AVX512BW-NEXT:    vzeroupper
1102; AVX512BW-NEXT:    retq
1103;
1104; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i16:
1105; AVX512BWVL:       # %bb.0:
1106; AVX512BWVL-NEXT:    vpmovusqw %ymm0, %xmm0
1107; AVX512BWVL-NEXT:    vzeroupper
1108; AVX512BWVL-NEXT:    retq
1109;
1110; SKX-LABEL: trunc_usat_v4i64_v4i16:
1111; SKX:       # %bb.0:
1112; SKX-NEXT:    vpmovusqw %ymm0, %xmm0
1113; SKX-NEXT:    vzeroupper
1114; SKX-NEXT:    retq
1115  %1 = icmp ult <4 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535>
1116  %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 65535, i64 65535, i64 65535, i64 65535>
1117  %3 = trunc <4 x i64> %2 to <4 x i16>
1118  ret <4 x i16> %3
1119}
1120
1121define void @trunc_usat_v4i64_v4i16_store(<4 x i64> %a0, <4 x i16> *%p1) {
1122; SSE2-LABEL: trunc_usat_v4i64_v4i16_store:
1123; SSE2:       # %bb.0:
1124; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535]
1125; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
1126; SSE2-NEXT:    movdqa %xmm0, %xmm4
1127; SSE2-NEXT:    pxor %xmm3, %xmm4
1128; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002324991,9223372039002324991]
1129; SSE2-NEXT:    movdqa %xmm5, %xmm6
1130; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
1131; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1132; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
1133; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1134; SSE2-NEXT:    pand %xmm7, %xmm4
1135; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1136; SSE2-NEXT:    por %xmm4, %xmm6
1137; SSE2-NEXT:    pand %xmm6, %xmm0
1138; SSE2-NEXT:    pandn %xmm2, %xmm6
1139; SSE2-NEXT:    por %xmm0, %xmm6
1140; SSE2-NEXT:    pxor %xmm1, %xmm3
1141; SSE2-NEXT:    movdqa %xmm5, %xmm0
1142; SSE2-NEXT:    pcmpgtd %xmm3, %xmm0
1143; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1144; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
1145; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1146; SSE2-NEXT:    pand %xmm4, %xmm3
1147; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1148; SSE2-NEXT:    por %xmm3, %xmm0
1149; SSE2-NEXT:    pand %xmm0, %xmm1
1150; SSE2-NEXT:    pandn %xmm2, %xmm0
1151; SSE2-NEXT:    por %xmm1, %xmm0
1152; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1153; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1154; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[0,2,2,3]
1155; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1156; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1157; SSE2-NEXT:    movq %xmm1, (%rdi)
1158; SSE2-NEXT:    retq
1159;
1160; SSSE3-LABEL: trunc_usat_v4i64_v4i16_store:
1161; SSSE3:       # %bb.0:
1162; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535]
1163; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
1164; SSSE3-NEXT:    movdqa %xmm0, %xmm4
1165; SSSE3-NEXT:    pxor %xmm3, %xmm4
1166; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002324991,9223372039002324991]
1167; SSSE3-NEXT:    movdqa %xmm5, %xmm6
1168; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
1169; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1170; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm4
1171; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1172; SSSE3-NEXT:    pand %xmm7, %xmm4
1173; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1174; SSSE3-NEXT:    por %xmm4, %xmm6
1175; SSSE3-NEXT:    pand %xmm6, %xmm0
1176; SSSE3-NEXT:    pandn %xmm2, %xmm6
1177; SSSE3-NEXT:    por %xmm0, %xmm6
1178; SSSE3-NEXT:    pxor %xmm1, %xmm3
1179; SSSE3-NEXT:    movdqa %xmm5, %xmm0
1180; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm0
1181; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1182; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm3
1183; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1184; SSSE3-NEXT:    pand %xmm4, %xmm3
1185; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1186; SSSE3-NEXT:    por %xmm3, %xmm0
1187; SSSE3-NEXT:    pand %xmm0, %xmm1
1188; SSSE3-NEXT:    pandn %xmm2, %xmm0
1189; SSSE3-NEXT:    por %xmm1, %xmm0
1190; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1191; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1192; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[0,2,2,3]
1193; SSSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1194; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1195; SSSE3-NEXT:    movq %xmm1, (%rdi)
1196; SSSE3-NEXT:    retq
1197;
1198; SSE41-LABEL: trunc_usat_v4i64_v4i16_store:
1199; SSE41:       # %bb.0:
1200; SSE41-NEXT:    movdqa %xmm0, %xmm2
1201; SSE41-NEXT:    movapd {{.*#+}} xmm3 = [65535,65535]
1202; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
1203; SSE41-NEXT:    movdqa %xmm1, %xmm0
1204; SSE41-NEXT:    pxor %xmm4, %xmm0
1205; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002324991,9223372039002324991]
1206; SSE41-NEXT:    movdqa %xmm5, %xmm6
1207; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
1208; SSE41-NEXT:    movdqa %xmm5, %xmm7
1209; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
1210; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1211; SSE41-NEXT:    pand %xmm6, %xmm0
1212; SSE41-NEXT:    por %xmm7, %xmm0
1213; SSE41-NEXT:    movapd %xmm3, %xmm6
1214; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm6
1215; SSE41-NEXT:    pxor %xmm2, %xmm4
1216; SSE41-NEXT:    movdqa %xmm5, %xmm1
1217; SSE41-NEXT:    pcmpeqd %xmm4, %xmm1
1218; SSE41-NEXT:    pcmpgtd %xmm4, %xmm5
1219; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1220; SSE41-NEXT:    pand %xmm1, %xmm0
1221; SSE41-NEXT:    por %xmm5, %xmm0
1222; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
1223; SSE41-NEXT:    packusdw %xmm6, %xmm3
1224; SSE41-NEXT:    packusdw %xmm0, %xmm3
1225; SSE41-NEXT:    movq %xmm3, (%rdi)
1226; SSE41-NEXT:    retq
1227;
1228; AVX1-LABEL: trunc_usat_v4i64_v4i16_store:
1229; AVX1:       # %bb.0:
1230; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
1231; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm2
1232; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
1233; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
1234; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
1235; AVX1-NEXT:    vpxor %xmm1, %xmm4, %xmm1
1236; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
1237; AVX1-NEXT:    vmovapd {{.*#+}} xmm3 = [65535,65535]
1238; AVX1-NEXT:    vblendvpd %xmm1, %xmm4, %xmm3, %xmm1
1239; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
1240; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1241; AVX1-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
1242; AVX1-NEXT:    vmovq %xmm0, (%rdi)
1243; AVX1-NEXT:    vzeroupper
1244; AVX1-NEXT:    retq
1245;
1246; AVX2-LABEL: trunc_usat_v4i64_v4i16_store:
1247; AVX2:       # %bb.0:
1248; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [65535,65535,65535,65535]
1249; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1250; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm2
1251; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343]
1252; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm3, %ymm2
1253; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1254; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
1255; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1256; AVX2-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
1257; AVX2-NEXT:    vmovq %xmm0, (%rdi)
1258; AVX2-NEXT:    vzeroupper
1259; AVX2-NEXT:    retq
1260;
1261; AVX512F-LABEL: trunc_usat_v4i64_v4i16_store:
1262; AVX512F:       # %bb.0:
1263; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1264; AVX512F-NEXT:    vpmovusqw %zmm0, %xmm0
1265; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
1266; AVX512F-NEXT:    vzeroupper
1267; AVX512F-NEXT:    retq
1268;
1269; AVX512VL-LABEL: trunc_usat_v4i64_v4i16_store:
1270; AVX512VL:       # %bb.0:
1271; AVX512VL-NEXT:    vpmovusqw %ymm0, (%rdi)
1272; AVX512VL-NEXT:    vzeroupper
1273; AVX512VL-NEXT:    retq
1274;
1275; AVX512BW-LABEL: trunc_usat_v4i64_v4i16_store:
1276; AVX512BW:       # %bb.0:
1277; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1278; AVX512BW-NEXT:    vpmovusqw %zmm0, %xmm0
1279; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
1280; AVX512BW-NEXT:    vzeroupper
1281; AVX512BW-NEXT:    retq
1282;
1283; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i16_store:
1284; AVX512BWVL:       # %bb.0:
1285; AVX512BWVL-NEXT:    vpmovusqw %ymm0, (%rdi)
1286; AVX512BWVL-NEXT:    vzeroupper
1287; AVX512BWVL-NEXT:    retq
1288;
1289; SKX-LABEL: trunc_usat_v4i64_v4i16_store:
1290; SKX:       # %bb.0:
1291; SKX-NEXT:    vpmovusqw %ymm0, (%rdi)
1292; SKX-NEXT:    vzeroupper
1293; SKX-NEXT:    retq
1294  %1 = icmp ult <4 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535>
1295  %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 65535, i64 65535, i64 65535, i64 65535>
1296  %3 = trunc <4 x i64> %2 to <4 x i16>
1297  store <4 x i16> %3, <4 x i16> *%p1
1298  ret void
1299}
1300
1301define <8 x i16> @trunc_usat_v8i64_v8i16(<8 x i64>* %p0) {
1302; SSE2-LABEL: trunc_usat_v8i64_v8i16:
1303; SSE2:       # %bb.0:
1304; SSE2-NEXT:    movdqa (%rdi), %xmm4
1305; SSE2-NEXT:    movdqa 16(%rdi), %xmm9
1306; SSE2-NEXT:    movdqa 32(%rdi), %xmm6
1307; SSE2-NEXT:    movdqa 48(%rdi), %xmm7
1308; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [65535,65535]
1309; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
1310; SSE2-NEXT:    movdqa %xmm6, %xmm2
1311; SSE2-NEXT:    pxor %xmm3, %xmm2
1312; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [9223372039002324991,9223372039002324991]
1313; SSE2-NEXT:    movdqa %xmm10, %xmm5
1314; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
1315; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1316; SSE2-NEXT:    pcmpeqd %xmm10, %xmm2
1317; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1318; SSE2-NEXT:    pand %xmm0, %xmm1
1319; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
1320; SSE2-NEXT:    por %xmm1, %xmm2
1321; SSE2-NEXT:    pand %xmm2, %xmm6
1322; SSE2-NEXT:    pandn %xmm8, %xmm2
1323; SSE2-NEXT:    por %xmm6, %xmm2
1324; SSE2-NEXT:    movdqa %xmm7, %xmm0
1325; SSE2-NEXT:    pxor %xmm3, %xmm0
1326; SSE2-NEXT:    movdqa %xmm10, %xmm1
1327; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1328; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2]
1329; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
1330; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1331; SSE2-NEXT:    pand %xmm5, %xmm0
1332; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
1333; SSE2-NEXT:    por %xmm0, %xmm6
1334; SSE2-NEXT:    pand %xmm6, %xmm7
1335; SSE2-NEXT:    pandn %xmm8, %xmm6
1336; SSE2-NEXT:    por %xmm7, %xmm6
1337; SSE2-NEXT:    movdqa %xmm4, %xmm0
1338; SSE2-NEXT:    pxor %xmm3, %xmm0
1339; SSE2-NEXT:    movdqa %xmm10, %xmm1
1340; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1341; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2]
1342; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
1343; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1344; SSE2-NEXT:    pand %xmm5, %xmm0
1345; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1346; SSE2-NEXT:    por %xmm0, %xmm1
1347; SSE2-NEXT:    pand %xmm1, %xmm4
1348; SSE2-NEXT:    pandn %xmm8, %xmm1
1349; SSE2-NEXT:    por %xmm4, %xmm1
1350; SSE2-NEXT:    pxor %xmm9, %xmm3
1351; SSE2-NEXT:    movdqa %xmm10, %xmm0
1352; SSE2-NEXT:    pcmpgtd %xmm3, %xmm0
1353; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1354; SSE2-NEXT:    pcmpeqd %xmm10, %xmm3
1355; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1356; SSE2-NEXT:    pand %xmm4, %xmm3
1357; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1358; SSE2-NEXT:    por %xmm3, %xmm0
1359; SSE2-NEXT:    pand %xmm0, %xmm9
1360; SSE2-NEXT:    pandn %xmm8, %xmm0
1361; SSE2-NEXT:    por %xmm9, %xmm0
1362; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1363; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1364; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
1365; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1366; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1367; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,2,2,3]
1368; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm0[0,1,0,2,4,5,6,7]
1369; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
1370; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
1371; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1372; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1373; SSE2-NEXT:    retq
1374;
1375; SSSE3-LABEL: trunc_usat_v8i64_v8i16:
1376; SSSE3:       # %bb.0:
1377; SSSE3-NEXT:    movdqa (%rdi), %xmm4
1378; SSSE3-NEXT:    movdqa 16(%rdi), %xmm9
1379; SSSE3-NEXT:    movdqa 32(%rdi), %xmm6
1380; SSSE3-NEXT:    movdqa 48(%rdi), %xmm7
1381; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [65535,65535]
1382; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
1383; SSSE3-NEXT:    movdqa %xmm6, %xmm2
1384; SSSE3-NEXT:    pxor %xmm3, %xmm2
1385; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [9223372039002324991,9223372039002324991]
1386; SSSE3-NEXT:    movdqa %xmm10, %xmm5
1387; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
1388; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1389; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm2
1390; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1391; SSSE3-NEXT:    pand %xmm0, %xmm1
1392; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
1393; SSSE3-NEXT:    por %xmm1, %xmm2
1394; SSSE3-NEXT:    pand %xmm2, %xmm6
1395; SSSE3-NEXT:    pandn %xmm8, %xmm2
1396; SSSE3-NEXT:    por %xmm6, %xmm2
1397; SSSE3-NEXT:    movdqa %xmm7, %xmm0
1398; SSSE3-NEXT:    pxor %xmm3, %xmm0
1399; SSSE3-NEXT:    movdqa %xmm10, %xmm1
1400; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
1401; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2]
1402; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm0
1403; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1404; SSSE3-NEXT:    pand %xmm5, %xmm0
1405; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
1406; SSSE3-NEXT:    por %xmm0, %xmm6
1407; SSSE3-NEXT:    pand %xmm6, %xmm7
1408; SSSE3-NEXT:    pandn %xmm8, %xmm6
1409; SSSE3-NEXT:    por %xmm7, %xmm6
1410; SSSE3-NEXT:    movdqa %xmm4, %xmm0
1411; SSSE3-NEXT:    pxor %xmm3, %xmm0
1412; SSSE3-NEXT:    movdqa %xmm10, %xmm1
1413; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
1414; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2]
1415; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm0
1416; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1417; SSSE3-NEXT:    pand %xmm5, %xmm0
1418; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1419; SSSE3-NEXT:    por %xmm0, %xmm1
1420; SSSE3-NEXT:    pand %xmm1, %xmm4
1421; SSSE3-NEXT:    pandn %xmm8, %xmm1
1422; SSSE3-NEXT:    por %xmm4, %xmm1
1423; SSSE3-NEXT:    pxor %xmm9, %xmm3
1424; SSSE3-NEXT:    movdqa %xmm10, %xmm0
1425; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm0
1426; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1427; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm3
1428; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1429; SSSE3-NEXT:    pand %xmm4, %xmm3
1430; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1431; SSSE3-NEXT:    por %xmm3, %xmm0
1432; SSSE3-NEXT:    pand %xmm0, %xmm9
1433; SSSE3-NEXT:    pandn %xmm8, %xmm0
1434; SSSE3-NEXT:    por %xmm9, %xmm0
1435; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1436; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1437; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
1438; SSSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1439; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1440; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,2,2,3]
1441; SSSE3-NEXT:    pshuflw {{.*#+}} xmm3 = xmm0[0,1,0,2,4,5,6,7]
1442; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
1443; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
1444; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1445; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1446; SSSE3-NEXT:    retq
1447;
1448; SSE41-LABEL: trunc_usat_v8i64_v8i16:
1449; SSE41:       # %bb.0:
1450; SSE41-NEXT:    movdqa (%rdi), %xmm7
1451; SSE41-NEXT:    movdqa 16(%rdi), %xmm1
1452; SSE41-NEXT:    movdqa 32(%rdi), %xmm8
1453; SSE41-NEXT:    movdqa 48(%rdi), %xmm9
1454; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [65535,65535]
1455; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
1456; SSE41-NEXT:    movdqa %xmm1, %xmm0
1457; SSE41-NEXT:    pxor %xmm5, %xmm0
1458; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002324991,9223372039002324991]
1459; SSE41-NEXT:    movdqa %xmm3, %xmm6
1460; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
1461; SSE41-NEXT:    movdqa %xmm3, %xmm4
1462; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
1463; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
1464; SSE41-NEXT:    pand %xmm6, %xmm0
1465; SSE41-NEXT:    por %xmm4, %xmm0
1466; SSE41-NEXT:    movapd %xmm2, %xmm4
1467; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
1468; SSE41-NEXT:    movdqa %xmm7, %xmm0
1469; SSE41-NEXT:    pxor %xmm5, %xmm0
1470; SSE41-NEXT:    movdqa %xmm3, %xmm1
1471; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
1472; SSE41-NEXT:    movdqa %xmm3, %xmm6
1473; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
1474; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1475; SSE41-NEXT:    pand %xmm1, %xmm0
1476; SSE41-NEXT:    por %xmm6, %xmm0
1477; SSE41-NEXT:    movapd %xmm2, %xmm1
1478; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
1479; SSE41-NEXT:    packusdw %xmm4, %xmm1
1480; SSE41-NEXT:    movdqa %xmm9, %xmm0
1481; SSE41-NEXT:    pxor %xmm5, %xmm0
1482; SSE41-NEXT:    movdqa %xmm3, %xmm4
1483; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
1484; SSE41-NEXT:    movdqa %xmm3, %xmm6
1485; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
1486; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1487; SSE41-NEXT:    pand %xmm4, %xmm0
1488; SSE41-NEXT:    por %xmm6, %xmm0
1489; SSE41-NEXT:    movapd %xmm2, %xmm4
1490; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm4
1491; SSE41-NEXT:    pxor %xmm8, %xmm5
1492; SSE41-NEXT:    movdqa %xmm3, %xmm6
1493; SSE41-NEXT:    pcmpeqd %xmm5, %xmm6
1494; SSE41-NEXT:    pcmpgtd %xmm5, %xmm3
1495; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1496; SSE41-NEXT:    pand %xmm6, %xmm0
1497; SSE41-NEXT:    por %xmm3, %xmm0
1498; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm2
1499; SSE41-NEXT:    packusdw %xmm4, %xmm2
1500; SSE41-NEXT:    packusdw %xmm2, %xmm1
1501; SSE41-NEXT:    movdqa %xmm1, %xmm0
1502; SSE41-NEXT:    retq
1503;
1504; AVX1-LABEL: trunc_usat_v8i64_v8i16:
1505; AVX1:       # %bb.0:
1506; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
1507; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
1508; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm2
1509; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm3
1510; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
1511; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm5
1512; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [9223372036854841343,9223372036854841343]
1513; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm8
1514; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm7
1515; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm7
1516; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm5
1517; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
1518; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm4
1519; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
1520; AVX1-NEXT:    vmovapd {{.*#+}} xmm6 = [65535,65535]
1521; AVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm6, %xmm3
1522; AVX1-NEXT:    vblendvpd %xmm5, %xmm2, %xmm6, %xmm2
1523; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
1524; AVX1-NEXT:    vblendvpd %xmm7, %xmm1, %xmm6, %xmm1
1525; AVX1-NEXT:    vblendvpd %xmm8, %xmm0, %xmm6, %xmm0
1526; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1527; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
1528; AVX1-NEXT:    retq
1529;
1530; AVX2-LABEL: trunc_usat_v8i64_v8i16:
1531; AVX2:       # %bb.0:
1532; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
1533; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
1534; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [65535,65535,65535,65535]
1535; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1536; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm4
1537; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343]
1538; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
1539; AVX2-NEXT:    vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
1540; AVX2-NEXT:    vpxor %ymm3, %ymm0, %ymm3
1541; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm5, %ymm3
1542; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1543; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
1544; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1545; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1546; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1547; AVX2-NEXT:    vzeroupper
1548; AVX2-NEXT:    retq
1549;
1550; AVX512-LABEL: trunc_usat_v8i64_v8i16:
1551; AVX512:       # %bb.0:
1552; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
1553; AVX512-NEXT:    vpmovusqw %zmm0, %xmm0
1554; AVX512-NEXT:    vzeroupper
1555; AVX512-NEXT:    retq
1556;
1557; SKX-LABEL: trunc_usat_v8i64_v8i16:
1558; SKX:       # %bb.0:
1559; SKX-NEXT:    vmovdqa64 (%rdi), %zmm0
1560; SKX-NEXT:    vpmovusqw %zmm0, %xmm0
1561; SKX-NEXT:    vzeroupper
1562; SKX-NEXT:    retq
1563  %a0 = load <8 x i64>, <8 x i64>* %p0
1564  %1 = icmp ult <8 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
1565  %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
1566  %3 = trunc <8 x i64> %2 to <8 x i16>
1567  ret <8 x i16> %3
1568}
1569
1570define <4 x i16> @trunc_usat_v4i32_v4i16(<4 x i32> %a0) {
1571; SSE2-LABEL: trunc_usat_v4i32_v4i16:
1572; SSE2:       # %bb.0:
1573; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
1574; SSE2-NEXT:    pxor %xmm0, %xmm1
1575; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147549183,2147549183,2147549183,2147549183]
1576; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1577; SSE2-NEXT:    pand %xmm2, %xmm0
1578; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
1579; SSE2-NEXT:    por %xmm0, %xmm2
1580; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm2[0,2,2,3,4,5,6,7]
1581; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
1582; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1583; SSE2-NEXT:    retq
1584;
1585; SSSE3-LABEL: trunc_usat_v4i32_v4i16:
1586; SSSE3:       # %bb.0:
1587; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
1588; SSSE3-NEXT:    pxor %xmm0, %xmm1
1589; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147549183,2147549183,2147549183,2147549183]
1590; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
1591; SSSE3-NEXT:    pand %xmm2, %xmm0
1592; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
1593; SSSE3-NEXT:    por %xmm2, %xmm0
1594; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1595; SSSE3-NEXT:    retq
1596;
1597; SSE41-LABEL: trunc_usat_v4i32_v4i16:
1598; SSE41:       # %bb.0:
1599; SSE41-NEXT:    pminud {{.*}}(%rip), %xmm0
1600; SSE41-NEXT:    packusdw %xmm0, %xmm0
1601; SSE41-NEXT:    retq
1602;
1603; AVX1-LABEL: trunc_usat_v4i32_v4i16:
1604; AVX1:       # %bb.0:
1605; AVX1-NEXT:    vpminud {{.*}}(%rip), %xmm0, %xmm0
1606; AVX1-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
1607; AVX1-NEXT:    retq
1608;
1609; AVX2-LABEL: trunc_usat_v4i32_v4i16:
1610; AVX2:       # %bb.0:
1611; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [65535,65535,65535,65535]
1612; AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1613; AVX2-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
1614; AVX2-NEXT:    retq
1615;
1616; AVX512F-LABEL: trunc_usat_v4i32_v4i16:
1617; AVX512F:       # %bb.0:
1618; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1619; AVX512F-NEXT:    vpmovusdw %zmm0, %ymm0
1620; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1621; AVX512F-NEXT:    vzeroupper
1622; AVX512F-NEXT:    retq
1623;
1624; AVX512VL-LABEL: trunc_usat_v4i32_v4i16:
1625; AVX512VL:       # %bb.0:
1626; AVX512VL-NEXT:    vpmovusdw %xmm0, %xmm0
1627; AVX512VL-NEXT:    retq
1628;
1629; AVX512BW-LABEL: trunc_usat_v4i32_v4i16:
1630; AVX512BW:       # %bb.0:
1631; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1632; AVX512BW-NEXT:    vpmovusdw %zmm0, %ymm0
1633; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1634; AVX512BW-NEXT:    vzeroupper
1635; AVX512BW-NEXT:    retq
1636;
1637; AVX512BWVL-LABEL: trunc_usat_v4i32_v4i16:
1638; AVX512BWVL:       # %bb.0:
1639; AVX512BWVL-NEXT:    vpmovusdw %xmm0, %xmm0
1640; AVX512BWVL-NEXT:    retq
1641;
1642; SKX-LABEL: trunc_usat_v4i32_v4i16:
1643; SKX:       # %bb.0:
1644; SKX-NEXT:    vpmovusdw %xmm0, %xmm0
1645; SKX-NEXT:    retq
1646  %1 = icmp ult <4 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535>
1647  %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
1648  %3 = trunc <4 x i32> %2 to <4 x i16>
1649  ret <4 x i16> %3
1650}
1651
1652define void @trunc_usat_v4i32_v4i16_store(<4 x i32> %a0, <4 x i16> *%p1) {
1653; SSE2-LABEL: trunc_usat_v4i32_v4i16_store:
1654; SSE2:       # %bb.0:
1655; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
1656; SSE2-NEXT:    pxor %xmm0, %xmm1
1657; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147549183,2147549183,2147549183,2147549183]
1658; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1659; SSE2-NEXT:    pand %xmm2, %xmm0
1660; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
1661; SSE2-NEXT:    por %xmm0, %xmm2
1662; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm2[0,2,2,3,4,5,6,7]
1663; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
1664; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1665; SSE2-NEXT:    movq %xmm0, (%rdi)
1666; SSE2-NEXT:    retq
1667;
1668; SSSE3-LABEL: trunc_usat_v4i32_v4i16_store:
1669; SSSE3:       # %bb.0:
1670; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
1671; SSSE3-NEXT:    pxor %xmm0, %xmm1
1672; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147549183,2147549183,2147549183,2147549183]
1673; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
1674; SSSE3-NEXT:    pand %xmm2, %xmm0
1675; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
1676; SSSE3-NEXT:    por %xmm0, %xmm2
1677; SSSE3-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1678; SSSE3-NEXT:    movq %xmm2, (%rdi)
1679; SSSE3-NEXT:    retq
1680;
1681; SSE41-LABEL: trunc_usat_v4i32_v4i16_store:
1682; SSE41:       # %bb.0:
1683; SSE41-NEXT:    pminud {{.*}}(%rip), %xmm0
1684; SSE41-NEXT:    packusdw %xmm0, %xmm0
1685; SSE41-NEXT:    movq %xmm0, (%rdi)
1686; SSE41-NEXT:    retq
1687;
1688; AVX1-LABEL: trunc_usat_v4i32_v4i16_store:
1689; AVX1:       # %bb.0:
1690; AVX1-NEXT:    vpminud {{.*}}(%rip), %xmm0, %xmm0
1691; AVX1-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
1692; AVX1-NEXT:    vmovq %xmm0, (%rdi)
1693; AVX1-NEXT:    retq
1694;
1695; AVX2-LABEL: trunc_usat_v4i32_v4i16_store:
1696; AVX2:       # %bb.0:
1697; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [65535,65535,65535,65535]
1698; AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1699; AVX2-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
1700; AVX2-NEXT:    vmovq %xmm0, (%rdi)
1701; AVX2-NEXT:    retq
1702;
1703; AVX512F-LABEL: trunc_usat_v4i32_v4i16_store:
1704; AVX512F:       # %bb.0:
1705; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1706; AVX512F-NEXT:    vpmovusdw %zmm0, %ymm0
1707; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
1708; AVX512F-NEXT:    vzeroupper
1709; AVX512F-NEXT:    retq
1710;
1711; AVX512VL-LABEL: trunc_usat_v4i32_v4i16_store:
1712; AVX512VL:       # %bb.0:
1713; AVX512VL-NEXT:    vpmovusdw %xmm0, (%rdi)
1714; AVX512VL-NEXT:    retq
1715;
1716; AVX512BW-LABEL: trunc_usat_v4i32_v4i16_store:
1717; AVX512BW:       # %bb.0:
1718; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1719; AVX512BW-NEXT:    vpmovusdw %zmm0, %ymm0
1720; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
1721; AVX512BW-NEXT:    vzeroupper
1722; AVX512BW-NEXT:    retq
1723;
1724; AVX512BWVL-LABEL: trunc_usat_v4i32_v4i16_store:
1725; AVX512BWVL:       # %bb.0:
1726; AVX512BWVL-NEXT:    vpmovusdw %xmm0, (%rdi)
1727; AVX512BWVL-NEXT:    retq
1728;
1729; SKX-LABEL: trunc_usat_v4i32_v4i16_store:
1730; SKX:       # %bb.0:
1731; SKX-NEXT:    vpmovusdw %xmm0, (%rdi)
1732; SKX-NEXT:    retq
1733  %1 = icmp ult <4 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535>
1734  %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
1735  %3 = trunc <4 x i32> %2 to <4 x i16>
1736  store <4 x i16> %3, <4 x i16> *%p1
1737  ret void
1738}
1739
1740define <8 x i16> @trunc_usat_v8i32_v8i16(<8 x i32> %a0) {
1741; SSE2-LABEL: trunc_usat_v8i32_v8i16:
1742; SSE2:       # %bb.0:
1743; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
1744; SSE2-NEXT:    movdqa %xmm0, %xmm3
1745; SSE2-NEXT:    pxor %xmm2, %xmm3
1746; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147549183,2147549183,2147549183,2147549183]
1747; SSE2-NEXT:    movdqa %xmm4, %xmm5
1748; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
1749; SSE2-NEXT:    pcmpeqd %xmm3, %xmm3
1750; SSE2-NEXT:    pand %xmm5, %xmm0
1751; SSE2-NEXT:    pxor %xmm3, %xmm5
1752; SSE2-NEXT:    por %xmm5, %xmm0
1753; SSE2-NEXT:    pxor %xmm1, %xmm2
1754; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
1755; SSE2-NEXT:    pxor %xmm4, %xmm3
1756; SSE2-NEXT:    pand %xmm1, %xmm4
1757; SSE2-NEXT:    por %xmm3, %xmm4
1758; SSE2-NEXT:    pslld $16, %xmm4
1759; SSE2-NEXT:    psrad $16, %xmm4
1760; SSE2-NEXT:    pslld $16, %xmm0
1761; SSE2-NEXT:    psrad $16, %xmm0
1762; SSE2-NEXT:    packssdw %xmm4, %xmm0
1763; SSE2-NEXT:    retq
1764;
1765; SSSE3-LABEL: trunc_usat_v8i32_v8i16:
1766; SSSE3:       # %bb.0:
1767; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
1768; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
1769; SSSE3-NEXT:    movdqa %xmm0, %xmm4
1770; SSSE3-NEXT:    pxor %xmm3, %xmm4
1771; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
1772; SSSE3-NEXT:    movdqa %xmm5, %xmm6
1773; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
1774; SSSE3-NEXT:    pand %xmm6, %xmm0
1775; SSSE3-NEXT:    pandn %xmm2, %xmm6
1776; SSSE3-NEXT:    por %xmm6, %xmm0
1777; SSSE3-NEXT:    pxor %xmm1, %xmm3
1778; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
1779; SSSE3-NEXT:    pand %xmm5, %xmm1
1780; SSSE3-NEXT:    pandn %xmm2, %xmm5
1781; SSSE3-NEXT:    por %xmm1, %xmm5
1782; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1783; SSSE3-NEXT:    pshufb %xmm1, %xmm5
1784; SSSE3-NEXT:    pshufb %xmm1, %xmm0
1785; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0]
1786; SSSE3-NEXT:    retq
1787;
1788; SSE41-LABEL: trunc_usat_v8i32_v8i16:
1789; SSE41:       # %bb.0:
1790; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
1791; SSE41-NEXT:    pminud %xmm2, %xmm1
1792; SSE41-NEXT:    pminud %xmm2, %xmm0
1793; SSE41-NEXT:    packusdw %xmm1, %xmm0
1794; SSE41-NEXT:    retq
1795;
1796; AVX1-LABEL: trunc_usat_v8i32_v8i16:
1797; AVX1:       # %bb.0:
1798; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1799; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
1800; AVX1-NEXT:    vpminud %xmm2, %xmm1, %xmm1
1801; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
1802; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1803; AVX1-NEXT:    vzeroupper
1804; AVX1-NEXT:    retq
1805;
1806; AVX2-LABEL: trunc_usat_v8i32_v8i16:
1807; AVX2:       # %bb.0:
1808; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535]
1809; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1810; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1811; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1812; AVX2-NEXT:    vzeroupper
1813; AVX2-NEXT:    retq
1814;
1815; AVX512F-LABEL: trunc_usat_v8i32_v8i16:
1816; AVX512F:       # %bb.0:
1817; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1818; AVX512F-NEXT:    vpmovusdw %zmm0, %ymm0
1819; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1820; AVX512F-NEXT:    vzeroupper
1821; AVX512F-NEXT:    retq
1822;
1823; AVX512VL-LABEL: trunc_usat_v8i32_v8i16:
1824; AVX512VL:       # %bb.0:
1825; AVX512VL-NEXT:    vpmovusdw %ymm0, %xmm0
1826; AVX512VL-NEXT:    vzeroupper
1827; AVX512VL-NEXT:    retq
1828;
1829; AVX512BW-LABEL: trunc_usat_v8i32_v8i16:
1830; AVX512BW:       # %bb.0:
1831; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1832; AVX512BW-NEXT:    vpmovusdw %zmm0, %ymm0
1833; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1834; AVX512BW-NEXT:    vzeroupper
1835; AVX512BW-NEXT:    retq
1836;
1837; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i16:
1838; AVX512BWVL:       # %bb.0:
1839; AVX512BWVL-NEXT:    vpmovusdw %ymm0, %xmm0
1840; AVX512BWVL-NEXT:    vzeroupper
1841; AVX512BWVL-NEXT:    retq
1842;
1843; SKX-LABEL: trunc_usat_v8i32_v8i16:
1844; SKX:       # %bb.0:
1845; SKX-NEXT:    vpmovusdw %ymm0, %xmm0
1846; SKX-NEXT:    vzeroupper
1847; SKX-NEXT:    retq
1848  %1 = icmp ult <8 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
1849  %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
1850  %3 = trunc <8 x i32> %2 to <8 x i16>
1851  ret <8 x i16> %3
1852}
1853
1854define <16 x i16> @trunc_usat_v16i32_v16i16(<16 x i32>* %p0) {
1855; SSE2-LABEL: trunc_usat_v16i32_v16i16:
1856; SSE2:       # %bb.0:
1857; SSE2-NEXT:    movdqa (%rdi), %xmm5
1858; SSE2-NEXT:    movdqa 16(%rdi), %xmm8
1859; SSE2-NEXT:    movdqa 32(%rdi), %xmm0
1860; SSE2-NEXT:    movdqa 48(%rdi), %xmm4
1861; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
1862; SSE2-NEXT:    movdqa %xmm0, %xmm3
1863; SSE2-NEXT:    pxor %xmm6, %xmm3
1864; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147549183,2147549183,2147549183,2147549183]
1865; SSE2-NEXT:    movdqa %xmm2, %xmm1
1866; SSE2-NEXT:    pcmpgtd %xmm3, %xmm1
1867; SSE2-NEXT:    pcmpeqd %xmm7, %xmm7
1868; SSE2-NEXT:    pand %xmm1, %xmm0
1869; SSE2-NEXT:    pxor %xmm7, %xmm1
1870; SSE2-NEXT:    por %xmm0, %xmm1
1871; SSE2-NEXT:    movdqa %xmm4, %xmm0
1872; SSE2-NEXT:    pxor %xmm6, %xmm0
1873; SSE2-NEXT:    movdqa %xmm2, %xmm3
1874; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1875; SSE2-NEXT:    pand %xmm3, %xmm4
1876; SSE2-NEXT:    pxor %xmm7, %xmm3
1877; SSE2-NEXT:    por %xmm4, %xmm3
1878; SSE2-NEXT:    movdqa %xmm5, %xmm4
1879; SSE2-NEXT:    pxor %xmm6, %xmm4
1880; SSE2-NEXT:    movdqa %xmm2, %xmm0
1881; SSE2-NEXT:    pcmpgtd %xmm4, %xmm0
1882; SSE2-NEXT:    pand %xmm0, %xmm5
1883; SSE2-NEXT:    pxor %xmm7, %xmm0
1884; SSE2-NEXT:    por %xmm5, %xmm0
1885; SSE2-NEXT:    pxor %xmm8, %xmm6
1886; SSE2-NEXT:    pcmpgtd %xmm6, %xmm2
1887; SSE2-NEXT:    pxor %xmm2, %xmm7
1888; SSE2-NEXT:    pand %xmm8, %xmm2
1889; SSE2-NEXT:    por %xmm7, %xmm2
1890; SSE2-NEXT:    pslld $16, %xmm2
1891; SSE2-NEXT:    psrad $16, %xmm2
1892; SSE2-NEXT:    pslld $16, %xmm0
1893; SSE2-NEXT:    psrad $16, %xmm0
1894; SSE2-NEXT:    packssdw %xmm2, %xmm0
1895; SSE2-NEXT:    pslld $16, %xmm3
1896; SSE2-NEXT:    psrad $16, %xmm3
1897; SSE2-NEXT:    pslld $16, %xmm1
1898; SSE2-NEXT:    psrad $16, %xmm1
1899; SSE2-NEXT:    packssdw %xmm3, %xmm1
1900; SSE2-NEXT:    retq
1901;
1902; SSSE3-LABEL: trunc_usat_v16i32_v16i16:
1903; SSSE3:       # %bb.0:
1904; SSSE3-NEXT:    movdqa (%rdi), %xmm5
1905; SSSE3-NEXT:    movdqa 16(%rdi), %xmm8
1906; SSSE3-NEXT:    movdqa 32(%rdi), %xmm0
1907; SSSE3-NEXT:    movdqa 48(%rdi), %xmm4
1908; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
1909; SSSE3-NEXT:    movdqa %xmm0, %xmm3
1910; SSSE3-NEXT:    pxor %xmm6, %xmm3
1911; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147549183,2147549183,2147549183,2147549183]
1912; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1913; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm1
1914; SSSE3-NEXT:    pcmpeqd %xmm7, %xmm7
1915; SSSE3-NEXT:    pand %xmm1, %xmm0
1916; SSSE3-NEXT:    pxor %xmm7, %xmm1
1917; SSSE3-NEXT:    por %xmm0, %xmm1
1918; SSSE3-NEXT:    movdqa %xmm4, %xmm0
1919; SSSE3-NEXT:    pxor %xmm6, %xmm0
1920; SSSE3-NEXT:    movdqa %xmm2, %xmm3
1921; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm3
1922; SSSE3-NEXT:    pand %xmm3, %xmm4
1923; SSSE3-NEXT:    pxor %xmm7, %xmm3
1924; SSSE3-NEXT:    por %xmm4, %xmm3
1925; SSSE3-NEXT:    movdqa %xmm5, %xmm4
1926; SSSE3-NEXT:    pxor %xmm6, %xmm4
1927; SSSE3-NEXT:    movdqa %xmm2, %xmm0
1928; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm0
1929; SSSE3-NEXT:    pand %xmm0, %xmm5
1930; SSSE3-NEXT:    pxor %xmm7, %xmm0
1931; SSSE3-NEXT:    por %xmm5, %xmm0
1932; SSSE3-NEXT:    pxor %xmm8, %xmm6
1933; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm2
1934; SSSE3-NEXT:    pxor %xmm2, %xmm7
1935; SSSE3-NEXT:    pand %xmm8, %xmm2
1936; SSSE3-NEXT:    por %xmm7, %xmm2
1937; SSSE3-NEXT:    pslld $16, %xmm2
1938; SSSE3-NEXT:    psrad $16, %xmm2
1939; SSSE3-NEXT:    pslld $16, %xmm0
1940; SSSE3-NEXT:    psrad $16, %xmm0
1941; SSSE3-NEXT:    packssdw %xmm2, %xmm0
1942; SSSE3-NEXT:    pslld $16, %xmm3
1943; SSSE3-NEXT:    psrad $16, %xmm3
1944; SSSE3-NEXT:    pslld $16, %xmm1
1945; SSSE3-NEXT:    psrad $16, %xmm1
1946; SSSE3-NEXT:    packssdw %xmm3, %xmm1
1947; SSSE3-NEXT:    retq
1948;
1949; SSE41-LABEL: trunc_usat_v16i32_v16i16:
1950; SSE41:       # %bb.0:
1951; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [65535,65535,65535,65535]
1952; SSE41-NEXT:    movdqa 48(%rdi), %xmm2
1953; SSE41-NEXT:    pminud %xmm0, %xmm2
1954; SSE41-NEXT:    movdqa 32(%rdi), %xmm1
1955; SSE41-NEXT:    pminud %xmm0, %xmm1
1956; SSE41-NEXT:    packusdw %xmm2, %xmm1
1957; SSE41-NEXT:    movdqa 16(%rdi), %xmm2
1958; SSE41-NEXT:    pminud %xmm0, %xmm2
1959; SSE41-NEXT:    pminud (%rdi), %xmm0
1960; SSE41-NEXT:    packusdw %xmm2, %xmm0
1961; SSE41-NEXT:    retq
1962;
1963; AVX1-LABEL: trunc_usat_v16i32_v16i16:
1964; AVX1:       # %bb.0:
1965; AVX1-NEXT:    vmovdqa {{.*#+}} xmm0 = [65535,65535,65535,65535]
1966; AVX1-NEXT:    vpminud 16(%rdi), %xmm0, %xmm1
1967; AVX1-NEXT:    vpminud (%rdi), %xmm0, %xmm2
1968; AVX1-NEXT:    vpackusdw %xmm1, %xmm2, %xmm1
1969; AVX1-NEXT:    vpminud 48(%rdi), %xmm0, %xmm2
1970; AVX1-NEXT:    vpminud 32(%rdi), %xmm0, %xmm0
1971; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
1972; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1973; AVX1-NEXT:    retq
1974;
1975; AVX2-LABEL: trunc_usat_v16i32_v16i16:
1976; AVX2:       # %bb.0:
1977; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm0 = [65535,65535,65535,65535,65535,65535,65535,65535]
1978; AVX2-NEXT:    vpminud 32(%rdi), %ymm0, %ymm1
1979; AVX2-NEXT:    vpminud (%rdi), %ymm0, %ymm0
1980; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
1981; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1982; AVX2-NEXT:    retq
1983;
1984; AVX512-LABEL: trunc_usat_v16i32_v16i16:
1985; AVX512:       # %bb.0:
1986; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
1987; AVX512-NEXT:    vpmovusdw %zmm0, %ymm0
1988; AVX512-NEXT:    retq
1989;
1990; SKX-LABEL: trunc_usat_v16i32_v16i16:
1991; SKX:       # %bb.0:
1992; SKX-NEXT:    vmovdqa64 (%rdi), %zmm0
1993; SKX-NEXT:    vpmovusdw %zmm0, %ymm0
1994; SKX-NEXT:    retq
1995  %a0 = load <16 x i32>, <16 x i32>* %p0
1996  %1 = icmp ult <16 x i32> %a0, <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>
1997  %2 = select <16 x i1> %1, <16 x i32> %a0, <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>
1998  %3 = trunc <16 x i32> %2 to <16 x i16>
1999  ret <16 x i16> %3
2000}
2001
2002;
2003; Unsigned saturation truncation to vXi8
2004;
2005
2006define <2 x i8> @trunc_usat_v2i64_v2i8(<2 x i64> %a0) {
2007; SSE2-LABEL: trunc_usat_v2i64_v2i8:
2008; SSE2:       # %bb.0:
2009; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
2010; SSE2-NEXT:    pxor %xmm0, %xmm1
2011; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259711,9223372039002259711]
2012; SSE2-NEXT:    movdqa %xmm2, %xmm3
2013; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
2014; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2015; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
2016; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
2017; SSE2-NEXT:    pand %xmm4, %xmm2
2018; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
2019; SSE2-NEXT:    por %xmm2, %xmm1
2020; SSE2-NEXT:    pand %xmm1, %xmm0
2021; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm1
2022; SSE2-NEXT:    por %xmm0, %xmm1
2023; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
2024; SSE2-NEXT:    packuswb %xmm1, %xmm1
2025; SSE2-NEXT:    packuswb %xmm1, %xmm1
2026; SSE2-NEXT:    packuswb %xmm1, %xmm1
2027; SSE2-NEXT:    movdqa %xmm1, %xmm0
2028; SSE2-NEXT:    retq
2029;
2030; SSSE3-LABEL: trunc_usat_v2i64_v2i8:
2031; SSSE3:       # %bb.0:
2032; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
2033; SSSE3-NEXT:    pxor %xmm0, %xmm1
2034; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259711,9223372039002259711]
2035; SSSE3-NEXT:    movdqa %xmm2, %xmm3
2036; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
2037; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2038; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm1
2039; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2040; SSSE3-NEXT:    pand %xmm4, %xmm1
2041; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
2042; SSSE3-NEXT:    por %xmm1, %xmm2
2043; SSSE3-NEXT:    pand %xmm2, %xmm0
2044; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
2045; SSSE3-NEXT:    por %xmm2, %xmm0
2046; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2047; SSSE3-NEXT:    retq
2048;
2049; SSE41-LABEL: trunc_usat_v2i64_v2i8:
2050; SSE41:       # %bb.0:
2051; SSE41-NEXT:    movdqa %xmm0, %xmm1
2052; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [255,255]
2053; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
2054; SSE41-NEXT:    pxor %xmm1, %xmm0
2055; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259711,9223372039002259711]
2056; SSE41-NEXT:    movdqa %xmm3, %xmm4
2057; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
2058; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
2059; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2060; SSE41-NEXT:    pand %xmm4, %xmm0
2061; SSE41-NEXT:    por %xmm3, %xmm0
2062; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
2063; SSE41-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2064; SSE41-NEXT:    movdqa %xmm2, %xmm0
2065; SSE41-NEXT:    retq
2066;
2067; AVX-LABEL: trunc_usat_v2i64_v2i8:
2068; AVX:       # %bb.0:
2069; AVX-NEXT:    vmovapd {{.*#+}} xmm1 = [255,255]
2070; AVX-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm2
2071; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854776063,9223372036854776063]
2072; AVX-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
2073; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2074; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2075; AVX-NEXT:    retq
2076;
2077; AVX512F-LABEL: trunc_usat_v2i64_v2i8:
2078; AVX512F:       # %bb.0:
2079; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2080; AVX512F-NEXT:    vpmovusqb %zmm0, %xmm0
2081; AVX512F-NEXT:    vzeroupper
2082; AVX512F-NEXT:    retq
2083;
2084; AVX512VL-LABEL: trunc_usat_v2i64_v2i8:
2085; AVX512VL:       # %bb.0:
2086; AVX512VL-NEXT:    vpmovusqb %xmm0, %xmm0
2087; AVX512VL-NEXT:    retq
2088;
2089; AVX512BW-LABEL: trunc_usat_v2i64_v2i8:
2090; AVX512BW:       # %bb.0:
2091; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2092; AVX512BW-NEXT:    vpmovusqb %zmm0, %xmm0
2093; AVX512BW-NEXT:    vzeroupper
2094; AVX512BW-NEXT:    retq
2095;
2096; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i8:
2097; AVX512BWVL:       # %bb.0:
2098; AVX512BWVL-NEXT:    vpmovusqb %xmm0, %xmm0
2099; AVX512BWVL-NEXT:    retq
2100;
2101; SKX-LABEL: trunc_usat_v2i64_v2i8:
2102; SKX:       # %bb.0:
2103; SKX-NEXT:    vpmovusqb %xmm0, %xmm0
2104; SKX-NEXT:    retq
2105  %1 = icmp ult <2 x i64> %a0, <i64 255, i64 255>
2106  %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 255, i64 255>
2107  %3 = trunc <2 x i64> %2 to <2 x i8>
2108  ret <2 x i8> %3
2109}
2110
2111define void @trunc_usat_v2i64_v2i8_store(<2 x i64> %a0, <2 x i8>* %p1) {
2112; SSE2-LABEL: trunc_usat_v2i64_v2i8_store:
2113; SSE2:       # %bb.0:
2114; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
2115; SSE2-NEXT:    pxor %xmm0, %xmm1
2116; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259711,9223372039002259711]
2117; SSE2-NEXT:    movdqa %xmm2, %xmm3
2118; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
2119; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2120; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
2121; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2122; SSE2-NEXT:    pand %xmm4, %xmm1
2123; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
2124; SSE2-NEXT:    por %xmm1, %xmm2
2125; SSE2-NEXT:    pand %xmm2, %xmm0
2126; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
2127; SSE2-NEXT:    por %xmm0, %xmm2
2128; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
2129; SSE2-NEXT:    packuswb %xmm2, %xmm2
2130; SSE2-NEXT:    packuswb %xmm0, %xmm2
2131; SSE2-NEXT:    packuswb %xmm0, %xmm2
2132; SSE2-NEXT:    movd %xmm2, %eax
2133; SSE2-NEXT:    movw %ax, (%rdi)
2134; SSE2-NEXT:    retq
2135;
2136; SSSE3-LABEL: trunc_usat_v2i64_v2i8_store:
2137; SSSE3:       # %bb.0:
2138; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
2139; SSSE3-NEXT:    pxor %xmm0, %xmm1
2140; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259711,9223372039002259711]
2141; SSSE3-NEXT:    movdqa %xmm2, %xmm3
2142; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
2143; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2144; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm1
2145; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2146; SSSE3-NEXT:    pand %xmm4, %xmm1
2147; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
2148; SSSE3-NEXT:    por %xmm1, %xmm2
2149; SSSE3-NEXT:    pand %xmm2, %xmm0
2150; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
2151; SSSE3-NEXT:    por %xmm0, %xmm2
2152; SSSE3-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2153; SSSE3-NEXT:    movd %xmm2, %eax
2154; SSSE3-NEXT:    movw %ax, (%rdi)
2155; SSSE3-NEXT:    retq
2156;
2157; SSE41-LABEL: trunc_usat_v2i64_v2i8_store:
2158; SSE41:       # %bb.0:
2159; SSE41-NEXT:    movdqa %xmm0, %xmm1
2160; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [255,255]
2161; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
2162; SSE41-NEXT:    pxor %xmm1, %xmm0
2163; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259711,9223372039002259711]
2164; SSE41-NEXT:    movdqa %xmm3, %xmm4
2165; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
2166; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
2167; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2168; SSE41-NEXT:    pand %xmm4, %xmm0
2169; SSE41-NEXT:    por %xmm3, %xmm0
2170; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
2171; SSE41-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2172; SSE41-NEXT:    pextrw $0, %xmm2, (%rdi)
2173; SSE41-NEXT:    retq
2174;
2175; AVX-LABEL: trunc_usat_v2i64_v2i8_store:
2176; AVX:       # %bb.0:
2177; AVX-NEXT:    vmovapd {{.*#+}} xmm1 = [255,255]
2178; AVX-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm2
2179; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854776063,9223372036854776063]
2180; AVX-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
2181; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2182; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2183; AVX-NEXT:    vpextrw $0, %xmm0, (%rdi)
2184; AVX-NEXT:    retq
2185;
2186; AVX512F-LABEL: trunc_usat_v2i64_v2i8_store:
2187; AVX512F:       # %bb.0:
2188; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2189; AVX512F-NEXT:    vpmovusqb %zmm0, %xmm0
2190; AVX512F-NEXT:    vpextrw $0, %xmm0, (%rdi)
2191; AVX512F-NEXT:    vzeroupper
2192; AVX512F-NEXT:    retq
2193;
2194; AVX512VL-LABEL: trunc_usat_v2i64_v2i8_store:
2195; AVX512VL:       # %bb.0:
2196; AVX512VL-NEXT:    vpmovusqb %xmm0, (%rdi)
2197; AVX512VL-NEXT:    retq
2198;
2199; AVX512BW-LABEL: trunc_usat_v2i64_v2i8_store:
2200; AVX512BW:       # %bb.0:
2201; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2202; AVX512BW-NEXT:    vpmovusqb %zmm0, %xmm0
2203; AVX512BW-NEXT:    vpextrw $0, %xmm0, (%rdi)
2204; AVX512BW-NEXT:    vzeroupper
2205; AVX512BW-NEXT:    retq
2206;
2207; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i8_store:
2208; AVX512BWVL:       # %bb.0:
2209; AVX512BWVL-NEXT:    vpmovusqb %xmm0, (%rdi)
2210; AVX512BWVL-NEXT:    retq
2211;
2212; SKX-LABEL: trunc_usat_v2i64_v2i8_store:
2213; SKX:       # %bb.0:
2214; SKX-NEXT:    vpmovusqb %xmm0, (%rdi)
2215; SKX-NEXT:    retq
2216  %1 = icmp ult <2 x i64> %a0, <i64 255, i64 255>
2217  %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 255, i64 255>
2218  %3 = trunc <2 x i64> %2 to <2 x i8>
2219  store <2 x i8> %3, <2 x i8>* %p1
2220  ret void
2221}
2222
2223define <4 x i8> @trunc_usat_v4i64_v4i8(<4 x i64> %a0) {
2224; SSE2-LABEL: trunc_usat_v4i64_v4i8:
2225; SSE2:       # %bb.0:
2226; SSE2-NEXT:    movdqa %xmm0, %xmm2
2227; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
2228; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
2229; SSE2-NEXT:    pxor %xmm4, %xmm0
2230; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259711,9223372039002259711]
2231; SSE2-NEXT:    movdqa %xmm5, %xmm6
2232; SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
2233; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2234; SSE2-NEXT:    pcmpeqd %xmm5, %xmm0
2235; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
2236; SSE2-NEXT:    pand %xmm7, %xmm3
2237; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
2238; SSE2-NEXT:    por %xmm3, %xmm0
2239; SSE2-NEXT:    pand %xmm0, %xmm2
2240; SSE2-NEXT:    pandn %xmm8, %xmm0
2241; SSE2-NEXT:    por %xmm2, %xmm0
2242; SSE2-NEXT:    pxor %xmm1, %xmm4
2243; SSE2-NEXT:    movdqa %xmm5, %xmm2
2244; SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
2245; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
2246; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
2247; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2248; SSE2-NEXT:    pand %xmm3, %xmm4
2249; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2250; SSE2-NEXT:    por %xmm4, %xmm2
2251; SSE2-NEXT:    pand %xmm2, %xmm1
2252; SSE2-NEXT:    pandn %xmm8, %xmm2
2253; SSE2-NEXT:    por %xmm1, %xmm2
2254; SSE2-NEXT:    pand %xmm8, %xmm2
2255; SSE2-NEXT:    pand %xmm8, %xmm0
2256; SSE2-NEXT:    packuswb %xmm2, %xmm0
2257; SSE2-NEXT:    packuswb %xmm0, %xmm0
2258; SSE2-NEXT:    packuswb %xmm0, %xmm0
2259; SSE2-NEXT:    retq
2260;
2261; SSSE3-LABEL: trunc_usat_v4i64_v4i8:
2262; SSSE3:       # %bb.0:
2263; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [255,255]
2264; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
2265; SSSE3-NEXT:    movdqa %xmm0, %xmm4
2266; SSSE3-NEXT:    pxor %xmm3, %xmm4
2267; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259711,9223372039002259711]
2268; SSSE3-NEXT:    movdqa %xmm5, %xmm6
2269; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
2270; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2271; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm4
2272; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2273; SSSE3-NEXT:    pand %xmm7, %xmm4
2274; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2275; SSSE3-NEXT:    por %xmm4, %xmm6
2276; SSSE3-NEXT:    pand %xmm6, %xmm0
2277; SSSE3-NEXT:    pandn %xmm2, %xmm6
2278; SSSE3-NEXT:    por %xmm6, %xmm0
2279; SSSE3-NEXT:    pxor %xmm1, %xmm3
2280; SSSE3-NEXT:    movdqa %xmm5, %xmm4
2281; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
2282; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2283; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm3
2284; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2285; SSSE3-NEXT:    pand %xmm6, %xmm3
2286; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2287; SSSE3-NEXT:    por %xmm3, %xmm4
2288; SSSE3-NEXT:    pand %xmm4, %xmm1
2289; SSSE3-NEXT:    pandn %xmm2, %xmm4
2290; SSSE3-NEXT:    por %xmm1, %xmm4
2291; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2292; SSSE3-NEXT:    pshufb %xmm1, %xmm4
2293; SSSE3-NEXT:    pshufb %xmm1, %xmm0
2294; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3]
2295; SSSE3-NEXT:    retq
2296;
2297; SSE41-LABEL: trunc_usat_v4i64_v4i8:
2298; SSE41:       # %bb.0:
2299; SSE41-NEXT:    movdqa %xmm0, %xmm2
2300; SSE41-NEXT:    movapd {{.*#+}} xmm4 = [255,255]
2301; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
2302; SSE41-NEXT:    pxor %xmm5, %xmm0
2303; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [9223372039002259711,9223372039002259711]
2304; SSE41-NEXT:    movdqa %xmm6, %xmm3
2305; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
2306; SSE41-NEXT:    movdqa %xmm6, %xmm7
2307; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
2308; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
2309; SSE41-NEXT:    pand %xmm3, %xmm0
2310; SSE41-NEXT:    por %xmm7, %xmm0
2311; SSE41-NEXT:    movapd %xmm4, %xmm3
2312; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
2313; SSE41-NEXT:    pxor %xmm1, %xmm5
2314; SSE41-NEXT:    movdqa %xmm6, %xmm2
2315; SSE41-NEXT:    pcmpeqd %xmm5, %xmm2
2316; SSE41-NEXT:    pcmpgtd %xmm5, %xmm6
2317; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2318; SSE41-NEXT:    pand %xmm2, %xmm0
2319; SSE41-NEXT:    por %xmm6, %xmm0
2320; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
2321; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2322; SSE41-NEXT:    pshufb %xmm0, %xmm4
2323; SSE41-NEXT:    pshufb %xmm0, %xmm3
2324; SSE41-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3]
2325; SSE41-NEXT:    movdqa %xmm3, %xmm0
2326; SSE41-NEXT:    retq
2327;
2328; AVX1-LABEL: trunc_usat_v4i64_v4i8:
2329; AVX1:       # %bb.0:
2330; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
2331; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm2
2332; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854776063,9223372036854776063]
2333; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
2334; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
2335; AVX1-NEXT:    vpxor %xmm1, %xmm4, %xmm1
2336; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
2337; AVX1-NEXT:    vmovapd {{.*#+}} xmm3 = [255,255]
2338; AVX1-NEXT:    vblendvpd %xmm1, %xmm4, %xmm3, %xmm1
2339; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2340; AVX1-NEXT:    vpshufb %xmm4, %xmm1, %xmm1
2341; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
2342; AVX1-NEXT:    vpshufb %xmm4, %xmm0, %xmm0
2343; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2344; AVX1-NEXT:    vzeroupper
2345; AVX1-NEXT:    retq
2346;
2347; AVX2-LABEL: trunc_usat_v4i64_v4i8:
2348; AVX2:       # %bb.0:
2349; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [255,255,255,255]
2350; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2351; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm2
2352; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
2353; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm3, %ymm2
2354; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
2355; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
2356; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2357; AVX2-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
2358; AVX2-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
2359; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2360; AVX2-NEXT:    vzeroupper
2361; AVX2-NEXT:    retq
2362;
2363; AVX512F-LABEL: trunc_usat_v4i64_v4i8:
2364; AVX512F:       # %bb.0:
2365; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2366; AVX512F-NEXT:    vpmovusqb %zmm0, %xmm0
2367; AVX512F-NEXT:    vzeroupper
2368; AVX512F-NEXT:    retq
2369;
2370; AVX512VL-LABEL: trunc_usat_v4i64_v4i8:
2371; AVX512VL:       # %bb.0:
2372; AVX512VL-NEXT:    vpmovusqb %ymm0, %xmm0
2373; AVX512VL-NEXT:    vzeroupper
2374; AVX512VL-NEXT:    retq
2375;
2376; AVX512BW-LABEL: trunc_usat_v4i64_v4i8:
2377; AVX512BW:       # %bb.0:
2378; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2379; AVX512BW-NEXT:    vpmovusqb %zmm0, %xmm0
2380; AVX512BW-NEXT:    vzeroupper
2381; AVX512BW-NEXT:    retq
2382;
2383; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i8:
2384; AVX512BWVL:       # %bb.0:
2385; AVX512BWVL-NEXT:    vpmovusqb %ymm0, %xmm0
2386; AVX512BWVL-NEXT:    vzeroupper
2387; AVX512BWVL-NEXT:    retq
2388;
2389; SKX-LABEL: trunc_usat_v4i64_v4i8:
2390; SKX:       # %bb.0:
2391; SKX-NEXT:    vpmovusqb %ymm0, %xmm0
2392; SKX-NEXT:    vzeroupper
2393; SKX-NEXT:    retq
2394  %1 = icmp ult <4 x i64> %a0, <i64 255, i64 255, i64 255, i64 255>
2395  %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 255, i64 255, i64 255, i64 255>
2396  %3 = trunc <4 x i64> %2 to <4 x i8>
2397  ret <4 x i8> %3
2398}
2399
2400define void @trunc_usat_v4i64_v4i8_store(<4 x i64> %a0, <4 x i8> *%p1) {
2401; SSE2-LABEL: trunc_usat_v4i64_v4i8_store:
2402; SSE2:       # %bb.0:
2403; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
2404; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
2405; SSE2-NEXT:    movdqa %xmm0, %xmm3
2406; SSE2-NEXT:    pxor %xmm4, %xmm3
2407; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259711,9223372039002259711]
2408; SSE2-NEXT:    movdqa %xmm5, %xmm6
2409; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
2410; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2411; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
2412; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
2413; SSE2-NEXT:    pand %xmm7, %xmm2
2414; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
2415; SSE2-NEXT:    por %xmm2, %xmm3
2416; SSE2-NEXT:    pand %xmm3, %xmm0
2417; SSE2-NEXT:    pandn %xmm8, %xmm3
2418; SSE2-NEXT:    por %xmm0, %xmm3
2419; SSE2-NEXT:    pxor %xmm1, %xmm4
2420; SSE2-NEXT:    movdqa %xmm5, %xmm0
2421; SSE2-NEXT:    pcmpgtd %xmm4, %xmm0
2422; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
2423; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
2424; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2425; SSE2-NEXT:    pand %xmm2, %xmm4
2426; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2427; SSE2-NEXT:    por %xmm4, %xmm0
2428; SSE2-NEXT:    pand %xmm0, %xmm1
2429; SSE2-NEXT:    pandn %xmm8, %xmm0
2430; SSE2-NEXT:    por %xmm1, %xmm0
2431; SSE2-NEXT:    pand %xmm8, %xmm0
2432; SSE2-NEXT:    pand %xmm8, %xmm3
2433; SSE2-NEXT:    packuswb %xmm0, %xmm3
2434; SSE2-NEXT:    packuswb %xmm0, %xmm3
2435; SSE2-NEXT:    packuswb %xmm0, %xmm3
2436; SSE2-NEXT:    movd %xmm3, (%rdi)
2437; SSE2-NEXT:    retq
2438;
2439; SSSE3-LABEL: trunc_usat_v4i64_v4i8_store:
2440; SSSE3:       # %bb.0:
2441; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
2442; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
2443; SSSE3-NEXT:    movdqa %xmm0, %xmm3
2444; SSSE3-NEXT:    pxor %xmm4, %xmm3
2445; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259711,9223372039002259711]
2446; SSSE3-NEXT:    movdqa %xmm5, %xmm6
2447; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm6
2448; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2449; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm3
2450; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
2451; SSSE3-NEXT:    pand %xmm7, %xmm2
2452; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
2453; SSSE3-NEXT:    por %xmm2, %xmm3
2454; SSSE3-NEXT:    pand %xmm3, %xmm0
2455; SSSE3-NEXT:    pandn %xmm8, %xmm3
2456; SSSE3-NEXT:    por %xmm0, %xmm3
2457; SSSE3-NEXT:    pxor %xmm1, %xmm4
2458; SSSE3-NEXT:    movdqa %xmm5, %xmm0
2459; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm0
2460; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
2461; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm4
2462; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2463; SSSE3-NEXT:    pand %xmm2, %xmm4
2464; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2465; SSSE3-NEXT:    por %xmm4, %xmm0
2466; SSSE3-NEXT:    pand %xmm0, %xmm1
2467; SSSE3-NEXT:    pandn %xmm8, %xmm0
2468; SSSE3-NEXT:    por %xmm1, %xmm0
2469; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2470; SSSE3-NEXT:    pshufb %xmm1, %xmm0
2471; SSSE3-NEXT:    pshufb %xmm1, %xmm3
2472; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3]
2473; SSSE3-NEXT:    movd %xmm3, (%rdi)
2474; SSSE3-NEXT:    retq
2475;
2476; SSE41-LABEL: trunc_usat_v4i64_v4i8_store:
2477; SSE41:       # %bb.0:
2478; SSE41-NEXT:    movdqa %xmm0, %xmm2
2479; SSE41-NEXT:    movapd {{.*#+}} xmm3 = [255,255]
2480; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
2481; SSE41-NEXT:    pxor %xmm4, %xmm0
2482; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259711,9223372039002259711]
2483; SSE41-NEXT:    movdqa %xmm5, %xmm6
2484; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
2485; SSE41-NEXT:    movdqa %xmm5, %xmm7
2486; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
2487; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
2488; SSE41-NEXT:    pand %xmm6, %xmm0
2489; SSE41-NEXT:    por %xmm7, %xmm0
2490; SSE41-NEXT:    movapd %xmm3, %xmm6
2491; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm6
2492; SSE41-NEXT:    pxor %xmm1, %xmm4
2493; SSE41-NEXT:    movdqa %xmm5, %xmm2
2494; SSE41-NEXT:    pcmpeqd %xmm4, %xmm2
2495; SSE41-NEXT:    pcmpgtd %xmm4, %xmm5
2496; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
2497; SSE41-NEXT:    pand %xmm2, %xmm0
2498; SSE41-NEXT:    por %xmm5, %xmm0
2499; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
2500; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2501; SSE41-NEXT:    pshufb %xmm0, %xmm3
2502; SSE41-NEXT:    pshufb %xmm0, %xmm6
2503; SSE41-NEXT:    punpcklwd {{.*#+}} xmm6 = xmm6[0],xmm3[0],xmm6[1],xmm3[1],xmm6[2],xmm3[2],xmm6[3],xmm3[3]
2504; SSE41-NEXT:    movd %xmm6, (%rdi)
2505; SSE41-NEXT:    retq
2506;
2507; AVX1-LABEL: trunc_usat_v4i64_v4i8_store:
2508; AVX1:       # %bb.0:
2509; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
2510; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm2
2511; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854776063,9223372036854776063]
2512; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
2513; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
2514; AVX1-NEXT:    vpxor %xmm1, %xmm4, %xmm1
2515; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
2516; AVX1-NEXT:    vmovapd {{.*#+}} xmm3 = [255,255]
2517; AVX1-NEXT:    vblendvpd %xmm1, %xmm4, %xmm3, %xmm1
2518; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2519; AVX1-NEXT:    vpshufb %xmm4, %xmm1, %xmm1
2520; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
2521; AVX1-NEXT:    vpshufb %xmm4, %xmm0, %xmm0
2522; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2523; AVX1-NEXT:    vmovd %xmm0, (%rdi)
2524; AVX1-NEXT:    vzeroupper
2525; AVX1-NEXT:    retq
2526;
2527; AVX2-LABEL: trunc_usat_v4i64_v4i8_store:
2528; AVX2:       # %bb.0:
2529; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [255,255,255,255]
2530; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2531; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm2
2532; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
2533; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm3, %ymm2
2534; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
2535; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
2536; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2537; AVX2-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
2538; AVX2-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
2539; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2540; AVX2-NEXT:    vmovd %xmm0, (%rdi)
2541; AVX2-NEXT:    vzeroupper
2542; AVX2-NEXT:    retq
2543;
2544; AVX512F-LABEL: trunc_usat_v4i64_v4i8_store:
2545; AVX512F:       # %bb.0:
2546; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2547; AVX512F-NEXT:    vpmovusqb %zmm0, %xmm0
2548; AVX512F-NEXT:    vmovd %xmm0, (%rdi)
2549; AVX512F-NEXT:    vzeroupper
2550; AVX512F-NEXT:    retq
2551;
2552; AVX512VL-LABEL: trunc_usat_v4i64_v4i8_store:
2553; AVX512VL:       # %bb.0:
2554; AVX512VL-NEXT:    vpmovusqb %ymm0, (%rdi)
2555; AVX512VL-NEXT:    vzeroupper
2556; AVX512VL-NEXT:    retq
2557;
2558; AVX512BW-LABEL: trunc_usat_v4i64_v4i8_store:
2559; AVX512BW:       # %bb.0:
2560; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2561; AVX512BW-NEXT:    vpmovusqb %zmm0, %xmm0
2562; AVX512BW-NEXT:    vmovd %xmm0, (%rdi)
2563; AVX512BW-NEXT:    vzeroupper
2564; AVX512BW-NEXT:    retq
2565;
2566; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i8_store:
2567; AVX512BWVL:       # %bb.0:
2568; AVX512BWVL-NEXT:    vpmovusqb %ymm0, (%rdi)
2569; AVX512BWVL-NEXT:    vzeroupper
2570; AVX512BWVL-NEXT:    retq
2571;
2572; SKX-LABEL: trunc_usat_v4i64_v4i8_store:
2573; SKX:       # %bb.0:
2574; SKX-NEXT:    vpmovusqb %ymm0, (%rdi)
2575; SKX-NEXT:    vzeroupper
2576; SKX-NEXT:    retq
2577  %1 = icmp ult <4 x i64> %a0, <i64 255, i64 255, i64 255, i64 255>
2578  %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 255, i64 255, i64 255, i64 255>
2579  %3 = trunc <4 x i64> %2 to <4 x i8>
2580  store <4 x i8> %3, <4 x i8> *%p1
2581  ret void
2582}
2583
2584define <8 x i8> @trunc_usat_v8i64_v8i8(<8 x i64>* %p0) {
2585; SSE2-LABEL: trunc_usat_v8i64_v8i8:
2586; SSE2:       # %bb.0:
2587; SSE2-NEXT:    movdqa (%rdi), %xmm6
2588; SSE2-NEXT:    movdqa 16(%rdi), %xmm0
2589; SSE2-NEXT:    movdqa 32(%rdi), %xmm9
2590; SSE2-NEXT:    movdqa 48(%rdi), %xmm5
2591; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
2592; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
2593; SSE2-NEXT:    movdqa %xmm0, %xmm7
2594; SSE2-NEXT:    pxor %xmm3, %xmm7
2595; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [9223372039002259711,9223372039002259711]
2596; SSE2-NEXT:    movdqa %xmm10, %xmm4
2597; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
2598; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[0,0,2,2]
2599; SSE2-NEXT:    pcmpeqd %xmm10, %xmm7
2600; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
2601; SSE2-NEXT:    pand %xmm1, %xmm7
2602; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
2603; SSE2-NEXT:    por %xmm7, %xmm1
2604; SSE2-NEXT:    pand %xmm1, %xmm0
2605; SSE2-NEXT:    pandn %xmm8, %xmm1
2606; SSE2-NEXT:    por %xmm0, %xmm1
2607; SSE2-NEXT:    movdqa %xmm6, %xmm0
2608; SSE2-NEXT:    pxor %xmm3, %xmm0
2609; SSE2-NEXT:    movdqa %xmm10, %xmm4
2610; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
2611; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
2612; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
2613; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
2614; SSE2-NEXT:    pand %xmm7, %xmm2
2615; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
2616; SSE2-NEXT:    por %xmm2, %xmm0
2617; SSE2-NEXT:    pand %xmm0, %xmm6
2618; SSE2-NEXT:    pandn %xmm8, %xmm0
2619; SSE2-NEXT:    por %xmm6, %xmm0
2620; SSE2-NEXT:    packuswb %xmm1, %xmm0
2621; SSE2-NEXT:    movdqa %xmm5, %xmm1
2622; SSE2-NEXT:    pxor %xmm3, %xmm1
2623; SSE2-NEXT:    movdqa %xmm10, %xmm2
2624; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
2625; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2626; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
2627; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2628; SSE2-NEXT:    pand %xmm4, %xmm1
2629; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2630; SSE2-NEXT:    por %xmm1, %xmm2
2631; SSE2-NEXT:    pand %xmm2, %xmm5
2632; SSE2-NEXT:    pandn %xmm8, %xmm2
2633; SSE2-NEXT:    por %xmm5, %xmm2
2634; SSE2-NEXT:    pxor %xmm9, %xmm3
2635; SSE2-NEXT:    movdqa %xmm10, %xmm1
2636; SSE2-NEXT:    pcmpgtd %xmm3, %xmm1
2637; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
2638; SSE2-NEXT:    pcmpeqd %xmm10, %xmm3
2639; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2640; SSE2-NEXT:    pand %xmm4, %xmm3
2641; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2642; SSE2-NEXT:    por %xmm3, %xmm1
2643; SSE2-NEXT:    pand %xmm1, %xmm9
2644; SSE2-NEXT:    pandn %xmm8, %xmm1
2645; SSE2-NEXT:    por %xmm9, %xmm1
2646; SSE2-NEXT:    packuswb %xmm2, %xmm1
2647; SSE2-NEXT:    packuswb %xmm1, %xmm0
2648; SSE2-NEXT:    packuswb %xmm0, %xmm0
2649; SSE2-NEXT:    retq
2650;
2651; SSSE3-LABEL: trunc_usat_v8i64_v8i8:
2652; SSSE3:       # %bb.0:
2653; SSSE3-NEXT:    movdqa (%rdi), %xmm6
2654; SSSE3-NEXT:    movdqa 16(%rdi), %xmm0
2655; SSSE3-NEXT:    movdqa 32(%rdi), %xmm9
2656; SSSE3-NEXT:    movdqa 48(%rdi), %xmm5
2657; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
2658; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
2659; SSSE3-NEXT:    movdqa %xmm0, %xmm7
2660; SSSE3-NEXT:    pxor %xmm3, %xmm7
2661; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [9223372039002259711,9223372039002259711]
2662; SSSE3-NEXT:    movdqa %xmm10, %xmm4
2663; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm4
2664; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[0,0,2,2]
2665; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm7
2666; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
2667; SSSE3-NEXT:    pand %xmm1, %xmm7
2668; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
2669; SSSE3-NEXT:    por %xmm7, %xmm1
2670; SSSE3-NEXT:    pand %xmm1, %xmm0
2671; SSSE3-NEXT:    pandn %xmm8, %xmm1
2672; SSSE3-NEXT:    por %xmm0, %xmm1
2673; SSSE3-NEXT:    movdqa %xmm6, %xmm0
2674; SSSE3-NEXT:    pxor %xmm3, %xmm0
2675; SSSE3-NEXT:    movdqa %xmm10, %xmm4
2676; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm4
2677; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
2678; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm0
2679; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
2680; SSSE3-NEXT:    pand %xmm7, %xmm2
2681; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
2682; SSSE3-NEXT:    por %xmm2, %xmm0
2683; SSSE3-NEXT:    pand %xmm0, %xmm6
2684; SSSE3-NEXT:    pandn %xmm8, %xmm0
2685; SSSE3-NEXT:    por %xmm6, %xmm0
2686; SSSE3-NEXT:    packuswb %xmm1, %xmm0
2687; SSSE3-NEXT:    movdqa %xmm5, %xmm1
2688; SSSE3-NEXT:    pxor %xmm3, %xmm1
2689; SSSE3-NEXT:    movdqa %xmm10, %xmm2
2690; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
2691; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2692; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm1
2693; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2694; SSSE3-NEXT:    pand %xmm4, %xmm1
2695; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2696; SSSE3-NEXT:    por %xmm1, %xmm2
2697; SSSE3-NEXT:    pand %xmm2, %xmm5
2698; SSSE3-NEXT:    pandn %xmm8, %xmm2
2699; SSSE3-NEXT:    por %xmm5, %xmm2
2700; SSSE3-NEXT:    pxor %xmm9, %xmm3
2701; SSSE3-NEXT:    movdqa %xmm10, %xmm1
2702; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm1
2703; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
2704; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm3
2705; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2706; SSSE3-NEXT:    pand %xmm4, %xmm3
2707; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2708; SSSE3-NEXT:    por %xmm3, %xmm1
2709; SSSE3-NEXT:    pand %xmm1, %xmm9
2710; SSSE3-NEXT:    pandn %xmm8, %xmm1
2711; SSSE3-NEXT:    por %xmm9, %xmm1
2712; SSSE3-NEXT:    packuswb %xmm2, %xmm1
2713; SSSE3-NEXT:    packuswb %xmm1, %xmm0
2714; SSSE3-NEXT:    packuswb %xmm0, %xmm0
2715; SSSE3-NEXT:    retq
2716;
2717; SSE41-LABEL: trunc_usat_v8i64_v8i8:
2718; SSE41:       # %bb.0:
2719; SSE41-NEXT:    movdqa (%rdi), %xmm7
2720; SSE41-NEXT:    movdqa 16(%rdi), %xmm1
2721; SSE41-NEXT:    movdqa 32(%rdi), %xmm8
2722; SSE41-NEXT:    movdqa 48(%rdi), %xmm9
2723; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [255,255]
2724; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
2725; SSE41-NEXT:    movdqa %xmm1, %xmm0
2726; SSE41-NEXT:    pxor %xmm5, %xmm0
2727; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259711,9223372039002259711]
2728; SSE41-NEXT:    movdqa %xmm3, %xmm6
2729; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
2730; SSE41-NEXT:    movdqa %xmm3, %xmm4
2731; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
2732; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
2733; SSE41-NEXT:    pand %xmm6, %xmm0
2734; SSE41-NEXT:    por %xmm4, %xmm0
2735; SSE41-NEXT:    movapd %xmm2, %xmm4
2736; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
2737; SSE41-NEXT:    movdqa %xmm7, %xmm0
2738; SSE41-NEXT:    pxor %xmm5, %xmm0
2739; SSE41-NEXT:    movdqa %xmm3, %xmm1
2740; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
2741; SSE41-NEXT:    movdqa %xmm3, %xmm6
2742; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
2743; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2744; SSE41-NEXT:    pand %xmm1, %xmm0
2745; SSE41-NEXT:    por %xmm6, %xmm0
2746; SSE41-NEXT:    movapd %xmm2, %xmm1
2747; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
2748; SSE41-NEXT:    packusdw %xmm4, %xmm1
2749; SSE41-NEXT:    movdqa %xmm9, %xmm0
2750; SSE41-NEXT:    pxor %xmm5, %xmm0
2751; SSE41-NEXT:    movdqa %xmm3, %xmm4
2752; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
2753; SSE41-NEXT:    movdqa %xmm3, %xmm6
2754; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
2755; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2756; SSE41-NEXT:    pand %xmm4, %xmm0
2757; SSE41-NEXT:    por %xmm6, %xmm0
2758; SSE41-NEXT:    movapd %xmm2, %xmm4
2759; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm4
2760; SSE41-NEXT:    pxor %xmm8, %xmm5
2761; SSE41-NEXT:    movdqa %xmm3, %xmm6
2762; SSE41-NEXT:    pcmpeqd %xmm5, %xmm6
2763; SSE41-NEXT:    pcmpgtd %xmm5, %xmm3
2764; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2765; SSE41-NEXT:    pand %xmm6, %xmm0
2766; SSE41-NEXT:    por %xmm3, %xmm0
2767; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm2
2768; SSE41-NEXT:    packusdw %xmm4, %xmm2
2769; SSE41-NEXT:    packusdw %xmm2, %xmm1
2770; SSE41-NEXT:    packuswb %xmm0, %xmm1
2771; SSE41-NEXT:    movdqa %xmm1, %xmm0
2772; SSE41-NEXT:    retq
2773;
2774; AVX1-LABEL: trunc_usat_v8i64_v8i8:
2775; AVX1:       # %bb.0:
2776; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
2777; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
2778; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm2
2779; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm3
2780; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
2781; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm5
2782; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [9223372036854776063,9223372036854776063]
2783; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm8
2784; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm7
2785; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm7
2786; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm5
2787; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
2788; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm4
2789; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
2790; AVX1-NEXT:    vmovapd {{.*#+}} xmm6 = [255,255]
2791; AVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm6, %xmm3
2792; AVX1-NEXT:    vblendvpd %xmm5, %xmm2, %xmm6, %xmm2
2793; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
2794; AVX1-NEXT:    vblendvpd %xmm7, %xmm1, %xmm6, %xmm1
2795; AVX1-NEXT:    vblendvpd %xmm8, %xmm0, %xmm6, %xmm0
2796; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
2797; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
2798; AVX1-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
2799; AVX1-NEXT:    retq
2800;
2801; AVX2-LABEL: trunc_usat_v8i64_v8i8:
2802; AVX2:       # %bb.0:
2803; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
2804; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
2805; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [255,255,255,255]
2806; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2807; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm4
2808; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
2809; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
2810; AVX2-NEXT:    vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
2811; AVX2-NEXT:    vpxor %ymm3, %ymm0, %ymm3
2812; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm5, %ymm3
2813; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
2814; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
2815; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2816; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2817; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
2818; AVX2-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
2819; AVX2-NEXT:    vzeroupper
2820; AVX2-NEXT:    retq
2821;
2822; AVX512-LABEL: trunc_usat_v8i64_v8i8:
2823; AVX512:       # %bb.0:
2824; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
2825; AVX512-NEXT:    vpmovusqb %zmm0, %xmm0
2826; AVX512-NEXT:    vzeroupper
2827; AVX512-NEXT:    retq
2828;
2829; SKX-LABEL: trunc_usat_v8i64_v8i8:
2830; SKX:       # %bb.0:
2831; SKX-NEXT:    vmovdqa64 (%rdi), %zmm0
2832; SKX-NEXT:    vpmovusqb %zmm0, %xmm0
2833; SKX-NEXT:    vzeroupper
2834; SKX-NEXT:    retq
2835  %a0 = load <8 x i64>, <8 x i64>* %p0
2836  %1 = icmp ult <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
2837  %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
2838  %3 = trunc <8 x i64> %2 to <8 x i8>
2839  ret <8 x i8> %3
2840}
2841
2842define void @trunc_usat_v8i64_v8i8_store(<8 x i64>* %p0, <8 x i8> *%p1) {
2843; SSE2-LABEL: trunc_usat_v8i64_v8i8_store:
2844; SSE2:       # %bb.0:
2845; SSE2-NEXT:    movdqa (%rdi), %xmm6
2846; SSE2-NEXT:    movdqa 16(%rdi), %xmm5
2847; SSE2-NEXT:    movdqa 32(%rdi), %xmm9
2848; SSE2-NEXT:    movdqa 48(%rdi), %xmm4
2849; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
2850; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
2851; SSE2-NEXT:    movdqa %xmm5, %xmm7
2852; SSE2-NEXT:    pxor %xmm2, %xmm7
2853; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259711,9223372039002259711]
2854; SSE2-NEXT:    movdqa %xmm1, %xmm3
2855; SSE2-NEXT:    pcmpgtd %xmm7, %xmm3
2856; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2857; SSE2-NEXT:    pcmpeqd %xmm1, %xmm7
2858; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
2859; SSE2-NEXT:    pand %xmm0, %xmm7
2860; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
2861; SSE2-NEXT:    por %xmm7, %xmm0
2862; SSE2-NEXT:    pand %xmm0, %xmm5
2863; SSE2-NEXT:    pandn %xmm8, %xmm0
2864; SSE2-NEXT:    por %xmm5, %xmm0
2865; SSE2-NEXT:    movdqa %xmm6, %xmm3
2866; SSE2-NEXT:    pxor %xmm2, %xmm3
2867; SSE2-NEXT:    movdqa %xmm1, %xmm5
2868; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
2869; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
2870; SSE2-NEXT:    pcmpeqd %xmm1, %xmm3
2871; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2872; SSE2-NEXT:    pand %xmm7, %xmm3
2873; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2874; SSE2-NEXT:    por %xmm3, %xmm5
2875; SSE2-NEXT:    pand %xmm5, %xmm6
2876; SSE2-NEXT:    pandn %xmm8, %xmm5
2877; SSE2-NEXT:    por %xmm6, %xmm5
2878; SSE2-NEXT:    packuswb %xmm0, %xmm5
2879; SSE2-NEXT:    movdqa %xmm4, %xmm0
2880; SSE2-NEXT:    pxor %xmm2, %xmm0
2881; SSE2-NEXT:    movdqa %xmm1, %xmm3
2882; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
2883; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
2884; SSE2-NEXT:    pcmpeqd %xmm1, %xmm0
2885; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2886; SSE2-NEXT:    pand %xmm6, %xmm0
2887; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2888; SSE2-NEXT:    por %xmm0, %xmm3
2889; SSE2-NEXT:    pand %xmm3, %xmm4
2890; SSE2-NEXT:    pandn %xmm8, %xmm3
2891; SSE2-NEXT:    por %xmm4, %xmm3
2892; SSE2-NEXT:    pxor %xmm9, %xmm2
2893; SSE2-NEXT:    movdqa %xmm1, %xmm0
2894; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
2895; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
2896; SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
2897; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
2898; SSE2-NEXT:    pand %xmm4, %xmm1
2899; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2900; SSE2-NEXT:    por %xmm1, %xmm0
2901; SSE2-NEXT:    pand %xmm0, %xmm9
2902; SSE2-NEXT:    pandn %xmm8, %xmm0
2903; SSE2-NEXT:    por %xmm9, %xmm0
2904; SSE2-NEXT:    packuswb %xmm3, %xmm0
2905; SSE2-NEXT:    packuswb %xmm0, %xmm5
2906; SSE2-NEXT:    packuswb %xmm0, %xmm5
2907; SSE2-NEXT:    movq %xmm5, (%rsi)
2908; SSE2-NEXT:    retq
2909;
2910; SSSE3-LABEL: trunc_usat_v8i64_v8i8_store:
2911; SSSE3:       # %bb.0:
2912; SSSE3-NEXT:    movdqa (%rdi), %xmm6
2913; SSSE3-NEXT:    movdqa 16(%rdi), %xmm5
2914; SSSE3-NEXT:    movdqa 32(%rdi), %xmm9
2915; SSSE3-NEXT:    movdqa 48(%rdi), %xmm4
2916; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
2917; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
2918; SSSE3-NEXT:    movdqa %xmm5, %xmm7
2919; SSSE3-NEXT:    pxor %xmm2, %xmm7
2920; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259711,9223372039002259711]
2921; SSSE3-NEXT:    movdqa %xmm1, %xmm3
2922; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm3
2923; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2924; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm7
2925; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
2926; SSSE3-NEXT:    pand %xmm0, %xmm7
2927; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
2928; SSSE3-NEXT:    por %xmm7, %xmm0
2929; SSSE3-NEXT:    pand %xmm0, %xmm5
2930; SSSE3-NEXT:    pandn %xmm8, %xmm0
2931; SSSE3-NEXT:    por %xmm5, %xmm0
2932; SSSE3-NEXT:    movdqa %xmm6, %xmm3
2933; SSSE3-NEXT:    pxor %xmm2, %xmm3
2934; SSSE3-NEXT:    movdqa %xmm1, %xmm5
2935; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
2936; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
2937; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm3
2938; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2939; SSSE3-NEXT:    pand %xmm7, %xmm3
2940; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2941; SSSE3-NEXT:    por %xmm3, %xmm5
2942; SSSE3-NEXT:    pand %xmm5, %xmm6
2943; SSSE3-NEXT:    pandn %xmm8, %xmm5
2944; SSSE3-NEXT:    por %xmm6, %xmm5
2945; SSSE3-NEXT:    packuswb %xmm0, %xmm5
2946; SSSE3-NEXT:    movdqa %xmm4, %xmm0
2947; SSSE3-NEXT:    pxor %xmm2, %xmm0
2948; SSSE3-NEXT:    movdqa %xmm1, %xmm3
2949; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm3
2950; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
2951; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm0
2952; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2953; SSSE3-NEXT:    pand %xmm6, %xmm0
2954; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2955; SSSE3-NEXT:    por %xmm0, %xmm3
2956; SSSE3-NEXT:    pand %xmm3, %xmm4
2957; SSSE3-NEXT:    pandn %xmm8, %xmm3
2958; SSSE3-NEXT:    por %xmm4, %xmm3
2959; SSSE3-NEXT:    pxor %xmm9, %xmm2
2960; SSSE3-NEXT:    movdqa %xmm1, %xmm0
2961; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm0
2962; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
2963; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm2
2964; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
2965; SSSE3-NEXT:    pand %xmm4, %xmm1
2966; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2967; SSSE3-NEXT:    por %xmm1, %xmm0
2968; SSSE3-NEXT:    pand %xmm0, %xmm9
2969; SSSE3-NEXT:    pandn %xmm8, %xmm0
2970; SSSE3-NEXT:    por %xmm9, %xmm0
2971; SSSE3-NEXT:    packuswb %xmm3, %xmm0
2972; SSSE3-NEXT:    packuswb %xmm0, %xmm5
2973; SSSE3-NEXT:    packuswb %xmm0, %xmm5
2974; SSSE3-NEXT:    movq %xmm5, (%rsi)
2975; SSSE3-NEXT:    retq
2976;
2977; SSE41-LABEL: trunc_usat_v8i64_v8i8_store:
2978; SSE41:       # %bb.0:
2979; SSE41-NEXT:    movdqa (%rdi), %xmm7
2980; SSE41-NEXT:    movdqa 16(%rdi), %xmm6
2981; SSE41-NEXT:    movdqa 32(%rdi), %xmm8
2982; SSE41-NEXT:    movdqa 48(%rdi), %xmm9
2983; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [255,255]
2984; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
2985; SSE41-NEXT:    movdqa %xmm6, %xmm0
2986; SSE41-NEXT:    pxor %xmm4, %xmm0
2987; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259711,9223372039002259711]
2988; SSE41-NEXT:    movdqa %xmm2, %xmm5
2989; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
2990; SSE41-NEXT:    movdqa %xmm2, %xmm3
2991; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
2992; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2993; SSE41-NEXT:    pand %xmm5, %xmm0
2994; SSE41-NEXT:    por %xmm3, %xmm0
2995; SSE41-NEXT:    movapd %xmm1, %xmm3
2996; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm3
2997; SSE41-NEXT:    movdqa %xmm7, %xmm0
2998; SSE41-NEXT:    pxor %xmm4, %xmm0
2999; SSE41-NEXT:    movdqa %xmm2, %xmm5
3000; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
3001; SSE41-NEXT:    movdqa %xmm2, %xmm6
3002; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
3003; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3004; SSE41-NEXT:    pand %xmm5, %xmm0
3005; SSE41-NEXT:    por %xmm6, %xmm0
3006; SSE41-NEXT:    movapd %xmm1, %xmm6
3007; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm6
3008; SSE41-NEXT:    packusdw %xmm3, %xmm6
3009; SSE41-NEXT:    movdqa %xmm9, %xmm0
3010; SSE41-NEXT:    pxor %xmm4, %xmm0
3011; SSE41-NEXT:    movdqa %xmm2, %xmm3
3012; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
3013; SSE41-NEXT:    movdqa %xmm2, %xmm5
3014; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
3015; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
3016; SSE41-NEXT:    pand %xmm3, %xmm0
3017; SSE41-NEXT:    por %xmm5, %xmm0
3018; SSE41-NEXT:    movapd %xmm1, %xmm3
3019; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm3
3020; SSE41-NEXT:    pxor %xmm8, %xmm4
3021; SSE41-NEXT:    movdqa %xmm2, %xmm5
3022; SSE41-NEXT:    pcmpeqd %xmm4, %xmm5
3023; SSE41-NEXT:    pcmpgtd %xmm4, %xmm2
3024; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
3025; SSE41-NEXT:    pand %xmm5, %xmm0
3026; SSE41-NEXT:    por %xmm2, %xmm0
3027; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm1
3028; SSE41-NEXT:    packusdw %xmm3, %xmm1
3029; SSE41-NEXT:    packusdw %xmm1, %xmm6
3030; SSE41-NEXT:    packuswb %xmm0, %xmm6
3031; SSE41-NEXT:    movq %xmm6, (%rsi)
3032; SSE41-NEXT:    retq
3033;
3034; AVX1-LABEL: trunc_usat_v8i64_v8i8_store:
3035; AVX1:       # %bb.0:
3036; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
3037; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
3038; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm2
3039; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm3
3040; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
3041; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm5
3042; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [9223372036854776063,9223372036854776063]
3043; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm8
3044; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm7
3045; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm7
3046; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm5
3047; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
3048; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm4
3049; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
3050; AVX1-NEXT:    vmovapd {{.*#+}} xmm6 = [255,255]
3051; AVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm6, %xmm3
3052; AVX1-NEXT:    vblendvpd %xmm5, %xmm2, %xmm6, %xmm2
3053; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
3054; AVX1-NEXT:    vblendvpd %xmm7, %xmm1, %xmm6, %xmm1
3055; AVX1-NEXT:    vblendvpd %xmm8, %xmm0, %xmm6, %xmm0
3056; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
3057; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
3058; AVX1-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
3059; AVX1-NEXT:    vmovq %xmm0, (%rsi)
3060; AVX1-NEXT:    retq
3061;
3062; AVX2-LABEL: trunc_usat_v8i64_v8i8_store:
3063; AVX2:       # %bb.0:
3064; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
3065; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
3066; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [255,255,255,255]
3067; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
3068; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm4
3069; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
3070; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
3071; AVX2-NEXT:    vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
3072; AVX2-NEXT:    vpxor %ymm3, %ymm0, %ymm3
3073; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm5, %ymm3
3074; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
3075; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
3076; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
3077; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
3078; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
3079; AVX2-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
3080; AVX2-NEXT:    vmovq %xmm0, (%rsi)
3081; AVX2-NEXT:    vzeroupper
3082; AVX2-NEXT:    retq
3083;
3084; AVX512-LABEL: trunc_usat_v8i64_v8i8_store:
3085; AVX512:       # %bb.0:
3086; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
3087; AVX512-NEXT:    vpmovusqb %zmm0, (%rsi)
3088; AVX512-NEXT:    vzeroupper
3089; AVX512-NEXT:    retq
3090;
3091; SKX-LABEL: trunc_usat_v8i64_v8i8_store:
3092; SKX:       # %bb.0:
3093; SKX-NEXT:    vmovdqa64 (%rdi), %zmm0
3094; SKX-NEXT:    vpmovusqb %zmm0, (%rsi)
3095; SKX-NEXT:    vzeroupper
3096; SKX-NEXT:    retq
3097  %a0 = load <8 x i64>, <8 x i64>* %p0
3098  %1 = icmp ult <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
3099  %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
3100  %3 = trunc <8 x i64> %2 to <8 x i8>
3101  store <8 x i8> %3, <8 x i8> *%p1
3102  ret void
3103}
3104
3105define <16 x i8> @trunc_usat_v16i64_v16i8(<16 x i64>* %p0) {
3106; SSE2-LABEL: trunc_usat_v16i64_v16i8:
3107; SSE2:       # %bb.0:
3108; SSE2-NEXT:    movdqa 96(%rdi), %xmm9
3109; SSE2-NEXT:    movdqa 112(%rdi), %xmm10
3110; SSE2-NEXT:    movdqa 64(%rdi), %xmm11
3111; SSE2-NEXT:    movdqa 80(%rdi), %xmm12
3112; SSE2-NEXT:    movdqa (%rdi), %xmm3
3113; SSE2-NEXT:    movdqa 16(%rdi), %xmm6
3114; SSE2-NEXT:    movdqa 32(%rdi), %xmm13
3115; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
3116; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
3117; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
3118; SSE2-NEXT:    movdqa %xmm6, %xmm0
3119; SSE2-NEXT:    pxor %xmm4, %xmm0
3120; SSE2-NEXT:    movdqa {{.*#+}} xmm14 = [9223372039002259711,9223372039002259711]
3121; SSE2-NEXT:    movdqa %xmm14, %xmm5
3122; SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
3123; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[0,0,2,2]
3124; SSE2-NEXT:    pcmpeqd %xmm14, %xmm0
3125; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3126; SSE2-NEXT:    pand %xmm2, %xmm0
3127; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
3128; SSE2-NEXT:    por %xmm0, %xmm2
3129; SSE2-NEXT:    pand %xmm2, %xmm6
3130; SSE2-NEXT:    pandn %xmm8, %xmm2
3131; SSE2-NEXT:    por %xmm6, %xmm2
3132; SSE2-NEXT:    movdqa %xmm3, %xmm0
3133; SSE2-NEXT:    pxor %xmm4, %xmm0
3134; SSE2-NEXT:    movdqa %xmm14, %xmm5
3135; SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
3136; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
3137; SSE2-NEXT:    pcmpeqd %xmm14, %xmm0
3138; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
3139; SSE2-NEXT:    pand %xmm6, %xmm7
3140; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
3141; SSE2-NEXT:    por %xmm7, %xmm0
3142; SSE2-NEXT:    pand %xmm0, %xmm3
3143; SSE2-NEXT:    pandn %xmm8, %xmm0
3144; SSE2-NEXT:    por %xmm3, %xmm0
3145; SSE2-NEXT:    packuswb %xmm2, %xmm0
3146; SSE2-NEXT:    movdqa %xmm1, %xmm2
3147; SSE2-NEXT:    pxor %xmm4, %xmm2
3148; SSE2-NEXT:    movdqa %xmm14, %xmm3
3149; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
3150; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
3151; SSE2-NEXT:    pcmpeqd %xmm14, %xmm2
3152; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3153; SSE2-NEXT:    pand %xmm5, %xmm2
3154; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3155; SSE2-NEXT:    por %xmm2, %xmm3
3156; SSE2-NEXT:    pand %xmm3, %xmm1
3157; SSE2-NEXT:    pandn %xmm8, %xmm3
3158; SSE2-NEXT:    por %xmm1, %xmm3
3159; SSE2-NEXT:    movdqa %xmm13, %xmm1
3160; SSE2-NEXT:    pxor %xmm4, %xmm1
3161; SSE2-NEXT:    movdqa %xmm14, %xmm2
3162; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
3163; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
3164; SSE2-NEXT:    pcmpeqd %xmm14, %xmm1
3165; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3166; SSE2-NEXT:    pand %xmm5, %xmm1
3167; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3168; SSE2-NEXT:    por %xmm1, %xmm2
3169; SSE2-NEXT:    pand %xmm2, %xmm13
3170; SSE2-NEXT:    pandn %xmm8, %xmm2
3171; SSE2-NEXT:    por %xmm13, %xmm2
3172; SSE2-NEXT:    packuswb %xmm3, %xmm2
3173; SSE2-NEXT:    packuswb %xmm2, %xmm0
3174; SSE2-NEXT:    movdqa %xmm12, %xmm1
3175; SSE2-NEXT:    pxor %xmm4, %xmm1
3176; SSE2-NEXT:    movdqa %xmm14, %xmm2
3177; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
3178; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
3179; SSE2-NEXT:    pcmpeqd %xmm14, %xmm1
3180; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3181; SSE2-NEXT:    pand %xmm3, %xmm1
3182; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3183; SSE2-NEXT:    por %xmm1, %xmm2
3184; SSE2-NEXT:    pand %xmm2, %xmm12
3185; SSE2-NEXT:    pandn %xmm8, %xmm2
3186; SSE2-NEXT:    por %xmm12, %xmm2
3187; SSE2-NEXT:    movdqa %xmm11, %xmm1
3188; SSE2-NEXT:    pxor %xmm4, %xmm1
3189; SSE2-NEXT:    movdqa %xmm14, %xmm3
3190; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
3191; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
3192; SSE2-NEXT:    pcmpeqd %xmm14, %xmm1
3193; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
3194; SSE2-NEXT:    pand %xmm5, %xmm6
3195; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
3196; SSE2-NEXT:    por %xmm6, %xmm1
3197; SSE2-NEXT:    pand %xmm1, %xmm11
3198; SSE2-NEXT:    pandn %xmm8, %xmm1
3199; SSE2-NEXT:    por %xmm11, %xmm1
3200; SSE2-NEXT:    packuswb %xmm2, %xmm1
3201; SSE2-NEXT:    movdqa %xmm10, %xmm2
3202; SSE2-NEXT:    pxor %xmm4, %xmm2
3203; SSE2-NEXT:    movdqa %xmm14, %xmm3
3204; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
3205; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
3206; SSE2-NEXT:    pcmpeqd %xmm14, %xmm2
3207; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3208; SSE2-NEXT:    pand %xmm5, %xmm2
3209; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3210; SSE2-NEXT:    por %xmm2, %xmm3
3211; SSE2-NEXT:    pand %xmm3, %xmm10
3212; SSE2-NEXT:    pandn %xmm8, %xmm3
3213; SSE2-NEXT:    por %xmm10, %xmm3
3214; SSE2-NEXT:    pxor %xmm9, %xmm4
3215; SSE2-NEXT:    movdqa %xmm14, %xmm2
3216; SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
3217; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
3218; SSE2-NEXT:    pcmpeqd %xmm14, %xmm4
3219; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3220; SSE2-NEXT:    pand %xmm5, %xmm4
3221; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3222; SSE2-NEXT:    por %xmm4, %xmm2
3223; SSE2-NEXT:    pand %xmm2, %xmm9
3224; SSE2-NEXT:    pandn %xmm8, %xmm2
3225; SSE2-NEXT:    por %xmm9, %xmm2
3226; SSE2-NEXT:    packuswb %xmm3, %xmm2
3227; SSE2-NEXT:    packuswb %xmm2, %xmm1
3228; SSE2-NEXT:    packuswb %xmm1, %xmm0
3229; SSE2-NEXT:    retq
3230;
3231; SSSE3-LABEL: trunc_usat_v16i64_v16i8:
3232; SSSE3:       # %bb.0:
3233; SSSE3-NEXT:    movdqa 96(%rdi), %xmm9
3234; SSSE3-NEXT:    movdqa 112(%rdi), %xmm10
3235; SSSE3-NEXT:    movdqa 64(%rdi), %xmm11
3236; SSSE3-NEXT:    movdqa 80(%rdi), %xmm12
3237; SSSE3-NEXT:    movdqa (%rdi), %xmm3
3238; SSSE3-NEXT:    movdqa 16(%rdi), %xmm6
3239; SSSE3-NEXT:    movdqa 32(%rdi), %xmm13
3240; SSSE3-NEXT:    movdqa 48(%rdi), %xmm1
3241; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
3242; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
3243; SSSE3-NEXT:    movdqa %xmm6, %xmm0
3244; SSSE3-NEXT:    pxor %xmm4, %xmm0
3245; SSSE3-NEXT:    movdqa {{.*#+}} xmm14 = [9223372039002259711,9223372039002259711]
3246; SSSE3-NEXT:    movdqa %xmm14, %xmm5
3247; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm5
3248; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[0,0,2,2]
3249; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm0
3250; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3251; SSSE3-NEXT:    pand %xmm2, %xmm0
3252; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
3253; SSSE3-NEXT:    por %xmm0, %xmm2
3254; SSSE3-NEXT:    pand %xmm2, %xmm6
3255; SSSE3-NEXT:    pandn %xmm8, %xmm2
3256; SSSE3-NEXT:    por %xmm6, %xmm2
3257; SSSE3-NEXT:    movdqa %xmm3, %xmm0
3258; SSSE3-NEXT:    pxor %xmm4, %xmm0
3259; SSSE3-NEXT:    movdqa %xmm14, %xmm5
3260; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm5
3261; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
3262; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm0
3263; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
3264; SSSE3-NEXT:    pand %xmm6, %xmm7
3265; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
3266; SSSE3-NEXT:    por %xmm7, %xmm0
3267; SSSE3-NEXT:    pand %xmm0, %xmm3
3268; SSSE3-NEXT:    pandn %xmm8, %xmm0
3269; SSSE3-NEXT:    por %xmm3, %xmm0
3270; SSSE3-NEXT:    packuswb %xmm2, %xmm0
3271; SSSE3-NEXT:    movdqa %xmm1, %xmm2
3272; SSSE3-NEXT:    pxor %xmm4, %xmm2
3273; SSSE3-NEXT:    movdqa %xmm14, %xmm3
3274; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
3275; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
3276; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm2
3277; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3278; SSSE3-NEXT:    pand %xmm5, %xmm2
3279; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3280; SSSE3-NEXT:    por %xmm2, %xmm3
3281; SSSE3-NEXT:    pand %xmm3, %xmm1
3282; SSSE3-NEXT:    pandn %xmm8, %xmm3
3283; SSSE3-NEXT:    por %xmm1, %xmm3
3284; SSSE3-NEXT:    movdqa %xmm13, %xmm1
3285; SSSE3-NEXT:    pxor %xmm4, %xmm1
3286; SSSE3-NEXT:    movdqa %xmm14, %xmm2
3287; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
3288; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
3289; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm1
3290; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3291; SSSE3-NEXT:    pand %xmm5, %xmm1
3292; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3293; SSSE3-NEXT:    por %xmm1, %xmm2
3294; SSSE3-NEXT:    pand %xmm2, %xmm13
3295; SSSE3-NEXT:    pandn %xmm8, %xmm2
3296; SSSE3-NEXT:    por %xmm13, %xmm2
3297; SSSE3-NEXT:    packuswb %xmm3, %xmm2
3298; SSSE3-NEXT:    packuswb %xmm2, %xmm0
3299; SSSE3-NEXT:    movdqa %xmm12, %xmm1
3300; SSSE3-NEXT:    pxor %xmm4, %xmm1
3301; SSSE3-NEXT:    movdqa %xmm14, %xmm2
3302; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
3303; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
3304; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm1
3305; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3306; SSSE3-NEXT:    pand %xmm3, %xmm1
3307; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3308; SSSE3-NEXT:    por %xmm1, %xmm2
3309; SSSE3-NEXT:    pand %xmm2, %xmm12
3310; SSSE3-NEXT:    pandn %xmm8, %xmm2
3311; SSSE3-NEXT:    por %xmm12, %xmm2
3312; SSSE3-NEXT:    movdqa %xmm11, %xmm1
3313; SSSE3-NEXT:    pxor %xmm4, %xmm1
3314; SSSE3-NEXT:    movdqa %xmm14, %xmm3
3315; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
3316; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
3317; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm1
3318; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
3319; SSSE3-NEXT:    pand %xmm5, %xmm6
3320; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
3321; SSSE3-NEXT:    por %xmm6, %xmm1
3322; SSSE3-NEXT:    pand %xmm1, %xmm11
3323; SSSE3-NEXT:    pandn %xmm8, %xmm1
3324; SSSE3-NEXT:    por %xmm11, %xmm1
3325; SSSE3-NEXT:    packuswb %xmm2, %xmm1
3326; SSSE3-NEXT:    movdqa %xmm10, %xmm2
3327; SSSE3-NEXT:    pxor %xmm4, %xmm2
3328; SSSE3-NEXT:    movdqa %xmm14, %xmm3
3329; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
3330; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
3331; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm2
3332; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3333; SSSE3-NEXT:    pand %xmm5, %xmm2
3334; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3335; SSSE3-NEXT:    por %xmm2, %xmm3
3336; SSSE3-NEXT:    pand %xmm3, %xmm10
3337; SSSE3-NEXT:    pandn %xmm8, %xmm3
3338; SSSE3-NEXT:    por %xmm10, %xmm3
3339; SSSE3-NEXT:    pxor %xmm9, %xmm4
3340; SSSE3-NEXT:    movdqa %xmm14, %xmm2
3341; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm2
3342; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
3343; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm4
3344; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3345; SSSE3-NEXT:    pand %xmm5, %xmm4
3346; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3347; SSSE3-NEXT:    por %xmm4, %xmm2
3348; SSSE3-NEXT:    pand %xmm2, %xmm9
3349; SSSE3-NEXT:    pandn %xmm8, %xmm2
3350; SSSE3-NEXT:    por %xmm9, %xmm2
3351; SSSE3-NEXT:    packuswb %xmm3, %xmm2
3352; SSSE3-NEXT:    packuswb %xmm2, %xmm1
3353; SSSE3-NEXT:    packuswb %xmm1, %xmm0
3354; SSSE3-NEXT:    retq
3355;
3356; SSE41-LABEL: trunc_usat_v16i64_v16i8:
3357; SSE41:       # %bb.0:
3358; SSE41-NEXT:    movdqa 96(%rdi), %xmm8
3359; SSE41-NEXT:    movdqa 112(%rdi), %xmm9
3360; SSE41-NEXT:    movdqa 64(%rdi), %xmm10
3361; SSE41-NEXT:    movdqa 80(%rdi), %xmm11
3362; SSE41-NEXT:    movdqa (%rdi), %xmm2
3363; SSE41-NEXT:    movdqa 16(%rdi), %xmm1
3364; SSE41-NEXT:    movdqa 32(%rdi), %xmm12
3365; SSE41-NEXT:    movdqa 48(%rdi), %xmm13
3366; SSE41-NEXT:    movapd {{.*#+}} xmm3 = [255,255]
3367; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
3368; SSE41-NEXT:    movdqa %xmm1, %xmm0
3369; SSE41-NEXT:    pxor %xmm6, %xmm0
3370; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259711,9223372039002259711]
3371; SSE41-NEXT:    movdqa %xmm4, %xmm7
3372; SSE41-NEXT:    pcmpeqd %xmm0, %xmm7
3373; SSE41-NEXT:    movdqa %xmm4, %xmm5
3374; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
3375; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
3376; SSE41-NEXT:    pand %xmm7, %xmm0
3377; SSE41-NEXT:    por %xmm5, %xmm0
3378; SSE41-NEXT:    movapd %xmm3, %xmm5
3379; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
3380; SSE41-NEXT:    movdqa %xmm2, %xmm0
3381; SSE41-NEXT:    pxor %xmm6, %xmm0
3382; SSE41-NEXT:    movdqa %xmm4, %xmm1
3383; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
3384; SSE41-NEXT:    movdqa %xmm4, %xmm7
3385; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
3386; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
3387; SSE41-NEXT:    pand %xmm1, %xmm0
3388; SSE41-NEXT:    por %xmm7, %xmm0
3389; SSE41-NEXT:    movapd %xmm3, %xmm1
3390; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
3391; SSE41-NEXT:    packusdw %xmm5, %xmm1
3392; SSE41-NEXT:    movdqa %xmm13, %xmm0
3393; SSE41-NEXT:    pxor %xmm6, %xmm0
3394; SSE41-NEXT:    movdqa %xmm4, %xmm2
3395; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
3396; SSE41-NEXT:    movdqa %xmm4, %xmm5
3397; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
3398; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
3399; SSE41-NEXT:    pand %xmm2, %xmm0
3400; SSE41-NEXT:    por %xmm5, %xmm0
3401; SSE41-NEXT:    movapd %xmm3, %xmm2
3402; SSE41-NEXT:    blendvpd %xmm0, %xmm13, %xmm2
3403; SSE41-NEXT:    movdqa %xmm12, %xmm0
3404; SSE41-NEXT:    pxor %xmm6, %xmm0
3405; SSE41-NEXT:    movdqa %xmm4, %xmm5
3406; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
3407; SSE41-NEXT:    movdqa %xmm4, %xmm7
3408; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
3409; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
3410; SSE41-NEXT:    pand %xmm5, %xmm0
3411; SSE41-NEXT:    por %xmm7, %xmm0
3412; SSE41-NEXT:    movapd %xmm3, %xmm5
3413; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm5
3414; SSE41-NEXT:    packusdw %xmm2, %xmm5
3415; SSE41-NEXT:    packusdw %xmm5, %xmm1
3416; SSE41-NEXT:    movdqa %xmm11, %xmm0
3417; SSE41-NEXT:    pxor %xmm6, %xmm0
3418; SSE41-NEXT:    movdqa %xmm4, %xmm2
3419; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
3420; SSE41-NEXT:    movdqa %xmm4, %xmm5
3421; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
3422; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
3423; SSE41-NEXT:    pand %xmm2, %xmm0
3424; SSE41-NEXT:    por %xmm5, %xmm0
3425; SSE41-NEXT:    movapd %xmm3, %xmm5
3426; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm5
3427; SSE41-NEXT:    movdqa %xmm10, %xmm0
3428; SSE41-NEXT:    pxor %xmm6, %xmm0
3429; SSE41-NEXT:    movdqa %xmm4, %xmm2
3430; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
3431; SSE41-NEXT:    movdqa %xmm4, %xmm7
3432; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
3433; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
3434; SSE41-NEXT:    pand %xmm2, %xmm0
3435; SSE41-NEXT:    por %xmm7, %xmm0
3436; SSE41-NEXT:    movapd %xmm3, %xmm2
3437; SSE41-NEXT:    blendvpd %xmm0, %xmm10, %xmm2
3438; SSE41-NEXT:    packusdw %xmm5, %xmm2
3439; SSE41-NEXT:    movdqa %xmm9, %xmm0
3440; SSE41-NEXT:    pxor %xmm6, %xmm0
3441; SSE41-NEXT:    movdqa %xmm4, %xmm5
3442; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
3443; SSE41-NEXT:    movdqa %xmm4, %xmm7
3444; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
3445; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
3446; SSE41-NEXT:    pand %xmm5, %xmm0
3447; SSE41-NEXT:    por %xmm7, %xmm0
3448; SSE41-NEXT:    movapd %xmm3, %xmm5
3449; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm5
3450; SSE41-NEXT:    pxor %xmm8, %xmm6
3451; SSE41-NEXT:    movdqa %xmm4, %xmm7
3452; SSE41-NEXT:    pcmpeqd %xmm6, %xmm7
3453; SSE41-NEXT:    pcmpgtd %xmm6, %xmm4
3454; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
3455; SSE41-NEXT:    pand %xmm7, %xmm0
3456; SSE41-NEXT:    por %xmm4, %xmm0
3457; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm3
3458; SSE41-NEXT:    packusdw %xmm5, %xmm3
3459; SSE41-NEXT:    packusdw %xmm3, %xmm2
3460; SSE41-NEXT:    packuswb %xmm2, %xmm1
3461; SSE41-NEXT:    movdqa %xmm1, %xmm0
3462; SSE41-NEXT:    retq
3463;
3464; AVX1-LABEL: trunc_usat_v16i64_v16i8:
3465; AVX1:       # %bb.0:
3466; AVX1-NEXT:    vmovdqa (%rdi), %xmm12
3467; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm13
3468; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm15
3469; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm9
3470; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
3471; AVX1-NEXT:    vpxor %xmm4, %xmm12, %xmm5
3472; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [9223372036854776063,9223372036854776063]
3473; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm0
3474; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3475; AVX1-NEXT:    vpxor %xmm4, %xmm13, %xmm7
3476; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm0
3477; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3478; AVX1-NEXT:    vpxor %xmm4, %xmm15, %xmm5
3479; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm10
3480; AVX1-NEXT:    vpxor %xmm4, %xmm9, %xmm7
3481; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm11
3482; AVX1-NEXT:    vmovdqa 64(%rdi), %xmm5
3483; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm7
3484; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm14
3485; AVX1-NEXT:    vmovdqa 80(%rdi), %xmm3
3486; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm1
3487; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm6, %xmm1
3488; AVX1-NEXT:    vmovdqa 96(%rdi), %xmm7
3489; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm2
3490; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm6, %xmm2
3491; AVX1-NEXT:    vmovdqa 112(%rdi), %xmm0
3492; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm4
3493; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
3494; AVX1-NEXT:    vmovapd {{.*#+}} xmm6 = [255,255]
3495; AVX1-NEXT:    vblendvpd %xmm4, %xmm0, %xmm6, %xmm8
3496; AVX1-NEXT:    vblendvpd %xmm2, %xmm7, %xmm6, %xmm2
3497; AVX1-NEXT:    vblendvpd %xmm1, %xmm3, %xmm6, %xmm1
3498; AVX1-NEXT:    vblendvpd %xmm14, %xmm5, %xmm6, %xmm3
3499; AVX1-NEXT:    vblendvpd %xmm11, %xmm9, %xmm6, %xmm4
3500; AVX1-NEXT:    vblendvpd %xmm10, %xmm15, %xmm6, %xmm5
3501; AVX1-NEXT:    vmovapd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3502; AVX1-NEXT:    vblendvpd %xmm0, %xmm13, %xmm6, %xmm7
3503; AVX1-NEXT:    vmovapd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3504; AVX1-NEXT:    vblendvpd %xmm0, %xmm12, %xmm6, %xmm6
3505; AVX1-NEXT:    vpackusdw %xmm8, %xmm2, %xmm0
3506; AVX1-NEXT:    vpackusdw %xmm1, %xmm3, %xmm1
3507; AVX1-NEXT:    vpackusdw %xmm0, %xmm1, %xmm0
3508; AVX1-NEXT:    vpackusdw %xmm4, %xmm5, %xmm1
3509; AVX1-NEXT:    vpackusdw %xmm7, %xmm6, %xmm2
3510; AVX1-NEXT:    vpackusdw %xmm1, %xmm2, %xmm1
3511; AVX1-NEXT:    vpackuswb %xmm0, %xmm1, %xmm0
3512; AVX1-NEXT:    retq
3513;
3514; AVX2-LABEL: trunc_usat_v16i64_v16i8:
3515; AVX2:       # %bb.0:
3516; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
3517; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
3518; AVX2-NEXT:    vmovdqa 64(%rdi), %ymm2
3519; AVX2-NEXT:    vmovdqa 96(%rdi), %ymm3
3520; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm4 = [255,255,255,255]
3521; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
3522; AVX2-NEXT:    vpxor %ymm5, %ymm1, %ymm6
3523; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm7 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
3524; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm7, %ymm6
3525; AVX2-NEXT:    vblendvpd %ymm6, %ymm1, %ymm4, %ymm1
3526; AVX2-NEXT:    vpxor %ymm5, %ymm0, %ymm6
3527; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm7, %ymm6
3528; AVX2-NEXT:    vblendvpd %ymm6, %ymm0, %ymm4, %ymm0
3529; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
3530; AVX2-NEXT:    vpxor %ymm5, %ymm3, %ymm1
3531; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm7, %ymm1
3532; AVX2-NEXT:    vblendvpd %ymm1, %ymm3, %ymm4, %ymm1
3533; AVX2-NEXT:    vpxor %ymm5, %ymm2, %ymm3
3534; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm7, %ymm3
3535; AVX2-NEXT:    vblendvpd %ymm3, %ymm2, %ymm4, %ymm2
3536; AVX2-NEXT:    vpackusdw %ymm1, %ymm2, %ymm1
3537; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
3538; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
3539; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
3540; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
3541; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
3542; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
3543; AVX2-NEXT:    vzeroupper
3544; AVX2-NEXT:    retq
3545;
3546; AVX512F-LABEL: trunc_usat_v16i64_v16i8:
3547; AVX512F:       # %bb.0:
3548; AVX512F-NEXT:    vpbroadcastq {{.*#+}} zmm0 = [255,255,255,255,255,255,255,255]
3549; AVX512F-NEXT:    vpminuq 64(%rdi), %zmm0, %zmm1
3550; AVX512F-NEXT:    vpminuq (%rdi), %zmm0, %zmm0
3551; AVX512F-NEXT:    vpmovqd %zmm0, %ymm0
3552; AVX512F-NEXT:    vpmovqd %zmm1, %ymm1
3553; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
3554; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
3555; AVX512F-NEXT:    vzeroupper
3556; AVX512F-NEXT:    retq
3557;
3558; AVX512VL-LABEL: trunc_usat_v16i64_v16i8:
3559; AVX512VL:       # %bb.0:
3560; AVX512VL-NEXT:    vmovdqa64 (%rdi), %zmm0
3561; AVX512VL-NEXT:    vmovdqa64 64(%rdi), %zmm1
3562; AVX512VL-NEXT:    vpmovusqb %zmm1, %xmm1
3563; AVX512VL-NEXT:    vpmovusqb %zmm0, %xmm0
3564; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3565; AVX512VL-NEXT:    vzeroupper
3566; AVX512VL-NEXT:    retq
3567;
3568; AVX512BW-LABEL: trunc_usat_v16i64_v16i8:
3569; AVX512BW:       # %bb.0:
3570; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} zmm0 = [255,255,255,255,255,255,255,255]
3571; AVX512BW-NEXT:    vpminuq 64(%rdi), %zmm0, %zmm1
3572; AVX512BW-NEXT:    vpminuq (%rdi), %zmm0, %zmm0
3573; AVX512BW-NEXT:    vpmovqd %zmm0, %ymm0
3574; AVX512BW-NEXT:    vpmovqd %zmm1, %ymm1
3575; AVX512BW-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
3576; AVX512BW-NEXT:    vpmovdb %zmm0, %xmm0
3577; AVX512BW-NEXT:    vzeroupper
3578; AVX512BW-NEXT:    retq
3579;
3580; AVX512BWVL-LABEL: trunc_usat_v16i64_v16i8:
3581; AVX512BWVL:       # %bb.0:
3582; AVX512BWVL-NEXT:    vmovdqa64 (%rdi), %zmm0
3583; AVX512BWVL-NEXT:    vmovdqa64 64(%rdi), %zmm1
3584; AVX512BWVL-NEXT:    vpmovusqb %zmm1, %xmm1
3585; AVX512BWVL-NEXT:    vpmovusqb %zmm0, %xmm0
3586; AVX512BWVL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3587; AVX512BWVL-NEXT:    vzeroupper
3588; AVX512BWVL-NEXT:    retq
3589;
3590; SKX-LABEL: trunc_usat_v16i64_v16i8:
3591; SKX:       # %bb.0:
3592; SKX-NEXT:    vmovdqa64 (%rdi), %zmm0
3593; SKX-NEXT:    vmovdqa64 64(%rdi), %zmm1
3594; SKX-NEXT:    vpmovusqb %zmm1, %xmm1
3595; SKX-NEXT:    vpmovusqb %zmm0, %xmm0
3596; SKX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3597; SKX-NEXT:    vzeroupper
3598; SKX-NEXT:    retq
3599  %a0 = load <16 x i64>, <16 x i64>* %p0
3600  %1 = icmp ult <16 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
3601  %2 = select <16 x i1> %1, <16 x i64> %a0, <16 x i64> <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
3602  %3 = trunc <16 x i64> %2 to <16 x i8>
3603  ret <16 x i8> %3
3604}
3605
3606define <4 x i8> @trunc_usat_v4i32_v4i8(<4 x i32> %a0) {
3607; SSE2-LABEL: trunc_usat_v4i32_v4i8:
3608; SSE2:       # %bb.0:
3609; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
3610; SSE2-NEXT:    pxor %xmm0, %xmm2
3611; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483903,2147483903,2147483903,2147483903]
3612; SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
3613; SSE2-NEXT:    pand %xmm1, %xmm0
3614; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm1
3615; SSE2-NEXT:    por %xmm0, %xmm1
3616; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
3617; SSE2-NEXT:    packuswb %xmm1, %xmm1
3618; SSE2-NEXT:    packuswb %xmm1, %xmm1
3619; SSE2-NEXT:    movdqa %xmm1, %xmm0
3620; SSE2-NEXT:    retq
3621;
3622; SSSE3-LABEL: trunc_usat_v4i32_v4i8:
3623; SSSE3:       # %bb.0:
3624; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
3625; SSSE3-NEXT:    pxor %xmm0, %xmm1
3626; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483903,2147483903,2147483903,2147483903]
3627; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
3628; SSSE3-NEXT:    pand %xmm2, %xmm0
3629; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
3630; SSSE3-NEXT:    por %xmm2, %xmm0
3631; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
3632; SSSE3-NEXT:    retq
3633;
3634; SSE41-LABEL: trunc_usat_v4i32_v4i8:
3635; SSE41:       # %bb.0:
3636; SSE41-NEXT:    pminud {{.*}}(%rip), %xmm0
3637; SSE41-NEXT:    packusdw %xmm0, %xmm0
3638; SSE41-NEXT:    packuswb %xmm0, %xmm0
3639; SSE41-NEXT:    retq
3640;
3641; AVX1-LABEL: trunc_usat_v4i32_v4i8:
3642; AVX1:       # %bb.0:
3643; AVX1-NEXT:    vpminud {{.*}}(%rip), %xmm0, %xmm0
3644; AVX1-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
3645; AVX1-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
3646; AVX1-NEXT:    retq
3647;
3648; AVX2-LABEL: trunc_usat_v4i32_v4i8:
3649; AVX2:       # %bb.0:
3650; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [255,255,255,255]
3651; AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
3652; AVX2-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
3653; AVX2-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
3654; AVX2-NEXT:    retq
3655;
3656; AVX512F-LABEL: trunc_usat_v4i32_v4i8:
3657; AVX512F:       # %bb.0:
3658; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
3659; AVX512F-NEXT:    vpmovusdb %zmm0, %xmm0
3660; AVX512F-NEXT:    vzeroupper
3661; AVX512F-NEXT:    retq
3662;
3663; AVX512VL-LABEL: trunc_usat_v4i32_v4i8:
3664; AVX512VL:       # %bb.0:
3665; AVX512VL-NEXT:    vpmovusdb %xmm0, %xmm0
3666; AVX512VL-NEXT:    retq
3667;
3668; AVX512BW-LABEL: trunc_usat_v4i32_v4i8:
3669; AVX512BW:       # %bb.0:
3670; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
3671; AVX512BW-NEXT:    vpmovusdb %zmm0, %xmm0
3672; AVX512BW-NEXT:    vzeroupper
3673; AVX512BW-NEXT:    retq
3674;
3675; AVX512BWVL-LABEL: trunc_usat_v4i32_v4i8:
3676; AVX512BWVL:       # %bb.0:
3677; AVX512BWVL-NEXT:    vpmovusdb %xmm0, %xmm0
3678; AVX512BWVL-NEXT:    retq
3679;
3680; SKX-LABEL: trunc_usat_v4i32_v4i8:
3681; SKX:       # %bb.0:
3682; SKX-NEXT:    vpmovusdb %xmm0, %xmm0
3683; SKX-NEXT:    retq
3684  %1 = icmp ult <4 x i32> %a0, <i32 255, i32 255, i32 255, i32 255>
3685  %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 255, i32 255, i32 255, i32 255>
3686  %3 = trunc <4 x i32> %2 to <4 x i8>
3687  ret <4 x i8> %3
3688}
3689
3690define void @trunc_usat_v4i32_v4i8_store(<4 x i32> %a0, <4 x i8> *%p1) {
3691; SSE2-LABEL: trunc_usat_v4i32_v4i8_store:
3692; SSE2:       # %bb.0:
3693; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
3694; SSE2-NEXT:    pxor %xmm0, %xmm1
3695; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483903,2147483903,2147483903,2147483903]
3696; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
3697; SSE2-NEXT:    pand %xmm2, %xmm0
3698; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
3699; SSE2-NEXT:    por %xmm0, %xmm2
3700; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
3701; SSE2-NEXT:    packuswb %xmm0, %xmm2
3702; SSE2-NEXT:    packuswb %xmm0, %xmm2
3703; SSE2-NEXT:    movd %xmm2, (%rdi)
3704; SSE2-NEXT:    retq
3705;
3706; SSSE3-LABEL: trunc_usat_v4i32_v4i8_store:
3707; SSSE3:       # %bb.0:
3708; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
3709; SSSE3-NEXT:    pxor %xmm0, %xmm1
3710; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483903,2147483903,2147483903,2147483903]
3711; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
3712; SSSE3-NEXT:    pand %xmm2, %xmm0
3713; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
3714; SSSE3-NEXT:    por %xmm0, %xmm2
3715; SSSE3-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
3716; SSSE3-NEXT:    movd %xmm2, (%rdi)
3717; SSSE3-NEXT:    retq
3718;
3719; SSE41-LABEL: trunc_usat_v4i32_v4i8_store:
3720; SSE41:       # %bb.0:
3721; SSE41-NEXT:    pminud {{.*}}(%rip), %xmm0
3722; SSE41-NEXT:    packusdw %xmm0, %xmm0
3723; SSE41-NEXT:    packuswb %xmm0, %xmm0
3724; SSE41-NEXT:    movd %xmm0, (%rdi)
3725; SSE41-NEXT:    retq
3726;
3727; AVX1-LABEL: trunc_usat_v4i32_v4i8_store:
3728; AVX1:       # %bb.0:
3729; AVX1-NEXT:    vpminud {{.*}}(%rip), %xmm0, %xmm0
3730; AVX1-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
3731; AVX1-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
3732; AVX1-NEXT:    vmovd %xmm0, (%rdi)
3733; AVX1-NEXT:    retq
3734;
3735; AVX2-LABEL: trunc_usat_v4i32_v4i8_store:
3736; AVX2:       # %bb.0:
3737; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [255,255,255,255]
3738; AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
3739; AVX2-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
3740; AVX2-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
3741; AVX2-NEXT:    vmovd %xmm0, (%rdi)
3742; AVX2-NEXT:    retq
3743;
3744; AVX512F-LABEL: trunc_usat_v4i32_v4i8_store:
3745; AVX512F:       # %bb.0:
3746; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
3747; AVX512F-NEXT:    vpmovusdb %zmm0, %xmm0
3748; AVX512F-NEXT:    vmovd %xmm0, (%rdi)
3749; AVX512F-NEXT:    vzeroupper
3750; AVX512F-NEXT:    retq
3751;
3752; AVX512VL-LABEL: trunc_usat_v4i32_v4i8_store:
3753; AVX512VL:       # %bb.0:
3754; AVX512VL-NEXT:    vpmovusdb %xmm0, (%rdi)
3755; AVX512VL-NEXT:    retq
3756;
3757; AVX512BW-LABEL: trunc_usat_v4i32_v4i8_store:
3758; AVX512BW:       # %bb.0:
3759; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
3760; AVX512BW-NEXT:    vpmovusdb %zmm0, %xmm0
3761; AVX512BW-NEXT:    vmovd %xmm0, (%rdi)
3762; AVX512BW-NEXT:    vzeroupper
3763; AVX512BW-NEXT:    retq
3764;
3765; AVX512BWVL-LABEL: trunc_usat_v4i32_v4i8_store:
3766; AVX512BWVL:       # %bb.0:
3767; AVX512BWVL-NEXT:    vpmovusdb %xmm0, (%rdi)
3768; AVX512BWVL-NEXT:    retq
3769;
3770; SKX-LABEL: trunc_usat_v4i32_v4i8_store:
3771; SKX:       # %bb.0:
3772; SKX-NEXT:    vpmovusdb %xmm0, (%rdi)
3773; SKX-NEXT:    retq
3774  %1 = icmp ult <4 x i32> %a0, <i32 255, i32 255, i32 255, i32 255>
3775  %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 255, i32 255, i32 255, i32 255>
3776  %3 = trunc <4 x i32> %2 to <4 x i8>
3777  store <4 x i8> %3, <4 x i8> *%p1
3778  ret void
3779}
3780
3781define <8 x i8> @trunc_usat_v8i32_v8i8(<8 x i32> %a0) {
3782; SSE2-LABEL: trunc_usat_v8i32_v8i8:
3783; SSE2:       # %bb.0:
3784; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
3785; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
3786; SSE2-NEXT:    movdqa %xmm1, %xmm4
3787; SSE2-NEXT:    pxor %xmm3, %xmm4
3788; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
3789; SSE2-NEXT:    movdqa %xmm5, %xmm6
3790; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
3791; SSE2-NEXT:    pand %xmm6, %xmm1
3792; SSE2-NEXT:    pandn %xmm2, %xmm6
3793; SSE2-NEXT:    por %xmm1, %xmm6
3794; SSE2-NEXT:    pxor %xmm0, %xmm3
3795; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
3796; SSE2-NEXT:    pand %xmm5, %xmm0
3797; SSE2-NEXT:    pandn %xmm2, %xmm5
3798; SSE2-NEXT:    por %xmm5, %xmm0
3799; SSE2-NEXT:    packuswb %xmm6, %xmm0
3800; SSE2-NEXT:    packuswb %xmm0, %xmm0
3801; SSE2-NEXT:    retq
3802;
3803; SSSE3-LABEL: trunc_usat_v8i32_v8i8:
3804; SSSE3:       # %bb.0:
3805; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
3806; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
3807; SSSE3-NEXT:    movdqa %xmm1, %xmm4
3808; SSSE3-NEXT:    pxor %xmm3, %xmm4
3809; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
3810; SSSE3-NEXT:    movdqa %xmm5, %xmm6
3811; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
3812; SSSE3-NEXT:    pand %xmm6, %xmm1
3813; SSSE3-NEXT:    pandn %xmm2, %xmm6
3814; SSSE3-NEXT:    por %xmm1, %xmm6
3815; SSSE3-NEXT:    pxor %xmm0, %xmm3
3816; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
3817; SSSE3-NEXT:    pand %xmm5, %xmm0
3818; SSSE3-NEXT:    pandn %xmm2, %xmm5
3819; SSSE3-NEXT:    por %xmm5, %xmm0
3820; SSSE3-NEXT:    packuswb %xmm6, %xmm0
3821; SSSE3-NEXT:    packuswb %xmm0, %xmm0
3822; SSSE3-NEXT:    retq
3823;
3824; SSE41-LABEL: trunc_usat_v8i32_v8i8:
3825; SSE41:       # %bb.0:
3826; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
3827; SSE41-NEXT:    pminud %xmm2, %xmm1
3828; SSE41-NEXT:    pminud %xmm2, %xmm0
3829; SSE41-NEXT:    packusdw %xmm1, %xmm0
3830; SSE41-NEXT:    packuswb %xmm0, %xmm0
3831; SSE41-NEXT:    retq
3832;
3833; AVX1-LABEL: trunc_usat_v8i32_v8i8:
3834; AVX1:       # %bb.0:
3835; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
3836; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,255]
3837; AVX1-NEXT:    vpminud %xmm2, %xmm1, %xmm1
3838; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
3839; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
3840; AVX1-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
3841; AVX1-NEXT:    vzeroupper
3842; AVX1-NEXT:    retq
3843;
3844; AVX2-LABEL: trunc_usat_v8i32_v8i8:
3845; AVX2:       # %bb.0:
3846; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
3847; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
3848; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
3849; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
3850; AVX2-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
3851; AVX2-NEXT:    vzeroupper
3852; AVX2-NEXT:    retq
3853;
3854; AVX512F-LABEL: trunc_usat_v8i32_v8i8:
3855; AVX512F:       # %bb.0:
3856; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
3857; AVX512F-NEXT:    vpmovusdb %zmm0, %xmm0
3858; AVX512F-NEXT:    vzeroupper
3859; AVX512F-NEXT:    retq
3860;
3861; AVX512VL-LABEL: trunc_usat_v8i32_v8i8:
3862; AVX512VL:       # %bb.0:
3863; AVX512VL-NEXT:    vpmovusdb %ymm0, %xmm0
3864; AVX512VL-NEXT:    vzeroupper
3865; AVX512VL-NEXT:    retq
3866;
3867; AVX512BW-LABEL: trunc_usat_v8i32_v8i8:
3868; AVX512BW:       # %bb.0:
3869; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
3870; AVX512BW-NEXT:    vpmovusdb %zmm0, %xmm0
3871; AVX512BW-NEXT:    vzeroupper
3872; AVX512BW-NEXT:    retq
3873;
3874; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i8:
3875; AVX512BWVL:       # %bb.0:
3876; AVX512BWVL-NEXT:    vpmovusdb %ymm0, %xmm0
3877; AVX512BWVL-NEXT:    vzeroupper
3878; AVX512BWVL-NEXT:    retq
3879;
3880; SKX-LABEL: trunc_usat_v8i32_v8i8:
3881; SKX:       # %bb.0:
3882; SKX-NEXT:    vpmovusdb %ymm0, %xmm0
3883; SKX-NEXT:    vzeroupper
3884; SKX-NEXT:    retq
3885  %1 = icmp ult <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
3886  %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
3887  %3 = trunc <8 x i32> %2 to <8 x i8>
3888  ret <8 x i8> %3
3889}
3890
3891define void @trunc_usat_v8i32_v8i8_store(<8 x i32> %a0, <8 x i8> *%p1) {
3892; SSE2-LABEL: trunc_usat_v8i32_v8i8_store:
3893; SSE2:       # %bb.0:
3894; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
3895; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
3896; SSE2-NEXT:    movdqa %xmm1, %xmm4
3897; SSE2-NEXT:    pxor %xmm3, %xmm4
3898; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
3899; SSE2-NEXT:    movdqa %xmm5, %xmm6
3900; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
3901; SSE2-NEXT:    pand %xmm6, %xmm1
3902; SSE2-NEXT:    pandn %xmm2, %xmm6
3903; SSE2-NEXT:    por %xmm1, %xmm6
3904; SSE2-NEXT:    pxor %xmm0, %xmm3
3905; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
3906; SSE2-NEXT:    pand %xmm5, %xmm0
3907; SSE2-NEXT:    pandn %xmm2, %xmm5
3908; SSE2-NEXT:    por %xmm0, %xmm5
3909; SSE2-NEXT:    packuswb %xmm6, %xmm5
3910; SSE2-NEXT:    packuswb %xmm0, %xmm5
3911; SSE2-NEXT:    movq %xmm5, (%rdi)
3912; SSE2-NEXT:    retq
3913;
3914; SSSE3-LABEL: trunc_usat_v8i32_v8i8_store:
3915; SSSE3:       # %bb.0:
3916; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
3917; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
3918; SSSE3-NEXT:    movdqa %xmm1, %xmm4
3919; SSSE3-NEXT:    pxor %xmm3, %xmm4
3920; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
3921; SSSE3-NEXT:    movdqa %xmm5, %xmm6
3922; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
3923; SSSE3-NEXT:    pand %xmm6, %xmm1
3924; SSSE3-NEXT:    pandn %xmm2, %xmm6
3925; SSSE3-NEXT:    por %xmm1, %xmm6
3926; SSSE3-NEXT:    pxor %xmm0, %xmm3
3927; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
3928; SSSE3-NEXT:    pand %xmm5, %xmm0
3929; SSSE3-NEXT:    pandn %xmm2, %xmm5
3930; SSSE3-NEXT:    por %xmm0, %xmm5
3931; SSSE3-NEXT:    packuswb %xmm6, %xmm5
3932; SSSE3-NEXT:    packuswb %xmm0, %xmm5
3933; SSSE3-NEXT:    movq %xmm5, (%rdi)
3934; SSSE3-NEXT:    retq
3935;
3936; SSE41-LABEL: trunc_usat_v8i32_v8i8_store:
3937; SSE41:       # %bb.0:
3938; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
3939; SSE41-NEXT:    pminud %xmm2, %xmm1
3940; SSE41-NEXT:    pminud %xmm2, %xmm0
3941; SSE41-NEXT:    packusdw %xmm1, %xmm0
3942; SSE41-NEXT:    packuswb %xmm0, %xmm0
3943; SSE41-NEXT:    movq %xmm0, (%rdi)
3944; SSE41-NEXT:    retq
3945;
3946; AVX1-LABEL: trunc_usat_v8i32_v8i8_store:
3947; AVX1:       # %bb.0:
3948; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
3949; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,255]
3950; AVX1-NEXT:    vpminud %xmm2, %xmm1, %xmm1
3951; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
3952; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
3953; AVX1-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
3954; AVX1-NEXT:    vmovq %xmm0, (%rdi)
3955; AVX1-NEXT:    vzeroupper
3956; AVX1-NEXT:    retq
3957;
3958; AVX2-LABEL: trunc_usat_v8i32_v8i8_store:
3959; AVX2:       # %bb.0:
3960; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
3961; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
3962; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
3963; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
3964; AVX2-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
3965; AVX2-NEXT:    vmovq %xmm0, (%rdi)
3966; AVX2-NEXT:    vzeroupper
3967; AVX2-NEXT:    retq
3968;
3969; AVX512F-LABEL: trunc_usat_v8i32_v8i8_store:
3970; AVX512F:       # %bb.0:
3971; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
3972; AVX512F-NEXT:    vpmovusdb %zmm0, %xmm0
3973; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
3974; AVX512F-NEXT:    vzeroupper
3975; AVX512F-NEXT:    retq
3976;
3977; AVX512VL-LABEL: trunc_usat_v8i32_v8i8_store:
3978; AVX512VL:       # %bb.0:
3979; AVX512VL-NEXT:    vpmovusdb %ymm0, (%rdi)
3980; AVX512VL-NEXT:    vzeroupper
3981; AVX512VL-NEXT:    retq
3982;
3983; AVX512BW-LABEL: trunc_usat_v8i32_v8i8_store:
3984; AVX512BW:       # %bb.0:
3985; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
3986; AVX512BW-NEXT:    vpmovusdb %zmm0, %xmm0
3987; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
3988; AVX512BW-NEXT:    vzeroupper
3989; AVX512BW-NEXT:    retq
3990;
3991; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i8_store:
3992; AVX512BWVL:       # %bb.0:
3993; AVX512BWVL-NEXT:    vpmovusdb %ymm0, (%rdi)
3994; AVX512BWVL-NEXT:    vzeroupper
3995; AVX512BWVL-NEXT:    retq
3996;
3997; SKX-LABEL: trunc_usat_v8i32_v8i8_store:
3998; SKX:       # %bb.0:
3999; SKX-NEXT:    vpmovusdb %ymm0, (%rdi)
4000; SKX-NEXT:    vzeroupper
4001; SKX-NEXT:    retq
4002  %1 = icmp ult <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
4003  %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
4004  %3 = trunc <8 x i32> %2 to <8 x i8>
4005  store <8 x i8> %3, <8 x i8> *%p1
4006  ret void
4007}
4008
4009define <16 x i8> @trunc_usat_v16i32_v16i8(<16 x i32>* %p0) {
4010; SSE2-LABEL: trunc_usat_v16i32_v16i8:
4011; SSE2:       # %bb.0:
4012; SSE2-NEXT:    movdqa (%rdi), %xmm6
4013; SSE2-NEXT:    movdqa 16(%rdi), %xmm0
4014; SSE2-NEXT:    movdqa 32(%rdi), %xmm1
4015; SSE2-NEXT:    movdqa 48(%rdi), %xmm5
4016; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255,255,255]
4017; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
4018; SSE2-NEXT:    movdqa %xmm0, %xmm7
4019; SSE2-NEXT:    pxor %xmm4, %xmm7
4020; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483903,2147483903,2147483903,2147483903]
4021; SSE2-NEXT:    movdqa %xmm3, %xmm2
4022; SSE2-NEXT:    pcmpgtd %xmm7, %xmm2
4023; SSE2-NEXT:    pand %xmm2, %xmm0
4024; SSE2-NEXT:    pandn %xmm8, %xmm2
4025; SSE2-NEXT:    por %xmm0, %xmm2
4026; SSE2-NEXT:    movdqa %xmm6, %xmm7
4027; SSE2-NEXT:    pxor %xmm4, %xmm7
4028; SSE2-NEXT:    movdqa %xmm3, %xmm0
4029; SSE2-NEXT:    pcmpgtd %xmm7, %xmm0
4030; SSE2-NEXT:    pand %xmm0, %xmm6
4031; SSE2-NEXT:    pandn %xmm8, %xmm0
4032; SSE2-NEXT:    por %xmm6, %xmm0
4033; SSE2-NEXT:    packuswb %xmm2, %xmm0
4034; SSE2-NEXT:    movdqa %xmm5, %xmm2
4035; SSE2-NEXT:    pxor %xmm4, %xmm2
4036; SSE2-NEXT:    movdqa %xmm3, %xmm6
4037; SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
4038; SSE2-NEXT:    pand %xmm6, %xmm5
4039; SSE2-NEXT:    pandn %xmm8, %xmm6
4040; SSE2-NEXT:    por %xmm5, %xmm6
4041; SSE2-NEXT:    pxor %xmm1, %xmm4
4042; SSE2-NEXT:    pcmpgtd %xmm4, %xmm3
4043; SSE2-NEXT:    pand %xmm3, %xmm1
4044; SSE2-NEXT:    pandn %xmm8, %xmm3
4045; SSE2-NEXT:    por %xmm1, %xmm3
4046; SSE2-NEXT:    packuswb %xmm6, %xmm3
4047; SSE2-NEXT:    packuswb %xmm3, %xmm0
4048; SSE2-NEXT:    retq
4049;
4050; SSSE3-LABEL: trunc_usat_v16i32_v16i8:
4051; SSSE3:       # %bb.0:
4052; SSSE3-NEXT:    movdqa (%rdi), %xmm6
4053; SSSE3-NEXT:    movdqa 16(%rdi), %xmm0
4054; SSSE3-NEXT:    movdqa 32(%rdi), %xmm1
4055; SSSE3-NEXT:    movdqa 48(%rdi), %xmm5
4056; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255,255,255]
4057; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
4058; SSSE3-NEXT:    movdqa %xmm0, %xmm7
4059; SSSE3-NEXT:    pxor %xmm4, %xmm7
4060; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483903,2147483903,2147483903,2147483903]
4061; SSSE3-NEXT:    movdqa %xmm3, %xmm2
4062; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm2
4063; SSSE3-NEXT:    pand %xmm2, %xmm0
4064; SSSE3-NEXT:    pandn %xmm8, %xmm2
4065; SSSE3-NEXT:    por %xmm0, %xmm2
4066; SSSE3-NEXT:    movdqa %xmm6, %xmm7
4067; SSSE3-NEXT:    pxor %xmm4, %xmm7
4068; SSSE3-NEXT:    movdqa %xmm3, %xmm0
4069; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm0
4070; SSSE3-NEXT:    pand %xmm0, %xmm6
4071; SSSE3-NEXT:    pandn %xmm8, %xmm0
4072; SSSE3-NEXT:    por %xmm6, %xmm0
4073; SSSE3-NEXT:    packuswb %xmm2, %xmm0
4074; SSSE3-NEXT:    movdqa %xmm5, %xmm2
4075; SSSE3-NEXT:    pxor %xmm4, %xmm2
4076; SSSE3-NEXT:    movdqa %xmm3, %xmm6
4077; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm6
4078; SSSE3-NEXT:    pand %xmm6, %xmm5
4079; SSSE3-NEXT:    pandn %xmm8, %xmm6
4080; SSSE3-NEXT:    por %xmm5, %xmm6
4081; SSSE3-NEXT:    pxor %xmm1, %xmm4
4082; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm3
4083; SSSE3-NEXT:    pand %xmm3, %xmm1
4084; SSSE3-NEXT:    pandn %xmm8, %xmm3
4085; SSSE3-NEXT:    por %xmm1, %xmm3
4086; SSSE3-NEXT:    packuswb %xmm6, %xmm3
4087; SSSE3-NEXT:    packuswb %xmm3, %xmm0
4088; SSSE3-NEXT:    retq
4089;
4090; SSE41-LABEL: trunc_usat_v16i32_v16i8:
4091; SSE41:       # %bb.0:
4092; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255]
4093; SSE41-NEXT:    movdqa 16(%rdi), %xmm2
4094; SSE41-NEXT:    pminud %xmm1, %xmm2
4095; SSE41-NEXT:    movdqa (%rdi), %xmm0
4096; SSE41-NEXT:    pminud %xmm1, %xmm0
4097; SSE41-NEXT:    packusdw %xmm2, %xmm0
4098; SSE41-NEXT:    movdqa 48(%rdi), %xmm2
4099; SSE41-NEXT:    pminud %xmm1, %xmm2
4100; SSE41-NEXT:    pminud 32(%rdi), %xmm1
4101; SSE41-NEXT:    packusdw %xmm2, %xmm1
4102; SSE41-NEXT:    packuswb %xmm1, %xmm0
4103; SSE41-NEXT:    retq
4104;
4105; AVX1-LABEL: trunc_usat_v16i32_v16i8:
4106; AVX1:       # %bb.0:
4107; AVX1-NEXT:    vmovdqa {{.*#+}} xmm0 = [255,255,255,255]
4108; AVX1-NEXT:    vpminud 16(%rdi), %xmm0, %xmm1
4109; AVX1-NEXT:    vpminud (%rdi), %xmm0, %xmm2
4110; AVX1-NEXT:    vpackusdw %xmm1, %xmm2, %xmm1
4111; AVX1-NEXT:    vpminud 48(%rdi), %xmm0, %xmm2
4112; AVX1-NEXT:    vpminud 32(%rdi), %xmm0, %xmm0
4113; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
4114; AVX1-NEXT:    vpackuswb %xmm0, %xmm1, %xmm0
4115; AVX1-NEXT:    retq
4116;
4117; AVX2-LABEL: trunc_usat_v16i32_v16i8:
4118; AVX2:       # %bb.0:
4119; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255]
4120; AVX2-NEXT:    vpminud 32(%rdi), %ymm0, %ymm1
4121; AVX2-NEXT:    vpminud (%rdi), %ymm0, %ymm0
4122; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
4123; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4124; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
4125; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
4126; AVX2-NEXT:    vzeroupper
4127; AVX2-NEXT:    retq
4128;
4129; AVX512-LABEL: trunc_usat_v16i32_v16i8:
4130; AVX512:       # %bb.0:
4131; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
4132; AVX512-NEXT:    vpmovusdb %zmm0, %xmm0
4133; AVX512-NEXT:    vzeroupper
4134; AVX512-NEXT:    retq
4135;
4136; SKX-LABEL: trunc_usat_v16i32_v16i8:
4137; SKX:       # %bb.0:
4138; SKX-NEXT:    vmovdqa64 (%rdi), %zmm0
4139; SKX-NEXT:    vpmovusdb %zmm0, %xmm0
4140; SKX-NEXT:    vzeroupper
4141; SKX-NEXT:    retq
4142  %a0 = load <16 x i32>, <16 x i32>* %p0
4143  %1 = icmp ult <16 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
4144  %2 = select <16 x i1> %1, <16 x i32> %a0, <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>
4145  %3 = trunc <16 x i32> %2 to <16 x i8>
4146  ret <16 x i8> %3
4147}
4148
4149define void @trunc_usat_v16i32_v16i8_store(<16 x i32>* %p0, <16 x i8>* %p1) {
4150; SSE2-LABEL: trunc_usat_v16i32_v16i8_store:
4151; SSE2:       # %bb.0:
4152; SSE2-NEXT:    movdqa (%rdi), %xmm6
4153; SSE2-NEXT:    movdqa 16(%rdi), %xmm5
4154; SSE2-NEXT:    movdqa 32(%rdi), %xmm0
4155; SSE2-NEXT:    movdqa 48(%rdi), %xmm4
4156; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255,255,255]
4157; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
4158; SSE2-NEXT:    movdqa %xmm5, %xmm7
4159; SSE2-NEXT:    pxor %xmm3, %xmm7
4160; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483903,2147483903,2147483903,2147483903]
4161; SSE2-NEXT:    movdqa %xmm2, %xmm1
4162; SSE2-NEXT:    pcmpgtd %xmm7, %xmm1
4163; SSE2-NEXT:    pand %xmm1, %xmm5
4164; SSE2-NEXT:    pandn %xmm8, %xmm1
4165; SSE2-NEXT:    por %xmm5, %xmm1
4166; SSE2-NEXT:    movdqa %xmm6, %xmm7
4167; SSE2-NEXT:    pxor %xmm3, %xmm7
4168; SSE2-NEXT:    movdqa %xmm2, %xmm5
4169; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
4170; SSE2-NEXT:    pand %xmm5, %xmm6
4171; SSE2-NEXT:    pandn %xmm8, %xmm5
4172; SSE2-NEXT:    por %xmm6, %xmm5
4173; SSE2-NEXT:    packuswb %xmm1, %xmm5
4174; SSE2-NEXT:    movdqa %xmm4, %xmm1
4175; SSE2-NEXT:    pxor %xmm3, %xmm1
4176; SSE2-NEXT:    movdqa %xmm2, %xmm6
4177; SSE2-NEXT:    pcmpgtd %xmm1, %xmm6
4178; SSE2-NEXT:    pand %xmm6, %xmm4
4179; SSE2-NEXT:    pandn %xmm8, %xmm6
4180; SSE2-NEXT:    por %xmm4, %xmm6
4181; SSE2-NEXT:    pxor %xmm0, %xmm3
4182; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
4183; SSE2-NEXT:    pand %xmm2, %xmm0
4184; SSE2-NEXT:    pandn %xmm8, %xmm2
4185; SSE2-NEXT:    por %xmm0, %xmm2
4186; SSE2-NEXT:    packuswb %xmm6, %xmm2
4187; SSE2-NEXT:    packuswb %xmm2, %xmm5
4188; SSE2-NEXT:    movdqa %xmm5, (%rsi)
4189; SSE2-NEXT:    retq
4190;
4191; SSSE3-LABEL: trunc_usat_v16i32_v16i8_store:
4192; SSSE3:       # %bb.0:
4193; SSSE3-NEXT:    movdqa (%rdi), %xmm6
4194; SSSE3-NEXT:    movdqa 16(%rdi), %xmm5
4195; SSSE3-NEXT:    movdqa 32(%rdi), %xmm0
4196; SSSE3-NEXT:    movdqa 48(%rdi), %xmm4
4197; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255,255,255]
4198; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
4199; SSSE3-NEXT:    movdqa %xmm5, %xmm7
4200; SSSE3-NEXT:    pxor %xmm3, %xmm7
4201; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483903,2147483903,2147483903,2147483903]
4202; SSSE3-NEXT:    movdqa %xmm2, %xmm1
4203; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm1
4204; SSSE3-NEXT:    pand %xmm1, %xmm5
4205; SSSE3-NEXT:    pandn %xmm8, %xmm1
4206; SSSE3-NEXT:    por %xmm5, %xmm1
4207; SSSE3-NEXT:    movdqa %xmm6, %xmm7
4208; SSSE3-NEXT:    pxor %xmm3, %xmm7
4209; SSSE3-NEXT:    movdqa %xmm2, %xmm5
4210; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm5
4211; SSSE3-NEXT:    pand %xmm5, %xmm6
4212; SSSE3-NEXT:    pandn %xmm8, %xmm5
4213; SSSE3-NEXT:    por %xmm6, %xmm5
4214; SSSE3-NEXT:    packuswb %xmm1, %xmm5
4215; SSSE3-NEXT:    movdqa %xmm4, %xmm1
4216; SSSE3-NEXT:    pxor %xmm3, %xmm1
4217; SSSE3-NEXT:    movdqa %xmm2, %xmm6
4218; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm6
4219; SSSE3-NEXT:    pand %xmm6, %xmm4
4220; SSSE3-NEXT:    pandn %xmm8, %xmm6
4221; SSSE3-NEXT:    por %xmm4, %xmm6
4222; SSSE3-NEXT:    pxor %xmm0, %xmm3
4223; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2
4224; SSSE3-NEXT:    pand %xmm2, %xmm0
4225; SSSE3-NEXT:    pandn %xmm8, %xmm2
4226; SSSE3-NEXT:    por %xmm0, %xmm2
4227; SSSE3-NEXT:    packuswb %xmm6, %xmm2
4228; SSSE3-NEXT:    packuswb %xmm2, %xmm5
4229; SSSE3-NEXT:    movdqa %xmm5, (%rsi)
4230; SSSE3-NEXT:    retq
4231;
4232; SSE41-LABEL: trunc_usat_v16i32_v16i8_store:
4233; SSE41:       # %bb.0:
4234; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [255,255,255,255]
4235; SSE41-NEXT:    movdqa 16(%rdi), %xmm1
4236; SSE41-NEXT:    pminud %xmm0, %xmm1
4237; SSE41-NEXT:    movdqa (%rdi), %xmm2
4238; SSE41-NEXT:    pminud %xmm0, %xmm2
4239; SSE41-NEXT:    packusdw %xmm1, %xmm2
4240; SSE41-NEXT:    movdqa 48(%rdi), %xmm1
4241; SSE41-NEXT:    pminud %xmm0, %xmm1
4242; SSE41-NEXT:    pminud 32(%rdi), %xmm0
4243; SSE41-NEXT:    packusdw %xmm1, %xmm0
4244; SSE41-NEXT:    packuswb %xmm0, %xmm2
4245; SSE41-NEXT:    movdqa %xmm2, (%rsi)
4246; SSE41-NEXT:    retq
4247;
4248; AVX1-LABEL: trunc_usat_v16i32_v16i8_store:
4249; AVX1:       # %bb.0:
4250; AVX1-NEXT:    vmovdqa {{.*#+}} xmm0 = [255,255,255,255]
4251; AVX1-NEXT:    vpminud 16(%rdi), %xmm0, %xmm1
4252; AVX1-NEXT:    vpminud (%rdi), %xmm0, %xmm2
4253; AVX1-NEXT:    vpackusdw %xmm1, %xmm2, %xmm1
4254; AVX1-NEXT:    vpminud 48(%rdi), %xmm0, %xmm2
4255; AVX1-NEXT:    vpminud 32(%rdi), %xmm0, %xmm0
4256; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
4257; AVX1-NEXT:    vpackuswb %xmm0, %xmm1, %xmm0
4258; AVX1-NEXT:    vmovdqa %xmm0, (%rsi)
4259; AVX1-NEXT:    retq
4260;
4261; AVX2-LABEL: trunc_usat_v16i32_v16i8_store:
4262; AVX2:       # %bb.0:
4263; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255]
4264; AVX2-NEXT:    vpminud 32(%rdi), %ymm0, %ymm1
4265; AVX2-NEXT:    vpminud (%rdi), %ymm0, %ymm0
4266; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
4267; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4268; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
4269; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
4270; AVX2-NEXT:    vmovdqa %xmm0, (%rsi)
4271; AVX2-NEXT:    vzeroupper
4272; AVX2-NEXT:    retq
4273;
4274; AVX512-LABEL: trunc_usat_v16i32_v16i8_store:
4275; AVX512:       # %bb.0:
4276; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
4277; AVX512-NEXT:    vpmovusdb %zmm0, (%rsi)
4278; AVX512-NEXT:    vzeroupper
4279; AVX512-NEXT:    retq
4280;
4281; SKX-LABEL: trunc_usat_v16i32_v16i8_store:
4282; SKX:       # %bb.0:
4283; SKX-NEXT:    vmovdqa64 (%rdi), %zmm0
4284; SKX-NEXT:    vpmovusdb %zmm0, (%rsi)
4285; SKX-NEXT:    vzeroupper
4286; SKX-NEXT:    retq
4287  %a0 = load <16 x i32>, <16 x i32>* %p0
4288  %1 = icmp ult <16 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
4289  %2 = select <16 x i1> %1, <16 x i32> %a0, <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>
4290  %3 = trunc <16 x i32> %2 to <16 x i8>
4291  store <16 x i8> %3, <16 x i8>* %p1
4292  ret void
4293}
4294
4295define <8 x i8> @trunc_usat_v8i16_v8i8(<8 x i16> %a0) {
4296; SSE2-LABEL: trunc_usat_v8i16_v8i8:
4297; SSE2:       # %bb.0:
4298; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [32768,32768,32768,32768,32768,32768,32768,32768]
4299; SSE2-NEXT:    pxor %xmm1, %xmm0
4300; SSE2-NEXT:    pminsw {{.*}}(%rip), %xmm0
4301; SSE2-NEXT:    pxor %xmm1, %xmm0
4302; SSE2-NEXT:    packuswb %xmm0, %xmm0
4303; SSE2-NEXT:    retq
4304;
4305; SSSE3-LABEL: trunc_usat_v8i16_v8i8:
4306; SSSE3:       # %bb.0:
4307; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [32768,32768,32768,32768,32768,32768,32768,32768]
4308; SSSE3-NEXT:    pxor %xmm1, %xmm0
4309; SSSE3-NEXT:    pminsw {{.*}}(%rip), %xmm0
4310; SSSE3-NEXT:    pxor %xmm1, %xmm0
4311; SSSE3-NEXT:    packuswb %xmm0, %xmm0
4312; SSSE3-NEXT:    retq
4313;
4314; SSE41-LABEL: trunc_usat_v8i16_v8i8:
4315; SSE41:       # %bb.0:
4316; SSE41-NEXT:    pminuw {{.*}}(%rip), %xmm0
4317; SSE41-NEXT:    packuswb %xmm0, %xmm0
4318; SSE41-NEXT:    retq
4319;
4320; AVX-LABEL: trunc_usat_v8i16_v8i8:
4321; AVX:       # %bb.0:
4322; AVX-NEXT:    vpminuw {{.*}}(%rip), %xmm0, %xmm0
4323; AVX-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
4324; AVX-NEXT:    retq
4325;
4326; AVX512F-LABEL: trunc_usat_v8i16_v8i8:
4327; AVX512F:       # %bb.0:
4328; AVX512F-NEXT:    vpminuw {{.*}}(%rip), %xmm0, %xmm0
4329; AVX512F-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
4330; AVX512F-NEXT:    retq
4331;
4332; AVX512VL-LABEL: trunc_usat_v8i16_v8i8:
4333; AVX512VL:       # %bb.0:
4334; AVX512VL-NEXT:    vpminuw {{.*}}(%rip), %xmm0, %xmm0
4335; AVX512VL-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
4336; AVX512VL-NEXT:    retq
4337;
4338; AVX512BW-LABEL: trunc_usat_v8i16_v8i8:
4339; AVX512BW:       # %bb.0:
4340; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
4341; AVX512BW-NEXT:    vpmovuswb %zmm0, %ymm0
4342; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4343; AVX512BW-NEXT:    vzeroupper
4344; AVX512BW-NEXT:    retq
4345;
4346; AVX512BWVL-LABEL: trunc_usat_v8i16_v8i8:
4347; AVX512BWVL:       # %bb.0:
4348; AVX512BWVL-NEXT:    vpmovuswb %xmm0, %xmm0
4349; AVX512BWVL-NEXT:    retq
4350;
4351; SKX-LABEL: trunc_usat_v8i16_v8i8:
4352; SKX:       # %bb.0:
4353; SKX-NEXT:    vpmovuswb %xmm0, %xmm0
4354; SKX-NEXT:    retq
4355  %1 = icmp ult <8 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
4356  %2 = select <8 x i1> %1, <8 x i16> %a0, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
4357  %3 = trunc <8 x i16> %2 to <8 x i8>
4358  ret <8 x i8> %3
4359}
4360
4361define void @trunc_usat_v8i16_v8i8_store(<8 x i16> %a0, <8 x i8> *%p1) {
4362; SSE2-LABEL: trunc_usat_v8i16_v8i8_store:
4363; SSE2:       # %bb.0:
4364; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [32768,32768,32768,32768,32768,32768,32768,32768]
4365; SSE2-NEXT:    pxor %xmm1, %xmm0
4366; SSE2-NEXT:    pminsw {{.*}}(%rip), %xmm0
4367; SSE2-NEXT:    pxor %xmm1, %xmm0
4368; SSE2-NEXT:    packuswb %xmm0, %xmm0
4369; SSE2-NEXT:    movq %xmm0, (%rdi)
4370; SSE2-NEXT:    retq
4371;
4372; SSSE3-LABEL: trunc_usat_v8i16_v8i8_store:
4373; SSSE3:       # %bb.0:
4374; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [32768,32768,32768,32768,32768,32768,32768,32768]
4375; SSSE3-NEXT:    pxor %xmm1, %xmm0
4376; SSSE3-NEXT:    pminsw {{.*}}(%rip), %xmm0
4377; SSSE3-NEXT:    pxor %xmm1, %xmm0
4378; SSSE3-NEXT:    packuswb %xmm0, %xmm0
4379; SSSE3-NEXT:    movq %xmm0, (%rdi)
4380; SSSE3-NEXT:    retq
4381;
4382; SSE41-LABEL: trunc_usat_v8i16_v8i8_store:
4383; SSE41:       # %bb.0:
4384; SSE41-NEXT:    pminuw {{.*}}(%rip), %xmm0
4385; SSE41-NEXT:    packuswb %xmm0, %xmm0
4386; SSE41-NEXT:    movq %xmm0, (%rdi)
4387; SSE41-NEXT:    retq
4388;
4389; AVX-LABEL: trunc_usat_v8i16_v8i8_store:
4390; AVX:       # %bb.0:
4391; AVX-NEXT:    vpminuw {{.*}}(%rip), %xmm0, %xmm0
4392; AVX-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
4393; AVX-NEXT:    vmovq %xmm0, (%rdi)
4394; AVX-NEXT:    retq
4395;
4396; AVX512F-LABEL: trunc_usat_v8i16_v8i8_store:
4397; AVX512F:       # %bb.0:
4398; AVX512F-NEXT:    vpminuw {{.*}}(%rip), %xmm0, %xmm0
4399; AVX512F-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
4400; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
4401; AVX512F-NEXT:    retq
4402;
4403; AVX512VL-LABEL: trunc_usat_v8i16_v8i8_store:
4404; AVX512VL:       # %bb.0:
4405; AVX512VL-NEXT:    vpminuw {{.*}}(%rip), %xmm0, %xmm0
4406; AVX512VL-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
4407; AVX512VL-NEXT:    vmovq %xmm0, (%rdi)
4408; AVX512VL-NEXT:    retq
4409;
4410; AVX512BW-LABEL: trunc_usat_v8i16_v8i8_store:
4411; AVX512BW:       # %bb.0:
4412; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
4413; AVX512BW-NEXT:    vpmovuswb %zmm0, %ymm0
4414; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
4415; AVX512BW-NEXT:    vzeroupper
4416; AVX512BW-NEXT:    retq
4417;
4418; AVX512BWVL-LABEL: trunc_usat_v8i16_v8i8_store:
4419; AVX512BWVL:       # %bb.0:
4420; AVX512BWVL-NEXT:    vpmovuswb %xmm0, (%rdi)
4421; AVX512BWVL-NEXT:    retq
4422;
4423; SKX-LABEL: trunc_usat_v8i16_v8i8_store:
4424; SKX:       # %bb.0:
4425; SKX-NEXT:    vpmovuswb %xmm0, (%rdi)
4426; SKX-NEXT:    retq
4427  %1 = icmp ult <8 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
4428  %2 = select <8 x i1> %1, <8 x i16> %a0, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
4429  %3 = trunc <8 x i16> %2 to <8 x i8>
4430  store <8 x i8> %3, <8 x i8> *%p1
4431  ret void
4432}
4433
4434define <16 x i8> @trunc_usat_v16i16_v16i8(<16 x i16> %a0) {
4435; SSE2-LABEL: trunc_usat_v16i16_v16i8:
4436; SSE2:       # %bb.0:
4437; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
4438; SSE2-NEXT:    pxor %xmm2, %xmm1
4439; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [33023,33023,33023,33023,33023,33023,33023,33023]
4440; SSE2-NEXT:    pminsw %xmm3, %xmm1
4441; SSE2-NEXT:    pxor %xmm2, %xmm1
4442; SSE2-NEXT:    pxor %xmm2, %xmm0
4443; SSE2-NEXT:    pminsw %xmm3, %xmm0
4444; SSE2-NEXT:    pxor %xmm2, %xmm0
4445; SSE2-NEXT:    packuswb %xmm1, %xmm0
4446; SSE2-NEXT:    retq
4447;
4448; SSSE3-LABEL: trunc_usat_v16i16_v16i8:
4449; SSSE3:       # %bb.0:
4450; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
4451; SSSE3-NEXT:    pxor %xmm2, %xmm1
4452; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [33023,33023,33023,33023,33023,33023,33023,33023]
4453; SSSE3-NEXT:    pminsw %xmm3, %xmm1
4454; SSSE3-NEXT:    pxor %xmm2, %xmm1
4455; SSSE3-NEXT:    pxor %xmm2, %xmm0
4456; SSSE3-NEXT:    pminsw %xmm3, %xmm0
4457; SSSE3-NEXT:    pxor %xmm2, %xmm0
4458; SSSE3-NEXT:    packuswb %xmm1, %xmm0
4459; SSSE3-NEXT:    retq
4460;
4461; SSE41-LABEL: trunc_usat_v16i16_v16i8:
4462; SSE41:       # %bb.0:
4463; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
4464; SSE41-NEXT:    pminuw %xmm2, %xmm1
4465; SSE41-NEXT:    pminuw %xmm2, %xmm0
4466; SSE41-NEXT:    packuswb %xmm1, %xmm0
4467; SSE41-NEXT:    retq
4468;
4469; AVX1-LABEL: trunc_usat_v16i16_v16i8:
4470; AVX1:       # %bb.0:
4471; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
4472; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
4473; AVX1-NEXT:    vpminuw %xmm2, %xmm1, %xmm1
4474; AVX1-NEXT:    vpminuw %xmm2, %xmm0, %xmm0
4475; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
4476; AVX1-NEXT:    vzeroupper
4477; AVX1-NEXT:    retq
4478;
4479; AVX2-LABEL: trunc_usat_v16i16_v16i8:
4480; AVX2:       # %bb.0:
4481; AVX2-NEXT:    vpminuw {{.*}}(%rip), %ymm0, %ymm0
4482; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
4483; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
4484; AVX2-NEXT:    vzeroupper
4485; AVX2-NEXT:    retq
4486;
4487; AVX512F-LABEL: trunc_usat_v16i16_v16i8:
4488; AVX512F:       # %bb.0:
4489; AVX512F-NEXT:    vpminuw {{.*}}(%rip), %ymm0, %ymm0
4490; AVX512F-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
4491; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
4492; AVX512F-NEXT:    vzeroupper
4493; AVX512F-NEXT:    retq
4494;
4495; AVX512VL-LABEL: trunc_usat_v16i16_v16i8:
4496; AVX512VL:       # %bb.0:
4497; AVX512VL-NEXT:    vpminuw {{.*}}(%rip), %ymm0, %ymm0
4498; AVX512VL-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
4499; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
4500; AVX512VL-NEXT:    vzeroupper
4501; AVX512VL-NEXT:    retq
4502;
4503; AVX512BW-LABEL: trunc_usat_v16i16_v16i8:
4504; AVX512BW:       # %bb.0:
4505; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
4506; AVX512BW-NEXT:    vpmovuswb %zmm0, %ymm0
4507; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4508; AVX512BW-NEXT:    vzeroupper
4509; AVX512BW-NEXT:    retq
4510;
4511; AVX512BWVL-LABEL: trunc_usat_v16i16_v16i8:
4512; AVX512BWVL:       # %bb.0:
4513; AVX512BWVL-NEXT:    vpmovuswb %ymm0, %xmm0
4514; AVX512BWVL-NEXT:    vzeroupper
4515; AVX512BWVL-NEXT:    retq
4516;
4517; SKX-LABEL: trunc_usat_v16i16_v16i8:
4518; SKX:       # %bb.0:
4519; SKX-NEXT:    vpmovuswb %ymm0, %xmm0
4520; SKX-NEXT:    vzeroupper
4521; SKX-NEXT:    retq
4522  %1 = icmp ult <16 x i16> %a0, <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>
4523  %2 = select <16 x i1> %1, <16 x i16> %a0, <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>
4524  %3 = trunc <16 x i16> %2 to <16 x i8>
4525  ret <16 x i8> %3
4526}
4527
4528define <32 x i8> @trunc_usat_v32i16_v32i8(<32 x i16>* %p0) {
4529; SSE2-LABEL: trunc_usat_v32i16_v32i8:
4530; SSE2:       # %bb.0:
4531; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
4532; SSE2-NEXT:    movdqa 48(%rdi), %xmm0
4533; SSE2-NEXT:    pxor %xmm2, %xmm0
4534; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [33023,33023,33023,33023,33023,33023,33023,33023]
4535; SSE2-NEXT:    pminsw %xmm3, %xmm0
4536; SSE2-NEXT:    pxor %xmm2, %xmm0
4537; SSE2-NEXT:    movdqa 32(%rdi), %xmm1
4538; SSE2-NEXT:    pxor %xmm2, %xmm1
4539; SSE2-NEXT:    pminsw %xmm3, %xmm1
4540; SSE2-NEXT:    pxor %xmm2, %xmm1
4541; SSE2-NEXT:    packuswb %xmm0, %xmm1
4542; SSE2-NEXT:    movdqa 16(%rdi), %xmm4
4543; SSE2-NEXT:    pxor %xmm2, %xmm4
4544; SSE2-NEXT:    pminsw %xmm3, %xmm4
4545; SSE2-NEXT:    pxor %xmm2, %xmm4
4546; SSE2-NEXT:    movdqa (%rdi), %xmm0
4547; SSE2-NEXT:    pxor %xmm2, %xmm0
4548; SSE2-NEXT:    pminsw %xmm3, %xmm0
4549; SSE2-NEXT:    pxor %xmm2, %xmm0
4550; SSE2-NEXT:    packuswb %xmm4, %xmm0
4551; SSE2-NEXT:    retq
4552;
4553; SSSE3-LABEL: trunc_usat_v32i16_v32i8:
4554; SSSE3:       # %bb.0:
4555; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
4556; SSSE3-NEXT:    movdqa 48(%rdi), %xmm0
4557; SSSE3-NEXT:    pxor %xmm2, %xmm0
4558; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [33023,33023,33023,33023,33023,33023,33023,33023]
4559; SSSE3-NEXT:    pminsw %xmm3, %xmm0
4560; SSSE3-NEXT:    pxor %xmm2, %xmm0
4561; SSSE3-NEXT:    movdqa 32(%rdi), %xmm1
4562; SSSE3-NEXT:    pxor %xmm2, %xmm1
4563; SSSE3-NEXT:    pminsw %xmm3, %xmm1
4564; SSSE3-NEXT:    pxor %xmm2, %xmm1
4565; SSSE3-NEXT:    packuswb %xmm0, %xmm1
4566; SSSE3-NEXT:    movdqa 16(%rdi), %xmm4
4567; SSSE3-NEXT:    pxor %xmm2, %xmm4
4568; SSSE3-NEXT:    pminsw %xmm3, %xmm4
4569; SSSE3-NEXT:    pxor %xmm2, %xmm4
4570; SSSE3-NEXT:    movdqa (%rdi), %xmm0
4571; SSSE3-NEXT:    pxor %xmm2, %xmm0
4572; SSSE3-NEXT:    pminsw %xmm3, %xmm0
4573; SSSE3-NEXT:    pxor %xmm2, %xmm0
4574; SSSE3-NEXT:    packuswb %xmm4, %xmm0
4575; SSSE3-NEXT:    retq
4576;
4577; SSE41-LABEL: trunc_usat_v32i16_v32i8:
4578; SSE41:       # %bb.0:
4579; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255]
4580; SSE41-NEXT:    movdqa 48(%rdi), %xmm2
4581; SSE41-NEXT:    pminuw %xmm0, %xmm2
4582; SSE41-NEXT:    movdqa 32(%rdi), %xmm1
4583; SSE41-NEXT:    pminuw %xmm0, %xmm1
4584; SSE41-NEXT:    packuswb %xmm2, %xmm1
4585; SSE41-NEXT:    movdqa 16(%rdi), %xmm2
4586; SSE41-NEXT:    pminuw %xmm0, %xmm2
4587; SSE41-NEXT:    pminuw (%rdi), %xmm0
4588; SSE41-NEXT:    packuswb %xmm2, %xmm0
4589; SSE41-NEXT:    retq
4590;
4591; AVX1-LABEL: trunc_usat_v32i16_v32i8:
4592; AVX1:       # %bb.0:
4593; AVX1-NEXT:    vmovdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255]
4594; AVX1-NEXT:    vpminuw 16(%rdi), %xmm0, %xmm1
4595; AVX1-NEXT:    vpminuw (%rdi), %xmm0, %xmm2
4596; AVX1-NEXT:    vpackuswb %xmm1, %xmm2, %xmm1
4597; AVX1-NEXT:    vpminuw 48(%rdi), %xmm0, %xmm2
4598; AVX1-NEXT:    vpminuw 32(%rdi), %xmm0, %xmm0
4599; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
4600; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
4601; AVX1-NEXT:    retq
4602;
4603; AVX2-LABEL: trunc_usat_v32i16_v32i8:
4604; AVX2:       # %bb.0:
4605; AVX2-NEXT:    vmovdqa {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
4606; AVX2-NEXT:    vpminuw 32(%rdi), %ymm0, %ymm1
4607; AVX2-NEXT:    vpminuw (%rdi), %ymm0, %ymm0
4608; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
4609; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4610; AVX2-NEXT:    retq
4611;
4612; AVX512F-LABEL: trunc_usat_v32i16_v32i8:
4613; AVX512F:       # %bb.0:
4614; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
4615; AVX512F-NEXT:    vpminuw 32(%rdi), %ymm0, %ymm1
4616; AVX512F-NEXT:    vpminuw (%rdi), %ymm0, %ymm0
4617; AVX512F-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
4618; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
4619; AVX512F-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
4620; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
4621; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
4622; AVX512F-NEXT:    retq
4623;
4624; AVX512VL-LABEL: trunc_usat_v32i16_v32i8:
4625; AVX512VL:       # %bb.0:
4626; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
4627; AVX512VL-NEXT:    vpminuw 32(%rdi), %ymm0, %ymm1
4628; AVX512VL-NEXT:    vpminuw (%rdi), %ymm0, %ymm0
4629; AVX512VL-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
4630; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
4631; AVX512VL-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
4632; AVX512VL-NEXT:    vpmovdb %zmm1, %xmm1
4633; AVX512VL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
4634; AVX512VL-NEXT:    retq
4635;
4636; AVX512BW-LABEL: trunc_usat_v32i16_v32i8:
4637; AVX512BW:       # %bb.0:
4638; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
4639; AVX512BW-NEXT:    vpmovuswb %zmm0, %ymm0
4640; AVX512BW-NEXT:    retq
4641;
4642; AVX512BWVL-LABEL: trunc_usat_v32i16_v32i8:
4643; AVX512BWVL:       # %bb.0:
4644; AVX512BWVL-NEXT:    vmovdqa64 (%rdi), %zmm0
4645; AVX512BWVL-NEXT:    vpmovuswb %zmm0, %ymm0
4646; AVX512BWVL-NEXT:    retq
4647;
4648; SKX-LABEL: trunc_usat_v32i16_v32i8:
4649; SKX:       # %bb.0:
4650; SKX-NEXT:    vmovdqa64 (%rdi), %zmm0
4651; SKX-NEXT:    vpmovuswb %zmm0, %ymm0
4652; SKX-NEXT:    retq
4653  %a0 = load <32 x i16>, <32 x i16>* %p0
4654  %1 = icmp ult <32 x i16> %a0, <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, 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>
4655  %2 = select <32 x i1> %1, <32 x i16> %a0, <32 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, 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>
4656  %3 = trunc <32 x i16> %2 to <32 x i8>
4657  ret <32 x i8> %3
4658}
4659
4660define <32 x i8> @trunc_usat_v32i32_v32i8(<32 x i32>* %p0) {
4661; SSE2-LABEL: trunc_usat_v32i32_v32i8:
4662; SSE2:       # %bb.0:
4663; SSE2-NEXT:    movdqa (%rdi), %xmm11
4664; SSE2-NEXT:    movdqa 16(%rdi), %xmm12
4665; SSE2-NEXT:    movdqa 32(%rdi), %xmm9
4666; SSE2-NEXT:    movdqa 48(%rdi), %xmm10
4667; SSE2-NEXT:    movdqa 96(%rdi), %xmm0
4668; SSE2-NEXT:    movdqa 112(%rdi), %xmm2
4669; SSE2-NEXT:    movdqa 64(%rdi), %xmm5
4670; SSE2-NEXT:    movdqa 80(%rdi), %xmm7
4671; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255,255,255]
4672; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
4673; SSE2-NEXT:    movdqa %xmm7, %xmm1
4674; SSE2-NEXT:    pxor %xmm6, %xmm1
4675; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483903,2147483903,2147483903,2147483903]
4676; SSE2-NEXT:    movdqa %xmm4, %xmm3
4677; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
4678; SSE2-NEXT:    pand %xmm3, %xmm7
4679; SSE2-NEXT:    pandn %xmm8, %xmm3
4680; SSE2-NEXT:    por %xmm7, %xmm3
4681; SSE2-NEXT:    movdqa %xmm5, %xmm7
4682; SSE2-NEXT:    pxor %xmm6, %xmm7
4683; SSE2-NEXT:    movdqa %xmm4, %xmm1
4684; SSE2-NEXT:    pcmpgtd %xmm7, %xmm1
4685; SSE2-NEXT:    pand %xmm1, %xmm5
4686; SSE2-NEXT:    pandn %xmm8, %xmm1
4687; SSE2-NEXT:    por %xmm5, %xmm1
4688; SSE2-NEXT:    packuswb %xmm3, %xmm1
4689; SSE2-NEXT:    movdqa %xmm2, %xmm3
4690; SSE2-NEXT:    pxor %xmm6, %xmm3
4691; SSE2-NEXT:    movdqa %xmm4, %xmm5
4692; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
4693; SSE2-NEXT:    pand %xmm5, %xmm2
4694; SSE2-NEXT:    pandn %xmm8, %xmm5
4695; SSE2-NEXT:    por %xmm2, %xmm5
4696; SSE2-NEXT:    movdqa %xmm0, %xmm2
4697; SSE2-NEXT:    pxor %xmm6, %xmm2
4698; SSE2-NEXT:    movdqa %xmm4, %xmm3
4699; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
4700; SSE2-NEXT:    pand %xmm3, %xmm0
4701; SSE2-NEXT:    pandn %xmm8, %xmm3
4702; SSE2-NEXT:    por %xmm0, %xmm3
4703; SSE2-NEXT:    packuswb %xmm5, %xmm3
4704; SSE2-NEXT:    packuswb %xmm3, %xmm1
4705; SSE2-NEXT:    movdqa %xmm12, %xmm0
4706; SSE2-NEXT:    pxor %xmm6, %xmm0
4707; SSE2-NEXT:    movdqa %xmm4, %xmm2
4708; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
4709; SSE2-NEXT:    pand %xmm2, %xmm12
4710; SSE2-NEXT:    pandn %xmm8, %xmm2
4711; SSE2-NEXT:    por %xmm12, %xmm2
4712; SSE2-NEXT:    movdqa %xmm11, %xmm3
4713; SSE2-NEXT:    pxor %xmm6, %xmm3
4714; SSE2-NEXT:    movdqa %xmm4, %xmm0
4715; SSE2-NEXT:    pcmpgtd %xmm3, %xmm0
4716; SSE2-NEXT:    pand %xmm0, %xmm11
4717; SSE2-NEXT:    pandn %xmm8, %xmm0
4718; SSE2-NEXT:    por %xmm11, %xmm0
4719; SSE2-NEXT:    packuswb %xmm2, %xmm0
4720; SSE2-NEXT:    movdqa %xmm10, %xmm2
4721; SSE2-NEXT:    pxor %xmm6, %xmm2
4722; SSE2-NEXT:    movdqa %xmm4, %xmm3
4723; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
4724; SSE2-NEXT:    pand %xmm3, %xmm10
4725; SSE2-NEXT:    pandn %xmm8, %xmm3
4726; SSE2-NEXT:    por %xmm10, %xmm3
4727; SSE2-NEXT:    pxor %xmm9, %xmm6
4728; SSE2-NEXT:    pcmpgtd %xmm6, %xmm4
4729; SSE2-NEXT:    pand %xmm4, %xmm9
4730; SSE2-NEXT:    pandn %xmm8, %xmm4
4731; SSE2-NEXT:    por %xmm9, %xmm4
4732; SSE2-NEXT:    packuswb %xmm3, %xmm4
4733; SSE2-NEXT:    packuswb %xmm4, %xmm0
4734; SSE2-NEXT:    retq
4735;
4736; SSSE3-LABEL: trunc_usat_v32i32_v32i8:
4737; SSSE3:       # %bb.0:
4738; SSSE3-NEXT:    movdqa (%rdi), %xmm11
4739; SSSE3-NEXT:    movdqa 16(%rdi), %xmm12
4740; SSSE3-NEXT:    movdqa 32(%rdi), %xmm9
4741; SSSE3-NEXT:    movdqa 48(%rdi), %xmm10
4742; SSSE3-NEXT:    movdqa 96(%rdi), %xmm0
4743; SSSE3-NEXT:    movdqa 112(%rdi), %xmm2
4744; SSSE3-NEXT:    movdqa 64(%rdi), %xmm5
4745; SSSE3-NEXT:    movdqa 80(%rdi), %xmm7
4746; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255,255,255]
4747; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
4748; SSSE3-NEXT:    movdqa %xmm7, %xmm1
4749; SSSE3-NEXT:    pxor %xmm6, %xmm1
4750; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483903,2147483903,2147483903,2147483903]
4751; SSSE3-NEXT:    movdqa %xmm4, %xmm3
4752; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
4753; SSSE3-NEXT:    pand %xmm3, %xmm7
4754; SSSE3-NEXT:    pandn %xmm8, %xmm3
4755; SSSE3-NEXT:    por %xmm7, %xmm3
4756; SSSE3-NEXT:    movdqa %xmm5, %xmm7
4757; SSSE3-NEXT:    pxor %xmm6, %xmm7
4758; SSSE3-NEXT:    movdqa %xmm4, %xmm1
4759; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm1
4760; SSSE3-NEXT:    pand %xmm1, %xmm5
4761; SSSE3-NEXT:    pandn %xmm8, %xmm1
4762; SSSE3-NEXT:    por %xmm5, %xmm1
4763; SSSE3-NEXT:    packuswb %xmm3, %xmm1
4764; SSSE3-NEXT:    movdqa %xmm2, %xmm3
4765; SSSE3-NEXT:    pxor %xmm6, %xmm3
4766; SSSE3-NEXT:    movdqa %xmm4, %xmm5
4767; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
4768; SSSE3-NEXT:    pand %xmm5, %xmm2
4769; SSSE3-NEXT:    pandn %xmm8, %xmm5
4770; SSSE3-NEXT:    por %xmm2, %xmm5
4771; SSSE3-NEXT:    movdqa %xmm0, %xmm2
4772; SSSE3-NEXT:    pxor %xmm6, %xmm2
4773; SSSE3-NEXT:    movdqa %xmm4, %xmm3
4774; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
4775; SSSE3-NEXT:    pand %xmm3, %xmm0
4776; SSSE3-NEXT:    pandn %xmm8, %xmm3
4777; SSSE3-NEXT:    por %xmm0, %xmm3
4778; SSSE3-NEXT:    packuswb %xmm5, %xmm3
4779; SSSE3-NEXT:    packuswb %xmm3, %xmm1
4780; SSSE3-NEXT:    movdqa %xmm12, %xmm0
4781; SSSE3-NEXT:    pxor %xmm6, %xmm0
4782; SSSE3-NEXT:    movdqa %xmm4, %xmm2
4783; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
4784; SSSE3-NEXT:    pand %xmm2, %xmm12
4785; SSSE3-NEXT:    pandn %xmm8, %xmm2
4786; SSSE3-NEXT:    por %xmm12, %xmm2
4787; SSSE3-NEXT:    movdqa %xmm11, %xmm3
4788; SSSE3-NEXT:    pxor %xmm6, %xmm3
4789; SSSE3-NEXT:    movdqa %xmm4, %xmm0
4790; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm0
4791; SSSE3-NEXT:    pand %xmm0, %xmm11
4792; SSSE3-NEXT:    pandn %xmm8, %xmm0
4793; SSSE3-NEXT:    por %xmm11, %xmm0
4794; SSSE3-NEXT:    packuswb %xmm2, %xmm0
4795; SSSE3-NEXT:    movdqa %xmm10, %xmm2
4796; SSSE3-NEXT:    pxor %xmm6, %xmm2
4797; SSSE3-NEXT:    movdqa %xmm4, %xmm3
4798; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
4799; SSSE3-NEXT:    pand %xmm3, %xmm10
4800; SSSE3-NEXT:    pandn %xmm8, %xmm3
4801; SSSE3-NEXT:    por %xmm10, %xmm3
4802; SSSE3-NEXT:    pxor %xmm9, %xmm6
4803; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm4
4804; SSSE3-NEXT:    pand %xmm4, %xmm9
4805; SSSE3-NEXT:    pandn %xmm8, %xmm4
4806; SSSE3-NEXT:    por %xmm9, %xmm4
4807; SSSE3-NEXT:    packuswb %xmm3, %xmm4
4808; SSSE3-NEXT:    packuswb %xmm4, %xmm0
4809; SSSE3-NEXT:    retq
4810;
4811; SSE41-LABEL: trunc_usat_v32i32_v32i8:
4812; SSE41:       # %bb.0:
4813; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
4814; SSE41-NEXT:    movdqa 80(%rdi), %xmm0
4815; SSE41-NEXT:    pminud %xmm2, %xmm0
4816; SSE41-NEXT:    movdqa 64(%rdi), %xmm1
4817; SSE41-NEXT:    pminud %xmm2, %xmm1
4818; SSE41-NEXT:    packusdw %xmm0, %xmm1
4819; SSE41-NEXT:    movdqa 112(%rdi), %xmm0
4820; SSE41-NEXT:    pminud %xmm2, %xmm0
4821; SSE41-NEXT:    movdqa 96(%rdi), %xmm3
4822; SSE41-NEXT:    pminud %xmm2, %xmm3
4823; SSE41-NEXT:    packusdw %xmm0, %xmm3
4824; SSE41-NEXT:    packuswb %xmm3, %xmm1
4825; SSE41-NEXT:    movdqa 16(%rdi), %xmm3
4826; SSE41-NEXT:    pminud %xmm2, %xmm3
4827; SSE41-NEXT:    movdqa (%rdi), %xmm0
4828; SSE41-NEXT:    pminud %xmm2, %xmm0
4829; SSE41-NEXT:    packusdw %xmm3, %xmm0
4830; SSE41-NEXT:    movdqa 48(%rdi), %xmm3
4831; SSE41-NEXT:    pminud %xmm2, %xmm3
4832; SSE41-NEXT:    pminud 32(%rdi), %xmm2
4833; SSE41-NEXT:    packusdw %xmm3, %xmm2
4834; SSE41-NEXT:    packuswb %xmm2, %xmm0
4835; SSE41-NEXT:    retq
4836;
4837; AVX1-LABEL: trunc_usat_v32i32_v32i8:
4838; AVX1:       # %bb.0:
4839; AVX1-NEXT:    vmovdqa {{.*#+}} xmm0 = [255,255,255,255]
4840; AVX1-NEXT:    vpminud 16(%rdi), %xmm0, %xmm1
4841; AVX1-NEXT:    vpminud (%rdi), %xmm0, %xmm2
4842; AVX1-NEXT:    vpackusdw %xmm1, %xmm2, %xmm1
4843; AVX1-NEXT:    vpminud 48(%rdi), %xmm0, %xmm2
4844; AVX1-NEXT:    vpminud 32(%rdi), %xmm0, %xmm3
4845; AVX1-NEXT:    vpackusdw %xmm2, %xmm3, %xmm2
4846; AVX1-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
4847; AVX1-NEXT:    vpminud 80(%rdi), %xmm0, %xmm2
4848; AVX1-NEXT:    vpminud 64(%rdi), %xmm0, %xmm3
4849; AVX1-NEXT:    vpackusdw %xmm2, %xmm3, %xmm2
4850; AVX1-NEXT:    vpminud 112(%rdi), %xmm0, %xmm3
4851; AVX1-NEXT:    vpminud 96(%rdi), %xmm0, %xmm0
4852; AVX1-NEXT:    vpackusdw %xmm3, %xmm0, %xmm0
4853; AVX1-NEXT:    vpackuswb %xmm0, %xmm2, %xmm0
4854; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
4855; AVX1-NEXT:    retq
4856;
4857; AVX2-LABEL: trunc_usat_v32i32_v32i8:
4858; AVX2:       # %bb.0:
4859; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255]
4860; AVX2-NEXT:    vpminud 32(%rdi), %ymm0, %ymm1
4861; AVX2-NEXT:    vpminud (%rdi), %ymm0, %ymm2
4862; AVX2-NEXT:    vpackusdw %ymm1, %ymm2, %ymm1
4863; AVX2-NEXT:    vpminud 96(%rdi), %ymm0, %ymm2
4864; AVX2-NEXT:    vpminud 64(%rdi), %ymm0, %ymm0
4865; AVX2-NEXT:    vpackusdw %ymm2, %ymm0, %ymm0
4866; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4867; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
4868; AVX2-NEXT:    vpackuswb %ymm0, %ymm1, %ymm0
4869; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4870; AVX2-NEXT:    retq
4871;
4872; AVX512-LABEL: trunc_usat_v32i32_v32i8:
4873; AVX512:       # %bb.0:
4874; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
4875; AVX512-NEXT:    vmovdqa64 64(%rdi), %zmm1
4876; AVX512-NEXT:    vpmovusdb %zmm0, %xmm0
4877; AVX512-NEXT:    vpmovusdb %zmm1, %xmm1
4878; AVX512-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
4879; AVX512-NEXT:    retq
4880;
4881; SKX-LABEL: trunc_usat_v32i32_v32i8:
4882; SKX:       # %bb.0:
4883; SKX-NEXT:    vmovdqa64 (%rdi), %zmm0
4884; SKX-NEXT:    vmovdqa64 64(%rdi), %zmm1
4885; SKX-NEXT:    vpmovusdb %zmm0, %xmm0
4886; SKX-NEXT:    vpmovusdb %zmm1, %xmm1
4887; SKX-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
4888; SKX-NEXT:    retq
4889  %a0 = load <32 x i32>, <32 x i32>* %p0
4890  %1 = icmp ult <32 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
4891  %2 = select <32 x i1> %1, <32 x i32> %a0, <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>
4892  %3 = trunc <32 x i32> %2 to <32 x i8>
4893  ret <32 x i8> %3
4894}
4895