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