[Demangle] Add a few more options to the microsoft demangler
[llvm-complete.git] / test / CodeGen / X86 / vector-trunc-usat.ll
blob7afdb04f6b8fe6ed55e0cf34037e69b4e81a4c3c
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-SLOW
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BW
11 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL
12 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=skx | FileCheck %s --check-prefixes=SKX
15 ; Unsigned saturation truncation to vXi32
18 define <2 x i32> @trunc_usat_v2i64_v2i32(<2 x i64> %a0) {
19 ; SSE2-LABEL: trunc_usat_v2i64_v2i32:
20 ; SSE2:       # %bb.0:
21 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
22 ; SSE2-NEXT:    pxor %xmm0, %xmm1
23 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259455,9223372039002259455]
24 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
25 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
26 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
27 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
28 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
29 ; SSE2-NEXT:    pand %xmm4, %xmm1
30 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
31 ; SSE2-NEXT:    por %xmm1, %xmm2
32 ; SSE2-NEXT:    pand %xmm2, %xmm0
33 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
34 ; SSE2-NEXT:    por %xmm0, %xmm2
35 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
36 ; SSE2-NEXT:    retq
38 ; SSSE3-LABEL: trunc_usat_v2i64_v2i32:
39 ; SSSE3:       # %bb.0:
40 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
41 ; SSSE3-NEXT:    pxor %xmm0, %xmm1
42 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259455,9223372039002259455]
43 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
44 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
45 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
46 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm1
47 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
48 ; SSSE3-NEXT:    pand %xmm4, %xmm1
49 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
50 ; SSSE3-NEXT:    por %xmm1, %xmm2
51 ; SSSE3-NEXT:    pand %xmm2, %xmm0
52 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
53 ; SSSE3-NEXT:    por %xmm0, %xmm2
54 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
55 ; SSSE3-NEXT:    retq
57 ; SSE41-LABEL: trunc_usat_v2i64_v2i32:
58 ; SSE41:       # %bb.0:
59 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
60 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [4294967295,4294967295]
61 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
62 ; SSE41-NEXT:    pxor %xmm1, %xmm0
63 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259455,9223372039002259455]
64 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
65 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
66 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
67 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
68 ; SSE41-NEXT:    pand %xmm4, %xmm0
69 ; SSE41-NEXT:    por %xmm3, %xmm0
70 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
71 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
72 ; SSE41-NEXT:    retq
74 ; AVX-LABEL: trunc_usat_v2i64_v2i32:
75 ; AVX:       # %bb.0:
76 ; AVX-NEXT:    vmovapd {{.*#+}} xmm1 = [4294967295,4294967295]
77 ; AVX-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm2
78 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372041149743103,9223372041149743103]
79 ; AVX-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
80 ; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
81 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
82 ; AVX-NEXT:    retq
84 ; AVX512F-LABEL: trunc_usat_v2i64_v2i32:
85 ; AVX512F:       # %bb.0:
86 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
87 ; AVX512F-NEXT:    vpmovusqd %zmm0, %ymm0
88 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
89 ; AVX512F-NEXT:    vzeroupper
90 ; AVX512F-NEXT:    retq
92 ; AVX512VL-LABEL: trunc_usat_v2i64_v2i32:
93 ; AVX512VL:       # %bb.0:
94 ; AVX512VL-NEXT:    vpmovusqd %xmm0, %xmm0
95 ; AVX512VL-NEXT:    retq
97 ; AVX512BW-LABEL: trunc_usat_v2i64_v2i32:
98 ; AVX512BW:       # %bb.0:
99 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
100 ; AVX512BW-NEXT:    vpmovusqd %zmm0, %ymm0
101 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
102 ; AVX512BW-NEXT:    vzeroupper
103 ; AVX512BW-NEXT:    retq
105 ; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i32:
106 ; AVX512BWVL:       # %bb.0:
107 ; AVX512BWVL-NEXT:    vpmovusqd %xmm0, %xmm0
108 ; AVX512BWVL-NEXT:    retq
110 ; SKX-LABEL: trunc_usat_v2i64_v2i32:
111 ; SKX:       # %bb.0:
112 ; SKX-NEXT:    vpmovusqd %xmm0, %xmm0
113 ; SKX-NEXT:    retq
114   %1 = icmp ult <2 x i64> %a0, <i64 4294967295, i64 4294967295>
115   %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 4294967295, i64 4294967295>
116   %3 = trunc <2 x i64> %2 to <2 x i32>
117   ret <2 x i32> %3
120 define void @trunc_usat_v2i64_v2i32_store(<2 x i64> %a0, <2 x i32>* %p1) {
121 ; SSE2-LABEL: trunc_usat_v2i64_v2i32_store:
122 ; SSE2:       # %bb.0:
123 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
124 ; SSE2-NEXT:    pxor %xmm0, %xmm1
125 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259455,9223372039002259455]
126 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
127 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
128 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
129 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
130 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
131 ; SSE2-NEXT:    pand %xmm4, %xmm1
132 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
133 ; SSE2-NEXT:    por %xmm1, %xmm2
134 ; SSE2-NEXT:    pand %xmm2, %xmm0
135 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
136 ; SSE2-NEXT:    por %xmm0, %xmm2
137 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
138 ; SSE2-NEXT:    movq %xmm0, (%rdi)
139 ; SSE2-NEXT:    retq
141 ; SSSE3-LABEL: trunc_usat_v2i64_v2i32_store:
142 ; SSSE3:       # %bb.0:
143 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
144 ; SSSE3-NEXT:    pxor %xmm0, %xmm1
145 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259455,9223372039002259455]
146 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
147 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
148 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
149 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm1
150 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
151 ; SSSE3-NEXT:    pand %xmm4, %xmm1
152 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
153 ; SSSE3-NEXT:    por %xmm1, %xmm2
154 ; SSSE3-NEXT:    pand %xmm2, %xmm0
155 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
156 ; SSSE3-NEXT:    por %xmm0, %xmm2
157 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
158 ; SSSE3-NEXT:    movq %xmm0, (%rdi)
159 ; SSSE3-NEXT:    retq
161 ; SSE41-LABEL: trunc_usat_v2i64_v2i32_store:
162 ; SSE41:       # %bb.0:
163 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
164 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [4294967295,4294967295]
165 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
166 ; SSE41-NEXT:    pxor %xmm1, %xmm0
167 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259455,9223372039002259455]
168 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
169 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
170 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
171 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
172 ; SSE41-NEXT:    pand %xmm4, %xmm0
173 ; SSE41-NEXT:    por %xmm3, %xmm0
174 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
175 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
176 ; SSE41-NEXT:    movq %xmm0, (%rdi)
177 ; SSE41-NEXT:    retq
179 ; AVX-LABEL: trunc_usat_v2i64_v2i32_store:
180 ; AVX:       # %bb.0:
181 ; AVX-NEXT:    vmovapd {{.*#+}} xmm1 = [4294967295,4294967295]
182 ; AVX-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm2
183 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372041149743103,9223372041149743103]
184 ; AVX-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
185 ; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
186 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
187 ; AVX-NEXT:    vmovlpd %xmm0, (%rdi)
188 ; AVX-NEXT:    retq
190 ; AVX512F-LABEL: trunc_usat_v2i64_v2i32_store:
191 ; AVX512F:       # %bb.0:
192 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
193 ; AVX512F-NEXT:    vpmovusqd %zmm0, %ymm0
194 ; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
195 ; AVX512F-NEXT:    vzeroupper
196 ; AVX512F-NEXT:    retq
198 ; AVX512VL-LABEL: trunc_usat_v2i64_v2i32_store:
199 ; AVX512VL:       # %bb.0:
200 ; AVX512VL-NEXT:    vpmovusqd %xmm0, (%rdi)
201 ; AVX512VL-NEXT:    retq
203 ; AVX512BW-LABEL: trunc_usat_v2i64_v2i32_store:
204 ; AVX512BW:       # %bb.0:
205 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
206 ; AVX512BW-NEXT:    vpmovusqd %zmm0, %ymm0
207 ; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
208 ; AVX512BW-NEXT:    vzeroupper
209 ; AVX512BW-NEXT:    retq
211 ; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i32_store:
212 ; AVX512BWVL:       # %bb.0:
213 ; AVX512BWVL-NEXT:    vpmovusqd %xmm0, (%rdi)
214 ; AVX512BWVL-NEXT:    retq
216 ; SKX-LABEL: trunc_usat_v2i64_v2i32_store:
217 ; SKX:       # %bb.0:
218 ; SKX-NEXT:    vpmovusqd %xmm0, (%rdi)
219 ; SKX-NEXT:    retq
220   %1 = icmp ult <2 x i64> %a0, <i64 4294967295, i64 4294967295>
221   %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 4294967295, i64 4294967295>
222   %3 = trunc <2 x i64> %2 to <2 x i32>
223   store <2 x i32> %3, <2 x i32>* %p1
224   ret void
227 define <4 x i32> @trunc_usat_v4i64_v4i32(<4 x i64> %a0) {
228 ; SSE2-LABEL: trunc_usat_v4i64_v4i32:
229 ; SSE2:       # %bb.0:
230 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
231 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
232 ; SSE2-NEXT:    pxor %xmm2, %xmm3
233 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259455,9223372039002259455]
234 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
235 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
236 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
237 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm3
238 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
239 ; SSE2-NEXT:    pand %xmm6, %xmm3
240 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
241 ; SSE2-NEXT:    por %xmm3, %xmm5
242 ; SSE2-NEXT:    pxor %xmm1, %xmm2
243 ; SSE2-NEXT:    movdqa %xmm4, %xmm3
244 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
245 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
246 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm2
247 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
248 ; SSE2-NEXT:    pand %xmm6, %xmm2
249 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
250 ; SSE2-NEXT:    por %xmm2, %xmm3
251 ; SSE2-NEXT:    pand %xmm3, %xmm1
252 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm3
253 ; SSE2-NEXT:    por %xmm1, %xmm3
254 ; SSE2-NEXT:    pand %xmm5, %xmm0
255 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm5
256 ; SSE2-NEXT:    por %xmm5, %xmm0
257 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
258 ; SSE2-NEXT:    retq
260 ; SSSE3-LABEL: trunc_usat_v4i64_v4i32:
261 ; SSSE3:       # %bb.0:
262 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
263 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
264 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
265 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259455,9223372039002259455]
266 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
267 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
268 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
269 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm3
270 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
271 ; SSSE3-NEXT:    pand %xmm6, %xmm3
272 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
273 ; SSSE3-NEXT:    por %xmm3, %xmm5
274 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
275 ; SSSE3-NEXT:    movdqa %xmm4, %xmm3
276 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
277 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
278 ; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm2
279 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
280 ; SSSE3-NEXT:    pand %xmm6, %xmm2
281 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
282 ; SSSE3-NEXT:    por %xmm2, %xmm3
283 ; SSSE3-NEXT:    pand %xmm3, %xmm1
284 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm3
285 ; SSSE3-NEXT:    por %xmm1, %xmm3
286 ; SSSE3-NEXT:    pand %xmm5, %xmm0
287 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm5
288 ; SSSE3-NEXT:    por %xmm5, %xmm0
289 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
290 ; SSSE3-NEXT:    retq
292 ; SSE41-LABEL: trunc_usat_v4i64_v4i32:
293 ; SSE41:       # %bb.0:
294 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
295 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
296 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
297 ; SSE41-NEXT:    pxor %xmm0, %xmm3
298 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259455,9223372039002259455]
299 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
300 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm5
301 ; SSE41-NEXT:    movdqa %xmm4, %xmm6
302 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm6
303 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[0,0,2,2]
304 ; SSE41-NEXT:    pand %xmm5, %xmm3
305 ; SSE41-NEXT:    por %xmm6, %xmm3
306 ; SSE41-NEXT:    pxor %xmm1, %xmm0
307 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
308 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
309 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
310 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
311 ; SSE41-NEXT:    pand %xmm5, %xmm0
312 ; SSE41-NEXT:    por %xmm4, %xmm0
313 ; SSE41-NEXT:    movapd {{.*#+}} xmm4 = [4294967295,4294967295]
314 ; SSE41-NEXT:    movapd {{.*#+}} xmm5 = [4294967295,429496729]
315 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
316 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
317 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
318 ; SSE41-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,2],xmm5[0,2]
319 ; SSE41-NEXT:    movaps %xmm4, %xmm0
320 ; SSE41-NEXT:    retq
322 ; AVX1-LABEL: trunc_usat_v4i64_v4i32:
323 ; AVX1:       # %bb.0:
324 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
325 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm2
326 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372041149743103,9223372041149743103]
327 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
328 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
329 ; AVX1-NEXT:    vpxor %xmm1, %xmm4, %xmm1
330 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
331 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm3 = [4294967295,429496729]
332 ; AVX1-NEXT:    vblendvpd %xmm1, %xmm4, %xmm3, %xmm1
333 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm3 = [4294967295,4294967295]
334 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
335 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
336 ; AVX1-NEXT:    vzeroupper
337 ; AVX1-NEXT:    retq
339 ; AVX2-SLOW-LABEL: trunc_usat_v4i64_v4i32:
340 ; AVX2-SLOW:       # %bb.0:
341 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
342 ; AVX2-SLOW-NEXT:    vpxor %ymm1, %ymm0, %ymm1
343 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
344 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm1
345 ; AVX2-SLOW-NEXT:    vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,429496729]
346 ; AVX2-SLOW-NEXT:    vblendvpd %ymm1, %ymm0, %ymm2, %ymm0
347 ; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1
348 ; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
349 ; AVX2-SLOW-NEXT:    vzeroupper
350 ; AVX2-SLOW-NEXT:    retq
352 ; AVX2-FAST-LABEL: trunc_usat_v4i64_v4i32:
353 ; AVX2-FAST:       # %bb.0:
354 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
355 ; AVX2-FAST-NEXT:    vpxor %ymm1, %ymm0, %ymm1
356 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
357 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm1
358 ; AVX2-FAST-NEXT:    vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,429496729]
359 ; AVX2-FAST-NEXT:    vblendvpd %ymm1, %ymm0, %ymm2, %ymm0
360 ; AVX2-FAST-NEXT:    vmovapd {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7]
361 ; AVX2-FAST-NEXT:    vpermps %ymm0, %ymm1, %ymm0
362 ; AVX2-FAST-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
363 ; AVX2-FAST-NEXT:    vzeroupper
364 ; AVX2-FAST-NEXT:    retq
366 ; AVX512F-LABEL: trunc_usat_v4i64_v4i32:
367 ; AVX512F:       # %bb.0:
368 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
369 ; AVX512F-NEXT:    vpcmpltuq {{.*}}(%rip){1to8}, %zmm0, %k1
370 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
371 ; AVX512F-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k1}
372 ; AVX512F-NEXT:    vpmovqd %zmm1, %ymm0
373 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
374 ; AVX512F-NEXT:    vzeroupper
375 ; AVX512F-NEXT:    retq
377 ; AVX512VL-LABEL: trunc_usat_v4i64_v4i32:
378 ; AVX512VL:       # %bb.0:
379 ; AVX512VL-NEXT:    vpcmpltuq {{.*}}(%rip){1to4}, %ymm0, %k1
380 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
381 ; AVX512VL-NEXT:    vmovdqa64 %ymm0, %ymm1 {%k1}
382 ; AVX512VL-NEXT:    vpmovqd %ymm1, %xmm0
383 ; AVX512VL-NEXT:    vzeroupper
384 ; AVX512VL-NEXT:    retq
386 ; AVX512BW-LABEL: trunc_usat_v4i64_v4i32:
387 ; AVX512BW:       # %bb.0:
388 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
389 ; AVX512BW-NEXT:    vpcmpltuq {{.*}}(%rip){1to8}, %zmm0, %k1
390 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
391 ; AVX512BW-NEXT:    vmovdqa64 %zmm0, %zmm1 {%k1}
392 ; AVX512BW-NEXT:    vpmovqd %zmm1, %ymm0
393 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
394 ; AVX512BW-NEXT:    vzeroupper
395 ; AVX512BW-NEXT:    retq
397 ; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i32:
398 ; AVX512BWVL:       # %bb.0:
399 ; AVX512BWVL-NEXT:    vpcmpltuq {{.*}}(%rip){1to4}, %ymm0, %k1
400 ; AVX512BWVL-NEXT:    vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
401 ; AVX512BWVL-NEXT:    vmovdqa64 %ymm0, %ymm1 {%k1}
402 ; AVX512BWVL-NEXT:    vpmovqd %ymm1, %xmm0
403 ; AVX512BWVL-NEXT:    vzeroupper
404 ; AVX512BWVL-NEXT:    retq
406 ; SKX-LABEL: trunc_usat_v4i64_v4i32:
407 ; SKX:       # %bb.0:
408 ; SKX-NEXT:    vpcmpltuq {{.*}}(%rip){1to4}, %ymm0, %k1
409 ; SKX-NEXT:    vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
410 ; SKX-NEXT:    vmovdqa64 %ymm0, %ymm1 {%k1}
411 ; SKX-NEXT:    vpmovqd %ymm1, %xmm0
412 ; SKX-NEXT:    vzeroupper
413 ; SKX-NEXT:    retq
414   %1 = icmp ult <4 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
415   %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 429496729>
416   %3 = trunc <4 x i64> %2 to <4 x i32>
417   ret <4 x i32> %3
420 define <8 x i32> @trunc_usat_v8i64_v8i32(<8 x i64>* %p0) {
421 ; SSE2-LABEL: trunc_usat_v8i64_v8i32:
422 ; SSE2:       # %bb.0:
423 ; SSE2-NEXT:    movdqa (%rdi), %xmm9
424 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm5
425 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm6
426 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
427 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [4294967295,4294967295]
428 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
429 ; SSE2-NEXT:    movdqa %xmm1, %xmm7
430 ; SSE2-NEXT:    pxor %xmm0, %xmm7
431 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [9223372039002259455,9223372039002259455]
432 ; SSE2-NEXT:    movdqa %xmm10, %xmm4
433 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
434 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[0,0,2,2]
435 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm7
436 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
437 ; SSE2-NEXT:    pand %xmm2, %xmm7
438 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
439 ; SSE2-NEXT:    por %xmm7, %xmm2
440 ; SSE2-NEXT:    pand %xmm2, %xmm1
441 ; SSE2-NEXT:    pandn %xmm8, %xmm2
442 ; SSE2-NEXT:    por %xmm1, %xmm2
443 ; SSE2-NEXT:    movdqa %xmm6, %xmm1
444 ; SSE2-NEXT:    pxor %xmm0, %xmm1
445 ; SSE2-NEXT:    movdqa %xmm10, %xmm4
446 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
447 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
448 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
449 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
450 ; SSE2-NEXT:    pand %xmm7, %xmm3
451 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
452 ; SSE2-NEXT:    por %xmm3, %xmm1
453 ; SSE2-NEXT:    pand %xmm1, %xmm6
454 ; SSE2-NEXT:    pandn %xmm8, %xmm1
455 ; SSE2-NEXT:    por %xmm6, %xmm1
456 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
457 ; SSE2-NEXT:    movdqa %xmm5, %xmm2
458 ; SSE2-NEXT:    pxor %xmm0, %xmm2
459 ; SSE2-NEXT:    movdqa %xmm10, %xmm3
460 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
461 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
462 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm2
463 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
464 ; SSE2-NEXT:    pand %xmm4, %xmm2
465 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
466 ; SSE2-NEXT:    por %xmm2, %xmm3
467 ; SSE2-NEXT:    pand %xmm3, %xmm5
468 ; SSE2-NEXT:    pandn %xmm8, %xmm3
469 ; SSE2-NEXT:    por %xmm5, %xmm3
470 ; SSE2-NEXT:    pxor %xmm9, %xmm0
471 ; SSE2-NEXT:    movdqa %xmm10, %xmm2
472 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
473 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
474 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
475 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
476 ; SSE2-NEXT:    pand %xmm4, %xmm5
477 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
478 ; SSE2-NEXT:    por %xmm5, %xmm0
479 ; SSE2-NEXT:    pand %xmm0, %xmm9
480 ; SSE2-NEXT:    pandn %xmm8, %xmm0
481 ; SSE2-NEXT:    por %xmm9, %xmm0
482 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
483 ; SSE2-NEXT:    retq
485 ; SSSE3-LABEL: trunc_usat_v8i64_v8i32:
486 ; SSSE3:       # %bb.0:
487 ; SSSE3-NEXT:    movdqa (%rdi), %xmm9
488 ; SSSE3-NEXT:    movdqa 16(%rdi), %xmm5
489 ; SSSE3-NEXT:    movdqa 32(%rdi), %xmm6
490 ; SSSE3-NEXT:    movdqa 48(%rdi), %xmm1
491 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [4294967295,4294967295]
492 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
493 ; SSSE3-NEXT:    movdqa %xmm1, %xmm7
494 ; SSSE3-NEXT:    pxor %xmm0, %xmm7
495 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [9223372039002259455,9223372039002259455]
496 ; SSSE3-NEXT:    movdqa %xmm10, %xmm4
497 ; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm4
498 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[0,0,2,2]
499 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm7
500 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
501 ; SSSE3-NEXT:    pand %xmm2, %xmm7
502 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
503 ; SSSE3-NEXT:    por %xmm7, %xmm2
504 ; SSSE3-NEXT:    pand %xmm2, %xmm1
505 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
506 ; SSSE3-NEXT:    por %xmm1, %xmm2
507 ; SSSE3-NEXT:    movdqa %xmm6, %xmm1
508 ; SSSE3-NEXT:    pxor %xmm0, %xmm1
509 ; SSSE3-NEXT:    movdqa %xmm10, %xmm4
510 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
511 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
512 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm1
513 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
514 ; SSSE3-NEXT:    pand %xmm7, %xmm3
515 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
516 ; SSSE3-NEXT:    por %xmm3, %xmm1
517 ; SSSE3-NEXT:    pand %xmm1, %xmm6
518 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
519 ; SSSE3-NEXT:    por %xmm6, %xmm1
520 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
521 ; SSSE3-NEXT:    movdqa %xmm5, %xmm2
522 ; SSSE3-NEXT:    pxor %xmm0, %xmm2
523 ; SSSE3-NEXT:    movdqa %xmm10, %xmm3
524 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
525 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
526 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm2
527 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
528 ; SSSE3-NEXT:    pand %xmm4, %xmm2
529 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
530 ; SSSE3-NEXT:    por %xmm2, %xmm3
531 ; SSSE3-NEXT:    pand %xmm3, %xmm5
532 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
533 ; SSSE3-NEXT:    por %xmm5, %xmm3
534 ; SSSE3-NEXT:    pxor %xmm9, %xmm0
535 ; SSSE3-NEXT:    movdqa %xmm10, %xmm2
536 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
537 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
538 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm0
539 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
540 ; SSSE3-NEXT:    pand %xmm4, %xmm5
541 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
542 ; SSSE3-NEXT:    por %xmm5, %xmm0
543 ; SSSE3-NEXT:    pand %xmm0, %xmm9
544 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
545 ; SSSE3-NEXT:    por %xmm9, %xmm0
546 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
547 ; SSSE3-NEXT:    retq
549 ; SSE41-LABEL: trunc_usat_v8i64_v8i32:
550 ; SSE41:       # %bb.0:
551 ; SSE41-NEXT:    movdqa (%rdi), %xmm8
552 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm9
553 ; SSE41-NEXT:    movdqa 32(%rdi), %xmm7
554 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm1
555 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [4294967295,4294967295]
556 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
557 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
558 ; SSE41-NEXT:    pxor %xmm5, %xmm0
559 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259455,9223372039002259455]
560 ; SSE41-NEXT:    movdqa %xmm3, %xmm6
561 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
562 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
563 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
564 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
565 ; SSE41-NEXT:    pand %xmm6, %xmm0
566 ; SSE41-NEXT:    por %xmm4, %xmm0
567 ; SSE41-NEXT:    movapd %xmm2, %xmm4
568 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
569 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
570 ; SSE41-NEXT:    pxor %xmm5, %xmm0
571 ; SSE41-NEXT:    movdqa %xmm3, %xmm1
572 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
573 ; SSE41-NEXT:    movdqa %xmm3, %xmm6
574 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
575 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
576 ; SSE41-NEXT:    pand %xmm1, %xmm0
577 ; SSE41-NEXT:    por %xmm6, %xmm0
578 ; SSE41-NEXT:    movapd %xmm2, %xmm1
579 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
580 ; SSE41-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm4[0,2]
581 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
582 ; SSE41-NEXT:    pxor %xmm5, %xmm0
583 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
584 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
585 ; SSE41-NEXT:    movdqa %xmm3, %xmm6
586 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
587 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
588 ; SSE41-NEXT:    pand %xmm4, %xmm0
589 ; SSE41-NEXT:    por %xmm6, %xmm0
590 ; SSE41-NEXT:    movapd %xmm2, %xmm4
591 ; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm4
592 ; SSE41-NEXT:    pxor %xmm8, %xmm5
593 ; SSE41-NEXT:    movdqa %xmm3, %xmm6
594 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm6
595 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm3
596 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
597 ; SSE41-NEXT:    pand %xmm6, %xmm0
598 ; SSE41-NEXT:    por %xmm3, %xmm0
599 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm2
600 ; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm4[0,2]
601 ; SSE41-NEXT:    movaps %xmm2, %xmm0
602 ; SSE41-NEXT:    retq
604 ; AVX1-LABEL: trunc_usat_v8i64_v8i32:
605 ; AVX1:       # %bb.0:
606 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
607 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
608 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm2
609 ; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm3
610 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
611 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm5
612 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [9223372041149743103,9223372041149743103]
613 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm8
614 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm7
615 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm7
616 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm5
617 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
618 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm4
619 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
620 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm6 = [4294967295,4294967295]
621 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm6, %xmm3
622 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm2, %xmm6, %xmm2
623 ; AVX1-NEXT:    vshufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]
624 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm1, %xmm6, %xmm1
625 ; AVX1-NEXT:    vblendvpd %xmm8, %xmm0, %xmm6, %xmm0
626 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
627 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
628 ; AVX1-NEXT:    retq
630 ; AVX2-SLOW-LABEL: trunc_usat_v8i64_v8i32:
631 ; AVX2-SLOW:       # %bb.0:
632 ; AVX2-SLOW-NEXT:    vmovdqa (%rdi), %ymm0
633 ; AVX2-SLOW-NEXT:    vmovdqa 32(%rdi), %ymm1
634 ; AVX2-SLOW-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
635 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
636 ; AVX2-SLOW-NEXT:    vpxor %ymm3, %ymm0, %ymm4
637 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
638 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
639 ; AVX2-SLOW-NEXT:    vblendvpd %ymm4, %ymm0, %ymm2, %ymm0
640 ; AVX2-SLOW-NEXT:    vpxor %ymm3, %ymm1, %ymm3
641 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm3, %ymm5, %ymm3
642 ; AVX2-SLOW-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
643 ; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm1, %xmm2
644 ; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
645 ; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm2
646 ; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
647 ; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
648 ; AVX2-SLOW-NEXT:    retq
650 ; AVX2-FAST-LABEL: trunc_usat_v8i64_v8i32:
651 ; AVX2-FAST:       # %bb.0:
652 ; AVX2-FAST-NEXT:    vmovdqa (%rdi), %ymm0
653 ; AVX2-FAST-NEXT:    vmovdqa 32(%rdi), %ymm1
654 ; AVX2-FAST-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
655 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
656 ; AVX2-FAST-NEXT:    vpxor %ymm3, %ymm1, %ymm4
657 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
658 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
659 ; AVX2-FAST-NEXT:    vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
660 ; AVX2-FAST-NEXT:    vpxor %ymm3, %ymm0, %ymm3
661 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm3, %ymm5, %ymm3
662 ; AVX2-FAST-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
663 ; AVX2-FAST-NEXT:    vmovapd {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
664 ; AVX2-FAST-NEXT:    vpermps %ymm0, %ymm2, %ymm0
665 ; AVX2-FAST-NEXT:    vpermps %ymm1, %ymm2, %ymm1
666 ; AVX2-FAST-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
667 ; AVX2-FAST-NEXT:    retq
669 ; AVX512-LABEL: trunc_usat_v8i64_v8i32:
670 ; AVX512:       # %bb.0:
671 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
672 ; AVX512-NEXT:    vpmovusqd %zmm0, %ymm0
673 ; AVX512-NEXT:    retq
675 ; SKX-LABEL: trunc_usat_v8i64_v8i32:
676 ; SKX:       # %bb.0:
677 ; SKX-NEXT:    vmovdqa64 (%rdi), %zmm0
678 ; SKX-NEXT:    vpmovusqd %zmm0, %ymm0
679 ; SKX-NEXT:    retq
680   %a0 = load <8 x i64>, <8 x i64>* %p0
681   %1 = icmp ult <8 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
682   %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>
683   %3 = trunc <8 x i64> %2 to <8 x i32>
684   ret <8 x i32> %3
688 ; Unsigned saturation truncation to vXi16
691 define <2 x i16> @trunc_usat_v2i64_v2i16(<2 x i64> %a0) {
692 ; SSE2-LABEL: trunc_usat_v2i64_v2i16:
693 ; SSE2:       # %bb.0:
694 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
695 ; SSE2-NEXT:    pxor %xmm0, %xmm1
696 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002324991,9223372039002324991]
697 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
698 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
699 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
700 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
701 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
702 ; SSE2-NEXT:    pand %xmm4, %xmm1
703 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
704 ; SSE2-NEXT:    por %xmm1, %xmm2
705 ; SSE2-NEXT:    pand %xmm2, %xmm0
706 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
707 ; SSE2-NEXT:    por %xmm0, %xmm2
708 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
709 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
710 ; SSE2-NEXT:    retq
712 ; SSSE3-LABEL: trunc_usat_v2i64_v2i16:
713 ; SSSE3:       # %bb.0:
714 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
715 ; SSSE3-NEXT:    pxor %xmm0, %xmm1
716 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002324991,9223372039002324991]
717 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
718 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
719 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
720 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm1
721 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
722 ; SSSE3-NEXT:    pand %xmm4, %xmm1
723 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
724 ; SSSE3-NEXT:    por %xmm1, %xmm2
725 ; SSSE3-NEXT:    pand %xmm2, %xmm0
726 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
727 ; SSSE3-NEXT:    por %xmm0, %xmm2
728 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
729 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
730 ; SSSE3-NEXT:    retq
732 ; SSE41-LABEL: trunc_usat_v2i64_v2i16:
733 ; SSE41:       # %bb.0:
734 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
735 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [65535,65535]
736 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
737 ; SSE41-NEXT:    pxor %xmm1, %xmm0
738 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002324991,9223372039002324991]
739 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
740 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
741 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
742 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
743 ; SSE41-NEXT:    pand %xmm4, %xmm0
744 ; SSE41-NEXT:    por %xmm3, %xmm0
745 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
746 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
747 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
748 ; SSE41-NEXT:    retq
750 ; AVX1-LABEL: trunc_usat_v2i64_v2i16:
751 ; AVX1:       # %bb.0:
752 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm1 = [65535,65535]
753 ; AVX1-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm2
754 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
755 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
756 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
757 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
758 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
759 ; AVX1-NEXT:    retq
761 ; AVX2-SLOW-LABEL: trunc_usat_v2i64_v2i16:
762 ; AVX2-SLOW:       # %bb.0:
763 ; AVX2-SLOW-NEXT:    vmovapd {{.*#+}} xmm1 = [65535,65535]
764 ; AVX2-SLOW-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm2
765 ; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
766 ; AVX2-SLOW-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
767 ; AVX2-SLOW-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
768 ; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
769 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
770 ; AVX2-SLOW-NEXT:    retq
772 ; AVX2-FAST-LABEL: trunc_usat_v2i64_v2i16:
773 ; AVX2-FAST:       # %bb.0:
774 ; AVX2-FAST-NEXT:    vmovapd {{.*#+}} xmm1 = [65535,65535]
775 ; AVX2-FAST-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm2
776 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
777 ; AVX2-FAST-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
778 ; AVX2-FAST-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
779 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
780 ; AVX2-FAST-NEXT:    retq
782 ; AVX512F-LABEL: trunc_usat_v2i64_v2i16:
783 ; AVX512F:       # %bb.0:
784 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
785 ; AVX512F-NEXT:    vpmovusqw %zmm0, %xmm0
786 ; AVX512F-NEXT:    vzeroupper
787 ; AVX512F-NEXT:    retq
789 ; AVX512VL-LABEL: trunc_usat_v2i64_v2i16:
790 ; AVX512VL:       # %bb.0:
791 ; AVX512VL-NEXT:    vpmovusqw %xmm0, %xmm0
792 ; AVX512VL-NEXT:    retq
794 ; AVX512BW-LABEL: trunc_usat_v2i64_v2i16:
795 ; AVX512BW:       # %bb.0:
796 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
797 ; AVX512BW-NEXT:    vpmovusqw %zmm0, %xmm0
798 ; AVX512BW-NEXT:    vzeroupper
799 ; AVX512BW-NEXT:    retq
801 ; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i16:
802 ; AVX512BWVL:       # %bb.0:
803 ; AVX512BWVL-NEXT:    vpmovusqw %xmm0, %xmm0
804 ; AVX512BWVL-NEXT:    retq
806 ; SKX-LABEL: trunc_usat_v2i64_v2i16:
807 ; SKX:       # %bb.0:
808 ; SKX-NEXT:    vpmovusqw %xmm0, %xmm0
809 ; SKX-NEXT:    retq
810   %1 = icmp ult <2 x i64> %a0, <i64 65535, i64 65535>
811   %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 65535, i64 65535>
812   %3 = trunc <2 x i64> %2 to <2 x i16>
813   ret <2 x i16> %3
816 define void @trunc_usat_v2i64_v2i16_store(<2 x i64> %a0, <2 x i16>* %p1) {
817 ; SSE2-LABEL: trunc_usat_v2i64_v2i16_store:
818 ; SSE2:       # %bb.0:
819 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
820 ; SSE2-NEXT:    pxor %xmm0, %xmm1
821 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002324991,9223372039002324991]
822 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
823 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
824 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
825 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
826 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
827 ; SSE2-NEXT:    pand %xmm4, %xmm1
828 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
829 ; SSE2-NEXT:    por %xmm1, %xmm2
830 ; SSE2-NEXT:    pand %xmm2, %xmm0
831 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
832 ; SSE2-NEXT:    por %xmm0, %xmm2
833 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
834 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
835 ; SSE2-NEXT:    movd %xmm0, (%rdi)
836 ; SSE2-NEXT:    retq
838 ; SSSE3-LABEL: trunc_usat_v2i64_v2i16_store:
839 ; SSSE3:       # %bb.0:
840 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
841 ; SSSE3-NEXT:    pxor %xmm0, %xmm1
842 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002324991,9223372039002324991]
843 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
844 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
845 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
846 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm1
847 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
848 ; SSSE3-NEXT:    pand %xmm4, %xmm1
849 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
850 ; SSSE3-NEXT:    por %xmm1, %xmm2
851 ; SSSE3-NEXT:    pand %xmm2, %xmm0
852 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
853 ; SSSE3-NEXT:    por %xmm0, %xmm2
854 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
855 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
856 ; SSSE3-NEXT:    movd %xmm0, (%rdi)
857 ; SSSE3-NEXT:    retq
859 ; SSE41-LABEL: trunc_usat_v2i64_v2i16_store:
860 ; SSE41:       # %bb.0:
861 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
862 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [65535,65535]
863 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
864 ; SSE41-NEXT:    pxor %xmm1, %xmm0
865 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002324991,9223372039002324991]
866 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
867 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
868 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
869 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
870 ; SSE41-NEXT:    pand %xmm4, %xmm0
871 ; SSE41-NEXT:    por %xmm3, %xmm0
872 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
873 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
874 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
875 ; SSE41-NEXT:    movd %xmm0, (%rdi)
876 ; SSE41-NEXT:    retq
878 ; AVX1-LABEL: trunc_usat_v2i64_v2i16_store:
879 ; AVX1:       # %bb.0:
880 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm1 = [65535,65535]
881 ; AVX1-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm2
882 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
883 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
884 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
885 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
886 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
887 ; AVX1-NEXT:    vmovd %xmm0, (%rdi)
888 ; AVX1-NEXT:    retq
890 ; AVX2-SLOW-LABEL: trunc_usat_v2i64_v2i16_store:
891 ; AVX2-SLOW:       # %bb.0:
892 ; AVX2-SLOW-NEXT:    vmovapd {{.*#+}} xmm1 = [65535,65535]
893 ; AVX2-SLOW-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm2
894 ; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
895 ; AVX2-SLOW-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
896 ; AVX2-SLOW-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
897 ; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
898 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
899 ; AVX2-SLOW-NEXT:    vmovd %xmm0, (%rdi)
900 ; AVX2-SLOW-NEXT:    retq
902 ; AVX2-FAST-LABEL: trunc_usat_v2i64_v2i16_store:
903 ; AVX2-FAST:       # %bb.0:
904 ; AVX2-FAST-NEXT:    vmovapd {{.*#+}} xmm1 = [65535,65535]
905 ; AVX2-FAST-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm2
906 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
907 ; AVX2-FAST-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
908 ; AVX2-FAST-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
909 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
910 ; AVX2-FAST-NEXT:    vmovd %xmm0, (%rdi)
911 ; AVX2-FAST-NEXT:    retq
913 ; AVX512F-LABEL: trunc_usat_v2i64_v2i16_store:
914 ; AVX512F:       # %bb.0:
915 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
916 ; AVX512F-NEXT:    vpmovusqw %zmm0, %xmm0
917 ; AVX512F-NEXT:    vmovd %xmm0, (%rdi)
918 ; AVX512F-NEXT:    vzeroupper
919 ; AVX512F-NEXT:    retq
921 ; AVX512VL-LABEL: trunc_usat_v2i64_v2i16_store:
922 ; AVX512VL:       # %bb.0:
923 ; AVX512VL-NEXT:    vpmovusqw %xmm0, (%rdi)
924 ; AVX512VL-NEXT:    retq
926 ; AVX512BW-LABEL: trunc_usat_v2i64_v2i16_store:
927 ; AVX512BW:       # %bb.0:
928 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
929 ; AVX512BW-NEXT:    vpmovusqw %zmm0, %xmm0
930 ; AVX512BW-NEXT:    vmovd %xmm0, (%rdi)
931 ; AVX512BW-NEXT:    vzeroupper
932 ; AVX512BW-NEXT:    retq
934 ; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i16_store:
935 ; AVX512BWVL:       # %bb.0:
936 ; AVX512BWVL-NEXT:    vpmovusqw %xmm0, (%rdi)
937 ; AVX512BWVL-NEXT:    retq
939 ; SKX-LABEL: trunc_usat_v2i64_v2i16_store:
940 ; SKX:       # %bb.0:
941 ; SKX-NEXT:    vpmovusqw %xmm0, (%rdi)
942 ; SKX-NEXT:    retq
943   %1 = icmp ult <2 x i64> %a0, <i64 65535, i64 65535>
944   %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 65535, i64 65535>
945   %3 = trunc <2 x i64> %2 to <2 x i16>
946   store <2 x i16> %3, <2 x i16>* %p1
947   ret void
950 define <4 x i16> @trunc_usat_v4i64_v4i16(<4 x i64> %a0) {
951 ; SSE2-LABEL: trunc_usat_v4i64_v4i16:
952 ; SSE2:       # %bb.0:
953 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535]
954 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
955 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
956 ; SSE2-NEXT:    pxor %xmm3, %xmm4
957 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002324991,9223372039002324991]
958 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
959 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
960 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
961 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
962 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
963 ; SSE2-NEXT:    pand %xmm7, %xmm4
964 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
965 ; SSE2-NEXT:    por %xmm4, %xmm6
966 ; SSE2-NEXT:    pand %xmm6, %xmm0
967 ; SSE2-NEXT:    pandn %xmm2, %xmm6
968 ; SSE2-NEXT:    por %xmm0, %xmm6
969 ; SSE2-NEXT:    pxor %xmm1, %xmm3
970 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
971 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm0
972 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
973 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
974 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
975 ; SSE2-NEXT:    pand %xmm4, %xmm3
976 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
977 ; SSE2-NEXT:    por %xmm3, %xmm0
978 ; SSE2-NEXT:    pand %xmm0, %xmm1
979 ; SSE2-NEXT:    pandn %xmm2, %xmm0
980 ; SSE2-NEXT:    por %xmm1, %xmm0
981 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
982 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,2,2,3,4,5,6,7]
983 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,2,2,3]
984 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
985 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
986 ; SSE2-NEXT:    retq
988 ; SSSE3-LABEL: trunc_usat_v4i64_v4i16:
989 ; SSSE3:       # %bb.0:
990 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535]
991 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
992 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
993 ; SSSE3-NEXT:    pxor %xmm3, %xmm4
994 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002324991,9223372039002324991]
995 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
996 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
997 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
998 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm4
999 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1000 ; SSSE3-NEXT:    pand %xmm7, %xmm4
1001 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1002 ; SSSE3-NEXT:    por %xmm4, %xmm6
1003 ; SSSE3-NEXT:    pand %xmm6, %xmm0
1004 ; SSSE3-NEXT:    pandn %xmm2, %xmm6
1005 ; SSSE3-NEXT:    por %xmm0, %xmm6
1006 ; SSSE3-NEXT:    pxor %xmm1, %xmm3
1007 ; SSSE3-NEXT:    movdqa %xmm5, %xmm0
1008 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm0
1009 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1010 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm3
1011 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1012 ; SSSE3-NEXT:    pand %xmm4, %xmm3
1013 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1014 ; SSSE3-NEXT:    por %xmm3, %xmm0
1015 ; SSSE3-NEXT:    pand %xmm0, %xmm1
1016 ; SSSE3-NEXT:    pandn %xmm2, %xmm0
1017 ; SSSE3-NEXT:    por %xmm1, %xmm0
1018 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1019 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,2,2,3,4,5,6,7]
1020 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,2,2,3]
1021 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1022 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1023 ; SSSE3-NEXT:    retq
1025 ; SSE41-LABEL: trunc_usat_v4i64_v4i16:
1026 ; SSE41:       # %bb.0:
1027 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1028 ; SSE41-NEXT:    movapd {{.*#+}} xmm3 = [65535,65535]
1029 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
1030 ; SSE41-NEXT:    pxor %xmm4, %xmm0
1031 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002324991,9223372039002324991]
1032 ; SSE41-NEXT:    movdqa %xmm5, %xmm6
1033 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
1034 ; SSE41-NEXT:    movdqa %xmm5, %xmm7
1035 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
1036 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1037 ; SSE41-NEXT:    pand %xmm6, %xmm0
1038 ; SSE41-NEXT:    por %xmm7, %xmm0
1039 ; SSE41-NEXT:    movapd %xmm3, %xmm6
1040 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm6
1041 ; SSE41-NEXT:    pxor %xmm1, %xmm4
1042 ; SSE41-NEXT:    movdqa %xmm5, %xmm2
1043 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm2
1044 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm5
1045 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1046 ; SSE41-NEXT:    pand %xmm2, %xmm0
1047 ; SSE41-NEXT:    por %xmm5, %xmm0
1048 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
1049 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
1050 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,2,2,3,4,5,6,7]
1051 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,2,2,3]
1052 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1053 ; SSE41-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1054 ; SSE41-NEXT:    retq
1056 ; AVX1-LABEL: trunc_usat_v4i64_v4i16:
1057 ; AVX1:       # %bb.0:
1058 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
1059 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm2
1060 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
1061 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
1062 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
1063 ; AVX1-NEXT:    vpxor %xmm1, %xmm4, %xmm1
1064 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
1065 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm3 = [65535,65535]
1066 ; AVX1-NEXT:    vblendvpd %xmm1, %xmm4, %xmm3, %xmm1
1067 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[0,2,2,3]
1068 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1069 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
1070 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1071 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1072 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1073 ; AVX1-NEXT:    vzeroupper
1074 ; AVX1-NEXT:    retq
1076 ; AVX2-SLOW-LABEL: trunc_usat_v4i64_v4i16:
1077 ; AVX2-SLOW:       # %bb.0:
1078 ; AVX2-SLOW-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [65535,65535,65535,65535]
1079 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1080 ; AVX2-SLOW-NEXT:    vpxor %ymm2, %ymm0, %ymm2
1081 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343]
1082 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm2, %ymm3, %ymm2
1083 ; AVX2-SLOW-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1084 ; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1
1085 ; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[0,2,2,3]
1086 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1087 ; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1088 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1089 ; AVX2-SLOW-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1090 ; AVX2-SLOW-NEXT:    vzeroupper
1091 ; AVX2-SLOW-NEXT:    retq
1093 ; AVX2-FAST-LABEL: trunc_usat_v4i64_v4i16:
1094 ; AVX2-FAST:       # %bb.0:
1095 ; AVX2-FAST-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [65535,65535,65535,65535]
1096 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1097 ; AVX2-FAST-NEXT:    vpxor %ymm2, %ymm0, %ymm2
1098 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343]
1099 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm2, %ymm3, %ymm2
1100 ; AVX2-FAST-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1101 ; AVX2-FAST-NEXT:    vextractf128 $1, %ymm0, %xmm1
1102 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
1103 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1104 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1105 ; AVX2-FAST-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1106 ; AVX2-FAST-NEXT:    vzeroupper
1107 ; AVX2-FAST-NEXT:    retq
1109 ; AVX512F-LABEL: trunc_usat_v4i64_v4i16:
1110 ; AVX512F:       # %bb.0:
1111 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1112 ; AVX512F-NEXT:    vpmovusqw %zmm0, %xmm0
1113 ; AVX512F-NEXT:    vzeroupper
1114 ; AVX512F-NEXT:    retq
1116 ; AVX512VL-LABEL: trunc_usat_v4i64_v4i16:
1117 ; AVX512VL:       # %bb.0:
1118 ; AVX512VL-NEXT:    vpmovusqw %ymm0, %xmm0
1119 ; AVX512VL-NEXT:    vzeroupper
1120 ; AVX512VL-NEXT:    retq
1122 ; AVX512BW-LABEL: trunc_usat_v4i64_v4i16:
1123 ; AVX512BW:       # %bb.0:
1124 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1125 ; AVX512BW-NEXT:    vpmovusqw %zmm0, %xmm0
1126 ; AVX512BW-NEXT:    vzeroupper
1127 ; AVX512BW-NEXT:    retq
1129 ; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i16:
1130 ; AVX512BWVL:       # %bb.0:
1131 ; AVX512BWVL-NEXT:    vpmovusqw %ymm0, %xmm0
1132 ; AVX512BWVL-NEXT:    vzeroupper
1133 ; AVX512BWVL-NEXT:    retq
1135 ; SKX-LABEL: trunc_usat_v4i64_v4i16:
1136 ; SKX:       # %bb.0:
1137 ; SKX-NEXT:    vpmovusqw %ymm0, %xmm0
1138 ; SKX-NEXT:    vzeroupper
1139 ; SKX-NEXT:    retq
1140   %1 = icmp ult <4 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535>
1141   %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 65535, i64 65535, i64 65535, i64 65535>
1142   %3 = trunc <4 x i64> %2 to <4 x i16>
1143   ret <4 x i16> %3
1146 define void @trunc_usat_v4i64_v4i16_store(<4 x i64> %a0, <4 x i16> *%p1) {
1147 ; SSE2-LABEL: trunc_usat_v4i64_v4i16_store:
1148 ; SSE2:       # %bb.0:
1149 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535]
1150 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
1151 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
1152 ; SSE2-NEXT:    pxor %xmm3, %xmm4
1153 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002324991,9223372039002324991]
1154 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
1155 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
1156 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1157 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
1158 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1159 ; SSE2-NEXT:    pand %xmm7, %xmm4
1160 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1161 ; SSE2-NEXT:    por %xmm4, %xmm6
1162 ; SSE2-NEXT:    pand %xmm6, %xmm0
1163 ; SSE2-NEXT:    pandn %xmm2, %xmm6
1164 ; SSE2-NEXT:    por %xmm0, %xmm6
1165 ; SSE2-NEXT:    pxor %xmm1, %xmm3
1166 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
1167 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm0
1168 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1169 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
1170 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1171 ; SSE2-NEXT:    pand %xmm4, %xmm3
1172 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1173 ; SSE2-NEXT:    por %xmm3, %xmm0
1174 ; SSE2-NEXT:    pand %xmm0, %xmm1
1175 ; SSE2-NEXT:    pandn %xmm2, %xmm0
1176 ; SSE2-NEXT:    por %xmm1, %xmm0
1177 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1178 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1179 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[0,2,2,3]
1180 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1181 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1182 ; SSE2-NEXT:    movq %xmm1, (%rdi)
1183 ; SSE2-NEXT:    retq
1185 ; SSSE3-LABEL: trunc_usat_v4i64_v4i16_store:
1186 ; SSSE3:       # %bb.0:
1187 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535]
1188 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
1189 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
1190 ; SSSE3-NEXT:    pxor %xmm3, %xmm4
1191 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002324991,9223372039002324991]
1192 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
1193 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
1194 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1195 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm4
1196 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1197 ; SSSE3-NEXT:    pand %xmm7, %xmm4
1198 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1199 ; SSSE3-NEXT:    por %xmm4, %xmm6
1200 ; SSSE3-NEXT:    pand %xmm6, %xmm0
1201 ; SSSE3-NEXT:    pandn %xmm2, %xmm6
1202 ; SSSE3-NEXT:    por %xmm0, %xmm6
1203 ; SSSE3-NEXT:    pxor %xmm1, %xmm3
1204 ; SSSE3-NEXT:    movdqa %xmm5, %xmm0
1205 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm0
1206 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1207 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm3
1208 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1209 ; SSSE3-NEXT:    pand %xmm4, %xmm3
1210 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1211 ; SSSE3-NEXT:    por %xmm3, %xmm0
1212 ; SSSE3-NEXT:    pand %xmm0, %xmm1
1213 ; SSSE3-NEXT:    pandn %xmm2, %xmm0
1214 ; SSSE3-NEXT:    por %xmm1, %xmm0
1215 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1216 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1217 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[0,2,2,3]
1218 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1219 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1220 ; SSSE3-NEXT:    movq %xmm1, (%rdi)
1221 ; SSSE3-NEXT:    retq
1223 ; SSE41-LABEL: trunc_usat_v4i64_v4i16_store:
1224 ; SSE41:       # %bb.0:
1225 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1226 ; SSE41-NEXT:    movapd {{.*#+}} xmm3 = [65535,65535]
1227 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
1228 ; SSE41-NEXT:    pxor %xmm4, %xmm0
1229 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002324991,9223372039002324991]
1230 ; SSE41-NEXT:    movdqa %xmm5, %xmm6
1231 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
1232 ; SSE41-NEXT:    movdqa %xmm5, %xmm7
1233 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
1234 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1235 ; SSE41-NEXT:    pand %xmm6, %xmm0
1236 ; SSE41-NEXT:    por %xmm7, %xmm0
1237 ; SSE41-NEXT:    movapd %xmm3, %xmm6
1238 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm6
1239 ; SSE41-NEXT:    pxor %xmm1, %xmm4
1240 ; SSE41-NEXT:    movdqa %xmm5, %xmm2
1241 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm2
1242 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm5
1243 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1244 ; SSE41-NEXT:    pand %xmm2, %xmm0
1245 ; SSE41-NEXT:    por %xmm5, %xmm0
1246 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
1247 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
1248 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1249 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[0,2,2,3]
1250 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1251 ; SSE41-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1252 ; SSE41-NEXT:    movq %xmm1, (%rdi)
1253 ; SSE41-NEXT:    retq
1255 ; AVX1-LABEL: trunc_usat_v4i64_v4i16_store:
1256 ; AVX1:       # %bb.0:
1257 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
1258 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm2
1259 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
1260 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
1261 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
1262 ; AVX1-NEXT:    vpxor %xmm1, %xmm4, %xmm1
1263 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
1264 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm3 = [65535,65535]
1265 ; AVX1-NEXT:    vblendvpd %xmm1, %xmm4, %xmm3, %xmm1
1266 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[0,2,2,3]
1267 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1268 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
1269 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1270 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1271 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1272 ; AVX1-NEXT:    vmovq %xmm0, (%rdi)
1273 ; AVX1-NEXT:    vzeroupper
1274 ; AVX1-NEXT:    retq
1276 ; AVX2-SLOW-LABEL: trunc_usat_v4i64_v4i16_store:
1277 ; AVX2-SLOW:       # %bb.0:
1278 ; AVX2-SLOW-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [65535,65535,65535,65535]
1279 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1280 ; AVX2-SLOW-NEXT:    vpxor %ymm2, %ymm0, %ymm2
1281 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343]
1282 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm2, %ymm3, %ymm2
1283 ; AVX2-SLOW-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1284 ; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1
1285 ; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[0,2,2,3]
1286 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1287 ; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1288 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1289 ; AVX2-SLOW-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1290 ; AVX2-SLOW-NEXT:    vmovq %xmm0, (%rdi)
1291 ; AVX2-SLOW-NEXT:    vzeroupper
1292 ; AVX2-SLOW-NEXT:    retq
1294 ; AVX2-FAST-LABEL: trunc_usat_v4i64_v4i16_store:
1295 ; AVX2-FAST:       # %bb.0:
1296 ; AVX2-FAST-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [65535,65535,65535,65535]
1297 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1298 ; AVX2-FAST-NEXT:    vpxor %ymm2, %ymm0, %ymm2
1299 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343]
1300 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm2, %ymm3, %ymm2
1301 ; AVX2-FAST-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1302 ; AVX2-FAST-NEXT:    vextractf128 $1, %ymm0, %xmm1
1303 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
1304 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1305 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1306 ; AVX2-FAST-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1307 ; AVX2-FAST-NEXT:    vmovq %xmm0, (%rdi)
1308 ; AVX2-FAST-NEXT:    vzeroupper
1309 ; AVX2-FAST-NEXT:    retq
1311 ; AVX512F-LABEL: trunc_usat_v4i64_v4i16_store:
1312 ; AVX512F:       # %bb.0:
1313 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1314 ; AVX512F-NEXT:    vpmovusqw %zmm0, %xmm0
1315 ; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
1316 ; AVX512F-NEXT:    vzeroupper
1317 ; AVX512F-NEXT:    retq
1319 ; AVX512VL-LABEL: trunc_usat_v4i64_v4i16_store:
1320 ; AVX512VL:       # %bb.0:
1321 ; AVX512VL-NEXT:    vpmovusqw %ymm0, (%rdi)
1322 ; AVX512VL-NEXT:    vzeroupper
1323 ; AVX512VL-NEXT:    retq
1325 ; AVX512BW-LABEL: trunc_usat_v4i64_v4i16_store:
1326 ; AVX512BW:       # %bb.0:
1327 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1328 ; AVX512BW-NEXT:    vpmovusqw %zmm0, %xmm0
1329 ; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
1330 ; AVX512BW-NEXT:    vzeroupper
1331 ; AVX512BW-NEXT:    retq
1333 ; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i16_store:
1334 ; AVX512BWVL:       # %bb.0:
1335 ; AVX512BWVL-NEXT:    vpmovusqw %ymm0, (%rdi)
1336 ; AVX512BWVL-NEXT:    vzeroupper
1337 ; AVX512BWVL-NEXT:    retq
1339 ; SKX-LABEL: trunc_usat_v4i64_v4i16_store:
1340 ; SKX:       # %bb.0:
1341 ; SKX-NEXT:    vpmovusqw %ymm0, (%rdi)
1342 ; SKX-NEXT:    vzeroupper
1343 ; SKX-NEXT:    retq
1344   %1 = icmp ult <4 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535>
1345   %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 65535, i64 65535, i64 65535, i64 65535>
1346   %3 = trunc <4 x i64> %2 to <4 x i16>
1347   store <4 x i16> %3, <4 x i16> *%p1
1348   ret void
1351 define <8 x i16> @trunc_usat_v8i64_v8i16(<8 x i64>* %p0) {
1352 ; SSE2-LABEL: trunc_usat_v8i64_v8i16:
1353 ; SSE2:       # %bb.0:
1354 ; SSE2-NEXT:    movdqa (%rdi), %xmm4
1355 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm9
1356 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm6
1357 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm7
1358 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [65535,65535]
1359 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
1360 ; SSE2-NEXT:    movdqa %xmm6, %xmm2
1361 ; SSE2-NEXT:    pxor %xmm3, %xmm2
1362 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [9223372039002324991,9223372039002324991]
1363 ; SSE2-NEXT:    movdqa %xmm10, %xmm5
1364 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
1365 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1366 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm2
1367 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1368 ; SSE2-NEXT:    pand %xmm0, %xmm1
1369 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
1370 ; SSE2-NEXT:    por %xmm1, %xmm2
1371 ; SSE2-NEXT:    pand %xmm2, %xmm6
1372 ; SSE2-NEXT:    pandn %xmm8, %xmm2
1373 ; SSE2-NEXT:    por %xmm6, %xmm2
1374 ; SSE2-NEXT:    movdqa %xmm7, %xmm0
1375 ; SSE2-NEXT:    pxor %xmm3, %xmm0
1376 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
1377 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1378 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2]
1379 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
1380 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1381 ; SSE2-NEXT:    pand %xmm5, %xmm0
1382 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
1383 ; SSE2-NEXT:    por %xmm0, %xmm6
1384 ; SSE2-NEXT:    pand %xmm6, %xmm7
1385 ; SSE2-NEXT:    pandn %xmm8, %xmm6
1386 ; SSE2-NEXT:    por %xmm7, %xmm6
1387 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
1388 ; SSE2-NEXT:    pxor %xmm3, %xmm0
1389 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
1390 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
1391 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2]
1392 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
1393 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1394 ; SSE2-NEXT:    pand %xmm5, %xmm0
1395 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1396 ; SSE2-NEXT:    por %xmm0, %xmm1
1397 ; SSE2-NEXT:    pand %xmm1, %xmm4
1398 ; SSE2-NEXT:    pandn %xmm8, %xmm1
1399 ; SSE2-NEXT:    por %xmm4, %xmm1
1400 ; SSE2-NEXT:    pxor %xmm9, %xmm3
1401 ; SSE2-NEXT:    movdqa %xmm10, %xmm0
1402 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm0
1403 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1404 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm3
1405 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1406 ; SSE2-NEXT:    pand %xmm4, %xmm3
1407 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1408 ; SSE2-NEXT:    por %xmm3, %xmm0
1409 ; SSE2-NEXT:    pand %xmm0, %xmm9
1410 ; SSE2-NEXT:    pandn %xmm8, %xmm0
1411 ; SSE2-NEXT:    por %xmm9, %xmm0
1412 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1413 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1414 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
1415 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1416 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1417 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,2,2,3]
1418 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm3 = xmm0[0,1,0,2,4,5,6,7]
1419 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
1420 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
1421 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1422 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1423 ; SSE2-NEXT:    retq
1425 ; SSSE3-LABEL: trunc_usat_v8i64_v8i16:
1426 ; SSSE3:       # %bb.0:
1427 ; SSSE3-NEXT:    movdqa (%rdi), %xmm4
1428 ; SSSE3-NEXT:    movdqa 16(%rdi), %xmm9
1429 ; SSSE3-NEXT:    movdqa 32(%rdi), %xmm6
1430 ; SSSE3-NEXT:    movdqa 48(%rdi), %xmm7
1431 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [65535,65535]
1432 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
1433 ; SSSE3-NEXT:    movdqa %xmm6, %xmm2
1434 ; SSSE3-NEXT:    pxor %xmm3, %xmm2
1435 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [9223372039002324991,9223372039002324991]
1436 ; SSSE3-NEXT:    movdqa %xmm10, %xmm5
1437 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
1438 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1439 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm2
1440 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1441 ; SSSE3-NEXT:    pand %xmm0, %xmm1
1442 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
1443 ; SSSE3-NEXT:    por %xmm1, %xmm2
1444 ; SSSE3-NEXT:    pand %xmm2, %xmm6
1445 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
1446 ; SSSE3-NEXT:    por %xmm6, %xmm2
1447 ; SSSE3-NEXT:    movdqa %xmm7, %xmm0
1448 ; SSSE3-NEXT:    pxor %xmm3, %xmm0
1449 ; SSSE3-NEXT:    movdqa %xmm10, %xmm1
1450 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
1451 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2]
1452 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm0
1453 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1454 ; SSSE3-NEXT:    pand %xmm5, %xmm0
1455 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
1456 ; SSSE3-NEXT:    por %xmm0, %xmm6
1457 ; SSSE3-NEXT:    pand %xmm6, %xmm7
1458 ; SSSE3-NEXT:    pandn %xmm8, %xmm6
1459 ; SSSE3-NEXT:    por %xmm7, %xmm6
1460 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
1461 ; SSSE3-NEXT:    pxor %xmm3, %xmm0
1462 ; SSSE3-NEXT:    movdqa %xmm10, %xmm1
1463 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
1464 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2]
1465 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm0
1466 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1467 ; SSSE3-NEXT:    pand %xmm5, %xmm0
1468 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1469 ; SSSE3-NEXT:    por %xmm0, %xmm1
1470 ; SSSE3-NEXT:    pand %xmm1, %xmm4
1471 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
1472 ; SSSE3-NEXT:    por %xmm4, %xmm1
1473 ; SSSE3-NEXT:    pxor %xmm9, %xmm3
1474 ; SSSE3-NEXT:    movdqa %xmm10, %xmm0
1475 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm0
1476 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1477 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm3
1478 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1479 ; SSSE3-NEXT:    pand %xmm4, %xmm3
1480 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1481 ; SSSE3-NEXT:    por %xmm3, %xmm0
1482 ; SSSE3-NEXT:    pand %xmm0, %xmm9
1483 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
1484 ; SSSE3-NEXT:    por %xmm9, %xmm0
1485 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1486 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1487 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
1488 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1489 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1490 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,2,2,3]
1491 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm3 = xmm0[0,1,0,2,4,5,6,7]
1492 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
1493 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
1494 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1495 ; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1496 ; SSSE3-NEXT:    retq
1498 ; SSE41-LABEL: trunc_usat_v8i64_v8i16:
1499 ; SSE41:       # %bb.0:
1500 ; SSE41-NEXT:    movdqa (%rdi), %xmm7
1501 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm1
1502 ; SSE41-NEXT:    movdqa 32(%rdi), %xmm8
1503 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm9
1504 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [65535,65535]
1505 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
1506 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1507 ; SSE41-NEXT:    pxor %xmm5, %xmm0
1508 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002324991,9223372039002324991]
1509 ; SSE41-NEXT:    movdqa %xmm3, %xmm6
1510 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
1511 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
1512 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
1513 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
1514 ; SSE41-NEXT:    pand %xmm6, %xmm0
1515 ; SSE41-NEXT:    por %xmm4, %xmm0
1516 ; SSE41-NEXT:    movapd %xmm2, %xmm4
1517 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
1518 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
1519 ; SSE41-NEXT:    pxor %xmm5, %xmm0
1520 ; SSE41-NEXT:    movdqa %xmm3, %xmm1
1521 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
1522 ; SSE41-NEXT:    movdqa %xmm3, %xmm6
1523 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
1524 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1525 ; SSE41-NEXT:    pand %xmm1, %xmm0
1526 ; SSE41-NEXT:    por %xmm6, %xmm0
1527 ; SSE41-NEXT:    movapd %xmm2, %xmm1
1528 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
1529 ; SSE41-NEXT:    packusdw %xmm4, %xmm1
1530 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
1531 ; SSE41-NEXT:    pxor %xmm5, %xmm0
1532 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
1533 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
1534 ; SSE41-NEXT:    movdqa %xmm3, %xmm6
1535 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
1536 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1537 ; SSE41-NEXT:    pand %xmm4, %xmm0
1538 ; SSE41-NEXT:    por %xmm6, %xmm0
1539 ; SSE41-NEXT:    movapd %xmm2, %xmm4
1540 ; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm4
1541 ; SSE41-NEXT:    pxor %xmm8, %xmm5
1542 ; SSE41-NEXT:    movdqa %xmm3, %xmm6
1543 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm6
1544 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm3
1545 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1546 ; SSE41-NEXT:    pand %xmm6, %xmm0
1547 ; SSE41-NEXT:    por %xmm3, %xmm0
1548 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm2
1549 ; SSE41-NEXT:    packusdw %xmm4, %xmm2
1550 ; SSE41-NEXT:    packusdw %xmm2, %xmm1
1551 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1552 ; SSE41-NEXT:    retq
1554 ; AVX1-LABEL: trunc_usat_v8i64_v8i16:
1555 ; AVX1:       # %bb.0:
1556 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
1557 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
1558 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm2
1559 ; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm3
1560 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
1561 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm5
1562 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [9223372036854841343,9223372036854841343]
1563 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm8
1564 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm7
1565 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm7
1566 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm5
1567 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
1568 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm4
1569 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
1570 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm6 = [65535,65535]
1571 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm6, %xmm3
1572 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm2, %xmm6, %xmm2
1573 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
1574 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm1, %xmm6, %xmm1
1575 ; AVX1-NEXT:    vblendvpd %xmm8, %xmm0, %xmm6, %xmm0
1576 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1577 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
1578 ; AVX1-NEXT:    retq
1580 ; AVX2-LABEL: trunc_usat_v8i64_v8i16:
1581 ; AVX2:       # %bb.0:
1582 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
1583 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
1584 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [65535,65535,65535,65535]
1585 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1586 ; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm4
1587 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343]
1588 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
1589 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
1590 ; AVX2-NEXT:    vpxor %ymm3, %ymm0, %ymm3
1591 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm5, %ymm3
1592 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1593 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
1594 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1595 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1596 ; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1597 ; AVX2-NEXT:    vzeroupper
1598 ; AVX2-NEXT:    retq
1600 ; AVX512-LABEL: trunc_usat_v8i64_v8i16:
1601 ; AVX512:       # %bb.0:
1602 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
1603 ; AVX512-NEXT:    vpmovusqw %zmm0, %xmm0
1604 ; AVX512-NEXT:    vzeroupper
1605 ; AVX512-NEXT:    retq
1607 ; SKX-LABEL: trunc_usat_v8i64_v8i16:
1608 ; SKX:       # %bb.0:
1609 ; SKX-NEXT:    vmovdqa64 (%rdi), %zmm0
1610 ; SKX-NEXT:    vpmovusqw %zmm0, %xmm0
1611 ; SKX-NEXT:    vzeroupper
1612 ; SKX-NEXT:    retq
1613   %a0 = load <8 x i64>, <8 x i64>* %p0
1614   %1 = icmp ult <8 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
1615   %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>
1616   %3 = trunc <8 x i64> %2 to <8 x i16>
1617   ret <8 x i16> %3
1620 define <4 x i16> @trunc_usat_v4i32_v4i16(<4 x i32> %a0) {
1621 ; SSE2-LABEL: trunc_usat_v4i32_v4i16:
1622 ; SSE2:       # %bb.0:
1623 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
1624 ; SSE2-NEXT:    pxor %xmm0, %xmm1
1625 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147549183,2147549183,2147549183,2147549183]
1626 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1627 ; SSE2-NEXT:    pand %xmm2, %xmm0
1628 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
1629 ; SSE2-NEXT:    por %xmm0, %xmm2
1630 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm2[0,2,2,3,4,5,6,7]
1631 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
1632 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1633 ; SSE2-NEXT:    retq
1635 ; SSSE3-LABEL: trunc_usat_v4i32_v4i16:
1636 ; SSSE3:       # %bb.0:
1637 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
1638 ; SSSE3-NEXT:    pxor %xmm0, %xmm1
1639 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147549183,2147549183,2147549183,2147549183]
1640 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
1641 ; SSSE3-NEXT:    pand %xmm2, %xmm0
1642 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
1643 ; SSSE3-NEXT:    por %xmm2, %xmm0
1644 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1645 ; SSSE3-NEXT:    retq
1647 ; SSE41-LABEL: trunc_usat_v4i32_v4i16:
1648 ; SSE41:       # %bb.0:
1649 ; SSE41-NEXT:    pminud {{.*}}(%rip), %xmm0
1650 ; SSE41-NEXT:    packusdw %xmm0, %xmm0
1651 ; SSE41-NEXT:    retq
1653 ; AVX1-LABEL: trunc_usat_v4i32_v4i16:
1654 ; AVX1:       # %bb.0:
1655 ; AVX1-NEXT:    vpminud {{.*}}(%rip), %xmm0, %xmm0
1656 ; AVX1-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
1657 ; AVX1-NEXT:    retq
1659 ; AVX2-LABEL: trunc_usat_v4i32_v4i16:
1660 ; AVX2:       # %bb.0:
1661 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [65535,65535,65535,65535]
1662 ; AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1663 ; AVX2-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
1664 ; AVX2-NEXT:    retq
1666 ; AVX512F-LABEL: trunc_usat_v4i32_v4i16:
1667 ; AVX512F:       # %bb.0:
1668 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1669 ; AVX512F-NEXT:    vpmovusdw %zmm0, %ymm0
1670 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1671 ; AVX512F-NEXT:    vzeroupper
1672 ; AVX512F-NEXT:    retq
1674 ; AVX512VL-LABEL: trunc_usat_v4i32_v4i16:
1675 ; AVX512VL:       # %bb.0:
1676 ; AVX512VL-NEXT:    vpmovusdw %xmm0, %xmm0
1677 ; AVX512VL-NEXT:    retq
1679 ; AVX512BW-LABEL: trunc_usat_v4i32_v4i16:
1680 ; AVX512BW:       # %bb.0:
1681 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1682 ; AVX512BW-NEXT:    vpmovusdw %zmm0, %ymm0
1683 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1684 ; AVX512BW-NEXT:    vzeroupper
1685 ; AVX512BW-NEXT:    retq
1687 ; AVX512BWVL-LABEL: trunc_usat_v4i32_v4i16:
1688 ; AVX512BWVL:       # %bb.0:
1689 ; AVX512BWVL-NEXT:    vpmovusdw %xmm0, %xmm0
1690 ; AVX512BWVL-NEXT:    retq
1692 ; SKX-LABEL: trunc_usat_v4i32_v4i16:
1693 ; SKX:       # %bb.0:
1694 ; SKX-NEXT:    vpmovusdw %xmm0, %xmm0
1695 ; SKX-NEXT:    retq
1696   %1 = icmp ult <4 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535>
1697   %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
1698   %3 = trunc <4 x i32> %2 to <4 x i16>
1699   ret <4 x i16> %3
1702 define void @trunc_usat_v4i32_v4i16_store(<4 x i32> %a0, <4 x i16> *%p1) {
1703 ; SSE2-LABEL: trunc_usat_v4i32_v4i16_store:
1704 ; SSE2:       # %bb.0:
1705 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
1706 ; SSE2-NEXT:    pxor %xmm0, %xmm1
1707 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147549183,2147549183,2147549183,2147549183]
1708 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
1709 ; SSE2-NEXT:    pand %xmm2, %xmm0
1710 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
1711 ; SSE2-NEXT:    por %xmm0, %xmm2
1712 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm2[0,2,2,3,4,5,6,7]
1713 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
1714 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1715 ; SSE2-NEXT:    movq %xmm0, (%rdi)
1716 ; SSE2-NEXT:    retq
1718 ; SSSE3-LABEL: trunc_usat_v4i32_v4i16_store:
1719 ; SSSE3:       # %bb.0:
1720 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
1721 ; SSSE3-NEXT:    pxor %xmm0, %xmm1
1722 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147549183,2147549183,2147549183,2147549183]
1723 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
1724 ; SSSE3-NEXT:    pand %xmm2, %xmm0
1725 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
1726 ; SSSE3-NEXT:    por %xmm0, %xmm2
1727 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1728 ; SSSE3-NEXT:    movq %xmm2, (%rdi)
1729 ; SSSE3-NEXT:    retq
1731 ; SSE41-LABEL: trunc_usat_v4i32_v4i16_store:
1732 ; SSE41:       # %bb.0:
1733 ; SSE41-NEXT:    pminud {{.*}}(%rip), %xmm0
1734 ; SSE41-NEXT:    packusdw %xmm0, %xmm0
1735 ; SSE41-NEXT:    movq %xmm0, (%rdi)
1736 ; SSE41-NEXT:    retq
1738 ; AVX1-LABEL: trunc_usat_v4i32_v4i16_store:
1739 ; AVX1:       # %bb.0:
1740 ; AVX1-NEXT:    vpminud {{.*}}(%rip), %xmm0, %xmm0
1741 ; AVX1-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
1742 ; AVX1-NEXT:    vmovq %xmm0, (%rdi)
1743 ; AVX1-NEXT:    retq
1745 ; AVX2-LABEL: trunc_usat_v4i32_v4i16_store:
1746 ; AVX2:       # %bb.0:
1747 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [65535,65535,65535,65535]
1748 ; AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
1749 ; AVX2-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0
1750 ; AVX2-NEXT:    vmovq %xmm0, (%rdi)
1751 ; AVX2-NEXT:    retq
1753 ; AVX512F-LABEL: trunc_usat_v4i32_v4i16_store:
1754 ; AVX512F:       # %bb.0:
1755 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1756 ; AVX512F-NEXT:    vpmovusdw %zmm0, %ymm0
1757 ; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
1758 ; AVX512F-NEXT:    vzeroupper
1759 ; AVX512F-NEXT:    retq
1761 ; AVX512VL-LABEL: trunc_usat_v4i32_v4i16_store:
1762 ; AVX512VL:       # %bb.0:
1763 ; AVX512VL-NEXT:    vpmovusdw %xmm0, (%rdi)
1764 ; AVX512VL-NEXT:    retq
1766 ; AVX512BW-LABEL: trunc_usat_v4i32_v4i16_store:
1767 ; AVX512BW:       # %bb.0:
1768 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1769 ; AVX512BW-NEXT:    vpmovusdw %zmm0, %ymm0
1770 ; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
1771 ; AVX512BW-NEXT:    vzeroupper
1772 ; AVX512BW-NEXT:    retq
1774 ; AVX512BWVL-LABEL: trunc_usat_v4i32_v4i16_store:
1775 ; AVX512BWVL:       # %bb.0:
1776 ; AVX512BWVL-NEXT:    vpmovusdw %xmm0, (%rdi)
1777 ; AVX512BWVL-NEXT:    retq
1779 ; SKX-LABEL: trunc_usat_v4i32_v4i16_store:
1780 ; SKX:       # %bb.0:
1781 ; SKX-NEXT:    vpmovusdw %xmm0, (%rdi)
1782 ; SKX-NEXT:    retq
1783   %1 = icmp ult <4 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535>
1784   %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
1785   %3 = trunc <4 x i32> %2 to <4 x i16>
1786   store <4 x i16> %3, <4 x i16> *%p1
1787   ret void
1790 define <8 x i16> @trunc_usat_v8i32_v8i16(<8 x i32> %a0) {
1791 ; SSE2-LABEL: trunc_usat_v8i32_v8i16:
1792 ; SSE2:       # %bb.0:
1793 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
1794 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1795 ; SSE2-NEXT:    pxor %xmm2, %xmm3
1796 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147549183,2147549183,2147549183,2147549183]
1797 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
1798 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
1799 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm3
1800 ; SSE2-NEXT:    pand %xmm5, %xmm0
1801 ; SSE2-NEXT:    pxor %xmm3, %xmm5
1802 ; SSE2-NEXT:    por %xmm5, %xmm0
1803 ; SSE2-NEXT:    pxor %xmm1, %xmm2
1804 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
1805 ; SSE2-NEXT:    pxor %xmm4, %xmm3
1806 ; SSE2-NEXT:    pand %xmm1, %xmm4
1807 ; SSE2-NEXT:    por %xmm3, %xmm4
1808 ; SSE2-NEXT:    pslld $16, %xmm4
1809 ; SSE2-NEXT:    psrad $16, %xmm4
1810 ; SSE2-NEXT:    pslld $16, %xmm0
1811 ; SSE2-NEXT:    psrad $16, %xmm0
1812 ; SSE2-NEXT:    packssdw %xmm4, %xmm0
1813 ; SSE2-NEXT:    retq
1815 ; SSSE3-LABEL: trunc_usat_v8i32_v8i16:
1816 ; SSSE3:       # %bb.0:
1817 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
1818 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
1819 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
1820 ; SSSE3-NEXT:    pxor %xmm3, %xmm4
1821 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
1822 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
1823 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
1824 ; SSSE3-NEXT:    pand %xmm6, %xmm0
1825 ; SSSE3-NEXT:    pandn %xmm2, %xmm6
1826 ; SSSE3-NEXT:    por %xmm6, %xmm0
1827 ; SSSE3-NEXT:    pxor %xmm1, %xmm3
1828 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
1829 ; SSSE3-NEXT:    pand %xmm5, %xmm1
1830 ; SSSE3-NEXT:    pandn %xmm2, %xmm5
1831 ; SSSE3-NEXT:    por %xmm1, %xmm5
1832 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1833 ; SSSE3-NEXT:    pshufb %xmm1, %xmm5
1834 ; SSSE3-NEXT:    pshufb %xmm1, %xmm0
1835 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0]
1836 ; SSSE3-NEXT:    retq
1838 ; SSE41-LABEL: trunc_usat_v8i32_v8i16:
1839 ; SSE41:       # %bb.0:
1840 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
1841 ; SSE41-NEXT:    pminud %xmm2, %xmm1
1842 ; SSE41-NEXT:    pminud %xmm2, %xmm0
1843 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
1844 ; SSE41-NEXT:    retq
1846 ; AVX1-LABEL: trunc_usat_v8i32_v8i16:
1847 ; AVX1:       # %bb.0:
1848 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1849 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
1850 ; AVX1-NEXT:    vpminud %xmm2, %xmm1, %xmm1
1851 ; AVX1-NEXT:    vpminud %xmm2, %xmm0, %xmm0
1852 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1853 ; AVX1-NEXT:    vzeroupper
1854 ; AVX1-NEXT:    retq
1856 ; AVX2-LABEL: trunc_usat_v8i32_v8i16:
1857 ; AVX2:       # %bb.0:
1858 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535]
1859 ; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
1860 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1861 ; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1862 ; AVX2-NEXT:    vzeroupper
1863 ; AVX2-NEXT:    retq
1865 ; AVX512F-LABEL: trunc_usat_v8i32_v8i16:
1866 ; AVX512F:       # %bb.0:
1867 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1868 ; AVX512F-NEXT:    vpmovusdw %zmm0, %ymm0
1869 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1870 ; AVX512F-NEXT:    vzeroupper
1871 ; AVX512F-NEXT:    retq
1873 ; AVX512VL-LABEL: trunc_usat_v8i32_v8i16:
1874 ; AVX512VL:       # %bb.0:
1875 ; AVX512VL-NEXT:    vpmovusdw %ymm0, %xmm0
1876 ; AVX512VL-NEXT:    vzeroupper
1877 ; AVX512VL-NEXT:    retq
1879 ; AVX512BW-LABEL: trunc_usat_v8i32_v8i16:
1880 ; AVX512BW:       # %bb.0:
1881 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1882 ; AVX512BW-NEXT:    vpmovusdw %zmm0, %ymm0
1883 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1884 ; AVX512BW-NEXT:    vzeroupper
1885 ; AVX512BW-NEXT:    retq
1887 ; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i16:
1888 ; AVX512BWVL:       # %bb.0:
1889 ; AVX512BWVL-NEXT:    vpmovusdw %ymm0, %xmm0
1890 ; AVX512BWVL-NEXT:    vzeroupper
1891 ; AVX512BWVL-NEXT:    retq
1893 ; SKX-LABEL: trunc_usat_v8i32_v8i16:
1894 ; SKX:       # %bb.0:
1895 ; SKX-NEXT:    vpmovusdw %ymm0, %xmm0
1896 ; SKX-NEXT:    vzeroupper
1897 ; SKX-NEXT:    retq
1898   %1 = icmp ult <8 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
1899   %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>
1900   %3 = trunc <8 x i32> %2 to <8 x i16>
1901   ret <8 x i16> %3
1904 define <16 x i16> @trunc_usat_v16i32_v16i16(<16 x i32>* %p0) {
1905 ; SSE2-LABEL: trunc_usat_v16i32_v16i16:
1906 ; SSE2:       # %bb.0:
1907 ; SSE2-NEXT:    movdqa (%rdi), %xmm5
1908 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm8
1909 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm0
1910 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm4
1911 ; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
1912 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
1913 ; SSE2-NEXT:    pxor %xmm6, %xmm3
1914 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147549183,2147549183,2147549183,2147549183]
1915 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1916 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm1
1917 ; SSE2-NEXT:    pcmpeqd %xmm7, %xmm7
1918 ; SSE2-NEXT:    pand %xmm1, %xmm0
1919 ; SSE2-NEXT:    pxor %xmm7, %xmm1
1920 ; SSE2-NEXT:    por %xmm0, %xmm1
1921 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
1922 ; SSE2-NEXT:    pxor %xmm6, %xmm0
1923 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
1924 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1925 ; SSE2-NEXT:    pand %xmm3, %xmm4
1926 ; SSE2-NEXT:    pxor %xmm7, %xmm3
1927 ; SSE2-NEXT:    por %xmm4, %xmm3
1928 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
1929 ; SSE2-NEXT:    pxor %xmm6, %xmm4
1930 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
1931 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm0
1932 ; SSE2-NEXT:    pand %xmm0, %xmm5
1933 ; SSE2-NEXT:    pxor %xmm7, %xmm0
1934 ; SSE2-NEXT:    por %xmm5, %xmm0
1935 ; SSE2-NEXT:    pxor %xmm8, %xmm6
1936 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm2
1937 ; SSE2-NEXT:    pxor %xmm2, %xmm7
1938 ; SSE2-NEXT:    pand %xmm8, %xmm2
1939 ; SSE2-NEXT:    por %xmm7, %xmm2
1940 ; SSE2-NEXT:    pslld $16, %xmm2
1941 ; SSE2-NEXT:    psrad $16, %xmm2
1942 ; SSE2-NEXT:    pslld $16, %xmm0
1943 ; SSE2-NEXT:    psrad $16, %xmm0
1944 ; SSE2-NEXT:    packssdw %xmm2, %xmm0
1945 ; SSE2-NEXT:    pslld $16, %xmm3
1946 ; SSE2-NEXT:    psrad $16, %xmm3
1947 ; SSE2-NEXT:    pslld $16, %xmm1
1948 ; SSE2-NEXT:    psrad $16, %xmm1
1949 ; SSE2-NEXT:    packssdw %xmm3, %xmm1
1950 ; SSE2-NEXT:    retq
1952 ; SSSE3-LABEL: trunc_usat_v16i32_v16i16:
1953 ; SSSE3:       # %bb.0:
1954 ; SSSE3-NEXT:    movdqa (%rdi), %xmm5
1955 ; SSSE3-NEXT:    movdqa 16(%rdi), %xmm8
1956 ; SSSE3-NEXT:    movdqa 32(%rdi), %xmm0
1957 ; SSSE3-NEXT:    movdqa 48(%rdi), %xmm4
1958 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
1959 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
1960 ; SSSE3-NEXT:    pxor %xmm6, %xmm3
1961 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147549183,2147549183,2147549183,2147549183]
1962 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1963 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm1
1964 ; SSSE3-NEXT:    pcmpeqd %xmm7, %xmm7
1965 ; SSSE3-NEXT:    pand %xmm1, %xmm0
1966 ; SSSE3-NEXT:    pxor %xmm7, %xmm1
1967 ; SSSE3-NEXT:    por %xmm0, %xmm1
1968 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
1969 ; SSSE3-NEXT:    pxor %xmm6, %xmm0
1970 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
1971 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm3
1972 ; SSSE3-NEXT:    pand %xmm3, %xmm4
1973 ; SSSE3-NEXT:    pxor %xmm7, %xmm3
1974 ; SSSE3-NEXT:    por %xmm4, %xmm3
1975 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
1976 ; SSSE3-NEXT:    pxor %xmm6, %xmm4
1977 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
1978 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm0
1979 ; SSSE3-NEXT:    pand %xmm0, %xmm5
1980 ; SSSE3-NEXT:    pxor %xmm7, %xmm0
1981 ; SSSE3-NEXT:    por %xmm5, %xmm0
1982 ; SSSE3-NEXT:    pxor %xmm8, %xmm6
1983 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm2
1984 ; SSSE3-NEXT:    pxor %xmm2, %xmm7
1985 ; SSSE3-NEXT:    pand %xmm8, %xmm2
1986 ; SSSE3-NEXT:    por %xmm7, %xmm2
1987 ; SSSE3-NEXT:    pslld $16, %xmm2
1988 ; SSSE3-NEXT:    psrad $16, %xmm2
1989 ; SSSE3-NEXT:    pslld $16, %xmm0
1990 ; SSSE3-NEXT:    psrad $16, %xmm0
1991 ; SSSE3-NEXT:    packssdw %xmm2, %xmm0
1992 ; SSSE3-NEXT:    pslld $16, %xmm3
1993 ; SSSE3-NEXT:    psrad $16, %xmm3
1994 ; SSSE3-NEXT:    pslld $16, %xmm1
1995 ; SSSE3-NEXT:    psrad $16, %xmm1
1996 ; SSSE3-NEXT:    packssdw %xmm3, %xmm1
1997 ; SSSE3-NEXT:    retq
1999 ; SSE41-LABEL: trunc_usat_v16i32_v16i16:
2000 ; SSE41:       # %bb.0:
2001 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [65535,65535,65535,65535]
2002 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm2
2003 ; SSE41-NEXT:    pminud %xmm0, %xmm2
2004 ; SSE41-NEXT:    movdqa 32(%rdi), %xmm1
2005 ; SSE41-NEXT:    pminud %xmm0, %xmm1
2006 ; SSE41-NEXT:    packusdw %xmm2, %xmm1
2007 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm2
2008 ; SSE41-NEXT:    pminud %xmm0, %xmm2
2009 ; SSE41-NEXT:    pminud (%rdi), %xmm0
2010 ; SSE41-NEXT:    packusdw %xmm2, %xmm0
2011 ; SSE41-NEXT:    retq
2013 ; AVX1-LABEL: trunc_usat_v16i32_v16i16:
2014 ; AVX1:       # %bb.0:
2015 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm0 = [65535,65535,65535,65535]
2016 ; AVX1-NEXT:    vpminud 16(%rdi), %xmm0, %xmm1
2017 ; AVX1-NEXT:    vpminud (%rdi), %xmm0, %xmm2
2018 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm2, %xmm1
2019 ; AVX1-NEXT:    vpminud 48(%rdi), %xmm0, %xmm2
2020 ; AVX1-NEXT:    vpminud 32(%rdi), %xmm0, %xmm0
2021 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
2022 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
2023 ; AVX1-NEXT:    retq
2025 ; AVX2-LABEL: trunc_usat_v16i32_v16i16:
2026 ; AVX2:       # %bb.0:
2027 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm0 = [65535,65535,65535,65535,65535,65535,65535,65535]
2028 ; AVX2-NEXT:    vpminud 32(%rdi), %ymm0, %ymm1
2029 ; AVX2-NEXT:    vpminud (%rdi), %ymm0, %ymm0
2030 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
2031 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2032 ; AVX2-NEXT:    retq
2034 ; AVX512-LABEL: trunc_usat_v16i32_v16i16:
2035 ; AVX512:       # %bb.0:
2036 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
2037 ; AVX512-NEXT:    vpmovusdw %zmm0, %ymm0
2038 ; AVX512-NEXT:    retq
2040 ; SKX-LABEL: trunc_usat_v16i32_v16i16:
2041 ; SKX:       # %bb.0:
2042 ; SKX-NEXT:    vmovdqa64 (%rdi), %zmm0
2043 ; SKX-NEXT:    vpmovusdw %zmm0, %ymm0
2044 ; SKX-NEXT:    retq
2045   %a0 = load <16 x i32>, <16 x i32>* %p0
2046   %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>
2047   %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>
2048   %3 = trunc <16 x i32> %2 to <16 x i16>
2049   ret <16 x i16> %3
2053 ; Unsigned saturation truncation to vXi8
2056 define <2 x i8> @trunc_usat_v2i64_v2i8(<2 x i64> %a0) {
2057 ; SSE2-LABEL: trunc_usat_v2i64_v2i8:
2058 ; SSE2:       # %bb.0:
2059 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
2060 ; SSE2-NEXT:    pxor %xmm0, %xmm1
2061 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259711,9223372039002259711]
2062 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
2063 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
2064 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2065 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
2066 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
2067 ; SSE2-NEXT:    pand %xmm4, %xmm2
2068 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
2069 ; SSE2-NEXT:    por %xmm2, %xmm1
2070 ; SSE2-NEXT:    pand %xmm1, %xmm0
2071 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm1
2072 ; SSE2-NEXT:    por %xmm0, %xmm1
2073 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
2074 ; SSE2-NEXT:    packuswb %xmm1, %xmm1
2075 ; SSE2-NEXT:    packuswb %xmm1, %xmm1
2076 ; SSE2-NEXT:    packuswb %xmm1, %xmm1
2077 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
2078 ; SSE2-NEXT:    retq
2080 ; SSSE3-LABEL: trunc_usat_v2i64_v2i8:
2081 ; SSSE3:       # %bb.0:
2082 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
2083 ; SSSE3-NEXT:    pxor %xmm0, %xmm1
2084 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259711,9223372039002259711]
2085 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
2086 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
2087 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2088 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm1
2089 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2090 ; SSSE3-NEXT:    pand %xmm4, %xmm1
2091 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
2092 ; SSSE3-NEXT:    por %xmm1, %xmm2
2093 ; SSSE3-NEXT:    pand %xmm2, %xmm0
2094 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
2095 ; SSSE3-NEXT:    por %xmm2, %xmm0
2096 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2097 ; SSSE3-NEXT:    retq
2099 ; SSE41-LABEL: trunc_usat_v2i64_v2i8:
2100 ; SSE41:       # %bb.0:
2101 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
2102 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [255,255]
2103 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
2104 ; SSE41-NEXT:    pxor %xmm1, %xmm0
2105 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259711,9223372039002259711]
2106 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
2107 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
2108 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
2109 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2110 ; SSE41-NEXT:    pand %xmm4, %xmm0
2111 ; SSE41-NEXT:    por %xmm3, %xmm0
2112 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
2113 ; SSE41-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2114 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
2115 ; SSE41-NEXT:    retq
2117 ; AVX-LABEL: trunc_usat_v2i64_v2i8:
2118 ; AVX:       # %bb.0:
2119 ; AVX-NEXT:    vmovapd {{.*#+}} xmm1 = [255,255]
2120 ; AVX-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm2
2121 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854776063,9223372036854776063]
2122 ; AVX-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
2123 ; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2124 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2125 ; AVX-NEXT:    retq
2127 ; AVX512F-LABEL: trunc_usat_v2i64_v2i8:
2128 ; AVX512F:       # %bb.0:
2129 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2130 ; AVX512F-NEXT:    vpmovusqb %zmm0, %xmm0
2131 ; AVX512F-NEXT:    vzeroupper
2132 ; AVX512F-NEXT:    retq
2134 ; AVX512VL-LABEL: trunc_usat_v2i64_v2i8:
2135 ; AVX512VL:       # %bb.0:
2136 ; AVX512VL-NEXT:    vpmovusqb %xmm0, %xmm0
2137 ; AVX512VL-NEXT:    retq
2139 ; AVX512BW-LABEL: trunc_usat_v2i64_v2i8:
2140 ; AVX512BW:       # %bb.0:
2141 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2142 ; AVX512BW-NEXT:    vpmovusqb %zmm0, %xmm0
2143 ; AVX512BW-NEXT:    vzeroupper
2144 ; AVX512BW-NEXT:    retq
2146 ; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i8:
2147 ; AVX512BWVL:       # %bb.0:
2148 ; AVX512BWVL-NEXT:    vpmovusqb %xmm0, %xmm0
2149 ; AVX512BWVL-NEXT:    retq
2151 ; SKX-LABEL: trunc_usat_v2i64_v2i8:
2152 ; SKX:       # %bb.0:
2153 ; SKX-NEXT:    vpmovusqb %xmm0, %xmm0
2154 ; SKX-NEXT:    retq
2155   %1 = icmp ult <2 x i64> %a0, <i64 255, i64 255>
2156   %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 255, i64 255>
2157   %3 = trunc <2 x i64> %2 to <2 x i8>
2158   ret <2 x i8> %3
2161 define void @trunc_usat_v2i64_v2i8_store(<2 x i64> %a0, <2 x i8>* %p1) {
2162 ; SSE2-LABEL: trunc_usat_v2i64_v2i8_store:
2163 ; SSE2:       # %bb.0:
2164 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
2165 ; SSE2-NEXT:    pxor %xmm0, %xmm1
2166 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259711,9223372039002259711]
2167 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
2168 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
2169 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2170 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm1
2171 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2172 ; SSE2-NEXT:    pand %xmm4, %xmm1
2173 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
2174 ; SSE2-NEXT:    por %xmm1, %xmm2
2175 ; SSE2-NEXT:    pand %xmm2, %xmm0
2176 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
2177 ; SSE2-NEXT:    por %xmm0, %xmm2
2178 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
2179 ; SSE2-NEXT:    packuswb %xmm2, %xmm2
2180 ; SSE2-NEXT:    packuswb %xmm0, %xmm2
2181 ; SSE2-NEXT:    packuswb %xmm0, %xmm2
2182 ; SSE2-NEXT:    movd %xmm2, %eax
2183 ; SSE2-NEXT:    movw %ax, (%rdi)
2184 ; SSE2-NEXT:    retq
2186 ; SSSE3-LABEL: trunc_usat_v2i64_v2i8_store:
2187 ; SSSE3:       # %bb.0:
2188 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
2189 ; SSSE3-NEXT:    pxor %xmm0, %xmm1
2190 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259711,9223372039002259711]
2191 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
2192 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
2193 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2194 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm1
2195 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2196 ; SSSE3-NEXT:    pand %xmm4, %xmm1
2197 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
2198 ; SSSE3-NEXT:    por %xmm1, %xmm2
2199 ; SSSE3-NEXT:    pand %xmm2, %xmm0
2200 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
2201 ; SSSE3-NEXT:    por %xmm0, %xmm2
2202 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2203 ; SSSE3-NEXT:    movd %xmm2, %eax
2204 ; SSSE3-NEXT:    movw %ax, (%rdi)
2205 ; SSSE3-NEXT:    retq
2207 ; SSE41-LABEL: trunc_usat_v2i64_v2i8_store:
2208 ; SSE41:       # %bb.0:
2209 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
2210 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [255,255]
2211 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
2212 ; SSE41-NEXT:    pxor %xmm1, %xmm0
2213 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259711,9223372039002259711]
2214 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
2215 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
2216 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
2217 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2218 ; SSE41-NEXT:    pand %xmm4, %xmm0
2219 ; SSE41-NEXT:    por %xmm3, %xmm0
2220 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
2221 ; SSE41-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2222 ; SSE41-NEXT:    pextrw $0, %xmm2, (%rdi)
2223 ; SSE41-NEXT:    retq
2225 ; AVX-LABEL: trunc_usat_v2i64_v2i8_store:
2226 ; AVX:       # %bb.0:
2227 ; AVX-NEXT:    vmovapd {{.*#+}} xmm1 = [255,255]
2228 ; AVX-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm2
2229 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854776063,9223372036854776063]
2230 ; AVX-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
2231 ; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2232 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2233 ; AVX-NEXT:    vpextrw $0, %xmm0, (%rdi)
2234 ; AVX-NEXT:    retq
2236 ; AVX512F-LABEL: trunc_usat_v2i64_v2i8_store:
2237 ; AVX512F:       # %bb.0:
2238 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2239 ; AVX512F-NEXT:    vpmovusqb %zmm0, %xmm0
2240 ; AVX512F-NEXT:    vpextrw $0, %xmm0, (%rdi)
2241 ; AVX512F-NEXT:    vzeroupper
2242 ; AVX512F-NEXT:    retq
2244 ; AVX512VL-LABEL: trunc_usat_v2i64_v2i8_store:
2245 ; AVX512VL:       # %bb.0:
2246 ; AVX512VL-NEXT:    vpmovusqb %xmm0, (%rdi)
2247 ; AVX512VL-NEXT:    retq
2249 ; AVX512BW-LABEL: trunc_usat_v2i64_v2i8_store:
2250 ; AVX512BW:       # %bb.0:
2251 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2252 ; AVX512BW-NEXT:    vpmovusqb %zmm0, %xmm0
2253 ; AVX512BW-NEXT:    vpextrw $0, %xmm0, (%rdi)
2254 ; AVX512BW-NEXT:    vzeroupper
2255 ; AVX512BW-NEXT:    retq
2257 ; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i8_store:
2258 ; AVX512BWVL:       # %bb.0:
2259 ; AVX512BWVL-NEXT:    vpmovusqb %xmm0, (%rdi)
2260 ; AVX512BWVL-NEXT:    retq
2262 ; SKX-LABEL: trunc_usat_v2i64_v2i8_store:
2263 ; SKX:       # %bb.0:
2264 ; SKX-NEXT:    vpmovusqb %xmm0, (%rdi)
2265 ; SKX-NEXT:    retq
2266   %1 = icmp ult <2 x i64> %a0, <i64 255, i64 255>
2267   %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 255, i64 255>
2268   %3 = trunc <2 x i64> %2 to <2 x i8>
2269   store <2 x i8> %3, <2 x i8>* %p1
2270   ret void
2273 define <4 x i8> @trunc_usat_v4i64_v4i8(<4 x i64> %a0) {
2274 ; SSE2-LABEL: trunc_usat_v4i64_v4i8:
2275 ; SSE2:       # %bb.0:
2276 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
2277 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
2278 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
2279 ; SSE2-NEXT:    pxor %xmm4, %xmm0
2280 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259711,9223372039002259711]
2281 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
2282 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
2283 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2284 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm0
2285 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
2286 ; SSE2-NEXT:    pand %xmm7, %xmm3
2287 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
2288 ; SSE2-NEXT:    por %xmm3, %xmm0
2289 ; SSE2-NEXT:    pand %xmm0, %xmm2
2290 ; SSE2-NEXT:    pandn %xmm8, %xmm0
2291 ; SSE2-NEXT:    por %xmm2, %xmm0
2292 ; SSE2-NEXT:    pxor %xmm1, %xmm4
2293 ; SSE2-NEXT:    movdqa %xmm5, %xmm2
2294 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
2295 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
2296 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
2297 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2298 ; SSE2-NEXT:    pand %xmm3, %xmm4
2299 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2300 ; SSE2-NEXT:    por %xmm4, %xmm2
2301 ; SSE2-NEXT:    pand %xmm2, %xmm1
2302 ; SSE2-NEXT:    pandn %xmm8, %xmm2
2303 ; SSE2-NEXT:    por %xmm1, %xmm2
2304 ; SSE2-NEXT:    pand %xmm8, %xmm2
2305 ; SSE2-NEXT:    pand %xmm8, %xmm0
2306 ; SSE2-NEXT:    packuswb %xmm2, %xmm0
2307 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
2308 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
2309 ; SSE2-NEXT:    retq
2311 ; SSSE3-LABEL: trunc_usat_v4i64_v4i8:
2312 ; SSSE3:       # %bb.0:
2313 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [255,255]
2314 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
2315 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
2316 ; SSSE3-NEXT:    pxor %xmm3, %xmm4
2317 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259711,9223372039002259711]
2318 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
2319 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
2320 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2321 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm4
2322 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2323 ; SSSE3-NEXT:    pand %xmm7, %xmm4
2324 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2325 ; SSSE3-NEXT:    por %xmm4, %xmm6
2326 ; SSSE3-NEXT:    pand %xmm6, %xmm0
2327 ; SSSE3-NEXT:    pandn %xmm2, %xmm6
2328 ; SSSE3-NEXT:    por %xmm6, %xmm0
2329 ; SSSE3-NEXT:    pxor %xmm1, %xmm3
2330 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
2331 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
2332 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2333 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm3
2334 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2335 ; SSSE3-NEXT:    pand %xmm6, %xmm3
2336 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2337 ; SSSE3-NEXT:    por %xmm3, %xmm4
2338 ; SSSE3-NEXT:    pand %xmm4, %xmm1
2339 ; SSSE3-NEXT:    pandn %xmm2, %xmm4
2340 ; SSSE3-NEXT:    por %xmm1, %xmm4
2341 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2342 ; SSSE3-NEXT:    pshufb %xmm1, %xmm4
2343 ; SSSE3-NEXT:    pshufb %xmm1, %xmm0
2344 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3]
2345 ; SSSE3-NEXT:    retq
2347 ; SSE41-LABEL: trunc_usat_v4i64_v4i8:
2348 ; SSE41:       # %bb.0:
2349 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
2350 ; SSE41-NEXT:    movapd {{.*#+}} xmm4 = [255,255]
2351 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
2352 ; SSE41-NEXT:    pxor %xmm5, %xmm0
2353 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [9223372039002259711,9223372039002259711]
2354 ; SSE41-NEXT:    movdqa %xmm6, %xmm3
2355 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
2356 ; SSE41-NEXT:    movdqa %xmm6, %xmm7
2357 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
2358 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
2359 ; SSE41-NEXT:    pand %xmm3, %xmm0
2360 ; SSE41-NEXT:    por %xmm7, %xmm0
2361 ; SSE41-NEXT:    movapd %xmm4, %xmm3
2362 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
2363 ; SSE41-NEXT:    pxor %xmm1, %xmm5
2364 ; SSE41-NEXT:    movdqa %xmm6, %xmm2
2365 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm2
2366 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm6
2367 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2368 ; SSE41-NEXT:    pand %xmm2, %xmm0
2369 ; SSE41-NEXT:    por %xmm6, %xmm0
2370 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
2371 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2372 ; SSE41-NEXT:    pshufb %xmm0, %xmm4
2373 ; SSE41-NEXT:    pshufb %xmm0, %xmm3
2374 ; SSE41-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3]
2375 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
2376 ; SSE41-NEXT:    retq
2378 ; AVX1-LABEL: trunc_usat_v4i64_v4i8:
2379 ; AVX1:       # %bb.0:
2380 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
2381 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm2
2382 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854776063,9223372036854776063]
2383 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
2384 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
2385 ; AVX1-NEXT:    vpxor %xmm1, %xmm4, %xmm1
2386 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
2387 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm3 = [255,255]
2388 ; AVX1-NEXT:    vblendvpd %xmm1, %xmm4, %xmm3, %xmm1
2389 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2390 ; AVX1-NEXT:    vpshufb %xmm4, %xmm1, %xmm1
2391 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
2392 ; AVX1-NEXT:    vpshufb %xmm4, %xmm0, %xmm0
2393 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2394 ; AVX1-NEXT:    vzeroupper
2395 ; AVX1-NEXT:    retq
2397 ; AVX2-LABEL: trunc_usat_v4i64_v4i8:
2398 ; AVX2:       # %bb.0:
2399 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [255,255,255,255]
2400 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2401 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm2
2402 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
2403 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm3, %ymm2
2404 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
2405 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
2406 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2407 ; AVX2-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
2408 ; AVX2-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
2409 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2410 ; AVX2-NEXT:    vzeroupper
2411 ; AVX2-NEXT:    retq
2413 ; AVX512F-LABEL: trunc_usat_v4i64_v4i8:
2414 ; AVX512F:       # %bb.0:
2415 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2416 ; AVX512F-NEXT:    vpmovusqb %zmm0, %xmm0
2417 ; AVX512F-NEXT:    vzeroupper
2418 ; AVX512F-NEXT:    retq
2420 ; AVX512VL-LABEL: trunc_usat_v4i64_v4i8:
2421 ; AVX512VL:       # %bb.0:
2422 ; AVX512VL-NEXT:    vpmovusqb %ymm0, %xmm0
2423 ; AVX512VL-NEXT:    vzeroupper
2424 ; AVX512VL-NEXT:    retq
2426 ; AVX512BW-LABEL: trunc_usat_v4i64_v4i8:
2427 ; AVX512BW:       # %bb.0:
2428 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2429 ; AVX512BW-NEXT:    vpmovusqb %zmm0, %xmm0
2430 ; AVX512BW-NEXT:    vzeroupper
2431 ; AVX512BW-NEXT:    retq
2433 ; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i8:
2434 ; AVX512BWVL:       # %bb.0:
2435 ; AVX512BWVL-NEXT:    vpmovusqb %ymm0, %xmm0
2436 ; AVX512BWVL-NEXT:    vzeroupper
2437 ; AVX512BWVL-NEXT:    retq
2439 ; SKX-LABEL: trunc_usat_v4i64_v4i8:
2440 ; SKX:       # %bb.0:
2441 ; SKX-NEXT:    vpmovusqb %ymm0, %xmm0
2442 ; SKX-NEXT:    vzeroupper
2443 ; SKX-NEXT:    retq
2444   %1 = icmp ult <4 x i64> %a0, <i64 255, i64 255, i64 255, i64 255>
2445   %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 255, i64 255, i64 255, i64 255>
2446   %3 = trunc <4 x i64> %2 to <4 x i8>
2447   ret <4 x i8> %3
2450 define void @trunc_usat_v4i64_v4i8_store(<4 x i64> %a0, <4 x i8> *%p1) {
2451 ; SSE2-LABEL: trunc_usat_v4i64_v4i8_store:
2452 ; SSE2:       # %bb.0:
2453 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
2454 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
2455 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
2456 ; SSE2-NEXT:    pxor %xmm4, %xmm3
2457 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259711,9223372039002259711]
2458 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
2459 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
2460 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2461 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
2462 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
2463 ; SSE2-NEXT:    pand %xmm7, %xmm2
2464 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
2465 ; SSE2-NEXT:    por %xmm2, %xmm3
2466 ; SSE2-NEXT:    pand %xmm3, %xmm0
2467 ; SSE2-NEXT:    pandn %xmm8, %xmm3
2468 ; SSE2-NEXT:    por %xmm0, %xmm3
2469 ; SSE2-NEXT:    pxor %xmm1, %xmm4
2470 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
2471 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm0
2472 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
2473 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
2474 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2475 ; SSE2-NEXT:    pand %xmm2, %xmm4
2476 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2477 ; SSE2-NEXT:    por %xmm4, %xmm0
2478 ; SSE2-NEXT:    pand %xmm0, %xmm1
2479 ; SSE2-NEXT:    pandn %xmm8, %xmm0
2480 ; SSE2-NEXT:    por %xmm1, %xmm0
2481 ; SSE2-NEXT:    pand %xmm8, %xmm0
2482 ; SSE2-NEXT:    pand %xmm8, %xmm3
2483 ; SSE2-NEXT:    packuswb %xmm0, %xmm3
2484 ; SSE2-NEXT:    packuswb %xmm0, %xmm3
2485 ; SSE2-NEXT:    packuswb %xmm0, %xmm3
2486 ; SSE2-NEXT:    movd %xmm3, (%rdi)
2487 ; SSE2-NEXT:    retq
2489 ; SSSE3-LABEL: trunc_usat_v4i64_v4i8_store:
2490 ; SSSE3:       # %bb.0:
2491 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
2492 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
2493 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
2494 ; SSSE3-NEXT:    pxor %xmm4, %xmm3
2495 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259711,9223372039002259711]
2496 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
2497 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm6
2498 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2499 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm3
2500 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
2501 ; SSSE3-NEXT:    pand %xmm7, %xmm2
2502 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
2503 ; SSSE3-NEXT:    por %xmm2, %xmm3
2504 ; SSSE3-NEXT:    pand %xmm3, %xmm0
2505 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
2506 ; SSSE3-NEXT:    por %xmm0, %xmm3
2507 ; SSSE3-NEXT:    pxor %xmm1, %xmm4
2508 ; SSSE3-NEXT:    movdqa %xmm5, %xmm0
2509 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm0
2510 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
2511 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm4
2512 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2513 ; SSSE3-NEXT:    pand %xmm2, %xmm4
2514 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2515 ; SSSE3-NEXT:    por %xmm4, %xmm0
2516 ; SSSE3-NEXT:    pand %xmm0, %xmm1
2517 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
2518 ; SSSE3-NEXT:    por %xmm1, %xmm0
2519 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2520 ; SSSE3-NEXT:    pshufb %xmm1, %xmm0
2521 ; SSSE3-NEXT:    pshufb %xmm1, %xmm3
2522 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3]
2523 ; SSSE3-NEXT:    movd %xmm3, (%rdi)
2524 ; SSSE3-NEXT:    retq
2526 ; SSE41-LABEL: trunc_usat_v4i64_v4i8_store:
2527 ; SSE41:       # %bb.0:
2528 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
2529 ; SSE41-NEXT:    movapd {{.*#+}} xmm3 = [255,255]
2530 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
2531 ; SSE41-NEXT:    pxor %xmm4, %xmm0
2532 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259711,9223372039002259711]
2533 ; SSE41-NEXT:    movdqa %xmm5, %xmm6
2534 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
2535 ; SSE41-NEXT:    movdqa %xmm5, %xmm7
2536 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
2537 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
2538 ; SSE41-NEXT:    pand %xmm6, %xmm0
2539 ; SSE41-NEXT:    por %xmm7, %xmm0
2540 ; SSE41-NEXT:    movapd %xmm3, %xmm6
2541 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm6
2542 ; SSE41-NEXT:    pxor %xmm1, %xmm4
2543 ; SSE41-NEXT:    movdqa %xmm5, %xmm2
2544 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm2
2545 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm5
2546 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
2547 ; SSE41-NEXT:    pand %xmm2, %xmm0
2548 ; SSE41-NEXT:    por %xmm5, %xmm0
2549 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
2550 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2551 ; SSE41-NEXT:    pshufb %xmm0, %xmm3
2552 ; SSE41-NEXT:    pshufb %xmm0, %xmm6
2553 ; SSE41-NEXT:    punpcklwd {{.*#+}} xmm6 = xmm6[0],xmm3[0],xmm6[1],xmm3[1],xmm6[2],xmm3[2],xmm6[3],xmm3[3]
2554 ; SSE41-NEXT:    movd %xmm6, (%rdi)
2555 ; SSE41-NEXT:    retq
2557 ; AVX1-LABEL: trunc_usat_v4i64_v4i8_store:
2558 ; AVX1:       # %bb.0:
2559 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
2560 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm2
2561 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [9223372036854776063,9223372036854776063]
2562 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
2563 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
2564 ; AVX1-NEXT:    vpxor %xmm1, %xmm4, %xmm1
2565 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm1
2566 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm3 = [255,255]
2567 ; AVX1-NEXT:    vblendvpd %xmm1, %xmm4, %xmm3, %xmm1
2568 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2569 ; AVX1-NEXT:    vpshufb %xmm4, %xmm1, %xmm1
2570 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
2571 ; AVX1-NEXT:    vpshufb %xmm4, %xmm0, %xmm0
2572 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2573 ; AVX1-NEXT:    vmovd %xmm0, (%rdi)
2574 ; AVX1-NEXT:    vzeroupper
2575 ; AVX1-NEXT:    retq
2577 ; AVX2-LABEL: trunc_usat_v4i64_v4i8_store:
2578 ; AVX2:       # %bb.0:
2579 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm1 = [255,255,255,255]
2580 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2581 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm2
2582 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
2583 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm3, %ymm2
2584 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
2585 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
2586 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2587 ; AVX2-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
2588 ; AVX2-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
2589 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2590 ; AVX2-NEXT:    vmovd %xmm0, (%rdi)
2591 ; AVX2-NEXT:    vzeroupper
2592 ; AVX2-NEXT:    retq
2594 ; AVX512F-LABEL: trunc_usat_v4i64_v4i8_store:
2595 ; AVX512F:       # %bb.0:
2596 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2597 ; AVX512F-NEXT:    vpmovusqb %zmm0, %xmm0
2598 ; AVX512F-NEXT:    vmovd %xmm0, (%rdi)
2599 ; AVX512F-NEXT:    vzeroupper
2600 ; AVX512F-NEXT:    retq
2602 ; AVX512VL-LABEL: trunc_usat_v4i64_v4i8_store:
2603 ; AVX512VL:       # %bb.0:
2604 ; AVX512VL-NEXT:    vpmovusqb %ymm0, (%rdi)
2605 ; AVX512VL-NEXT:    vzeroupper
2606 ; AVX512VL-NEXT:    retq
2608 ; AVX512BW-LABEL: trunc_usat_v4i64_v4i8_store:
2609 ; AVX512BW:       # %bb.0:
2610 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2611 ; AVX512BW-NEXT:    vpmovusqb %zmm0, %xmm0
2612 ; AVX512BW-NEXT:    vmovd %xmm0, (%rdi)
2613 ; AVX512BW-NEXT:    vzeroupper
2614 ; AVX512BW-NEXT:    retq
2616 ; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i8_store:
2617 ; AVX512BWVL:       # %bb.0:
2618 ; AVX512BWVL-NEXT:    vpmovusqb %ymm0, (%rdi)
2619 ; AVX512BWVL-NEXT:    vzeroupper
2620 ; AVX512BWVL-NEXT:    retq
2622 ; SKX-LABEL: trunc_usat_v4i64_v4i8_store:
2623 ; SKX:       # %bb.0:
2624 ; SKX-NEXT:    vpmovusqb %ymm0, (%rdi)
2625 ; SKX-NEXT:    vzeroupper
2626 ; SKX-NEXT:    retq
2627   %1 = icmp ult <4 x i64> %a0, <i64 255, i64 255, i64 255, i64 255>
2628   %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 255, i64 255, i64 255, i64 255>
2629   %3 = trunc <4 x i64> %2 to <4 x i8>
2630   store <4 x i8> %3, <4 x i8> *%p1
2631   ret void
2634 define <8 x i8> @trunc_usat_v8i64_v8i8(<8 x i64>* %p0) {
2635 ; SSE2-LABEL: trunc_usat_v8i64_v8i8:
2636 ; SSE2:       # %bb.0:
2637 ; SSE2-NEXT:    movdqa (%rdi), %xmm6
2638 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm0
2639 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm9
2640 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm5
2641 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
2642 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
2643 ; SSE2-NEXT:    movdqa %xmm0, %xmm7
2644 ; SSE2-NEXT:    pxor %xmm3, %xmm7
2645 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [9223372039002259711,9223372039002259711]
2646 ; SSE2-NEXT:    movdqa %xmm10, %xmm4
2647 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
2648 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[0,0,2,2]
2649 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm7
2650 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
2651 ; SSE2-NEXT:    pand %xmm1, %xmm7
2652 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
2653 ; SSE2-NEXT:    por %xmm7, %xmm1
2654 ; SSE2-NEXT:    pand %xmm1, %xmm0
2655 ; SSE2-NEXT:    pandn %xmm8, %xmm1
2656 ; SSE2-NEXT:    por %xmm0, %xmm1
2657 ; SSE2-NEXT:    movdqa %xmm6, %xmm0
2658 ; SSE2-NEXT:    pxor %xmm3, %xmm0
2659 ; SSE2-NEXT:    movdqa %xmm10, %xmm4
2660 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
2661 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
2662 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
2663 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
2664 ; SSE2-NEXT:    pand %xmm7, %xmm2
2665 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
2666 ; SSE2-NEXT:    por %xmm2, %xmm0
2667 ; SSE2-NEXT:    pand %xmm0, %xmm6
2668 ; SSE2-NEXT:    pandn %xmm8, %xmm0
2669 ; SSE2-NEXT:    por %xmm6, %xmm0
2670 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
2671 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
2672 ; SSE2-NEXT:    pxor %xmm3, %xmm1
2673 ; SSE2-NEXT:    movdqa %xmm10, %xmm2
2674 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
2675 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2676 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
2677 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2678 ; SSE2-NEXT:    pand %xmm4, %xmm1
2679 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2680 ; SSE2-NEXT:    por %xmm1, %xmm2
2681 ; SSE2-NEXT:    pand %xmm2, %xmm5
2682 ; SSE2-NEXT:    pandn %xmm8, %xmm2
2683 ; SSE2-NEXT:    por %xmm5, %xmm2
2684 ; SSE2-NEXT:    pxor %xmm9, %xmm3
2685 ; SSE2-NEXT:    movdqa %xmm10, %xmm1
2686 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm1
2687 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
2688 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm3
2689 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2690 ; SSE2-NEXT:    pand %xmm4, %xmm3
2691 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2692 ; SSE2-NEXT:    por %xmm3, %xmm1
2693 ; SSE2-NEXT:    pand %xmm1, %xmm9
2694 ; SSE2-NEXT:    pandn %xmm8, %xmm1
2695 ; SSE2-NEXT:    por %xmm9, %xmm1
2696 ; SSE2-NEXT:    packuswb %xmm2, %xmm1
2697 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
2698 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
2699 ; SSE2-NEXT:    retq
2701 ; SSSE3-LABEL: trunc_usat_v8i64_v8i8:
2702 ; SSSE3:       # %bb.0:
2703 ; SSSE3-NEXT:    movdqa (%rdi), %xmm6
2704 ; SSSE3-NEXT:    movdqa 16(%rdi), %xmm0
2705 ; SSSE3-NEXT:    movdqa 32(%rdi), %xmm9
2706 ; SSSE3-NEXT:    movdqa 48(%rdi), %xmm5
2707 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
2708 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
2709 ; SSSE3-NEXT:    movdqa %xmm0, %xmm7
2710 ; SSSE3-NEXT:    pxor %xmm3, %xmm7
2711 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [9223372039002259711,9223372039002259711]
2712 ; SSSE3-NEXT:    movdqa %xmm10, %xmm4
2713 ; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm4
2714 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[0,0,2,2]
2715 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm7
2716 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
2717 ; SSSE3-NEXT:    pand %xmm1, %xmm7
2718 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
2719 ; SSSE3-NEXT:    por %xmm7, %xmm1
2720 ; SSSE3-NEXT:    pand %xmm1, %xmm0
2721 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
2722 ; SSSE3-NEXT:    por %xmm0, %xmm1
2723 ; SSSE3-NEXT:    movdqa %xmm6, %xmm0
2724 ; SSSE3-NEXT:    pxor %xmm3, %xmm0
2725 ; SSSE3-NEXT:    movdqa %xmm10, %xmm4
2726 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm4
2727 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
2728 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm0
2729 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
2730 ; SSSE3-NEXT:    pand %xmm7, %xmm2
2731 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
2732 ; SSSE3-NEXT:    por %xmm2, %xmm0
2733 ; SSSE3-NEXT:    pand %xmm0, %xmm6
2734 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
2735 ; SSSE3-NEXT:    por %xmm6, %xmm0
2736 ; SSSE3-NEXT:    packuswb %xmm1, %xmm0
2737 ; SSSE3-NEXT:    movdqa %xmm5, %xmm1
2738 ; SSSE3-NEXT:    pxor %xmm3, %xmm1
2739 ; SSSE3-NEXT:    movdqa %xmm10, %xmm2
2740 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
2741 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2742 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm1
2743 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2744 ; SSSE3-NEXT:    pand %xmm4, %xmm1
2745 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2746 ; SSSE3-NEXT:    por %xmm1, %xmm2
2747 ; SSSE3-NEXT:    pand %xmm2, %xmm5
2748 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
2749 ; SSSE3-NEXT:    por %xmm5, %xmm2
2750 ; SSSE3-NEXT:    pxor %xmm9, %xmm3
2751 ; SSSE3-NEXT:    movdqa %xmm10, %xmm1
2752 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm1
2753 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
2754 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm3
2755 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2756 ; SSSE3-NEXT:    pand %xmm4, %xmm3
2757 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2758 ; SSSE3-NEXT:    por %xmm3, %xmm1
2759 ; SSSE3-NEXT:    pand %xmm1, %xmm9
2760 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
2761 ; SSSE3-NEXT:    por %xmm9, %xmm1
2762 ; SSSE3-NEXT:    packuswb %xmm2, %xmm1
2763 ; SSSE3-NEXT:    packuswb %xmm1, %xmm0
2764 ; SSSE3-NEXT:    packuswb %xmm0, %xmm0
2765 ; SSSE3-NEXT:    retq
2767 ; SSE41-LABEL: trunc_usat_v8i64_v8i8:
2768 ; SSE41:       # %bb.0:
2769 ; SSE41-NEXT:    movdqa (%rdi), %xmm7
2770 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm1
2771 ; SSE41-NEXT:    movdqa 32(%rdi), %xmm8
2772 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm9
2773 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [255,255]
2774 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
2775 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
2776 ; SSE41-NEXT:    pxor %xmm5, %xmm0
2777 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [9223372039002259711,9223372039002259711]
2778 ; SSE41-NEXT:    movdqa %xmm3, %xmm6
2779 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
2780 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
2781 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
2782 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
2783 ; SSE41-NEXT:    pand %xmm6, %xmm0
2784 ; SSE41-NEXT:    por %xmm4, %xmm0
2785 ; SSE41-NEXT:    movapd %xmm2, %xmm4
2786 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
2787 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
2788 ; SSE41-NEXT:    pxor %xmm5, %xmm0
2789 ; SSE41-NEXT:    movdqa %xmm3, %xmm1
2790 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
2791 ; SSE41-NEXT:    movdqa %xmm3, %xmm6
2792 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
2793 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2794 ; SSE41-NEXT:    pand %xmm1, %xmm0
2795 ; SSE41-NEXT:    por %xmm6, %xmm0
2796 ; SSE41-NEXT:    movapd %xmm2, %xmm1
2797 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
2798 ; SSE41-NEXT:    packusdw %xmm4, %xmm1
2799 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
2800 ; SSE41-NEXT:    pxor %xmm5, %xmm0
2801 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
2802 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
2803 ; SSE41-NEXT:    movdqa %xmm3, %xmm6
2804 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
2805 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2806 ; SSE41-NEXT:    pand %xmm4, %xmm0
2807 ; SSE41-NEXT:    por %xmm6, %xmm0
2808 ; SSE41-NEXT:    movapd %xmm2, %xmm4
2809 ; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm4
2810 ; SSE41-NEXT:    pxor %xmm8, %xmm5
2811 ; SSE41-NEXT:    movdqa %xmm3, %xmm6
2812 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm6
2813 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm3
2814 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2815 ; SSE41-NEXT:    pand %xmm6, %xmm0
2816 ; SSE41-NEXT:    por %xmm3, %xmm0
2817 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm2
2818 ; SSE41-NEXT:    packusdw %xmm4, %xmm2
2819 ; SSE41-NEXT:    packusdw %xmm2, %xmm1
2820 ; SSE41-NEXT:    packuswb %xmm1, %xmm1
2821 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
2822 ; SSE41-NEXT:    retq
2824 ; AVX1-LABEL: trunc_usat_v8i64_v8i8:
2825 ; AVX1:       # %bb.0:
2826 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
2827 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
2828 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm2
2829 ; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm3
2830 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
2831 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm5
2832 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [9223372036854776063,9223372036854776063]
2833 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm8
2834 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm7
2835 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm7
2836 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm5
2837 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
2838 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm4
2839 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
2840 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm6 = [255,255]
2841 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm6, %xmm3
2842 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm2, %xmm6, %xmm2
2843 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
2844 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm1, %xmm6, %xmm1
2845 ; AVX1-NEXT:    vblendvpd %xmm8, %xmm0, %xmm6, %xmm0
2846 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
2847 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
2848 ; AVX1-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
2849 ; AVX1-NEXT:    retq
2851 ; AVX2-LABEL: trunc_usat_v8i64_v8i8:
2852 ; AVX2:       # %bb.0:
2853 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
2854 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
2855 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [255,255,255,255]
2856 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2857 ; AVX2-NEXT:    vpxor %ymm3, %ymm0, %ymm4
2858 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
2859 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
2860 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm0, %ymm2, %ymm0
2861 ; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm3
2862 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm5, %ymm3
2863 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
2864 ; AVX2-NEXT:    vextractf128 $1, %ymm1, %xmm2
2865 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = <u,u,0,8,u,u,u,u,u,u,u,u,u,u,u,u>
2866 ; AVX2-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
2867 ; AVX2-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
2868 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
2869 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm2
2870 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2871 ; AVX2-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
2872 ; AVX2-NEXT:    vpshufb %xmm3, %xmm0, %xmm0
2873 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
2874 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
2875 ; AVX2-NEXT:    vzeroupper
2876 ; AVX2-NEXT:    retq
2878 ; AVX512-LABEL: trunc_usat_v8i64_v8i8:
2879 ; AVX512:       # %bb.0:
2880 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
2881 ; AVX512-NEXT:    vpmovusqb %zmm0, %xmm0
2882 ; AVX512-NEXT:    vzeroupper
2883 ; AVX512-NEXT:    retq
2885 ; SKX-LABEL: trunc_usat_v8i64_v8i8:
2886 ; SKX:       # %bb.0:
2887 ; SKX-NEXT:    vmovdqa64 (%rdi), %zmm0
2888 ; SKX-NEXT:    vpmovusqb %zmm0, %xmm0
2889 ; SKX-NEXT:    vzeroupper
2890 ; SKX-NEXT:    retq
2891   %a0 = load <8 x i64>, <8 x i64>* %p0
2892   %1 = icmp ult <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
2893   %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>
2894   %3 = trunc <8 x i64> %2 to <8 x i8>
2895   ret <8 x i8> %3
2898 define void @trunc_usat_v8i64_v8i8_store(<8 x i64>* %p0, <8 x i8> *%p1) {
2899 ; SSE2-LABEL: trunc_usat_v8i64_v8i8_store:
2900 ; SSE2:       # %bb.0:
2901 ; SSE2-NEXT:    movdqa (%rdi), %xmm6
2902 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm5
2903 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm9
2904 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm4
2905 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
2906 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
2907 ; SSE2-NEXT:    movdqa %xmm5, %xmm7
2908 ; SSE2-NEXT:    pxor %xmm2, %xmm7
2909 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259711,9223372039002259711]
2910 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
2911 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm3
2912 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2913 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm7
2914 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
2915 ; SSE2-NEXT:    pand %xmm0, %xmm7
2916 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
2917 ; SSE2-NEXT:    por %xmm7, %xmm0
2918 ; SSE2-NEXT:    pand %xmm0, %xmm5
2919 ; SSE2-NEXT:    pandn %xmm8, %xmm0
2920 ; SSE2-NEXT:    por %xmm5, %xmm0
2921 ; SSE2-NEXT:    movdqa %xmm6, %xmm3
2922 ; SSE2-NEXT:    pxor %xmm2, %xmm3
2923 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
2924 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
2925 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
2926 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm3
2927 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2928 ; SSE2-NEXT:    pand %xmm7, %xmm3
2929 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2930 ; SSE2-NEXT:    por %xmm3, %xmm5
2931 ; SSE2-NEXT:    pand %xmm5, %xmm6
2932 ; SSE2-NEXT:    pandn %xmm8, %xmm5
2933 ; SSE2-NEXT:    por %xmm6, %xmm5
2934 ; SSE2-NEXT:    packuswb %xmm0, %xmm5
2935 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
2936 ; SSE2-NEXT:    pxor %xmm2, %xmm0
2937 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
2938 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
2939 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
2940 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm0
2941 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2942 ; SSE2-NEXT:    pand %xmm6, %xmm0
2943 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2944 ; SSE2-NEXT:    por %xmm0, %xmm3
2945 ; SSE2-NEXT:    pand %xmm3, %xmm4
2946 ; SSE2-NEXT:    pandn %xmm8, %xmm3
2947 ; SSE2-NEXT:    por %xmm4, %xmm3
2948 ; SSE2-NEXT:    pxor %xmm9, %xmm2
2949 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
2950 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
2951 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
2952 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
2953 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
2954 ; SSE2-NEXT:    pand %xmm4, %xmm1
2955 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2956 ; SSE2-NEXT:    por %xmm1, %xmm0
2957 ; SSE2-NEXT:    pand %xmm0, %xmm9
2958 ; SSE2-NEXT:    pandn %xmm8, %xmm0
2959 ; SSE2-NEXT:    por %xmm9, %xmm0
2960 ; SSE2-NEXT:    packuswb %xmm3, %xmm0
2961 ; SSE2-NEXT:    packuswb %xmm0, %xmm5
2962 ; SSE2-NEXT:    packuswb %xmm0, %xmm5
2963 ; SSE2-NEXT:    movq %xmm5, (%rsi)
2964 ; SSE2-NEXT:    retq
2966 ; SSSE3-LABEL: trunc_usat_v8i64_v8i8_store:
2967 ; SSSE3:       # %bb.0:
2968 ; SSSE3-NEXT:    movdqa (%rdi), %xmm6
2969 ; SSSE3-NEXT:    movdqa 16(%rdi), %xmm5
2970 ; SSSE3-NEXT:    movdqa 32(%rdi), %xmm9
2971 ; SSSE3-NEXT:    movdqa 48(%rdi), %xmm4
2972 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
2973 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
2974 ; SSSE3-NEXT:    movdqa %xmm5, %xmm7
2975 ; SSSE3-NEXT:    pxor %xmm2, %xmm7
2976 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [9223372039002259711,9223372039002259711]
2977 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
2978 ; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm3
2979 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2980 ; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm7
2981 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
2982 ; SSSE3-NEXT:    pand %xmm0, %xmm7
2983 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
2984 ; SSSE3-NEXT:    por %xmm7, %xmm0
2985 ; SSSE3-NEXT:    pand %xmm0, %xmm5
2986 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
2987 ; SSSE3-NEXT:    por %xmm5, %xmm0
2988 ; SSSE3-NEXT:    movdqa %xmm6, %xmm3
2989 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
2990 ; SSSE3-NEXT:    movdqa %xmm1, %xmm5
2991 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
2992 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
2993 ; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm3
2994 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2995 ; SSSE3-NEXT:    pand %xmm7, %xmm3
2996 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2997 ; SSSE3-NEXT:    por %xmm3, %xmm5
2998 ; SSSE3-NEXT:    pand %xmm5, %xmm6
2999 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
3000 ; SSSE3-NEXT:    por %xmm6, %xmm5
3001 ; SSSE3-NEXT:    packuswb %xmm0, %xmm5
3002 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
3003 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
3004 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
3005 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm3
3006 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
3007 ; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm0
3008 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3009 ; SSSE3-NEXT:    pand %xmm6, %xmm0
3010 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3011 ; SSSE3-NEXT:    por %xmm0, %xmm3
3012 ; SSSE3-NEXT:    pand %xmm3, %xmm4
3013 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
3014 ; SSSE3-NEXT:    por %xmm4, %xmm3
3015 ; SSSE3-NEXT:    pxor %xmm9, %xmm2
3016 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
3017 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm0
3018 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
3019 ; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm2
3020 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
3021 ; SSSE3-NEXT:    pand %xmm4, %xmm1
3022 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3023 ; SSSE3-NEXT:    por %xmm1, %xmm0
3024 ; SSSE3-NEXT:    pand %xmm0, %xmm9
3025 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
3026 ; SSSE3-NEXT:    por %xmm9, %xmm0
3027 ; SSSE3-NEXT:    packuswb %xmm3, %xmm0
3028 ; SSSE3-NEXT:    packuswb %xmm0, %xmm5
3029 ; SSSE3-NEXT:    packuswb %xmm0, %xmm5
3030 ; SSSE3-NEXT:    movq %xmm5, (%rsi)
3031 ; SSSE3-NEXT:    retq
3033 ; SSE41-LABEL: trunc_usat_v8i64_v8i8_store:
3034 ; SSE41:       # %bb.0:
3035 ; SSE41-NEXT:    movdqa (%rdi), %xmm7
3036 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm6
3037 ; SSE41-NEXT:    movdqa 32(%rdi), %xmm8
3038 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm9
3039 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [255,255]
3040 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
3041 ; SSE41-NEXT:    movdqa %xmm6, %xmm0
3042 ; SSE41-NEXT:    pxor %xmm4, %xmm0
3043 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259711,9223372039002259711]
3044 ; SSE41-NEXT:    movdqa %xmm2, %xmm5
3045 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
3046 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
3047 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
3048 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
3049 ; SSE41-NEXT:    pand %xmm5, %xmm0
3050 ; SSE41-NEXT:    por %xmm3, %xmm0
3051 ; SSE41-NEXT:    movapd %xmm1, %xmm3
3052 ; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm3
3053 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
3054 ; SSE41-NEXT:    pxor %xmm4, %xmm0
3055 ; SSE41-NEXT:    movdqa %xmm2, %xmm5
3056 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
3057 ; SSE41-NEXT:    movdqa %xmm2, %xmm6
3058 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
3059 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3060 ; SSE41-NEXT:    pand %xmm5, %xmm0
3061 ; SSE41-NEXT:    por %xmm6, %xmm0
3062 ; SSE41-NEXT:    movapd %xmm1, %xmm6
3063 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm6
3064 ; SSE41-NEXT:    packusdw %xmm3, %xmm6
3065 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
3066 ; SSE41-NEXT:    pxor %xmm4, %xmm0
3067 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
3068 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
3069 ; SSE41-NEXT:    movdqa %xmm2, %xmm5
3070 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
3071 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
3072 ; SSE41-NEXT:    pand %xmm3, %xmm0
3073 ; SSE41-NEXT:    por %xmm5, %xmm0
3074 ; SSE41-NEXT:    movapd %xmm1, %xmm3
3075 ; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm3
3076 ; SSE41-NEXT:    pxor %xmm8, %xmm4
3077 ; SSE41-NEXT:    movdqa %xmm2, %xmm5
3078 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm5
3079 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm2
3080 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
3081 ; SSE41-NEXT:    pand %xmm5, %xmm0
3082 ; SSE41-NEXT:    por %xmm2, %xmm0
3083 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm1
3084 ; SSE41-NEXT:    packusdw %xmm3, %xmm1
3085 ; SSE41-NEXT:    packusdw %xmm1, %xmm6
3086 ; SSE41-NEXT:    packuswb %xmm0, %xmm6
3087 ; SSE41-NEXT:    movq %xmm6, (%rsi)
3088 ; SSE41-NEXT:    retq
3090 ; AVX1-LABEL: trunc_usat_v8i64_v8i8_store:
3091 ; AVX1:       # %bb.0:
3092 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
3093 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
3094 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm2
3095 ; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm3
3096 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
3097 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm5
3098 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [9223372036854776063,9223372036854776063]
3099 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm8
3100 ; AVX1-NEXT:    vpxor %xmm4, %xmm1, %xmm7
3101 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm7
3102 ; AVX1-NEXT:    vpxor %xmm4, %xmm2, %xmm5
3103 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
3104 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm4
3105 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
3106 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm6 = [255,255]
3107 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm6, %xmm3
3108 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm2, %xmm6, %xmm2
3109 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
3110 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm1, %xmm6, %xmm1
3111 ; AVX1-NEXT:    vblendvpd %xmm8, %xmm0, %xmm6, %xmm0
3112 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
3113 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
3114 ; AVX1-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
3115 ; AVX1-NEXT:    vmovq %xmm0, (%rsi)
3116 ; AVX1-NEXT:    retq
3118 ; AVX2-LABEL: trunc_usat_v8i64_v8i8_store:
3119 ; AVX2:       # %bb.0:
3120 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
3121 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
3122 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [255,255,255,255]
3123 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
3124 ; AVX2-NEXT:    vpxor %ymm3, %ymm0, %ymm4
3125 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
3126 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
3127 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm0, %ymm2, %ymm0
3128 ; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm3
3129 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm5, %ymm3
3130 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
3131 ; AVX2-NEXT:    vextractf128 $1, %ymm1, %xmm2
3132 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = <u,u,0,8,u,u,u,u,u,u,u,u,u,u,u,u>
3133 ; AVX2-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
3134 ; AVX2-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
3135 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
3136 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm2
3137 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
3138 ; AVX2-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
3139 ; AVX2-NEXT:    vpshufb %xmm3, %xmm0, %xmm0
3140 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
3141 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
3142 ; AVX2-NEXT:    vmovq %xmm0, (%rsi)
3143 ; AVX2-NEXT:    vzeroupper
3144 ; AVX2-NEXT:    retq
3146 ; AVX512-LABEL: trunc_usat_v8i64_v8i8_store:
3147 ; AVX512:       # %bb.0:
3148 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
3149 ; AVX512-NEXT:    vpmovusqb %zmm0, (%rsi)
3150 ; AVX512-NEXT:    vzeroupper
3151 ; AVX512-NEXT:    retq
3153 ; SKX-LABEL: trunc_usat_v8i64_v8i8_store:
3154 ; SKX:       # %bb.0:
3155 ; SKX-NEXT:    vmovdqa64 (%rdi), %zmm0
3156 ; SKX-NEXT:    vpmovusqb %zmm0, (%rsi)
3157 ; SKX-NEXT:    vzeroupper
3158 ; SKX-NEXT:    retq
3159   %a0 = load <8 x i64>, <8 x i64>* %p0
3160   %1 = icmp ult <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
3161   %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>
3162   %3 = trunc <8 x i64> %2 to <8 x i8>
3163   store <8 x i8> %3, <8 x i8> *%p1
3164   ret void
3167 define <16 x i8> @trunc_usat_v16i64_v16i8(<16 x i64>* %p0) {
3168 ; SSE2-LABEL: trunc_usat_v16i64_v16i8:
3169 ; SSE2:       # %bb.0:
3170 ; SSE2-NEXT:    movdqa 96(%rdi), %xmm9
3171 ; SSE2-NEXT:    movdqa 112(%rdi), %xmm10
3172 ; SSE2-NEXT:    movdqa 64(%rdi), %xmm11
3173 ; SSE2-NEXT:    movdqa 80(%rdi), %xmm12
3174 ; SSE2-NEXT:    movdqa (%rdi), %xmm3
3175 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm6
3176 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm13
3177 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm1
3178 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
3179 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
3180 ; SSE2-NEXT:    movdqa %xmm6, %xmm0
3181 ; SSE2-NEXT:    pxor %xmm4, %xmm0
3182 ; SSE2-NEXT:    movdqa {{.*#+}} xmm14 = [9223372039002259711,9223372039002259711]
3183 ; SSE2-NEXT:    movdqa %xmm14, %xmm5
3184 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
3185 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[0,0,2,2]
3186 ; SSE2-NEXT:    pcmpeqd %xmm14, %xmm0
3187 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3188 ; SSE2-NEXT:    pand %xmm2, %xmm0
3189 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
3190 ; SSE2-NEXT:    por %xmm0, %xmm2
3191 ; SSE2-NEXT:    pand %xmm2, %xmm6
3192 ; SSE2-NEXT:    pandn %xmm8, %xmm2
3193 ; SSE2-NEXT:    por %xmm6, %xmm2
3194 ; SSE2-NEXT:    movdqa %xmm3, %xmm0
3195 ; SSE2-NEXT:    pxor %xmm4, %xmm0
3196 ; SSE2-NEXT:    movdqa %xmm14, %xmm5
3197 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
3198 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
3199 ; SSE2-NEXT:    pcmpeqd %xmm14, %xmm0
3200 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
3201 ; SSE2-NEXT:    pand %xmm6, %xmm7
3202 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
3203 ; SSE2-NEXT:    por %xmm7, %xmm0
3204 ; SSE2-NEXT:    pand %xmm0, %xmm3
3205 ; SSE2-NEXT:    pandn %xmm8, %xmm0
3206 ; SSE2-NEXT:    por %xmm3, %xmm0
3207 ; SSE2-NEXT:    packuswb %xmm2, %xmm0
3208 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
3209 ; SSE2-NEXT:    pxor %xmm4, %xmm2
3210 ; SSE2-NEXT:    movdqa %xmm14, %xmm3
3211 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
3212 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
3213 ; SSE2-NEXT:    pcmpeqd %xmm14, %xmm2
3214 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3215 ; SSE2-NEXT:    pand %xmm5, %xmm2
3216 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3217 ; SSE2-NEXT:    por %xmm2, %xmm3
3218 ; SSE2-NEXT:    pand %xmm3, %xmm1
3219 ; SSE2-NEXT:    pandn %xmm8, %xmm3
3220 ; SSE2-NEXT:    por %xmm1, %xmm3
3221 ; SSE2-NEXT:    movdqa %xmm13, %xmm1
3222 ; SSE2-NEXT:    pxor %xmm4, %xmm1
3223 ; SSE2-NEXT:    movdqa %xmm14, %xmm2
3224 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
3225 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
3226 ; SSE2-NEXT:    pcmpeqd %xmm14, %xmm1
3227 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3228 ; SSE2-NEXT:    pand %xmm5, %xmm1
3229 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3230 ; SSE2-NEXT:    por %xmm1, %xmm2
3231 ; SSE2-NEXT:    pand %xmm2, %xmm13
3232 ; SSE2-NEXT:    pandn %xmm8, %xmm2
3233 ; SSE2-NEXT:    por %xmm13, %xmm2
3234 ; SSE2-NEXT:    packuswb %xmm3, %xmm2
3235 ; SSE2-NEXT:    packuswb %xmm2, %xmm0
3236 ; SSE2-NEXT:    movdqa %xmm12, %xmm1
3237 ; SSE2-NEXT:    pxor %xmm4, %xmm1
3238 ; SSE2-NEXT:    movdqa %xmm14, %xmm2
3239 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
3240 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
3241 ; SSE2-NEXT:    pcmpeqd %xmm14, %xmm1
3242 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3243 ; SSE2-NEXT:    pand %xmm3, %xmm1
3244 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3245 ; SSE2-NEXT:    por %xmm1, %xmm2
3246 ; SSE2-NEXT:    pand %xmm2, %xmm12
3247 ; SSE2-NEXT:    pandn %xmm8, %xmm2
3248 ; SSE2-NEXT:    por %xmm12, %xmm2
3249 ; SSE2-NEXT:    movdqa %xmm11, %xmm1
3250 ; SSE2-NEXT:    pxor %xmm4, %xmm1
3251 ; SSE2-NEXT:    movdqa %xmm14, %xmm3
3252 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
3253 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
3254 ; SSE2-NEXT:    pcmpeqd %xmm14, %xmm1
3255 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
3256 ; SSE2-NEXT:    pand %xmm5, %xmm6
3257 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
3258 ; SSE2-NEXT:    por %xmm6, %xmm1
3259 ; SSE2-NEXT:    pand %xmm1, %xmm11
3260 ; SSE2-NEXT:    pandn %xmm8, %xmm1
3261 ; SSE2-NEXT:    por %xmm11, %xmm1
3262 ; SSE2-NEXT:    packuswb %xmm2, %xmm1
3263 ; SSE2-NEXT:    movdqa %xmm10, %xmm2
3264 ; SSE2-NEXT:    pxor %xmm4, %xmm2
3265 ; SSE2-NEXT:    movdqa %xmm14, %xmm3
3266 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
3267 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
3268 ; SSE2-NEXT:    pcmpeqd %xmm14, %xmm2
3269 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3270 ; SSE2-NEXT:    pand %xmm5, %xmm2
3271 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3272 ; SSE2-NEXT:    por %xmm2, %xmm3
3273 ; SSE2-NEXT:    pand %xmm3, %xmm10
3274 ; SSE2-NEXT:    pandn %xmm8, %xmm3
3275 ; SSE2-NEXT:    por %xmm10, %xmm3
3276 ; SSE2-NEXT:    pxor %xmm9, %xmm4
3277 ; SSE2-NEXT:    movdqa %xmm14, %xmm2
3278 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
3279 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
3280 ; SSE2-NEXT:    pcmpeqd %xmm14, %xmm4
3281 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3282 ; SSE2-NEXT:    pand %xmm5, %xmm4
3283 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3284 ; SSE2-NEXT:    por %xmm4, %xmm2
3285 ; SSE2-NEXT:    pand %xmm2, %xmm9
3286 ; SSE2-NEXT:    pandn %xmm8, %xmm2
3287 ; SSE2-NEXT:    por %xmm9, %xmm2
3288 ; SSE2-NEXT:    packuswb %xmm3, %xmm2
3289 ; SSE2-NEXT:    packuswb %xmm2, %xmm1
3290 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
3291 ; SSE2-NEXT:    retq
3293 ; SSSE3-LABEL: trunc_usat_v16i64_v16i8:
3294 ; SSSE3:       # %bb.0:
3295 ; SSSE3-NEXT:    movdqa 96(%rdi), %xmm9
3296 ; SSSE3-NEXT:    movdqa 112(%rdi), %xmm10
3297 ; SSSE3-NEXT:    movdqa 64(%rdi), %xmm11
3298 ; SSSE3-NEXT:    movdqa 80(%rdi), %xmm12
3299 ; SSSE3-NEXT:    movdqa (%rdi), %xmm3
3300 ; SSSE3-NEXT:    movdqa 16(%rdi), %xmm6
3301 ; SSSE3-NEXT:    movdqa 32(%rdi), %xmm13
3302 ; SSSE3-NEXT:    movdqa 48(%rdi), %xmm1
3303 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255]
3304 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
3305 ; SSSE3-NEXT:    movdqa %xmm6, %xmm0
3306 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
3307 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm14 = [9223372039002259711,9223372039002259711]
3308 ; SSSE3-NEXT:    movdqa %xmm14, %xmm5
3309 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm5
3310 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[0,0,2,2]
3311 ; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm0
3312 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3313 ; SSSE3-NEXT:    pand %xmm2, %xmm0
3314 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
3315 ; SSSE3-NEXT:    por %xmm0, %xmm2
3316 ; SSSE3-NEXT:    pand %xmm2, %xmm6
3317 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
3318 ; SSSE3-NEXT:    por %xmm6, %xmm2
3319 ; SSSE3-NEXT:    movdqa %xmm3, %xmm0
3320 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
3321 ; SSSE3-NEXT:    movdqa %xmm14, %xmm5
3322 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm5
3323 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
3324 ; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm0
3325 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
3326 ; SSSE3-NEXT:    pand %xmm6, %xmm7
3327 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
3328 ; SSSE3-NEXT:    por %xmm7, %xmm0
3329 ; SSSE3-NEXT:    pand %xmm0, %xmm3
3330 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
3331 ; SSSE3-NEXT:    por %xmm3, %xmm0
3332 ; SSSE3-NEXT:    packuswb %xmm2, %xmm0
3333 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
3334 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
3335 ; SSSE3-NEXT:    movdqa %xmm14, %xmm3
3336 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
3337 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
3338 ; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm2
3339 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3340 ; SSSE3-NEXT:    pand %xmm5, %xmm2
3341 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3342 ; SSSE3-NEXT:    por %xmm2, %xmm3
3343 ; SSSE3-NEXT:    pand %xmm3, %xmm1
3344 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
3345 ; SSSE3-NEXT:    por %xmm1, %xmm3
3346 ; SSSE3-NEXT:    movdqa %xmm13, %xmm1
3347 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
3348 ; SSSE3-NEXT:    movdqa %xmm14, %xmm2
3349 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
3350 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
3351 ; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm1
3352 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3353 ; SSSE3-NEXT:    pand %xmm5, %xmm1
3354 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3355 ; SSSE3-NEXT:    por %xmm1, %xmm2
3356 ; SSSE3-NEXT:    pand %xmm2, %xmm13
3357 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
3358 ; SSSE3-NEXT:    por %xmm13, %xmm2
3359 ; SSSE3-NEXT:    packuswb %xmm3, %xmm2
3360 ; SSSE3-NEXT:    packuswb %xmm2, %xmm0
3361 ; SSSE3-NEXT:    movdqa %xmm12, %xmm1
3362 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
3363 ; SSSE3-NEXT:    movdqa %xmm14, %xmm2
3364 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
3365 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
3366 ; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm1
3367 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3368 ; SSSE3-NEXT:    pand %xmm3, %xmm1
3369 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3370 ; SSSE3-NEXT:    por %xmm1, %xmm2
3371 ; SSSE3-NEXT:    pand %xmm2, %xmm12
3372 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
3373 ; SSSE3-NEXT:    por %xmm12, %xmm2
3374 ; SSSE3-NEXT:    movdqa %xmm11, %xmm1
3375 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
3376 ; SSSE3-NEXT:    movdqa %xmm14, %xmm3
3377 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
3378 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
3379 ; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm1
3380 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
3381 ; SSSE3-NEXT:    pand %xmm5, %xmm6
3382 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
3383 ; SSSE3-NEXT:    por %xmm6, %xmm1
3384 ; SSSE3-NEXT:    pand %xmm1, %xmm11
3385 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
3386 ; SSSE3-NEXT:    por %xmm11, %xmm1
3387 ; SSSE3-NEXT:    packuswb %xmm2, %xmm1
3388 ; SSSE3-NEXT:    movdqa %xmm10, %xmm2
3389 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
3390 ; SSSE3-NEXT:    movdqa %xmm14, %xmm3
3391 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
3392 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
3393 ; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm2
3394 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3395 ; SSSE3-NEXT:    pand %xmm5, %xmm2
3396 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3397 ; SSSE3-NEXT:    por %xmm2, %xmm3
3398 ; SSSE3-NEXT:    pand %xmm3, %xmm10
3399 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
3400 ; SSSE3-NEXT:    por %xmm10, %xmm3
3401 ; SSSE3-NEXT:    pxor %xmm9, %xmm4
3402 ; SSSE3-NEXT:    movdqa %xmm14, %xmm2
3403 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm2
3404 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
3405 ; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm4
3406 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3407 ; SSSE3-NEXT:    pand %xmm5, %xmm4
3408 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3409 ; SSSE3-NEXT:    por %xmm4, %xmm2
3410 ; SSSE3-NEXT:    pand %xmm2, %xmm9
3411 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
3412 ; SSSE3-NEXT:    por %xmm9, %xmm2
3413 ; SSSE3-NEXT:    packuswb %xmm3, %xmm2
3414 ; SSSE3-NEXT:    packuswb %xmm2, %xmm1
3415 ; SSSE3-NEXT:    packuswb %xmm1, %xmm0
3416 ; SSSE3-NEXT:    retq
3418 ; SSE41-LABEL: trunc_usat_v16i64_v16i8:
3419 ; SSE41:       # %bb.0:
3420 ; SSE41-NEXT:    movdqa 96(%rdi), %xmm8
3421 ; SSE41-NEXT:    movdqa 112(%rdi), %xmm9
3422 ; SSE41-NEXT:    movdqa 64(%rdi), %xmm10
3423 ; SSE41-NEXT:    movdqa 80(%rdi), %xmm11
3424 ; SSE41-NEXT:    movdqa (%rdi), %xmm2
3425 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm1
3426 ; SSE41-NEXT:    movdqa 32(%rdi), %xmm12
3427 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm13
3428 ; SSE41-NEXT:    movapd {{.*#+}} xmm3 = [255,255]
3429 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
3430 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
3431 ; SSE41-NEXT:    pxor %xmm6, %xmm0
3432 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259711,9223372039002259711]
3433 ; SSE41-NEXT:    movdqa %xmm4, %xmm7
3434 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm7
3435 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
3436 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
3437 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
3438 ; SSE41-NEXT:    pand %xmm7, %xmm0
3439 ; SSE41-NEXT:    por %xmm5, %xmm0
3440 ; SSE41-NEXT:    movapd %xmm3, %xmm5
3441 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
3442 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
3443 ; SSE41-NEXT:    pxor %xmm6, %xmm0
3444 ; SSE41-NEXT:    movdqa %xmm4, %xmm1
3445 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
3446 ; SSE41-NEXT:    movdqa %xmm4, %xmm7
3447 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
3448 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
3449 ; SSE41-NEXT:    pand %xmm1, %xmm0
3450 ; SSE41-NEXT:    por %xmm7, %xmm0
3451 ; SSE41-NEXT:    movapd %xmm3, %xmm1
3452 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
3453 ; SSE41-NEXT:    packusdw %xmm5, %xmm1
3454 ; SSE41-NEXT:    movdqa %xmm13, %xmm0
3455 ; SSE41-NEXT:    pxor %xmm6, %xmm0
3456 ; SSE41-NEXT:    movdqa %xmm4, %xmm2
3457 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
3458 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
3459 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
3460 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
3461 ; SSE41-NEXT:    pand %xmm2, %xmm0
3462 ; SSE41-NEXT:    por %xmm5, %xmm0
3463 ; SSE41-NEXT:    movapd %xmm3, %xmm2
3464 ; SSE41-NEXT:    blendvpd %xmm0, %xmm13, %xmm2
3465 ; SSE41-NEXT:    movdqa %xmm12, %xmm0
3466 ; SSE41-NEXT:    pxor %xmm6, %xmm0
3467 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
3468 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
3469 ; SSE41-NEXT:    movdqa %xmm4, %xmm7
3470 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
3471 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
3472 ; SSE41-NEXT:    pand %xmm5, %xmm0
3473 ; SSE41-NEXT:    por %xmm7, %xmm0
3474 ; SSE41-NEXT:    movapd %xmm3, %xmm5
3475 ; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm5
3476 ; SSE41-NEXT:    packusdw %xmm2, %xmm5
3477 ; SSE41-NEXT:    packusdw %xmm5, %xmm1
3478 ; SSE41-NEXT:    movdqa %xmm11, %xmm0
3479 ; SSE41-NEXT:    pxor %xmm6, %xmm0
3480 ; SSE41-NEXT:    movdqa %xmm4, %xmm2
3481 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
3482 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
3483 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
3484 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
3485 ; SSE41-NEXT:    pand %xmm2, %xmm0
3486 ; SSE41-NEXT:    por %xmm5, %xmm0
3487 ; SSE41-NEXT:    movapd %xmm3, %xmm5
3488 ; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm5
3489 ; SSE41-NEXT:    movdqa %xmm10, %xmm0
3490 ; SSE41-NEXT:    pxor %xmm6, %xmm0
3491 ; SSE41-NEXT:    movdqa %xmm4, %xmm2
3492 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
3493 ; SSE41-NEXT:    movdqa %xmm4, %xmm7
3494 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
3495 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
3496 ; SSE41-NEXT:    pand %xmm2, %xmm0
3497 ; SSE41-NEXT:    por %xmm7, %xmm0
3498 ; SSE41-NEXT:    movapd %xmm3, %xmm2
3499 ; SSE41-NEXT:    blendvpd %xmm0, %xmm10, %xmm2
3500 ; SSE41-NEXT:    packusdw %xmm5, %xmm2
3501 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
3502 ; SSE41-NEXT:    pxor %xmm6, %xmm0
3503 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
3504 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
3505 ; SSE41-NEXT:    movdqa %xmm4, %xmm7
3506 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
3507 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
3508 ; SSE41-NEXT:    pand %xmm5, %xmm0
3509 ; SSE41-NEXT:    por %xmm7, %xmm0
3510 ; SSE41-NEXT:    movapd %xmm3, %xmm5
3511 ; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm5
3512 ; SSE41-NEXT:    pxor %xmm8, %xmm6
3513 ; SSE41-NEXT:    movdqa %xmm4, %xmm7
3514 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm7
3515 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm4
3516 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
3517 ; SSE41-NEXT:    pand %xmm7, %xmm0
3518 ; SSE41-NEXT:    por %xmm4, %xmm0
3519 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm3
3520 ; SSE41-NEXT:    packusdw %xmm5, %xmm3
3521 ; SSE41-NEXT:    packusdw %xmm3, %xmm2
3522 ; SSE41-NEXT:    packuswb %xmm2, %xmm1
3523 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
3524 ; SSE41-NEXT:    retq
3526 ; AVX1-LABEL: trunc_usat_v16i64_v16i8:
3527 ; AVX1:       # %bb.0:
3528 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm12
3529 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm13
3530 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm15
3531 ; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm9
3532 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
3533 ; AVX1-NEXT:    vpxor %xmm4, %xmm12, %xmm5
3534 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [9223372036854776063,9223372036854776063]
3535 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm0
3536 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3537 ; AVX1-NEXT:    vpxor %xmm4, %xmm13, %xmm7
3538 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm0
3539 ; AVX1-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3540 ; AVX1-NEXT:    vpxor %xmm4, %xmm15, %xmm5
3541 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm10
3542 ; AVX1-NEXT:    vpxor %xmm4, %xmm9, %xmm7
3543 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm11
3544 ; AVX1-NEXT:    vmovdqa 64(%rdi), %xmm5
3545 ; AVX1-NEXT:    vpxor %xmm4, %xmm5, %xmm7
3546 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm14
3547 ; AVX1-NEXT:    vmovdqa 80(%rdi), %xmm3
3548 ; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm1
3549 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm6, %xmm1
3550 ; AVX1-NEXT:    vmovdqa 96(%rdi), %xmm7
3551 ; AVX1-NEXT:    vpxor %xmm4, %xmm7, %xmm2
3552 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm6, %xmm2
3553 ; AVX1-NEXT:    vmovdqa 112(%rdi), %xmm0
3554 ; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm4
3555 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
3556 ; AVX1-NEXT:    vmovapd {{.*#+}} xmm6 = [255,255]
3557 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm0, %xmm6, %xmm8
3558 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm7, %xmm6, %xmm2
3559 ; AVX1-NEXT:    vblendvpd %xmm1, %xmm3, %xmm6, %xmm1
3560 ; AVX1-NEXT:    vblendvpd %xmm14, %xmm5, %xmm6, %xmm3
3561 ; AVX1-NEXT:    vblendvpd %xmm11, %xmm9, %xmm6, %xmm4
3562 ; AVX1-NEXT:    vblendvpd %xmm10, %xmm15, %xmm6, %xmm5
3563 ; AVX1-NEXT:    vmovapd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3564 ; AVX1-NEXT:    vblendvpd %xmm0, %xmm13, %xmm6, %xmm7
3565 ; AVX1-NEXT:    vmovapd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3566 ; AVX1-NEXT:    vblendvpd %xmm0, %xmm12, %xmm6, %xmm6
3567 ; AVX1-NEXT:    vpackusdw %xmm8, %xmm2, %xmm0
3568 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm3, %xmm1
3569 ; AVX1-NEXT:    vpackusdw %xmm0, %xmm1, %xmm0
3570 ; AVX1-NEXT:    vpackusdw %xmm4, %xmm5, %xmm1
3571 ; AVX1-NEXT:    vpackusdw %xmm7, %xmm6, %xmm2
3572 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm2, %xmm1
3573 ; AVX1-NEXT:    vpackuswb %xmm0, %xmm1, %xmm0
3574 ; AVX1-NEXT:    retq
3576 ; AVX2-LABEL: trunc_usat_v16i64_v16i8:
3577 ; AVX2:       # %bb.0:
3578 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
3579 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
3580 ; AVX2-NEXT:    vmovdqa 64(%rdi), %ymm2
3581 ; AVX2-NEXT:    vmovdqa 96(%rdi), %ymm3
3582 ; AVX2-NEXT:    vbroadcastsd {{.*#+}} ymm4 = [255,255,255,255]
3583 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
3584 ; AVX2-NEXT:    vpxor %ymm5, %ymm1, %ymm6
3585 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm7 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
3586 ; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm7, %ymm6
3587 ; AVX2-NEXT:    vblendvpd %ymm6, %ymm1, %ymm4, %ymm1
3588 ; AVX2-NEXT:    vpxor %ymm5, %ymm0, %ymm6
3589 ; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm7, %ymm6
3590 ; AVX2-NEXT:    vblendvpd %ymm6, %ymm0, %ymm4, %ymm0
3591 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
3592 ; AVX2-NEXT:    vpxor %ymm5, %ymm3, %ymm1
3593 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm7, %ymm1
3594 ; AVX2-NEXT:    vblendvpd %ymm1, %ymm3, %ymm4, %ymm1
3595 ; AVX2-NEXT:    vpxor %ymm5, %ymm2, %ymm3
3596 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm7, %ymm3
3597 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm2, %ymm4, %ymm2
3598 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm2, %ymm1
3599 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
3600 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
3601 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
3602 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
3603 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
3604 ; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
3605 ; AVX2-NEXT:    vzeroupper
3606 ; AVX2-NEXT:    retq
3608 ; AVX512F-LABEL: trunc_usat_v16i64_v16i8:
3609 ; AVX512F:       # %bb.0:
3610 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} zmm0 = [255,255,255,255,255,255,255,255]
3611 ; AVX512F-NEXT:    vpminuq 64(%rdi), %zmm0, %zmm1
3612 ; AVX512F-NEXT:    vpminuq (%rdi), %zmm0, %zmm0
3613 ; AVX512F-NEXT:    vpmovqd %zmm0, %ymm0
3614 ; AVX512F-NEXT:    vpmovqd %zmm1, %ymm1
3615 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
3616 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
3617 ; AVX512F-NEXT:    vzeroupper
3618 ; AVX512F-NEXT:    retq
3620 ; AVX512VL-LABEL: trunc_usat_v16i64_v16i8:
3621 ; AVX512VL:       # %bb.0:
3622 ; AVX512VL-NEXT:    vmovdqa64 (%rdi), %zmm0
3623 ; AVX512VL-NEXT:    vmovdqa64 64(%rdi), %zmm1
3624 ; AVX512VL-NEXT:    vpmovusqb %zmm1, %xmm1
3625 ; AVX512VL-NEXT:    vpmovusqb %zmm0, %xmm0
3626 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3627 ; AVX512VL-NEXT:    vzeroupper
3628 ; AVX512VL-NEXT:    retq
3630 ; AVX512BW-LABEL: trunc_usat_v16i64_v16i8:
3631 ; AVX512BW:       # %bb.0:
3632 ; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} zmm0 = [255,255,255,255,255,255,255,255]
3633 ; AVX512BW-NEXT:    vpminuq 64(%rdi), %zmm0, %zmm1
3634 ; AVX512BW-NEXT:    vpminuq (%rdi), %zmm0, %zmm0
3635 ; AVX512BW-NEXT:    vpmovqd %zmm0, %ymm0
3636 ; AVX512BW-NEXT:    vpmovqd %zmm1, %ymm1
3637 ; AVX512BW-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
3638 ; AVX512BW-NEXT:    vpmovdb %zmm0, %xmm0
3639 ; AVX512BW-NEXT:    vzeroupper
3640 ; AVX512BW-NEXT:    retq
3642 ; AVX512BWVL-LABEL: trunc_usat_v16i64_v16i8:
3643 ; AVX512BWVL:       # %bb.0:
3644 ; AVX512BWVL-NEXT:    vmovdqa64 (%rdi), %zmm0
3645 ; AVX512BWVL-NEXT:    vmovdqa64 64(%rdi), %zmm1
3646 ; AVX512BWVL-NEXT:    vpmovusqb %zmm1, %xmm1
3647 ; AVX512BWVL-NEXT:    vpmovusqb %zmm0, %xmm0
3648 ; AVX512BWVL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3649 ; AVX512BWVL-NEXT:    vzeroupper
3650 ; AVX512BWVL-NEXT:    retq
3652 ; SKX-LABEL: trunc_usat_v16i64_v16i8:
3653 ; SKX:       # %bb.0:
3654 ; SKX-NEXT:    vmovdqa64 (%rdi), %zmm0
3655 ; SKX-NEXT:    vmovdqa64 64(%rdi), %zmm1
3656 ; SKX-NEXT:    vpmovusqb %zmm1, %xmm1
3657 ; SKX-NEXT:    vpmovusqb %zmm0, %xmm0
3658 ; SKX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3659 ; SKX-NEXT:    vzeroupper
3660 ; SKX-NEXT:    retq
3661   %a0 = load <16 x i64>, <16 x i64>* %p0
3662   %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>
3663   %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>
3664   %3 = trunc <16 x i64> %2 to <16 x i8>
3665   ret <16 x i8> %3
3668 define <4 x i8> @trunc_usat_v4i32_v4i8(<4 x i32> %a0) {
3669 ; SSE2-LABEL: trunc_usat_v4i32_v4i8:
3670 ; SSE2:       # %bb.0:
3671 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
3672 ; SSE2-NEXT:    pxor %xmm0, %xmm2
3673 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483903,2147483903,2147483903,2147483903]
3674 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
3675 ; SSE2-NEXT:    pand %xmm1, %xmm0
3676 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm1
3677 ; SSE2-NEXT:    por %xmm0, %xmm1
3678 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
3679 ; SSE2-NEXT:    packuswb %xmm1, %xmm1
3680 ; SSE2-NEXT:    packuswb %xmm1, %xmm1
3681 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
3682 ; SSE2-NEXT:    retq
3684 ; SSSE3-LABEL: trunc_usat_v4i32_v4i8:
3685 ; SSSE3:       # %bb.0:
3686 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
3687 ; SSSE3-NEXT:    pxor %xmm0, %xmm1
3688 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483903,2147483903,2147483903,2147483903]
3689 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
3690 ; SSSE3-NEXT:    pand %xmm2, %xmm0
3691 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
3692 ; SSSE3-NEXT:    por %xmm2, %xmm0
3693 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
3694 ; SSSE3-NEXT:    retq
3696 ; SSE41-LABEL: trunc_usat_v4i32_v4i8:
3697 ; SSE41:       # %bb.0:
3698 ; SSE41-NEXT:    pminud {{.*}}(%rip), %xmm0
3699 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
3700 ; SSE41-NEXT:    retq
3702 ; AVX1-LABEL: trunc_usat_v4i32_v4i8:
3703 ; AVX1:       # %bb.0:
3704 ; AVX1-NEXT:    vpminud {{.*}}(%rip), %xmm0, %xmm0
3705 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
3706 ; AVX1-NEXT:    retq
3708 ; AVX2-LABEL: trunc_usat_v4i32_v4i8:
3709 ; AVX2:       # %bb.0:
3710 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [255,255,255,255]
3711 ; AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
3712 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
3713 ; AVX2-NEXT:    retq
3715 ; AVX512F-LABEL: trunc_usat_v4i32_v4i8:
3716 ; AVX512F:       # %bb.0:
3717 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
3718 ; AVX512F-NEXT:    vpmovusdb %zmm0, %xmm0
3719 ; AVX512F-NEXT:    vzeroupper
3720 ; AVX512F-NEXT:    retq
3722 ; AVX512VL-LABEL: trunc_usat_v4i32_v4i8:
3723 ; AVX512VL:       # %bb.0:
3724 ; AVX512VL-NEXT:    vpmovusdb %xmm0, %xmm0
3725 ; AVX512VL-NEXT:    retq
3727 ; AVX512BW-LABEL: trunc_usat_v4i32_v4i8:
3728 ; AVX512BW:       # %bb.0:
3729 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
3730 ; AVX512BW-NEXT:    vpmovusdb %zmm0, %xmm0
3731 ; AVX512BW-NEXT:    vzeroupper
3732 ; AVX512BW-NEXT:    retq
3734 ; AVX512BWVL-LABEL: trunc_usat_v4i32_v4i8:
3735 ; AVX512BWVL:       # %bb.0:
3736 ; AVX512BWVL-NEXT:    vpmovusdb %xmm0, %xmm0
3737 ; AVX512BWVL-NEXT:    retq
3739 ; SKX-LABEL: trunc_usat_v4i32_v4i8:
3740 ; SKX:       # %bb.0:
3741 ; SKX-NEXT:    vpmovusdb %xmm0, %xmm0
3742 ; SKX-NEXT:    retq
3743   %1 = icmp ult <4 x i32> %a0, <i32 255, i32 255, i32 255, i32 255>
3744   %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 255, i32 255, i32 255, i32 255>
3745   %3 = trunc <4 x i32> %2 to <4 x i8>
3746   ret <4 x i8> %3
3749 define void @trunc_usat_v4i32_v4i8_store(<4 x i32> %a0, <4 x i8> *%p1) {
3750 ; SSE2-LABEL: trunc_usat_v4i32_v4i8_store:
3751 ; SSE2:       # %bb.0:
3752 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
3753 ; SSE2-NEXT:    pxor %xmm0, %xmm1
3754 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483903,2147483903,2147483903,2147483903]
3755 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
3756 ; SSE2-NEXT:    pand %xmm2, %xmm0
3757 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm2
3758 ; SSE2-NEXT:    por %xmm0, %xmm2
3759 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
3760 ; SSE2-NEXT:    packuswb %xmm0, %xmm2
3761 ; SSE2-NEXT:    packuswb %xmm0, %xmm2
3762 ; SSE2-NEXT:    movd %xmm2, (%rdi)
3763 ; SSE2-NEXT:    retq
3765 ; SSSE3-LABEL: trunc_usat_v4i32_v4i8_store:
3766 ; SSSE3:       # %bb.0:
3767 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
3768 ; SSSE3-NEXT:    pxor %xmm0, %xmm1
3769 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483903,2147483903,2147483903,2147483903]
3770 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
3771 ; SSSE3-NEXT:    pand %xmm2, %xmm0
3772 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm2
3773 ; SSSE3-NEXT:    por %xmm0, %xmm2
3774 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
3775 ; SSSE3-NEXT:    movd %xmm2, (%rdi)
3776 ; SSSE3-NEXT:    retq
3778 ; SSE41-LABEL: trunc_usat_v4i32_v4i8_store:
3779 ; SSE41:       # %bb.0:
3780 ; SSE41-NEXT:    pminud {{.*}}(%rip), %xmm0
3781 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
3782 ; SSE41-NEXT:    movd %xmm0, (%rdi)
3783 ; SSE41-NEXT:    retq
3785 ; AVX1-LABEL: trunc_usat_v4i32_v4i8_store:
3786 ; AVX1:       # %bb.0:
3787 ; AVX1-NEXT:    vpminud {{.*}}(%rip), %xmm0, %xmm0
3788 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
3789 ; AVX1-NEXT:    vmovd %xmm0, (%rdi)
3790 ; AVX1-NEXT:    retq
3792 ; AVX2-LABEL: trunc_usat_v4i32_v4i8_store:
3793 ; AVX2:       # %bb.0:
3794 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [255,255,255,255]
3795 ; AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
3796 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
3797 ; AVX2-NEXT:    vmovd %xmm0, (%rdi)
3798 ; AVX2-NEXT:    retq
3800 ; AVX512F-LABEL: trunc_usat_v4i32_v4i8_store:
3801 ; AVX512F:       # %bb.0:
3802 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
3803 ; AVX512F-NEXT:    vpmovusdb %zmm0, %xmm0
3804 ; AVX512F-NEXT:    vmovd %xmm0, (%rdi)
3805 ; AVX512F-NEXT:    vzeroupper
3806 ; AVX512F-NEXT:    retq
3808 ; AVX512VL-LABEL: trunc_usat_v4i32_v4i8_store:
3809 ; AVX512VL:       # %bb.0:
3810 ; AVX512VL-NEXT:    vpmovusdb %xmm0, (%rdi)
3811 ; AVX512VL-NEXT:    retq
3813 ; AVX512BW-LABEL: trunc_usat_v4i32_v4i8_store:
3814 ; AVX512BW:       # %bb.0:
3815 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
3816 ; AVX512BW-NEXT:    vpmovusdb %zmm0, %xmm0
3817 ; AVX512BW-NEXT:    vmovd %xmm0, (%rdi)
3818 ; AVX512BW-NEXT:    vzeroupper
3819 ; AVX512BW-NEXT:    retq
3821 ; AVX512BWVL-LABEL: trunc_usat_v4i32_v4i8_store:
3822 ; AVX512BWVL:       # %bb.0:
3823 ; AVX512BWVL-NEXT:    vpmovusdb %xmm0, (%rdi)
3824 ; AVX512BWVL-NEXT:    retq
3826 ; SKX-LABEL: trunc_usat_v4i32_v4i8_store:
3827 ; SKX:       # %bb.0:
3828 ; SKX-NEXT:    vpmovusdb %xmm0, (%rdi)
3829 ; SKX-NEXT:    retq
3830   %1 = icmp ult <4 x i32> %a0, <i32 255, i32 255, i32 255, i32 255>
3831   %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 255, i32 255, i32 255, i32 255>
3832   %3 = trunc <4 x i32> %2 to <4 x i8>
3833   store <4 x i8> %3, <4 x i8> *%p1
3834   ret void
3837 define <8 x i8> @trunc_usat_v8i32_v8i8(<8 x i32> %a0) {
3838 ; SSE2-LABEL: trunc_usat_v8i32_v8i8:
3839 ; SSE2:       # %bb.0:
3840 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255]
3841 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
3842 ; SSE2-NEXT:    movdqa %xmm1, %xmm5
3843 ; SSE2-NEXT:    pxor %xmm4, %xmm5
3844 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483903,2147483903,2147483903,2147483903]
3845 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
3846 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
3847 ; SSE2-NEXT:    pand %xmm6, %xmm1
3848 ; SSE2-NEXT:    pandn %xmm3, %xmm6
3849 ; SSE2-NEXT:    por %xmm1, %xmm6
3850 ; SSE2-NEXT:    pxor %xmm0, %xmm4
3851 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
3852 ; SSE2-NEXT:    pand %xmm2, %xmm0
3853 ; SSE2-NEXT:    pandn %xmm3, %xmm2
3854 ; SSE2-NEXT:    por %xmm0, %xmm2
3855 ; SSE2-NEXT:    packuswb %xmm6, %xmm2
3856 ; SSE2-NEXT:    packuswb %xmm2, %xmm2
3857 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
3858 ; SSE2-NEXT:    retq
3860 ; SSSE3-LABEL: trunc_usat_v8i32_v8i8:
3861 ; SSSE3:       # %bb.0:
3862 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
3863 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
3864 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
3865 ; SSSE3-NEXT:    pxor %xmm3, %xmm4
3866 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
3867 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
3868 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
3869 ; SSSE3-NEXT:    pand %xmm6, %xmm0
3870 ; SSSE3-NEXT:    pandn %xmm2, %xmm6
3871 ; SSSE3-NEXT:    por %xmm6, %xmm0
3872 ; SSSE3-NEXT:    pxor %xmm1, %xmm3
3873 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
3874 ; SSSE3-NEXT:    pand %xmm5, %xmm1
3875 ; SSSE3-NEXT:    pandn %xmm2, %xmm5
3876 ; SSSE3-NEXT:    por %xmm1, %xmm5
3877 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
3878 ; SSSE3-NEXT:    pshufb %xmm1, %xmm5
3879 ; SSSE3-NEXT:    pshufb %xmm1, %xmm0
3880 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
3881 ; SSSE3-NEXT:    retq
3883 ; SSE41-LABEL: trunc_usat_v8i32_v8i8:
3884 ; SSE41:       # %bb.0:
3885 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
3886 ; SSE41-NEXT:    pminud %xmm2, %xmm0
3887 ; SSE41-NEXT:    pminud %xmm2, %xmm1
3888 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
3889 ; SSE41-NEXT:    pshufb %xmm2, %xmm1
3890 ; SSE41-NEXT:    pshufb %xmm2, %xmm0
3891 ; SSE41-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3892 ; SSE41-NEXT:    retq
3894 ; AVX1-LABEL: trunc_usat_v8i32_v8i8:
3895 ; AVX1:       # %bb.0:
3896 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [255,255,255,255]
3897 ; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm2
3898 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
3899 ; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
3900 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
3901 ; AVX1-NEXT:    vpshufb %xmm1, %xmm0, %xmm0
3902 ; AVX1-NEXT:    vpshufb %xmm1, %xmm2, %xmm1
3903 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
3904 ; AVX1-NEXT:    vzeroupper
3905 ; AVX1-NEXT:    retq
3907 ; AVX2-LABEL: trunc_usat_v8i32_v8i8:
3908 ; AVX2:       # %bb.0:
3909 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
3910 ; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
3911 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
3912 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
3913 ; AVX2-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
3914 ; AVX2-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
3915 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3916 ; AVX2-NEXT:    vzeroupper
3917 ; AVX2-NEXT:    retq
3919 ; AVX512F-LABEL: trunc_usat_v8i32_v8i8:
3920 ; AVX512F:       # %bb.0:
3921 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
3922 ; AVX512F-NEXT:    vpmovusdb %zmm0, %xmm0
3923 ; AVX512F-NEXT:    vzeroupper
3924 ; AVX512F-NEXT:    retq
3926 ; AVX512VL-LABEL: trunc_usat_v8i32_v8i8:
3927 ; AVX512VL:       # %bb.0:
3928 ; AVX512VL-NEXT:    vpmovusdb %ymm0, %xmm0
3929 ; AVX512VL-NEXT:    vzeroupper
3930 ; AVX512VL-NEXT:    retq
3932 ; AVX512BW-LABEL: trunc_usat_v8i32_v8i8:
3933 ; AVX512BW:       # %bb.0:
3934 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
3935 ; AVX512BW-NEXT:    vpmovusdb %zmm0, %xmm0
3936 ; AVX512BW-NEXT:    vzeroupper
3937 ; AVX512BW-NEXT:    retq
3939 ; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i8:
3940 ; AVX512BWVL:       # %bb.0:
3941 ; AVX512BWVL-NEXT:    vpmovusdb %ymm0, %xmm0
3942 ; AVX512BWVL-NEXT:    vzeroupper
3943 ; AVX512BWVL-NEXT:    retq
3945 ; SKX-LABEL: trunc_usat_v8i32_v8i8:
3946 ; SKX:       # %bb.0:
3947 ; SKX-NEXT:    vpmovusdb %ymm0, %xmm0
3948 ; SKX-NEXT:    vzeroupper
3949 ; SKX-NEXT:    retq
3950   %1 = icmp ult <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
3951   %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>
3952   %3 = trunc <8 x i32> %2 to <8 x i8>
3953   ret <8 x i8> %3
3956 define void @trunc_usat_v8i32_v8i8_store(<8 x i32> %a0, <8 x i8> *%p1) {
3957 ; SSE2-LABEL: trunc_usat_v8i32_v8i8_store:
3958 ; SSE2:       # %bb.0:
3959 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
3960 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
3961 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
3962 ; SSE2-NEXT:    pxor %xmm3, %xmm4
3963 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
3964 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
3965 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
3966 ; SSE2-NEXT:    pand %xmm6, %xmm1
3967 ; SSE2-NEXT:    pandn %xmm2, %xmm6
3968 ; SSE2-NEXT:    por %xmm1, %xmm6
3969 ; SSE2-NEXT:    pxor %xmm0, %xmm3
3970 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
3971 ; SSE2-NEXT:    pand %xmm5, %xmm0
3972 ; SSE2-NEXT:    pandn %xmm2, %xmm5
3973 ; SSE2-NEXT:    por %xmm0, %xmm5
3974 ; SSE2-NEXT:    packuswb %xmm6, %xmm5
3975 ; SSE2-NEXT:    packuswb %xmm0, %xmm5
3976 ; SSE2-NEXT:    movq %xmm5, (%rdi)
3977 ; SSE2-NEXT:    retq
3979 ; SSSE3-LABEL: trunc_usat_v8i32_v8i8_store:
3980 ; SSSE3:       # %bb.0:
3981 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
3982 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
3983 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
3984 ; SSSE3-NEXT:    pxor %xmm3, %xmm4
3985 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
3986 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
3987 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
3988 ; SSSE3-NEXT:    pand %xmm6, %xmm0
3989 ; SSSE3-NEXT:    pandn %xmm2, %xmm6
3990 ; SSSE3-NEXT:    por %xmm0, %xmm6
3991 ; SSSE3-NEXT:    pxor %xmm1, %xmm3
3992 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
3993 ; SSSE3-NEXT:    pand %xmm5, %xmm1
3994 ; SSSE3-NEXT:    pandn %xmm2, %xmm5
3995 ; SSSE3-NEXT:    por %xmm1, %xmm5
3996 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
3997 ; SSSE3-NEXT:    pshufb %xmm0, %xmm5
3998 ; SSSE3-NEXT:    pshufb %xmm0, %xmm6
3999 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1]
4000 ; SSSE3-NEXT:    movq %xmm6, (%rdi)
4001 ; SSSE3-NEXT:    retq
4003 ; SSE41-LABEL: trunc_usat_v8i32_v8i8_store:
4004 ; SSE41:       # %bb.0:
4005 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
4006 ; SSE41-NEXT:    pminud %xmm2, %xmm0
4007 ; SSE41-NEXT:    pminud %xmm2, %xmm1
4008 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
4009 ; SSE41-NEXT:    pshufb %xmm2, %xmm1
4010 ; SSE41-NEXT:    pshufb %xmm2, %xmm0
4011 ; SSE41-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
4012 ; SSE41-NEXT:    movq %xmm0, (%rdi)
4013 ; SSE41-NEXT:    retq
4015 ; AVX1-LABEL: trunc_usat_v8i32_v8i8_store:
4016 ; AVX1:       # %bb.0:
4017 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [255,255,255,255]
4018 ; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm2
4019 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
4020 ; AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
4021 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
4022 ; AVX1-NEXT:    vpshufb %xmm1, %xmm0, %xmm0
4023 ; AVX1-NEXT:    vpshufb %xmm1, %xmm2, %xmm1
4024 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
4025 ; AVX1-NEXT:    vmovq %xmm0, (%rdi)
4026 ; AVX1-NEXT:    vzeroupper
4027 ; AVX1-NEXT:    retq
4029 ; AVX2-LABEL: trunc_usat_v8i32_v8i8_store:
4030 ; AVX2:       # %bb.0:
4031 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
4032 ; AVX2-NEXT:    vpminud %ymm1, %ymm0, %ymm0
4033 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
4034 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
4035 ; AVX2-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
4036 ; AVX2-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
4037 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
4038 ; AVX2-NEXT:    vmovq %xmm0, (%rdi)
4039 ; AVX2-NEXT:    vzeroupper
4040 ; AVX2-NEXT:    retq
4042 ; AVX512F-LABEL: trunc_usat_v8i32_v8i8_store:
4043 ; AVX512F:       # %bb.0:
4044 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
4045 ; AVX512F-NEXT:    vpmovusdb %zmm0, %xmm0
4046 ; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
4047 ; AVX512F-NEXT:    vzeroupper
4048 ; AVX512F-NEXT:    retq
4050 ; AVX512VL-LABEL: trunc_usat_v8i32_v8i8_store:
4051 ; AVX512VL:       # %bb.0:
4052 ; AVX512VL-NEXT:    vpmovusdb %ymm0, (%rdi)
4053 ; AVX512VL-NEXT:    vzeroupper
4054 ; AVX512VL-NEXT:    retq
4056 ; AVX512BW-LABEL: trunc_usat_v8i32_v8i8_store:
4057 ; AVX512BW:       # %bb.0:
4058 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
4059 ; AVX512BW-NEXT:    vpmovusdb %zmm0, %xmm0
4060 ; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
4061 ; AVX512BW-NEXT:    vzeroupper
4062 ; AVX512BW-NEXT:    retq
4064 ; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i8_store:
4065 ; AVX512BWVL:       # %bb.0:
4066 ; AVX512BWVL-NEXT:    vpmovusdb %ymm0, (%rdi)
4067 ; AVX512BWVL-NEXT:    vzeroupper
4068 ; AVX512BWVL-NEXT:    retq
4070 ; SKX-LABEL: trunc_usat_v8i32_v8i8_store:
4071 ; SKX:       # %bb.0:
4072 ; SKX-NEXT:    vpmovusdb %ymm0, (%rdi)
4073 ; SKX-NEXT:    vzeroupper
4074 ; SKX-NEXT:    retq
4075   %1 = icmp ult <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
4076   %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>
4077   %3 = trunc <8 x i32> %2 to <8 x i8>
4078   store <8 x i8> %3, <8 x i8> *%p1
4079   ret void
4082 define <16 x i8> @trunc_usat_v16i32_v16i8(<16 x i32>* %p0) {
4083 ; SSE2-LABEL: trunc_usat_v16i32_v16i8:
4084 ; SSE2:       # %bb.0:
4085 ; SSE2-NEXT:    movdqa (%rdi), %xmm6
4086 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm0
4087 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm1
4088 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm5
4089 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255,255,255]
4090 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
4091 ; SSE2-NEXT:    movdqa %xmm0, %xmm7
4092 ; SSE2-NEXT:    pxor %xmm4, %xmm7
4093 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483903,2147483903,2147483903,2147483903]
4094 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
4095 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm2
4096 ; SSE2-NEXT:    pand %xmm2, %xmm0
4097 ; SSE2-NEXT:    pandn %xmm8, %xmm2
4098 ; SSE2-NEXT:    por %xmm0, %xmm2
4099 ; SSE2-NEXT:    movdqa %xmm6, %xmm7
4100 ; SSE2-NEXT:    pxor %xmm4, %xmm7
4101 ; SSE2-NEXT:    movdqa %xmm3, %xmm0
4102 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm0
4103 ; SSE2-NEXT:    pand %xmm0, %xmm6
4104 ; SSE2-NEXT:    pandn %xmm8, %xmm0
4105 ; SSE2-NEXT:    por %xmm6, %xmm0
4106 ; SSE2-NEXT:    packuswb %xmm2, %xmm0
4107 ; SSE2-NEXT:    movdqa %xmm5, %xmm2
4108 ; SSE2-NEXT:    pxor %xmm4, %xmm2
4109 ; SSE2-NEXT:    movdqa %xmm3, %xmm6
4110 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
4111 ; SSE2-NEXT:    pand %xmm6, %xmm5
4112 ; SSE2-NEXT:    pandn %xmm8, %xmm6
4113 ; SSE2-NEXT:    por %xmm5, %xmm6
4114 ; SSE2-NEXT:    pxor %xmm1, %xmm4
4115 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm3
4116 ; SSE2-NEXT:    pand %xmm3, %xmm1
4117 ; SSE2-NEXT:    pandn %xmm8, %xmm3
4118 ; SSE2-NEXT:    por %xmm1, %xmm3
4119 ; SSE2-NEXT:    packuswb %xmm6, %xmm3
4120 ; SSE2-NEXT:    packuswb %xmm3, %xmm0
4121 ; SSE2-NEXT:    retq
4123 ; SSSE3-LABEL: trunc_usat_v16i32_v16i8:
4124 ; SSSE3:       # %bb.0:
4125 ; SSSE3-NEXT:    movdqa (%rdi), %xmm6
4126 ; SSSE3-NEXT:    movdqa 16(%rdi), %xmm0
4127 ; SSSE3-NEXT:    movdqa 32(%rdi), %xmm1
4128 ; SSSE3-NEXT:    movdqa 48(%rdi), %xmm5
4129 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255,255,255]
4130 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
4131 ; SSSE3-NEXT:    movdqa %xmm0, %xmm7
4132 ; SSSE3-NEXT:    pxor %xmm4, %xmm7
4133 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483903,2147483903,2147483903,2147483903]
4134 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
4135 ; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm2
4136 ; SSSE3-NEXT:    pand %xmm2, %xmm0
4137 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
4138 ; SSSE3-NEXT:    por %xmm0, %xmm2
4139 ; SSSE3-NEXT:    movdqa %xmm6, %xmm7
4140 ; SSSE3-NEXT:    pxor %xmm4, %xmm7
4141 ; SSSE3-NEXT:    movdqa %xmm3, %xmm0
4142 ; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm0
4143 ; SSSE3-NEXT:    pand %xmm0, %xmm6
4144 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
4145 ; SSSE3-NEXT:    por %xmm6, %xmm0
4146 ; SSSE3-NEXT:    packuswb %xmm2, %xmm0
4147 ; SSSE3-NEXT:    movdqa %xmm5, %xmm2
4148 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
4149 ; SSSE3-NEXT:    movdqa %xmm3, %xmm6
4150 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm6
4151 ; SSSE3-NEXT:    pand %xmm6, %xmm5
4152 ; SSSE3-NEXT:    pandn %xmm8, %xmm6
4153 ; SSSE3-NEXT:    por %xmm5, %xmm6
4154 ; SSSE3-NEXT:    pxor %xmm1, %xmm4
4155 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm3
4156 ; SSSE3-NEXT:    pand %xmm3, %xmm1
4157 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
4158 ; SSSE3-NEXT:    por %xmm1, %xmm3
4159 ; SSSE3-NEXT:    packuswb %xmm6, %xmm3
4160 ; SSSE3-NEXT:    packuswb %xmm3, %xmm0
4161 ; SSSE3-NEXT:    retq
4163 ; SSE41-LABEL: trunc_usat_v16i32_v16i8:
4164 ; SSE41:       # %bb.0:
4165 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255]
4166 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm2
4167 ; SSE41-NEXT:    pminud %xmm1, %xmm2
4168 ; SSE41-NEXT:    movdqa (%rdi), %xmm0
4169 ; SSE41-NEXT:    pminud %xmm1, %xmm0
4170 ; SSE41-NEXT:    packusdw %xmm2, %xmm0
4171 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm2
4172 ; SSE41-NEXT:    pminud %xmm1, %xmm2
4173 ; SSE41-NEXT:    pminud 32(%rdi), %xmm1
4174 ; SSE41-NEXT:    packusdw %xmm2, %xmm1
4175 ; SSE41-NEXT:    packuswb %xmm1, %xmm0
4176 ; SSE41-NEXT:    retq
4178 ; AVX1-LABEL: trunc_usat_v16i32_v16i8:
4179 ; AVX1:       # %bb.0:
4180 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm0 = [255,255,255,255]
4181 ; AVX1-NEXT:    vpminud 16(%rdi), %xmm0, %xmm1
4182 ; AVX1-NEXT:    vpminud (%rdi), %xmm0, %xmm2
4183 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm2, %xmm1
4184 ; AVX1-NEXT:    vpminud 48(%rdi), %xmm0, %xmm2
4185 ; AVX1-NEXT:    vpminud 32(%rdi), %xmm0, %xmm0
4186 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
4187 ; AVX1-NEXT:    vpackuswb %xmm0, %xmm1, %xmm0
4188 ; AVX1-NEXT:    retq
4190 ; AVX2-LABEL: trunc_usat_v16i32_v16i8:
4191 ; AVX2:       # %bb.0:
4192 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255]
4193 ; AVX2-NEXT:    vpminud 32(%rdi), %ymm0, %ymm1
4194 ; AVX2-NEXT:    vpminud (%rdi), %ymm0, %ymm0
4195 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
4196 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4197 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
4198 ; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
4199 ; AVX2-NEXT:    vzeroupper
4200 ; AVX2-NEXT:    retq
4202 ; AVX512-LABEL: trunc_usat_v16i32_v16i8:
4203 ; AVX512:       # %bb.0:
4204 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
4205 ; AVX512-NEXT:    vpmovusdb %zmm0, %xmm0
4206 ; AVX512-NEXT:    vzeroupper
4207 ; AVX512-NEXT:    retq
4209 ; SKX-LABEL: trunc_usat_v16i32_v16i8:
4210 ; SKX:       # %bb.0:
4211 ; SKX-NEXT:    vmovdqa64 (%rdi), %zmm0
4212 ; SKX-NEXT:    vpmovusdb %zmm0, %xmm0
4213 ; SKX-NEXT:    vzeroupper
4214 ; SKX-NEXT:    retq
4215   %a0 = load <16 x i32>, <16 x i32>* %p0
4216   %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>
4217   %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>
4218   %3 = trunc <16 x i32> %2 to <16 x i8>
4219   ret <16 x i8> %3
4222 define void @trunc_usat_v16i32_v16i8_store(<16 x i32>* %p0, <16 x i8>* %p1) {
4223 ; SSE2-LABEL: trunc_usat_v16i32_v16i8_store:
4224 ; SSE2:       # %bb.0:
4225 ; SSE2-NEXT:    movdqa (%rdi), %xmm6
4226 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm5
4227 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm0
4228 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm4
4229 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255,255,255]
4230 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
4231 ; SSE2-NEXT:    movdqa %xmm5, %xmm7
4232 ; SSE2-NEXT:    pxor %xmm3, %xmm7
4233 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483903,2147483903,2147483903,2147483903]
4234 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
4235 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm1
4236 ; SSE2-NEXT:    pand %xmm1, %xmm5
4237 ; SSE2-NEXT:    pandn %xmm8, %xmm1
4238 ; SSE2-NEXT:    por %xmm5, %xmm1
4239 ; SSE2-NEXT:    movdqa %xmm6, %xmm7
4240 ; SSE2-NEXT:    pxor %xmm3, %xmm7
4241 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
4242 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
4243 ; SSE2-NEXT:    pand %xmm5, %xmm6
4244 ; SSE2-NEXT:    pandn %xmm8, %xmm5
4245 ; SSE2-NEXT:    por %xmm6, %xmm5
4246 ; SSE2-NEXT:    packuswb %xmm1, %xmm5
4247 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
4248 ; SSE2-NEXT:    pxor %xmm3, %xmm1
4249 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
4250 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm6
4251 ; SSE2-NEXT:    pand %xmm6, %xmm4
4252 ; SSE2-NEXT:    pandn %xmm8, %xmm6
4253 ; SSE2-NEXT:    por %xmm4, %xmm6
4254 ; SSE2-NEXT:    pxor %xmm0, %xmm3
4255 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
4256 ; SSE2-NEXT:    pand %xmm2, %xmm0
4257 ; SSE2-NEXT:    pandn %xmm8, %xmm2
4258 ; SSE2-NEXT:    por %xmm0, %xmm2
4259 ; SSE2-NEXT:    packuswb %xmm6, %xmm2
4260 ; SSE2-NEXT:    packuswb %xmm2, %xmm5
4261 ; SSE2-NEXT:    movdqa %xmm5, (%rsi)
4262 ; SSE2-NEXT:    retq
4264 ; SSSE3-LABEL: trunc_usat_v16i32_v16i8_store:
4265 ; SSSE3:       # %bb.0:
4266 ; SSSE3-NEXT:    movdqa (%rdi), %xmm6
4267 ; SSSE3-NEXT:    movdqa 16(%rdi), %xmm5
4268 ; SSSE3-NEXT:    movdqa 32(%rdi), %xmm0
4269 ; SSSE3-NEXT:    movdqa 48(%rdi), %xmm4
4270 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255,255,255]
4271 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
4272 ; SSSE3-NEXT:    movdqa %xmm5, %xmm7
4273 ; SSSE3-NEXT:    pxor %xmm3, %xmm7
4274 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483903,2147483903,2147483903,2147483903]
4275 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
4276 ; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm1
4277 ; SSSE3-NEXT:    pand %xmm1, %xmm5
4278 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
4279 ; SSSE3-NEXT:    por %xmm5, %xmm1
4280 ; SSSE3-NEXT:    movdqa %xmm6, %xmm7
4281 ; SSSE3-NEXT:    pxor %xmm3, %xmm7
4282 ; SSSE3-NEXT:    movdqa %xmm2, %xmm5
4283 ; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm5
4284 ; SSSE3-NEXT:    pand %xmm5, %xmm6
4285 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
4286 ; SSSE3-NEXT:    por %xmm6, %xmm5
4287 ; SSSE3-NEXT:    packuswb %xmm1, %xmm5
4288 ; SSSE3-NEXT:    movdqa %xmm4, %xmm1
4289 ; SSSE3-NEXT:    pxor %xmm3, %xmm1
4290 ; SSSE3-NEXT:    movdqa %xmm2, %xmm6
4291 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm6
4292 ; SSSE3-NEXT:    pand %xmm6, %xmm4
4293 ; SSSE3-NEXT:    pandn %xmm8, %xmm6
4294 ; SSSE3-NEXT:    por %xmm4, %xmm6
4295 ; SSSE3-NEXT:    pxor %xmm0, %xmm3
4296 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm2
4297 ; SSSE3-NEXT:    pand %xmm2, %xmm0
4298 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
4299 ; SSSE3-NEXT:    por %xmm0, %xmm2
4300 ; SSSE3-NEXT:    packuswb %xmm6, %xmm2
4301 ; SSSE3-NEXT:    packuswb %xmm2, %xmm5
4302 ; SSSE3-NEXT:    movdqa %xmm5, (%rsi)
4303 ; SSSE3-NEXT:    retq
4305 ; SSE41-LABEL: trunc_usat_v16i32_v16i8_store:
4306 ; SSE41:       # %bb.0:
4307 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [255,255,255,255]
4308 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm1
4309 ; SSE41-NEXT:    pminud %xmm0, %xmm1
4310 ; SSE41-NEXT:    movdqa (%rdi), %xmm2
4311 ; SSE41-NEXT:    pminud %xmm0, %xmm2
4312 ; SSE41-NEXT:    packusdw %xmm1, %xmm2
4313 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm1
4314 ; SSE41-NEXT:    pminud %xmm0, %xmm1
4315 ; SSE41-NEXT:    pminud 32(%rdi), %xmm0
4316 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
4317 ; SSE41-NEXT:    packuswb %xmm0, %xmm2
4318 ; SSE41-NEXT:    movdqa %xmm2, (%rsi)
4319 ; SSE41-NEXT:    retq
4321 ; AVX1-LABEL: trunc_usat_v16i32_v16i8_store:
4322 ; AVX1:       # %bb.0:
4323 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm0 = [255,255,255,255]
4324 ; AVX1-NEXT:    vpminud 16(%rdi), %xmm0, %xmm1
4325 ; AVX1-NEXT:    vpminud (%rdi), %xmm0, %xmm2
4326 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm2, %xmm1
4327 ; AVX1-NEXT:    vpminud 48(%rdi), %xmm0, %xmm2
4328 ; AVX1-NEXT:    vpminud 32(%rdi), %xmm0, %xmm0
4329 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
4330 ; AVX1-NEXT:    vpackuswb %xmm0, %xmm1, %xmm0
4331 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsi)
4332 ; AVX1-NEXT:    retq
4334 ; AVX2-LABEL: trunc_usat_v16i32_v16i8_store:
4335 ; AVX2:       # %bb.0:
4336 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255]
4337 ; AVX2-NEXT:    vpminud 32(%rdi), %ymm0, %ymm1
4338 ; AVX2-NEXT:    vpminud (%rdi), %ymm0, %ymm0
4339 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
4340 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4341 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
4342 ; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
4343 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsi)
4344 ; AVX2-NEXT:    vzeroupper
4345 ; AVX2-NEXT:    retq
4347 ; AVX512-LABEL: trunc_usat_v16i32_v16i8_store:
4348 ; AVX512:       # %bb.0:
4349 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
4350 ; AVX512-NEXT:    vpmovusdb %zmm0, (%rsi)
4351 ; AVX512-NEXT:    vzeroupper
4352 ; AVX512-NEXT:    retq
4354 ; SKX-LABEL: trunc_usat_v16i32_v16i8_store:
4355 ; SKX:       # %bb.0:
4356 ; SKX-NEXT:    vmovdqa64 (%rdi), %zmm0
4357 ; SKX-NEXT:    vpmovusdb %zmm0, (%rsi)
4358 ; SKX-NEXT:    vzeroupper
4359 ; SKX-NEXT:    retq
4360   %a0 = load <16 x i32>, <16 x i32>* %p0
4361   %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>
4362   %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>
4363   %3 = trunc <16 x i32> %2 to <16 x i8>
4364   store <16 x i8> %3, <16 x i8>* %p1
4365   ret void
4368 define <8 x i8> @trunc_usat_v8i16_v8i8(<8 x i16> %a0) {
4369 ; SSE2-LABEL: trunc_usat_v8i16_v8i8:
4370 ; SSE2:       # %bb.0:
4371 ; SSE2-NEXT:    pxor {{.*}}(%rip), %xmm0
4372 ; SSE2-NEXT:    pminsw {{.*}}(%rip), %xmm0
4373 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
4374 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
4375 ; SSE2-NEXT:    retq
4377 ; SSSE3-LABEL: trunc_usat_v8i16_v8i8:
4378 ; SSSE3:       # %bb.0:
4379 ; SSSE3-NEXT:    pxor {{.*}}(%rip), %xmm0
4380 ; SSSE3-NEXT:    pminsw {{.*}}(%rip), %xmm0
4381 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
4382 ; SSSE3-NEXT:    retq
4384 ; SSE41-LABEL: trunc_usat_v8i16_v8i8:
4385 ; SSE41:       # %bb.0:
4386 ; SSE41-NEXT:    pminuw {{.*}}(%rip), %xmm0
4387 ; SSE41-NEXT:    packuswb %xmm0, %xmm0
4388 ; SSE41-NEXT:    retq
4390 ; AVX-LABEL: trunc_usat_v8i16_v8i8:
4391 ; AVX:       # %bb.0:
4392 ; AVX-NEXT:    vpminuw {{.*}}(%rip), %xmm0, %xmm0
4393 ; AVX-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
4394 ; AVX-NEXT:    retq
4396 ; AVX512F-LABEL: trunc_usat_v8i16_v8i8:
4397 ; AVX512F:       # %bb.0:
4398 ; AVX512F-NEXT:    vpminuw {{.*}}(%rip), %xmm0, %xmm0
4399 ; AVX512F-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
4400 ; AVX512F-NEXT:    retq
4402 ; AVX512VL-LABEL: trunc_usat_v8i16_v8i8:
4403 ; AVX512VL:       # %bb.0:
4404 ; AVX512VL-NEXT:    vpminuw {{.*}}(%rip), %xmm0, %xmm0
4405 ; AVX512VL-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
4406 ; AVX512VL-NEXT:    retq
4408 ; AVX512BW-LABEL: trunc_usat_v8i16_v8i8:
4409 ; AVX512BW:       # %bb.0:
4410 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
4411 ; AVX512BW-NEXT:    vpmovuswb %zmm0, %ymm0
4412 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4413 ; AVX512BW-NEXT:    vzeroupper
4414 ; AVX512BW-NEXT:    retq
4416 ; AVX512BWVL-LABEL: trunc_usat_v8i16_v8i8:
4417 ; AVX512BWVL:       # %bb.0:
4418 ; AVX512BWVL-NEXT:    vpmovuswb %xmm0, %xmm0
4419 ; AVX512BWVL-NEXT:    retq
4421 ; SKX-LABEL: trunc_usat_v8i16_v8i8:
4422 ; SKX:       # %bb.0:
4423 ; SKX-NEXT:    vpmovuswb %xmm0, %xmm0
4424 ; SKX-NEXT:    retq
4425   %1 = icmp ult <8 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
4426   %2 = select <8 x i1> %1, <8 x i16> %a0, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
4427   %3 = trunc <8 x i16> %2 to <8 x i8>
4428   ret <8 x i8> %3
4431 define void @trunc_usat_v8i16_v8i8_store(<8 x i16> %a0, <8 x i8> *%p1) {
4432 ; SSE2-LABEL: trunc_usat_v8i16_v8i8_store:
4433 ; SSE2:       # %bb.0:
4434 ; SSE2-NEXT:    pxor {{.*}}(%rip), %xmm0
4435 ; SSE2-NEXT:    pminsw {{.*}}(%rip), %xmm0
4436 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
4437 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
4438 ; SSE2-NEXT:    movq %xmm0, (%rdi)
4439 ; SSE2-NEXT:    retq
4441 ; SSSE3-LABEL: trunc_usat_v8i16_v8i8_store:
4442 ; SSSE3:       # %bb.0:
4443 ; SSSE3-NEXT:    pxor {{.*}}(%rip), %xmm0
4444 ; SSSE3-NEXT:    pminsw {{.*}}(%rip), %xmm0
4445 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
4446 ; SSSE3-NEXT:    movq %xmm0, (%rdi)
4447 ; SSSE3-NEXT:    retq
4449 ; SSE41-LABEL: trunc_usat_v8i16_v8i8_store:
4450 ; SSE41:       # %bb.0:
4451 ; SSE41-NEXT:    pminuw {{.*}}(%rip), %xmm0
4452 ; SSE41-NEXT:    packuswb %xmm0, %xmm0
4453 ; SSE41-NEXT:    movq %xmm0, (%rdi)
4454 ; SSE41-NEXT:    retq
4456 ; AVX-LABEL: trunc_usat_v8i16_v8i8_store:
4457 ; AVX:       # %bb.0:
4458 ; AVX-NEXT:    vpminuw {{.*}}(%rip), %xmm0, %xmm0
4459 ; AVX-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
4460 ; AVX-NEXT:    vmovq %xmm0, (%rdi)
4461 ; AVX-NEXT:    retq
4463 ; AVX512F-LABEL: trunc_usat_v8i16_v8i8_store:
4464 ; AVX512F:       # %bb.0:
4465 ; AVX512F-NEXT:    vpminuw {{.*}}(%rip), %xmm0, %xmm0
4466 ; AVX512F-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
4467 ; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
4468 ; AVX512F-NEXT:    retq
4470 ; AVX512VL-LABEL: trunc_usat_v8i16_v8i8_store:
4471 ; AVX512VL:       # %bb.0:
4472 ; AVX512VL-NEXT:    vpminuw {{.*}}(%rip), %xmm0, %xmm0
4473 ; AVX512VL-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
4474 ; AVX512VL-NEXT:    vmovq %xmm0, (%rdi)
4475 ; AVX512VL-NEXT:    retq
4477 ; AVX512BW-LABEL: trunc_usat_v8i16_v8i8_store:
4478 ; AVX512BW:       # %bb.0:
4479 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
4480 ; AVX512BW-NEXT:    vpmovuswb %zmm0, %ymm0
4481 ; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
4482 ; AVX512BW-NEXT:    vzeroupper
4483 ; AVX512BW-NEXT:    retq
4485 ; AVX512BWVL-LABEL: trunc_usat_v8i16_v8i8_store:
4486 ; AVX512BWVL:       # %bb.0:
4487 ; AVX512BWVL-NEXT:    vpmovuswb %xmm0, (%rdi)
4488 ; AVX512BWVL-NEXT:    retq
4490 ; SKX-LABEL: trunc_usat_v8i16_v8i8_store:
4491 ; SKX:       # %bb.0:
4492 ; SKX-NEXT:    vpmovuswb %xmm0, (%rdi)
4493 ; SKX-NEXT:    retq
4494   %1 = icmp ult <8 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
4495   %2 = select <8 x i1> %1, <8 x i16> %a0, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
4496   %3 = trunc <8 x i16> %2 to <8 x i8>
4497   store <8 x i8> %3, <8 x i8> *%p1
4498   ret void
4501 define <16 x i8> @trunc_usat_v16i16_v16i8(<16 x i16> %a0) {
4502 ; SSE2-LABEL: trunc_usat_v16i16_v16i8:
4503 ; SSE2:       # %bb.0:
4504 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
4505 ; SSE2-NEXT:    pxor %xmm2, %xmm1
4506 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [33023,33023,33023,33023,33023,33023,33023,33023]
4507 ; SSE2-NEXT:    pminsw %xmm3, %xmm1
4508 ; SSE2-NEXT:    pxor %xmm2, %xmm1
4509 ; SSE2-NEXT:    pxor %xmm2, %xmm0
4510 ; SSE2-NEXT:    pminsw %xmm3, %xmm0
4511 ; SSE2-NEXT:    pxor %xmm2, %xmm0
4512 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
4513 ; SSE2-NEXT:    retq
4515 ; SSSE3-LABEL: trunc_usat_v16i16_v16i8:
4516 ; SSSE3:       # %bb.0:
4517 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
4518 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
4519 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [33023,33023,33023,33023,33023,33023,33023,33023]
4520 ; SSSE3-NEXT:    pminsw %xmm3, %xmm1
4521 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
4522 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
4523 ; SSSE3-NEXT:    pminsw %xmm3, %xmm0
4524 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
4525 ; SSSE3-NEXT:    packuswb %xmm1, %xmm0
4526 ; SSSE3-NEXT:    retq
4528 ; SSE41-LABEL: trunc_usat_v16i16_v16i8:
4529 ; SSE41:       # %bb.0:
4530 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
4531 ; SSE41-NEXT:    pminuw %xmm2, %xmm1
4532 ; SSE41-NEXT:    pminuw %xmm2, %xmm0
4533 ; SSE41-NEXT:    packuswb %xmm1, %xmm0
4534 ; SSE41-NEXT:    retq
4536 ; AVX1-LABEL: trunc_usat_v16i16_v16i8:
4537 ; AVX1:       # %bb.0:
4538 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
4539 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
4540 ; AVX1-NEXT:    vpminuw %xmm2, %xmm1, %xmm1
4541 ; AVX1-NEXT:    vpminuw %xmm2, %xmm0, %xmm0
4542 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
4543 ; AVX1-NEXT:    vzeroupper
4544 ; AVX1-NEXT:    retq
4546 ; AVX2-LABEL: trunc_usat_v16i16_v16i8:
4547 ; AVX2:       # %bb.0:
4548 ; AVX2-NEXT:    vpminuw {{.*}}(%rip), %ymm0, %ymm0
4549 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
4550 ; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
4551 ; AVX2-NEXT:    vzeroupper
4552 ; AVX2-NEXT:    retq
4554 ; AVX512F-LABEL: trunc_usat_v16i16_v16i8:
4555 ; AVX512F:       # %bb.0:
4556 ; AVX512F-NEXT:    vpminuw {{.*}}(%rip), %ymm0, %ymm0
4557 ; 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
4558 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
4559 ; AVX512F-NEXT:    vzeroupper
4560 ; AVX512F-NEXT:    retq
4562 ; AVX512VL-LABEL: trunc_usat_v16i16_v16i8:
4563 ; AVX512VL:       # %bb.0:
4564 ; AVX512VL-NEXT:    vpminuw {{.*}}(%rip), %ymm0, %ymm0
4565 ; 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
4566 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
4567 ; AVX512VL-NEXT:    vzeroupper
4568 ; AVX512VL-NEXT:    retq
4570 ; AVX512BW-LABEL: trunc_usat_v16i16_v16i8:
4571 ; AVX512BW:       # %bb.0:
4572 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
4573 ; AVX512BW-NEXT:    vpmovuswb %zmm0, %ymm0
4574 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4575 ; AVX512BW-NEXT:    vzeroupper
4576 ; AVX512BW-NEXT:    retq
4578 ; AVX512BWVL-LABEL: trunc_usat_v16i16_v16i8:
4579 ; AVX512BWVL:       # %bb.0:
4580 ; AVX512BWVL-NEXT:    vpmovuswb %ymm0, %xmm0
4581 ; AVX512BWVL-NEXT:    vzeroupper
4582 ; AVX512BWVL-NEXT:    retq
4584 ; SKX-LABEL: trunc_usat_v16i16_v16i8:
4585 ; SKX:       # %bb.0:
4586 ; SKX-NEXT:    vpmovuswb %ymm0, %xmm0
4587 ; SKX-NEXT:    vzeroupper
4588 ; SKX-NEXT:    retq
4589   %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>
4590   %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>
4591   %3 = trunc <16 x i16> %2 to <16 x i8>
4592   ret <16 x i8> %3
4595 define <32 x i8> @trunc_usat_v32i16_v32i8(<32 x i16>* %p0) {
4596 ; SSE2-LABEL: trunc_usat_v32i16_v32i8:
4597 ; SSE2:       # %bb.0:
4598 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
4599 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm0
4600 ; SSE2-NEXT:    pxor %xmm2, %xmm0
4601 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [33023,33023,33023,33023,33023,33023,33023,33023]
4602 ; SSE2-NEXT:    pminsw %xmm3, %xmm0
4603 ; SSE2-NEXT:    pxor %xmm2, %xmm0
4604 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm1
4605 ; SSE2-NEXT:    pxor %xmm2, %xmm1
4606 ; SSE2-NEXT:    pminsw %xmm3, %xmm1
4607 ; SSE2-NEXT:    pxor %xmm2, %xmm1
4608 ; SSE2-NEXT:    packuswb %xmm0, %xmm1
4609 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm4
4610 ; SSE2-NEXT:    pxor %xmm2, %xmm4
4611 ; SSE2-NEXT:    pminsw %xmm3, %xmm4
4612 ; SSE2-NEXT:    pxor %xmm2, %xmm4
4613 ; SSE2-NEXT:    movdqa (%rdi), %xmm0
4614 ; SSE2-NEXT:    pxor %xmm2, %xmm0
4615 ; SSE2-NEXT:    pminsw %xmm3, %xmm0
4616 ; SSE2-NEXT:    pxor %xmm2, %xmm0
4617 ; SSE2-NEXT:    packuswb %xmm4, %xmm0
4618 ; SSE2-NEXT:    retq
4620 ; SSSE3-LABEL: trunc_usat_v32i16_v32i8:
4621 ; SSSE3:       # %bb.0:
4622 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
4623 ; SSSE3-NEXT:    movdqa 48(%rdi), %xmm0
4624 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
4625 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [33023,33023,33023,33023,33023,33023,33023,33023]
4626 ; SSSE3-NEXT:    pminsw %xmm3, %xmm0
4627 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
4628 ; SSSE3-NEXT:    movdqa 32(%rdi), %xmm1
4629 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
4630 ; SSSE3-NEXT:    pminsw %xmm3, %xmm1
4631 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
4632 ; SSSE3-NEXT:    packuswb %xmm0, %xmm1
4633 ; SSSE3-NEXT:    movdqa 16(%rdi), %xmm4
4634 ; SSSE3-NEXT:    pxor %xmm2, %xmm4
4635 ; SSSE3-NEXT:    pminsw %xmm3, %xmm4
4636 ; SSSE3-NEXT:    pxor %xmm2, %xmm4
4637 ; SSSE3-NEXT:    movdqa (%rdi), %xmm0
4638 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
4639 ; SSSE3-NEXT:    pminsw %xmm3, %xmm0
4640 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
4641 ; SSSE3-NEXT:    packuswb %xmm4, %xmm0
4642 ; SSSE3-NEXT:    retq
4644 ; SSE41-LABEL: trunc_usat_v32i16_v32i8:
4645 ; SSE41:       # %bb.0:
4646 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255]
4647 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm2
4648 ; SSE41-NEXT:    pminuw %xmm0, %xmm2
4649 ; SSE41-NEXT:    movdqa 32(%rdi), %xmm1
4650 ; SSE41-NEXT:    pminuw %xmm0, %xmm1
4651 ; SSE41-NEXT:    packuswb %xmm2, %xmm1
4652 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm2
4653 ; SSE41-NEXT:    pminuw %xmm0, %xmm2
4654 ; SSE41-NEXT:    pminuw (%rdi), %xmm0
4655 ; SSE41-NEXT:    packuswb %xmm2, %xmm0
4656 ; SSE41-NEXT:    retq
4658 ; AVX1-LABEL: trunc_usat_v32i16_v32i8:
4659 ; AVX1:       # %bb.0:
4660 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255]
4661 ; AVX1-NEXT:    vpminuw 16(%rdi), %xmm0, %xmm1
4662 ; AVX1-NEXT:    vpminuw (%rdi), %xmm0, %xmm2
4663 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm2, %xmm1
4664 ; AVX1-NEXT:    vpminuw 48(%rdi), %xmm0, %xmm2
4665 ; AVX1-NEXT:    vpminuw 32(%rdi), %xmm0, %xmm0
4666 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
4667 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
4668 ; AVX1-NEXT:    retq
4670 ; AVX2-LABEL: trunc_usat_v32i16_v32i8:
4671 ; AVX2:       # %bb.0:
4672 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
4673 ; AVX2-NEXT:    vpminuw 32(%rdi), %ymm0, %ymm1
4674 ; AVX2-NEXT:    vpminuw (%rdi), %ymm0, %ymm0
4675 ; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
4676 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4677 ; AVX2-NEXT:    retq
4679 ; AVX512F-LABEL: trunc_usat_v32i16_v32i8:
4680 ; AVX512F:       # %bb.0:
4681 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
4682 ; AVX512F-NEXT:    vpminuw 32(%rdi), %ymm0, %ymm1
4683 ; AVX512F-NEXT:    vpminuw (%rdi), %ymm0, %ymm0
4684 ; 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
4685 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
4686 ; 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
4687 ; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
4688 ; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
4689 ; AVX512F-NEXT:    retq
4691 ; AVX512VL-LABEL: trunc_usat_v32i16_v32i8:
4692 ; AVX512VL:       # %bb.0:
4693 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
4694 ; AVX512VL-NEXT:    vpminuw 32(%rdi), %ymm0, %ymm1
4695 ; AVX512VL-NEXT:    vpminuw (%rdi), %ymm0, %ymm0
4696 ; 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
4697 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
4698 ; 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
4699 ; AVX512VL-NEXT:    vpmovdb %zmm1, %xmm1
4700 ; AVX512VL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
4701 ; AVX512VL-NEXT:    retq
4703 ; AVX512BW-LABEL: trunc_usat_v32i16_v32i8:
4704 ; AVX512BW:       # %bb.0:
4705 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
4706 ; AVX512BW-NEXT:    vpmovuswb %zmm0, %ymm0
4707 ; AVX512BW-NEXT:    retq
4709 ; AVX512BWVL-LABEL: trunc_usat_v32i16_v32i8:
4710 ; AVX512BWVL:       # %bb.0:
4711 ; AVX512BWVL-NEXT:    vmovdqa64 (%rdi), %zmm0
4712 ; AVX512BWVL-NEXT:    vpmovuswb %zmm0, %ymm0
4713 ; AVX512BWVL-NEXT:    retq
4715 ; SKX-LABEL: trunc_usat_v32i16_v32i8:
4716 ; SKX:       # %bb.0:
4717 ; SKX-NEXT:    vmovdqa64 (%rdi), %zmm0
4718 ; SKX-NEXT:    vpmovuswb %zmm0, %ymm0
4719 ; SKX-NEXT:    retq
4720   %a0 = load <32 x i16>, <32 x i16>* %p0
4721   %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>
4722   %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>
4723   %3 = trunc <32 x i16> %2 to <32 x i8>
4724   ret <32 x i8> %3
4727 define <32 x i8> @trunc_usat_v32i32_v32i8(<32 x i32>* %p0) {
4728 ; SSE2-LABEL: trunc_usat_v32i32_v32i8:
4729 ; SSE2:       # %bb.0:
4730 ; SSE2-NEXT:    movdqa (%rdi), %xmm11
4731 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm12
4732 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm9
4733 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm10
4734 ; SSE2-NEXT:    movdqa 96(%rdi), %xmm0
4735 ; SSE2-NEXT:    movdqa 112(%rdi), %xmm2
4736 ; SSE2-NEXT:    movdqa 64(%rdi), %xmm5
4737 ; SSE2-NEXT:    movdqa 80(%rdi), %xmm7
4738 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255,255,255]
4739 ; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
4740 ; SSE2-NEXT:    movdqa %xmm7, %xmm1
4741 ; SSE2-NEXT:    pxor %xmm6, %xmm1
4742 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483903,2147483903,2147483903,2147483903]
4743 ; SSE2-NEXT:    movdqa %xmm4, %xmm3
4744 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
4745 ; SSE2-NEXT:    pand %xmm3, %xmm7
4746 ; SSE2-NEXT:    pandn %xmm8, %xmm3
4747 ; SSE2-NEXT:    por %xmm7, %xmm3
4748 ; SSE2-NEXT:    movdqa %xmm5, %xmm7
4749 ; SSE2-NEXT:    pxor %xmm6, %xmm7
4750 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
4751 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm1
4752 ; SSE2-NEXT:    pand %xmm1, %xmm5
4753 ; SSE2-NEXT:    pandn %xmm8, %xmm1
4754 ; SSE2-NEXT:    por %xmm5, %xmm1
4755 ; SSE2-NEXT:    packuswb %xmm3, %xmm1
4756 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
4757 ; SSE2-NEXT:    pxor %xmm6, %xmm3
4758 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
4759 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
4760 ; SSE2-NEXT:    pand %xmm5, %xmm2
4761 ; SSE2-NEXT:    pandn %xmm8, %xmm5
4762 ; SSE2-NEXT:    por %xmm2, %xmm5
4763 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
4764 ; SSE2-NEXT:    pxor %xmm6, %xmm2
4765 ; SSE2-NEXT:    movdqa %xmm4, %xmm3
4766 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
4767 ; SSE2-NEXT:    pand %xmm3, %xmm0
4768 ; SSE2-NEXT:    pandn %xmm8, %xmm3
4769 ; SSE2-NEXT:    por %xmm0, %xmm3
4770 ; SSE2-NEXT:    packuswb %xmm5, %xmm3
4771 ; SSE2-NEXT:    packuswb %xmm3, %xmm1
4772 ; SSE2-NEXT:    movdqa %xmm12, %xmm0
4773 ; SSE2-NEXT:    pxor %xmm6, %xmm0
4774 ; SSE2-NEXT:    movdqa %xmm4, %xmm2
4775 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
4776 ; SSE2-NEXT:    pand %xmm2, %xmm12
4777 ; SSE2-NEXT:    pandn %xmm8, %xmm2
4778 ; SSE2-NEXT:    por %xmm12, %xmm2
4779 ; SSE2-NEXT:    movdqa %xmm11, %xmm3
4780 ; SSE2-NEXT:    pxor %xmm6, %xmm3
4781 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
4782 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm0
4783 ; SSE2-NEXT:    pand %xmm0, %xmm11
4784 ; SSE2-NEXT:    pandn %xmm8, %xmm0
4785 ; SSE2-NEXT:    por %xmm11, %xmm0
4786 ; SSE2-NEXT:    packuswb %xmm2, %xmm0
4787 ; SSE2-NEXT:    movdqa %xmm10, %xmm2
4788 ; SSE2-NEXT:    pxor %xmm6, %xmm2
4789 ; SSE2-NEXT:    movdqa %xmm4, %xmm3
4790 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
4791 ; SSE2-NEXT:    pand %xmm3, %xmm10
4792 ; SSE2-NEXT:    pandn %xmm8, %xmm3
4793 ; SSE2-NEXT:    por %xmm10, %xmm3
4794 ; SSE2-NEXT:    pxor %xmm9, %xmm6
4795 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm4
4796 ; SSE2-NEXT:    pand %xmm4, %xmm9
4797 ; SSE2-NEXT:    pandn %xmm8, %xmm4
4798 ; SSE2-NEXT:    por %xmm9, %xmm4
4799 ; SSE2-NEXT:    packuswb %xmm3, %xmm4
4800 ; SSE2-NEXT:    packuswb %xmm4, %xmm0
4801 ; SSE2-NEXT:    retq
4803 ; SSSE3-LABEL: trunc_usat_v32i32_v32i8:
4804 ; SSSE3:       # %bb.0:
4805 ; SSSE3-NEXT:    movdqa (%rdi), %xmm11
4806 ; SSSE3-NEXT:    movdqa 16(%rdi), %xmm12
4807 ; SSSE3-NEXT:    movdqa 32(%rdi), %xmm9
4808 ; SSSE3-NEXT:    movdqa 48(%rdi), %xmm10
4809 ; SSSE3-NEXT:    movdqa 96(%rdi), %xmm0
4810 ; SSSE3-NEXT:    movdqa 112(%rdi), %xmm2
4811 ; SSSE3-NEXT:    movdqa 64(%rdi), %xmm5
4812 ; SSSE3-NEXT:    movdqa 80(%rdi), %xmm7
4813 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255,255,255]
4814 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
4815 ; SSSE3-NEXT:    movdqa %xmm7, %xmm1
4816 ; SSSE3-NEXT:    pxor %xmm6, %xmm1
4817 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483903,2147483903,2147483903,2147483903]
4818 ; SSSE3-NEXT:    movdqa %xmm4, %xmm3
4819 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
4820 ; SSSE3-NEXT:    pand %xmm3, %xmm7
4821 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
4822 ; SSSE3-NEXT:    por %xmm7, %xmm3
4823 ; SSSE3-NEXT:    movdqa %xmm5, %xmm7
4824 ; SSSE3-NEXT:    pxor %xmm6, %xmm7
4825 ; SSSE3-NEXT:    movdqa %xmm4, %xmm1
4826 ; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm1
4827 ; SSSE3-NEXT:    pand %xmm1, %xmm5
4828 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
4829 ; SSSE3-NEXT:    por %xmm5, %xmm1
4830 ; SSSE3-NEXT:    packuswb %xmm3, %xmm1
4831 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
4832 ; SSSE3-NEXT:    pxor %xmm6, %xmm3
4833 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
4834 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
4835 ; SSSE3-NEXT:    pand %xmm5, %xmm2
4836 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
4837 ; SSSE3-NEXT:    por %xmm2, %xmm5
4838 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
4839 ; SSSE3-NEXT:    pxor %xmm6, %xmm2
4840 ; SSSE3-NEXT:    movdqa %xmm4, %xmm3
4841 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
4842 ; SSSE3-NEXT:    pand %xmm3, %xmm0
4843 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
4844 ; SSSE3-NEXT:    por %xmm0, %xmm3
4845 ; SSSE3-NEXT:    packuswb %xmm5, %xmm3
4846 ; SSSE3-NEXT:    packuswb %xmm3, %xmm1
4847 ; SSSE3-NEXT:    movdqa %xmm12, %xmm0
4848 ; SSSE3-NEXT:    pxor %xmm6, %xmm0
4849 ; SSSE3-NEXT:    movdqa %xmm4, %xmm2
4850 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
4851 ; SSSE3-NEXT:    pand %xmm2, %xmm12
4852 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
4853 ; SSSE3-NEXT:    por %xmm12, %xmm2
4854 ; SSSE3-NEXT:    movdqa %xmm11, %xmm3
4855 ; SSSE3-NEXT:    pxor %xmm6, %xmm3
4856 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
4857 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm0
4858 ; SSSE3-NEXT:    pand %xmm0, %xmm11
4859 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
4860 ; SSSE3-NEXT:    por %xmm11, %xmm0
4861 ; SSSE3-NEXT:    packuswb %xmm2, %xmm0
4862 ; SSSE3-NEXT:    movdqa %xmm10, %xmm2
4863 ; SSSE3-NEXT:    pxor %xmm6, %xmm2
4864 ; SSSE3-NEXT:    movdqa %xmm4, %xmm3
4865 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
4866 ; SSSE3-NEXT:    pand %xmm3, %xmm10
4867 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
4868 ; SSSE3-NEXT:    por %xmm10, %xmm3
4869 ; SSSE3-NEXT:    pxor %xmm9, %xmm6
4870 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm4
4871 ; SSSE3-NEXT:    pand %xmm4, %xmm9
4872 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
4873 ; SSSE3-NEXT:    por %xmm9, %xmm4
4874 ; SSSE3-NEXT:    packuswb %xmm3, %xmm4
4875 ; SSSE3-NEXT:    packuswb %xmm4, %xmm0
4876 ; SSSE3-NEXT:    retq
4878 ; SSE41-LABEL: trunc_usat_v32i32_v32i8:
4879 ; SSE41:       # %bb.0:
4880 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255]
4881 ; SSE41-NEXT:    movdqa 80(%rdi), %xmm0
4882 ; SSE41-NEXT:    pminud %xmm2, %xmm0
4883 ; SSE41-NEXT:    movdqa 64(%rdi), %xmm1
4884 ; SSE41-NEXT:    pminud %xmm2, %xmm1
4885 ; SSE41-NEXT:    packusdw %xmm0, %xmm1
4886 ; SSE41-NEXT:    movdqa 112(%rdi), %xmm0
4887 ; SSE41-NEXT:    pminud %xmm2, %xmm0
4888 ; SSE41-NEXT:    movdqa 96(%rdi), %xmm3
4889 ; SSE41-NEXT:    pminud %xmm2, %xmm3
4890 ; SSE41-NEXT:    packusdw %xmm0, %xmm3
4891 ; SSE41-NEXT:    packuswb %xmm3, %xmm1
4892 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm3
4893 ; SSE41-NEXT:    pminud %xmm2, %xmm3
4894 ; SSE41-NEXT:    movdqa (%rdi), %xmm0
4895 ; SSE41-NEXT:    pminud %xmm2, %xmm0
4896 ; SSE41-NEXT:    packusdw %xmm3, %xmm0
4897 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm3
4898 ; SSE41-NEXT:    pminud %xmm2, %xmm3
4899 ; SSE41-NEXT:    pminud 32(%rdi), %xmm2
4900 ; SSE41-NEXT:    packusdw %xmm3, %xmm2
4901 ; SSE41-NEXT:    packuswb %xmm2, %xmm0
4902 ; SSE41-NEXT:    retq
4904 ; AVX1-LABEL: trunc_usat_v32i32_v32i8:
4905 ; AVX1:       # %bb.0:
4906 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm0 = [255,255,255,255]
4907 ; AVX1-NEXT:    vpminud 16(%rdi), %xmm0, %xmm1
4908 ; AVX1-NEXT:    vpminud (%rdi), %xmm0, %xmm2
4909 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm2, %xmm1
4910 ; AVX1-NEXT:    vpminud 48(%rdi), %xmm0, %xmm2
4911 ; AVX1-NEXT:    vpminud 32(%rdi), %xmm0, %xmm3
4912 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm3, %xmm2
4913 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
4914 ; AVX1-NEXT:    vpminud 80(%rdi), %xmm0, %xmm2
4915 ; AVX1-NEXT:    vpminud 64(%rdi), %xmm0, %xmm3
4916 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm3, %xmm2
4917 ; AVX1-NEXT:    vpminud 112(%rdi), %xmm0, %xmm3
4918 ; AVX1-NEXT:    vpminud 96(%rdi), %xmm0, %xmm0
4919 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm0, %xmm0
4920 ; AVX1-NEXT:    vpackuswb %xmm0, %xmm2, %xmm0
4921 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
4922 ; AVX1-NEXT:    retq
4924 ; AVX2-LABEL: trunc_usat_v32i32_v32i8:
4925 ; AVX2:       # %bb.0:
4926 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255]
4927 ; AVX2-NEXT:    vpminud 32(%rdi), %ymm0, %ymm1
4928 ; AVX2-NEXT:    vpminud (%rdi), %ymm0, %ymm2
4929 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm2, %ymm1
4930 ; AVX2-NEXT:    vpminud 96(%rdi), %ymm0, %ymm2
4931 ; AVX2-NEXT:    vpminud 64(%rdi), %ymm0, %ymm0
4932 ; AVX2-NEXT:    vpackusdw %ymm2, %ymm0, %ymm0
4933 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4934 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
4935 ; AVX2-NEXT:    vpackuswb %ymm0, %ymm1, %ymm0
4936 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4937 ; AVX2-NEXT:    retq
4939 ; AVX512-LABEL: trunc_usat_v32i32_v32i8:
4940 ; AVX512:       # %bb.0:
4941 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
4942 ; AVX512-NEXT:    vmovdqa64 64(%rdi), %zmm1
4943 ; AVX512-NEXT:    vpmovusdb %zmm0, %xmm0
4944 ; AVX512-NEXT:    vpmovusdb %zmm1, %xmm1
4945 ; AVX512-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
4946 ; AVX512-NEXT:    retq
4948 ; SKX-LABEL: trunc_usat_v32i32_v32i8:
4949 ; SKX:       # %bb.0:
4950 ; SKX-NEXT:    vmovdqa64 (%rdi), %zmm0
4951 ; SKX-NEXT:    vmovdqa64 64(%rdi), %zmm1
4952 ; SKX-NEXT:    vpmovusdb %zmm0, %xmm0
4953 ; SKX-NEXT:    vpmovusdb %zmm1, %xmm1
4954 ; SKX-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
4955 ; SKX-NEXT:    retq
4956   %a0 = load <32 x i32>, <32 x i32>* %p0
4957   %1 = icmp ult <32 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
4958   %2 = select <32 x i1> %1, <32 x i32> %a0, <32 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
4959   %3 = trunc <32 x i32> %2 to <32 x i8>
4960   ret <32 x i8> %3