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