Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / vector-trunc-usat-widen.ll
blob6922fde61b66c0e1bae8d2b2f01c2e11a7baee01
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 ; Unsigned saturation truncation to vXi32
17 define <4 x i32> @trunc_usat_v4i64_v4i32(<4 x i64> %a0) {
18 ; SSE2-LABEL: trunc_usat_v4i64_v4i32:
19 ; SSE2:       # %bb.0:
20 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
21 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
22 ; SSE2-NEXT:    pxor %xmm2, %xmm3
23 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259455,9223372039002259455]
24 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
25 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
26 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
27 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm3
28 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
29 ; SSE2-NEXT:    pand %xmm6, %xmm3
30 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
31 ; SSE2-NEXT:    por %xmm3, %xmm5
32 ; SSE2-NEXT:    pxor %xmm1, %xmm2
33 ; SSE2-NEXT:    movdqa %xmm4, %xmm3
34 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
35 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
36 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm2
37 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
38 ; SSE2-NEXT:    pand %xmm6, %xmm2
39 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
40 ; SSE2-NEXT:    por %xmm2, %xmm3
41 ; SSE2-NEXT:    pand %xmm3, %xmm1
42 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm3
43 ; SSE2-NEXT:    por %xmm1, %xmm3
44 ; SSE2-NEXT:    pand %xmm5, %xmm0
45 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm5
46 ; SSE2-NEXT:    por %xmm5, %xmm0
47 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
48 ; SSE2-NEXT:    retq
50 ; SSSE3-LABEL: trunc_usat_v4i64_v4i32:
51 ; SSSE3:       # %bb.0:
52 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
53 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
54 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
55 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259455,9223372039002259455]
56 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
57 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
58 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
59 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm3
60 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
61 ; SSSE3-NEXT:    pand %xmm6, %xmm3
62 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
63 ; SSSE3-NEXT:    por %xmm3, %xmm5
64 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
65 ; SSSE3-NEXT:    movdqa %xmm4, %xmm3
66 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
67 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
68 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm2
69 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
70 ; SSSE3-NEXT:    pand %xmm6, %xmm2
71 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
72 ; SSSE3-NEXT:    por %xmm2, %xmm3
73 ; SSSE3-NEXT:    pand %xmm3, %xmm1
74 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm3
75 ; SSSE3-NEXT:    por %xmm1, %xmm3
76 ; SSSE3-NEXT:    pand %xmm5, %xmm0
77 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm5
78 ; SSSE3-NEXT:    por %xmm5, %xmm0
79 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
80 ; SSSE3-NEXT:    retq
82 ; SSE41-LABEL: trunc_usat_v4i64_v4i32:
83 ; SSE41:       # %bb.0:
84 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
85 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
86 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
87 ; SSE41-NEXT:    pxor %xmm0, %xmm3
88 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259455,9223372039002259455]
89 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
90 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm5
91 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
92 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm3
93 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
94 ; SSE41-NEXT:    pand %xmm6, %xmm3
95 ; SSE41-NEXT:    por %xmm5, %xmm3
96 ; SSE41-NEXT:    pxor %xmm1, %xmm0
97 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
98 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
99 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
100 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm0
101 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
102 ; SSE41-NEXT:    pand %xmm6, %xmm0
103 ; SSE41-NEXT:    por %xmm5, %xmm0
104 ; SSE41-NEXT:    movapd {{.*#+}} xmm4 = [4294967295,4294967295]
105 ; SSE41-NEXT:    movapd {{.*#+}} xmm5 = [4294967295,429496729]
106 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
107 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
108 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
109 ; SSE41-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,2],xmm5[0,2]
110 ; SSE41-NEXT:    movaps %xmm4, %xmm0
111 ; SSE41-NEXT:    retq
113 ; AVX1-LABEL: trunc_usat_v4i64_v4i32:
114 ; AVX1:       # %bb.0:
115 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
116 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
117 ; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm1
118 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372041149743103,9223372041149743103]
119 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
120 ; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm2
121 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
122 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
123 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,429496729]
124 ; AVX1-NEXT:    vblendvpd %ymm1, %ymm0, %ymm2, %ymm0
125 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
126 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
127 ; AVX1-NEXT:    vzeroupper
128 ; AVX1-NEXT:    retq
130 ; AVX2-SLOW-LABEL: trunc_usat_v4i64_v4i32:
131 ; AVX2-SLOW:       # %bb.0:
132 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
133 ; AVX2-SLOW-NEXT:    vpxor %ymm1, %ymm0, %ymm1
134 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
135 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm1
136 ; AVX2-SLOW-NEXT:    vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,429496729]
137 ; AVX2-SLOW-NEXT:    vblendvpd %ymm1, %ymm0, %ymm2, %ymm0
138 ; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} ymm0 = ymm0[0,2,2,3,4,6,6,7]
139 ; AVX2-SLOW-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,2,2,3]
140 ; AVX2-SLOW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
141 ; AVX2-SLOW-NEXT:    vzeroupper
142 ; AVX2-SLOW-NEXT:    retq
144 ; AVX2-FAST-LABEL: trunc_usat_v4i64_v4i32:
145 ; AVX2-FAST:       # %bb.0:
146 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
147 ; AVX2-FAST-NEXT:    vpxor %ymm1, %ymm0, %ymm1
148 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
149 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm1
150 ; AVX2-FAST-NEXT:    vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,429496729]
151 ; AVX2-FAST-NEXT:    vblendvpd %ymm1, %ymm0, %ymm2, %ymm0
152 ; AVX2-FAST-NEXT:    vmovapd {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7]
153 ; AVX2-FAST-NEXT:    vpermps %ymm0, %ymm1, %ymm0
154 ; AVX2-FAST-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
155 ; AVX2-FAST-NEXT:    vzeroupper
156 ; AVX2-FAST-NEXT:    retq
158 ; AVX512F-LABEL: trunc_usat_v4i64_v4i32:
159 ; AVX512F:       # %bb.0:
160 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
161 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
162 ; AVX512F-NEXT:    vpcmpltuq %zmm1, %zmm0, %k1
163 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
164 ; AVX512F-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k1}
165 ; AVX512F-NEXT:    vpmovqd %zmm1, %ymm0
166 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
167 ; AVX512F-NEXT:    vzeroupper
168 ; AVX512F-NEXT:    retq
170 ; AVX512VL-LABEL: trunc_usat_v4i64_v4i32:
171 ; AVX512VL:       # %bb.0:
172 ; AVX512VL-NEXT:    vpcmpltuq {{.*}}(%rip){1to4}, %ymm0, %k1
173 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
174 ; AVX512VL-NEXT:    vmovdqa64 %ymm0, %ymm1 {%k1}
175 ; AVX512VL-NEXT:    vpmovqd %ymm1, %xmm0
176 ; AVX512VL-NEXT:    vzeroupper
177 ; AVX512VL-NEXT:    retq
179 ; AVX512BW-LABEL: trunc_usat_v4i64_v4i32:
180 ; AVX512BW:       # %bb.0:
181 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
182 ; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
183 ; AVX512BW-NEXT:    vpcmpltuq %zmm1, %zmm0, %k1
184 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
185 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k1}
186 ; AVX512BW-NEXT:    vpmovqd %zmm1, %ymm0
187 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
188 ; AVX512BW-NEXT:    vzeroupper
189 ; AVX512BW-NEXT:    retq
191 ; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i32:
192 ; AVX512BWVL:       # %bb.0:
193 ; AVX512BWVL-NEXT:    vpcmpltuq {{.*}}(%rip){1to4}, %ymm0, %k1
194 ; AVX512BWVL-NEXT:    vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
195 ; AVX512BWVL-NEXT:    vmovdqa64 %ymm0, %ymm1 {%k1}
196 ; AVX512BWVL-NEXT:    vpmovqd %ymm1, %xmm0
197 ; AVX512BWVL-NEXT:    vzeroupper
198 ; AVX512BWVL-NEXT:    retq
199   %1 = icmp ult <4 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
200   %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 429496729>
201   %3 = trunc <4 x i64> %2 to <4 x i32>
202   ret <4 x i32> %3
205 define <8 x i32> @trunc_usat_v8i64_v8i32(<8 x i64> %a0) {
206 ; SSE2-LABEL: trunc_usat_v8i64_v8i32:
207 ; SSE2:       # %bb.0:
208 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [4294967295,4294967295]
209 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
210 ; SSE2-NEXT:    movdqa %xmm3, %xmm7
211 ; SSE2-NEXT:    pxor %xmm5, %xmm7
212 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259455,9223372039002259455]
213 ; SSE2-NEXT:    movdqa %xmm9, %xmm6
214 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm6
215 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
216 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm7
217 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
218 ; SSE2-NEXT:    pand %xmm4, %xmm7
219 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
220 ; SSE2-NEXT:    por %xmm7, %xmm4
221 ; SSE2-NEXT:    pand %xmm4, %xmm3
222 ; SSE2-NEXT:    pandn %xmm8, %xmm4
223 ; SSE2-NEXT:    por %xmm3, %xmm4
224 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
225 ; SSE2-NEXT:    pxor %xmm5, %xmm3
226 ; SSE2-NEXT:    movdqa %xmm9, %xmm6
227 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
228 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
229 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm3
230 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
231 ; SSE2-NEXT:    pand %xmm10, %xmm7
232 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
233 ; SSE2-NEXT:    por %xmm7, %xmm3
234 ; SSE2-NEXT:    pand %xmm3, %xmm2
235 ; SSE2-NEXT:    pandn %xmm8, %xmm3
236 ; SSE2-NEXT:    por %xmm2, %xmm3
237 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,2],xmm4[0,2]
238 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
239 ; SSE2-NEXT:    pxor %xmm5, %xmm2
240 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
241 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
242 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
243 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm2
244 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
245 ; SSE2-NEXT:    pand %xmm6, %xmm2
246 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
247 ; SSE2-NEXT:    por %xmm2, %xmm4
248 ; SSE2-NEXT:    pand %xmm4, %xmm1
249 ; SSE2-NEXT:    pandn %xmm8, %xmm4
250 ; SSE2-NEXT:    por %xmm1, %xmm4
251 ; SSE2-NEXT:    pxor %xmm0, %xmm5
252 ; SSE2-NEXT:    movdqa %xmm9, %xmm1
253 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm1
254 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
255 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm5
256 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
257 ; SSE2-NEXT:    pand %xmm2, %xmm5
258 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
259 ; SSE2-NEXT:    por %xmm5, %xmm1
260 ; SSE2-NEXT:    pand %xmm1, %xmm0
261 ; SSE2-NEXT:    pandn %xmm8, %xmm1
262 ; SSE2-NEXT:    por %xmm1, %xmm0
263 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm4[0,2]
264 ; SSE2-NEXT:    movaps %xmm3, %xmm1
265 ; SSE2-NEXT:    retq
267 ; SSSE3-LABEL: trunc_usat_v8i64_v8i32:
268 ; SSSE3:       # %bb.0:
269 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [4294967295,4294967295]
270 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
271 ; SSSE3-NEXT:    movdqa %xmm3, %xmm7
272 ; SSSE3-NEXT:    pxor %xmm5, %xmm7
273 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259455,9223372039002259455]
274 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
275 ; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm6
276 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
277 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm7
278 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
279 ; SSSE3-NEXT:    pand %xmm4, %xmm7
280 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
281 ; SSSE3-NEXT:    por %xmm7, %xmm4
282 ; SSSE3-NEXT:    pand %xmm4, %xmm3
283 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
284 ; SSSE3-NEXT:    por %xmm3, %xmm4
285 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
286 ; SSSE3-NEXT:    pxor %xmm5, %xmm3
287 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
288 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm6
289 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
290 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm3
291 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
292 ; SSSE3-NEXT:    pand %xmm10, %xmm7
293 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
294 ; SSSE3-NEXT:    por %xmm7, %xmm3
295 ; SSSE3-NEXT:    pand %xmm3, %xmm2
296 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
297 ; SSSE3-NEXT:    por %xmm2, %xmm3
298 ; SSSE3-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,2],xmm4[0,2]
299 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
300 ; SSSE3-NEXT:    pxor %xmm5, %xmm2
301 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
302 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
303 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
304 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm2
305 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
306 ; SSSE3-NEXT:    pand %xmm6, %xmm2
307 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
308 ; SSSE3-NEXT:    por %xmm2, %xmm4
309 ; SSSE3-NEXT:    pand %xmm4, %xmm1
310 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
311 ; SSSE3-NEXT:    por %xmm1, %xmm4
312 ; SSSE3-NEXT:    pxor %xmm0, %xmm5
313 ; SSSE3-NEXT:    movdqa %xmm9, %xmm1
314 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm1
315 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
316 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm5
317 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
318 ; SSSE3-NEXT:    pand %xmm2, %xmm5
319 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
320 ; SSSE3-NEXT:    por %xmm5, %xmm1
321 ; SSSE3-NEXT:    pand %xmm1, %xmm0
322 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
323 ; SSSE3-NEXT:    por %xmm1, %xmm0
324 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm4[0,2]
325 ; SSSE3-NEXT:    movaps %xmm3, %xmm1
326 ; SSSE3-NEXT:    retq
328 ; SSE41-LABEL: trunc_usat_v8i64_v8i32:
329 ; SSE41:       # %bb.0:
330 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
331 ; SSE41-NEXT:    movapd {{.*#+}} xmm6 = [4294967295,4294967295]
332 ; SSE41-NEXT:    movdqa {{.*#+}} xmm7 = [9223372039002259456,9223372039002259456]
333 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
334 ; SSE41-NEXT:    pxor %xmm7, %xmm0
335 ; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259455,9223372039002259455]
336 ; SSE41-NEXT:    movdqa %xmm9, %xmm4
337 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
338 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
339 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
340 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
341 ; SSE41-NEXT:    pand %xmm5, %xmm0
342 ; SSE41-NEXT:    por %xmm4, %xmm0
343 ; SSE41-NEXT:    movapd %xmm6, %xmm5
344 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm5
345 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
346 ; SSE41-NEXT:    pxor %xmm7, %xmm0
347 ; SSE41-NEXT:    movdqa %xmm9, %xmm3
348 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
349 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
350 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
351 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
352 ; SSE41-NEXT:    pand %xmm4, %xmm0
353 ; SSE41-NEXT:    por %xmm3, %xmm0
354 ; SSE41-NEXT:    movapd %xmm6, %xmm4
355 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
356 ; SSE41-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,2],xmm5[0,2]
357 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
358 ; SSE41-NEXT:    pxor %xmm7, %xmm0
359 ; SSE41-NEXT:    movdqa %xmm9, %xmm2
360 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
361 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
362 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
363 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
364 ; SSE41-NEXT:    pand %xmm3, %xmm0
365 ; SSE41-NEXT:    por %xmm2, %xmm0
366 ; SSE41-NEXT:    movapd %xmm6, %xmm2
367 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
368 ; SSE41-NEXT:    pxor %xmm8, %xmm7
369 ; SSE41-NEXT:    movdqa %xmm9, %xmm1
370 ; SSE41-NEXT:    pcmpgtd %xmm7, %xmm1
371 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
372 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm7
373 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
374 ; SSE41-NEXT:    pand %xmm3, %xmm0
375 ; SSE41-NEXT:    por %xmm1, %xmm0
376 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm6
377 ; SSE41-NEXT:    shufps {{.*#+}} xmm6 = xmm6[0,2],xmm2[0,2]
378 ; SSE41-NEXT:    movaps %xmm6, %xmm0
379 ; SSE41-NEXT:    movaps %xmm4, %xmm1
380 ; SSE41-NEXT:    retq
382 ; AVX1-LABEL: trunc_usat_v8i64_v8i32:
383 ; AVX1:       # %bb.0:
384 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
385 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
386 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
387 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
388 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [9223372041149743103,9223372041149743103]
389 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm5, %xmm3
390 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm6
391 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm5, %xmm6
392 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm6, %ymm3
393 ; AVX1-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
394 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
395 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
396 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm5, %xmm3
397 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm4
398 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
399 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
400 ; AVX1-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
401 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
402 ; AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
403 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
404 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
405 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
406 ; AVX1-NEXT:    retq
408 ; AVX2-SLOW-LABEL: trunc_usat_v8i64_v8i32:
409 ; AVX2-SLOW:       # %bb.0:
410 ; AVX2-SLOW-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
411 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
412 ; AVX2-SLOW-NEXT:    vpxor %ymm3, %ymm1, %ymm4
413 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
414 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
415 ; AVX2-SLOW-NEXT:    vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
416 ; AVX2-SLOW-NEXT:    vpxor %ymm3, %ymm0, %ymm3
417 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm3, %ymm5, %ymm3
418 ; AVX2-SLOW-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
419 ; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} ymm0 = ymm0[0,2,2,3,4,6,6,7]
420 ; AVX2-SLOW-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,2,2,3]
421 ; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} ymm1 = ymm1[0,2,2,3,4,6,6,7]
422 ; AVX2-SLOW-NEXT:    vpermpd {{.*#+}} ymm1 = ymm1[0,2,2,3]
423 ; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
424 ; AVX2-SLOW-NEXT:    retq
426 ; AVX2-FAST-LABEL: trunc_usat_v8i64_v8i32:
427 ; AVX2-FAST:       # %bb.0:
428 ; AVX2-FAST-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
429 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
430 ; AVX2-FAST-NEXT:    vpxor %ymm3, %ymm1, %ymm4
431 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
432 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
433 ; AVX2-FAST-NEXT:    vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
434 ; AVX2-FAST-NEXT:    vpxor %ymm3, %ymm0, %ymm3
435 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm3, %ymm5, %ymm3
436 ; AVX2-FAST-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
437 ; AVX2-FAST-NEXT:    vmovapd {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
438 ; AVX2-FAST-NEXT:    vpermps %ymm0, %ymm2, %ymm0
439 ; AVX2-FAST-NEXT:    vpermps %ymm1, %ymm2, %ymm1
440 ; AVX2-FAST-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
441 ; AVX2-FAST-NEXT:    retq
443 ; AVX512-LABEL: trunc_usat_v8i64_v8i32:
444 ; AVX512:       # %bb.0:
445 ; AVX512-NEXT:    vpmovusqd %zmm0, %ymm0
446 ; AVX512-NEXT:    retq
447   %1 = icmp ult <8 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
448   %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>
449   %3 = trunc <8 x i64> %2 to <8 x i32>
450   ret <8 x i32> %3
454 ; Unsigned saturation truncation to vXi16
457 define <8 x i16> @trunc_usat_v8i64_v8i16(<8 x i64> %a0) {
458 ; SSE2-LABEL: trunc_usat_v8i64_v8i16:
459 ; SSE2:       # %bb.0:
460 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [65535,65535]
461 ; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
462 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
463 ; SSE2-NEXT:    pxor %xmm6, %xmm5
464 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002324991,9223372039002324991]
465 ; SSE2-NEXT:    movdqa %xmm9, %xmm7
466 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
467 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
468 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm5
469 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
470 ; SSE2-NEXT:    pand %xmm10, %xmm4
471 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
472 ; SSE2-NEXT:    por %xmm4, %xmm5
473 ; SSE2-NEXT:    pand %xmm5, %xmm2
474 ; SSE2-NEXT:    pandn %xmm8, %xmm5
475 ; SSE2-NEXT:    por %xmm2, %xmm5
476 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
477 ; SSE2-NEXT:    pxor %xmm6, %xmm2
478 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
479 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
480 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
481 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm2
482 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
483 ; SSE2-NEXT:    pand %xmm10, %xmm7
484 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
485 ; SSE2-NEXT:    por %xmm7, %xmm2
486 ; SSE2-NEXT:    pand %xmm2, %xmm3
487 ; SSE2-NEXT:    pandn %xmm8, %xmm2
488 ; SSE2-NEXT:    por %xmm3, %xmm2
489 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
490 ; SSE2-NEXT:    pxor %xmm6, %xmm3
491 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
492 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
493 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
494 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm3
495 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
496 ; SSE2-NEXT:    pand %xmm7, %xmm3
497 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
498 ; SSE2-NEXT:    por %xmm3, %xmm4
499 ; SSE2-NEXT:    pand %xmm4, %xmm0
500 ; SSE2-NEXT:    pandn %xmm8, %xmm4
501 ; SSE2-NEXT:    por %xmm0, %xmm4
502 ; SSE2-NEXT:    pxor %xmm1, %xmm6
503 ; SSE2-NEXT:    movdqa %xmm9, %xmm0
504 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm0
505 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2]
506 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm6
507 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
508 ; SSE2-NEXT:    pand %xmm3, %xmm6
509 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
510 ; SSE2-NEXT:    por %xmm6, %xmm0
511 ; SSE2-NEXT:    pand %xmm0, %xmm1
512 ; SSE2-NEXT:    pandn %xmm8, %xmm0
513 ; SSE2-NEXT:    por %xmm1, %xmm0
514 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
515 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
516 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[0,2,2,3]
517 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
518 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
519 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
520 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm2 = xmm0[0,1,0,2,4,5,6,7]
521 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
522 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
523 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
524 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
525 ; SSE2-NEXT:    retq
527 ; SSSE3-LABEL: trunc_usat_v8i64_v8i16:
528 ; SSSE3:       # %bb.0:
529 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [65535,65535]
530 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
531 ; SSSE3-NEXT:    movdqa %xmm2, %xmm5
532 ; SSSE3-NEXT:    pxor %xmm6, %xmm5
533 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002324991,9223372039002324991]
534 ; SSSE3-NEXT:    movdqa %xmm9, %xmm7
535 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm7
536 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
537 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm5
538 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
539 ; SSSE3-NEXT:    pand %xmm10, %xmm4
540 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
541 ; SSSE3-NEXT:    por %xmm4, %xmm5
542 ; SSSE3-NEXT:    pand %xmm5, %xmm2
543 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
544 ; SSSE3-NEXT:    por %xmm2, %xmm5
545 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
546 ; SSSE3-NEXT:    pxor %xmm6, %xmm2
547 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
548 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
549 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
550 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm2
551 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
552 ; SSSE3-NEXT:    pand %xmm10, %xmm7
553 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
554 ; SSSE3-NEXT:    por %xmm7, %xmm2
555 ; SSSE3-NEXT:    pand %xmm2, %xmm3
556 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
557 ; SSSE3-NEXT:    por %xmm3, %xmm2
558 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
559 ; SSSE3-NEXT:    pxor %xmm6, %xmm3
560 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
561 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
562 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
563 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm3
564 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
565 ; SSSE3-NEXT:    pand %xmm7, %xmm3
566 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
567 ; SSSE3-NEXT:    por %xmm3, %xmm4
568 ; SSSE3-NEXT:    pand %xmm4, %xmm0
569 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
570 ; SSSE3-NEXT:    por %xmm0, %xmm4
571 ; SSSE3-NEXT:    pxor %xmm1, %xmm6
572 ; SSSE3-NEXT:    movdqa %xmm9, %xmm0
573 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm0
574 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2]
575 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm6
576 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
577 ; SSSE3-NEXT:    pand %xmm3, %xmm6
578 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
579 ; SSSE3-NEXT:    por %xmm6, %xmm0
580 ; SSSE3-NEXT:    pand %xmm0, %xmm1
581 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
582 ; SSSE3-NEXT:    por %xmm1, %xmm0
583 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
584 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
585 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[0,2,2,3]
586 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
587 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
588 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
589 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm2 = xmm0[0,1,0,2,4,5,6,7]
590 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
591 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
592 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
593 ; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
594 ; SSSE3-NEXT:    retq
596 ; SSE41-LABEL: trunc_usat_v8i64_v8i16:
597 ; SSE41:       # %bb.0:
598 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
599 ; SSE41-NEXT:    movapd {{.*#+}} xmm5 = [65535,65535]
600 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
601 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
602 ; SSE41-NEXT:    pxor %xmm6, %xmm0
603 ; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002324991,9223372039002324991]
604 ; SSE41-NEXT:    movdqa %xmm9, %xmm7
605 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
606 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
607 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
608 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
609 ; SSE41-NEXT:    pand %xmm4, %xmm0
610 ; SSE41-NEXT:    por %xmm7, %xmm0
611 ; SSE41-NEXT:    movapd %xmm5, %xmm4
612 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
613 ; SSE41-NEXT:    movdqa %xmm8, %xmm0
614 ; SSE41-NEXT:    pxor %xmm6, %xmm0
615 ; SSE41-NEXT:    movdqa %xmm9, %xmm1
616 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
617 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[0,0,2,2]
618 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
619 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
620 ; SSE41-NEXT:    pand %xmm7, %xmm0
621 ; SSE41-NEXT:    por %xmm1, %xmm0
622 ; SSE41-NEXT:    movapd %xmm5, %xmm1
623 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm1
624 ; SSE41-NEXT:    packusdw %xmm4, %xmm1
625 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
626 ; SSE41-NEXT:    pxor %xmm6, %xmm0
627 ; SSE41-NEXT:    movdqa %xmm9, %xmm4
628 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
629 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
630 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
631 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
632 ; SSE41-NEXT:    pand %xmm7, %xmm0
633 ; SSE41-NEXT:    por %xmm4, %xmm0
634 ; SSE41-NEXT:    movapd %xmm5, %xmm4
635 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm4
636 ; SSE41-NEXT:    pxor %xmm2, %xmm6
637 ; SSE41-NEXT:    movdqa %xmm9, %xmm3
638 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm3
639 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[0,0,2,2]
640 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm6
641 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
642 ; SSE41-NEXT:    pand %xmm7, %xmm0
643 ; SSE41-NEXT:    por %xmm3, %xmm0
644 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
645 ; SSE41-NEXT:    packusdw %xmm4, %xmm5
646 ; SSE41-NEXT:    packusdw %xmm5, %xmm1
647 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
648 ; SSE41-NEXT:    retq
650 ; AVX1-LABEL: trunc_usat_v8i64_v8i16:
651 ; AVX1:       # %bb.0:
652 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm2 = [65535,65535,65535,65535]
653 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
654 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
655 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
656 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [9223372036854841343,9223372036854841343]
657 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm5, %xmm3
658 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm6
659 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm5, %xmm6
660 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm6, %ymm3
661 ; AVX1-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
662 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
663 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
664 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm5, %xmm3
665 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm4
666 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
667 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
668 ; AVX1-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
669 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
670 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
671 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
672 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
673 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
674 ; AVX1-NEXT:    vzeroupper
675 ; AVX1-NEXT:    retq
677 ; AVX2-LABEL: trunc_usat_v8i64_v8i16:
678 ; AVX2:       # %bb.0:
679 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [65535,65535,65535,65535]
680 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
681 ; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm4
682 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343]
683 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
684 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
685 ; AVX2-NEXT:    vpxor %ymm3, %ymm0, %ymm3
686 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm5, %ymm3
687 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
688 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
689 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
690 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
691 ; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
692 ; AVX2-NEXT:    vzeroupper
693 ; AVX2-NEXT:    retq
695 ; AVX512-LABEL: trunc_usat_v8i64_v8i16:
696 ; AVX512:       # %bb.0:
697 ; AVX512-NEXT:    vpmovusqw %zmm0, %xmm0
698 ; AVX512-NEXT:    vzeroupper
699 ; AVX512-NEXT:    retq
700   %1 = icmp ult <8 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
701   %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>
702   %3 = trunc <8 x i64> %2 to <8 x i16>
703   ret <8 x i16> %3
706 define <8 x i16> @trunc_usat_v8i32_v8i16(<8 x i32> %a0) {
707 ; SSE2-LABEL: trunc_usat_v8i32_v8i16:
708 ; SSE2:       # %bb.0:
709 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
710 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
711 ; SSE2-NEXT:    pxor %xmm2, %xmm3
712 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147549183,2147549183,2147549183,2147549183]
713 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
714 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
715 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm3
716 ; SSE2-NEXT:    pand %xmm5, %xmm0
717 ; SSE2-NEXT:    pxor %xmm3, %xmm5
718 ; SSE2-NEXT:    por %xmm5, %xmm0
719 ; SSE2-NEXT:    pxor %xmm1, %xmm2
720 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
721 ; SSE2-NEXT:    pxor %xmm4, %xmm3
722 ; SSE2-NEXT:    pand %xmm1, %xmm4
723 ; SSE2-NEXT:    por %xmm3, %xmm4
724 ; SSE2-NEXT:    pslld $16, %xmm4
725 ; SSE2-NEXT:    psrad $16, %xmm4
726 ; SSE2-NEXT:    pslld $16, %xmm0
727 ; SSE2-NEXT:    psrad $16, %xmm0
728 ; SSE2-NEXT:    packssdw %xmm4, %xmm0
729 ; SSE2-NEXT:    retq
731 ; SSSE3-LABEL: trunc_usat_v8i32_v8i16:
732 ; SSSE3:       # %bb.0:
733 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
734 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
735 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
736 ; SSSE3-NEXT:    pxor %xmm3, %xmm4
737 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
738 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
739 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
740 ; SSSE3-NEXT:    pand %xmm6, %xmm0
741 ; SSSE3-NEXT:    pandn %xmm2, %xmm6
742 ; SSSE3-NEXT:    por %xmm6, %xmm0
743 ; SSSE3-NEXT:    pxor %xmm1, %xmm3
744 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
745 ; SSSE3-NEXT:    pand %xmm5, %xmm1
746 ; SSSE3-NEXT:    pandn %xmm2, %xmm5
747 ; SSSE3-NEXT:    por %xmm1, %xmm5
748 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
749 ; SSSE3-NEXT:    pshufb %xmm1, %xmm5
750 ; SSSE3-NEXT:    pshufb %xmm1, %xmm0
751 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0]
752 ; SSSE3-NEXT:    retq
754 ; SSE41-LABEL: trunc_usat_v8i32_v8i16:
755 ; SSE41:       # %bb.0:
756 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
757 ; SSE41-NEXT:    pminud %xmm2, %xmm1
758 ; SSE41-NEXT:    pminud %xmm2, %xmm0
759 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
760 ; SSE41-NEXT:    retq
762 ; AVX1-LABEL: trunc_usat_v8i32_v8i16:
763 ; AVX1:       # %bb.0:
764 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
765 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
766 ; AVX1-NEXT:    vpminud %xmm2, %xmm1, %xmm1
767 ; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
768 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
769 ; AVX1-NEXT:    vzeroupper
770 ; AVX1-NEXT:    retq
772 ; AVX2-LABEL: trunc_usat_v8i32_v8i16:
773 ; AVX2:       # %bb.0:
774 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535]
775 ; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
776 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
777 ; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
778 ; AVX2-NEXT:    vzeroupper
779 ; AVX2-NEXT:    retq
781 ; AVX512F-LABEL: trunc_usat_v8i32_v8i16:
782 ; AVX512F:       # %bb.0:
783 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535]
784 ; AVX512F-NEXT:    vpminud %ymm1, %ymm0, %ymm0
785 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
786 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
787 ; AVX512F-NEXT:    vzeroupper
788 ; AVX512F-NEXT:    retq
790 ; AVX512VL-LABEL: trunc_usat_v8i32_v8i16:
791 ; AVX512VL:       # %bb.0:
792 ; AVX512VL-NEXT:    vpmovusdw %ymm0, %xmm0
793 ; AVX512VL-NEXT:    vzeroupper
794 ; AVX512VL-NEXT:    retq
796 ; AVX512BW-LABEL: trunc_usat_v8i32_v8i16:
797 ; AVX512BW:       # %bb.0:
798 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535]
799 ; AVX512BW-NEXT:    vpminud %ymm1, %ymm0, %ymm0
800 ; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
801 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
802 ; AVX512BW-NEXT:    vzeroupper
803 ; AVX512BW-NEXT:    retq
805 ; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i16:
806 ; AVX512BWVL:       # %bb.0:
807 ; AVX512BWVL-NEXT:    vpmovusdw %ymm0, %xmm0
808 ; AVX512BWVL-NEXT:    vzeroupper
809 ; AVX512BWVL-NEXT:    retq
810   %1 = icmp ult <8 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
811   %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>
812   %3 = trunc <8 x i32> %2 to <8 x i16>
813   ret <8 x i16> %3
816 define <16 x i16> @trunc_usat_v16i32_v16i16(<16 x i32> %a0) {
817 ; SSE2-LABEL: trunc_usat_v16i32_v16i16:
818 ; SSE2:       # %bb.0:
819 ; SSE2-NEXT:    movdqa %xmm1, %xmm8
820 ; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
821 ; SSE2-NEXT:    movdqa %xmm2, %xmm7
822 ; SSE2-NEXT:    pxor %xmm6, %xmm7
823 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
824 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
825 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm1
826 ; SSE2-NEXT:    pcmpeqd %xmm7, %xmm7
827 ; SSE2-NEXT:    pand %xmm1, %xmm2
828 ; SSE2-NEXT:    pxor %xmm7, %xmm1
829 ; SSE2-NEXT:    por %xmm2, %xmm1
830 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
831 ; SSE2-NEXT:    pxor %xmm6, %xmm4
832 ; SSE2-NEXT:    movdqa %xmm5, %xmm2
833 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
834 ; SSE2-NEXT:    pand %xmm2, %xmm3
835 ; SSE2-NEXT:    pxor %xmm7, %xmm2
836 ; SSE2-NEXT:    por %xmm3, %xmm2
837 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
838 ; SSE2-NEXT:    pxor %xmm6, %xmm3
839 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
840 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
841 ; SSE2-NEXT:    pand %xmm4, %xmm0
842 ; SSE2-NEXT:    pxor %xmm7, %xmm4
843 ; SSE2-NEXT:    por %xmm4, %xmm0
844 ; SSE2-NEXT:    pxor %xmm8, %xmm6
845 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
846 ; SSE2-NEXT:    pxor %xmm5, %xmm7
847 ; SSE2-NEXT:    pand %xmm8, %xmm5
848 ; SSE2-NEXT:    por %xmm7, %xmm5
849 ; SSE2-NEXT:    pslld $16, %xmm5
850 ; SSE2-NEXT:    psrad $16, %xmm5
851 ; SSE2-NEXT:    pslld $16, %xmm0
852 ; SSE2-NEXT:    psrad $16, %xmm0
853 ; SSE2-NEXT:    packssdw %xmm5, %xmm0
854 ; SSE2-NEXT:    pslld $16, %xmm2
855 ; SSE2-NEXT:    psrad $16, %xmm2
856 ; SSE2-NEXT:    pslld $16, %xmm1
857 ; SSE2-NEXT:    psrad $16, %xmm1
858 ; SSE2-NEXT:    packssdw %xmm2, %xmm1
859 ; SSE2-NEXT:    retq
861 ; SSSE3-LABEL: trunc_usat_v16i32_v16i16:
862 ; SSSE3:       # %bb.0:
863 ; SSSE3-NEXT:    movdqa %xmm1, %xmm8
864 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
865 ; SSSE3-NEXT:    movdqa %xmm2, %xmm7
866 ; SSSE3-NEXT:    pxor %xmm6, %xmm7
867 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
868 ; SSSE3-NEXT:    movdqa %xmm5, %xmm1
869 ; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm1
870 ; SSSE3-NEXT:    pcmpeqd %xmm7, %xmm7
871 ; SSSE3-NEXT:    pand %xmm1, %xmm2
872 ; SSSE3-NEXT:    pxor %xmm7, %xmm1
873 ; SSSE3-NEXT:    por %xmm2, %xmm1
874 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
875 ; SSSE3-NEXT:    pxor %xmm6, %xmm4
876 ; SSSE3-NEXT:    movdqa %xmm5, %xmm2
877 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm2
878 ; SSSE3-NEXT:    pand %xmm2, %xmm3
879 ; SSSE3-NEXT:    pxor %xmm7, %xmm2
880 ; SSSE3-NEXT:    por %xmm3, %xmm2
881 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
882 ; SSSE3-NEXT:    pxor %xmm6, %xmm3
883 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
884 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
885 ; SSSE3-NEXT:    pand %xmm4, %xmm0
886 ; SSSE3-NEXT:    pxor %xmm7, %xmm4
887 ; SSSE3-NEXT:    por %xmm4, %xmm0
888 ; SSSE3-NEXT:    pxor %xmm8, %xmm6
889 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm5
890 ; SSSE3-NEXT:    pxor %xmm5, %xmm7
891 ; SSSE3-NEXT:    pand %xmm8, %xmm5
892 ; SSSE3-NEXT:    por %xmm7, %xmm5
893 ; SSSE3-NEXT:    pslld $16, %xmm5
894 ; SSSE3-NEXT:    psrad $16, %xmm5
895 ; SSSE3-NEXT:    pslld $16, %xmm0
896 ; SSSE3-NEXT:    psrad $16, %xmm0
897 ; SSSE3-NEXT:    packssdw %xmm5, %xmm0
898 ; SSSE3-NEXT:    pslld $16, %xmm2
899 ; SSSE3-NEXT:    psrad $16, %xmm2
900 ; SSSE3-NEXT:    pslld $16, %xmm1
901 ; SSSE3-NEXT:    psrad $16, %xmm1
902 ; SSSE3-NEXT:    packssdw %xmm2, %xmm1
903 ; SSSE3-NEXT:    retq
905 ; SSE41-LABEL: trunc_usat_v16i32_v16i16:
906 ; SSE41:       # %bb.0:
907 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [65535,65535,65535,65535]
908 ; SSE41-NEXT:    pminud %xmm4, %xmm3
909 ; SSE41-NEXT:    pminud %xmm4, %xmm2
910 ; SSE41-NEXT:    packusdw %xmm3, %xmm2
911 ; SSE41-NEXT:    pminud %xmm4, %xmm1
912 ; SSE41-NEXT:    pminud %xmm4, %xmm0
913 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
914 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
915 ; SSE41-NEXT:    retq
917 ; AVX1-LABEL: trunc_usat_v16i32_v16i16:
918 ; AVX1:       # %bb.0:
919 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
920 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [65535,65535,65535,65535]
921 ; AVX1-NEXT:    vpminud %xmm3, %xmm2, %xmm2
922 ; AVX1-NEXT:    vpminud %xmm3, %xmm0, %xmm0
923 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
924 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
925 ; AVX1-NEXT:    vpminud %xmm3, %xmm2, %xmm2
926 ; AVX1-NEXT:    vpminud %xmm3, %xmm1, %xmm1
927 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
928 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
929 ; AVX1-NEXT:    retq
931 ; AVX2-LABEL: trunc_usat_v16i32_v16i16:
932 ; AVX2:       # %bb.0:
933 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535]
934 ; AVX2-NEXT:    vpminud %ymm2, %ymm1, %ymm1
935 ; AVX2-NEXT:    vpminud %ymm2, %ymm0, %ymm0
936 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
937 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
938 ; AVX2-NEXT:    retq
940 ; AVX512-LABEL: trunc_usat_v16i32_v16i16:
941 ; AVX512:       # %bb.0:
942 ; AVX512-NEXT:    vpmovusdw %zmm0, %ymm0
943 ; AVX512-NEXT:    retq
944   %1 = icmp ult <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>
945   %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>
946   %3 = trunc <16 x i32> %2 to <16 x i16>
947   ret <16 x i16> %3
951 ; Unsigned saturation truncation to v16i8
954 define <8 x i8> @trunc_usat_v8i64_v8i8(<8 x i64> %a0) {
955 ; SSE2-LABEL: trunc_usat_v8i64_v8i8:
956 ; SSE2:       # %bb.0:
957 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
958 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
959 ; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
960 ; SSE2-NEXT:    pxor %xmm6, %xmm0
961 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
962 ; SSE2-NEXT:    movdqa %xmm9, %xmm7
963 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm7
964 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
965 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
966 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
967 ; SSE2-NEXT:    pand %xmm10, %xmm5
968 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
969 ; SSE2-NEXT:    por %xmm5, %xmm0
970 ; SSE2-NEXT:    pand %xmm0, %xmm4
971 ; SSE2-NEXT:    pandn %xmm8, %xmm0
972 ; SSE2-NEXT:    por %xmm4, %xmm0
973 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
974 ; SSE2-NEXT:    pxor %xmm6, %xmm4
975 ; SSE2-NEXT:    movdqa %xmm9, %xmm5
976 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm5
977 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm5[0,0,2,2]
978 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
979 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
980 ; SSE2-NEXT:    pand %xmm10, %xmm7
981 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
982 ; SSE2-NEXT:    por %xmm7, %xmm4
983 ; SSE2-NEXT:    pand %xmm4, %xmm1
984 ; SSE2-NEXT:    pandn %xmm8, %xmm4
985 ; SSE2-NEXT:    por %xmm1, %xmm4
986 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
987 ; SSE2-NEXT:    pxor %xmm6, %xmm1
988 ; SSE2-NEXT:    movdqa %xmm9, %xmm5
989 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm5
990 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm5[0,0,2,2]
991 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
992 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
993 ; SSE2-NEXT:    pand %xmm10, %xmm7
994 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]
995 ; SSE2-NEXT:    por %xmm7, %xmm1
996 ; SSE2-NEXT:    pand %xmm1, %xmm2
997 ; SSE2-NEXT:    pandn %xmm8, %xmm1
998 ; SSE2-NEXT:    por %xmm2, %xmm1
999 ; SSE2-NEXT:    pxor %xmm3, %xmm6
1000 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
1001 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm2
1002 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
1003 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm6
1004 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1005 ; SSE2-NEXT:    pand %xmm5, %xmm6
1006 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1007 ; SSE2-NEXT:    por %xmm6, %xmm2
1008 ; SSE2-NEXT:    pand %xmm2, %xmm3
1009 ; SSE2-NEXT:    pandn %xmm8, %xmm2
1010 ; SSE2-NEXT:    por %xmm3, %xmm2
1011 ; SSE2-NEXT:    pand %xmm8, %xmm2
1012 ; SSE2-NEXT:    pand %xmm8, %xmm1
1013 ; SSE2-NEXT:    packuswb %xmm2, %xmm1
1014 ; SSE2-NEXT:    pand %xmm8, %xmm4
1015 ; SSE2-NEXT:    pand %xmm8, %xmm0
1016 ; SSE2-NEXT:    packuswb %xmm4, %xmm0
1017 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
1018 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
1019 ; SSE2-NEXT:    retq
1021 ; SSSE3-LABEL: trunc_usat_v8i64_v8i8:
1022 ; SSSE3:       # %bb.0:
1023 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
1024 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
1025 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
1026 ; SSSE3-NEXT:    pxor %xmm6, %xmm0
1027 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
1028 ; SSSE3-NEXT:    movdqa %xmm9, %xmm7
1029 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm7
1030 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
1031 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
1032 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
1033 ; SSSE3-NEXT:    pand %xmm10, %xmm5
1034 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
1035 ; SSSE3-NEXT:    por %xmm5, %xmm0
1036 ; SSSE3-NEXT:    pand %xmm0, %xmm4
1037 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
1038 ; SSSE3-NEXT:    por %xmm4, %xmm0
1039 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
1040 ; SSSE3-NEXT:    pxor %xmm6, %xmm4
1041 ; SSSE3-NEXT:    movdqa %xmm9, %xmm5
1042 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm5
1043 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm5[0,0,2,2]
1044 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
1045 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
1046 ; SSSE3-NEXT:    pand %xmm10, %xmm7
1047 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1048 ; SSSE3-NEXT:    por %xmm7, %xmm4
1049 ; SSSE3-NEXT:    pand %xmm4, %xmm1
1050 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
1051 ; SSSE3-NEXT:    por %xmm1, %xmm4
1052 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1053 ; SSSE3-NEXT:    pxor %xmm6, %xmm1
1054 ; SSSE3-NEXT:    movdqa %xmm9, %xmm5
1055 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm5
1056 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm5[0,0,2,2]
1057 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
1058 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
1059 ; SSSE3-NEXT:    pand %xmm10, %xmm7
1060 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]
1061 ; SSSE3-NEXT:    por %xmm7, %xmm1
1062 ; SSSE3-NEXT:    pand %xmm1, %xmm2
1063 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
1064 ; SSSE3-NEXT:    por %xmm2, %xmm1
1065 ; SSSE3-NEXT:    pxor %xmm3, %xmm6
1066 ; SSSE3-NEXT:    movdqa %xmm9, %xmm2
1067 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm2
1068 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
1069 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm6
1070 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1071 ; SSSE3-NEXT:    pand %xmm5, %xmm6
1072 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1073 ; SSSE3-NEXT:    por %xmm6, %xmm2
1074 ; SSSE3-NEXT:    pand %xmm2, %xmm3
1075 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
1076 ; SSSE3-NEXT:    por %xmm3, %xmm2
1077 ; SSSE3-NEXT:    pand %xmm8, %xmm2
1078 ; SSSE3-NEXT:    pand %xmm8, %xmm1
1079 ; SSSE3-NEXT:    packuswb %xmm2, %xmm1
1080 ; SSSE3-NEXT:    pand %xmm8, %xmm4
1081 ; SSSE3-NEXT:    pand %xmm8, %xmm0
1082 ; SSSE3-NEXT:    packuswb %xmm4, %xmm0
1083 ; SSSE3-NEXT:    packuswb %xmm1, %xmm0
1084 ; SSSE3-NEXT:    packuswb %xmm0, %xmm0
1085 ; SSSE3-NEXT:    retq
1087 ; SSE41-LABEL: trunc_usat_v8i64_v8i8:
1088 ; SSE41:       # %bb.0:
1089 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
1090 ; SSE41-NEXT:    movapd {{.*#+}} xmm8 = [255,255]
1091 ; SSE41-NEXT:    movdqa {{.*#+}} xmm7 = [9223372039002259456,9223372039002259456]
1092 ; SSE41-NEXT:    pxor %xmm7, %xmm0
1093 ; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
1094 ; SSE41-NEXT:    movdqa %xmm9, %xmm4
1095 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
1096 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1097 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
1098 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1099 ; SSE41-NEXT:    pand %xmm6, %xmm0
1100 ; SSE41-NEXT:    por %xmm4, %xmm0
1101 ; SSE41-NEXT:    movapd %xmm8, %xmm4
1102 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm4
1103 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1104 ; SSE41-NEXT:    pxor %xmm7, %xmm0
1105 ; SSE41-NEXT:    movdqa %xmm9, %xmm5
1106 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
1107 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1108 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
1109 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1110 ; SSE41-NEXT:    pand %xmm6, %xmm0
1111 ; SSE41-NEXT:    por %xmm5, %xmm0
1112 ; SSE41-NEXT:    movapd %xmm8, %xmm5
1113 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
1114 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1115 ; SSE41-NEXT:    pxor %xmm7, %xmm0
1116 ; SSE41-NEXT:    movdqa %xmm9, %xmm1
1117 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
1118 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
1119 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
1120 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1121 ; SSE41-NEXT:    pand %xmm6, %xmm0
1122 ; SSE41-NEXT:    por %xmm1, %xmm0
1123 ; SSE41-NEXT:    movapd %xmm8, %xmm1
1124 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
1125 ; SSE41-NEXT:    pxor %xmm3, %xmm7
1126 ; SSE41-NEXT:    movdqa %xmm9, %xmm2
1127 ; SSE41-NEXT:    pcmpgtd %xmm7, %xmm2
1128 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
1129 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm7
1130 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
1131 ; SSE41-NEXT:    pand %xmm6, %xmm0
1132 ; SSE41-NEXT:    por %xmm2, %xmm0
1133 ; SSE41-NEXT:    movapd %xmm8, %xmm2
1134 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
1135 ; SSE41-NEXT:    andpd %xmm8, %xmm2
1136 ; SSE41-NEXT:    andpd %xmm8, %xmm1
1137 ; SSE41-NEXT:    packusdw %xmm2, %xmm1
1138 ; SSE41-NEXT:    andpd %xmm8, %xmm5
1139 ; SSE41-NEXT:    andpd %xmm8, %xmm4
1140 ; SSE41-NEXT:    packusdw %xmm5, %xmm4
1141 ; SSE41-NEXT:    packusdw %xmm1, %xmm4
1142 ; SSE41-NEXT:    packuswb %xmm4, %xmm4
1143 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1144 ; SSE41-NEXT:    retq
1146 ; AVX1-LABEL: trunc_usat_v8i64_v8i8:
1147 ; AVX1:       # %bb.0:
1148 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm2 = [255,255,255,255]
1149 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1150 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
1151 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
1152 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [9223372036854776063,9223372036854776063]
1153 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm5, %xmm3
1154 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm6
1155 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm5, %xmm6
1156 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm6, %ymm3
1157 ; AVX1-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1158 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1159 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
1160 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm5, %xmm3
1161 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm4
1162 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
1163 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
1164 ; AVX1-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
1165 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1166 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm3 = [1.2598673968951787E-321,1.2598673968951787E-321]
1167 ; AVX1-NEXT:    # xmm3 = mem[0,0]
1168 ; AVX1-NEXT:    vandpd %xmm3, %xmm2, %xmm2
1169 ; AVX1-NEXT:    vandpd %xmm3, %xmm1, %xmm1
1170 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
1171 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1172 ; AVX1-NEXT:    vandpd %xmm3, %xmm2, %xmm2
1173 ; AVX1-NEXT:    vandpd %xmm3, %xmm0, %xmm0
1174 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
1175 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1176 ; AVX1-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
1177 ; AVX1-NEXT:    vzeroupper
1178 ; AVX1-NEXT:    retq
1180 ; AVX2-LABEL: trunc_usat_v8i64_v8i8:
1181 ; AVX2:       # %bb.0:
1182 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [255,255,255,255]
1183 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1184 ; AVX2-NEXT:    vpxor %ymm3, %ymm0, %ymm4
1185 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
1186 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
1187 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm0, %ymm2, %ymm0
1188 ; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm3
1189 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm5, %ymm3
1190 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
1191 ; AVX2-NEXT:    vextractf128 $1, %ymm1, %xmm2
1192 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = <u,u,0,8,u,u,u,u,u,u,u,u,u,u,u,u>
1193 ; AVX2-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
1194 ; AVX2-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
1195 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1196 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm2
1197 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
1198 ; AVX2-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
1199 ; AVX2-NEXT:    vpshufb %xmm3, %xmm0, %xmm0
1200 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1201 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
1202 ; AVX2-NEXT:    vzeroupper
1203 ; AVX2-NEXT:    retq
1205 ; AVX512-LABEL: trunc_usat_v8i64_v8i8:
1206 ; AVX512:       # %bb.0:
1207 ; AVX512-NEXT:    vpminuq {{.*}}(%rip){1to8}, %zmm0, %zmm0
1208 ; AVX512-NEXT:    vpmovqb %zmm0, %xmm0
1209 ; AVX512-NEXT:    vzeroupper
1210 ; AVX512-NEXT:    retq
1211   %1 = icmp ult <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
1212   %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>
1213   %3 = trunc <8 x i64> %2 to <8 x i8>
1214   ret <8 x i8> %3
1217 define void @trunc_usat_v8i64_v8i8_store(<8 x i64> %a0, <8 x i8> *%p1) {
1218 ; SSE2-LABEL: trunc_usat_v8i64_v8i8_store:
1219 ; SSE2:       # %bb.0:
1220 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
1221 ; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
1222 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
1223 ; SSE2-NEXT:    pxor %xmm6, %xmm5
1224 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
1225 ; SSE2-NEXT:    movdqa %xmm9, %xmm7
1226 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
1227 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
1228 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm5
1229 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1230 ; SSE2-NEXT:    pand %xmm10, %xmm4
1231 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1232 ; SSE2-NEXT:    por %xmm4, %xmm5
1233 ; SSE2-NEXT:    pand %xmm5, %xmm0
1234 ; SSE2-NEXT:    pandn %xmm8, %xmm5
1235 ; SSE2-NEXT:    por %xmm0, %xmm5
1236 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
1237 ; SSE2-NEXT:    pxor %xmm6, %xmm0
1238 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
1239 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
1240 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
1241 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
1242 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
1243 ; SSE2-NEXT:    pand %xmm10, %xmm7
1244 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1245 ; SSE2-NEXT:    por %xmm7, %xmm0
1246 ; SSE2-NEXT:    pand %xmm0, %xmm1
1247 ; SSE2-NEXT:    pandn %xmm8, %xmm0
1248 ; SSE2-NEXT:    por %xmm1, %xmm0
1249 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1250 ; SSE2-NEXT:    pxor %xmm6, %xmm1
1251 ; SSE2-NEXT:    movdqa %xmm9, %xmm4
1252 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
1253 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
1254 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
1255 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
1256 ; SSE2-NEXT:    pand %xmm10, %xmm7
1257 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
1258 ; SSE2-NEXT:    por %xmm7, %xmm1
1259 ; SSE2-NEXT:    pand %xmm1, %xmm2
1260 ; SSE2-NEXT:    pandn %xmm8, %xmm1
1261 ; SSE2-NEXT:    por %xmm2, %xmm1
1262 ; SSE2-NEXT:    pxor %xmm3, %xmm6
1263 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
1264 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm2
1265 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1266 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm6
1267 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1268 ; SSE2-NEXT:    pand %xmm4, %xmm6
1269 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1270 ; SSE2-NEXT:    por %xmm6, %xmm2
1271 ; SSE2-NEXT:    pand %xmm2, %xmm3
1272 ; SSE2-NEXT:    pandn %xmm8, %xmm2
1273 ; SSE2-NEXT:    por %xmm3, %xmm2
1274 ; SSE2-NEXT:    pand %xmm8, %xmm2
1275 ; SSE2-NEXT:    pand %xmm8, %xmm1
1276 ; SSE2-NEXT:    packuswb %xmm2, %xmm1
1277 ; SSE2-NEXT:    pand %xmm8, %xmm0
1278 ; SSE2-NEXT:    pand %xmm8, %xmm5
1279 ; SSE2-NEXT:    packuswb %xmm0, %xmm5
1280 ; SSE2-NEXT:    packuswb %xmm1, %xmm5
1281 ; SSE2-NEXT:    packuswb %xmm5, %xmm5
1282 ; SSE2-NEXT:    movq %xmm5, (%rdi)
1283 ; SSE2-NEXT:    retq
1285 ; SSSE3-LABEL: trunc_usat_v8i64_v8i8_store:
1286 ; SSSE3:       # %bb.0:
1287 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
1288 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
1289 ; SSSE3-NEXT:    movdqa %xmm0, %xmm5
1290 ; SSSE3-NEXT:    pxor %xmm6, %xmm5
1291 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
1292 ; SSSE3-NEXT:    movdqa %xmm9, %xmm7
1293 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm7
1294 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
1295 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm5
1296 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1297 ; SSSE3-NEXT:    pand %xmm10, %xmm4
1298 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1299 ; SSSE3-NEXT:    por %xmm4, %xmm5
1300 ; SSSE3-NEXT:    pand %xmm5, %xmm0
1301 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
1302 ; SSSE3-NEXT:    por %xmm0, %xmm5
1303 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
1304 ; SSSE3-NEXT:    pxor %xmm6, %xmm0
1305 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
1306 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm4
1307 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
1308 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
1309 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
1310 ; SSSE3-NEXT:    pand %xmm10, %xmm7
1311 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1312 ; SSSE3-NEXT:    por %xmm7, %xmm0
1313 ; SSSE3-NEXT:    pand %xmm0, %xmm1
1314 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
1315 ; SSSE3-NEXT:    por %xmm1, %xmm0
1316 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1317 ; SSSE3-NEXT:    pxor %xmm6, %xmm1
1318 ; SSSE3-NEXT:    movdqa %xmm9, %xmm4
1319 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
1320 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
1321 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
1322 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
1323 ; SSSE3-NEXT:    pand %xmm10, %xmm7
1324 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
1325 ; SSSE3-NEXT:    por %xmm7, %xmm1
1326 ; SSSE3-NEXT:    pand %xmm1, %xmm2
1327 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
1328 ; SSSE3-NEXT:    por %xmm2, %xmm1
1329 ; SSSE3-NEXT:    pxor %xmm3, %xmm6
1330 ; SSSE3-NEXT:    movdqa %xmm9, %xmm2
1331 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm2
1332 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1333 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm6
1334 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1335 ; SSSE3-NEXT:    pand %xmm4, %xmm6
1336 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1337 ; SSSE3-NEXT:    por %xmm6, %xmm2
1338 ; SSSE3-NEXT:    pand %xmm2, %xmm3
1339 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
1340 ; SSSE3-NEXT:    por %xmm3, %xmm2
1341 ; SSSE3-NEXT:    pand %xmm8, %xmm2
1342 ; SSSE3-NEXT:    pand %xmm8, %xmm1
1343 ; SSSE3-NEXT:    packuswb %xmm2, %xmm1
1344 ; SSSE3-NEXT:    pand %xmm8, %xmm0
1345 ; SSSE3-NEXT:    pand %xmm8, %xmm5
1346 ; SSSE3-NEXT:    packuswb %xmm0, %xmm5
1347 ; SSSE3-NEXT:    packuswb %xmm1, %xmm5
1348 ; SSSE3-NEXT:    packuswb %xmm5, %xmm5
1349 ; SSSE3-NEXT:    movq %xmm5, (%rdi)
1350 ; SSSE3-NEXT:    retq
1352 ; SSE41-LABEL: trunc_usat_v8i64_v8i8_store:
1353 ; SSE41:       # %bb.0:
1354 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
1355 ; SSE41-NEXT:    movapd {{.*#+}} xmm8 = [255,255]
1356 ; SSE41-NEXT:    movdqa {{.*#+}} xmm7 = [9223372039002259456,9223372039002259456]
1357 ; SSE41-NEXT:    pxor %xmm7, %xmm0
1358 ; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
1359 ; SSE41-NEXT:    movdqa %xmm9, %xmm6
1360 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
1361 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[0,0,2,2]
1362 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
1363 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1364 ; SSE41-NEXT:    pand %xmm5, %xmm0
1365 ; SSE41-NEXT:    por %xmm6, %xmm0
1366 ; SSE41-NEXT:    movapd %xmm8, %xmm6
1367 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm6
1368 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1369 ; SSE41-NEXT:    pxor %xmm7, %xmm0
1370 ; SSE41-NEXT:    movdqa %xmm9, %xmm4
1371 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
1372 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1373 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
1374 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1375 ; SSE41-NEXT:    pand %xmm5, %xmm0
1376 ; SSE41-NEXT:    por %xmm4, %xmm0
1377 ; SSE41-NEXT:    movapd %xmm8, %xmm4
1378 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
1379 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1380 ; SSE41-NEXT:    pxor %xmm7, %xmm0
1381 ; SSE41-NEXT:    movdqa %xmm9, %xmm1
1382 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
1383 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2]
1384 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm0
1385 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1386 ; SSE41-NEXT:    pand %xmm5, %xmm0
1387 ; SSE41-NEXT:    por %xmm1, %xmm0
1388 ; SSE41-NEXT:    movapd %xmm8, %xmm1
1389 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
1390 ; SSE41-NEXT:    pxor %xmm3, %xmm7
1391 ; SSE41-NEXT:    movdqa %xmm9, %xmm2
1392 ; SSE41-NEXT:    pcmpgtd %xmm7, %xmm2
1393 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
1394 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm7
1395 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
1396 ; SSE41-NEXT:    pand %xmm5, %xmm0
1397 ; SSE41-NEXT:    por %xmm2, %xmm0
1398 ; SSE41-NEXT:    movapd %xmm8, %xmm2
1399 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
1400 ; SSE41-NEXT:    andpd %xmm8, %xmm2
1401 ; SSE41-NEXT:    andpd %xmm8, %xmm1
1402 ; SSE41-NEXT:    packusdw %xmm2, %xmm1
1403 ; SSE41-NEXT:    andpd %xmm8, %xmm4
1404 ; SSE41-NEXT:    andpd %xmm8, %xmm6
1405 ; SSE41-NEXT:    packusdw %xmm4, %xmm6
1406 ; SSE41-NEXT:    packusdw %xmm1, %xmm6
1407 ; SSE41-NEXT:    packuswb %xmm6, %xmm6
1408 ; SSE41-NEXT:    movq %xmm6, (%rdi)
1409 ; SSE41-NEXT:    retq
1411 ; AVX1-LABEL: trunc_usat_v8i64_v8i8_store:
1412 ; AVX1:       # %bb.0:
1413 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm2 = [255,255,255,255]
1414 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1415 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
1416 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
1417 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [9223372036854776063,9223372036854776063]
1418 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm5, %xmm3
1419 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm6
1420 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm5, %xmm6
1421 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm6, %ymm3
1422 ; AVX1-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1423 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1424 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
1425 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm5, %xmm3
1426 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm4
1427 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
1428 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
1429 ; AVX1-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
1430 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1431 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm3 = [1.2598673968951787E-321,1.2598673968951787E-321]
1432 ; AVX1-NEXT:    # xmm3 = mem[0,0]
1433 ; AVX1-NEXT:    vandpd %xmm3, %xmm2, %xmm2
1434 ; AVX1-NEXT:    vandpd %xmm3, %xmm1, %xmm1
1435 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
1436 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1437 ; AVX1-NEXT:    vandpd %xmm3, %xmm2, %xmm2
1438 ; AVX1-NEXT:    vandpd %xmm3, %xmm0, %xmm0
1439 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
1440 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1441 ; AVX1-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
1442 ; AVX1-NEXT:    vmovq %xmm0, (%rdi)
1443 ; AVX1-NEXT:    vzeroupper
1444 ; AVX1-NEXT:    retq
1446 ; AVX2-LABEL: trunc_usat_v8i64_v8i8_store:
1447 ; AVX2:       # %bb.0:
1448 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [255,255,255,255]
1449 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1450 ; AVX2-NEXT:    vpxor %ymm3, %ymm0, %ymm4
1451 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
1452 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
1453 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm0, %ymm2, %ymm0
1454 ; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm3
1455 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm5, %ymm3
1456 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
1457 ; AVX2-NEXT:    vextractf128 $1, %ymm1, %xmm2
1458 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = <u,u,0,8,u,u,u,u,u,u,u,u,u,u,u,u>
1459 ; AVX2-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
1460 ; AVX2-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
1461 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1462 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm2
1463 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
1464 ; AVX2-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
1465 ; AVX2-NEXT:    vpshufb %xmm3, %xmm0, %xmm0
1466 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1467 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
1468 ; AVX2-NEXT:    vmovq %xmm0, (%rdi)
1469 ; AVX2-NEXT:    vzeroupper
1470 ; AVX2-NEXT:    retq
1472 ; AVX512-LABEL: trunc_usat_v8i64_v8i8_store:
1473 ; AVX512:       # %bb.0:
1474 ; AVX512-NEXT:    vpmovusqb %zmm0, (%rdi)
1475 ; AVX512-NEXT:    vzeroupper
1476 ; AVX512-NEXT:    retq
1477   %1 = icmp ult <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
1478   %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>
1479   %3 = trunc <8 x i64> %2 to <8 x i8>
1480   store <8 x i8> %3, <8 x i8> *%p1
1481   ret void
1484 define <16 x i8> @trunc_usat_v16i64_v16i8(<16 x i64> %a0) {
1485 ; SSE2-LABEL: trunc_usat_v16i64_v16i8:
1486 ; SSE2:       # %bb.0:
1487 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
1488 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259456,9223372039002259456]
1489 ; SSE2-NEXT:    movdqa %xmm1, %xmm11
1490 ; SSE2-NEXT:    pxor %xmm9, %xmm11
1491 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [9223372039002259711,9223372039002259711]
1492 ; SSE2-NEXT:    movdqa %xmm10, %xmm12
1493 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm12
1494 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
1495 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm11
1496 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]
1497 ; SSE2-NEXT:    pand %xmm13, %xmm11
1498 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
1499 ; SSE2-NEXT:    por %xmm11, %xmm12
1500 ; SSE2-NEXT:    pand %xmm12, %xmm1
1501 ; SSE2-NEXT:    pandn %xmm8, %xmm12
1502 ; SSE2-NEXT:    por %xmm1, %xmm12
1503 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1504 ; SSE2-NEXT:    pxor %xmm9, %xmm1
1505 ; SSE2-NEXT:    movdqa %xmm10, %xmm11
1506 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm11
1507 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm11[0,0,2,2]
1508 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
1509 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm1[1,1,3,3]
1510 ; SSE2-NEXT:    pand %xmm13, %xmm14
1511 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3]
1512 ; SSE2-NEXT:    por %xmm14, %xmm1
1513 ; SSE2-NEXT:    pand %xmm1, %xmm0
1514 ; SSE2-NEXT:    pandn %xmm8, %xmm1
1515 ; SSE2-NEXT:    por %xmm1, %xmm0
1516 ; SSE2-NEXT:    packuswb %xmm12, %xmm0
1517 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
1518 ; SSE2-NEXT:    pxor %xmm9, %xmm1
1519 ; SSE2-NEXT:    movdqa %xmm10, %xmm11
1520 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm11
1521 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1522 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
1523 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm1[1,1,3,3]
1524 ; SSE2-NEXT:    pand %xmm12, %xmm13
1525 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3]
1526 ; SSE2-NEXT:    por %xmm13, %xmm1
1527 ; SSE2-NEXT:    pand %xmm1, %xmm3
1528 ; SSE2-NEXT:    pandn %xmm8, %xmm1
1529 ; SSE2-NEXT:    por %xmm3, %xmm1
1530 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
1531 ; SSE2-NEXT:    pxor %xmm9, %xmm3
1532 ; SSE2-NEXT:    movdqa %xmm10, %xmm11
1533 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm11
1534 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1535 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm3
1536 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm3[1,1,3,3]
1537 ; SSE2-NEXT:    pand %xmm12, %xmm13
1538 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm11[1,1,3,3]
1539 ; SSE2-NEXT:    por %xmm13, %xmm3
1540 ; SSE2-NEXT:    pand %xmm3, %xmm2
1541 ; SSE2-NEXT:    pandn %xmm8, %xmm3
1542 ; SSE2-NEXT:    por %xmm2, %xmm3
1543 ; SSE2-NEXT:    packuswb %xmm1, %xmm3
1544 ; SSE2-NEXT:    packuswb %xmm3, %xmm0
1545 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
1546 ; SSE2-NEXT:    pxor %xmm9, %xmm1
1547 ; SSE2-NEXT:    movdqa %xmm10, %xmm2
1548 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1549 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
1550 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
1551 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1552 ; SSE2-NEXT:    pand %xmm3, %xmm1
1553 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1554 ; SSE2-NEXT:    por %xmm1, %xmm2
1555 ; SSE2-NEXT:    pand %xmm2, %xmm5
1556 ; SSE2-NEXT:    pandn %xmm8, %xmm2
1557 ; SSE2-NEXT:    por %xmm5, %xmm2
1558 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
1559 ; SSE2-NEXT:    pxor %xmm9, %xmm1
1560 ; SSE2-NEXT:    movdqa %xmm10, %xmm3
1561 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
1562 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm3[0,0,2,2]
1563 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
1564 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
1565 ; SSE2-NEXT:    pand %xmm11, %xmm5
1566 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
1567 ; SSE2-NEXT:    por %xmm5, %xmm1
1568 ; SSE2-NEXT:    pand %xmm1, %xmm4
1569 ; SSE2-NEXT:    pandn %xmm8, %xmm1
1570 ; SSE2-NEXT:    por %xmm4, %xmm1
1571 ; SSE2-NEXT:    packuswb %xmm2, %xmm1
1572 ; SSE2-NEXT:    movdqa %xmm7, %xmm2
1573 ; SSE2-NEXT:    pxor %xmm9, %xmm2
1574 ; SSE2-NEXT:    movdqa %xmm10, %xmm3
1575 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
1576 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1577 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm2
1578 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1579 ; SSE2-NEXT:    pand %xmm4, %xmm2
1580 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1581 ; SSE2-NEXT:    por %xmm2, %xmm3
1582 ; SSE2-NEXT:    pand %xmm3, %xmm7
1583 ; SSE2-NEXT:    pandn %xmm8, %xmm3
1584 ; SSE2-NEXT:    por %xmm7, %xmm3
1585 ; SSE2-NEXT:    pxor %xmm6, %xmm9
1586 ; SSE2-NEXT:    movdqa %xmm10, %xmm2
1587 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm2
1588 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1589 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm9
1590 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm9[1,1,3,3]
1591 ; SSE2-NEXT:    pand %xmm4, %xmm5
1592 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1593 ; SSE2-NEXT:    por %xmm5, %xmm2
1594 ; SSE2-NEXT:    pand %xmm2, %xmm6
1595 ; SSE2-NEXT:    pandn %xmm8, %xmm2
1596 ; SSE2-NEXT:    por %xmm6, %xmm2
1597 ; SSE2-NEXT:    packuswb %xmm3, %xmm2
1598 ; SSE2-NEXT:    packuswb %xmm2, %xmm1
1599 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
1600 ; SSE2-NEXT:    retq
1602 ; SSSE3-LABEL: trunc_usat_v16i64_v16i8:
1603 ; SSSE3:       # %bb.0:
1604 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
1605 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [9223372039002259456,9223372039002259456]
1606 ; SSSE3-NEXT:    movdqa %xmm1, %xmm11
1607 ; SSSE3-NEXT:    pxor %xmm9, %xmm11
1608 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [9223372039002259711,9223372039002259711]
1609 ; SSSE3-NEXT:    movdqa %xmm10, %xmm12
1610 ; SSSE3-NEXT:    pcmpgtd %xmm11, %xmm12
1611 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
1612 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm11
1613 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]
1614 ; SSSE3-NEXT:    pand %xmm13, %xmm11
1615 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
1616 ; SSSE3-NEXT:    por %xmm11, %xmm12
1617 ; SSSE3-NEXT:    pand %xmm12, %xmm1
1618 ; SSSE3-NEXT:    pandn %xmm8, %xmm12
1619 ; SSSE3-NEXT:    por %xmm1, %xmm12
1620 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
1621 ; SSSE3-NEXT:    pxor %xmm9, %xmm1
1622 ; SSSE3-NEXT:    movdqa %xmm10, %xmm11
1623 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm11
1624 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm11[0,0,2,2]
1625 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm1
1626 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm14 = xmm1[1,1,3,3]
1627 ; SSSE3-NEXT:    pand %xmm13, %xmm14
1628 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3]
1629 ; SSSE3-NEXT:    por %xmm14, %xmm1
1630 ; SSSE3-NEXT:    pand %xmm1, %xmm0
1631 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
1632 ; SSSE3-NEXT:    por %xmm1, %xmm0
1633 ; SSSE3-NEXT:    packuswb %xmm12, %xmm0
1634 ; SSSE3-NEXT:    movdqa %xmm3, %xmm1
1635 ; SSSE3-NEXT:    pxor %xmm9, %xmm1
1636 ; SSSE3-NEXT:    movdqa %xmm10, %xmm11
1637 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm11
1638 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1639 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm1
1640 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm1[1,1,3,3]
1641 ; SSSE3-NEXT:    pand %xmm12, %xmm13
1642 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3]
1643 ; SSSE3-NEXT:    por %xmm13, %xmm1
1644 ; SSSE3-NEXT:    pand %xmm1, %xmm3
1645 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
1646 ; SSSE3-NEXT:    por %xmm3, %xmm1
1647 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
1648 ; SSSE3-NEXT:    pxor %xmm9, %xmm3
1649 ; SSSE3-NEXT:    movdqa %xmm10, %xmm11
1650 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm11
1651 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1652 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm3
1653 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm3[1,1,3,3]
1654 ; SSSE3-NEXT:    pand %xmm12, %xmm13
1655 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm11[1,1,3,3]
1656 ; SSSE3-NEXT:    por %xmm13, %xmm3
1657 ; SSSE3-NEXT:    pand %xmm3, %xmm2
1658 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
1659 ; SSSE3-NEXT:    por %xmm2, %xmm3
1660 ; SSSE3-NEXT:    packuswb %xmm1, %xmm3
1661 ; SSSE3-NEXT:    packuswb %xmm3, %xmm0
1662 ; SSSE3-NEXT:    movdqa %xmm5, %xmm1
1663 ; SSSE3-NEXT:    pxor %xmm9, %xmm1
1664 ; SSSE3-NEXT:    movdqa %xmm10, %xmm2
1665 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
1666 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
1667 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm1
1668 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1669 ; SSSE3-NEXT:    pand %xmm3, %xmm1
1670 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1671 ; SSSE3-NEXT:    por %xmm1, %xmm2
1672 ; SSSE3-NEXT:    pand %xmm2, %xmm5
1673 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
1674 ; SSSE3-NEXT:    por %xmm5, %xmm2
1675 ; SSSE3-NEXT:    movdqa %xmm4, %xmm1
1676 ; SSSE3-NEXT:    pxor %xmm9, %xmm1
1677 ; SSSE3-NEXT:    movdqa %xmm10, %xmm3
1678 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
1679 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm3[0,0,2,2]
1680 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm1
1681 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
1682 ; SSSE3-NEXT:    pand %xmm11, %xmm5
1683 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
1684 ; SSSE3-NEXT:    por %xmm5, %xmm1
1685 ; SSSE3-NEXT:    pand %xmm1, %xmm4
1686 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
1687 ; SSSE3-NEXT:    por %xmm4, %xmm1
1688 ; SSSE3-NEXT:    packuswb %xmm2, %xmm1
1689 ; SSSE3-NEXT:    movdqa %xmm7, %xmm2
1690 ; SSSE3-NEXT:    pxor %xmm9, %xmm2
1691 ; SSSE3-NEXT:    movdqa %xmm10, %xmm3
1692 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
1693 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1694 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm2
1695 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1696 ; SSSE3-NEXT:    pand %xmm4, %xmm2
1697 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1698 ; SSSE3-NEXT:    por %xmm2, %xmm3
1699 ; SSSE3-NEXT:    pand %xmm3, %xmm7
1700 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
1701 ; SSSE3-NEXT:    por %xmm7, %xmm3
1702 ; SSSE3-NEXT:    pxor %xmm6, %xmm9
1703 ; SSSE3-NEXT:    movdqa %xmm10, %xmm2
1704 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm2
1705 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1706 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm9
1707 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm9[1,1,3,3]
1708 ; SSSE3-NEXT:    pand %xmm4, %xmm5
1709 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1710 ; SSSE3-NEXT:    por %xmm5, %xmm2
1711 ; SSSE3-NEXT:    pand %xmm2, %xmm6
1712 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
1713 ; SSSE3-NEXT:    por %xmm6, %xmm2
1714 ; SSSE3-NEXT:    packuswb %xmm3, %xmm2
1715 ; SSSE3-NEXT:    packuswb %xmm2, %xmm1
1716 ; SSSE3-NEXT:    packuswb %xmm1, %xmm0
1717 ; SSSE3-NEXT:    retq
1719 ; SSE41-LABEL: trunc_usat_v16i64_v16i8:
1720 ; SSE41:       # %bb.0:
1721 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
1722 ; SSE41-NEXT:    movapd {{.*#+}} xmm9 = [255,255]
1723 ; SSE41-NEXT:    movdqa {{.*#+}} xmm10 = [9223372039002259456,9223372039002259456]
1724 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1725 ; SSE41-NEXT:    pxor %xmm10, %xmm0
1726 ; SSE41-NEXT:    movdqa {{.*#+}} xmm11 = [9223372039002259711,9223372039002259711]
1727 ; SSE41-NEXT:    movdqa %xmm11, %xmm12
1728 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm12
1729 ; SSE41-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
1730 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
1731 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1732 ; SSE41-NEXT:    pand %xmm13, %xmm0
1733 ; SSE41-NEXT:    por %xmm12, %xmm0
1734 ; SSE41-NEXT:    movapd %xmm9, %xmm12
1735 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm12
1736 ; SSE41-NEXT:    movdqa %xmm8, %xmm0
1737 ; SSE41-NEXT:    pxor %xmm10, %xmm0
1738 ; SSE41-NEXT:    movdqa %xmm11, %xmm1
1739 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
1740 ; SSE41-NEXT:    pshufd {{.*#+}} xmm13 = xmm1[0,0,2,2]
1741 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
1742 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1743 ; SSE41-NEXT:    pand %xmm13, %xmm0
1744 ; SSE41-NEXT:    por %xmm1, %xmm0
1745 ; SSE41-NEXT:    movapd %xmm9, %xmm13
1746 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm13
1747 ; SSE41-NEXT:    packusdw %xmm12, %xmm13
1748 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
1749 ; SSE41-NEXT:    pxor %xmm10, %xmm0
1750 ; SSE41-NEXT:    movdqa %xmm11, %xmm1
1751 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
1752 ; SSE41-NEXT:    pshufd {{.*#+}} xmm8 = xmm1[0,0,2,2]
1753 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
1754 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1755 ; SSE41-NEXT:    pand %xmm8, %xmm0
1756 ; SSE41-NEXT:    por %xmm1, %xmm0
1757 ; SSE41-NEXT:    movapd %xmm9, %xmm1
1758 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
1759 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1760 ; SSE41-NEXT:    pxor %xmm10, %xmm0
1761 ; SSE41-NEXT:    movdqa %xmm11, %xmm3
1762 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
1763 ; SSE41-NEXT:    pshufd {{.*#+}} xmm8 = xmm3[0,0,2,2]
1764 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
1765 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1766 ; SSE41-NEXT:    pand %xmm8, %xmm0
1767 ; SSE41-NEXT:    por %xmm3, %xmm0
1768 ; SSE41-NEXT:    movapd %xmm9, %xmm3
1769 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
1770 ; SSE41-NEXT:    packusdw %xmm1, %xmm3
1771 ; SSE41-NEXT:    packusdw %xmm3, %xmm13
1772 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
1773 ; SSE41-NEXT:    pxor %xmm10, %xmm0
1774 ; SSE41-NEXT:    movdqa %xmm11, %xmm1
1775 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
1776 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
1777 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
1778 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1779 ; SSE41-NEXT:    pand %xmm2, %xmm0
1780 ; SSE41-NEXT:    por %xmm1, %xmm0
1781 ; SSE41-NEXT:    movapd %xmm9, %xmm1
1782 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
1783 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1784 ; SSE41-NEXT:    pxor %xmm10, %xmm0
1785 ; SSE41-NEXT:    movdqa %xmm11, %xmm2
1786 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
1787 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
1788 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
1789 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1790 ; SSE41-NEXT:    pand %xmm3, %xmm0
1791 ; SSE41-NEXT:    por %xmm2, %xmm0
1792 ; SSE41-NEXT:    movapd %xmm9, %xmm2
1793 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
1794 ; SSE41-NEXT:    packusdw %xmm1, %xmm2
1795 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
1796 ; SSE41-NEXT:    pxor %xmm10, %xmm0
1797 ; SSE41-NEXT:    movdqa %xmm11, %xmm1
1798 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
1799 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
1800 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
1801 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1802 ; SSE41-NEXT:    pand %xmm3, %xmm0
1803 ; SSE41-NEXT:    por %xmm1, %xmm0
1804 ; SSE41-NEXT:    movapd %xmm9, %xmm1
1805 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
1806 ; SSE41-NEXT:    pxor %xmm6, %xmm10
1807 ; SSE41-NEXT:    movdqa %xmm11, %xmm3
1808 ; SSE41-NEXT:    pcmpgtd %xmm10, %xmm3
1809 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1810 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm10
1811 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]
1812 ; SSE41-NEXT:    pand %xmm4, %xmm0
1813 ; SSE41-NEXT:    por %xmm3, %xmm0
1814 ; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm9
1815 ; SSE41-NEXT:    packusdw %xmm1, %xmm9
1816 ; SSE41-NEXT:    packusdw %xmm9, %xmm2
1817 ; SSE41-NEXT:    packuswb %xmm2, %xmm13
1818 ; SSE41-NEXT:    movdqa %xmm13, %xmm0
1819 ; SSE41-NEXT:    retq
1821 ; AVX1-LABEL: trunc_usat_v16i64_v16i8:
1822 ; AVX1:       # %bb.0:
1823 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm8 = [255,255,255,255]
1824 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1825 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [9223372036854775808,9223372036854775808]
1826 ; AVX1-NEXT:    vpxor %xmm6, %xmm5, %xmm5
1827 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [9223372036854776063,9223372036854776063]
1828 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm7, %xmm5
1829 ; AVX1-NEXT:    vpxor %xmm6, %xmm0, %xmm4
1830 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm7, %xmm4
1831 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm4, %ymm4
1832 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm0, %ymm8, %ymm0
1833 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
1834 ; AVX1-NEXT:    vpxor %xmm6, %xmm4, %xmm4
1835 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm7, %xmm4
1836 ; AVX1-NEXT:    vpxor %xmm6, %xmm1, %xmm5
1837 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm7, %xmm5
1838 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm5, %ymm4
1839 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm1, %ymm8, %ymm1
1840 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1841 ; AVX1-NEXT:    vpxor %xmm6, %xmm4, %xmm4
1842 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm7, %xmm4
1843 ; AVX1-NEXT:    vpxor %xmm6, %xmm2, %xmm5
1844 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm7, %xmm5
1845 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm5, %ymm4
1846 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm2, %ymm8, %ymm2
1847 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
1848 ; AVX1-NEXT:    vpxor %xmm6, %xmm4, %xmm4
1849 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm7, %xmm4
1850 ; AVX1-NEXT:    vpxor %xmm6, %xmm3, %xmm5
1851 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm7, %xmm5
1852 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm5, %ymm4
1853 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm3, %ymm8, %ymm3
1854 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
1855 ; AVX1-NEXT:    vpackusdw %xmm4, %xmm3, %xmm3
1856 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1857 ; AVX1-NEXT:    vpackusdw %xmm4, %xmm2, %xmm2
1858 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
1859 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1860 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
1861 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1862 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm0, %xmm0
1863 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1864 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1865 ; AVX1-NEXT:    vzeroupper
1866 ; AVX1-NEXT:    retq
1868 ; AVX2-LABEL: trunc_usat_v16i64_v16i8:
1869 ; AVX2:       # %bb.0:
1870 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm4 = [255,255,255,255]
1871 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1872 ; AVX2-NEXT:    vpxor %ymm5, %ymm1, %ymm6
1873 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm7 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
1874 ; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm7, %ymm6
1875 ; AVX2-NEXT:    vblendvpd %ymm6, %ymm1, %ymm4, %ymm1
1876 ; AVX2-NEXT:    vpxor %ymm5, %ymm0, %ymm6
1877 ; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm7, %ymm6
1878 ; AVX2-NEXT:    vblendvpd %ymm6, %ymm0, %ymm4, %ymm0
1879 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
1880 ; AVX2-NEXT:    vpxor %ymm5, %ymm3, %ymm1
1881 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm7, %ymm1
1882 ; AVX2-NEXT:    vblendvpd %ymm1, %ymm3, %ymm4, %ymm1
1883 ; AVX2-NEXT:    vpxor %ymm5, %ymm2, %ymm3
1884 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm7, %ymm3
1885 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm2, %ymm4, %ymm2
1886 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm2, %ymm1
1887 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
1888 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1889 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
1890 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1891 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1892 ; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1893 ; AVX2-NEXT:    vzeroupper
1894 ; AVX2-NEXT:    retq
1896 ; AVX512-LABEL: trunc_usat_v16i64_v16i8:
1897 ; AVX512:       # %bb.0:
1898 ; AVX512-NEXT:    vpbroadcastq {{.*#+}} zmm2 = [255,255,255,255,255,255,255,255]
1899 ; AVX512-NEXT:    vpminuq %zmm2, %zmm1, %zmm1
1900 ; AVX512-NEXT:    vpminuq %zmm2, %zmm0, %zmm0
1901 ; AVX512-NEXT:    vpmovqd %zmm0, %ymm0
1902 ; AVX512-NEXT:    vpmovqd %zmm1, %ymm1
1903 ; AVX512-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
1904 ; AVX512-NEXT:    vpmovdb %zmm0, %xmm0
1905 ; AVX512-NEXT:    vzeroupper
1906 ; AVX512-NEXT:    retq
1907   %1 = icmp ult <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>
1908   %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>
1909   %3 = trunc <16 x i64> %2 to <16 x i8>
1910   ret <16 x i8> %3
1913 define <8 x i8> @trunc_usat_v8i32_v8i8(<8 x i32> %a0) {
1914 ; SSE2-LABEL: trunc_usat_v8i32_v8i8:
1915 ; SSE2:       # %bb.0:
1916 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255]
1917 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
1918 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
1919 ; SSE2-NEXT:    pxor %xmm4, %xmm5
1920 ; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [2147483903,2147483903,2147483903,2147483903]
1921 ; SSE2-NEXT:    movdqa %xmm6, %xmm2
1922 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm2
1923 ; SSE2-NEXT:    pand %xmm2, %xmm0
1924 ; SSE2-NEXT:    pandn %xmm3, %xmm2
1925 ; SSE2-NEXT:    por %xmm0, %xmm2
1926 ; SSE2-NEXT:    pxor %xmm1, %xmm4
1927 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
1928 ; SSE2-NEXT:    pand %xmm6, %xmm1
1929 ; SSE2-NEXT:    pandn %xmm3, %xmm6
1930 ; SSE2-NEXT:    por %xmm1, %xmm6
1931 ; SSE2-NEXT:    pand %xmm3, %xmm6
1932 ; SSE2-NEXT:    pand %xmm3, %xmm2
1933 ; SSE2-NEXT:    packuswb %xmm6, %xmm2
1934 ; SSE2-NEXT:    packuswb %xmm2, %xmm2
1935 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1936 ; SSE2-NEXT:    retq
1938 ; SSSE3-LABEL: trunc_usat_v8i32_v8i8:
1939 ; SSSE3:       # %bb.0:
1940 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
1941 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
1942 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
1943 ; SSSE3-NEXT:    pxor %xmm3, %xmm4
1944 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
1945 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
1946 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
1947 ; SSSE3-NEXT:    pand %xmm6, %xmm0
1948 ; SSSE3-NEXT:    pandn %xmm2, %xmm6
1949 ; SSSE3-NEXT:    por %xmm6, %xmm0
1950 ; SSSE3-NEXT:    pxor %xmm1, %xmm3
1951 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
1952 ; SSSE3-NEXT:    pand %xmm5, %xmm1
1953 ; SSSE3-NEXT:    pandn %xmm2, %xmm5
1954 ; SSSE3-NEXT:    por %xmm1, %xmm5
1955 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
1956 ; SSSE3-NEXT:    pshufb %xmm1, %xmm5
1957 ; SSSE3-NEXT:    pshufb %xmm1, %xmm0
1958 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
1959 ; SSSE3-NEXT:    retq
1961 ; SSE41-LABEL: trunc_usat_v8i32_v8i8:
1962 ; SSE41:       # %bb.0:
1963 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
1964 ; SSE41-NEXT:    pminud %xmm2, %xmm0
1965 ; SSE41-NEXT:    pminud %xmm2, %xmm1
1966 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
1967 ; SSE41-NEXT:    pshufb %xmm2, %xmm1
1968 ; SSE41-NEXT:    pshufb %xmm2, %xmm0
1969 ; SSE41-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1970 ; SSE41-NEXT:    retq
1972 ; AVX1-LABEL: trunc_usat_v8i32_v8i8:
1973 ; AVX1:       # %bb.0:
1974 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [255,255,255,255]
1975 ; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm2
1976 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1977 ; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1978 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
1979 ; AVX1-NEXT:    vpshufb %xmm1, %xmm0, %xmm0
1980 ; AVX1-NEXT:    vpshufb %xmm1, %xmm2, %xmm1
1981 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1982 ; AVX1-NEXT:    vzeroupper
1983 ; AVX1-NEXT:    retq
1985 ; AVX2-LABEL: trunc_usat_v8i32_v8i8:
1986 ; AVX2:       # %bb.0:
1987 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
1988 ; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1989 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1990 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
1991 ; AVX2-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1992 ; AVX2-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1993 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1994 ; AVX2-NEXT:    vzeroupper
1995 ; AVX2-NEXT:    retq
1997 ; AVX512F-LABEL: trunc_usat_v8i32_v8i8:
1998 ; AVX512F:       # %bb.0:
1999 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
2000 ; AVX512F-NEXT:    vpminud %ymm1, %ymm0, %ymm0
2001 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
2002 ; AVX512F-NEXT:    vzeroupper
2003 ; AVX512F-NEXT:    retq
2005 ; AVX512VL-LABEL: trunc_usat_v8i32_v8i8:
2006 ; AVX512VL:       # %bb.0:
2007 ; AVX512VL-NEXT:    vpminud {{.*}}(%rip){1to8}, %ymm0, %ymm0
2008 ; AVX512VL-NEXT:    vpmovdb %ymm0, %xmm0
2009 ; AVX512VL-NEXT:    vzeroupper
2010 ; AVX512VL-NEXT:    retq
2012 ; AVX512BW-LABEL: trunc_usat_v8i32_v8i8:
2013 ; AVX512BW:       # %bb.0:
2014 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
2015 ; AVX512BW-NEXT:    vpminud %ymm1, %ymm0, %ymm0
2016 ; AVX512BW-NEXT:    vpmovdb %zmm0, %xmm0
2017 ; AVX512BW-NEXT:    vzeroupper
2018 ; AVX512BW-NEXT:    retq
2020 ; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i8:
2021 ; AVX512BWVL:       # %bb.0:
2022 ; AVX512BWVL-NEXT:    vpminud {{.*}}(%rip){1to8}, %ymm0, %ymm0
2023 ; AVX512BWVL-NEXT:    vpmovdb %ymm0, %xmm0
2024 ; AVX512BWVL-NEXT:    vzeroupper
2025 ; AVX512BWVL-NEXT:    retq
2026   %1 = icmp ult <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
2027   %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>
2028   %3 = trunc <8 x i32> %2 to <8 x i8>
2029   ret <8 x i8> %3
2032 define void @trunc_usat_v8i32_v8i8_store(<8 x i32> %a0, <8 x i8> *%p1) {
2033 ; SSE2-LABEL: trunc_usat_v8i32_v8i8_store:
2034 ; SSE2:       # %bb.0:
2035 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
2036 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
2037 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
2038 ; SSE2-NEXT:    pxor %xmm3, %xmm4
2039 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
2040 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
2041 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
2042 ; SSE2-NEXT:    pand %xmm6, %xmm0
2043 ; SSE2-NEXT:    pandn %xmm2, %xmm6
2044 ; SSE2-NEXT:    por %xmm0, %xmm6
2045 ; SSE2-NEXT:    pxor %xmm1, %xmm3
2046 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
2047 ; SSE2-NEXT:    pand %xmm5, %xmm1
2048 ; SSE2-NEXT:    pandn %xmm2, %xmm5
2049 ; SSE2-NEXT:    por %xmm1, %xmm5
2050 ; SSE2-NEXT:    pand %xmm2, %xmm5
2051 ; SSE2-NEXT:    pand %xmm2, %xmm6
2052 ; SSE2-NEXT:    packuswb %xmm5, %xmm6
2053 ; SSE2-NEXT:    packuswb %xmm6, %xmm6
2054 ; SSE2-NEXT:    movq %xmm6, (%rdi)
2055 ; SSE2-NEXT:    retq
2057 ; SSSE3-LABEL: trunc_usat_v8i32_v8i8_store:
2058 ; SSSE3:       # %bb.0:
2059 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
2060 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
2061 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
2062 ; SSSE3-NEXT:    pxor %xmm3, %xmm4
2063 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
2064 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
2065 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
2066 ; SSSE3-NEXT:    pand %xmm6, %xmm0
2067 ; SSSE3-NEXT:    pandn %xmm2, %xmm6
2068 ; SSSE3-NEXT:    por %xmm0, %xmm6
2069 ; SSSE3-NEXT:    pxor %xmm1, %xmm3
2070 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
2071 ; SSSE3-NEXT:    pand %xmm5, %xmm1
2072 ; SSSE3-NEXT:    pandn %xmm2, %xmm5
2073 ; SSSE3-NEXT:    por %xmm1, %xmm5
2074 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
2075 ; SSSE3-NEXT:    pshufb %xmm0, %xmm5
2076 ; SSSE3-NEXT:    pshufb %xmm0, %xmm6
2077 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1]
2078 ; SSSE3-NEXT:    movq %xmm6, (%rdi)
2079 ; SSSE3-NEXT:    retq
2081 ; SSE41-LABEL: trunc_usat_v8i32_v8i8_store:
2082 ; SSE41:       # %bb.0:
2083 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
2084 ; SSE41-NEXT:    pminud %xmm2, %xmm0
2085 ; SSE41-NEXT:    pminud %xmm2, %xmm1
2086 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
2087 ; SSE41-NEXT:    pshufb %xmm2, %xmm1
2088 ; SSE41-NEXT:    pshufb %xmm2, %xmm0
2089 ; SSE41-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2090 ; SSE41-NEXT:    movq %xmm0, (%rdi)
2091 ; SSE41-NEXT:    retq
2093 ; AVX1-LABEL: trunc_usat_v8i32_v8i8_store:
2094 ; AVX1:       # %bb.0:
2095 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [255,255,255,255]
2096 ; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm2
2097 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2098 ; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
2099 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
2100 ; AVX1-NEXT:    vpshufb %xmm1, %xmm0, %xmm0
2101 ; AVX1-NEXT:    vpshufb %xmm1, %xmm2, %xmm1
2102 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
2103 ; AVX1-NEXT:    vmovq %xmm0, (%rdi)
2104 ; AVX1-NEXT:    vzeroupper
2105 ; AVX1-NEXT:    retq
2107 ; AVX2-LABEL: trunc_usat_v8i32_v8i8_store:
2108 ; AVX2:       # %bb.0:
2109 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
2110 ; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
2111 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2112 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
2113 ; AVX2-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
2114 ; AVX2-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
2115 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2116 ; AVX2-NEXT:    vmovq %xmm0, (%rdi)
2117 ; AVX2-NEXT:    vzeroupper
2118 ; AVX2-NEXT:    retq
2120 ; AVX512F-LABEL: trunc_usat_v8i32_v8i8_store:
2121 ; AVX512F:       # %bb.0:
2122 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
2123 ; AVX512F-NEXT:    vpminud %ymm1, %ymm0, %ymm0
2124 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
2125 ; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
2126 ; AVX512F-NEXT:    vzeroupper
2127 ; AVX512F-NEXT:    retq
2129 ; AVX512VL-LABEL: trunc_usat_v8i32_v8i8_store:
2130 ; AVX512VL:       # %bb.0:
2131 ; AVX512VL-NEXT:    vpmovusdb %ymm0, (%rdi)
2132 ; AVX512VL-NEXT:    vzeroupper
2133 ; AVX512VL-NEXT:    retq
2135 ; AVX512BW-LABEL: trunc_usat_v8i32_v8i8_store:
2136 ; AVX512BW:       # %bb.0:
2137 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
2138 ; AVX512BW-NEXT:    vpminud %ymm1, %ymm0, %ymm0
2139 ; AVX512BW-NEXT:    vpmovdb %zmm0, %xmm0
2140 ; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
2141 ; AVX512BW-NEXT:    vzeroupper
2142 ; AVX512BW-NEXT:    retq
2144 ; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i8_store:
2145 ; AVX512BWVL:       # %bb.0:
2146 ; AVX512BWVL-NEXT:    vpmovusdb %ymm0, (%rdi)
2147 ; AVX512BWVL-NEXT:    vzeroupper
2148 ; AVX512BWVL-NEXT:    retq
2149   %1 = icmp ult <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
2150   %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>
2151   %3 = trunc <8 x i32> %2 to <8 x i8>
2152   store <8 x i8> %3, <8 x i8> *%p1
2153   ret void
2156 define <16 x i8> @trunc_usat_v16i32_v16i8(<16 x i32> %a0) {
2157 ; SSE2-LABEL: trunc_usat_v16i32_v16i8:
2158 ; SSE2:       # %bb.0:
2159 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255,255,255]
2160 ; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
2161 ; SSE2-NEXT:    movdqa %xmm1, %xmm7
2162 ; SSE2-NEXT:    pxor %xmm6, %xmm7
2163 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
2164 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
2165 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
2166 ; SSE2-NEXT:    pand %xmm4, %xmm1
2167 ; SSE2-NEXT:    pandn %xmm8, %xmm4
2168 ; SSE2-NEXT:    por %xmm1, %xmm4
2169 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
2170 ; SSE2-NEXT:    pxor %xmm6, %xmm1
2171 ; SSE2-NEXT:    movdqa %xmm5, %xmm7
2172 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm7
2173 ; SSE2-NEXT:    pand %xmm7, %xmm0
2174 ; SSE2-NEXT:    pandn %xmm8, %xmm7
2175 ; SSE2-NEXT:    por %xmm7, %xmm0
2176 ; SSE2-NEXT:    packuswb %xmm4, %xmm0
2177 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
2178 ; SSE2-NEXT:    pxor %xmm6, %xmm1
2179 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
2180 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
2181 ; SSE2-NEXT:    pand %xmm4, %xmm3
2182 ; SSE2-NEXT:    pandn %xmm8, %xmm4
2183 ; SSE2-NEXT:    por %xmm3, %xmm4
2184 ; SSE2-NEXT:    pxor %xmm2, %xmm6
2185 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
2186 ; SSE2-NEXT:    pand %xmm5, %xmm2
2187 ; SSE2-NEXT:    pandn %xmm8, %xmm5
2188 ; SSE2-NEXT:    por %xmm2, %xmm5
2189 ; SSE2-NEXT:    packuswb %xmm4, %xmm5
2190 ; SSE2-NEXT:    packuswb %xmm5, %xmm0
2191 ; SSE2-NEXT:    retq
2193 ; SSSE3-LABEL: trunc_usat_v16i32_v16i8:
2194 ; SSSE3:       # %bb.0:
2195 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255,255,255]
2196 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
2197 ; SSSE3-NEXT:    movdqa %xmm1, %xmm7
2198 ; SSSE3-NEXT:    pxor %xmm6, %xmm7
2199 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
2200 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
2201 ; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm4
2202 ; SSSE3-NEXT:    pand %xmm4, %xmm1
2203 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
2204 ; SSSE3-NEXT:    por %xmm1, %xmm4
2205 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
2206 ; SSSE3-NEXT:    pxor %xmm6, %xmm1
2207 ; SSSE3-NEXT:    movdqa %xmm5, %xmm7
2208 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm7
2209 ; SSSE3-NEXT:    pand %xmm7, %xmm0
2210 ; SSSE3-NEXT:    pandn %xmm8, %xmm7
2211 ; SSSE3-NEXT:    por %xmm7, %xmm0
2212 ; SSSE3-NEXT:    packuswb %xmm4, %xmm0
2213 ; SSSE3-NEXT:    movdqa %xmm3, %xmm1
2214 ; SSSE3-NEXT:    pxor %xmm6, %xmm1
2215 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
2216 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
2217 ; SSSE3-NEXT:    pand %xmm4, %xmm3
2218 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
2219 ; SSSE3-NEXT:    por %xmm3, %xmm4
2220 ; SSSE3-NEXT:    pxor %xmm2, %xmm6
2221 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm5
2222 ; SSSE3-NEXT:    pand %xmm5, %xmm2
2223 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
2224 ; SSSE3-NEXT:    por %xmm2, %xmm5
2225 ; SSSE3-NEXT:    packuswb %xmm4, %xmm5
2226 ; SSSE3-NEXT:    packuswb %xmm5, %xmm0
2227 ; SSSE3-NEXT:    retq
2229 ; SSE41-LABEL: trunc_usat_v16i32_v16i8:
2230 ; SSE41:       # %bb.0:
2231 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [255,255,255,255]
2232 ; SSE41-NEXT:    pminud %xmm4, %xmm1
2233 ; SSE41-NEXT:    pminud %xmm4, %xmm0
2234 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
2235 ; SSE41-NEXT:    pminud %xmm4, %xmm3
2236 ; SSE41-NEXT:    pminud %xmm4, %xmm2
2237 ; SSE41-NEXT:    packusdw %xmm3, %xmm2
2238 ; SSE41-NEXT:    packuswb %xmm2, %xmm0
2239 ; SSE41-NEXT:    retq
2241 ; AVX1-LABEL: trunc_usat_v16i32_v16i8:
2242 ; AVX1:       # %bb.0:
2243 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2244 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255]
2245 ; AVX1-NEXT:    vpminud %xmm3, %xmm2, %xmm2
2246 ; AVX1-NEXT:    vpminud %xmm3, %xmm0, %xmm0
2247 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
2248 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2249 ; AVX1-NEXT:    vpminud %xmm3, %xmm2, %xmm2
2250 ; AVX1-NEXT:    vpminud %xmm3, %xmm1, %xmm1
2251 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
2252 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2253 ; AVX1-NEXT:    vzeroupper
2254 ; AVX1-NEXT:    retq
2256 ; AVX2-LABEL: trunc_usat_v16i32_v16i8:
2257 ; AVX2:       # %bb.0:
2258 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]
2259 ; AVX2-NEXT:    vpminud %ymm2, %ymm1, %ymm1
2260 ; AVX2-NEXT:    vpminud %ymm2, %ymm0, %ymm0
2261 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
2262 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2263 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2264 ; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2265 ; AVX2-NEXT:    vzeroupper
2266 ; AVX2-NEXT:    retq
2268 ; AVX512-LABEL: trunc_usat_v16i32_v16i8:
2269 ; AVX512:       # %bb.0:
2270 ; AVX512-NEXT:    vpmovusdb %zmm0, %xmm0
2271 ; AVX512-NEXT:    vzeroupper
2272 ; AVX512-NEXT:    retq
2273   %1 = icmp ult <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>
2274   %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>
2275   %3 = trunc <16 x i32> %2 to <16 x i8>
2276   ret <16 x i8> %3
2279 define <16 x i8> @trunc_usat_v16i16_v16i8(<16 x i16> %a0) {
2280 ; SSE2-LABEL: trunc_usat_v16i16_v16i8:
2281 ; SSE2:       # %bb.0:
2282 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
2283 ; SSE2-NEXT:    pxor %xmm2, %xmm1
2284 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [33023,33023,33023,33023,33023,33023,33023,33023]
2285 ; SSE2-NEXT:    pminsw %xmm3, %xmm1
2286 ; SSE2-NEXT:    pxor %xmm2, %xmm1
2287 ; SSE2-NEXT:    pxor %xmm2, %xmm0
2288 ; SSE2-NEXT:    pminsw %xmm3, %xmm0
2289 ; SSE2-NEXT:    pxor %xmm2, %xmm0
2290 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
2291 ; SSE2-NEXT:    retq
2293 ; SSSE3-LABEL: trunc_usat_v16i16_v16i8:
2294 ; SSSE3:       # %bb.0:
2295 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
2296 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
2297 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [33023,33023,33023,33023,33023,33023,33023,33023]
2298 ; SSSE3-NEXT:    pminsw %xmm3, %xmm1
2299 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
2300 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
2301 ; SSSE3-NEXT:    pminsw %xmm3, %xmm0
2302 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
2303 ; SSSE3-NEXT:    packuswb %xmm1, %xmm0
2304 ; SSSE3-NEXT:    retq
2306 ; SSE41-LABEL: trunc_usat_v16i16_v16i8:
2307 ; SSE41:       # %bb.0:
2308 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
2309 ; SSE41-NEXT:    pminuw %xmm2, %xmm1
2310 ; SSE41-NEXT:    pminuw %xmm2, %xmm0
2311 ; SSE41-NEXT:    packuswb %xmm1, %xmm0
2312 ; SSE41-NEXT:    retq
2314 ; AVX1-LABEL: trunc_usat_v16i16_v16i8:
2315 ; AVX1:       # %bb.0:
2316 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2317 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
2318 ; AVX1-NEXT:    vpminuw %xmm2, %xmm1, %xmm1
2319 ; AVX1-NEXT:    vpminuw %xmm2, %xmm0, %xmm0
2320 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2321 ; AVX1-NEXT:    vzeroupper
2322 ; AVX1-NEXT:    retq
2324 ; AVX2-LABEL: trunc_usat_v16i16_v16i8:
2325 ; AVX2:       # %bb.0:
2326 ; AVX2-NEXT:    vpminuw {{.*}}(%rip), %ymm0, %ymm0
2327 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2328 ; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2329 ; AVX2-NEXT:    vzeroupper
2330 ; AVX2-NEXT:    retq
2332 ; AVX512F-LABEL: trunc_usat_v16i16_v16i8:
2333 ; AVX512F:       # %bb.0:
2334 ; AVX512F-NEXT:    vpminuw {{.*}}(%rip), %ymm0, %ymm0
2335 ; 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
2336 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
2337 ; AVX512F-NEXT:    vzeroupper
2338 ; AVX512F-NEXT:    retq
2340 ; AVX512VL-LABEL: trunc_usat_v16i16_v16i8:
2341 ; AVX512VL:       # %bb.0:
2342 ; AVX512VL-NEXT:    vpminuw {{.*}}(%rip), %ymm0, %ymm0
2343 ; 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
2344 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
2345 ; AVX512VL-NEXT:    vzeroupper
2346 ; AVX512VL-NEXT:    retq
2348 ; AVX512BW-LABEL: trunc_usat_v16i16_v16i8:
2349 ; AVX512BW:       # %bb.0:
2350 ; AVX512BW-NEXT:    vpminuw {{.*}}(%rip), %ymm0, %ymm0
2351 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
2352 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2353 ; AVX512BW-NEXT:    vzeroupper
2354 ; AVX512BW-NEXT:    retq
2356 ; AVX512BWVL-LABEL: trunc_usat_v16i16_v16i8:
2357 ; AVX512BWVL:       # %bb.0:
2358 ; AVX512BWVL-NEXT:    vpmovuswb %ymm0, %xmm0
2359 ; AVX512BWVL-NEXT:    vzeroupper
2360 ; AVX512BWVL-NEXT:    retq
2361   %1 = icmp ult <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>
2362   %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>
2363   %3 = trunc <16 x i16> %2 to <16 x i8>
2364   ret <16 x i8> %3
2367 define <32 x i8> @trunc_usat_v32i16_v32i8(<32 x i16> %a0) {
2368 ; SSE2-LABEL: trunc_usat_v32i16_v32i8:
2369 ; SSE2:       # %bb.0:
2370 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
2371 ; SSE2-NEXT:    pxor %xmm4, %xmm3
2372 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [33023,33023,33023,33023,33023,33023,33023,33023]
2373 ; SSE2-NEXT:    pminsw %xmm5, %xmm3
2374 ; SSE2-NEXT:    pxor %xmm4, %xmm3
2375 ; SSE2-NEXT:    pxor %xmm4, %xmm2
2376 ; SSE2-NEXT:    pminsw %xmm5, %xmm2
2377 ; SSE2-NEXT:    pxor %xmm4, %xmm2
2378 ; SSE2-NEXT:    packuswb %xmm3, %xmm2
2379 ; SSE2-NEXT:    pxor %xmm4, %xmm1
2380 ; SSE2-NEXT:    pminsw %xmm5, %xmm1
2381 ; SSE2-NEXT:    pxor %xmm4, %xmm1
2382 ; SSE2-NEXT:    pxor %xmm4, %xmm0
2383 ; SSE2-NEXT:    pminsw %xmm5, %xmm0
2384 ; SSE2-NEXT:    pxor %xmm4, %xmm0
2385 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
2386 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
2387 ; SSE2-NEXT:    retq
2389 ; SSSE3-LABEL: trunc_usat_v32i16_v32i8:
2390 ; SSSE3:       # %bb.0:
2391 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
2392 ; SSSE3-NEXT:    pxor %xmm4, %xmm3
2393 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [33023,33023,33023,33023,33023,33023,33023,33023]
2394 ; SSSE3-NEXT:    pminsw %xmm5, %xmm3
2395 ; SSSE3-NEXT:    pxor %xmm4, %xmm3
2396 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
2397 ; SSSE3-NEXT:    pminsw %xmm5, %xmm2
2398 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
2399 ; SSSE3-NEXT:    packuswb %xmm3, %xmm2
2400 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
2401 ; SSSE3-NEXT:    pminsw %xmm5, %xmm1
2402 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
2403 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
2404 ; SSSE3-NEXT:    pminsw %xmm5, %xmm0
2405 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
2406 ; SSSE3-NEXT:    packuswb %xmm1, %xmm0
2407 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
2408 ; SSSE3-NEXT:    retq
2410 ; SSE41-LABEL: trunc_usat_v32i16_v32i8:
2411 ; SSE41:       # %bb.0:
2412 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
2413 ; SSE41-NEXT:    pminuw %xmm4, %xmm3
2414 ; SSE41-NEXT:    pminuw %xmm4, %xmm2
2415 ; SSE41-NEXT:    packuswb %xmm3, %xmm2
2416 ; SSE41-NEXT:    pminuw %xmm4, %xmm1
2417 ; SSE41-NEXT:    pminuw %xmm4, %xmm0
2418 ; SSE41-NEXT:    packuswb %xmm1, %xmm0
2419 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
2420 ; SSE41-NEXT:    retq
2422 ; AVX1-LABEL: trunc_usat_v32i16_v32i8:
2423 ; AVX1:       # %bb.0:
2424 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2425 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
2426 ; AVX1-NEXT:    vpminuw %xmm3, %xmm2, %xmm2
2427 ; AVX1-NEXT:    vpminuw %xmm3, %xmm0, %xmm0
2428 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
2429 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2430 ; AVX1-NEXT:    vpminuw %xmm3, %xmm2, %xmm2
2431 ; AVX1-NEXT:    vpminuw %xmm3, %xmm1, %xmm1
2432 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
2433 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2434 ; AVX1-NEXT:    retq
2436 ; AVX2-LABEL: trunc_usat_v32i16_v32i8:
2437 ; AVX2:       # %bb.0:
2438 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2439 ; AVX2-NEXT:    vpminuw %ymm2, %ymm1, %ymm1
2440 ; AVX2-NEXT:    vpminuw %ymm2, %ymm0, %ymm0
2441 ; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
2442 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2443 ; AVX2-NEXT:    retq
2445 ; AVX512F-LABEL: trunc_usat_v32i16_v32i8:
2446 ; AVX512F:       # %bb.0:
2447 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2448 ; AVX512F-NEXT:    vpminuw %ymm2, %ymm1, %ymm1
2449 ; AVX512F-NEXT:    vpminuw %ymm2, %ymm0, %ymm0
2450 ; 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
2451 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
2452 ; 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
2453 ; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
2454 ; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
2455 ; AVX512F-NEXT:    retq
2457 ; AVX512VL-LABEL: trunc_usat_v32i16_v32i8:
2458 ; AVX512VL:       # %bb.0:
2459 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2460 ; AVX512VL-NEXT:    vpminuw %ymm2, %ymm1, %ymm1
2461 ; AVX512VL-NEXT:    vpminuw %ymm2, %ymm0, %ymm0
2462 ; 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
2463 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
2464 ; 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
2465 ; AVX512VL-NEXT:    vpmovdb %zmm1, %xmm1
2466 ; AVX512VL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
2467 ; AVX512VL-NEXT:    retq
2469 ; AVX512BW-LABEL: trunc_usat_v32i16_v32i8:
2470 ; AVX512BW:       # %bb.0:
2471 ; AVX512BW-NEXT:    vpmovuswb %zmm0, %ymm0
2472 ; AVX512BW-NEXT:    retq
2474 ; AVX512BWVL-LABEL: trunc_usat_v32i16_v32i8:
2475 ; AVX512BWVL:       # %bb.0:
2476 ; AVX512BWVL-NEXT:    vpmovuswb %zmm0, %ymm0
2477 ; AVX512BWVL-NEXT:    retq
2478   %1 = icmp ult <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>
2479   %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>
2480   %3 = trunc <32 x i16> %2 to <32 x i8>
2481   ret <32 x i8> %3