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