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
13;
14; PACKUS saturation truncation to vXi32
15;
16
17define <4 x i32> @trunc_packus_v4i64_v4i32(<4 x i64> %a0) {
18; SSE2-LABEL: trunc_packus_v4i64_v4i32:
19; SSE2:       # %bb.0:
20; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [4294967295,4294967295]
21; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
22; SSE2-NEXT:    movdqa %xmm0, %xmm3
23; SSE2-NEXT:    pxor %xmm2, %xmm3
24; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483647,2147483647]
25; SSE2-NEXT:    movdqa %xmm5, %xmm6
26; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
27; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
28; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
29; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
30; SSE2-NEXT:    pand %xmm7, %xmm4
31; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
32; SSE2-NEXT:    por %xmm4, %xmm3
33; SSE2-NEXT:    pand %xmm3, %xmm0
34; SSE2-NEXT:    pandn %xmm8, %xmm3
35; SSE2-NEXT:    por %xmm0, %xmm3
36; SSE2-NEXT:    movdqa %xmm1, %xmm0
37; SSE2-NEXT:    pxor %xmm2, %xmm0
38; SSE2-NEXT:    movdqa %xmm5, %xmm4
39; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
40; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
41; SSE2-NEXT:    pcmpeqd %xmm5, %xmm0
42; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
43; SSE2-NEXT:    pand %xmm6, %xmm0
44; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
45; SSE2-NEXT:    por %xmm0, %xmm4
46; SSE2-NEXT:    pand %xmm4, %xmm1
47; SSE2-NEXT:    pandn %xmm8, %xmm4
48; SSE2-NEXT:    por %xmm1, %xmm4
49; SSE2-NEXT:    movdqa %xmm4, %xmm0
50; SSE2-NEXT:    pxor %xmm2, %xmm0
51; SSE2-NEXT:    movdqa %xmm0, %xmm1
52; SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
53; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2]
54; SSE2-NEXT:    pcmpeqd %xmm2, %xmm0
55; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
56; SSE2-NEXT:    pand %xmm5, %xmm0
57; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
58; SSE2-NEXT:    por %xmm0, %xmm1
59; SSE2-NEXT:    pand %xmm4, %xmm1
60; SSE2-NEXT:    movdqa %xmm3, %xmm0
61; SSE2-NEXT:    pxor %xmm2, %xmm0
62; SSE2-NEXT:    movdqa %xmm0, %xmm4
63; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
64; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
65; SSE2-NEXT:    pcmpeqd %xmm2, %xmm0
66; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
67; SSE2-NEXT:    pand %xmm5, %xmm2
68; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
69; SSE2-NEXT:    por %xmm2, %xmm0
70; SSE2-NEXT:    pand %xmm3, %xmm0
71; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
72; SSE2-NEXT:    retq
73;
74; SSSE3-LABEL: trunc_packus_v4i64_v4i32:
75; SSSE3:       # %bb.0:
76; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [4294967295,4294967295]
77; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
78; SSSE3-NEXT:    movdqa %xmm0, %xmm3
79; SSSE3-NEXT:    pxor %xmm2, %xmm3
80; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147483647,2147483647]
81; SSSE3-NEXT:    movdqa %xmm5, %xmm6
82; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm6
83; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
84; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm3
85; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
86; SSSE3-NEXT:    pand %xmm7, %xmm4
87; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
88; SSSE3-NEXT:    por %xmm4, %xmm3
89; SSSE3-NEXT:    pand %xmm3, %xmm0
90; SSSE3-NEXT:    pandn %xmm8, %xmm3
91; SSSE3-NEXT:    por %xmm0, %xmm3
92; SSSE3-NEXT:    movdqa %xmm1, %xmm0
93; SSSE3-NEXT:    pxor %xmm2, %xmm0
94; SSSE3-NEXT:    movdqa %xmm5, %xmm4
95; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm4
96; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
97; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm0
98; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
99; SSSE3-NEXT:    pand %xmm6, %xmm0
100; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
101; SSSE3-NEXT:    por %xmm0, %xmm4
102; SSSE3-NEXT:    pand %xmm4, %xmm1
103; SSSE3-NEXT:    pandn %xmm8, %xmm4
104; SSSE3-NEXT:    por %xmm1, %xmm4
105; SSSE3-NEXT:    movdqa %xmm4, %xmm0
106; SSSE3-NEXT:    pxor %xmm2, %xmm0
107; SSSE3-NEXT:    movdqa %xmm0, %xmm1
108; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm1
109; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2]
110; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm0
111; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
112; SSSE3-NEXT:    pand %xmm5, %xmm0
113; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
114; SSSE3-NEXT:    por %xmm0, %xmm1
115; SSSE3-NEXT:    pand %xmm4, %xmm1
116; SSSE3-NEXT:    movdqa %xmm3, %xmm0
117; SSSE3-NEXT:    pxor %xmm2, %xmm0
118; SSSE3-NEXT:    movdqa %xmm0, %xmm4
119; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
120; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
121; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm0
122; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
123; SSSE3-NEXT:    pand %xmm5, %xmm2
124; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
125; SSSE3-NEXT:    por %xmm2, %xmm0
126; SSSE3-NEXT:    pand %xmm3, %xmm0
127; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
128; SSSE3-NEXT:    retq
129;
130; SSE41-LABEL: trunc_packus_v4i64_v4i32:
131; SSE41:       # %bb.0:
132; SSE41-NEXT:    movdqa %xmm0, %xmm2
133; SSE41-NEXT:    movapd {{.*#+}} xmm4 = [4294967295,4294967295]
134; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
135; SSE41-NEXT:    pxor %xmm3, %xmm0
136; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [2147483647,2147483647]
137; SSE41-NEXT:    movdqa %xmm6, %xmm5
138; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
139; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
140; SSE41-NEXT:    pcmpeqd %xmm6, %xmm0
141; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
142; SSE41-NEXT:    pand %xmm7, %xmm0
143; SSE41-NEXT:    por %xmm5, %xmm0
144; SSE41-NEXT:    movapd %xmm4, %xmm5
145; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
146; SSE41-NEXT:    movdqa %xmm1, %xmm0
147; SSE41-NEXT:    pxor %xmm3, %xmm0
148; SSE41-NEXT:    movdqa %xmm6, %xmm2
149; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
150; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[0,0,2,2]
151; SSE41-NEXT:    pcmpeqd %xmm6, %xmm0
152; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
153; SSE41-NEXT:    pand %xmm7, %xmm0
154; SSE41-NEXT:    por %xmm2, %xmm0
155; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
156; SSE41-NEXT:    xorpd %xmm1, %xmm1
157; SSE41-NEXT:    movapd %xmm4, %xmm0
158; SSE41-NEXT:    xorpd %xmm3, %xmm0
159; SSE41-NEXT:    movapd %xmm0, %xmm2
160; SSE41-NEXT:    pcmpgtd %xmm3, %xmm2
161; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
162; SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
163; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
164; SSE41-NEXT:    pand %xmm6, %xmm0
165; SSE41-NEXT:    por %xmm2, %xmm0
166; SSE41-NEXT:    pxor %xmm2, %xmm2
167; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
168; SSE41-NEXT:    movapd %xmm5, %xmm0
169; SSE41-NEXT:    xorpd %xmm3, %xmm0
170; SSE41-NEXT:    movapd %xmm0, %xmm4
171; SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
172; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
173; SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
174; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
175; SSE41-NEXT:    pand %xmm6, %xmm0
176; SSE41-NEXT:    por %xmm4, %xmm0
177; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
178; SSE41-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
179; SSE41-NEXT:    movaps %xmm1, %xmm0
180; SSE41-NEXT:    retq
181;
182; AVX1-LABEL: trunc_packus_v4i64_v4i32:
183; AVX1:       # %bb.0:
184; AVX1-NEXT:    vmovapd {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
185; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
186; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [4294967295,4294967295]
187; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
188; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm3, %xmm3
189; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
190; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
191; AVX1-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
192; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
193; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
194; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
195; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
196; AVX1-NEXT:    vpand %xmm0, %xmm2, %xmm0
197; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
198; AVX1-NEXT:    vzeroupper
199; AVX1-NEXT:    retq
200;
201; AVX2-SLOW-LABEL: trunc_packus_v4i64_v4i32:
202; AVX2-SLOW:       # %bb.0:
203; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
204; AVX2-SLOW-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
205; AVX2-SLOW-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
206; AVX2-SLOW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
207; AVX2-SLOW-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm1
208; AVX2-SLOW-NEXT:    vpand %ymm0, %ymm1, %ymm0
209; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[0,2,2,3,4,6,6,7]
210; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
211; AVX2-SLOW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
212; AVX2-SLOW-NEXT:    vzeroupper
213; AVX2-SLOW-NEXT:    retq
214;
215; AVX2-FAST-LABEL: trunc_packus_v4i64_v4i32:
216; AVX2-FAST:       # %bb.0:
217; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
218; AVX2-FAST-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
219; AVX2-FAST-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
220; AVX2-FAST-NEXT:    vpxor %xmm1, %xmm1, %xmm1
221; AVX2-FAST-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm1
222; AVX2-FAST-NEXT:    vpand %ymm0, %ymm1, %ymm0
223; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7]
224; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm1, %ymm0
225; AVX2-FAST-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
226; AVX2-FAST-NEXT:    vzeroupper
227; AVX2-FAST-NEXT:    retq
228;
229; AVX512F-LABEL: trunc_packus_v4i64_v4i32:
230; AVX512F:       # %bb.0:
231; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
232; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
233; AVX512F-NEXT:    vpminsq %zmm1, %zmm0, %zmm0
234; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
235; AVX512F-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
236; AVX512F-NEXT:    vpmovqd %zmm0, %ymm0
237; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
238; AVX512F-NEXT:    vzeroupper
239; AVX512F-NEXT:    retq
240;
241; AVX512VL-LABEL: trunc_packus_v4i64_v4i32:
242; AVX512VL:       # %bb.0:
243; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
244; AVX512VL-NEXT:    vpmaxsq %ymm1, %ymm0, %ymm0
245; AVX512VL-NEXT:    vpmovusqd %ymm0, %xmm0
246; AVX512VL-NEXT:    vzeroupper
247; AVX512VL-NEXT:    retq
248;
249; AVX512BW-LABEL: trunc_packus_v4i64_v4i32:
250; AVX512BW:       # %bb.0:
251; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
252; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
253; AVX512BW-NEXT:    vpminsq %zmm1, %zmm0, %zmm0
254; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
255; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
256; AVX512BW-NEXT:    vpmovqd %zmm0, %ymm0
257; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
258; AVX512BW-NEXT:    vzeroupper
259; AVX512BW-NEXT:    retq
260;
261; AVX512BWVL-LABEL: trunc_packus_v4i64_v4i32:
262; AVX512BWVL:       # %bb.0:
263; AVX512BWVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
264; AVX512BWVL-NEXT:    vpmaxsq %ymm1, %ymm0, %ymm0
265; AVX512BWVL-NEXT:    vpmovusqd %ymm0, %xmm0
266; AVX512BWVL-NEXT:    vzeroupper
267; AVX512BWVL-NEXT:    retq
268  %1 = icmp slt <4 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
269  %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
270  %3 = icmp sgt <4 x i64> %2, zeroinitializer
271  %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> zeroinitializer
272  %5 = trunc <4 x i64> %4 to <4 x i32>
273  ret <4 x i32> %5
274}
275
276
277define <8 x i32> @trunc_packus_v8i64_v8i32(<8 x i64> %a0) {
278; SSE2-LABEL: trunc_packus_v8i64_v8i32:
279; SSE2:       # %bb.0:
280; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [4294967295,4294967295]
281; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648]
282; SSE2-NEXT:    movdqa %xmm0, %xmm5
283; SSE2-NEXT:    pxor %xmm10, %xmm5
284; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [2147483647,2147483647]
285; SSE2-NEXT:    movdqa %xmm9, %xmm6
286; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
287; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
288; SSE2-NEXT:    pcmpeqd %xmm9, %xmm5
289; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
290; SSE2-NEXT:    pand %xmm7, %xmm4
291; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
292; SSE2-NEXT:    por %xmm4, %xmm5
293; SSE2-NEXT:    pand %xmm5, %xmm0
294; SSE2-NEXT:    pandn %xmm8, %xmm5
295; SSE2-NEXT:    por %xmm0, %xmm5
296; SSE2-NEXT:    movdqa %xmm1, %xmm0
297; SSE2-NEXT:    pxor %xmm10, %xmm0
298; SSE2-NEXT:    movdqa %xmm9, %xmm4
299; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
300; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
301; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
302; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
303; SSE2-NEXT:    pand %xmm6, %xmm7
304; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
305; SSE2-NEXT:    por %xmm7, %xmm0
306; SSE2-NEXT:    pand %xmm0, %xmm1
307; SSE2-NEXT:    pandn %xmm8, %xmm0
308; SSE2-NEXT:    por %xmm1, %xmm0
309; SSE2-NEXT:    movdqa %xmm2, %xmm1
310; SSE2-NEXT:    pxor %xmm10, %xmm1
311; SSE2-NEXT:    movdqa %xmm9, %xmm4
312; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
313; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
314; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
315; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
316; SSE2-NEXT:    pand %xmm6, %xmm1
317; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3]
318; SSE2-NEXT:    por %xmm1, %xmm6
319; SSE2-NEXT:    pand %xmm6, %xmm2
320; SSE2-NEXT:    pandn %xmm8, %xmm6
321; SSE2-NEXT:    por %xmm2, %xmm6
322; SSE2-NEXT:    movdqa %xmm3, %xmm1
323; SSE2-NEXT:    pxor %xmm10, %xmm1
324; SSE2-NEXT:    movdqa %xmm9, %xmm2
325; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
326; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
327; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
328; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
329; SSE2-NEXT:    pand %xmm4, %xmm1
330; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
331; SSE2-NEXT:    por %xmm1, %xmm2
332; SSE2-NEXT:    pand %xmm2, %xmm3
333; SSE2-NEXT:    pandn %xmm8, %xmm2
334; SSE2-NEXT:    por %xmm3, %xmm2
335; SSE2-NEXT:    movdqa %xmm2, %xmm1
336; SSE2-NEXT:    pxor %xmm10, %xmm1
337; SSE2-NEXT:    movdqa %xmm1, %xmm3
338; SSE2-NEXT:    pcmpgtd %xmm10, %xmm3
339; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
340; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
341; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
342; SSE2-NEXT:    pand %xmm4, %xmm1
343; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
344; SSE2-NEXT:    por %xmm1, %xmm3
345; SSE2-NEXT:    pand %xmm2, %xmm3
346; SSE2-NEXT:    movdqa %xmm6, %xmm1
347; SSE2-NEXT:    pxor %xmm10, %xmm1
348; SSE2-NEXT:    movdqa %xmm1, %xmm2
349; SSE2-NEXT:    pcmpgtd %xmm10, %xmm2
350; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
351; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
352; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
353; SSE2-NEXT:    pand %xmm4, %xmm7
354; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
355; SSE2-NEXT:    por %xmm7, %xmm1
356; SSE2-NEXT:    pand %xmm6, %xmm1
357; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm3[0,2]
358; SSE2-NEXT:    movdqa %xmm0, %xmm2
359; SSE2-NEXT:    pxor %xmm10, %xmm2
360; SSE2-NEXT:    movdqa %xmm2, %xmm3
361; SSE2-NEXT:    pcmpgtd %xmm10, %xmm3
362; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
363; SSE2-NEXT:    pcmpeqd %xmm10, %xmm2
364; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
365; SSE2-NEXT:    pand %xmm4, %xmm2
366; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
367; SSE2-NEXT:    por %xmm2, %xmm3
368; SSE2-NEXT:    pand %xmm0, %xmm3
369; SSE2-NEXT:    movdqa %xmm5, %xmm0
370; SSE2-NEXT:    pxor %xmm10, %xmm0
371; SSE2-NEXT:    movdqa %xmm0, %xmm2
372; SSE2-NEXT:    pcmpgtd %xmm10, %xmm2
373; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
374; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
375; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
376; SSE2-NEXT:    pand %xmm4, %xmm6
377; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
378; SSE2-NEXT:    por %xmm6, %xmm0
379; SSE2-NEXT:    pand %xmm5, %xmm0
380; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
381; SSE2-NEXT:    retq
382;
383; SSSE3-LABEL: trunc_packus_v8i64_v8i32:
384; SSSE3:       # %bb.0:
385; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [4294967295,4294967295]
386; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648]
387; SSSE3-NEXT:    movdqa %xmm0, %xmm5
388; SSSE3-NEXT:    pxor %xmm10, %xmm5
389; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [2147483647,2147483647]
390; SSSE3-NEXT:    movdqa %xmm9, %xmm6
391; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm6
392; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
393; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm5
394; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
395; SSSE3-NEXT:    pand %xmm7, %xmm4
396; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
397; SSSE3-NEXT:    por %xmm4, %xmm5
398; SSSE3-NEXT:    pand %xmm5, %xmm0
399; SSSE3-NEXT:    pandn %xmm8, %xmm5
400; SSSE3-NEXT:    por %xmm0, %xmm5
401; SSSE3-NEXT:    movdqa %xmm1, %xmm0
402; SSSE3-NEXT:    pxor %xmm10, %xmm0
403; SSSE3-NEXT:    movdqa %xmm9, %xmm4
404; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm4
405; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
406; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
407; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
408; SSSE3-NEXT:    pand %xmm6, %xmm7
409; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
410; SSSE3-NEXT:    por %xmm7, %xmm0
411; SSSE3-NEXT:    pand %xmm0, %xmm1
412; SSSE3-NEXT:    pandn %xmm8, %xmm0
413; SSSE3-NEXT:    por %xmm1, %xmm0
414; SSSE3-NEXT:    movdqa %xmm2, %xmm1
415; SSSE3-NEXT:    pxor %xmm10, %xmm1
416; SSSE3-NEXT:    movdqa %xmm9, %xmm4
417; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
418; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
419; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
420; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
421; SSSE3-NEXT:    pand %xmm6, %xmm1
422; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3]
423; SSSE3-NEXT:    por %xmm1, %xmm6
424; SSSE3-NEXT:    pand %xmm6, %xmm2
425; SSSE3-NEXT:    pandn %xmm8, %xmm6
426; SSSE3-NEXT:    por %xmm2, %xmm6
427; SSSE3-NEXT:    movdqa %xmm3, %xmm1
428; SSSE3-NEXT:    pxor %xmm10, %xmm1
429; SSSE3-NEXT:    movdqa %xmm9, %xmm2
430; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
431; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
432; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
433; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
434; SSSE3-NEXT:    pand %xmm4, %xmm1
435; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
436; SSSE3-NEXT:    por %xmm1, %xmm2
437; SSSE3-NEXT:    pand %xmm2, %xmm3
438; SSSE3-NEXT:    pandn %xmm8, %xmm2
439; SSSE3-NEXT:    por %xmm3, %xmm2
440; SSSE3-NEXT:    movdqa %xmm2, %xmm1
441; SSSE3-NEXT:    pxor %xmm10, %xmm1
442; SSSE3-NEXT:    movdqa %xmm1, %xmm3
443; SSSE3-NEXT:    pcmpgtd %xmm10, %xmm3
444; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
445; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm1
446; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
447; SSSE3-NEXT:    pand %xmm4, %xmm1
448; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
449; SSSE3-NEXT:    por %xmm1, %xmm3
450; SSSE3-NEXT:    pand %xmm2, %xmm3
451; SSSE3-NEXT:    movdqa %xmm6, %xmm1
452; SSSE3-NEXT:    pxor %xmm10, %xmm1
453; SSSE3-NEXT:    movdqa %xmm1, %xmm2
454; SSSE3-NEXT:    pcmpgtd %xmm10, %xmm2
455; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
456; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm1
457; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
458; SSSE3-NEXT:    pand %xmm4, %xmm7
459; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
460; SSSE3-NEXT:    por %xmm7, %xmm1
461; SSSE3-NEXT:    pand %xmm6, %xmm1
462; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm3[0,2]
463; SSSE3-NEXT:    movdqa %xmm0, %xmm2
464; SSSE3-NEXT:    pxor %xmm10, %xmm2
465; SSSE3-NEXT:    movdqa %xmm2, %xmm3
466; SSSE3-NEXT:    pcmpgtd %xmm10, %xmm3
467; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
468; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm2
469; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
470; SSSE3-NEXT:    pand %xmm4, %xmm2
471; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
472; SSSE3-NEXT:    por %xmm2, %xmm3
473; SSSE3-NEXT:    pand %xmm0, %xmm3
474; SSSE3-NEXT:    movdqa %xmm5, %xmm0
475; SSSE3-NEXT:    pxor %xmm10, %xmm0
476; SSSE3-NEXT:    movdqa %xmm0, %xmm2
477; SSSE3-NEXT:    pcmpgtd %xmm10, %xmm2
478; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
479; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm0
480; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
481; SSSE3-NEXT:    pand %xmm4, %xmm6
482; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
483; SSSE3-NEXT:    por %xmm6, %xmm0
484; SSSE3-NEXT:    pand %xmm5, %xmm0
485; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
486; SSSE3-NEXT:    retq
487;
488; SSE41-LABEL: trunc_packus_v8i64_v8i32:
489; SSE41:       # %bb.0:
490; SSE41-NEXT:    movdqa %xmm0, %xmm4
491; SSE41-NEXT:    movapd {{.*#+}} xmm7 = [4294967295,4294967295]
492; SSE41-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648]
493; SSE41-NEXT:    pxor %xmm10, %xmm0
494; SSE41-NEXT:    movdqa {{.*#+}} xmm11 = [2147483647,2147483647]
495; SSE41-NEXT:    movdqa %xmm11, %xmm6
496; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
497; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[0,0,2,2]
498; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
499; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
500; SSE41-NEXT:    pand %xmm5, %xmm0
501; SSE41-NEXT:    por %xmm6, %xmm0
502; SSE41-NEXT:    movapd %xmm7, %xmm8
503; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm8
504; SSE41-NEXT:    movdqa %xmm1, %xmm0
505; SSE41-NEXT:    pxor %xmm10, %xmm0
506; SSE41-NEXT:    movdqa %xmm11, %xmm4
507; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
508; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
509; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
510; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
511; SSE41-NEXT:    pand %xmm5, %xmm0
512; SSE41-NEXT:    por %xmm4, %xmm0
513; SSE41-NEXT:    movapd %xmm7, %xmm9
514; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm9
515; SSE41-NEXT:    movdqa %xmm2, %xmm0
516; SSE41-NEXT:    pxor %xmm10, %xmm0
517; SSE41-NEXT:    movdqa %xmm11, %xmm1
518; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
519; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
520; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
521; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
522; SSE41-NEXT:    pand %xmm4, %xmm0
523; SSE41-NEXT:    por %xmm1, %xmm0
524; SSE41-NEXT:    movapd %xmm7, %xmm4
525; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
526; SSE41-NEXT:    movdqa %xmm3, %xmm0
527; SSE41-NEXT:    pxor %xmm10, %xmm0
528; SSE41-NEXT:    movdqa %xmm11, %xmm1
529; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
530; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
531; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
532; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
533; SSE41-NEXT:    pand %xmm2, %xmm0
534; SSE41-NEXT:    por %xmm1, %xmm0
535; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm7
536; SSE41-NEXT:    pxor %xmm2, %xmm2
537; SSE41-NEXT:    movapd %xmm7, %xmm0
538; SSE41-NEXT:    xorpd %xmm10, %xmm0
539; SSE41-NEXT:    movapd %xmm0, %xmm1
540; SSE41-NEXT:    pcmpgtd %xmm10, %xmm1
541; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
542; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
543; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
544; SSE41-NEXT:    pand %xmm3, %xmm0
545; SSE41-NEXT:    por %xmm1, %xmm0
546; SSE41-NEXT:    pxor %xmm3, %xmm3
547; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm3
548; SSE41-NEXT:    movapd %xmm4, %xmm0
549; SSE41-NEXT:    xorpd %xmm10, %xmm0
550; SSE41-NEXT:    movapd %xmm0, %xmm1
551; SSE41-NEXT:    pcmpgtd %xmm10, %xmm1
552; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2]
553; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
554; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
555; SSE41-NEXT:    pand %xmm5, %xmm0
556; SSE41-NEXT:    por %xmm1, %xmm0
557; SSE41-NEXT:    pxor %xmm1, %xmm1
558; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm1
559; SSE41-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm3[0,2]
560; SSE41-NEXT:    movapd %xmm9, %xmm0
561; SSE41-NEXT:    xorpd %xmm10, %xmm0
562; SSE41-NEXT:    movapd %xmm0, %xmm3
563; SSE41-NEXT:    pcmpgtd %xmm10, %xmm3
564; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
565; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
566; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
567; SSE41-NEXT:    pand %xmm4, %xmm0
568; SSE41-NEXT:    por %xmm3, %xmm0
569; SSE41-NEXT:    pxor %xmm3, %xmm3
570; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm3
571; SSE41-NEXT:    movapd %xmm8, %xmm0
572; SSE41-NEXT:    xorpd %xmm10, %xmm0
573; SSE41-NEXT:    movapd %xmm0, %xmm4
574; SSE41-NEXT:    pcmpgtd %xmm10, %xmm4
575; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
576; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
577; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
578; SSE41-NEXT:    pand %xmm5, %xmm0
579; SSE41-NEXT:    por %xmm4, %xmm0
580; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm2
581; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]
582; SSE41-NEXT:    movaps %xmm2, %xmm0
583; SSE41-NEXT:    retq
584;
585; AVX1-LABEL: trunc_packus_v8i64_v8i32:
586; AVX1:       # %bb.0:
587; AVX1-NEXT:    vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
588; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
589; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [4294967295,4294967295]
590; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
591; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm5
592; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm5, %ymm3
593; AVX1-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
594; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
595; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
596; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm4, %xmm4
597; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
598; AVX1-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
599; AVX1-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
600; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm3
601; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
602; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm5
603; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm6
604; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
605; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm7, %xmm2
606; AVX1-NEXT:    vpand %xmm7, %xmm2, %xmm2
607; AVX1-NEXT:    vpand %xmm1, %xmm6, %xmm1
608; AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
609; AVX1-NEXT:    vpand %xmm4, %xmm5, %xmm2
610; AVX1-NEXT:    vpand %xmm0, %xmm3, %xmm0
611; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
612; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
613; AVX1-NEXT:    retq
614;
615; AVX2-SLOW-LABEL: trunc_packus_v8i64_v8i32:
616; AVX2-SLOW:       # %bb.0:
617; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
618; AVX2-SLOW-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
619; AVX2-SLOW-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
620; AVX2-SLOW-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
621; AVX2-SLOW-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
622; AVX2-SLOW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
623; AVX2-SLOW-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm3
624; AVX2-SLOW-NEXT:    vpand %ymm1, %ymm3, %ymm1
625; AVX2-SLOW-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm2
626; AVX2-SLOW-NEXT:    vpand %ymm0, %ymm2, %ymm0
627; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[0,2,2,3,4,6,6,7]
628; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
629; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} ymm1 = ymm1[0,2,2,3,4,6,6,7]
630; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
631; AVX2-SLOW-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
632; AVX2-SLOW-NEXT:    retq
633;
634; AVX2-FAST-LABEL: trunc_packus_v8i64_v8i32:
635; AVX2-FAST:       # %bb.0:
636; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
637; AVX2-FAST-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
638; AVX2-FAST-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
639; AVX2-FAST-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
640; AVX2-FAST-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
641; AVX2-FAST-NEXT:    vpxor %xmm2, %xmm2, %xmm2
642; AVX2-FAST-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm3
643; AVX2-FAST-NEXT:    vpand %ymm1, %ymm3, %ymm1
644; AVX2-FAST-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm2
645; AVX2-FAST-NEXT:    vpand %ymm0, %ymm2, %ymm0
646; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
647; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm2, %ymm0
648; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm2, %ymm1
649; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
650; AVX2-FAST-NEXT:    retq
651;
652; AVX512-LABEL: trunc_packus_v8i64_v8i32:
653; AVX512:       # %bb.0:
654; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1
655; AVX512-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
656; AVX512-NEXT:    vpmovusqd %zmm0, %ymm0
657; AVX512-NEXT:    retq
658  %1 = icmp slt <8 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
659  %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>
660  %3 = icmp sgt <8 x i64> %2, zeroinitializer
661  %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> zeroinitializer
662  %5 = trunc <8 x i64> %4 to <8 x i32>
663  ret <8 x i32> %5
664}
665
666;
667; PACKUS saturation truncation to vXi16
668;
669
670define <8 x i16> @trunc_packus_v8i64_v8i16(<8 x i64> %a0) {
671; SSE2-LABEL: trunc_packus_v8i64_v8i16:
672; SSE2:       # %bb.0:
673; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [65535,65535]
674; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648]
675; SSE2-NEXT:    movdqa %xmm1, %xmm5
676; SSE2-NEXT:    pxor %xmm10, %xmm5
677; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [2147549183,2147549183]
678; SSE2-NEXT:    movdqa %xmm9, %xmm6
679; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
680; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
681; SSE2-NEXT:    pcmpeqd %xmm9, %xmm5
682; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
683; SSE2-NEXT:    pand %xmm7, %xmm4
684; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
685; SSE2-NEXT:    por %xmm4, %xmm5
686; SSE2-NEXT:    pand %xmm5, %xmm1
687; SSE2-NEXT:    pandn %xmm8, %xmm5
688; SSE2-NEXT:    por %xmm1, %xmm5
689; SSE2-NEXT:    movdqa %xmm0, %xmm1
690; SSE2-NEXT:    pxor %xmm10, %xmm1
691; SSE2-NEXT:    movdqa %xmm9, %xmm4
692; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
693; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
694; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
695; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
696; SSE2-NEXT:    pand %xmm6, %xmm7
697; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
698; SSE2-NEXT:    por %xmm7, %xmm1
699; SSE2-NEXT:    pand %xmm1, %xmm0
700; SSE2-NEXT:    pandn %xmm8, %xmm1
701; SSE2-NEXT:    por %xmm0, %xmm1
702; SSE2-NEXT:    movdqa %xmm3, %xmm0
703; SSE2-NEXT:    pxor %xmm10, %xmm0
704; SSE2-NEXT:    movdqa %xmm9, %xmm4
705; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
706; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
707; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
708; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
709; SSE2-NEXT:    pand %xmm6, %xmm0
710; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3]
711; SSE2-NEXT:    por %xmm0, %xmm6
712; SSE2-NEXT:    pand %xmm6, %xmm3
713; SSE2-NEXT:    pandn %xmm8, %xmm6
714; SSE2-NEXT:    por %xmm3, %xmm6
715; SSE2-NEXT:    movdqa %xmm2, %xmm0
716; SSE2-NEXT:    pxor %xmm10, %xmm0
717; SSE2-NEXT:    movdqa %xmm9, %xmm3
718; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
719; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
720; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
721; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
722; SSE2-NEXT:    pand %xmm4, %xmm0
723; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
724; SSE2-NEXT:    por %xmm0, %xmm3
725; SSE2-NEXT:    pand %xmm3, %xmm2
726; SSE2-NEXT:    pandn %xmm8, %xmm3
727; SSE2-NEXT:    por %xmm2, %xmm3
728; SSE2-NEXT:    movdqa %xmm3, %xmm0
729; SSE2-NEXT:    pxor %xmm10, %xmm0
730; SSE2-NEXT:    movdqa %xmm0, %xmm2
731; SSE2-NEXT:    pcmpgtd %xmm10, %xmm2
732; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
733; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
734; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
735; SSE2-NEXT:    pand %xmm4, %xmm7
736; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
737; SSE2-NEXT:    por %xmm7, %xmm0
738; SSE2-NEXT:    pand %xmm3, %xmm0
739; SSE2-NEXT:    movdqa %xmm6, %xmm2
740; SSE2-NEXT:    pxor %xmm10, %xmm2
741; SSE2-NEXT:    movdqa %xmm2, %xmm3
742; SSE2-NEXT:    pcmpgtd %xmm10, %xmm3
743; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
744; SSE2-NEXT:    pcmpeqd %xmm10, %xmm2
745; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
746; SSE2-NEXT:    pand %xmm4, %xmm7
747; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
748; SSE2-NEXT:    por %xmm7, %xmm2
749; SSE2-NEXT:    pand %xmm6, %xmm2
750; SSE2-NEXT:    movdqa %xmm1, %xmm3
751; SSE2-NEXT:    pxor %xmm10, %xmm3
752; SSE2-NEXT:    movdqa %xmm3, %xmm4
753; SSE2-NEXT:    pcmpgtd %xmm10, %xmm4
754; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
755; SSE2-NEXT:    pcmpeqd %xmm10, %xmm3
756; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
757; SSE2-NEXT:    pand %xmm6, %xmm3
758; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
759; SSE2-NEXT:    por %xmm3, %xmm4
760; SSE2-NEXT:    pand %xmm1, %xmm4
761; SSE2-NEXT:    movdqa %xmm5, %xmm1
762; SSE2-NEXT:    pxor %xmm10, %xmm1
763; SSE2-NEXT:    movdqa %xmm1, %xmm3
764; SSE2-NEXT:    pcmpgtd %xmm10, %xmm3
765; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
766; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
767; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
768; SSE2-NEXT:    pand %xmm6, %xmm1
769; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
770; SSE2-NEXT:    por %xmm1, %xmm3
771; SSE2-NEXT:    pand %xmm5, %xmm3
772; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]
773; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
774; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[0,2,2,3]
775; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,2,2,3,4,5,6,7]
776; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
777; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
778; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,1,0,2,4,5,6,7]
779; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
780; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
781; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
782; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm3[0],xmm0[1]
783; SSE2-NEXT:    retq
784;
785; SSSE3-LABEL: trunc_packus_v8i64_v8i16:
786; SSSE3:       # %bb.0:
787; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [65535,65535]
788; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648]
789; SSSE3-NEXT:    movdqa %xmm1, %xmm5
790; SSSE3-NEXT:    pxor %xmm10, %xmm5
791; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [2147549183,2147549183]
792; SSSE3-NEXT:    movdqa %xmm9, %xmm6
793; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm6
794; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
795; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm5
796; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
797; SSSE3-NEXT:    pand %xmm7, %xmm4
798; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
799; SSSE3-NEXT:    por %xmm4, %xmm5
800; SSSE3-NEXT:    pand %xmm5, %xmm1
801; SSSE3-NEXT:    pandn %xmm8, %xmm5
802; SSSE3-NEXT:    por %xmm1, %xmm5
803; SSSE3-NEXT:    movdqa %xmm0, %xmm1
804; SSSE3-NEXT:    pxor %xmm10, %xmm1
805; SSSE3-NEXT:    movdqa %xmm9, %xmm4
806; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
807; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
808; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
809; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
810; SSSE3-NEXT:    pand %xmm6, %xmm7
811; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
812; SSSE3-NEXT:    por %xmm7, %xmm1
813; SSSE3-NEXT:    pand %xmm1, %xmm0
814; SSSE3-NEXT:    pandn %xmm8, %xmm1
815; SSSE3-NEXT:    por %xmm0, %xmm1
816; SSSE3-NEXT:    movdqa %xmm3, %xmm0
817; SSSE3-NEXT:    pxor %xmm10, %xmm0
818; SSSE3-NEXT:    movdqa %xmm9, %xmm4
819; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm4
820; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
821; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
822; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
823; SSSE3-NEXT:    pand %xmm6, %xmm0
824; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3]
825; SSSE3-NEXT:    por %xmm0, %xmm6
826; SSSE3-NEXT:    pand %xmm6, %xmm3
827; SSSE3-NEXT:    pandn %xmm8, %xmm6
828; SSSE3-NEXT:    por %xmm3, %xmm6
829; SSSE3-NEXT:    movdqa %xmm2, %xmm0
830; SSSE3-NEXT:    pxor %xmm10, %xmm0
831; SSSE3-NEXT:    movdqa %xmm9, %xmm3
832; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm3
833; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
834; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
835; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
836; SSSE3-NEXT:    pand %xmm4, %xmm0
837; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
838; SSSE3-NEXT:    por %xmm0, %xmm3
839; SSSE3-NEXT:    pand %xmm3, %xmm2
840; SSSE3-NEXT:    pandn %xmm8, %xmm3
841; SSSE3-NEXT:    por %xmm2, %xmm3
842; SSSE3-NEXT:    movdqa %xmm3, %xmm0
843; SSSE3-NEXT:    pxor %xmm10, %xmm0
844; SSSE3-NEXT:    movdqa %xmm0, %xmm2
845; SSSE3-NEXT:    pcmpgtd %xmm10, %xmm2
846; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
847; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm0
848; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
849; SSSE3-NEXT:    pand %xmm4, %xmm7
850; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
851; SSSE3-NEXT:    por %xmm7, %xmm0
852; SSSE3-NEXT:    pand %xmm3, %xmm0
853; SSSE3-NEXT:    movdqa %xmm6, %xmm2
854; SSSE3-NEXT:    pxor %xmm10, %xmm2
855; SSSE3-NEXT:    movdqa %xmm2, %xmm3
856; SSSE3-NEXT:    pcmpgtd %xmm10, %xmm3
857; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
858; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm2
859; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
860; SSSE3-NEXT:    pand %xmm4, %xmm7
861; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
862; SSSE3-NEXT:    por %xmm7, %xmm2
863; SSSE3-NEXT:    pand %xmm6, %xmm2
864; SSSE3-NEXT:    movdqa %xmm1, %xmm3
865; SSSE3-NEXT:    pxor %xmm10, %xmm3
866; SSSE3-NEXT:    movdqa %xmm3, %xmm4
867; SSSE3-NEXT:    pcmpgtd %xmm10, %xmm4
868; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
869; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm3
870; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
871; SSSE3-NEXT:    pand %xmm6, %xmm3
872; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
873; SSSE3-NEXT:    por %xmm3, %xmm4
874; SSSE3-NEXT:    pand %xmm1, %xmm4
875; SSSE3-NEXT:    movdqa %xmm5, %xmm1
876; SSSE3-NEXT:    pxor %xmm10, %xmm1
877; SSSE3-NEXT:    movdqa %xmm1, %xmm3
878; SSSE3-NEXT:    pcmpgtd %xmm10, %xmm3
879; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
880; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm1
881; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
882; SSSE3-NEXT:    pand %xmm6, %xmm1
883; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
884; SSSE3-NEXT:    por %xmm1, %xmm3
885; SSSE3-NEXT:    pand %xmm5, %xmm3
886; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]
887; SSSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
888; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[0,2,2,3]
889; SSSE3-NEXT:    pshuflw {{.*#+}} xmm3 = xmm3[0,2,2,3,4,5,6,7]
890; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
891; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
892; SSSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,1,0,2,4,5,6,7]
893; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
894; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
895; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
896; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm3[0],xmm0[1]
897; SSSE3-NEXT:    retq
898;
899; SSE41-LABEL: trunc_packus_v8i64_v8i16:
900; SSE41:       # %bb.0:
901; SSE41-NEXT:    movdqa %xmm0, %xmm9
902; SSE41-NEXT:    movapd {{.*#+}} xmm7 = [65535,65535]
903; SSE41-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648]
904; SSE41-NEXT:    movdqa %xmm2, %xmm0
905; SSE41-NEXT:    pxor %xmm10, %xmm0
906; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [2147549183,2147549183]
907; SSE41-NEXT:    movdqa %xmm6, %xmm4
908; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
909; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
910; SSE41-NEXT:    pcmpeqd %xmm6, %xmm0
911; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
912; SSE41-NEXT:    pand %xmm5, %xmm0
913; SSE41-NEXT:    por %xmm4, %xmm0
914; SSE41-NEXT:    movapd %xmm7, %xmm8
915; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm8
916; SSE41-NEXT:    movdqa %xmm3, %xmm0
917; SSE41-NEXT:    pxor %xmm10, %xmm0
918; SSE41-NEXT:    movdqa %xmm6, %xmm2
919; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
920; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
921; SSE41-NEXT:    pcmpeqd %xmm6, %xmm0
922; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
923; SSE41-NEXT:    pand %xmm4, %xmm0
924; SSE41-NEXT:    por %xmm2, %xmm0
925; SSE41-NEXT:    movapd %xmm7, %xmm2
926; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
927; SSE41-NEXT:    movdqa %xmm9, %xmm0
928; SSE41-NEXT:    pxor %xmm10, %xmm0
929; SSE41-NEXT:    movdqa %xmm6, %xmm3
930; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
931; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
932; SSE41-NEXT:    pcmpeqd %xmm6, %xmm0
933; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
934; SSE41-NEXT:    pand %xmm4, %xmm0
935; SSE41-NEXT:    por %xmm3, %xmm0
936; SSE41-NEXT:    movapd %xmm7, %xmm4
937; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm4
938; SSE41-NEXT:    movdqa %xmm1, %xmm0
939; SSE41-NEXT:    pxor %xmm10, %xmm0
940; SSE41-NEXT:    movdqa %xmm6, %xmm3
941; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
942; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
943; SSE41-NEXT:    pcmpeqd %xmm6, %xmm0
944; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
945; SSE41-NEXT:    pand %xmm5, %xmm0
946; SSE41-NEXT:    por %xmm3, %xmm0
947; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm7
948; SSE41-NEXT:    pxor %xmm3, %xmm3
949; SSE41-NEXT:    movapd %xmm7, %xmm0
950; SSE41-NEXT:    xorpd %xmm10, %xmm0
951; SSE41-NEXT:    movapd %xmm0, %xmm1
952; SSE41-NEXT:    pcmpgtd %xmm10, %xmm1
953; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2]
954; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
955; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
956; SSE41-NEXT:    pand %xmm5, %xmm0
957; SSE41-NEXT:    por %xmm1, %xmm0
958; SSE41-NEXT:    pxor %xmm5, %xmm5
959; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm5
960; SSE41-NEXT:    movapd %xmm4, %xmm0
961; SSE41-NEXT:    xorpd %xmm10, %xmm0
962; SSE41-NEXT:    movapd %xmm0, %xmm1
963; SSE41-NEXT:    pcmpgtd %xmm10, %xmm1
964; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
965; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
966; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
967; SSE41-NEXT:    pand %xmm6, %xmm0
968; SSE41-NEXT:    por %xmm1, %xmm0
969; SSE41-NEXT:    pxor %xmm1, %xmm1
970; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm1
971; SSE41-NEXT:    packusdw %xmm5, %xmm1
972; SSE41-NEXT:    movapd %xmm2, %xmm0
973; SSE41-NEXT:    xorpd %xmm10, %xmm0
974; SSE41-NEXT:    movapd %xmm0, %xmm4
975; SSE41-NEXT:    pcmpgtd %xmm10, %xmm4
976; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
977; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
978; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
979; SSE41-NEXT:    pand %xmm5, %xmm0
980; SSE41-NEXT:    por %xmm4, %xmm0
981; SSE41-NEXT:    pxor %xmm4, %xmm4
982; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
983; SSE41-NEXT:    movapd %xmm8, %xmm0
984; SSE41-NEXT:    xorpd %xmm10, %xmm0
985; SSE41-NEXT:    movapd %xmm0, %xmm2
986; SSE41-NEXT:    pcmpgtd %xmm10, %xmm2
987; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
988; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
989; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
990; SSE41-NEXT:    pand %xmm5, %xmm0
991; SSE41-NEXT:    por %xmm2, %xmm0
992; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm3
993; SSE41-NEXT:    packusdw %xmm4, %xmm3
994; SSE41-NEXT:    packusdw %xmm3, %xmm1
995; SSE41-NEXT:    movdqa %xmm1, %xmm0
996; SSE41-NEXT:    retq
997;
998; AVX1-LABEL: trunc_packus_v8i64_v8i16:
999; AVX1:       # %bb.0:
1000; AVX1-NEXT:    vmovapd {{.*#+}} ymm2 = [65535,65535,65535,65535]
1001; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1002; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [65535,65535]
1003; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
1004; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm5
1005; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm5, %ymm3
1006; AVX1-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
1007; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1008; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
1009; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm4, %xmm4
1010; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
1011; AVX1-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1012; AVX1-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
1013; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm3
1014; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
1015; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm5
1016; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm6
1017; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
1018; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm7, %xmm2
1019; AVX1-NEXT:    vpand %xmm7, %xmm2, %xmm2
1020; AVX1-NEXT:    vpand %xmm1, %xmm6, %xmm1
1021; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
1022; AVX1-NEXT:    vpand %xmm4, %xmm5, %xmm2
1023; AVX1-NEXT:    vpand %xmm0, %xmm3, %xmm0
1024; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
1025; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1026; AVX1-NEXT:    vzeroupper
1027; AVX1-NEXT:    retq
1028;
1029; AVX2-LABEL: trunc_packus_v8i64_v8i16:
1030; AVX2:       # %bb.0:
1031; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [65535,65535,65535,65535]
1032; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
1033; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1034; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
1035; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
1036; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1037; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm3
1038; AVX2-NEXT:    vpand %ymm1, %ymm3, %ymm1
1039; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm2
1040; AVX2-NEXT:    vpand %ymm0, %ymm2, %ymm0
1041; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
1042; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1043; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1044; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1045; AVX2-NEXT:    vzeroupper
1046; AVX2-NEXT:    retq
1047;
1048; AVX512-LABEL: trunc_packus_v8i64_v8i16:
1049; AVX512:       # %bb.0:
1050; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1051; AVX512-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
1052; AVX512-NEXT:    vpmovusqw %zmm0, %xmm0
1053; AVX512-NEXT:    vzeroupper
1054; AVX512-NEXT:    retq
1055  %1 = icmp slt <8 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
1056  %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>
1057  %3 = icmp sgt <8 x i64> %2, zeroinitializer
1058  %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> zeroinitializer
1059  %5 = trunc <8 x i64> %4 to <8 x i16>
1060  ret <8 x i16> %5
1061}
1062
1063define <8 x i16> @trunc_packus_v8i32_v8i16(<8 x i32> %a0) {
1064; SSE2-LABEL: trunc_packus_v8i32_v8i16:
1065; SSE2:       # %bb.0:
1066; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
1067; SSE2-NEXT:    movdqa %xmm2, %xmm3
1068; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
1069; SSE2-NEXT:    pand %xmm3, %xmm1
1070; SSE2-NEXT:    pandn %xmm2, %xmm3
1071; SSE2-NEXT:    por %xmm1, %xmm3
1072; SSE2-NEXT:    movdqa %xmm2, %xmm1
1073; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1074; SSE2-NEXT:    pand %xmm1, %xmm0
1075; SSE2-NEXT:    pandn %xmm2, %xmm1
1076; SSE2-NEXT:    por %xmm0, %xmm1
1077; SSE2-NEXT:    pxor %xmm2, %xmm2
1078; SSE2-NEXT:    movdqa %xmm1, %xmm0
1079; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
1080; SSE2-NEXT:    pand %xmm1, %xmm0
1081; SSE2-NEXT:    movdqa %xmm3, %xmm1
1082; SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
1083; SSE2-NEXT:    pand %xmm3, %xmm1
1084; SSE2-NEXT:    pslld $16, %xmm1
1085; SSE2-NEXT:    psrad $16, %xmm1
1086; SSE2-NEXT:    pslld $16, %xmm0
1087; SSE2-NEXT:    psrad $16, %xmm0
1088; SSE2-NEXT:    packssdw %xmm1, %xmm0
1089; SSE2-NEXT:    retq
1090;
1091; SSSE3-LABEL: trunc_packus_v8i32_v8i16:
1092; SSSE3:       # %bb.0:
1093; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
1094; SSSE3-NEXT:    movdqa %xmm2, %xmm3
1095; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
1096; SSSE3-NEXT:    pand %xmm3, %xmm1
1097; SSSE3-NEXT:    pandn %xmm2, %xmm3
1098; SSSE3-NEXT:    por %xmm1, %xmm3
1099; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1100; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
1101; SSSE3-NEXT:    pand %xmm1, %xmm0
1102; SSSE3-NEXT:    pandn %xmm2, %xmm1
1103; SSSE3-NEXT:    por %xmm0, %xmm1
1104; SSSE3-NEXT:    pxor %xmm2, %xmm2
1105; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1106; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm0
1107; SSSE3-NEXT:    pand %xmm1, %xmm0
1108; SSSE3-NEXT:    movdqa %xmm3, %xmm1
1109; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm1
1110; SSSE3-NEXT:    pand %xmm3, %xmm1
1111; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1112; SSSE3-NEXT:    pshufb %xmm2, %xmm1
1113; SSSE3-NEXT:    pshufb %xmm2, %xmm0
1114; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1115; SSSE3-NEXT:    retq
1116;
1117; SSE41-LABEL: trunc_packus_v8i32_v8i16:
1118; SSE41:       # %bb.0:
1119; SSE41-NEXT:    packusdw %xmm1, %xmm0
1120; SSE41-NEXT:    retq
1121;
1122; AVX1-LABEL: trunc_packus_v8i32_v8i16:
1123; AVX1:       # %bb.0:
1124; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1125; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1126; AVX1-NEXT:    vzeroupper
1127; AVX1-NEXT:    retq
1128;
1129; AVX2-LABEL: trunc_packus_v8i32_v8i16:
1130; AVX2:       # %bb.0:
1131; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1132; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1133; AVX2-NEXT:    vzeroupper
1134; AVX2-NEXT:    retq
1135;
1136; AVX512F-LABEL: trunc_packus_v8i32_v8i16:
1137; AVX512F:       # %bb.0:
1138; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535]
1139; AVX512F-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
1140; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1141; AVX512F-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
1142; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
1143; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1144; AVX512F-NEXT:    vzeroupper
1145; AVX512F-NEXT:    retq
1146;
1147; AVX512VL-LABEL: trunc_packus_v8i32_v8i16:
1148; AVX512VL:       # %bb.0:
1149; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1150; AVX512VL-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
1151; AVX512VL-NEXT:    vpmovusdw %ymm0, %xmm0
1152; AVX512VL-NEXT:    vzeroupper
1153; AVX512VL-NEXT:    retq
1154;
1155; AVX512BW-LABEL: trunc_packus_v8i32_v8i16:
1156; AVX512BW:       # %bb.0:
1157; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535]
1158; AVX512BW-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
1159; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1160; AVX512BW-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
1161; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
1162; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1163; AVX512BW-NEXT:    vzeroupper
1164; AVX512BW-NEXT:    retq
1165;
1166; AVX512BWVL-LABEL: trunc_packus_v8i32_v8i16:
1167; AVX512BWVL:       # %bb.0:
1168; AVX512BWVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1169; AVX512BWVL-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
1170; AVX512BWVL-NEXT:    vpmovusdw %ymm0, %xmm0
1171; AVX512BWVL-NEXT:    vzeroupper
1172; AVX512BWVL-NEXT:    retq
1173  %1 = icmp slt <8 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
1174  %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>
1175  %3 = icmp sgt <8 x i32> %2, zeroinitializer
1176  %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> zeroinitializer
1177  %5 = trunc <8 x i32> %4 to <8 x i16>
1178  ret <8 x i16> %5
1179}
1180
1181define <16 x i16> @trunc_packus_v16i32_v16i16(<16 x i32> %a0) {
1182; SSE2-LABEL: trunc_packus_v16i32_v16i16:
1183; SSE2:       # %bb.0:
1184; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [65535,65535,65535,65535]
1185; SSE2-NEXT:    movdqa %xmm6, %xmm4
1186; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
1187; SSE2-NEXT:    pand %xmm4, %xmm1
1188; SSE2-NEXT:    pandn %xmm6, %xmm4
1189; SSE2-NEXT:    por %xmm1, %xmm4
1190; SSE2-NEXT:    movdqa %xmm6, %xmm5
1191; SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
1192; SSE2-NEXT:    pand %xmm5, %xmm0
1193; SSE2-NEXT:    pandn %xmm6, %xmm5
1194; SSE2-NEXT:    por %xmm0, %xmm5
1195; SSE2-NEXT:    movdqa %xmm6, %xmm0
1196; SSE2-NEXT:    pcmpgtd %xmm3, %xmm0
1197; SSE2-NEXT:    pand %xmm0, %xmm3
1198; SSE2-NEXT:    pandn %xmm6, %xmm0
1199; SSE2-NEXT:    por %xmm3, %xmm0
1200; SSE2-NEXT:    movdqa %xmm6, %xmm3
1201; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
1202; SSE2-NEXT:    pand %xmm3, %xmm2
1203; SSE2-NEXT:    pandn %xmm6, %xmm3
1204; SSE2-NEXT:    por %xmm2, %xmm3
1205; SSE2-NEXT:    pxor %xmm2, %xmm2
1206; SSE2-NEXT:    movdqa %xmm3, %xmm1
1207; SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
1208; SSE2-NEXT:    pand %xmm3, %xmm1
1209; SSE2-NEXT:    movdqa %xmm0, %xmm3
1210; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
1211; SSE2-NEXT:    pand %xmm0, %xmm3
1212; SSE2-NEXT:    movdqa %xmm5, %xmm0
1213; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
1214; SSE2-NEXT:    pand %xmm5, %xmm0
1215; SSE2-NEXT:    movdqa %xmm4, %xmm5
1216; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
1217; SSE2-NEXT:    pand %xmm4, %xmm5
1218; SSE2-NEXT:    pslld $16, %xmm5
1219; SSE2-NEXT:    psrad $16, %xmm5
1220; SSE2-NEXT:    pslld $16, %xmm0
1221; SSE2-NEXT:    psrad $16, %xmm0
1222; SSE2-NEXT:    packssdw %xmm5, %xmm0
1223; SSE2-NEXT:    pslld $16, %xmm3
1224; SSE2-NEXT:    psrad $16, %xmm3
1225; SSE2-NEXT:    pslld $16, %xmm1
1226; SSE2-NEXT:    psrad $16, %xmm1
1227; SSE2-NEXT:    packssdw %xmm3, %xmm1
1228; SSE2-NEXT:    retq
1229;
1230; SSSE3-LABEL: trunc_packus_v16i32_v16i16:
1231; SSSE3:       # %bb.0:
1232; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [65535,65535,65535,65535]
1233; SSSE3-NEXT:    movdqa %xmm6, %xmm4
1234; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
1235; SSSE3-NEXT:    pand %xmm4, %xmm1
1236; SSSE3-NEXT:    pandn %xmm6, %xmm4
1237; SSSE3-NEXT:    por %xmm1, %xmm4
1238; SSSE3-NEXT:    movdqa %xmm6, %xmm5
1239; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm5
1240; SSSE3-NEXT:    pand %xmm5, %xmm0
1241; SSSE3-NEXT:    pandn %xmm6, %xmm5
1242; SSSE3-NEXT:    por %xmm0, %xmm5
1243; SSSE3-NEXT:    movdqa %xmm6, %xmm0
1244; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm0
1245; SSSE3-NEXT:    pand %xmm0, %xmm3
1246; SSSE3-NEXT:    pandn %xmm6, %xmm0
1247; SSSE3-NEXT:    por %xmm3, %xmm0
1248; SSSE3-NEXT:    movdqa %xmm6, %xmm3
1249; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
1250; SSSE3-NEXT:    pand %xmm3, %xmm2
1251; SSSE3-NEXT:    pandn %xmm6, %xmm3
1252; SSSE3-NEXT:    por %xmm2, %xmm3
1253; SSSE3-NEXT:    pxor %xmm2, %xmm2
1254; SSSE3-NEXT:    movdqa %xmm3, %xmm1
1255; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm1
1256; SSSE3-NEXT:    pand %xmm3, %xmm1
1257; SSSE3-NEXT:    movdqa %xmm0, %xmm3
1258; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
1259; SSSE3-NEXT:    pand %xmm0, %xmm3
1260; SSSE3-NEXT:    movdqa %xmm5, %xmm0
1261; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm0
1262; SSSE3-NEXT:    pand %xmm5, %xmm0
1263; SSSE3-NEXT:    movdqa %xmm4, %xmm5
1264; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
1265; SSSE3-NEXT:    pand %xmm4, %xmm5
1266; SSSE3-NEXT:    pslld $16, %xmm5
1267; SSSE3-NEXT:    psrad $16, %xmm5
1268; SSSE3-NEXT:    pslld $16, %xmm0
1269; SSSE3-NEXT:    psrad $16, %xmm0
1270; SSSE3-NEXT:    packssdw %xmm5, %xmm0
1271; SSSE3-NEXT:    pslld $16, %xmm3
1272; SSSE3-NEXT:    psrad $16, %xmm3
1273; SSSE3-NEXT:    pslld $16, %xmm1
1274; SSSE3-NEXT:    psrad $16, %xmm1
1275; SSSE3-NEXT:    packssdw %xmm3, %xmm1
1276; SSSE3-NEXT:    retq
1277;
1278; SSE41-LABEL: trunc_packus_v16i32_v16i16:
1279; SSE41:       # %bb.0:
1280; SSE41-NEXT:    packusdw %xmm1, %xmm0
1281; SSE41-NEXT:    packusdw %xmm3, %xmm2
1282; SSE41-NEXT:    movdqa %xmm2, %xmm1
1283; SSE41-NEXT:    retq
1284;
1285; AVX1-LABEL: trunc_packus_v16i32_v16i16:
1286; AVX1:       # %bb.0:
1287; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1288; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
1289; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1290; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
1291; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1292; AVX1-NEXT:    retq
1293;
1294; AVX2-LABEL: trunc_packus_v16i32_v16i16:
1295; AVX2:       # %bb.0:
1296; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
1297; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1298; AVX2-NEXT:    retq
1299;
1300; AVX512-LABEL: trunc_packus_v16i32_v16i16:
1301; AVX512:       # %bb.0:
1302; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1303; AVX512-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
1304; AVX512-NEXT:    vpmovusdw %zmm0, %ymm0
1305; AVX512-NEXT:    retq
1306  %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>
1307  %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>
1308  %3 = icmp sgt <16 x i32> %2, zeroinitializer
1309  %4 = select <16 x i1> %3, <16 x i32> %2, <16 x i32> zeroinitializer
1310  %5 = trunc <16 x i32> %4 to <16 x i16>
1311  ret <16 x i16> %5
1312}
1313
1314;
1315; PACKUS saturation truncation to v16i8
1316;
1317
1318define <8 x i8> @trunc_packus_v8i64_v8i8(<8 x i64> %a0) {
1319; SSE2-LABEL: trunc_packus_v8i64_v8i8:
1320; SSE2:       # %bb.0:
1321; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
1322; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648]
1323; SSE2-NEXT:    movdqa %xmm2, %xmm5
1324; SSE2-NEXT:    pxor %xmm10, %xmm5
1325; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [2147483903,2147483903]
1326; SSE2-NEXT:    movdqa %xmm9, %xmm7
1327; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
1328; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[0,0,2,2]
1329; SSE2-NEXT:    pcmpeqd %xmm9, %xmm5
1330; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1331; SSE2-NEXT:    pand %xmm6, %xmm4
1332; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1333; SSE2-NEXT:    por %xmm4, %xmm5
1334; SSE2-NEXT:    pand %xmm5, %xmm2
1335; SSE2-NEXT:    pandn %xmm8, %xmm5
1336; SSE2-NEXT:    por %xmm2, %xmm5
1337; SSE2-NEXT:    movdqa %xmm3, %xmm2
1338; SSE2-NEXT:    pxor %xmm10, %xmm2
1339; SSE2-NEXT:    movdqa %xmm9, %xmm4
1340; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
1341; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1342; SSE2-NEXT:    pcmpeqd %xmm9, %xmm2
1343; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
1344; SSE2-NEXT:    pand %xmm6, %xmm7
1345; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
1346; SSE2-NEXT:    por %xmm7, %xmm2
1347; SSE2-NEXT:    pand %xmm2, %xmm3
1348; SSE2-NEXT:    pandn %xmm8, %xmm2
1349; SSE2-NEXT:    por %xmm3, %xmm2
1350; SSE2-NEXT:    movdqa %xmm0, %xmm3
1351; SSE2-NEXT:    pxor %xmm10, %xmm3
1352; SSE2-NEXT:    movdqa %xmm9, %xmm4
1353; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
1354; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1355; SSE2-NEXT:    pcmpeqd %xmm9, %xmm3
1356; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
1357; SSE2-NEXT:    pand %xmm6, %xmm7
1358; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1359; SSE2-NEXT:    por %xmm7, %xmm3
1360; SSE2-NEXT:    pand %xmm3, %xmm0
1361; SSE2-NEXT:    pandn %xmm8, %xmm3
1362; SSE2-NEXT:    por %xmm0, %xmm3
1363; SSE2-NEXT:    movdqa %xmm1, %xmm0
1364; SSE2-NEXT:    pxor %xmm10, %xmm0
1365; SSE2-NEXT:    movdqa %xmm9, %xmm4
1366; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
1367; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1368; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
1369; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1370; SSE2-NEXT:    pand %xmm6, %xmm0
1371; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1372; SSE2-NEXT:    por %xmm0, %xmm4
1373; SSE2-NEXT:    pand %xmm4, %xmm1
1374; SSE2-NEXT:    pandn %xmm8, %xmm4
1375; SSE2-NEXT:    por %xmm1, %xmm4
1376; SSE2-NEXT:    movdqa %xmm4, %xmm0
1377; SSE2-NEXT:    pxor %xmm10, %xmm0
1378; SSE2-NEXT:    movdqa %xmm0, %xmm1
1379; SSE2-NEXT:    pcmpgtd %xmm10, %xmm1
1380; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
1381; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
1382; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1383; SSE2-NEXT:    pand %xmm6, %xmm0
1384; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1385; SSE2-NEXT:    por %xmm0, %xmm1
1386; SSE2-NEXT:    pand %xmm4, %xmm1
1387; SSE2-NEXT:    movdqa %xmm3, %xmm0
1388; SSE2-NEXT:    pxor %xmm10, %xmm0
1389; SSE2-NEXT:    movdqa %xmm0, %xmm4
1390; SSE2-NEXT:    pcmpgtd %xmm10, %xmm4
1391; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1392; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
1393; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
1394; SSE2-NEXT:    pand %xmm6, %xmm7
1395; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1396; SSE2-NEXT:    por %xmm7, %xmm0
1397; SSE2-NEXT:    pand %xmm3, %xmm0
1398; SSE2-NEXT:    packuswb %xmm1, %xmm0
1399; SSE2-NEXT:    movdqa %xmm2, %xmm1
1400; SSE2-NEXT:    pxor %xmm10, %xmm1
1401; SSE2-NEXT:    movdqa %xmm1, %xmm3
1402; SSE2-NEXT:    pcmpgtd %xmm10, %xmm3
1403; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1404; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
1405; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1406; SSE2-NEXT:    pand %xmm4, %xmm1
1407; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1408; SSE2-NEXT:    por %xmm1, %xmm3
1409; SSE2-NEXT:    pand %xmm2, %xmm3
1410; SSE2-NEXT:    movdqa %xmm5, %xmm1
1411; SSE2-NEXT:    pxor %xmm10, %xmm1
1412; SSE2-NEXT:    movdqa %xmm1, %xmm2
1413; SSE2-NEXT:    pcmpgtd %xmm10, %xmm2
1414; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1415; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
1416; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1417; SSE2-NEXT:    pand %xmm4, %xmm1
1418; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1419; SSE2-NEXT:    por %xmm1, %xmm2
1420; SSE2-NEXT:    pand %xmm5, %xmm2
1421; SSE2-NEXT:    packuswb %xmm3, %xmm2
1422; SSE2-NEXT:    packuswb %xmm2, %xmm0
1423; SSE2-NEXT:    retq
1424;
1425; SSSE3-LABEL: trunc_packus_v8i64_v8i8:
1426; SSSE3:       # %bb.0:
1427; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
1428; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648]
1429; SSSE3-NEXT:    movdqa %xmm2, %xmm5
1430; SSSE3-NEXT:    pxor %xmm10, %xmm5
1431; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [2147483903,2147483903]
1432; SSSE3-NEXT:    movdqa %xmm9, %xmm7
1433; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm7
1434; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[0,0,2,2]
1435; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm5
1436; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1437; SSSE3-NEXT:    pand %xmm6, %xmm4
1438; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1439; SSSE3-NEXT:    por %xmm4, %xmm5
1440; SSSE3-NEXT:    pand %xmm5, %xmm2
1441; SSSE3-NEXT:    pandn %xmm8, %xmm5
1442; SSSE3-NEXT:    por %xmm2, %xmm5
1443; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1444; SSSE3-NEXT:    pxor %xmm10, %xmm2
1445; SSSE3-NEXT:    movdqa %xmm9, %xmm4
1446; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
1447; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1448; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm2
1449; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
1450; SSSE3-NEXT:    pand %xmm6, %xmm7
1451; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
1452; SSSE3-NEXT:    por %xmm7, %xmm2
1453; SSSE3-NEXT:    pand %xmm2, %xmm3
1454; SSSE3-NEXT:    pandn %xmm8, %xmm2
1455; SSSE3-NEXT:    por %xmm3, %xmm2
1456; SSSE3-NEXT:    movdqa %xmm0, %xmm3
1457; SSSE3-NEXT:    pxor %xmm10, %xmm3
1458; SSSE3-NEXT:    movdqa %xmm9, %xmm4
1459; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
1460; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1461; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm3
1462; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
1463; SSSE3-NEXT:    pand %xmm6, %xmm7
1464; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1465; SSSE3-NEXT:    por %xmm7, %xmm3
1466; SSSE3-NEXT:    pand %xmm3, %xmm0
1467; SSSE3-NEXT:    pandn %xmm8, %xmm3
1468; SSSE3-NEXT:    por %xmm0, %xmm3
1469; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1470; SSSE3-NEXT:    pxor %xmm10, %xmm0
1471; SSSE3-NEXT:    movdqa %xmm9, %xmm4
1472; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm4
1473; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1474; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
1475; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1476; SSSE3-NEXT:    pand %xmm6, %xmm0
1477; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1478; SSSE3-NEXT:    por %xmm0, %xmm4
1479; SSSE3-NEXT:    pand %xmm4, %xmm1
1480; SSSE3-NEXT:    pandn %xmm8, %xmm4
1481; SSSE3-NEXT:    por %xmm1, %xmm4
1482; SSSE3-NEXT:    movdqa %xmm4, %xmm0
1483; SSSE3-NEXT:    pxor %xmm10, %xmm0
1484; SSSE3-NEXT:    movdqa %xmm0, %xmm1
1485; SSSE3-NEXT:    pcmpgtd %xmm10, %xmm1
1486; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
1487; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm0
1488; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1489; SSSE3-NEXT:    pand %xmm6, %xmm0
1490; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1491; SSSE3-NEXT:    por %xmm0, %xmm1
1492; SSSE3-NEXT:    pand %xmm4, %xmm1
1493; SSSE3-NEXT:    movdqa %xmm3, %xmm0
1494; SSSE3-NEXT:    pxor %xmm10, %xmm0
1495; SSSE3-NEXT:    movdqa %xmm0, %xmm4
1496; SSSE3-NEXT:    pcmpgtd %xmm10, %xmm4
1497; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1498; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm0
1499; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
1500; SSSE3-NEXT:    pand %xmm6, %xmm7
1501; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1502; SSSE3-NEXT:    por %xmm7, %xmm0
1503; SSSE3-NEXT:    pand %xmm3, %xmm0
1504; SSSE3-NEXT:    packuswb %xmm1, %xmm0
1505; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1506; SSSE3-NEXT:    pxor %xmm10, %xmm1
1507; SSSE3-NEXT:    movdqa %xmm1, %xmm3
1508; SSSE3-NEXT:    pcmpgtd %xmm10, %xmm3
1509; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1510; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm1
1511; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1512; SSSE3-NEXT:    pand %xmm4, %xmm1
1513; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1514; SSSE3-NEXT:    por %xmm1, %xmm3
1515; SSSE3-NEXT:    pand %xmm2, %xmm3
1516; SSSE3-NEXT:    movdqa %xmm5, %xmm1
1517; SSSE3-NEXT:    pxor %xmm10, %xmm1
1518; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1519; SSSE3-NEXT:    pcmpgtd %xmm10, %xmm2
1520; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1521; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm1
1522; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1523; SSSE3-NEXT:    pand %xmm4, %xmm1
1524; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1525; SSSE3-NEXT:    por %xmm1, %xmm2
1526; SSSE3-NEXT:    pand %xmm5, %xmm2
1527; SSSE3-NEXT:    packuswb %xmm3, %xmm2
1528; SSSE3-NEXT:    packuswb %xmm2, %xmm0
1529; SSSE3-NEXT:    retq
1530;
1531; SSE41-LABEL: trunc_packus_v8i64_v8i8:
1532; SSE41:       # %bb.0:
1533; SSE41-NEXT:    movdqa %xmm0, %xmm9
1534; SSE41-NEXT:    movapd {{.*#+}} xmm7 = [255,255]
1535; SSE41-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648]
1536; SSE41-NEXT:    movdqa %xmm2, %xmm0
1537; SSE41-NEXT:    pxor %xmm10, %xmm0
1538; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [2147483903,2147483903]
1539; SSE41-NEXT:    movdqa %xmm6, %xmm4
1540; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
1541; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1542; SSE41-NEXT:    pcmpeqd %xmm6, %xmm0
1543; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1544; SSE41-NEXT:    pand %xmm5, %xmm0
1545; SSE41-NEXT:    por %xmm4, %xmm0
1546; SSE41-NEXT:    movapd %xmm7, %xmm8
1547; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm8
1548; SSE41-NEXT:    movdqa %xmm3, %xmm0
1549; SSE41-NEXT:    pxor %xmm10, %xmm0
1550; SSE41-NEXT:    movdqa %xmm6, %xmm2
1551; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
1552; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1553; SSE41-NEXT:    pcmpeqd %xmm6, %xmm0
1554; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1555; SSE41-NEXT:    pand %xmm4, %xmm0
1556; SSE41-NEXT:    por %xmm2, %xmm0
1557; SSE41-NEXT:    movapd %xmm7, %xmm2
1558; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
1559; SSE41-NEXT:    movdqa %xmm9, %xmm0
1560; SSE41-NEXT:    pxor %xmm10, %xmm0
1561; SSE41-NEXT:    movdqa %xmm6, %xmm3
1562; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
1563; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1564; SSE41-NEXT:    pcmpeqd %xmm6, %xmm0
1565; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1566; SSE41-NEXT:    pand %xmm4, %xmm0
1567; SSE41-NEXT:    por %xmm3, %xmm0
1568; SSE41-NEXT:    movapd %xmm7, %xmm4
1569; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm4
1570; SSE41-NEXT:    movdqa %xmm1, %xmm0
1571; SSE41-NEXT:    pxor %xmm10, %xmm0
1572; SSE41-NEXT:    movdqa %xmm6, %xmm3
1573; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
1574; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
1575; SSE41-NEXT:    pcmpeqd %xmm6, %xmm0
1576; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1577; SSE41-NEXT:    pand %xmm5, %xmm0
1578; SSE41-NEXT:    por %xmm3, %xmm0
1579; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm7
1580; SSE41-NEXT:    pxor %xmm3, %xmm3
1581; SSE41-NEXT:    movapd %xmm7, %xmm0
1582; SSE41-NEXT:    xorpd %xmm10, %xmm0
1583; SSE41-NEXT:    movapd %xmm0, %xmm1
1584; SSE41-NEXT:    pcmpgtd %xmm10, %xmm1
1585; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2]
1586; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
1587; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1588; SSE41-NEXT:    pand %xmm5, %xmm0
1589; SSE41-NEXT:    por %xmm1, %xmm0
1590; SSE41-NEXT:    pxor %xmm5, %xmm5
1591; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm5
1592; SSE41-NEXT:    movapd %xmm4, %xmm0
1593; SSE41-NEXT:    xorpd %xmm10, %xmm0
1594; SSE41-NEXT:    movapd %xmm0, %xmm1
1595; SSE41-NEXT:    pcmpgtd %xmm10, %xmm1
1596; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
1597; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
1598; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1599; SSE41-NEXT:    pand %xmm6, %xmm0
1600; SSE41-NEXT:    por %xmm1, %xmm0
1601; SSE41-NEXT:    pxor %xmm1, %xmm1
1602; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm1
1603; SSE41-NEXT:    packusdw %xmm5, %xmm1
1604; SSE41-NEXT:    movapd %xmm2, %xmm0
1605; SSE41-NEXT:    xorpd %xmm10, %xmm0
1606; SSE41-NEXT:    movapd %xmm0, %xmm4
1607; SSE41-NEXT:    pcmpgtd %xmm10, %xmm4
1608; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1609; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
1610; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1611; SSE41-NEXT:    pand %xmm5, %xmm0
1612; SSE41-NEXT:    por %xmm4, %xmm0
1613; SSE41-NEXT:    pxor %xmm4, %xmm4
1614; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
1615; SSE41-NEXT:    movapd %xmm8, %xmm0
1616; SSE41-NEXT:    xorpd %xmm10, %xmm0
1617; SSE41-NEXT:    movapd %xmm0, %xmm2
1618; SSE41-NEXT:    pcmpgtd %xmm10, %xmm2
1619; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
1620; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
1621; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1622; SSE41-NEXT:    pand %xmm5, %xmm0
1623; SSE41-NEXT:    por %xmm2, %xmm0
1624; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm3
1625; SSE41-NEXT:    packusdw %xmm4, %xmm3
1626; SSE41-NEXT:    packusdw %xmm3, %xmm1
1627; SSE41-NEXT:    movdqa %xmm1, %xmm0
1628; SSE41-NEXT:    retq
1629;
1630; AVX1-LABEL: trunc_packus_v8i64_v8i8:
1631; AVX1:       # %bb.0:
1632; AVX1-NEXT:    vmovapd {{.*#+}} ymm2 = [255,255,255,255]
1633; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1634; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255]
1635; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
1636; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm5
1637; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm5, %ymm3
1638; AVX1-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
1639; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1640; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
1641; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm4, %xmm4
1642; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
1643; AVX1-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1644; AVX1-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
1645; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm3
1646; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
1647; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm5
1648; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm6
1649; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
1650; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm7, %xmm2
1651; AVX1-NEXT:    vpand %xmm7, %xmm2, %xmm2
1652; AVX1-NEXT:    vpand %xmm1, %xmm6, %xmm1
1653; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
1654; AVX1-NEXT:    vpand %xmm4, %xmm5, %xmm2
1655; AVX1-NEXT:    vpand %xmm0, %xmm3, %xmm0
1656; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
1657; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1658; AVX1-NEXT:    vzeroupper
1659; AVX1-NEXT:    retq
1660;
1661; AVX2-LABEL: trunc_packus_v8i64_v8i8:
1662; AVX2:       # %bb.0:
1663; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [255,255,255,255]
1664; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
1665; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1666; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
1667; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
1668; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1669; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm3
1670; AVX2-NEXT:    vpand %ymm1, %ymm3, %ymm1
1671; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm2
1672; AVX2-NEXT:    vpand %ymm0, %ymm2, %ymm0
1673; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
1674; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1675; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1676; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1677; AVX2-NEXT:    vzeroupper
1678; AVX2-NEXT:    retq
1679;
1680; AVX512-LABEL: trunc_packus_v8i64_v8i8:
1681; AVX512:       # %bb.0:
1682; AVX512-NEXT:    vpminsq {{.*}}(%rip){1to8}, %zmm0, %zmm0
1683; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1684; AVX512-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
1685; AVX512-NEXT:    vpmovqw %zmm0, %xmm0
1686; AVX512-NEXT:    vzeroupper
1687; AVX512-NEXT:    retq
1688  %1 = icmp slt <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
1689  %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>
1690  %3 = icmp sgt <8 x i64> %2, zeroinitializer
1691  %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> zeroinitializer
1692  %5 = trunc <8 x i64> %4 to <8 x i8>
1693  ret <8 x i8> %5
1694}
1695
1696define void @trunc_packus_v8i64_v8i8_store(<8 x i64> %a0, <8 x i8> *%p1) {
1697; SSE2-LABEL: trunc_packus_v8i64_v8i8_store:
1698; SSE2:       # %bb.0:
1699; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
1700; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648]
1701; SSE2-NEXT:    movdqa %xmm3, %xmm4
1702; SSE2-NEXT:    pxor %xmm10, %xmm4
1703; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [2147483903,2147483903]
1704; SSE2-NEXT:    movdqa %xmm9, %xmm6
1705; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
1706; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1707; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
1708; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1709; SSE2-NEXT:    pand %xmm7, %xmm4
1710; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm6[1,1,3,3]
1711; SSE2-NEXT:    por %xmm4, %xmm11
1712; SSE2-NEXT:    pand %xmm11, %xmm3
1713; SSE2-NEXT:    pandn %xmm8, %xmm11
1714; SSE2-NEXT:    por %xmm3, %xmm11
1715; SSE2-NEXT:    movdqa %xmm2, %xmm3
1716; SSE2-NEXT:    pxor %xmm10, %xmm3
1717; SSE2-NEXT:    movdqa %xmm9, %xmm4
1718; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
1719; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
1720; SSE2-NEXT:    pcmpeqd %xmm9, %xmm3
1721; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]
1722; SSE2-NEXT:    pand %xmm7, %xmm5
1723; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1724; SSE2-NEXT:    por %xmm5, %xmm3
1725; SSE2-NEXT:    pand %xmm3, %xmm2
1726; SSE2-NEXT:    pandn %xmm8, %xmm3
1727; SSE2-NEXT:    por %xmm2, %xmm3
1728; SSE2-NEXT:    movdqa %xmm1, %xmm2
1729; SSE2-NEXT:    pxor %xmm10, %xmm2
1730; SSE2-NEXT:    movdqa %xmm9, %xmm4
1731; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
1732; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1733; SSE2-NEXT:    pcmpeqd %xmm9, %xmm2
1734; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
1735; SSE2-NEXT:    pand %xmm5, %xmm7
1736; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
1737; SSE2-NEXT:    por %xmm7, %xmm2
1738; SSE2-NEXT:    pand %xmm2, %xmm1
1739; SSE2-NEXT:    pandn %xmm8, %xmm2
1740; SSE2-NEXT:    por %xmm1, %xmm2
1741; SSE2-NEXT:    movdqa %xmm0, %xmm1
1742; SSE2-NEXT:    pxor %xmm10, %xmm1
1743; SSE2-NEXT:    movdqa %xmm9, %xmm4
1744; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
1745; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1746; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
1747; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
1748; SSE2-NEXT:    pand %xmm5, %xmm7
1749; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
1750; SSE2-NEXT:    por %xmm7, %xmm1
1751; SSE2-NEXT:    pand %xmm1, %xmm0
1752; SSE2-NEXT:    pandn %xmm8, %xmm1
1753; SSE2-NEXT:    por %xmm0, %xmm1
1754; SSE2-NEXT:    movdqa %xmm1, %xmm0
1755; SSE2-NEXT:    pxor %xmm10, %xmm0
1756; SSE2-NEXT:    movdqa %xmm0, %xmm4
1757; SSE2-NEXT:    pcmpgtd %xmm10, %xmm4
1758; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1759; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
1760; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
1761; SSE2-NEXT:    pand %xmm5, %xmm7
1762; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1763; SSE2-NEXT:    por %xmm7, %xmm0
1764; SSE2-NEXT:    movdqa %xmm2, %xmm4
1765; SSE2-NEXT:    pxor %xmm10, %xmm4
1766; SSE2-NEXT:    movdqa %xmm4, %xmm5
1767; SSE2-NEXT:    pcmpgtd %xmm10, %xmm5
1768; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
1769; SSE2-NEXT:    pcmpeqd %xmm10, %xmm4
1770; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1771; SSE2-NEXT:    pand %xmm7, %xmm4
1772; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[1,1,3,3]
1773; SSE2-NEXT:    por %xmm4, %xmm7
1774; SSE2-NEXT:    movdqa %xmm3, %xmm4
1775; SSE2-NEXT:    pxor %xmm10, %xmm4
1776; SSE2-NEXT:    movdqa %xmm4, %xmm5
1777; SSE2-NEXT:    pcmpgtd %xmm10, %xmm5
1778; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
1779; SSE2-NEXT:    pcmpeqd %xmm10, %xmm4
1780; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3]
1781; SSE2-NEXT:    pand %xmm9, %xmm6
1782; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1783; SSE2-NEXT:    por %xmm6, %xmm4
1784; SSE2-NEXT:    movdqa %xmm11, %xmm5
1785; SSE2-NEXT:    pxor %xmm10, %xmm5
1786; SSE2-NEXT:    movdqa %xmm5, %xmm6
1787; SSE2-NEXT:    pcmpgtd %xmm10, %xmm6
1788; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm6[0,0,2,2]
1789; SSE2-NEXT:    pcmpeqd %xmm10, %xmm5
1790; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1791; SSE2-NEXT:    pand %xmm9, %xmm5
1792; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1793; SSE2-NEXT:    por %xmm5, %xmm6
1794; SSE2-NEXT:    pand %xmm8, %xmm6
1795; SSE2-NEXT:    pand %xmm11, %xmm6
1796; SSE2-NEXT:    pand %xmm8, %xmm4
1797; SSE2-NEXT:    pand %xmm3, %xmm4
1798; SSE2-NEXT:    packuswb %xmm6, %xmm4
1799; SSE2-NEXT:    pand %xmm8, %xmm7
1800; SSE2-NEXT:    pand %xmm2, %xmm7
1801; SSE2-NEXT:    pand %xmm8, %xmm0
1802; SSE2-NEXT:    pand %xmm1, %xmm0
1803; SSE2-NEXT:    packuswb %xmm7, %xmm0
1804; SSE2-NEXT:    packuswb %xmm4, %xmm0
1805; SSE2-NEXT:    packuswb %xmm0, %xmm0
1806; SSE2-NEXT:    movq %xmm0, (%rdi)
1807; SSE2-NEXT:    retq
1808;
1809; SSSE3-LABEL: trunc_packus_v8i64_v8i8_store:
1810; SSSE3:       # %bb.0:
1811; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
1812; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [2147483648,2147483648]
1813; SSSE3-NEXT:    movdqa %xmm3, %xmm4
1814; SSSE3-NEXT:    pxor %xmm10, %xmm4
1815; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [2147483903,2147483903]
1816; SSSE3-NEXT:    movdqa %xmm9, %xmm6
1817; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
1818; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1819; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
1820; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1821; SSSE3-NEXT:    pand %xmm7, %xmm4
1822; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm6[1,1,3,3]
1823; SSSE3-NEXT:    por %xmm4, %xmm11
1824; SSSE3-NEXT:    pand %xmm11, %xmm3
1825; SSSE3-NEXT:    pandn %xmm8, %xmm11
1826; SSSE3-NEXT:    por %xmm3, %xmm11
1827; SSSE3-NEXT:    movdqa %xmm2, %xmm3
1828; SSSE3-NEXT:    pxor %xmm10, %xmm3
1829; SSSE3-NEXT:    movdqa %xmm9, %xmm4
1830; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
1831; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
1832; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm3
1833; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]
1834; SSSE3-NEXT:    pand %xmm7, %xmm5
1835; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1836; SSSE3-NEXT:    por %xmm5, %xmm3
1837; SSSE3-NEXT:    pand %xmm3, %xmm2
1838; SSSE3-NEXT:    pandn %xmm8, %xmm3
1839; SSSE3-NEXT:    por %xmm2, %xmm3
1840; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1841; SSSE3-NEXT:    pxor %xmm10, %xmm2
1842; SSSE3-NEXT:    movdqa %xmm9, %xmm4
1843; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
1844; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1845; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm2
1846; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
1847; SSSE3-NEXT:    pand %xmm5, %xmm7
1848; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
1849; SSSE3-NEXT:    por %xmm7, %xmm2
1850; SSSE3-NEXT:    pand %xmm2, %xmm1
1851; SSSE3-NEXT:    pandn %xmm8, %xmm2
1852; SSSE3-NEXT:    por %xmm1, %xmm2
1853; SSSE3-NEXT:    movdqa %xmm0, %xmm1
1854; SSSE3-NEXT:    pxor %xmm10, %xmm1
1855; SSSE3-NEXT:    movdqa %xmm9, %xmm4
1856; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
1857; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1858; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
1859; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
1860; SSSE3-NEXT:    pand %xmm5, %xmm7
1861; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
1862; SSSE3-NEXT:    por %xmm7, %xmm1
1863; SSSE3-NEXT:    pand %xmm1, %xmm0
1864; SSSE3-NEXT:    pandn %xmm8, %xmm1
1865; SSSE3-NEXT:    por %xmm0, %xmm1
1866; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1867; SSSE3-NEXT:    pxor %xmm10, %xmm0
1868; SSSE3-NEXT:    movdqa %xmm0, %xmm4
1869; SSSE3-NEXT:    pcmpgtd %xmm10, %xmm4
1870; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1871; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm0
1872; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
1873; SSSE3-NEXT:    pand %xmm5, %xmm7
1874; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1875; SSSE3-NEXT:    por %xmm7, %xmm0
1876; SSSE3-NEXT:    movdqa %xmm2, %xmm4
1877; SSSE3-NEXT:    pxor %xmm10, %xmm4
1878; SSSE3-NEXT:    movdqa %xmm4, %xmm5
1879; SSSE3-NEXT:    pcmpgtd %xmm10, %xmm5
1880; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
1881; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm4
1882; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1883; SSSE3-NEXT:    pand %xmm7, %xmm4
1884; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[1,1,3,3]
1885; SSSE3-NEXT:    por %xmm4, %xmm7
1886; SSSE3-NEXT:    movdqa %xmm3, %xmm4
1887; SSSE3-NEXT:    pxor %xmm10, %xmm4
1888; SSSE3-NEXT:    movdqa %xmm4, %xmm5
1889; SSSE3-NEXT:    pcmpgtd %xmm10, %xmm5
1890; SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
1891; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm4
1892; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3]
1893; SSSE3-NEXT:    pand %xmm9, %xmm6
1894; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1895; SSSE3-NEXT:    por %xmm6, %xmm4
1896; SSSE3-NEXT:    movdqa %xmm11, %xmm5
1897; SSSE3-NEXT:    pxor %xmm10, %xmm5
1898; SSSE3-NEXT:    movdqa %xmm5, %xmm6
1899; SSSE3-NEXT:    pcmpgtd %xmm10, %xmm6
1900; SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm6[0,0,2,2]
1901; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm5
1902; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1903; SSSE3-NEXT:    pand %xmm9, %xmm5
1904; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1905; SSSE3-NEXT:    por %xmm5, %xmm6
1906; SSSE3-NEXT:    pand %xmm8, %xmm6
1907; SSSE3-NEXT:    pand %xmm11, %xmm6
1908; SSSE3-NEXT:    pand %xmm8, %xmm4
1909; SSSE3-NEXT:    pand %xmm3, %xmm4
1910; SSSE3-NEXT:    packuswb %xmm6, %xmm4
1911; SSSE3-NEXT:    pand %xmm8, %xmm7
1912; SSSE3-NEXT:    pand %xmm2, %xmm7
1913; SSSE3-NEXT:    pand %xmm8, %xmm0
1914; SSSE3-NEXT:    pand %xmm1, %xmm0
1915; SSSE3-NEXT:    packuswb %xmm7, %xmm0
1916; SSSE3-NEXT:    packuswb %xmm4, %xmm0
1917; SSSE3-NEXT:    packuswb %xmm0, %xmm0
1918; SSSE3-NEXT:    movq %xmm0, (%rdi)
1919; SSSE3-NEXT:    retq
1920;
1921; SSE41-LABEL: trunc_packus_v8i64_v8i8_store:
1922; SSE41:       # %bb.0:
1923; SSE41-NEXT:    movdqa %xmm0, %xmm9
1924; SSE41-NEXT:    movapd {{.*#+}} xmm8 = [255,255]
1925; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648]
1926; SSE41-NEXT:    movdqa %xmm3, %xmm0
1927; SSE41-NEXT:    pxor %xmm6, %xmm0
1928; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [2147483903,2147483903]
1929; SSE41-NEXT:    movdqa %xmm5, %xmm4
1930; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
1931; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
1932; SSE41-NEXT:    pcmpeqd %xmm5, %xmm0
1933; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1934; SSE41-NEXT:    pand %xmm7, %xmm0
1935; SSE41-NEXT:    por %xmm4, %xmm0
1936; SSE41-NEXT:    movapd %xmm8, %xmm10
1937; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm10
1938; SSE41-NEXT:    movdqa %xmm2, %xmm0
1939; SSE41-NEXT:    pxor %xmm6, %xmm0
1940; SSE41-NEXT:    movdqa %xmm5, %xmm3
1941; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
1942; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1943; SSE41-NEXT:    pcmpeqd %xmm5, %xmm0
1944; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1945; SSE41-NEXT:    pand %xmm4, %xmm0
1946; SSE41-NEXT:    por %xmm3, %xmm0
1947; SSE41-NEXT:    movapd %xmm8, %xmm3
1948; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
1949; SSE41-NEXT:    movdqa %xmm1, %xmm0
1950; SSE41-NEXT:    pxor %xmm6, %xmm0
1951; SSE41-NEXT:    movdqa %xmm5, %xmm2
1952; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
1953; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1954; SSE41-NEXT:    pcmpeqd %xmm5, %xmm0
1955; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1956; SSE41-NEXT:    pand %xmm4, %xmm0
1957; SSE41-NEXT:    por %xmm2, %xmm0
1958; SSE41-NEXT:    movapd %xmm8, %xmm4
1959; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
1960; SSE41-NEXT:    movdqa %xmm9, %xmm0
1961; SSE41-NEXT:    pxor %xmm6, %xmm0
1962; SSE41-NEXT:    movdqa %xmm5, %xmm1
1963; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
1964; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
1965; SSE41-NEXT:    pcmpeqd %xmm5, %xmm0
1966; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1967; SSE41-NEXT:    pand %xmm2, %xmm0
1968; SSE41-NEXT:    por %xmm1, %xmm0
1969; SSE41-NEXT:    movapd %xmm8, %xmm5
1970; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm5
1971; SSE41-NEXT:    movapd %xmm5, %xmm0
1972; SSE41-NEXT:    xorpd %xmm6, %xmm0
1973; SSE41-NEXT:    movapd %xmm0, %xmm1
1974; SSE41-NEXT:    pcmpgtd %xmm6, %xmm1
1975; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
1976; SSE41-NEXT:    pcmpeqd %xmm6, %xmm0
1977; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1978; SSE41-NEXT:    pand %xmm2, %xmm0
1979; SSE41-NEXT:    por %xmm1, %xmm0
1980; SSE41-NEXT:    pxor %xmm2, %xmm2
1981; SSE41-NEXT:    pxor %xmm1, %xmm1
1982; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
1983; SSE41-NEXT:    movapd %xmm4, %xmm0
1984; SSE41-NEXT:    xorpd %xmm6, %xmm0
1985; SSE41-NEXT:    movapd %xmm0, %xmm5
1986; SSE41-NEXT:    pcmpgtd %xmm6, %xmm5
1987; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
1988; SSE41-NEXT:    pcmpeqd %xmm6, %xmm0
1989; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1990; SSE41-NEXT:    pand %xmm7, %xmm0
1991; SSE41-NEXT:    por %xmm5, %xmm0
1992; SSE41-NEXT:    pxor %xmm5, %xmm5
1993; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm5
1994; SSE41-NEXT:    movapd %xmm3, %xmm0
1995; SSE41-NEXT:    xorpd %xmm6, %xmm0
1996; SSE41-NEXT:    movapd %xmm0, %xmm4
1997; SSE41-NEXT:    pcmpgtd %xmm6, %xmm4
1998; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
1999; SSE41-NEXT:    pcmpeqd %xmm6, %xmm0
2000; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2001; SSE41-NEXT:    pand %xmm7, %xmm0
2002; SSE41-NEXT:    por %xmm4, %xmm0
2003; SSE41-NEXT:    pxor %xmm4, %xmm4
2004; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm4
2005; SSE41-NEXT:    movapd %xmm10, %xmm0
2006; SSE41-NEXT:    xorpd %xmm6, %xmm0
2007; SSE41-NEXT:    movapd %xmm0, %xmm3
2008; SSE41-NEXT:    pcmpgtd %xmm6, %xmm3
2009; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[0,0,2,2]
2010; SSE41-NEXT:    pcmpeqd %xmm6, %xmm0
2011; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2012; SSE41-NEXT:    pand %xmm7, %xmm0
2013; SSE41-NEXT:    por %xmm3, %xmm0
2014; SSE41-NEXT:    blendvpd %xmm0, %xmm10, %xmm2
2015; SSE41-NEXT:    andpd %xmm8, %xmm2
2016; SSE41-NEXT:    andpd %xmm8, %xmm4
2017; SSE41-NEXT:    packusdw %xmm2, %xmm4
2018; SSE41-NEXT:    andpd %xmm8, %xmm5
2019; SSE41-NEXT:    andpd %xmm8, %xmm1
2020; SSE41-NEXT:    packusdw %xmm5, %xmm1
2021; SSE41-NEXT:    packusdw %xmm4, %xmm1
2022; SSE41-NEXT:    packuswb %xmm1, %xmm1
2023; SSE41-NEXT:    movq %xmm1, (%rdi)
2024; SSE41-NEXT:    retq
2025;
2026; AVX1-LABEL: trunc_packus_v8i64_v8i8_store:
2027; AVX1:       # %bb.0:
2028; AVX1-NEXT:    vmovapd {{.*#+}} ymm2 = [255,255,255,255]
2029; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
2030; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255]
2031; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
2032; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm5
2033; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm5, %ymm3
2034; AVX1-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
2035; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2036; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
2037; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm4, %xmm4
2038; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
2039; AVX1-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
2040; AVX1-NEXT:    vxorpd %xmm2, %xmm2, %xmm2
2041; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm8
2042; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
2043; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm5
2044; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm6
2045; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
2046; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm7, %xmm2
2047; AVX1-NEXT:    vmovddup {{.*#+}} xmm3 = [1.2598673968951787E-321,1.2598673968951787E-321]
2048; AVX1-NEXT:    # xmm3 = mem[0,0]
2049; AVX1-NEXT:    vpand %xmm3, %xmm7, %xmm7
2050; AVX1-NEXT:    vpand %xmm7, %xmm2, %xmm2
2051; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
2052; AVX1-NEXT:    vpand %xmm1, %xmm6, %xmm1
2053; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
2054; AVX1-NEXT:    vpand %xmm3, %xmm4, %xmm2
2055; AVX1-NEXT:    vpand %xmm2, %xmm5, %xmm2
2056; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
2057; AVX1-NEXT:    vpand %xmm0, %xmm8, %xmm0
2058; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
2059; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
2060; AVX1-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
2061; AVX1-NEXT:    vmovq %xmm0, (%rdi)
2062; AVX1-NEXT:    vzeroupper
2063; AVX1-NEXT:    retq
2064;
2065; AVX2-LABEL: trunc_packus_v8i64_v8i8_store:
2066; AVX2:       # %bb.0:
2067; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [255,255,255,255]
2068; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
2069; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
2070; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
2071; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
2072; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2073; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
2074; AVX2-NEXT:    vpand %ymm0, %ymm3, %ymm0
2075; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm2
2076; AVX2-NEXT:    vpand %ymm1, %ymm2, %ymm1
2077; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
2078; AVX2-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
2079; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
2080; AVX2-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
2081; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
2082; AVX2-NEXT:    vpackusdw %xmm3, %xmm0, %xmm0
2083; AVX2-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
2084; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2085; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
2086; AVX2-NEXT:    vmovq %xmm0, (%rdi)
2087; AVX2-NEXT:    vzeroupper
2088; AVX2-NEXT:    retq
2089;
2090; AVX512-LABEL: trunc_packus_v8i64_v8i8_store:
2091; AVX512:       # %bb.0:
2092; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2093; AVX512-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
2094; AVX512-NEXT:    vpmovusqb %zmm0, (%rdi)
2095; AVX512-NEXT:    vzeroupper
2096; AVX512-NEXT:    retq
2097  %1 = icmp slt <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
2098  %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>
2099  %3 = icmp sgt <8 x i64> %2, zeroinitializer
2100  %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> zeroinitializer
2101  %5 = trunc <8 x i64> %4 to <8 x i8>
2102  store <8 x i8> %5, <8 x i8> *%p1
2103  ret void
2104}
2105
2106define <16 x i8> @trunc_packus_v16i64_v16i8(<16 x i64> %a0) {
2107; SSE2-LABEL: trunc_packus_v16i64_v16i8:
2108; SSE2:       # %bb.0:
2109; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [255,255]
2110; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648]
2111; SSE2-NEXT:    movdqa %xmm6, %xmm9
2112; SSE2-NEXT:    pxor %xmm8, %xmm9
2113; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [2147483903,2147483903]
2114; SSE2-NEXT:    movdqa %xmm11, %xmm12
2115; SSE2-NEXT:    pcmpgtd %xmm9, %xmm12
2116; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
2117; SSE2-NEXT:    pcmpeqd %xmm11, %xmm9
2118; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm9[1,1,3,3]
2119; SSE2-NEXT:    pand %xmm13, %xmm14
2120; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm12[1,1,3,3]
2121; SSE2-NEXT:    por %xmm14, %xmm9
2122; SSE2-NEXT:    pand %xmm9, %xmm6
2123; SSE2-NEXT:    pandn %xmm10, %xmm9
2124; SSE2-NEXT:    por %xmm6, %xmm9
2125; SSE2-NEXT:    movdqa %xmm7, %xmm6
2126; SSE2-NEXT:    pxor %xmm8, %xmm6
2127; SSE2-NEXT:    movdqa %xmm11, %xmm12
2128; SSE2-NEXT:    pcmpgtd %xmm6, %xmm12
2129; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
2130; SSE2-NEXT:    pcmpeqd %xmm11, %xmm6
2131; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2132; SSE2-NEXT:    pand %xmm13, %xmm6
2133; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
2134; SSE2-NEXT:    por %xmm6, %xmm12
2135; SSE2-NEXT:    pand %xmm12, %xmm7
2136; SSE2-NEXT:    pandn %xmm10, %xmm12
2137; SSE2-NEXT:    por %xmm7, %xmm12
2138; SSE2-NEXT:    movdqa %xmm4, %xmm6
2139; SSE2-NEXT:    pxor %xmm8, %xmm6
2140; SSE2-NEXT:    movdqa %xmm11, %xmm7
2141; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
2142; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm7[0,0,2,2]
2143; SSE2-NEXT:    pcmpeqd %xmm11, %xmm6
2144; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2145; SSE2-NEXT:    pand %xmm13, %xmm6
2146; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm7[1,1,3,3]
2147; SSE2-NEXT:    por %xmm6, %xmm13
2148; SSE2-NEXT:    pand %xmm13, %xmm4
2149; SSE2-NEXT:    pandn %xmm10, %xmm13
2150; SSE2-NEXT:    por %xmm4, %xmm13
2151; SSE2-NEXT:    movdqa %xmm5, %xmm4
2152; SSE2-NEXT:    pxor %xmm8, %xmm4
2153; SSE2-NEXT:    movdqa %xmm11, %xmm6
2154; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
2155; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2156; SSE2-NEXT:    pcmpeqd %xmm11, %xmm4
2157; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2158; SSE2-NEXT:    pand %xmm7, %xmm4
2159; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm6[1,1,3,3]
2160; SSE2-NEXT:    por %xmm4, %xmm14
2161; SSE2-NEXT:    pand %xmm14, %xmm5
2162; SSE2-NEXT:    pandn %xmm10, %xmm14
2163; SSE2-NEXT:    por %xmm5, %xmm14
2164; SSE2-NEXT:    movdqa %xmm2, %xmm4
2165; SSE2-NEXT:    pxor %xmm8, %xmm4
2166; SSE2-NEXT:    movdqa %xmm11, %xmm5
2167; SSE2-NEXT:    pcmpgtd %xmm4, %xmm5
2168; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
2169; SSE2-NEXT:    pcmpeqd %xmm11, %xmm4
2170; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2171; SSE2-NEXT:    pand %xmm7, %xmm4
2172; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2173; SSE2-NEXT:    por %xmm4, %xmm5
2174; SSE2-NEXT:    pand %xmm5, %xmm2
2175; SSE2-NEXT:    pandn %xmm10, %xmm5
2176; SSE2-NEXT:    por %xmm2, %xmm5
2177; SSE2-NEXT:    movdqa %xmm3, %xmm2
2178; SSE2-NEXT:    pxor %xmm8, %xmm2
2179; SSE2-NEXT:    movdqa %xmm11, %xmm4
2180; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
2181; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
2182; SSE2-NEXT:    pcmpeqd %xmm11, %xmm2
2183; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[1,1,3,3]
2184; SSE2-NEXT:    pand %xmm7, %xmm6
2185; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
2186; SSE2-NEXT:    por %xmm6, %xmm2
2187; SSE2-NEXT:    pand %xmm2, %xmm3
2188; SSE2-NEXT:    pandn %xmm10, %xmm2
2189; SSE2-NEXT:    por %xmm3, %xmm2
2190; SSE2-NEXT:    movdqa %xmm0, %xmm3
2191; SSE2-NEXT:    pxor %xmm8, %xmm3
2192; SSE2-NEXT:    movdqa %xmm11, %xmm4
2193; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
2194; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2195; SSE2-NEXT:    pcmpeqd %xmm11, %xmm3
2196; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
2197; SSE2-NEXT:    pand %xmm6, %xmm7
2198; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
2199; SSE2-NEXT:    por %xmm7, %xmm3
2200; SSE2-NEXT:    pand %xmm3, %xmm0
2201; SSE2-NEXT:    pandn %xmm10, %xmm3
2202; SSE2-NEXT:    por %xmm0, %xmm3
2203; SSE2-NEXT:    movdqa %xmm1, %xmm0
2204; SSE2-NEXT:    pxor %xmm8, %xmm0
2205; SSE2-NEXT:    movdqa %xmm11, %xmm4
2206; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
2207; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2208; SSE2-NEXT:    pcmpeqd %xmm11, %xmm0
2209; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2210; SSE2-NEXT:    pand %xmm6, %xmm0
2211; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2212; SSE2-NEXT:    por %xmm0, %xmm4
2213; SSE2-NEXT:    pand %xmm4, %xmm1
2214; SSE2-NEXT:    pandn %xmm10, %xmm4
2215; SSE2-NEXT:    por %xmm1, %xmm4
2216; SSE2-NEXT:    movdqa %xmm4, %xmm0
2217; SSE2-NEXT:    pxor %xmm8, %xmm0
2218; SSE2-NEXT:    movdqa %xmm0, %xmm1
2219; SSE2-NEXT:    pcmpgtd %xmm8, %xmm1
2220; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
2221; SSE2-NEXT:    pcmpeqd %xmm8, %xmm0
2222; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2223; SSE2-NEXT:    pand %xmm6, %xmm0
2224; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2225; SSE2-NEXT:    por %xmm0, %xmm1
2226; SSE2-NEXT:    pand %xmm4, %xmm1
2227; SSE2-NEXT:    movdqa %xmm3, %xmm0
2228; SSE2-NEXT:    pxor %xmm8, %xmm0
2229; SSE2-NEXT:    movdqa %xmm0, %xmm4
2230; SSE2-NEXT:    pcmpgtd %xmm8, %xmm4
2231; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2232; SSE2-NEXT:    pcmpeqd %xmm8, %xmm0
2233; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
2234; SSE2-NEXT:    pand %xmm6, %xmm7
2235; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
2236; SSE2-NEXT:    por %xmm7, %xmm0
2237; SSE2-NEXT:    pand %xmm3, %xmm0
2238; SSE2-NEXT:    packuswb %xmm1, %xmm0
2239; SSE2-NEXT:    movdqa %xmm2, %xmm1
2240; SSE2-NEXT:    pxor %xmm8, %xmm1
2241; SSE2-NEXT:    movdqa %xmm1, %xmm3
2242; SSE2-NEXT:    pcmpgtd %xmm8, %xmm3
2243; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2244; SSE2-NEXT:    pcmpeqd %xmm8, %xmm1
2245; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2246; SSE2-NEXT:    pand %xmm4, %xmm1
2247; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2248; SSE2-NEXT:    por %xmm1, %xmm3
2249; SSE2-NEXT:    pand %xmm2, %xmm3
2250; SSE2-NEXT:    movdqa %xmm5, %xmm1
2251; SSE2-NEXT:    pxor %xmm8, %xmm1
2252; SSE2-NEXT:    movdqa %xmm1, %xmm2
2253; SSE2-NEXT:    pcmpgtd %xmm8, %xmm2
2254; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2255; SSE2-NEXT:    pcmpeqd %xmm8, %xmm1
2256; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2257; SSE2-NEXT:    pand %xmm4, %xmm1
2258; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2259; SSE2-NEXT:    por %xmm1, %xmm2
2260; SSE2-NEXT:    pand %xmm5, %xmm2
2261; SSE2-NEXT:    packuswb %xmm3, %xmm2
2262; SSE2-NEXT:    packuswb %xmm2, %xmm0
2263; SSE2-NEXT:    movdqa %xmm14, %xmm1
2264; SSE2-NEXT:    pxor %xmm8, %xmm1
2265; SSE2-NEXT:    movdqa %xmm1, %xmm2
2266; SSE2-NEXT:    pcmpgtd %xmm8, %xmm2
2267; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
2268; SSE2-NEXT:    pcmpeqd %xmm8, %xmm1
2269; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2270; SSE2-NEXT:    pand %xmm3, %xmm1
2271; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2272; SSE2-NEXT:    por %xmm1, %xmm2
2273; SSE2-NEXT:    pand %xmm14, %xmm2
2274; SSE2-NEXT:    movdqa %xmm13, %xmm1
2275; SSE2-NEXT:    pxor %xmm8, %xmm1
2276; SSE2-NEXT:    movdqa %xmm1, %xmm3
2277; SSE2-NEXT:    pcmpgtd %xmm8, %xmm3
2278; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2279; SSE2-NEXT:    pcmpeqd %xmm8, %xmm1
2280; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
2281; SSE2-NEXT:    pand %xmm4, %xmm5
2282; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
2283; SSE2-NEXT:    por %xmm5, %xmm1
2284; SSE2-NEXT:    pand %xmm13, %xmm1
2285; SSE2-NEXT:    packuswb %xmm2, %xmm1
2286; SSE2-NEXT:    movdqa %xmm12, %xmm2
2287; SSE2-NEXT:    pxor %xmm8, %xmm2
2288; SSE2-NEXT:    movdqa %xmm2, %xmm3
2289; SSE2-NEXT:    pcmpgtd %xmm8, %xmm3
2290; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2291; SSE2-NEXT:    pcmpeqd %xmm8, %xmm2
2292; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2293; SSE2-NEXT:    pand %xmm4, %xmm2
2294; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2295; SSE2-NEXT:    por %xmm2, %xmm3
2296; SSE2-NEXT:    pand %xmm12, %xmm3
2297; SSE2-NEXT:    movdqa %xmm9, %xmm2
2298; SSE2-NEXT:    pxor %xmm8, %xmm2
2299; SSE2-NEXT:    movdqa %xmm2, %xmm4
2300; SSE2-NEXT:    pcmpgtd %xmm8, %xmm4
2301; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2302; SSE2-NEXT:    pcmpeqd %xmm8, %xmm2
2303; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2304; SSE2-NEXT:    pand %xmm5, %xmm2
2305; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2306; SSE2-NEXT:    por %xmm2, %xmm4
2307; SSE2-NEXT:    pand %xmm9, %xmm4
2308; SSE2-NEXT:    packuswb %xmm3, %xmm4
2309; SSE2-NEXT:    packuswb %xmm4, %xmm1
2310; SSE2-NEXT:    packuswb %xmm1, %xmm0
2311; SSE2-NEXT:    retq
2312;
2313; SSSE3-LABEL: trunc_packus_v16i64_v16i8:
2314; SSSE3:       # %bb.0:
2315; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [255,255]
2316; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648]
2317; SSSE3-NEXT:    movdqa %xmm6, %xmm9
2318; SSSE3-NEXT:    pxor %xmm8, %xmm9
2319; SSSE3-NEXT:    movdqa {{.*#+}} xmm11 = [2147483903,2147483903]
2320; SSSE3-NEXT:    movdqa %xmm11, %xmm12
2321; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm12
2322; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
2323; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm9
2324; SSSE3-NEXT:    pshufd {{.*#+}} xmm14 = xmm9[1,1,3,3]
2325; SSSE3-NEXT:    pand %xmm13, %xmm14
2326; SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm12[1,1,3,3]
2327; SSSE3-NEXT:    por %xmm14, %xmm9
2328; SSSE3-NEXT:    pand %xmm9, %xmm6
2329; SSSE3-NEXT:    pandn %xmm10, %xmm9
2330; SSSE3-NEXT:    por %xmm6, %xmm9
2331; SSSE3-NEXT:    movdqa %xmm7, %xmm6
2332; SSSE3-NEXT:    pxor %xmm8, %xmm6
2333; SSSE3-NEXT:    movdqa %xmm11, %xmm12
2334; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm12
2335; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
2336; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm6
2337; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2338; SSSE3-NEXT:    pand %xmm13, %xmm6
2339; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
2340; SSSE3-NEXT:    por %xmm6, %xmm12
2341; SSSE3-NEXT:    pand %xmm12, %xmm7
2342; SSSE3-NEXT:    pandn %xmm10, %xmm12
2343; SSSE3-NEXT:    por %xmm7, %xmm12
2344; SSSE3-NEXT:    movdqa %xmm4, %xmm6
2345; SSSE3-NEXT:    pxor %xmm8, %xmm6
2346; SSSE3-NEXT:    movdqa %xmm11, %xmm7
2347; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm7
2348; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm7[0,0,2,2]
2349; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm6
2350; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2351; SSSE3-NEXT:    pand %xmm13, %xmm6
2352; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm7[1,1,3,3]
2353; SSSE3-NEXT:    por %xmm6, %xmm13
2354; SSSE3-NEXT:    pand %xmm13, %xmm4
2355; SSSE3-NEXT:    pandn %xmm10, %xmm13
2356; SSSE3-NEXT:    por %xmm4, %xmm13
2357; SSSE3-NEXT:    movdqa %xmm5, %xmm4
2358; SSSE3-NEXT:    pxor %xmm8, %xmm4
2359; SSSE3-NEXT:    movdqa %xmm11, %xmm6
2360; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
2361; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2362; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm4
2363; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2364; SSSE3-NEXT:    pand %xmm7, %xmm4
2365; SSSE3-NEXT:    pshufd {{.*#+}} xmm14 = xmm6[1,1,3,3]
2366; SSSE3-NEXT:    por %xmm4, %xmm14
2367; SSSE3-NEXT:    pand %xmm14, %xmm5
2368; SSSE3-NEXT:    pandn %xmm10, %xmm14
2369; SSSE3-NEXT:    por %xmm5, %xmm14
2370; SSSE3-NEXT:    movdqa %xmm2, %xmm4
2371; SSSE3-NEXT:    pxor %xmm8, %xmm4
2372; SSSE3-NEXT:    movdqa %xmm11, %xmm5
2373; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm5
2374; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
2375; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm4
2376; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2377; SSSE3-NEXT:    pand %xmm7, %xmm4
2378; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2379; SSSE3-NEXT:    por %xmm4, %xmm5
2380; SSSE3-NEXT:    pand %xmm5, %xmm2
2381; SSSE3-NEXT:    pandn %xmm10, %xmm5
2382; SSSE3-NEXT:    por %xmm2, %xmm5
2383; SSSE3-NEXT:    movdqa %xmm3, %xmm2
2384; SSSE3-NEXT:    pxor %xmm8, %xmm2
2385; SSSE3-NEXT:    movdqa %xmm11, %xmm4
2386; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
2387; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
2388; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm2
2389; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[1,1,3,3]
2390; SSSE3-NEXT:    pand %xmm7, %xmm6
2391; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
2392; SSSE3-NEXT:    por %xmm6, %xmm2
2393; SSSE3-NEXT:    pand %xmm2, %xmm3
2394; SSSE3-NEXT:    pandn %xmm10, %xmm2
2395; SSSE3-NEXT:    por %xmm3, %xmm2
2396; SSSE3-NEXT:    movdqa %xmm0, %xmm3
2397; SSSE3-NEXT:    pxor %xmm8, %xmm3
2398; SSSE3-NEXT:    movdqa %xmm11, %xmm4
2399; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
2400; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2401; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm3
2402; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
2403; SSSE3-NEXT:    pand %xmm6, %xmm7
2404; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
2405; SSSE3-NEXT:    por %xmm7, %xmm3
2406; SSSE3-NEXT:    pand %xmm3, %xmm0
2407; SSSE3-NEXT:    pandn %xmm10, %xmm3
2408; SSSE3-NEXT:    por %xmm0, %xmm3
2409; SSSE3-NEXT:    movdqa %xmm1, %xmm0
2410; SSSE3-NEXT:    pxor %xmm8, %xmm0
2411; SSSE3-NEXT:    movdqa %xmm11, %xmm4
2412; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm4
2413; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2414; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm0
2415; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2416; SSSE3-NEXT:    pand %xmm6, %xmm0
2417; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2418; SSSE3-NEXT:    por %xmm0, %xmm4
2419; SSSE3-NEXT:    pand %xmm4, %xmm1
2420; SSSE3-NEXT:    pandn %xmm10, %xmm4
2421; SSSE3-NEXT:    por %xmm1, %xmm4
2422; SSSE3-NEXT:    movdqa %xmm4, %xmm0
2423; SSSE3-NEXT:    pxor %xmm8, %xmm0
2424; SSSE3-NEXT:    movdqa %xmm0, %xmm1
2425; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm1
2426; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
2427; SSSE3-NEXT:    pcmpeqd %xmm8, %xmm0
2428; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2429; SSSE3-NEXT:    pand %xmm6, %xmm0
2430; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2431; SSSE3-NEXT:    por %xmm0, %xmm1
2432; SSSE3-NEXT:    pand %xmm4, %xmm1
2433; SSSE3-NEXT:    movdqa %xmm3, %xmm0
2434; SSSE3-NEXT:    pxor %xmm8, %xmm0
2435; SSSE3-NEXT:    movdqa %xmm0, %xmm4
2436; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm4
2437; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2438; SSSE3-NEXT:    pcmpeqd %xmm8, %xmm0
2439; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
2440; SSSE3-NEXT:    pand %xmm6, %xmm7
2441; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
2442; SSSE3-NEXT:    por %xmm7, %xmm0
2443; SSSE3-NEXT:    pand %xmm3, %xmm0
2444; SSSE3-NEXT:    packuswb %xmm1, %xmm0
2445; SSSE3-NEXT:    movdqa %xmm2, %xmm1
2446; SSSE3-NEXT:    pxor %xmm8, %xmm1
2447; SSSE3-NEXT:    movdqa %xmm1, %xmm3
2448; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm3
2449; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2450; SSSE3-NEXT:    pcmpeqd %xmm8, %xmm1
2451; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2452; SSSE3-NEXT:    pand %xmm4, %xmm1
2453; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2454; SSSE3-NEXT:    por %xmm1, %xmm3
2455; SSSE3-NEXT:    pand %xmm2, %xmm3
2456; SSSE3-NEXT:    movdqa %xmm5, %xmm1
2457; SSSE3-NEXT:    pxor %xmm8, %xmm1
2458; SSSE3-NEXT:    movdqa %xmm1, %xmm2
2459; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm2
2460; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2461; SSSE3-NEXT:    pcmpeqd %xmm8, %xmm1
2462; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2463; SSSE3-NEXT:    pand %xmm4, %xmm1
2464; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2465; SSSE3-NEXT:    por %xmm1, %xmm2
2466; SSSE3-NEXT:    pand %xmm5, %xmm2
2467; SSSE3-NEXT:    packuswb %xmm3, %xmm2
2468; SSSE3-NEXT:    packuswb %xmm2, %xmm0
2469; SSSE3-NEXT:    movdqa %xmm14, %xmm1
2470; SSSE3-NEXT:    pxor %xmm8, %xmm1
2471; SSSE3-NEXT:    movdqa %xmm1, %xmm2
2472; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm2
2473; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
2474; SSSE3-NEXT:    pcmpeqd %xmm8, %xmm1
2475; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2476; SSSE3-NEXT:    pand %xmm3, %xmm1
2477; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2478; SSSE3-NEXT:    por %xmm1, %xmm2
2479; SSSE3-NEXT:    pand %xmm14, %xmm2
2480; SSSE3-NEXT:    movdqa %xmm13, %xmm1
2481; SSSE3-NEXT:    pxor %xmm8, %xmm1
2482; SSSE3-NEXT:    movdqa %xmm1, %xmm3
2483; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm3
2484; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2485; SSSE3-NEXT:    pcmpeqd %xmm8, %xmm1
2486; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
2487; SSSE3-NEXT:    pand %xmm4, %xmm5
2488; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
2489; SSSE3-NEXT:    por %xmm5, %xmm1
2490; SSSE3-NEXT:    pand %xmm13, %xmm1
2491; SSSE3-NEXT:    packuswb %xmm2, %xmm1
2492; SSSE3-NEXT:    movdqa %xmm12, %xmm2
2493; SSSE3-NEXT:    pxor %xmm8, %xmm2
2494; SSSE3-NEXT:    movdqa %xmm2, %xmm3
2495; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm3
2496; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2497; SSSE3-NEXT:    pcmpeqd %xmm8, %xmm2
2498; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2499; SSSE3-NEXT:    pand %xmm4, %xmm2
2500; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2501; SSSE3-NEXT:    por %xmm2, %xmm3
2502; SSSE3-NEXT:    pand %xmm12, %xmm3
2503; SSSE3-NEXT:    movdqa %xmm9, %xmm2
2504; SSSE3-NEXT:    pxor %xmm8, %xmm2
2505; SSSE3-NEXT:    movdqa %xmm2, %xmm4
2506; SSSE3-NEXT:    pcmpgtd %xmm8, %xmm4
2507; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2508; SSSE3-NEXT:    pcmpeqd %xmm8, %xmm2
2509; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2510; SSSE3-NEXT:    pand %xmm5, %xmm2
2511; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2512; SSSE3-NEXT:    por %xmm2, %xmm4
2513; SSSE3-NEXT:    pand %xmm9, %xmm4
2514; SSSE3-NEXT:    packuswb %xmm3, %xmm4
2515; SSSE3-NEXT:    packuswb %xmm4, %xmm1
2516; SSSE3-NEXT:    packuswb %xmm1, %xmm0
2517; SSSE3-NEXT:    retq
2518;
2519; SSE41-LABEL: trunc_packus_v16i64_v16i8:
2520; SSE41:       # %bb.0:
2521; SSE41-NEXT:    movdqa %xmm0, %xmm8
2522; SSE41-NEXT:    movapd {{.*#+}} xmm11 = [255,255]
2523; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648]
2524; SSE41-NEXT:    movdqa %xmm6, %xmm0
2525; SSE41-NEXT:    pxor %xmm9, %xmm0
2526; SSE41-NEXT:    movdqa {{.*#+}} xmm12 = [2147483903,2147483903]
2527; SSE41-NEXT:    movdqa %xmm12, %xmm10
2528; SSE41-NEXT:    pcmpgtd %xmm0, %xmm10
2529; SSE41-NEXT:    pshufd {{.*#+}} xmm13 = xmm10[0,0,2,2]
2530; SSE41-NEXT:    pcmpeqd %xmm12, %xmm0
2531; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2532; SSE41-NEXT:    pand %xmm13, %xmm0
2533; SSE41-NEXT:    por %xmm10, %xmm0
2534; SSE41-NEXT:    movapd %xmm11, %xmm10
2535; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm10
2536; SSE41-NEXT:    movdqa %xmm7, %xmm0
2537; SSE41-NEXT:    pxor %xmm9, %xmm0
2538; SSE41-NEXT:    movdqa %xmm12, %xmm6
2539; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
2540; SSE41-NEXT:    pshufd {{.*#+}} xmm13 = xmm6[0,0,2,2]
2541; SSE41-NEXT:    pcmpeqd %xmm12, %xmm0
2542; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2543; SSE41-NEXT:    pand %xmm13, %xmm0
2544; SSE41-NEXT:    por %xmm6, %xmm0
2545; SSE41-NEXT:    movapd %xmm11, %xmm13
2546; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm13
2547; SSE41-NEXT:    movdqa %xmm4, %xmm0
2548; SSE41-NEXT:    pxor %xmm9, %xmm0
2549; SSE41-NEXT:    movdqa %xmm12, %xmm6
2550; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
2551; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2552; SSE41-NEXT:    pcmpeqd %xmm12, %xmm0
2553; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2554; SSE41-NEXT:    pand %xmm7, %xmm0
2555; SSE41-NEXT:    por %xmm6, %xmm0
2556; SSE41-NEXT:    movapd %xmm11, %xmm14
2557; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm14
2558; SSE41-NEXT:    movdqa %xmm5, %xmm0
2559; SSE41-NEXT:    pxor %xmm9, %xmm0
2560; SSE41-NEXT:    movdqa %xmm12, %xmm4
2561; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
2562; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2563; SSE41-NEXT:    pcmpeqd %xmm12, %xmm0
2564; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2565; SSE41-NEXT:    pand %xmm6, %xmm0
2566; SSE41-NEXT:    por %xmm4, %xmm0
2567; SSE41-NEXT:    movapd %xmm11, %xmm15
2568; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm15
2569; SSE41-NEXT:    movdqa %xmm2, %xmm0
2570; SSE41-NEXT:    pxor %xmm9, %xmm0
2571; SSE41-NEXT:    movdqa %xmm12, %xmm5
2572; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
2573; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
2574; SSE41-NEXT:    pcmpeqd %xmm12, %xmm0
2575; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2576; SSE41-NEXT:    pand %xmm6, %xmm0
2577; SSE41-NEXT:    por %xmm5, %xmm0
2578; SSE41-NEXT:    movapd %xmm11, %xmm5
2579; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
2580; SSE41-NEXT:    movdqa %xmm3, %xmm0
2581; SSE41-NEXT:    pxor %xmm9, %xmm0
2582; SSE41-NEXT:    movdqa %xmm12, %xmm2
2583; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
2584; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
2585; SSE41-NEXT:    pcmpeqd %xmm12, %xmm0
2586; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2587; SSE41-NEXT:    pand %xmm6, %xmm0
2588; SSE41-NEXT:    por %xmm2, %xmm0
2589; SSE41-NEXT:    movapd %xmm11, %xmm6
2590; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm6
2591; SSE41-NEXT:    movdqa %xmm8, %xmm0
2592; SSE41-NEXT:    pxor %xmm9, %xmm0
2593; SSE41-NEXT:    movdqa %xmm12, %xmm2
2594; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
2595; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
2596; SSE41-NEXT:    pcmpeqd %xmm12, %xmm0
2597; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2598; SSE41-NEXT:    pand %xmm3, %xmm0
2599; SSE41-NEXT:    por %xmm2, %xmm0
2600; SSE41-NEXT:    movapd %xmm11, %xmm3
2601; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm3
2602; SSE41-NEXT:    movdqa %xmm1, %xmm0
2603; SSE41-NEXT:    pxor %xmm9, %xmm0
2604; SSE41-NEXT:    movdqa %xmm12, %xmm2
2605; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
2606; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[0,0,2,2]
2607; SSE41-NEXT:    pcmpeqd %xmm12, %xmm0
2608; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2609; SSE41-NEXT:    pand %xmm7, %xmm0
2610; SSE41-NEXT:    por %xmm2, %xmm0
2611; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm11
2612; SSE41-NEXT:    pxor %xmm2, %xmm2
2613; SSE41-NEXT:    movapd %xmm11, %xmm0
2614; SSE41-NEXT:    xorpd %xmm9, %xmm0
2615; SSE41-NEXT:    movapd %xmm0, %xmm1
2616; SSE41-NEXT:    pcmpgtd %xmm9, %xmm1
2617; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[0,0,2,2]
2618; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2619; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2620; SSE41-NEXT:    pand %xmm7, %xmm0
2621; SSE41-NEXT:    por %xmm1, %xmm0
2622; SSE41-NEXT:    pxor %xmm7, %xmm7
2623; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm7
2624; SSE41-NEXT:    movapd %xmm3, %xmm0
2625; SSE41-NEXT:    xorpd %xmm9, %xmm0
2626; SSE41-NEXT:    movapd %xmm0, %xmm1
2627; SSE41-NEXT:    pcmpgtd %xmm9, %xmm1
2628; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
2629; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2630; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2631; SSE41-NEXT:    pand %xmm4, %xmm0
2632; SSE41-NEXT:    por %xmm1, %xmm0
2633; SSE41-NEXT:    pxor %xmm1, %xmm1
2634; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
2635; SSE41-NEXT:    packusdw %xmm7, %xmm1
2636; SSE41-NEXT:    movapd %xmm6, %xmm0
2637; SSE41-NEXT:    xorpd %xmm9, %xmm0
2638; SSE41-NEXT:    movapd %xmm0, %xmm3
2639; SSE41-NEXT:    pcmpgtd %xmm9, %xmm3
2640; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2641; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2642; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2643; SSE41-NEXT:    pand %xmm4, %xmm0
2644; SSE41-NEXT:    por %xmm3, %xmm0
2645; SSE41-NEXT:    pxor %xmm3, %xmm3
2646; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm3
2647; SSE41-NEXT:    movapd %xmm5, %xmm0
2648; SSE41-NEXT:    xorpd %xmm9, %xmm0
2649; SSE41-NEXT:    movapd %xmm0, %xmm4
2650; SSE41-NEXT:    pcmpgtd %xmm9, %xmm4
2651; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2652; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2653; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2654; SSE41-NEXT:    pand %xmm6, %xmm0
2655; SSE41-NEXT:    por %xmm4, %xmm0
2656; SSE41-NEXT:    pxor %xmm4, %xmm4
2657; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm4
2658; SSE41-NEXT:    packusdw %xmm3, %xmm4
2659; SSE41-NEXT:    packusdw %xmm4, %xmm1
2660; SSE41-NEXT:    movapd %xmm15, %xmm0
2661; SSE41-NEXT:    xorpd %xmm9, %xmm0
2662; SSE41-NEXT:    movapd %xmm0, %xmm3
2663; SSE41-NEXT:    pcmpgtd %xmm9, %xmm3
2664; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2665; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2666; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2667; SSE41-NEXT:    pand %xmm4, %xmm0
2668; SSE41-NEXT:    por %xmm3, %xmm0
2669; SSE41-NEXT:    pxor %xmm4, %xmm4
2670; SSE41-NEXT:    blendvpd %xmm0, %xmm15, %xmm4
2671; SSE41-NEXT:    movapd %xmm14, %xmm0
2672; SSE41-NEXT:    xorpd %xmm9, %xmm0
2673; SSE41-NEXT:    movapd %xmm0, %xmm3
2674; SSE41-NEXT:    pcmpgtd %xmm9, %xmm3
2675; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
2676; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2677; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2678; SSE41-NEXT:    pand %xmm5, %xmm0
2679; SSE41-NEXT:    por %xmm3, %xmm0
2680; SSE41-NEXT:    pxor %xmm3, %xmm3
2681; SSE41-NEXT:    blendvpd %xmm0, %xmm14, %xmm3
2682; SSE41-NEXT:    packusdw %xmm4, %xmm3
2683; SSE41-NEXT:    movapd %xmm13, %xmm0
2684; SSE41-NEXT:    xorpd %xmm9, %xmm0
2685; SSE41-NEXT:    movapd %xmm0, %xmm4
2686; SSE41-NEXT:    pcmpgtd %xmm9, %xmm4
2687; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2688; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2689; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2690; SSE41-NEXT:    pand %xmm5, %xmm0
2691; SSE41-NEXT:    por %xmm4, %xmm0
2692; SSE41-NEXT:    pxor %xmm4, %xmm4
2693; SSE41-NEXT:    blendvpd %xmm0, %xmm13, %xmm4
2694; SSE41-NEXT:    movapd %xmm10, %xmm0
2695; SSE41-NEXT:    xorpd %xmm9, %xmm0
2696; SSE41-NEXT:    movapd %xmm0, %xmm5
2697; SSE41-NEXT:    pcmpgtd %xmm9, %xmm5
2698; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
2699; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
2700; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2701; SSE41-NEXT:    pand %xmm6, %xmm0
2702; SSE41-NEXT:    por %xmm5, %xmm0
2703; SSE41-NEXT:    blendvpd %xmm0, %xmm10, %xmm2
2704; SSE41-NEXT:    packusdw %xmm4, %xmm2
2705; SSE41-NEXT:    packusdw %xmm2, %xmm3
2706; SSE41-NEXT:    packuswb %xmm3, %xmm1
2707; SSE41-NEXT:    movdqa %xmm1, %xmm0
2708; SSE41-NEXT:    retq
2709;
2710; AVX1-LABEL: trunc_packus_v16i64_v16i8:
2711; AVX1:       # %bb.0:
2712; AVX1-NEXT:    vmovapd {{.*#+}} ymm4 = [255,255,255,255]
2713; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm5
2714; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [255,255]
2715; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
2716; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm6, %xmm7
2717; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm7, %ymm5
2718; AVX1-NEXT:    vblendvpd %ymm5, %ymm3, %ymm4, %ymm15
2719; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
2720; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
2721; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm6, %xmm7
2722; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm7, %ymm5
2723; AVX1-NEXT:    vblendvpd %ymm5, %ymm2, %ymm4, %ymm2
2724; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
2725; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
2726; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm6, %xmm7
2727; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm7, %ymm5
2728; AVX1-NEXT:    vblendvpd %ymm5, %ymm1, %ymm4, %ymm1
2729; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
2730; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
2731; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm6, %xmm6
2732; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm6, %ymm5
2733; AVX1-NEXT:    vblendvpd %ymm5, %ymm0, %ymm4, %ymm0
2734; AVX1-NEXT:    vxorpd %xmm4, %xmm4, %xmm4
2735; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm0, %xmm8
2736; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm14
2737; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm14, %xmm9
2738; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm1, %xmm10
2739; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
2740; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm7, %xmm11
2741; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm2, %xmm12
2742; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
2743; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm13
2744; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm15, %xmm6
2745; AVX1-NEXT:    vextractf128 $1, %ymm15, %xmm3
2746; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm3, %xmm4
2747; AVX1-NEXT:    vpand %xmm3, %xmm4, %xmm3
2748; AVX1-NEXT:    vpand %xmm15, %xmm6, %xmm4
2749; AVX1-NEXT:    vpackusdw %xmm3, %xmm4, %xmm3
2750; AVX1-NEXT:    vpand %xmm5, %xmm13, %xmm4
2751; AVX1-NEXT:    vpand %xmm2, %xmm12, %xmm2
2752; AVX1-NEXT:    vpackusdw %xmm4, %xmm2, %xmm2
2753; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
2754; AVX1-NEXT:    vpand %xmm7, %xmm11, %xmm3
2755; AVX1-NEXT:    vpand %xmm1, %xmm10, %xmm1
2756; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
2757; AVX1-NEXT:    vpand %xmm14, %xmm9, %xmm3
2758; AVX1-NEXT:    vpand %xmm0, %xmm8, %xmm0
2759; AVX1-NEXT:    vpackusdw %xmm3, %xmm0, %xmm0
2760; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
2761; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
2762; AVX1-NEXT:    vzeroupper
2763; AVX1-NEXT:    retq
2764;
2765; AVX2-LABEL: trunc_packus_v16i64_v16i8:
2766; AVX2:       # %bb.0:
2767; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [255,255,255,255]
2768; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm4, %ymm5
2769; AVX2-NEXT:    vblendvpd %ymm5, %ymm2, %ymm4, %ymm2
2770; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm4, %ymm5
2771; AVX2-NEXT:    vblendvpd %ymm5, %ymm3, %ymm4, %ymm3
2772; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm4, %ymm5
2773; AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm4, %ymm0
2774; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm4, %ymm5
2775; AVX2-NEXT:    vblendvpd %ymm5, %ymm1, %ymm4, %ymm1
2776; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
2777; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm1, %ymm5
2778; AVX2-NEXT:    vpand %ymm1, %ymm5, %ymm1
2779; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm0, %ymm5
2780; AVX2-NEXT:    vpand %ymm0, %ymm5, %ymm0
2781; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
2782; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm3, %ymm1
2783; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm1
2784; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm2, %ymm3
2785; AVX2-NEXT:    vpand %ymm2, %ymm3, %ymm2
2786; AVX2-NEXT:    vpackusdw %ymm1, %ymm2, %ymm1
2787; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
2788; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2789; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
2790; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2791; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2792; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2793; AVX2-NEXT:    vzeroupper
2794; AVX2-NEXT:    retq
2795;
2796; AVX512-LABEL: trunc_packus_v16i64_v16i8:
2797; AVX512:       # %bb.0:
2798; AVX512-NEXT:    vpbroadcastq {{.*#+}} zmm2 = [255,255,255,255,255,255,255,255]
2799; AVX512-NEXT:    vpminsq %zmm2, %zmm0, %zmm0
2800; AVX512-NEXT:    vpminsq %zmm2, %zmm1, %zmm1
2801; AVX512-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2802; AVX512-NEXT:    vpmaxsq %zmm2, %zmm1, %zmm1
2803; AVX512-NEXT:    vpmaxsq %zmm2, %zmm0, %zmm0
2804; AVX512-NEXT:    vpmovqd %zmm0, %ymm0
2805; AVX512-NEXT:    vpmovqd %zmm1, %ymm1
2806; AVX512-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
2807; AVX512-NEXT:    vpmovdb %zmm0, %xmm0
2808; AVX512-NEXT:    vzeroupper
2809; AVX512-NEXT:    retq
2810  %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>
2811  %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>
2812  %3 = icmp sgt <16 x i64> %2, zeroinitializer
2813  %4 = select <16 x i1> %3, <16 x i64> %2, <16 x i64> zeroinitializer
2814  %5 = trunc <16 x i64> %4 to <16 x i8>
2815  ret <16 x i8> %5
2816}
2817
2818define <8 x i8> @trunc_packus_v8i32_v8i8(<8 x i32> %a0) {
2819; SSE2-LABEL: trunc_packus_v8i32_v8i8:
2820; SSE2:       # %bb.0:
2821; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
2822; SSE2-NEXT:    movdqa %xmm2, %xmm3
2823; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
2824; SSE2-NEXT:    pand %xmm3, %xmm0
2825; SSE2-NEXT:    pandn %xmm2, %xmm3
2826; SSE2-NEXT:    por %xmm0, %xmm3
2827; SSE2-NEXT:    movdqa %xmm2, %xmm0
2828; SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
2829; SSE2-NEXT:    pand %xmm0, %xmm1
2830; SSE2-NEXT:    pandn %xmm2, %xmm0
2831; SSE2-NEXT:    por %xmm1, %xmm0
2832; SSE2-NEXT:    pxor %xmm1, %xmm1
2833; SSE2-NEXT:    movdqa %xmm0, %xmm2
2834; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
2835; SSE2-NEXT:    pand %xmm0, %xmm2
2836; SSE2-NEXT:    movdqa %xmm3, %xmm0
2837; SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
2838; SSE2-NEXT:    pand %xmm3, %xmm0
2839; SSE2-NEXT:    packuswb %xmm2, %xmm0
2840; SSE2-NEXT:    retq
2841;
2842; SSSE3-LABEL: trunc_packus_v8i32_v8i8:
2843; SSSE3:       # %bb.0:
2844; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
2845; SSSE3-NEXT:    movdqa %xmm2, %xmm3
2846; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm3
2847; SSSE3-NEXT:    pand %xmm3, %xmm0
2848; SSSE3-NEXT:    pandn %xmm2, %xmm3
2849; SSSE3-NEXT:    por %xmm0, %xmm3
2850; SSSE3-NEXT:    movdqa %xmm2, %xmm0
2851; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
2852; SSSE3-NEXT:    pand %xmm0, %xmm1
2853; SSSE3-NEXT:    pandn %xmm2, %xmm0
2854; SSSE3-NEXT:    por %xmm1, %xmm0
2855; SSSE3-NEXT:    pxor %xmm1, %xmm1
2856; SSSE3-NEXT:    movdqa %xmm0, %xmm2
2857; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
2858; SSSE3-NEXT:    pand %xmm0, %xmm2
2859; SSSE3-NEXT:    movdqa %xmm3, %xmm0
2860; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
2861; SSSE3-NEXT:    pand %xmm3, %xmm0
2862; SSSE3-NEXT:    packuswb %xmm2, %xmm0
2863; SSSE3-NEXT:    retq
2864;
2865; SSE41-LABEL: trunc_packus_v8i32_v8i8:
2866; SSE41:       # %bb.0:
2867; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
2868; SSE41-NEXT:    pminsd %xmm2, %xmm0
2869; SSE41-NEXT:    pminsd %xmm2, %xmm1
2870; SSE41-NEXT:    pxor %xmm2, %xmm2
2871; SSE41-NEXT:    pmaxsd %xmm2, %xmm1
2872; SSE41-NEXT:    pmaxsd %xmm2, %xmm0
2873; SSE41-NEXT:    packusdw %xmm1, %xmm0
2874; SSE41-NEXT:    retq
2875;
2876; AVX1-LABEL: trunc_packus_v8i32_v8i8:
2877; AVX1:       # %bb.0:
2878; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [255,255,255,255]
2879; AVX1-NEXT:    vpminsd %xmm1, %xmm0, %xmm2
2880; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2881; AVX1-NEXT:    vpminsd %xmm1, %xmm0, %xmm0
2882; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2883; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
2884; AVX1-NEXT:    vpmaxsd %xmm1, %xmm2, %xmm1
2885; AVX1-NEXT:    vpackusdw %xmm0, %xmm1, %xmm0
2886; AVX1-NEXT:    vzeroupper
2887; AVX1-NEXT:    retq
2888;
2889; AVX2-LABEL: trunc_packus_v8i32_v8i8:
2890; AVX2:       # %bb.0:
2891; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
2892; AVX2-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
2893; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2894; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
2895; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2896; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
2897; AVX2-NEXT:    vzeroupper
2898; AVX2-NEXT:    retq
2899;
2900; AVX512F-LABEL: trunc_packus_v8i32_v8i8:
2901; AVX512F:       # %bb.0:
2902; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
2903; AVX512F-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
2904; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2905; AVX512F-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
2906; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
2907; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2908; AVX512F-NEXT:    vzeroupper
2909; AVX512F-NEXT:    retq
2910;
2911; AVX512VL-LABEL: trunc_packus_v8i32_v8i8:
2912; AVX512VL:       # %bb.0:
2913; AVX512VL-NEXT:    vpminsd {{.*}}(%rip){1to8}, %ymm0, %ymm0
2914; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2915; AVX512VL-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
2916; AVX512VL-NEXT:    vpmovdw %ymm0, %xmm0
2917; AVX512VL-NEXT:    vzeroupper
2918; AVX512VL-NEXT:    retq
2919;
2920; AVX512BW-LABEL: trunc_packus_v8i32_v8i8:
2921; AVX512BW:       # %bb.0:
2922; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
2923; AVX512BW-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
2924; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2925; AVX512BW-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
2926; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
2927; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2928; AVX512BW-NEXT:    vzeroupper
2929; AVX512BW-NEXT:    retq
2930;
2931; AVX512BWVL-LABEL: trunc_packus_v8i32_v8i8:
2932; AVX512BWVL:       # %bb.0:
2933; AVX512BWVL-NEXT:    vpminsd {{.*}}(%rip){1to8}, %ymm0, %ymm0
2934; AVX512BWVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2935; AVX512BWVL-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
2936; AVX512BWVL-NEXT:    vpmovdw %ymm0, %xmm0
2937; AVX512BWVL-NEXT:    vzeroupper
2938; AVX512BWVL-NEXT:    retq
2939  %1 = icmp slt <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
2940  %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>
2941  %3 = icmp sgt <8 x i32> %2, zeroinitializer
2942  %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> zeroinitializer
2943  %5 = trunc <8 x i32> %4 to <8 x i8>
2944  ret <8 x i8> %5
2945}
2946
2947define void @trunc_packus_v8i32_v8i8_store(<8 x i32> %a0, <8 x i8> *%p1) {
2948; SSE-LABEL: trunc_packus_v8i32_v8i8_store:
2949; SSE:       # %bb.0:
2950; SSE-NEXT:    packssdw %xmm1, %xmm0
2951; SSE-NEXT:    packuswb %xmm0, %xmm0
2952; SSE-NEXT:    movq %xmm0, (%rdi)
2953; SSE-NEXT:    retq
2954;
2955; AVX1-LABEL: trunc_packus_v8i32_v8i8_store:
2956; AVX1:       # %bb.0:
2957; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2958; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
2959; AVX1-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
2960; AVX1-NEXT:    vmovq %xmm0, (%rdi)
2961; AVX1-NEXT:    vzeroupper
2962; AVX1-NEXT:    retq
2963;
2964; AVX2-LABEL: trunc_packus_v8i32_v8i8_store:
2965; AVX2:       # %bb.0:
2966; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2967; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
2968; AVX2-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
2969; AVX2-NEXT:    vmovq %xmm0, (%rdi)
2970; AVX2-NEXT:    vzeroupper
2971; AVX2-NEXT:    retq
2972;
2973; AVX512F-LABEL: trunc_packus_v8i32_v8i8_store:
2974; AVX512F:       # %bb.0:
2975; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
2976; AVX512F-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
2977; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2978; AVX512F-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
2979; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
2980; AVX512F-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
2981; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
2982; AVX512F-NEXT:    vzeroupper
2983; AVX512F-NEXT:    retq
2984;
2985; AVX512VL-LABEL: trunc_packus_v8i32_v8i8_store:
2986; AVX512VL:       # %bb.0:
2987; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2988; AVX512VL-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
2989; AVX512VL-NEXT:    vpmovusdb %ymm0, (%rdi)
2990; AVX512VL-NEXT:    vzeroupper
2991; AVX512VL-NEXT:    retq
2992;
2993; AVX512BW-LABEL: trunc_packus_v8i32_v8i8_store:
2994; AVX512BW:       # %bb.0:
2995; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
2996; AVX512BW-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
2997; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
2998; AVX512BW-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
2999; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
3000; AVX512BW-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
3001; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
3002; AVX512BW-NEXT:    vzeroupper
3003; AVX512BW-NEXT:    retq
3004;
3005; AVX512BWVL-LABEL: trunc_packus_v8i32_v8i8_store:
3006; AVX512BWVL:       # %bb.0:
3007; AVX512BWVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3008; AVX512BWVL-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
3009; AVX512BWVL-NEXT:    vpmovusdb %ymm0, (%rdi)
3010; AVX512BWVL-NEXT:    vzeroupper
3011; AVX512BWVL-NEXT:    retq
3012  %1 = icmp slt <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
3013  %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>
3014  %3 = icmp sgt <8 x i32> %2, zeroinitializer
3015  %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> zeroinitializer
3016  %5 = trunc <8 x i32> %4 to <8 x i8>
3017  store <8 x i8> %5, <8 x i8> *%p1
3018  ret void
3019}
3020
3021define <16 x i8> @trunc_packus_v16i32_v16i8(<16 x i32> %a0) {
3022; SSE-LABEL: trunc_packus_v16i32_v16i8:
3023; SSE:       # %bb.0:
3024; SSE-NEXT:    packssdw %xmm3, %xmm2
3025; SSE-NEXT:    packssdw %xmm1, %xmm0
3026; SSE-NEXT:    packuswb %xmm2, %xmm0
3027; SSE-NEXT:    retq
3028;
3029; AVX1-LABEL: trunc_packus_v16i32_v16i8:
3030; AVX1:       # %bb.0:
3031; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
3032; AVX1-NEXT:    vpackssdw %xmm2, %xmm1, %xmm1
3033; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
3034; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0
3035; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
3036; AVX1-NEXT:    vzeroupper
3037; AVX1-NEXT:    retq
3038;
3039; AVX2-LABEL: trunc_packus_v16i32_v16i8:
3040; AVX2:       # %bb.0:
3041; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
3042; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
3043; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
3044; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
3045; AVX2-NEXT:    vzeroupper
3046; AVX2-NEXT:    retq
3047;
3048; AVX512-LABEL: trunc_packus_v16i32_v16i8:
3049; AVX512:       # %bb.0:
3050; AVX512-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3051; AVX512-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
3052; AVX512-NEXT:    vpmovusdb %zmm0, %xmm0
3053; AVX512-NEXT:    vzeroupper
3054; AVX512-NEXT:    retq
3055  %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>
3056  %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>
3057  %3 = icmp sgt <16 x i32> %2, zeroinitializer
3058  %4 = select <16 x i1> %3, <16 x i32> %2, <16 x i32> zeroinitializer
3059  %5 = trunc <16 x i32> %4 to <16 x i8>
3060  ret <16 x i8> %5
3061}
3062
3063define <16 x i8> @trunc_packus_v16i16_v16i8(<16 x i16> %a0) {
3064; SSE-LABEL: trunc_packus_v16i16_v16i8:
3065; SSE:       # %bb.0:
3066; SSE-NEXT:    packuswb %xmm1, %xmm0
3067; SSE-NEXT:    retq
3068;
3069; AVX1-LABEL: trunc_packus_v16i16_v16i8:
3070; AVX1:       # %bb.0:
3071; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
3072; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
3073; AVX1-NEXT:    vzeroupper
3074; AVX1-NEXT:    retq
3075;
3076; AVX2-LABEL: trunc_packus_v16i16_v16i8:
3077; AVX2:       # %bb.0:
3078; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
3079; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
3080; AVX2-NEXT:    vzeroupper
3081; AVX2-NEXT:    retq
3082;
3083; AVX512F-LABEL: trunc_packus_v16i16_v16i8:
3084; AVX512F:       # %bb.0:
3085; AVX512F-NEXT:    vpminsw {{.*}}(%rip), %ymm0, %ymm0
3086; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3087; AVX512F-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
3088; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
3089; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
3090; AVX512F-NEXT:    vzeroupper
3091; AVX512F-NEXT:    retq
3092;
3093; AVX512VL-LABEL: trunc_packus_v16i16_v16i8:
3094; AVX512VL:       # %bb.0:
3095; AVX512VL-NEXT:    vpminsw {{.*}}(%rip), %ymm0, %ymm0
3096; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3097; AVX512VL-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
3098; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
3099; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
3100; AVX512VL-NEXT:    vzeroupper
3101; AVX512VL-NEXT:    retq
3102;
3103; AVX512BW-LABEL: trunc_packus_v16i16_v16i8:
3104; AVX512BW:       # %bb.0:
3105; AVX512BW-NEXT:    vpminsw {{.*}}(%rip), %ymm0, %ymm0
3106; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3107; AVX512BW-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
3108; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
3109; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3110; AVX512BW-NEXT:    vzeroupper
3111; AVX512BW-NEXT:    retq
3112;
3113; AVX512BWVL-LABEL: trunc_packus_v16i16_v16i8:
3114; AVX512BWVL:       # %bb.0:
3115; AVX512BWVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3116; AVX512BWVL-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
3117; AVX512BWVL-NEXT:    vpmovuswb %ymm0, %xmm0
3118; AVX512BWVL-NEXT:    vzeroupper
3119; AVX512BWVL-NEXT:    retq
3120  %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>
3121  %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>
3122  %3 = icmp sgt <16 x i16> %2, zeroinitializer
3123  %4 = select <16 x i1> %3, <16 x i16> %2, <16 x i16> zeroinitializer
3124  %5 = trunc <16 x i16> %4 to <16 x i8>
3125  ret <16 x i8> %5
3126}
3127
3128define <32 x i8> @trunc_packus_v32i16_v32i8(<32 x i16> %a0) {
3129; SSE-LABEL: trunc_packus_v32i16_v32i8:
3130; SSE:       # %bb.0:
3131; SSE-NEXT:    packuswb %xmm1, %xmm0
3132; SSE-NEXT:    packuswb %xmm3, %xmm2
3133; SSE-NEXT:    movdqa %xmm2, %xmm1
3134; SSE-NEXT:    retq
3135;
3136; AVX1-LABEL: trunc_packus_v32i16_v32i8:
3137; AVX1:       # %bb.0:
3138; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
3139; AVX1-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
3140; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
3141; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
3142; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3143; AVX1-NEXT:    retq
3144;
3145; AVX2-LABEL: trunc_packus_v32i16_v32i8:
3146; AVX2:       # %bb.0:
3147; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
3148; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
3149; AVX2-NEXT:    retq
3150;
3151; AVX512F-LABEL: trunc_packus_v32i16_v32i8:
3152; AVX512F:       # %bb.0:
3153; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3154; AVX512F-NEXT:    vpminsw %ymm2, %ymm0, %ymm0
3155; AVX512F-NEXT:    vpminsw %ymm2, %ymm1, %ymm1
3156; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2
3157; AVX512F-NEXT:    vpmaxsw %ymm2, %ymm1, %ymm1
3158; AVX512F-NEXT:    vpmaxsw %ymm2, %ymm0, %ymm0
3159; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
3160; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
3161; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
3162; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
3163; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
3164; AVX512F-NEXT:    retq
3165;
3166; AVX512VL-LABEL: trunc_packus_v32i16_v32i8:
3167; AVX512VL:       # %bb.0:
3168; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3169; AVX512VL-NEXT:    vpminsw %ymm2, %ymm0, %ymm0
3170; AVX512VL-NEXT:    vpminsw %ymm2, %ymm1, %ymm1
3171; AVX512VL-NEXT:    vpxor %xmm2, %xmm2, %xmm2
3172; AVX512VL-NEXT:    vpmaxsw %ymm2, %ymm1, %ymm1
3173; AVX512VL-NEXT:    vpmaxsw %ymm2, %ymm0, %ymm0
3174; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
3175; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
3176; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
3177; AVX512VL-NEXT:    vpmovdb %zmm1, %xmm1
3178; AVX512VL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
3179; AVX512VL-NEXT:    retq
3180;
3181; AVX512BW-LABEL: trunc_packus_v32i16_v32i8:
3182; AVX512BW:       # %bb.0:
3183; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3184; AVX512BW-NEXT:    vpmaxsw %zmm1, %zmm0, %zmm0
3185; AVX512BW-NEXT:    vpmovuswb %zmm0, %ymm0
3186; AVX512BW-NEXT:    retq
3187;
3188; AVX512BWVL-LABEL: trunc_packus_v32i16_v32i8:
3189; AVX512BWVL:       # %bb.0:
3190; AVX512BWVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
3191; AVX512BWVL-NEXT:    vpmaxsw %zmm1, %zmm0, %zmm0
3192; AVX512BWVL-NEXT:    vpmovuswb %zmm0, %ymm0
3193; AVX512BWVL-NEXT:    retq
3194  %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>
3195  %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>
3196  %3 = icmp sgt <32 x i16> %2, zeroinitializer
3197  %4 = select <32 x i1> %3, <32 x i16> %2, <32 x i16> zeroinitializer
3198  %5 = trunc <32 x i16> %4 to <32 x i8>
3199  ret <32 x i8> %5
3200}
3201