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