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=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --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-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST,AVX2-FAST-ALL
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST,AVX2-FAST-PERLANE
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL
11 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL
12 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BW
13 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512
14 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL
15 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL
16 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=skx | FileCheck %s --check-prefixes=SKX
19 ; Unsigned saturation truncation to vXi32
22 define <2 x i32> @trunc_usat_v2i64_v2i32(<2 x i64> %a0) {
23 ; SSE2-LABEL: trunc_usat_v2i64_v2i32:
25 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
26 ; SSE2-NEXT: pxor %xmm0, %xmm1
27 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259455,9223372039002259455]
28 ; SSE2-NEXT: movdqa %xmm2, %xmm3
29 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
30 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
31 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm1
32 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
33 ; SSE2-NEXT: pand %xmm4, %xmm1
34 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
35 ; SSE2-NEXT: por %xmm1, %xmm2
36 ; SSE2-NEXT: pand %xmm2, %xmm0
37 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
38 ; SSE2-NEXT: por %xmm0, %xmm2
39 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
42 ; SSSE3-LABEL: trunc_usat_v2i64_v2i32:
44 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
45 ; SSSE3-NEXT: pxor %xmm0, %xmm1
46 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259455,9223372039002259455]
47 ; SSSE3-NEXT: movdqa %xmm2, %xmm3
48 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3
49 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
50 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm1
51 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
52 ; SSSE3-NEXT: pand %xmm4, %xmm1
53 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
54 ; SSSE3-NEXT: por %xmm1, %xmm2
55 ; SSSE3-NEXT: pand %xmm2, %xmm0
56 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
57 ; SSSE3-NEXT: por %xmm0, %xmm2
58 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
61 ; SSE41-LABEL: trunc_usat_v2i64_v2i32:
63 ; SSE41-NEXT: movdqa %xmm0, %xmm1
64 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [4294967295,4294967295]
65 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
66 ; SSE41-NEXT: pxor %xmm1, %xmm0
67 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259455,9223372039002259455]
68 ; SSE41-NEXT: movdqa %xmm3, %xmm4
69 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
70 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
71 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
72 ; SSE41-NEXT: pand %xmm4, %xmm0
73 ; SSE41-NEXT: por %xmm3, %xmm0
74 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
75 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
78 ; AVX-LABEL: trunc_usat_v2i64_v2i32:
80 ; AVX-NEXT: vmovapd {{.*#+}} xmm1 = [4294967295,4294967295]
81 ; AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
82 ; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372041149743103,9223372041149743103]
83 ; AVX-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
84 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
85 ; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
88 ; AVX512F-LABEL: trunc_usat_v2i64_v2i32:
90 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
91 ; AVX512F-NEXT: vpmovusqd %zmm0, %ymm0
92 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
93 ; AVX512F-NEXT: vzeroupper
96 ; AVX512VL-LABEL: trunc_usat_v2i64_v2i32:
98 ; AVX512VL-NEXT: vpmovusqd %xmm0, %xmm0
101 ; AVX512BW-LABEL: trunc_usat_v2i64_v2i32:
103 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
104 ; AVX512BW-NEXT: vpmovusqd %zmm0, %ymm0
105 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
106 ; AVX512BW-NEXT: vzeroupper
107 ; AVX512BW-NEXT: retq
109 ; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i32:
110 ; AVX512BWVL: # %bb.0:
111 ; AVX512BWVL-NEXT: vpmovusqd %xmm0, %xmm0
112 ; AVX512BWVL-NEXT: retq
114 ; SKX-LABEL: trunc_usat_v2i64_v2i32:
116 ; SKX-NEXT: vpmovusqd %xmm0, %xmm0
118 %1 = icmp ult <2 x i64> %a0, <i64 4294967295, i64 4294967295>
119 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 4294967295, i64 4294967295>
120 %3 = trunc <2 x i64> %2 to <2 x i32>
124 define void @trunc_usat_v2i64_v2i32_store(<2 x i64> %a0, <2 x i32>* %p1) {
125 ; SSE2-LABEL: trunc_usat_v2i64_v2i32_store:
127 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
128 ; SSE2-NEXT: pxor %xmm0, %xmm1
129 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259455,9223372039002259455]
130 ; SSE2-NEXT: movdqa %xmm2, %xmm3
131 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
132 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
133 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm1
134 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
135 ; SSE2-NEXT: pand %xmm4, %xmm1
136 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
137 ; SSE2-NEXT: por %xmm1, %xmm2
138 ; SSE2-NEXT: pand %xmm2, %xmm0
139 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
140 ; SSE2-NEXT: por %xmm0, %xmm2
141 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
142 ; SSE2-NEXT: movq %xmm0, (%rdi)
145 ; SSSE3-LABEL: trunc_usat_v2i64_v2i32_store:
147 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
148 ; SSSE3-NEXT: pxor %xmm0, %xmm1
149 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259455,9223372039002259455]
150 ; SSSE3-NEXT: movdqa %xmm2, %xmm3
151 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3
152 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
153 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm1
154 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
155 ; SSSE3-NEXT: pand %xmm4, %xmm1
156 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
157 ; SSSE3-NEXT: por %xmm1, %xmm2
158 ; SSSE3-NEXT: pand %xmm2, %xmm0
159 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
160 ; SSSE3-NEXT: por %xmm0, %xmm2
161 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
162 ; SSSE3-NEXT: movq %xmm0, (%rdi)
165 ; SSE41-LABEL: trunc_usat_v2i64_v2i32_store:
167 ; SSE41-NEXT: movdqa %xmm0, %xmm1
168 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [4294967295,4294967295]
169 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
170 ; SSE41-NEXT: pxor %xmm1, %xmm0
171 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259455,9223372039002259455]
172 ; SSE41-NEXT: movdqa %xmm3, %xmm4
173 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
174 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
175 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
176 ; SSE41-NEXT: pand %xmm4, %xmm0
177 ; SSE41-NEXT: por %xmm3, %xmm0
178 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
179 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
180 ; SSE41-NEXT: movq %xmm0, (%rdi)
183 ; AVX-LABEL: trunc_usat_v2i64_v2i32_store:
185 ; AVX-NEXT: vmovapd {{.*#+}} xmm1 = [4294967295,4294967295]
186 ; AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
187 ; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372041149743103,9223372041149743103]
188 ; AVX-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
189 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
190 ; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
191 ; AVX-NEXT: vmovlpd %xmm0, (%rdi)
194 ; AVX512F-LABEL: trunc_usat_v2i64_v2i32_store:
196 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
197 ; AVX512F-NEXT: vpmovusqd %zmm0, %ymm0
198 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
199 ; AVX512F-NEXT: vzeroupper
202 ; AVX512VL-LABEL: trunc_usat_v2i64_v2i32_store:
204 ; AVX512VL-NEXT: vpmovusqd %xmm0, (%rdi)
205 ; AVX512VL-NEXT: retq
207 ; AVX512BW-LABEL: trunc_usat_v2i64_v2i32_store:
209 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
210 ; AVX512BW-NEXT: vpmovusqd %zmm0, %ymm0
211 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
212 ; AVX512BW-NEXT: vzeroupper
213 ; AVX512BW-NEXT: retq
215 ; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i32_store:
216 ; AVX512BWVL: # %bb.0:
217 ; AVX512BWVL-NEXT: vpmovusqd %xmm0, (%rdi)
218 ; AVX512BWVL-NEXT: retq
220 ; SKX-LABEL: trunc_usat_v2i64_v2i32_store:
222 ; SKX-NEXT: vpmovusqd %xmm0, (%rdi)
224 %1 = icmp ult <2 x i64> %a0, <i64 4294967295, i64 4294967295>
225 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 4294967295, i64 4294967295>
226 %3 = trunc <2 x i64> %2 to <2 x i32>
227 store <2 x i32> %3, <2 x i32>* %p1
231 define <4 x i32> @trunc_usat_v4i64_v4i32(<4 x i64> %a0) {
232 ; SSE2-LABEL: trunc_usat_v4i64_v4i32:
234 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
235 ; SSE2-NEXT: movdqa %xmm0, %xmm3
236 ; SSE2-NEXT: pxor %xmm2, %xmm3
237 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259455,9223372039002259455]
238 ; SSE2-NEXT: movdqa %xmm4, %xmm5
239 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
240 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
241 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm3
242 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
243 ; SSE2-NEXT: pand %xmm6, %xmm3
244 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
245 ; SSE2-NEXT: por %xmm3, %xmm5
246 ; SSE2-NEXT: pxor %xmm1, %xmm2
247 ; SSE2-NEXT: movdqa %xmm4, %xmm3
248 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
249 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
250 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm2
251 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
252 ; SSE2-NEXT: pand %xmm6, %xmm2
253 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
254 ; SSE2-NEXT: por %xmm2, %xmm3
255 ; SSE2-NEXT: pand %xmm3, %xmm1
256 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
257 ; SSE2-NEXT: por %xmm1, %xmm3
258 ; SSE2-NEXT: pand %xmm5, %xmm0
259 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5
260 ; SSE2-NEXT: por %xmm5, %xmm0
261 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
264 ; SSSE3-LABEL: trunc_usat_v4i64_v4i32:
266 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
267 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
268 ; SSSE3-NEXT: pxor %xmm2, %xmm3
269 ; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259455,9223372039002259455]
270 ; SSSE3-NEXT: movdqa %xmm4, %xmm5
271 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
272 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
273 ; SSSE3-NEXT: pcmpeqd %xmm4, %xmm3
274 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
275 ; SSSE3-NEXT: pand %xmm6, %xmm3
276 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
277 ; SSSE3-NEXT: por %xmm3, %xmm5
278 ; SSSE3-NEXT: pxor %xmm1, %xmm2
279 ; SSSE3-NEXT: movdqa %xmm4, %xmm3
280 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
281 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
282 ; SSSE3-NEXT: pcmpeqd %xmm4, %xmm2
283 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
284 ; SSSE3-NEXT: pand %xmm6, %xmm2
285 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
286 ; SSSE3-NEXT: por %xmm2, %xmm3
287 ; SSSE3-NEXT: pand %xmm3, %xmm1
288 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
289 ; SSSE3-NEXT: por %xmm1, %xmm3
290 ; SSSE3-NEXT: pand %xmm5, %xmm0
291 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5
292 ; SSSE3-NEXT: por %xmm5, %xmm0
293 ; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
296 ; SSE41-LABEL: trunc_usat_v4i64_v4i32:
298 ; SSE41-NEXT: movdqa %xmm0, %xmm2
299 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
300 ; SSE41-NEXT: movdqa %xmm2, %xmm3
301 ; SSE41-NEXT: pxor %xmm0, %xmm3
302 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259455,9223372039002259455]
303 ; SSE41-NEXT: movdqa %xmm4, %xmm5
304 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm5
305 ; SSE41-NEXT: movdqa %xmm4, %xmm6
306 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm6
307 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm6[0,0,2,2]
308 ; SSE41-NEXT: pand %xmm5, %xmm3
309 ; SSE41-NEXT: por %xmm6, %xmm3
310 ; SSE41-NEXT: pxor %xmm1, %xmm0
311 ; SSE41-NEXT: movdqa %xmm4, %xmm5
312 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
313 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
314 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
315 ; SSE41-NEXT: pand %xmm5, %xmm0
316 ; SSE41-NEXT: por %xmm4, %xmm0
317 ; SSE41-NEXT: movapd {{.*#+}} xmm4 = [4294967295,4294967295]
318 ; SSE41-NEXT: movapd {{.*#+}} xmm5 = [4294967295,429496729]
319 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm5
320 ; SSE41-NEXT: movdqa %xmm3, %xmm0
321 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4
322 ; SSE41-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,2],xmm5[0,2]
323 ; SSE41-NEXT: movaps %xmm4, %xmm0
326 ; AVX1-LABEL: trunc_usat_v4i64_v4i32:
328 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
329 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm2
330 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372041149743103,9223372041149743103]
331 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
332 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
333 ; AVX1-NEXT: vpxor %xmm1, %xmm4, %xmm1
334 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1
335 ; AVX1-NEXT: vmovapd {{.*#+}} xmm3 = [4294967295,429496729]
336 ; AVX1-NEXT: vblendvpd %xmm1, %xmm4, %xmm3, %xmm1
337 ; AVX1-NEXT: vmovapd {{.*#+}} xmm3 = [4294967295,4294967295]
338 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
339 ; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
340 ; AVX1-NEXT: vzeroupper
343 ; AVX2-SLOW-LABEL: trunc_usat_v4i64_v4i32:
344 ; AVX2-SLOW: # %bb.0:
345 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
346 ; AVX2-SLOW-NEXT: vpxor %ymm1, %ymm0, %ymm1
347 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
348 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm1
349 ; AVX2-SLOW-NEXT: vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,429496729]
350 ; AVX2-SLOW-NEXT: vblendvpd %ymm1, %ymm0, %ymm2, %ymm0
351 ; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1
352 ; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
353 ; AVX2-SLOW-NEXT: vzeroupper
354 ; AVX2-SLOW-NEXT: retq
356 ; AVX2-FAST-ALL-LABEL: trunc_usat_v4i64_v4i32:
357 ; AVX2-FAST-ALL: # %bb.0:
358 ; AVX2-FAST-ALL-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
359 ; AVX2-FAST-ALL-NEXT: vpxor %ymm1, %ymm0, %ymm1
360 ; AVX2-FAST-ALL-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
361 ; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm1
362 ; AVX2-FAST-ALL-NEXT: vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,429496729]
363 ; AVX2-FAST-ALL-NEXT: vblendvpd %ymm1, %ymm0, %ymm2, %ymm0
364 ; AVX2-FAST-ALL-NEXT: vmovapd {{.*#+}} ymm1 = <0,2,4,6,u,u,u,u>
365 ; AVX2-FAST-ALL-NEXT: vpermps %ymm0, %ymm1, %ymm0
366 ; AVX2-FAST-ALL-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
367 ; AVX2-FAST-ALL-NEXT: vzeroupper
368 ; AVX2-FAST-ALL-NEXT: retq
370 ; AVX2-FAST-PERLANE-LABEL: trunc_usat_v4i64_v4i32:
371 ; AVX2-FAST-PERLANE: # %bb.0:
372 ; AVX2-FAST-PERLANE-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
373 ; AVX2-FAST-PERLANE-NEXT: vpxor %ymm1, %ymm0, %ymm1
374 ; AVX2-FAST-PERLANE-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
375 ; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm1
376 ; AVX2-FAST-PERLANE-NEXT: vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,429496729]
377 ; AVX2-FAST-PERLANE-NEXT: vblendvpd %ymm1, %ymm0, %ymm2, %ymm0
378 ; AVX2-FAST-PERLANE-NEXT: vextractf128 $1, %ymm0, %xmm1
379 ; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
380 ; AVX2-FAST-PERLANE-NEXT: vzeroupper
381 ; AVX2-FAST-PERLANE-NEXT: retq
383 ; AVX512F-LABEL: trunc_usat_v4i64_v4i32:
385 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
386 ; AVX512F-NEXT: vpcmpltuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %k1
387 ; AVX512F-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
388 ; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 {%k1}
389 ; AVX512F-NEXT: vpmovqd %zmm1, %ymm0
390 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
391 ; AVX512F-NEXT: vzeroupper
394 ; AVX512VL-LABEL: trunc_usat_v4i64_v4i32:
396 ; AVX512VL-NEXT: vpcmpltuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %k1
397 ; AVX512VL-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
398 ; AVX512VL-NEXT: vmovdqa64 %ymm0, %ymm1 {%k1}
399 ; AVX512VL-NEXT: vpmovqd %ymm1, %xmm0
400 ; AVX512VL-NEXT: vzeroupper
401 ; AVX512VL-NEXT: retq
403 ; AVX512BW-LABEL: trunc_usat_v4i64_v4i32:
405 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
406 ; AVX512BW-NEXT: vpcmpltuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %k1
407 ; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
408 ; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 {%k1}
409 ; AVX512BW-NEXT: vpmovqd %zmm1, %ymm0
410 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
411 ; AVX512BW-NEXT: vzeroupper
412 ; AVX512BW-NEXT: retq
414 ; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i32:
415 ; AVX512BWVL: # %bb.0:
416 ; AVX512BWVL-NEXT: vpcmpltuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %k1
417 ; AVX512BWVL-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
418 ; AVX512BWVL-NEXT: vmovdqa64 %ymm0, %ymm1 {%k1}
419 ; AVX512BWVL-NEXT: vpmovqd %ymm1, %xmm0
420 ; AVX512BWVL-NEXT: vzeroupper
421 ; AVX512BWVL-NEXT: retq
423 ; SKX-LABEL: trunc_usat_v4i64_v4i32:
425 ; SKX-NEXT: vpcmpltuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %k1
426 ; SKX-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
427 ; SKX-NEXT: vmovdqa64 %ymm0, %ymm1 {%k1}
428 ; SKX-NEXT: vpmovqd %ymm1, %xmm0
429 ; SKX-NEXT: vzeroupper
431 %1 = icmp ult <4 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
432 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 429496729>
433 %3 = trunc <4 x i64> %2 to <4 x i32>
437 define <8 x i32> @trunc_usat_v8i64_v8i32(<8 x i64>* %p0) {
438 ; SSE2-LABEL: trunc_usat_v8i64_v8i32:
440 ; SSE2-NEXT: movdqa (%rdi), %xmm9
441 ; SSE2-NEXT: movdqa 16(%rdi), %xmm5
442 ; SSE2-NEXT: movdqa 32(%rdi), %xmm6
443 ; SSE2-NEXT: movdqa 48(%rdi), %xmm1
444 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [4294967295,4294967295]
445 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
446 ; SSE2-NEXT: movdqa %xmm1, %xmm7
447 ; SSE2-NEXT: pxor %xmm0, %xmm7
448 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [9223372039002259455,9223372039002259455]
449 ; SSE2-NEXT: movdqa %xmm10, %xmm4
450 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm4
451 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[0,0,2,2]
452 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm7
453 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
454 ; SSE2-NEXT: pand %xmm2, %xmm7
455 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
456 ; SSE2-NEXT: por %xmm7, %xmm2
457 ; SSE2-NEXT: pand %xmm2, %xmm1
458 ; SSE2-NEXT: pandn %xmm8, %xmm2
459 ; SSE2-NEXT: por %xmm1, %xmm2
460 ; SSE2-NEXT: movdqa %xmm6, %xmm1
461 ; SSE2-NEXT: pxor %xmm0, %xmm1
462 ; SSE2-NEXT: movdqa %xmm10, %xmm4
463 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4
464 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
465 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm1
466 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
467 ; SSE2-NEXT: pand %xmm7, %xmm3
468 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
469 ; SSE2-NEXT: por %xmm3, %xmm1
470 ; SSE2-NEXT: pand %xmm1, %xmm6
471 ; SSE2-NEXT: pandn %xmm8, %xmm1
472 ; SSE2-NEXT: por %xmm6, %xmm1
473 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
474 ; SSE2-NEXT: movdqa %xmm5, %xmm2
475 ; SSE2-NEXT: pxor %xmm0, %xmm2
476 ; SSE2-NEXT: movdqa %xmm10, %xmm3
477 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
478 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
479 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm2
480 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
481 ; SSE2-NEXT: pand %xmm4, %xmm2
482 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
483 ; SSE2-NEXT: por %xmm2, %xmm3
484 ; SSE2-NEXT: pand %xmm3, %xmm5
485 ; SSE2-NEXT: pandn %xmm8, %xmm3
486 ; SSE2-NEXT: por %xmm5, %xmm3
487 ; SSE2-NEXT: pxor %xmm9, %xmm0
488 ; SSE2-NEXT: movdqa %xmm10, %xmm2
489 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
490 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
491 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm0
492 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
493 ; SSE2-NEXT: pand %xmm4, %xmm5
494 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
495 ; SSE2-NEXT: por %xmm5, %xmm0
496 ; SSE2-NEXT: pand %xmm0, %xmm9
497 ; SSE2-NEXT: pandn %xmm8, %xmm0
498 ; SSE2-NEXT: por %xmm9, %xmm0
499 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
502 ; SSSE3-LABEL: trunc_usat_v8i64_v8i32:
504 ; SSSE3-NEXT: movdqa (%rdi), %xmm9
505 ; SSSE3-NEXT: movdqa 16(%rdi), %xmm5
506 ; SSSE3-NEXT: movdqa 32(%rdi), %xmm6
507 ; SSSE3-NEXT: movdqa 48(%rdi), %xmm1
508 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [4294967295,4294967295]
509 ; SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
510 ; SSSE3-NEXT: movdqa %xmm1, %xmm7
511 ; SSSE3-NEXT: pxor %xmm0, %xmm7
512 ; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [9223372039002259455,9223372039002259455]
513 ; SSSE3-NEXT: movdqa %xmm10, %xmm4
514 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm4
515 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[0,0,2,2]
516 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm7
517 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
518 ; SSSE3-NEXT: pand %xmm2, %xmm7
519 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
520 ; SSSE3-NEXT: por %xmm7, %xmm2
521 ; SSSE3-NEXT: pand %xmm2, %xmm1
522 ; SSSE3-NEXT: pandn %xmm8, %xmm2
523 ; SSSE3-NEXT: por %xmm1, %xmm2
524 ; SSSE3-NEXT: movdqa %xmm6, %xmm1
525 ; SSSE3-NEXT: pxor %xmm0, %xmm1
526 ; SSSE3-NEXT: movdqa %xmm10, %xmm4
527 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4
528 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
529 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1
530 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
531 ; SSSE3-NEXT: pand %xmm7, %xmm3
532 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
533 ; SSSE3-NEXT: por %xmm3, %xmm1
534 ; SSSE3-NEXT: pand %xmm1, %xmm6
535 ; SSSE3-NEXT: pandn %xmm8, %xmm1
536 ; SSSE3-NEXT: por %xmm6, %xmm1
537 ; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
538 ; SSSE3-NEXT: movdqa %xmm5, %xmm2
539 ; SSSE3-NEXT: pxor %xmm0, %xmm2
540 ; SSSE3-NEXT: movdqa %xmm10, %xmm3
541 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
542 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
543 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm2
544 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
545 ; SSSE3-NEXT: pand %xmm4, %xmm2
546 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
547 ; SSSE3-NEXT: por %xmm2, %xmm3
548 ; SSSE3-NEXT: pand %xmm3, %xmm5
549 ; SSSE3-NEXT: pandn %xmm8, %xmm3
550 ; SSSE3-NEXT: por %xmm5, %xmm3
551 ; SSSE3-NEXT: pxor %xmm9, %xmm0
552 ; SSSE3-NEXT: movdqa %xmm10, %xmm2
553 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
554 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
555 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm0
556 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
557 ; SSSE3-NEXT: pand %xmm4, %xmm5
558 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
559 ; SSSE3-NEXT: por %xmm5, %xmm0
560 ; SSSE3-NEXT: pand %xmm0, %xmm9
561 ; SSSE3-NEXT: pandn %xmm8, %xmm0
562 ; SSSE3-NEXT: por %xmm9, %xmm0
563 ; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
566 ; SSE41-LABEL: trunc_usat_v8i64_v8i32:
568 ; SSE41-NEXT: movdqa (%rdi), %xmm8
569 ; SSE41-NEXT: movdqa 16(%rdi), %xmm9
570 ; SSE41-NEXT: movdqa 32(%rdi), %xmm7
571 ; SSE41-NEXT: movdqa 48(%rdi), %xmm1
572 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [4294967295,4294967295]
573 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
574 ; SSE41-NEXT: movdqa %xmm1, %xmm0
575 ; SSE41-NEXT: pxor %xmm5, %xmm0
576 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259455,9223372039002259455]
577 ; SSE41-NEXT: movdqa %xmm3, %xmm6
578 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm6
579 ; SSE41-NEXT: movdqa %xmm3, %xmm4
580 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
581 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
582 ; SSE41-NEXT: pand %xmm6, %xmm0
583 ; SSE41-NEXT: por %xmm4, %xmm0
584 ; SSE41-NEXT: movapd %xmm2, %xmm4
585 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4
586 ; SSE41-NEXT: movdqa %xmm7, %xmm0
587 ; SSE41-NEXT: pxor %xmm5, %xmm0
588 ; SSE41-NEXT: movdqa %xmm3, %xmm1
589 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
590 ; SSE41-NEXT: movdqa %xmm3, %xmm6
591 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
592 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
593 ; SSE41-NEXT: pand %xmm1, %xmm0
594 ; SSE41-NEXT: por %xmm6, %xmm0
595 ; SSE41-NEXT: movapd %xmm2, %xmm1
596 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm1
597 ; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm4[0,2]
598 ; SSE41-NEXT: movdqa %xmm9, %xmm0
599 ; SSE41-NEXT: pxor %xmm5, %xmm0
600 ; SSE41-NEXT: movdqa %xmm3, %xmm4
601 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
602 ; SSE41-NEXT: movdqa %xmm3, %xmm6
603 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
604 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
605 ; SSE41-NEXT: pand %xmm4, %xmm0
606 ; SSE41-NEXT: por %xmm6, %xmm0
607 ; SSE41-NEXT: movapd %xmm2, %xmm4
608 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm4
609 ; SSE41-NEXT: pxor %xmm8, %xmm5
610 ; SSE41-NEXT: movdqa %xmm3, %xmm6
611 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
612 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm3
613 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
614 ; SSE41-NEXT: pand %xmm6, %xmm0
615 ; SSE41-NEXT: por %xmm3, %xmm0
616 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm2
617 ; SSE41-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm4[0,2]
618 ; SSE41-NEXT: movaps %xmm2, %xmm0
621 ; AVX1-LABEL: trunc_usat_v8i64_v8i32:
623 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
624 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
625 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2
626 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3
627 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
628 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm5
629 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [9223372041149743103,9223372041149743103]
630 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm8
631 ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm7
632 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm6, %xmm7
633 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm5
634 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5
635 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm4
636 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm4
637 ; AVX1-NEXT: vmovapd {{.*#+}} xmm6 = [4294967295,4294967295]
638 ; AVX1-NEXT: vblendvpd %xmm4, %xmm3, %xmm6, %xmm3
639 ; AVX1-NEXT: vblendvpd %xmm5, %xmm1, %xmm6, %xmm1
640 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
641 ; AVX1-NEXT: vblendvpd %xmm7, %xmm2, %xmm6, %xmm2
642 ; AVX1-NEXT: vblendvpd %xmm8, %xmm0, %xmm6, %xmm0
643 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
644 ; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm1[0,2],ymm0[4,6],ymm1[4,6]
647 ; AVX2-SLOW-LABEL: trunc_usat_v8i64_v8i32:
648 ; AVX2-SLOW: # %bb.0:
649 ; AVX2-SLOW-NEXT: vmovdqa (%rdi), %ymm0
650 ; AVX2-SLOW-NEXT: vmovdqa 32(%rdi), %ymm1
651 ; AVX2-SLOW-NEXT: vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
652 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
653 ; AVX2-SLOW-NEXT: vpxor %ymm3, %ymm1, %ymm4
654 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
655 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
656 ; AVX2-SLOW-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
657 ; AVX2-SLOW-NEXT: vpxor %ymm3, %ymm0, %ymm3
658 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
659 ; AVX2-SLOW-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
660 ; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
661 ; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
662 ; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
663 ; AVX2-SLOW-NEXT: retq
665 ; AVX2-FAST-ALL-LABEL: trunc_usat_v8i64_v8i32:
666 ; AVX2-FAST-ALL: # %bb.0:
667 ; AVX2-FAST-ALL-NEXT: vmovdqa (%rdi), %ymm0
668 ; AVX2-FAST-ALL-NEXT: vmovdqa 32(%rdi), %ymm1
669 ; AVX2-FAST-ALL-NEXT: vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
670 ; AVX2-FAST-ALL-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
671 ; AVX2-FAST-ALL-NEXT: vpxor %ymm3, %ymm1, %ymm4
672 ; AVX2-FAST-ALL-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
673 ; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
674 ; AVX2-FAST-ALL-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
675 ; AVX2-FAST-ALL-NEXT: vpxor %ymm3, %ymm0, %ymm3
676 ; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
677 ; AVX2-FAST-ALL-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
678 ; AVX2-FAST-ALL-NEXT: vmovapd {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
679 ; AVX2-FAST-ALL-NEXT: vpermps %ymm0, %ymm2, %ymm0
680 ; AVX2-FAST-ALL-NEXT: vpermps %ymm1, %ymm2, %ymm1
681 ; AVX2-FAST-ALL-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
682 ; AVX2-FAST-ALL-NEXT: retq
684 ; AVX2-FAST-PERLANE-LABEL: trunc_usat_v8i64_v8i32:
685 ; AVX2-FAST-PERLANE: # %bb.0:
686 ; AVX2-FAST-PERLANE-NEXT: vmovdqa (%rdi), %ymm0
687 ; AVX2-FAST-PERLANE-NEXT: vmovdqa 32(%rdi), %ymm1
688 ; AVX2-FAST-PERLANE-NEXT: vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
689 ; AVX2-FAST-PERLANE-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
690 ; AVX2-FAST-PERLANE-NEXT: vpxor %ymm3, %ymm1, %ymm4
691 ; AVX2-FAST-PERLANE-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
692 ; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
693 ; AVX2-FAST-PERLANE-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
694 ; AVX2-FAST-PERLANE-NEXT: vpxor %ymm3, %ymm0, %ymm3
695 ; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
696 ; AVX2-FAST-PERLANE-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
697 ; AVX2-FAST-PERLANE-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
698 ; AVX2-FAST-PERLANE-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
699 ; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
700 ; AVX2-FAST-PERLANE-NEXT: retq
702 ; AVX512-LABEL: trunc_usat_v8i64_v8i32:
704 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
705 ; AVX512-NEXT: vpmovusqd %zmm0, %ymm0
708 ; SKX-LABEL: trunc_usat_v8i64_v8i32:
710 ; SKX-NEXT: vmovdqa64 (%rdi), %zmm0
711 ; SKX-NEXT: vpmovusqd %zmm0, %ymm0
713 %a0 = load <8 x i64>, <8 x i64>* %p0
714 %1 = icmp ult <8 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
715 %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>
716 %3 = trunc <8 x i64> %2 to <8 x i32>
721 ; Unsigned saturation truncation to vXi16
724 define <2 x i16> @trunc_usat_v2i64_v2i16(<2 x i64> %a0) {
725 ; SSE2-LABEL: trunc_usat_v2i64_v2i16:
727 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
728 ; SSE2-NEXT: pxor %xmm0, %xmm1
729 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002324991,9223372039002324991]
730 ; SSE2-NEXT: movdqa %xmm2, %xmm3
731 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
732 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
733 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm1
734 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
735 ; SSE2-NEXT: pand %xmm4, %xmm1
736 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
737 ; SSE2-NEXT: por %xmm1, %xmm2
738 ; SSE2-NEXT: pand %xmm2, %xmm0
739 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
740 ; SSE2-NEXT: por %xmm0, %xmm2
741 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
742 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
745 ; SSSE3-LABEL: trunc_usat_v2i64_v2i16:
747 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
748 ; SSSE3-NEXT: pxor %xmm0, %xmm1
749 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002324991,9223372039002324991]
750 ; SSSE3-NEXT: movdqa %xmm2, %xmm3
751 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3
752 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
753 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm1
754 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
755 ; SSSE3-NEXT: pand %xmm4, %xmm1
756 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
757 ; SSSE3-NEXT: por %xmm1, %xmm2
758 ; SSSE3-NEXT: pand %xmm2, %xmm0
759 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
760 ; SSSE3-NEXT: por %xmm0, %xmm2
761 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
762 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
765 ; SSE41-LABEL: trunc_usat_v2i64_v2i16:
767 ; SSE41-NEXT: movdqa %xmm0, %xmm1
768 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [65535,65535]
769 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
770 ; SSE41-NEXT: pxor %xmm1, %xmm0
771 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002324991,9223372039002324991]
772 ; SSE41-NEXT: movdqa %xmm3, %xmm4
773 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
774 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
775 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
776 ; SSE41-NEXT: pand %xmm4, %xmm0
777 ; SSE41-NEXT: por %xmm3, %xmm0
778 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
779 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
780 ; SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
783 ; AVX1-LABEL: trunc_usat_v2i64_v2i16:
785 ; AVX1-NEXT: vmovapd {{.*#+}} xmm1 = [65535,65535]
786 ; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
787 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
788 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
789 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
790 ; AVX1-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
791 ; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
794 ; AVX2-SLOW-LABEL: trunc_usat_v2i64_v2i16:
795 ; AVX2-SLOW: # %bb.0:
796 ; AVX2-SLOW-NEXT: vmovapd {{.*#+}} xmm1 = [65535,65535]
797 ; AVX2-SLOW-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
798 ; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
799 ; AVX2-SLOW-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
800 ; AVX2-SLOW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
801 ; AVX2-SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
802 ; AVX2-SLOW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
803 ; AVX2-SLOW-NEXT: retq
805 ; AVX2-FAST-LABEL: trunc_usat_v2i64_v2i16:
806 ; AVX2-FAST: # %bb.0:
807 ; AVX2-FAST-NEXT: vmovapd {{.*#+}} xmm1 = [65535,65535]
808 ; AVX2-FAST-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
809 ; AVX2-FAST-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
810 ; AVX2-FAST-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
811 ; AVX2-FAST-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
812 ; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
813 ; AVX2-FAST-NEXT: retq
815 ; AVX512F-LABEL: trunc_usat_v2i64_v2i16:
817 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
818 ; AVX512F-NEXT: vpmovusqw %zmm0, %xmm0
819 ; AVX512F-NEXT: vzeroupper
822 ; AVX512VL-LABEL: trunc_usat_v2i64_v2i16:
824 ; AVX512VL-NEXT: vpmovusqw %xmm0, %xmm0
825 ; AVX512VL-NEXT: retq
827 ; AVX512BW-LABEL: trunc_usat_v2i64_v2i16:
829 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
830 ; AVX512BW-NEXT: vpmovusqw %zmm0, %xmm0
831 ; AVX512BW-NEXT: vzeroupper
832 ; AVX512BW-NEXT: retq
834 ; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i16:
835 ; AVX512BWVL: # %bb.0:
836 ; AVX512BWVL-NEXT: vpmovusqw %xmm0, %xmm0
837 ; AVX512BWVL-NEXT: retq
839 ; SKX-LABEL: trunc_usat_v2i64_v2i16:
841 ; SKX-NEXT: vpmovusqw %xmm0, %xmm0
843 %1 = icmp ult <2 x i64> %a0, <i64 65535, i64 65535>
844 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 65535, i64 65535>
845 %3 = trunc <2 x i64> %2 to <2 x i16>
849 define void @trunc_usat_v2i64_v2i16_store(<2 x i64> %a0, <2 x i16>* %p1) {
850 ; SSE2-LABEL: trunc_usat_v2i64_v2i16_store:
852 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
853 ; SSE2-NEXT: pxor %xmm0, %xmm1
854 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002324991,9223372039002324991]
855 ; SSE2-NEXT: movdqa %xmm2, %xmm3
856 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
857 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
858 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm1
859 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
860 ; SSE2-NEXT: pand %xmm4, %xmm1
861 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
862 ; SSE2-NEXT: por %xmm1, %xmm2
863 ; SSE2-NEXT: pand %xmm2, %xmm0
864 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
865 ; SSE2-NEXT: por %xmm0, %xmm2
866 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
867 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
868 ; SSE2-NEXT: movd %xmm0, (%rdi)
871 ; SSSE3-LABEL: trunc_usat_v2i64_v2i16_store:
873 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
874 ; SSSE3-NEXT: pxor %xmm0, %xmm1
875 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002324991,9223372039002324991]
876 ; SSSE3-NEXT: movdqa %xmm2, %xmm3
877 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3
878 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
879 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm1
880 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
881 ; SSSE3-NEXT: pand %xmm4, %xmm1
882 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
883 ; SSSE3-NEXT: por %xmm1, %xmm2
884 ; SSSE3-NEXT: pand %xmm2, %xmm0
885 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
886 ; SSSE3-NEXT: por %xmm0, %xmm2
887 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
888 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
889 ; SSSE3-NEXT: movd %xmm0, (%rdi)
892 ; SSE41-LABEL: trunc_usat_v2i64_v2i16_store:
894 ; SSE41-NEXT: movdqa %xmm0, %xmm1
895 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [65535,65535]
896 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
897 ; SSE41-NEXT: pxor %xmm1, %xmm0
898 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002324991,9223372039002324991]
899 ; SSE41-NEXT: movdqa %xmm3, %xmm4
900 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
901 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
902 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
903 ; SSE41-NEXT: pand %xmm4, %xmm0
904 ; SSE41-NEXT: por %xmm3, %xmm0
905 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
906 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
907 ; SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
908 ; SSE41-NEXT: movd %xmm0, (%rdi)
911 ; AVX1-LABEL: trunc_usat_v2i64_v2i16_store:
913 ; AVX1-NEXT: vmovapd {{.*#+}} xmm1 = [65535,65535]
914 ; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
915 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
916 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
917 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
918 ; AVX1-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
919 ; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
920 ; AVX1-NEXT: vmovd %xmm0, (%rdi)
923 ; AVX2-SLOW-LABEL: trunc_usat_v2i64_v2i16_store:
924 ; AVX2-SLOW: # %bb.0:
925 ; AVX2-SLOW-NEXT: vmovapd {{.*#+}} xmm1 = [65535,65535]
926 ; AVX2-SLOW-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
927 ; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
928 ; AVX2-SLOW-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
929 ; AVX2-SLOW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
930 ; AVX2-SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
931 ; AVX2-SLOW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
932 ; AVX2-SLOW-NEXT: vmovd %xmm0, (%rdi)
933 ; AVX2-SLOW-NEXT: retq
935 ; AVX2-FAST-LABEL: trunc_usat_v2i64_v2i16_store:
936 ; AVX2-FAST: # %bb.0:
937 ; AVX2-FAST-NEXT: vmovapd {{.*#+}} xmm1 = [65535,65535]
938 ; AVX2-FAST-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
939 ; AVX2-FAST-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
940 ; AVX2-FAST-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
941 ; AVX2-FAST-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
942 ; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,u,u,u,u,u,u,u,u,u,u,u,u]
943 ; AVX2-FAST-NEXT: vmovd %xmm0, (%rdi)
944 ; AVX2-FAST-NEXT: retq
946 ; AVX512F-LABEL: trunc_usat_v2i64_v2i16_store:
948 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
949 ; AVX512F-NEXT: vpmovusqw %zmm0, %xmm0
950 ; AVX512F-NEXT: vmovd %xmm0, (%rdi)
951 ; AVX512F-NEXT: vzeroupper
954 ; AVX512VL-LABEL: trunc_usat_v2i64_v2i16_store:
956 ; AVX512VL-NEXT: vpmovusqw %xmm0, (%rdi)
957 ; AVX512VL-NEXT: retq
959 ; AVX512BW-LABEL: trunc_usat_v2i64_v2i16_store:
961 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
962 ; AVX512BW-NEXT: vpmovusqw %zmm0, %xmm0
963 ; AVX512BW-NEXT: vmovd %xmm0, (%rdi)
964 ; AVX512BW-NEXT: vzeroupper
965 ; AVX512BW-NEXT: retq
967 ; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i16_store:
968 ; AVX512BWVL: # %bb.0:
969 ; AVX512BWVL-NEXT: vpmovusqw %xmm0, (%rdi)
970 ; AVX512BWVL-NEXT: retq
972 ; SKX-LABEL: trunc_usat_v2i64_v2i16_store:
974 ; SKX-NEXT: vpmovusqw %xmm0, (%rdi)
976 %1 = icmp ult <2 x i64> %a0, <i64 65535, i64 65535>
977 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 65535, i64 65535>
978 %3 = trunc <2 x i64> %2 to <2 x i16>
979 store <2 x i16> %3, <2 x i16>* %p1
983 define <4 x i16> @trunc_usat_v4i64_v4i16(<4 x i64> %a0) {
984 ; SSE2-LABEL: trunc_usat_v4i64_v4i16:
986 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535]
987 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
988 ; SSE2-NEXT: movdqa %xmm0, %xmm4
989 ; SSE2-NEXT: pxor %xmm3, %xmm4
990 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002324991,9223372039002324991]
991 ; SSE2-NEXT: movdqa %xmm5, %xmm6
992 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm6
993 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
994 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm4
995 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
996 ; SSE2-NEXT: pand %xmm7, %xmm4
997 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
998 ; SSE2-NEXT: por %xmm4, %xmm6
999 ; SSE2-NEXT: pand %xmm6, %xmm0
1000 ; SSE2-NEXT: pandn %xmm2, %xmm6
1001 ; SSE2-NEXT: por %xmm0, %xmm6
1002 ; SSE2-NEXT: pxor %xmm1, %xmm3
1003 ; SSE2-NEXT: movdqa %xmm5, %xmm0
1004 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm0
1005 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1006 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm3
1007 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1008 ; SSE2-NEXT: pand %xmm4, %xmm3
1009 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1010 ; SSE2-NEXT: por %xmm3, %xmm0
1011 ; SSE2-NEXT: pand %xmm0, %xmm1
1012 ; SSE2-NEXT: pandn %xmm2, %xmm0
1013 ; SSE2-NEXT: por %xmm1, %xmm0
1014 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1015 ; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,2,2,3,4,5,6,7]
1016 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,2,2,3]
1017 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1018 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1021 ; SSSE3-LABEL: trunc_usat_v4i64_v4i16:
1023 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535]
1024 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
1025 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
1026 ; SSSE3-NEXT: pxor %xmm3, %xmm4
1027 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002324991,9223372039002324991]
1028 ; SSSE3-NEXT: movdqa %xmm5, %xmm6
1029 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
1030 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1031 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm4
1032 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1033 ; SSSE3-NEXT: pand %xmm7, %xmm4
1034 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1035 ; SSSE3-NEXT: por %xmm4, %xmm6
1036 ; SSSE3-NEXT: pand %xmm6, %xmm0
1037 ; SSSE3-NEXT: pandn %xmm2, %xmm6
1038 ; SSSE3-NEXT: por %xmm0, %xmm6
1039 ; SSSE3-NEXT: pxor %xmm1, %xmm3
1040 ; SSSE3-NEXT: movdqa %xmm5, %xmm0
1041 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm0
1042 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1043 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm3
1044 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1045 ; SSSE3-NEXT: pand %xmm4, %xmm3
1046 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1047 ; SSSE3-NEXT: por %xmm3, %xmm0
1048 ; SSSE3-NEXT: pand %xmm0, %xmm1
1049 ; SSSE3-NEXT: pandn %xmm2, %xmm0
1050 ; SSSE3-NEXT: por %xmm1, %xmm0
1051 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1052 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,2,2,3,4,5,6,7]
1053 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,2,2,3]
1054 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1055 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1058 ; SSE41-LABEL: trunc_usat_v4i64_v4i16:
1060 ; SSE41-NEXT: movdqa %xmm0, %xmm3
1061 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [65535,65535]
1062 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
1063 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1064 ; SSE41-NEXT: pxor %xmm4, %xmm0
1065 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002324991,9223372039002324991]
1066 ; SSE41-NEXT: movdqa %xmm5, %xmm6
1067 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm6
1068 ; SSE41-NEXT: movdqa %xmm5, %xmm7
1069 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
1070 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1071 ; SSE41-NEXT: pand %xmm6, %xmm0
1072 ; SSE41-NEXT: por %xmm7, %xmm0
1073 ; SSE41-NEXT: movapd %xmm2, %xmm6
1074 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm6
1075 ; SSE41-NEXT: pxor %xmm3, %xmm4
1076 ; SSE41-NEXT: movdqa %xmm5, %xmm1
1077 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm1
1078 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm5
1079 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1080 ; SSE41-NEXT: pand %xmm1, %xmm0
1081 ; SSE41-NEXT: por %xmm5, %xmm0
1082 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm2
1083 ; SSE41-NEXT: packusdw %xmm6, %xmm2
1084 ; SSE41-NEXT: packusdw %xmm2, %xmm2
1085 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1088 ; AVX1-LABEL: trunc_usat_v4i64_v4i16:
1090 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
1091 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm2
1092 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
1093 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
1094 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
1095 ; AVX1-NEXT: vpxor %xmm1, %xmm4, %xmm1
1096 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1
1097 ; AVX1-NEXT: vmovapd {{.*#+}} xmm3 = [65535,65535]
1098 ; AVX1-NEXT: vblendvpd %xmm1, %xmm4, %xmm3, %xmm1
1099 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
1100 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1101 ; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1102 ; AVX1-NEXT: vzeroupper
1105 ; AVX2-LABEL: trunc_usat_v4i64_v4i16:
1107 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm1 = [65535,65535,65535,65535]
1108 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1109 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm2
1110 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343]
1111 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm3, %ymm2
1112 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1113 ; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
1114 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1115 ; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1116 ; AVX2-NEXT: vzeroupper
1119 ; AVX512F-LABEL: trunc_usat_v4i64_v4i16:
1121 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1122 ; AVX512F-NEXT: vpmovusqw %zmm0, %xmm0
1123 ; AVX512F-NEXT: vzeroupper
1124 ; AVX512F-NEXT: retq
1126 ; AVX512VL-LABEL: trunc_usat_v4i64_v4i16:
1127 ; AVX512VL: # %bb.0:
1128 ; AVX512VL-NEXT: vpmovusqw %ymm0, %xmm0
1129 ; AVX512VL-NEXT: vzeroupper
1130 ; AVX512VL-NEXT: retq
1132 ; AVX512BW-LABEL: trunc_usat_v4i64_v4i16:
1133 ; AVX512BW: # %bb.0:
1134 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1135 ; AVX512BW-NEXT: vpmovusqw %zmm0, %xmm0
1136 ; AVX512BW-NEXT: vzeroupper
1137 ; AVX512BW-NEXT: retq
1139 ; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i16:
1140 ; AVX512BWVL: # %bb.0:
1141 ; AVX512BWVL-NEXT: vpmovusqw %ymm0, %xmm0
1142 ; AVX512BWVL-NEXT: vzeroupper
1143 ; AVX512BWVL-NEXT: retq
1145 ; SKX-LABEL: trunc_usat_v4i64_v4i16:
1147 ; SKX-NEXT: vpmovusqw %ymm0, %xmm0
1148 ; SKX-NEXT: vzeroupper
1150 %1 = icmp ult <4 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535>
1151 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 65535, i64 65535, i64 65535, i64 65535>
1152 %3 = trunc <4 x i64> %2 to <4 x i16>
1156 define void @trunc_usat_v4i64_v4i16_store(<4 x i64> %a0, <4 x i16> *%p1) {
1157 ; SSE2-LABEL: trunc_usat_v4i64_v4i16_store:
1159 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535]
1160 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
1161 ; SSE2-NEXT: movdqa %xmm0, %xmm4
1162 ; SSE2-NEXT: pxor %xmm3, %xmm4
1163 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002324991,9223372039002324991]
1164 ; SSE2-NEXT: movdqa %xmm5, %xmm6
1165 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm6
1166 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1167 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm4
1168 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1169 ; SSE2-NEXT: pand %xmm7, %xmm4
1170 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1171 ; SSE2-NEXT: por %xmm4, %xmm6
1172 ; SSE2-NEXT: pand %xmm6, %xmm0
1173 ; SSE2-NEXT: pandn %xmm2, %xmm6
1174 ; SSE2-NEXT: por %xmm0, %xmm6
1175 ; SSE2-NEXT: pxor %xmm1, %xmm3
1176 ; SSE2-NEXT: movdqa %xmm5, %xmm0
1177 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm0
1178 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1179 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm3
1180 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1181 ; SSE2-NEXT: pand %xmm4, %xmm3
1182 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1183 ; SSE2-NEXT: por %xmm3, %xmm0
1184 ; SSE2-NEXT: pand %xmm0, %xmm1
1185 ; SSE2-NEXT: pandn %xmm2, %xmm0
1186 ; SSE2-NEXT: por %xmm1, %xmm0
1187 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1188 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1189 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm6[0,2,2,3]
1190 ; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1191 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1192 ; SSE2-NEXT: movq %xmm1, (%rdi)
1195 ; SSSE3-LABEL: trunc_usat_v4i64_v4i16_store:
1197 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535]
1198 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
1199 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
1200 ; SSSE3-NEXT: pxor %xmm3, %xmm4
1201 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002324991,9223372039002324991]
1202 ; SSSE3-NEXT: movdqa %xmm5, %xmm6
1203 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
1204 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1205 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm4
1206 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1207 ; SSSE3-NEXT: pand %xmm7, %xmm4
1208 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1209 ; SSSE3-NEXT: por %xmm4, %xmm6
1210 ; SSSE3-NEXT: pand %xmm6, %xmm0
1211 ; SSSE3-NEXT: pandn %xmm2, %xmm6
1212 ; SSSE3-NEXT: por %xmm0, %xmm6
1213 ; SSSE3-NEXT: pxor %xmm1, %xmm3
1214 ; SSSE3-NEXT: movdqa %xmm5, %xmm0
1215 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm0
1216 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1217 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm3
1218 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1219 ; SSSE3-NEXT: pand %xmm4, %xmm3
1220 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1221 ; SSSE3-NEXT: por %xmm3, %xmm0
1222 ; SSSE3-NEXT: pand %xmm0, %xmm1
1223 ; SSSE3-NEXT: pandn %xmm2, %xmm0
1224 ; SSSE3-NEXT: por %xmm1, %xmm0
1225 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1226 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1227 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm6[0,2,2,3]
1228 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1229 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1230 ; SSSE3-NEXT: movq %xmm1, (%rdi)
1233 ; SSE41-LABEL: trunc_usat_v4i64_v4i16_store:
1235 ; SSE41-NEXT: movdqa %xmm0, %xmm2
1236 ; SSE41-NEXT: movapd {{.*#+}} xmm3 = [65535,65535]
1237 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
1238 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1239 ; SSE41-NEXT: pxor %xmm4, %xmm0
1240 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002324991,9223372039002324991]
1241 ; SSE41-NEXT: movdqa %xmm5, %xmm6
1242 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm6
1243 ; SSE41-NEXT: movdqa %xmm5, %xmm7
1244 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
1245 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1246 ; SSE41-NEXT: pand %xmm6, %xmm0
1247 ; SSE41-NEXT: por %xmm7, %xmm0
1248 ; SSE41-NEXT: movapd %xmm3, %xmm6
1249 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm6
1250 ; SSE41-NEXT: pxor %xmm2, %xmm4
1251 ; SSE41-NEXT: movdqa %xmm5, %xmm1
1252 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm1
1253 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm5
1254 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1255 ; SSE41-NEXT: pand %xmm1, %xmm0
1256 ; SSE41-NEXT: por %xmm5, %xmm0
1257 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm3
1258 ; SSE41-NEXT: packusdw %xmm6, %xmm3
1259 ; SSE41-NEXT: packusdw %xmm3, %xmm3
1260 ; SSE41-NEXT: movq %xmm3, (%rdi)
1263 ; AVX1-LABEL: trunc_usat_v4i64_v4i16_store:
1265 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
1266 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm2
1267 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
1268 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
1269 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
1270 ; AVX1-NEXT: vpxor %xmm1, %xmm4, %xmm1
1271 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1
1272 ; AVX1-NEXT: vmovapd {{.*#+}} xmm3 = [65535,65535]
1273 ; AVX1-NEXT: vblendvpd %xmm1, %xmm4, %xmm3, %xmm1
1274 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
1275 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1276 ; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1277 ; AVX1-NEXT: vmovq %xmm0, (%rdi)
1278 ; AVX1-NEXT: vzeroupper
1281 ; AVX2-LABEL: trunc_usat_v4i64_v4i16_store:
1283 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm1 = [65535,65535,65535,65535]
1284 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1285 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm2
1286 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343]
1287 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm3, %ymm2
1288 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1289 ; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
1290 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1291 ; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1292 ; AVX2-NEXT: vmovq %xmm0, (%rdi)
1293 ; AVX2-NEXT: vzeroupper
1296 ; AVX512F-LABEL: trunc_usat_v4i64_v4i16_store:
1298 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1299 ; AVX512F-NEXT: vpmovusqw %zmm0, %xmm0
1300 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
1301 ; AVX512F-NEXT: vzeroupper
1302 ; AVX512F-NEXT: retq
1304 ; AVX512VL-LABEL: trunc_usat_v4i64_v4i16_store:
1305 ; AVX512VL: # %bb.0:
1306 ; AVX512VL-NEXT: vpmovusqw %ymm0, (%rdi)
1307 ; AVX512VL-NEXT: vzeroupper
1308 ; AVX512VL-NEXT: retq
1310 ; AVX512BW-LABEL: trunc_usat_v4i64_v4i16_store:
1311 ; AVX512BW: # %bb.0:
1312 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1313 ; AVX512BW-NEXT: vpmovusqw %zmm0, %xmm0
1314 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
1315 ; AVX512BW-NEXT: vzeroupper
1316 ; AVX512BW-NEXT: retq
1318 ; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i16_store:
1319 ; AVX512BWVL: # %bb.0:
1320 ; AVX512BWVL-NEXT: vpmovusqw %ymm0, (%rdi)
1321 ; AVX512BWVL-NEXT: vzeroupper
1322 ; AVX512BWVL-NEXT: retq
1324 ; SKX-LABEL: trunc_usat_v4i64_v4i16_store:
1326 ; SKX-NEXT: vpmovusqw %ymm0, (%rdi)
1327 ; SKX-NEXT: vzeroupper
1329 %1 = icmp ult <4 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535>
1330 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 65535, i64 65535, i64 65535, i64 65535>
1331 %3 = trunc <4 x i64> %2 to <4 x i16>
1332 store <4 x i16> %3, <4 x i16> *%p1
1336 define <8 x i16> @trunc_usat_v8i64_v8i16(<8 x i64>* %p0) {
1337 ; SSE2-LABEL: trunc_usat_v8i64_v8i16:
1339 ; SSE2-NEXT: movdqa (%rdi), %xmm4
1340 ; SSE2-NEXT: movdqa 16(%rdi), %xmm9
1341 ; SSE2-NEXT: movdqa 32(%rdi), %xmm6
1342 ; SSE2-NEXT: movdqa 48(%rdi), %xmm7
1343 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [65535,65535]
1344 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
1345 ; SSE2-NEXT: movdqa %xmm6, %xmm2
1346 ; SSE2-NEXT: pxor %xmm3, %xmm2
1347 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [9223372039002324991,9223372039002324991]
1348 ; SSE2-NEXT: movdqa %xmm10, %xmm5
1349 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm5
1350 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1351 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm2
1352 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1353 ; SSE2-NEXT: pand %xmm0, %xmm1
1354 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
1355 ; SSE2-NEXT: por %xmm1, %xmm2
1356 ; SSE2-NEXT: pand %xmm2, %xmm6
1357 ; SSE2-NEXT: pandn %xmm8, %xmm2
1358 ; SSE2-NEXT: por %xmm6, %xmm2
1359 ; SSE2-NEXT: movdqa %xmm7, %xmm0
1360 ; SSE2-NEXT: pxor %xmm3, %xmm0
1361 ; SSE2-NEXT: movdqa %xmm10, %xmm1
1362 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1
1363 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2]
1364 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm0
1365 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1366 ; SSE2-NEXT: pand %xmm5, %xmm0
1367 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
1368 ; SSE2-NEXT: por %xmm0, %xmm6
1369 ; SSE2-NEXT: pand %xmm6, %xmm7
1370 ; SSE2-NEXT: pandn %xmm8, %xmm6
1371 ; SSE2-NEXT: por %xmm7, %xmm6
1372 ; SSE2-NEXT: movdqa %xmm4, %xmm0
1373 ; SSE2-NEXT: pxor %xmm3, %xmm0
1374 ; SSE2-NEXT: movdqa %xmm10, %xmm1
1375 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1
1376 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2]
1377 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm0
1378 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1379 ; SSE2-NEXT: pand %xmm5, %xmm0
1380 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1381 ; SSE2-NEXT: por %xmm0, %xmm1
1382 ; SSE2-NEXT: pand %xmm1, %xmm4
1383 ; SSE2-NEXT: pandn %xmm8, %xmm1
1384 ; SSE2-NEXT: por %xmm4, %xmm1
1385 ; SSE2-NEXT: pxor %xmm9, %xmm3
1386 ; SSE2-NEXT: movdqa %xmm10, %xmm0
1387 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm0
1388 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1389 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm3
1390 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1391 ; SSE2-NEXT: pand %xmm4, %xmm3
1392 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1393 ; SSE2-NEXT: por %xmm3, %xmm0
1394 ; SSE2-NEXT: pand %xmm0, %xmm9
1395 ; SSE2-NEXT: pandn %xmm8, %xmm0
1396 ; SSE2-NEXT: por %xmm9, %xmm0
1397 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1398 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1399 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
1400 ; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1401 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1402 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,2,2,3]
1403 ; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm0[0,1,0,2,4,5,6,7]
1404 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
1405 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
1406 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1407 ; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1410 ; SSSE3-LABEL: trunc_usat_v8i64_v8i16:
1412 ; SSSE3-NEXT: movdqa (%rdi), %xmm4
1413 ; SSSE3-NEXT: movdqa 16(%rdi), %xmm9
1414 ; SSSE3-NEXT: movdqa 32(%rdi), %xmm6
1415 ; SSSE3-NEXT: movdqa 48(%rdi), %xmm7
1416 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [65535,65535]
1417 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
1418 ; SSSE3-NEXT: movdqa %xmm6, %xmm2
1419 ; SSSE3-NEXT: pxor %xmm3, %xmm2
1420 ; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [9223372039002324991,9223372039002324991]
1421 ; SSSE3-NEXT: movdqa %xmm10, %xmm5
1422 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm5
1423 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1424 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm2
1425 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1426 ; SSSE3-NEXT: pand %xmm0, %xmm1
1427 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
1428 ; SSSE3-NEXT: por %xmm1, %xmm2
1429 ; SSSE3-NEXT: pand %xmm2, %xmm6
1430 ; SSSE3-NEXT: pandn %xmm8, %xmm2
1431 ; SSSE3-NEXT: por %xmm6, %xmm2
1432 ; SSSE3-NEXT: movdqa %xmm7, %xmm0
1433 ; SSSE3-NEXT: pxor %xmm3, %xmm0
1434 ; SSSE3-NEXT: movdqa %xmm10, %xmm1
1435 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm1
1436 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2]
1437 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm0
1438 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1439 ; SSSE3-NEXT: pand %xmm5, %xmm0
1440 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
1441 ; SSSE3-NEXT: por %xmm0, %xmm6
1442 ; SSSE3-NEXT: pand %xmm6, %xmm7
1443 ; SSSE3-NEXT: pandn %xmm8, %xmm6
1444 ; SSSE3-NEXT: por %xmm7, %xmm6
1445 ; SSSE3-NEXT: movdqa %xmm4, %xmm0
1446 ; SSSE3-NEXT: pxor %xmm3, %xmm0
1447 ; SSSE3-NEXT: movdqa %xmm10, %xmm1
1448 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm1
1449 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2]
1450 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm0
1451 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1452 ; SSSE3-NEXT: pand %xmm5, %xmm0
1453 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1454 ; SSSE3-NEXT: por %xmm0, %xmm1
1455 ; SSSE3-NEXT: pand %xmm1, %xmm4
1456 ; SSSE3-NEXT: pandn %xmm8, %xmm1
1457 ; SSSE3-NEXT: por %xmm4, %xmm1
1458 ; SSSE3-NEXT: pxor %xmm9, %xmm3
1459 ; SSSE3-NEXT: movdqa %xmm10, %xmm0
1460 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm0
1461 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1462 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm3
1463 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1464 ; SSSE3-NEXT: pand %xmm4, %xmm3
1465 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1466 ; SSSE3-NEXT: por %xmm3, %xmm0
1467 ; SSSE3-NEXT: pand %xmm0, %xmm9
1468 ; SSSE3-NEXT: pandn %xmm8, %xmm0
1469 ; SSSE3-NEXT: por %xmm9, %xmm0
1470 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1471 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1472 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
1473 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1474 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1475 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,2,2,3]
1476 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm3 = xmm0[0,1,0,2,4,5,6,7]
1477 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
1478 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
1479 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1480 ; SSSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
1483 ; SSE41-LABEL: trunc_usat_v8i64_v8i16:
1485 ; SSE41-NEXT: movdqa (%rdi), %xmm7
1486 ; SSE41-NEXT: movdqa 16(%rdi), %xmm1
1487 ; SSE41-NEXT: movdqa 32(%rdi), %xmm8
1488 ; SSE41-NEXT: movdqa 48(%rdi), %xmm9
1489 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [65535,65535]
1490 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
1491 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1492 ; SSE41-NEXT: pxor %xmm5, %xmm0
1493 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002324991,9223372039002324991]
1494 ; SSE41-NEXT: movdqa %xmm3, %xmm6
1495 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm6
1496 ; SSE41-NEXT: movdqa %xmm3, %xmm4
1497 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
1498 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
1499 ; SSE41-NEXT: pand %xmm6, %xmm0
1500 ; SSE41-NEXT: por %xmm4, %xmm0
1501 ; SSE41-NEXT: movapd %xmm2, %xmm4
1502 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4
1503 ; SSE41-NEXT: movdqa %xmm7, %xmm0
1504 ; SSE41-NEXT: pxor %xmm5, %xmm0
1505 ; SSE41-NEXT: movdqa %xmm3, %xmm1
1506 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
1507 ; SSE41-NEXT: movdqa %xmm3, %xmm6
1508 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
1509 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1510 ; SSE41-NEXT: pand %xmm1, %xmm0
1511 ; SSE41-NEXT: por %xmm6, %xmm0
1512 ; SSE41-NEXT: movapd %xmm2, %xmm1
1513 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm1
1514 ; SSE41-NEXT: packusdw %xmm4, %xmm1
1515 ; SSE41-NEXT: movdqa %xmm9, %xmm0
1516 ; SSE41-NEXT: pxor %xmm5, %xmm0
1517 ; SSE41-NEXT: movdqa %xmm3, %xmm4
1518 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
1519 ; SSE41-NEXT: movdqa %xmm3, %xmm6
1520 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
1521 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1522 ; SSE41-NEXT: pand %xmm4, %xmm0
1523 ; SSE41-NEXT: por %xmm6, %xmm0
1524 ; SSE41-NEXT: movapd %xmm2, %xmm4
1525 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm4
1526 ; SSE41-NEXT: pxor %xmm8, %xmm5
1527 ; SSE41-NEXT: movdqa %xmm3, %xmm6
1528 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
1529 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm3
1530 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1531 ; SSE41-NEXT: pand %xmm6, %xmm0
1532 ; SSE41-NEXT: por %xmm3, %xmm0
1533 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm2
1534 ; SSE41-NEXT: packusdw %xmm4, %xmm2
1535 ; SSE41-NEXT: packusdw %xmm2, %xmm1
1536 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1539 ; AVX1-LABEL: trunc_usat_v8i64_v8i16:
1541 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
1542 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
1543 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2
1544 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3
1545 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
1546 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm5
1547 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [9223372036854841343,9223372036854841343]
1548 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm8
1549 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm7
1550 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm6, %xmm7
1551 ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm5
1552 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5
1553 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm4
1554 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm4
1555 ; AVX1-NEXT: vmovapd {{.*#+}} xmm6 = [65535,65535]
1556 ; AVX1-NEXT: vblendvpd %xmm4, %xmm3, %xmm6, %xmm3
1557 ; AVX1-NEXT: vblendvpd %xmm5, %xmm2, %xmm6, %xmm2
1558 ; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2
1559 ; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm6, %xmm1
1560 ; AVX1-NEXT: vblendvpd %xmm8, %xmm0, %xmm6, %xmm0
1561 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1562 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
1565 ; AVX2-LABEL: trunc_usat_v8i64_v8i16:
1567 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
1568 ; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1
1569 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [65535,65535,65535,65535]
1570 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1571 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm4
1572 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343]
1573 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
1574 ; AVX2-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
1575 ; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm3
1576 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
1577 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1578 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
1579 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1580 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1581 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
1582 ; AVX2-NEXT: vzeroupper
1585 ; AVX512-LABEL: trunc_usat_v8i64_v8i16:
1587 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
1588 ; AVX512-NEXT: vpmovusqw %zmm0, %xmm0
1589 ; AVX512-NEXT: vzeroupper
1592 ; SKX-LABEL: trunc_usat_v8i64_v8i16:
1594 ; SKX-NEXT: vmovdqa64 (%rdi), %zmm0
1595 ; SKX-NEXT: vpmovusqw %zmm0, %xmm0
1596 ; SKX-NEXT: vzeroupper
1598 %a0 = load <8 x i64>, <8 x i64>* %p0
1599 %1 = icmp ult <8 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
1600 %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>
1601 %3 = trunc <8 x i64> %2 to <8 x i16>
1605 define <4 x i16> @trunc_usat_v4i32_v4i16(<4 x i32> %a0) {
1606 ; SSE2-LABEL: trunc_usat_v4i32_v4i16:
1608 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
1609 ; SSE2-NEXT: pxor %xmm0, %xmm1
1610 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147549183,2147549183,2147549183,2147549183]
1611 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
1612 ; SSE2-NEXT: pand %xmm2, %xmm0
1613 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
1614 ; SSE2-NEXT: por %xmm0, %xmm2
1615 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm2[0,2,2,3,4,5,6,7]
1616 ; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
1617 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1620 ; SSSE3-LABEL: trunc_usat_v4i32_v4i16:
1622 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
1623 ; SSSE3-NEXT: pxor %xmm0, %xmm1
1624 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147549183,2147549183,2147549183,2147549183]
1625 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
1626 ; SSSE3-NEXT: pand %xmm2, %xmm0
1627 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
1628 ; SSSE3-NEXT: por %xmm2, %xmm0
1629 ; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1632 ; SSE41-LABEL: trunc_usat_v4i32_v4i16:
1634 ; SSE41-NEXT: pminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1635 ; SSE41-NEXT: packusdw %xmm0, %xmm0
1638 ; AVX1-LABEL: trunc_usat_v4i32_v4i16:
1640 ; AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1641 ; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1644 ; AVX2-LABEL: trunc_usat_v4i32_v4i16:
1646 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [65535,65535,65535,65535]
1647 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
1648 ; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1651 ; AVX512F-LABEL: trunc_usat_v4i32_v4i16:
1653 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1654 ; AVX512F-NEXT: vpmovusdw %zmm0, %ymm0
1655 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
1656 ; AVX512F-NEXT: vzeroupper
1657 ; AVX512F-NEXT: retq
1659 ; AVX512VL-LABEL: trunc_usat_v4i32_v4i16:
1660 ; AVX512VL: # %bb.0:
1661 ; AVX512VL-NEXT: vpmovusdw %xmm0, %xmm0
1662 ; AVX512VL-NEXT: retq
1664 ; AVX512BW-LABEL: trunc_usat_v4i32_v4i16:
1665 ; AVX512BW: # %bb.0:
1666 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1667 ; AVX512BW-NEXT: vpmovusdw %zmm0, %ymm0
1668 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
1669 ; AVX512BW-NEXT: vzeroupper
1670 ; AVX512BW-NEXT: retq
1672 ; AVX512BWVL-LABEL: trunc_usat_v4i32_v4i16:
1673 ; AVX512BWVL: # %bb.0:
1674 ; AVX512BWVL-NEXT: vpmovusdw %xmm0, %xmm0
1675 ; AVX512BWVL-NEXT: retq
1677 ; SKX-LABEL: trunc_usat_v4i32_v4i16:
1679 ; SKX-NEXT: vpmovusdw %xmm0, %xmm0
1681 %1 = icmp ult <4 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535>
1682 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
1683 %3 = trunc <4 x i32> %2 to <4 x i16>
1687 define void @trunc_usat_v4i32_v4i16_store(<4 x i32> %a0, <4 x i16> *%p1) {
1688 ; SSE2-LABEL: trunc_usat_v4i32_v4i16_store:
1690 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
1691 ; SSE2-NEXT: pxor %xmm0, %xmm1
1692 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147549183,2147549183,2147549183,2147549183]
1693 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
1694 ; SSE2-NEXT: pand %xmm2, %xmm0
1695 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
1696 ; SSE2-NEXT: por %xmm0, %xmm2
1697 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm2[0,2,2,3,4,5,6,7]
1698 ; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
1699 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1700 ; SSE2-NEXT: movq %xmm0, (%rdi)
1703 ; SSSE3-LABEL: trunc_usat_v4i32_v4i16_store:
1705 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
1706 ; SSSE3-NEXT: pxor %xmm0, %xmm1
1707 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147549183,2147549183,2147549183,2147549183]
1708 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
1709 ; SSSE3-NEXT: pand %xmm2, %xmm0
1710 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
1711 ; SSSE3-NEXT: por %xmm0, %xmm2
1712 ; SSSE3-NEXT: pshufb {{.*#+}} xmm2 = xmm2[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]
1713 ; SSSE3-NEXT: movq %xmm2, (%rdi)
1716 ; SSE41-LABEL: trunc_usat_v4i32_v4i16_store:
1718 ; SSE41-NEXT: pminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1719 ; SSE41-NEXT: packusdw %xmm0, %xmm0
1720 ; SSE41-NEXT: movq %xmm0, (%rdi)
1723 ; AVX1-LABEL: trunc_usat_v4i32_v4i16_store:
1725 ; AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1726 ; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1727 ; AVX1-NEXT: vmovq %xmm0, (%rdi)
1730 ; AVX2-LABEL: trunc_usat_v4i32_v4i16_store:
1732 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [65535,65535,65535,65535]
1733 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
1734 ; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1735 ; AVX2-NEXT: vmovq %xmm0, (%rdi)
1738 ; AVX512F-LABEL: trunc_usat_v4i32_v4i16_store:
1740 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1741 ; AVX512F-NEXT: vpmovusdw %zmm0, %ymm0
1742 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
1743 ; AVX512F-NEXT: vzeroupper
1744 ; AVX512F-NEXT: retq
1746 ; AVX512VL-LABEL: trunc_usat_v4i32_v4i16_store:
1747 ; AVX512VL: # %bb.0:
1748 ; AVX512VL-NEXT: vpmovusdw %xmm0, (%rdi)
1749 ; AVX512VL-NEXT: retq
1751 ; AVX512BW-LABEL: trunc_usat_v4i32_v4i16_store:
1752 ; AVX512BW: # %bb.0:
1753 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1754 ; AVX512BW-NEXT: vpmovusdw %zmm0, %ymm0
1755 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
1756 ; AVX512BW-NEXT: vzeroupper
1757 ; AVX512BW-NEXT: retq
1759 ; AVX512BWVL-LABEL: trunc_usat_v4i32_v4i16_store:
1760 ; AVX512BWVL: # %bb.0:
1761 ; AVX512BWVL-NEXT: vpmovusdw %xmm0, (%rdi)
1762 ; AVX512BWVL-NEXT: retq
1764 ; SKX-LABEL: trunc_usat_v4i32_v4i16_store:
1766 ; SKX-NEXT: vpmovusdw %xmm0, (%rdi)
1768 %1 = icmp ult <4 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535>
1769 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
1770 %3 = trunc <4 x i32> %2 to <4 x i16>
1771 store <4 x i16> %3, <4 x i16> *%p1
1775 define <8 x i16> @trunc_usat_v8i32_v8i16(<8 x i32> %a0) {
1776 ; SSE2-LABEL: trunc_usat_v8i32_v8i16:
1778 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
1779 ; SSE2-NEXT: movdqa %xmm0, %xmm3
1780 ; SSE2-NEXT: pxor %xmm2, %xmm3
1781 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147549183,2147549183,2147549183,2147549183]
1782 ; SSE2-NEXT: movdqa %xmm4, %xmm5
1783 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
1784 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm3
1785 ; SSE2-NEXT: pand %xmm5, %xmm0
1786 ; SSE2-NEXT: pxor %xmm3, %xmm5
1787 ; SSE2-NEXT: por %xmm5, %xmm0
1788 ; SSE2-NEXT: pxor %xmm1, %xmm2
1789 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
1790 ; SSE2-NEXT: pxor %xmm4, %xmm3
1791 ; SSE2-NEXT: pand %xmm1, %xmm4
1792 ; SSE2-NEXT: por %xmm3, %xmm4
1793 ; SSE2-NEXT: pslld $16, %xmm4
1794 ; SSE2-NEXT: psrad $16, %xmm4
1795 ; SSE2-NEXT: pslld $16, %xmm0
1796 ; SSE2-NEXT: psrad $16, %xmm0
1797 ; SSE2-NEXT: packssdw %xmm4, %xmm0
1800 ; SSSE3-LABEL: trunc_usat_v8i32_v8i16:
1802 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
1803 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
1804 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
1805 ; SSSE3-NEXT: pxor %xmm3, %xmm4
1806 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
1807 ; SSSE3-NEXT: movdqa %xmm5, %xmm6
1808 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
1809 ; SSSE3-NEXT: pand %xmm6, %xmm0
1810 ; SSSE3-NEXT: pandn %xmm2, %xmm6
1811 ; SSSE3-NEXT: por %xmm6, %xmm0
1812 ; SSSE3-NEXT: pxor %xmm1, %xmm3
1813 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
1814 ; SSSE3-NEXT: pand %xmm5, %xmm1
1815 ; SSSE3-NEXT: pandn %xmm2, %xmm5
1816 ; SSSE3-NEXT: por %xmm1, %xmm5
1817 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1818 ; SSSE3-NEXT: pshufb %xmm1, %xmm5
1819 ; SSSE3-NEXT: pshufb %xmm1, %xmm0
1820 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0]
1823 ; SSE41-LABEL: trunc_usat_v8i32_v8i16:
1825 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
1826 ; SSE41-NEXT: pminud %xmm2, %xmm1
1827 ; SSE41-NEXT: pminud %xmm2, %xmm0
1828 ; SSE41-NEXT: packusdw %xmm1, %xmm0
1831 ; AVX1-LABEL: trunc_usat_v8i32_v8i16:
1833 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1834 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
1835 ; AVX1-NEXT: vpminud %xmm2, %xmm1, %xmm1
1836 ; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0
1837 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1838 ; AVX1-NEXT: vzeroupper
1841 ; AVX2-LABEL: trunc_usat_v8i32_v8i16:
1843 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535]
1844 ; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0
1845 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1846 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1847 ; AVX2-NEXT: vzeroupper
1850 ; AVX512F-LABEL: trunc_usat_v8i32_v8i16:
1852 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1853 ; AVX512F-NEXT: vpmovusdw %zmm0, %ymm0
1854 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
1855 ; AVX512F-NEXT: vzeroupper
1856 ; AVX512F-NEXT: retq
1858 ; AVX512VL-LABEL: trunc_usat_v8i32_v8i16:
1859 ; AVX512VL: # %bb.0:
1860 ; AVX512VL-NEXT: vpmovusdw %ymm0, %xmm0
1861 ; AVX512VL-NEXT: vzeroupper
1862 ; AVX512VL-NEXT: retq
1864 ; AVX512BW-LABEL: trunc_usat_v8i32_v8i16:
1865 ; AVX512BW: # %bb.0:
1866 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1867 ; AVX512BW-NEXT: vpmovusdw %zmm0, %ymm0
1868 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
1869 ; AVX512BW-NEXT: vzeroupper
1870 ; AVX512BW-NEXT: retq
1872 ; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i16:
1873 ; AVX512BWVL: # %bb.0:
1874 ; AVX512BWVL-NEXT: vpmovusdw %ymm0, %xmm0
1875 ; AVX512BWVL-NEXT: vzeroupper
1876 ; AVX512BWVL-NEXT: retq
1878 ; SKX-LABEL: trunc_usat_v8i32_v8i16:
1880 ; SKX-NEXT: vpmovusdw %ymm0, %xmm0
1881 ; SKX-NEXT: vzeroupper
1883 %1 = icmp ult <8 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
1884 %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>
1885 %3 = trunc <8 x i32> %2 to <8 x i16>
1889 define <16 x i16> @trunc_usat_v16i32_v16i16(<16 x i32>* %p0) {
1890 ; SSE2-LABEL: trunc_usat_v16i32_v16i16:
1892 ; SSE2-NEXT: movdqa (%rdi), %xmm5
1893 ; SSE2-NEXT: movdqa 16(%rdi), %xmm8
1894 ; SSE2-NEXT: movdqa 32(%rdi), %xmm0
1895 ; SSE2-NEXT: movdqa 48(%rdi), %xmm4
1896 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
1897 ; SSE2-NEXT: movdqa %xmm0, %xmm3
1898 ; SSE2-NEXT: pxor %xmm6, %xmm3
1899 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147549183,2147549183,2147549183,2147549183]
1900 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1901 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm1
1902 ; SSE2-NEXT: pcmpeqd %xmm7, %xmm7
1903 ; SSE2-NEXT: pand %xmm1, %xmm0
1904 ; SSE2-NEXT: pxor %xmm7, %xmm1
1905 ; SSE2-NEXT: por %xmm0, %xmm1
1906 ; SSE2-NEXT: movdqa %xmm4, %xmm0
1907 ; SSE2-NEXT: pxor %xmm6, %xmm0
1908 ; SSE2-NEXT: movdqa %xmm2, %xmm3
1909 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm3
1910 ; SSE2-NEXT: pand %xmm3, %xmm4
1911 ; SSE2-NEXT: pxor %xmm7, %xmm3
1912 ; SSE2-NEXT: por %xmm4, %xmm3
1913 ; SSE2-NEXT: movdqa %xmm5, %xmm4
1914 ; SSE2-NEXT: pxor %xmm6, %xmm4
1915 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1916 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm0
1917 ; SSE2-NEXT: pand %xmm0, %xmm5
1918 ; SSE2-NEXT: pxor %xmm7, %xmm0
1919 ; SSE2-NEXT: por %xmm5, %xmm0
1920 ; SSE2-NEXT: pxor %xmm8, %xmm6
1921 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm2
1922 ; SSE2-NEXT: pxor %xmm2, %xmm7
1923 ; SSE2-NEXT: pand %xmm8, %xmm2
1924 ; SSE2-NEXT: por %xmm7, %xmm2
1925 ; SSE2-NEXT: pslld $16, %xmm2
1926 ; SSE2-NEXT: psrad $16, %xmm2
1927 ; SSE2-NEXT: pslld $16, %xmm0
1928 ; SSE2-NEXT: psrad $16, %xmm0
1929 ; SSE2-NEXT: packssdw %xmm2, %xmm0
1930 ; SSE2-NEXT: pslld $16, %xmm3
1931 ; SSE2-NEXT: psrad $16, %xmm3
1932 ; SSE2-NEXT: pslld $16, %xmm1
1933 ; SSE2-NEXT: psrad $16, %xmm1
1934 ; SSE2-NEXT: packssdw %xmm3, %xmm1
1937 ; SSSE3-LABEL: trunc_usat_v16i32_v16i16:
1939 ; SSSE3-NEXT: movdqa (%rdi), %xmm5
1940 ; SSSE3-NEXT: movdqa 16(%rdi), %xmm8
1941 ; SSSE3-NEXT: movdqa 32(%rdi), %xmm0
1942 ; SSSE3-NEXT: movdqa 48(%rdi), %xmm4
1943 ; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
1944 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
1945 ; SSSE3-NEXT: pxor %xmm6, %xmm3
1946 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147549183,2147549183,2147549183,2147549183]
1947 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
1948 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm1
1949 ; SSSE3-NEXT: pcmpeqd %xmm7, %xmm7
1950 ; SSSE3-NEXT: pand %xmm1, %xmm0
1951 ; SSSE3-NEXT: pxor %xmm7, %xmm1
1952 ; SSSE3-NEXT: por %xmm0, %xmm1
1953 ; SSSE3-NEXT: movdqa %xmm4, %xmm0
1954 ; SSSE3-NEXT: pxor %xmm6, %xmm0
1955 ; SSSE3-NEXT: movdqa %xmm2, %xmm3
1956 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm3
1957 ; SSSE3-NEXT: pand %xmm3, %xmm4
1958 ; SSSE3-NEXT: pxor %xmm7, %xmm3
1959 ; SSSE3-NEXT: por %xmm4, %xmm3
1960 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
1961 ; SSSE3-NEXT: pxor %xmm6, %xmm4
1962 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
1963 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm0
1964 ; SSSE3-NEXT: pand %xmm0, %xmm5
1965 ; SSSE3-NEXT: pxor %xmm7, %xmm0
1966 ; SSSE3-NEXT: por %xmm5, %xmm0
1967 ; SSSE3-NEXT: pxor %xmm8, %xmm6
1968 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm2
1969 ; SSSE3-NEXT: pxor %xmm2, %xmm7
1970 ; SSSE3-NEXT: pand %xmm8, %xmm2
1971 ; SSSE3-NEXT: por %xmm7, %xmm2
1972 ; SSSE3-NEXT: pslld $16, %xmm2
1973 ; SSSE3-NEXT: psrad $16, %xmm2
1974 ; SSSE3-NEXT: pslld $16, %xmm0
1975 ; SSSE3-NEXT: psrad $16, %xmm0
1976 ; SSSE3-NEXT: packssdw %xmm2, %xmm0
1977 ; SSSE3-NEXT: pslld $16, %xmm3
1978 ; SSSE3-NEXT: psrad $16, %xmm3
1979 ; SSSE3-NEXT: pslld $16, %xmm1
1980 ; SSSE3-NEXT: psrad $16, %xmm1
1981 ; SSSE3-NEXT: packssdw %xmm3, %xmm1
1984 ; SSE41-LABEL: trunc_usat_v16i32_v16i16:
1986 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [65535,65535,65535,65535]
1987 ; SSE41-NEXT: movdqa 48(%rdi), %xmm2
1988 ; SSE41-NEXT: pminud %xmm0, %xmm2
1989 ; SSE41-NEXT: movdqa 32(%rdi), %xmm1
1990 ; SSE41-NEXT: pminud %xmm0, %xmm1
1991 ; SSE41-NEXT: packusdw %xmm2, %xmm1
1992 ; SSE41-NEXT: movdqa 16(%rdi), %xmm2
1993 ; SSE41-NEXT: pminud %xmm0, %xmm2
1994 ; SSE41-NEXT: pminud (%rdi), %xmm0
1995 ; SSE41-NEXT: packusdw %xmm2, %xmm0
1998 ; AVX1-LABEL: trunc_usat_v16i32_v16i16:
2000 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm0 = [65535,65535,65535,65535]
2001 ; AVX1-NEXT: vpminud 16(%rdi), %xmm0, %xmm1
2002 ; AVX1-NEXT: vpminud (%rdi), %xmm0, %xmm2
2003 ; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm1
2004 ; AVX1-NEXT: vpminud 48(%rdi), %xmm0, %xmm2
2005 ; AVX1-NEXT: vpminud 32(%rdi), %xmm0, %xmm0
2006 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
2007 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
2010 ; AVX2-LABEL: trunc_usat_v16i32_v16i16:
2012 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm0 = [65535,65535,65535,65535,65535,65535,65535,65535]
2013 ; AVX2-NEXT: vpminud 32(%rdi), %ymm0, %ymm1
2014 ; AVX2-NEXT: vpminud (%rdi), %ymm0, %ymm0
2015 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
2016 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2019 ; AVX512-LABEL: trunc_usat_v16i32_v16i16:
2021 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
2022 ; AVX512-NEXT: vpmovusdw %zmm0, %ymm0
2025 ; SKX-LABEL: trunc_usat_v16i32_v16i16:
2027 ; SKX-NEXT: vmovdqa64 (%rdi), %zmm0
2028 ; SKX-NEXT: vpmovusdw %zmm0, %ymm0
2030 %a0 = load <16 x i32>, <16 x i32>* %p0
2031 %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>
2032 %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>
2033 %3 = trunc <16 x i32> %2 to <16 x i16>
2038 ; Unsigned saturation truncation to vXi8
2041 define <2 x i8> @trunc_usat_v2i64_v2i8(<2 x i64> %a0) {
2042 ; SSE2-LABEL: trunc_usat_v2i64_v2i8:
2044 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
2045 ; SSE2-NEXT: pxor %xmm0, %xmm1
2046 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259711,9223372039002259711]
2047 ; SSE2-NEXT: movdqa %xmm2, %xmm3
2048 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
2049 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2050 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm1
2051 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
2052 ; SSE2-NEXT: pand %xmm4, %xmm2
2053 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
2054 ; SSE2-NEXT: por %xmm2, %xmm1
2055 ; SSE2-NEXT: pand %xmm1, %xmm0
2056 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2057 ; SSE2-NEXT: por %xmm0, %xmm1
2058 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2059 ; SSE2-NEXT: packuswb %xmm1, %xmm1
2060 ; SSE2-NEXT: packuswb %xmm1, %xmm1
2061 ; SSE2-NEXT: packuswb %xmm1, %xmm1
2062 ; SSE2-NEXT: movdqa %xmm1, %xmm0
2065 ; SSSE3-LABEL: trunc_usat_v2i64_v2i8:
2067 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
2068 ; SSSE3-NEXT: pxor %xmm0, %xmm1
2069 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259711,9223372039002259711]
2070 ; SSSE3-NEXT: movdqa %xmm2, %xmm3
2071 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3
2072 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2073 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm1
2074 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2075 ; SSSE3-NEXT: pand %xmm4, %xmm1
2076 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
2077 ; SSSE3-NEXT: por %xmm1, %xmm2
2078 ; SSSE3-NEXT: pand %xmm2, %xmm0
2079 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
2080 ; SSSE3-NEXT: por %xmm2, %xmm0
2081 ; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2084 ; SSE41-LABEL: trunc_usat_v2i64_v2i8:
2086 ; SSE41-NEXT: movdqa %xmm0, %xmm1
2087 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [255,255]
2088 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
2089 ; SSE41-NEXT: pxor %xmm1, %xmm0
2090 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259711,9223372039002259711]
2091 ; SSE41-NEXT: movdqa %xmm3, %xmm4
2092 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
2093 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
2094 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2095 ; SSE41-NEXT: pand %xmm4, %xmm0
2096 ; SSE41-NEXT: por %xmm3, %xmm0
2097 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
2098 ; SSE41-NEXT: pshufb {{.*#+}} xmm2 = xmm2[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2099 ; SSE41-NEXT: movdqa %xmm2, %xmm0
2102 ; AVX-LABEL: trunc_usat_v2i64_v2i8:
2104 ; AVX-NEXT: vmovapd {{.*#+}} xmm1 = [255,255]
2105 ; AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
2106 ; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854776063,9223372036854776063]
2107 ; AVX-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
2108 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2109 ; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2112 ; AVX512F-LABEL: trunc_usat_v2i64_v2i8:
2114 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
2115 ; AVX512F-NEXT: vpmovusqb %zmm0, %xmm0
2116 ; AVX512F-NEXT: vzeroupper
2117 ; AVX512F-NEXT: retq
2119 ; AVX512VL-LABEL: trunc_usat_v2i64_v2i8:
2120 ; AVX512VL: # %bb.0:
2121 ; AVX512VL-NEXT: vpmovusqb %xmm0, %xmm0
2122 ; AVX512VL-NEXT: retq
2124 ; AVX512BW-LABEL: trunc_usat_v2i64_v2i8:
2125 ; AVX512BW: # %bb.0:
2126 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
2127 ; AVX512BW-NEXT: vpmovusqb %zmm0, %xmm0
2128 ; AVX512BW-NEXT: vzeroupper
2129 ; AVX512BW-NEXT: retq
2131 ; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i8:
2132 ; AVX512BWVL: # %bb.0:
2133 ; AVX512BWVL-NEXT: vpmovusqb %xmm0, %xmm0
2134 ; AVX512BWVL-NEXT: retq
2136 ; SKX-LABEL: trunc_usat_v2i64_v2i8:
2138 ; SKX-NEXT: vpmovusqb %xmm0, %xmm0
2140 %1 = icmp ult <2 x i64> %a0, <i64 255, i64 255>
2141 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 255, i64 255>
2142 %3 = trunc <2 x i64> %2 to <2 x i8>
2146 define void @trunc_usat_v2i64_v2i8_store(<2 x i64> %a0, <2 x i8>* %p1) {
2147 ; SSE2-LABEL: trunc_usat_v2i64_v2i8_store:
2149 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
2150 ; SSE2-NEXT: pxor %xmm0, %xmm1
2151 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259711,9223372039002259711]
2152 ; SSE2-NEXT: movdqa %xmm2, %xmm3
2153 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
2154 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2155 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm1
2156 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2157 ; SSE2-NEXT: pand %xmm4, %xmm1
2158 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
2159 ; SSE2-NEXT: por %xmm1, %xmm2
2160 ; SSE2-NEXT: pand %xmm2, %xmm0
2161 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
2162 ; SSE2-NEXT: por %xmm0, %xmm2
2163 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
2164 ; SSE2-NEXT: packuswb %xmm2, %xmm2
2165 ; SSE2-NEXT: packuswb %xmm2, %xmm2
2166 ; SSE2-NEXT: packuswb %xmm2, %xmm2
2167 ; SSE2-NEXT: movd %xmm2, %eax
2168 ; SSE2-NEXT: movw %ax, (%rdi)
2171 ; SSSE3-LABEL: trunc_usat_v2i64_v2i8_store:
2173 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
2174 ; SSSE3-NEXT: pxor %xmm0, %xmm1
2175 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259711,9223372039002259711]
2176 ; SSSE3-NEXT: movdqa %xmm2, %xmm3
2177 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3
2178 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2179 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm1
2180 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2181 ; SSSE3-NEXT: pand %xmm4, %xmm1
2182 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
2183 ; SSSE3-NEXT: por %xmm1, %xmm2
2184 ; SSSE3-NEXT: pand %xmm2, %xmm0
2185 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
2186 ; SSSE3-NEXT: por %xmm0, %xmm2
2187 ; SSSE3-NEXT: pshufb {{.*#+}} xmm2 = xmm2[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2188 ; SSSE3-NEXT: movd %xmm2, %eax
2189 ; SSSE3-NEXT: movw %ax, (%rdi)
2192 ; SSE41-LABEL: trunc_usat_v2i64_v2i8_store:
2194 ; SSE41-NEXT: movdqa %xmm0, %xmm1
2195 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [255,255]
2196 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
2197 ; SSE41-NEXT: pxor %xmm1, %xmm0
2198 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259711,9223372039002259711]
2199 ; SSE41-NEXT: movdqa %xmm3, %xmm4
2200 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
2201 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
2202 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2203 ; SSE41-NEXT: pand %xmm4, %xmm0
2204 ; SSE41-NEXT: por %xmm3, %xmm0
2205 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
2206 ; SSE41-NEXT: pshufb {{.*#+}} xmm2 = xmm2[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2207 ; SSE41-NEXT: pextrw $0, %xmm2, (%rdi)
2210 ; AVX-LABEL: trunc_usat_v2i64_v2i8_store:
2212 ; AVX-NEXT: vmovapd {{.*#+}} xmm1 = [255,255]
2213 ; AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm2
2214 ; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854776063,9223372036854776063]
2215 ; AVX-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
2216 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2217 ; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2218 ; AVX-NEXT: vpextrw $0, %xmm0, (%rdi)
2221 ; AVX512F-LABEL: trunc_usat_v2i64_v2i8_store:
2223 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
2224 ; AVX512F-NEXT: vpmovusqb %zmm0, %xmm0
2225 ; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi)
2226 ; AVX512F-NEXT: vzeroupper
2227 ; AVX512F-NEXT: retq
2229 ; AVX512VL-LABEL: trunc_usat_v2i64_v2i8_store:
2230 ; AVX512VL: # %bb.0:
2231 ; AVX512VL-NEXT: vpmovusqb %xmm0, (%rdi)
2232 ; AVX512VL-NEXT: retq
2234 ; AVX512BW-LABEL: trunc_usat_v2i64_v2i8_store:
2235 ; AVX512BW: # %bb.0:
2236 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
2237 ; AVX512BW-NEXT: vpmovusqb %zmm0, %xmm0
2238 ; AVX512BW-NEXT: vpextrw $0, %xmm0, (%rdi)
2239 ; AVX512BW-NEXT: vzeroupper
2240 ; AVX512BW-NEXT: retq
2242 ; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i8_store:
2243 ; AVX512BWVL: # %bb.0:
2244 ; AVX512BWVL-NEXT: vpmovusqb %xmm0, (%rdi)
2245 ; AVX512BWVL-NEXT: retq
2247 ; SKX-LABEL: trunc_usat_v2i64_v2i8_store:
2249 ; SKX-NEXT: vpmovusqb %xmm0, (%rdi)
2251 %1 = icmp ult <2 x i64> %a0, <i64 255, i64 255>
2252 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 255, i64 255>
2253 %3 = trunc <2 x i64> %2 to <2 x i8>
2254 store <2 x i8> %3, <2 x i8>* %p1
2258 define <4 x i8> @trunc_usat_v4i64_v4i8(<4 x i64> %a0) {
2259 ; SSE2-LABEL: trunc_usat_v4i64_v4i8:
2261 ; SSE2-NEXT: movdqa %xmm0, %xmm2
2262 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255]
2263 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
2264 ; SSE2-NEXT: pxor %xmm4, %xmm0
2265 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259711,9223372039002259711]
2266 ; SSE2-NEXT: movdqa %xmm5, %xmm6
2267 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm6
2268 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2269 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm0
2270 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
2271 ; SSE2-NEXT: pand %xmm7, %xmm3
2272 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
2273 ; SSE2-NEXT: por %xmm3, %xmm0
2274 ; SSE2-NEXT: pand %xmm0, %xmm2
2275 ; SSE2-NEXT: pandn %xmm8, %xmm0
2276 ; SSE2-NEXT: por %xmm2, %xmm0
2277 ; SSE2-NEXT: pxor %xmm1, %xmm4
2278 ; SSE2-NEXT: movdqa %xmm5, %xmm2
2279 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm2
2280 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
2281 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm4
2282 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2283 ; SSE2-NEXT: pand %xmm3, %xmm4
2284 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2285 ; SSE2-NEXT: por %xmm4, %xmm2
2286 ; SSE2-NEXT: pand %xmm2, %xmm1
2287 ; SSE2-NEXT: pandn %xmm8, %xmm2
2288 ; SSE2-NEXT: por %xmm1, %xmm2
2289 ; SSE2-NEXT: pand %xmm8, %xmm2
2290 ; SSE2-NEXT: pand %xmm8, %xmm0
2291 ; SSE2-NEXT: packuswb %xmm2, %xmm0
2292 ; SSE2-NEXT: packuswb %xmm0, %xmm0
2293 ; SSE2-NEXT: packuswb %xmm0, %xmm0
2296 ; SSSE3-LABEL: trunc_usat_v4i64_v4i8:
2298 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,255]
2299 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
2300 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
2301 ; SSSE3-NEXT: pxor %xmm3, %xmm4
2302 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259711,9223372039002259711]
2303 ; SSSE3-NEXT: movdqa %xmm5, %xmm6
2304 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
2305 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2306 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm4
2307 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2308 ; SSSE3-NEXT: pand %xmm7, %xmm4
2309 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2310 ; SSSE3-NEXT: por %xmm4, %xmm6
2311 ; SSSE3-NEXT: pand %xmm6, %xmm0
2312 ; SSSE3-NEXT: pandn %xmm2, %xmm6
2313 ; SSSE3-NEXT: por %xmm6, %xmm0
2314 ; SSSE3-NEXT: pxor %xmm1, %xmm3
2315 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
2316 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4
2317 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2318 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm3
2319 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2320 ; SSSE3-NEXT: pand %xmm6, %xmm3
2321 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2322 ; SSSE3-NEXT: por %xmm3, %xmm4
2323 ; SSSE3-NEXT: pand %xmm4, %xmm1
2324 ; SSSE3-NEXT: pandn %xmm2, %xmm4
2325 ; SSSE3-NEXT: por %xmm1, %xmm4
2326 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2327 ; SSSE3-NEXT: pshufb %xmm1, %xmm4
2328 ; SSSE3-NEXT: pshufb %xmm1, %xmm0
2329 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3]
2332 ; SSE41-LABEL: trunc_usat_v4i64_v4i8:
2334 ; SSE41-NEXT: movdqa %xmm0, %xmm2
2335 ; SSE41-NEXT: movapd {{.*#+}} xmm4 = [255,255]
2336 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
2337 ; SSE41-NEXT: pxor %xmm5, %xmm0
2338 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259711,9223372039002259711]
2339 ; SSE41-NEXT: movdqa %xmm6, %xmm3
2340 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
2341 ; SSE41-NEXT: movdqa %xmm6, %xmm7
2342 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
2343 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
2344 ; SSE41-NEXT: pand %xmm3, %xmm0
2345 ; SSE41-NEXT: por %xmm7, %xmm0
2346 ; SSE41-NEXT: movapd %xmm4, %xmm3
2347 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm3
2348 ; SSE41-NEXT: pxor %xmm1, %xmm5
2349 ; SSE41-NEXT: movdqa %xmm6, %xmm2
2350 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm2
2351 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm6
2352 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2353 ; SSE41-NEXT: pand %xmm2, %xmm0
2354 ; SSE41-NEXT: por %xmm6, %xmm0
2355 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4
2356 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2357 ; SSE41-NEXT: pshufb %xmm0, %xmm4
2358 ; SSE41-NEXT: pshufb %xmm0, %xmm3
2359 ; SSE41-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3]
2360 ; SSE41-NEXT: movdqa %xmm3, %xmm0
2363 ; AVX1-LABEL: trunc_usat_v4i64_v4i8:
2365 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
2366 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm2
2367 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854776063,9223372036854776063]
2368 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
2369 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
2370 ; AVX1-NEXT: vpxor %xmm1, %xmm4, %xmm1
2371 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1
2372 ; AVX1-NEXT: vmovapd {{.*#+}} xmm3 = [255,255]
2373 ; AVX1-NEXT: vblendvpd %xmm1, %xmm4, %xmm3, %xmm1
2374 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2375 ; AVX1-NEXT: vpshufb %xmm4, %xmm1, %xmm1
2376 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
2377 ; AVX1-NEXT: vpshufb %xmm4, %xmm0, %xmm0
2378 ; AVX1-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2379 ; AVX1-NEXT: vzeroupper
2382 ; AVX2-LABEL: trunc_usat_v4i64_v4i8:
2384 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm1 = [255,255,255,255]
2385 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2386 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm2
2387 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
2388 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm3, %ymm2
2389 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
2390 ; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
2391 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2392 ; AVX2-NEXT: vpshufb %xmm2, %xmm1, %xmm1
2393 ; AVX2-NEXT: vpshufb %xmm2, %xmm0, %xmm0
2394 ; AVX2-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2395 ; AVX2-NEXT: vzeroupper
2398 ; AVX512F-LABEL: trunc_usat_v4i64_v4i8:
2400 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
2401 ; AVX512F-NEXT: vpmovusqb %zmm0, %xmm0
2402 ; AVX512F-NEXT: vzeroupper
2403 ; AVX512F-NEXT: retq
2405 ; AVX512VL-LABEL: trunc_usat_v4i64_v4i8:
2406 ; AVX512VL: # %bb.0:
2407 ; AVX512VL-NEXT: vpmovusqb %ymm0, %xmm0
2408 ; AVX512VL-NEXT: vzeroupper
2409 ; AVX512VL-NEXT: retq
2411 ; AVX512BW-LABEL: trunc_usat_v4i64_v4i8:
2412 ; AVX512BW: # %bb.0:
2413 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
2414 ; AVX512BW-NEXT: vpmovusqb %zmm0, %xmm0
2415 ; AVX512BW-NEXT: vzeroupper
2416 ; AVX512BW-NEXT: retq
2418 ; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i8:
2419 ; AVX512BWVL: # %bb.0:
2420 ; AVX512BWVL-NEXT: vpmovusqb %ymm0, %xmm0
2421 ; AVX512BWVL-NEXT: vzeroupper
2422 ; AVX512BWVL-NEXT: retq
2424 ; SKX-LABEL: trunc_usat_v4i64_v4i8:
2426 ; SKX-NEXT: vpmovusqb %ymm0, %xmm0
2427 ; SKX-NEXT: vzeroupper
2429 %1 = icmp ult <4 x i64> %a0, <i64 255, i64 255, i64 255, i64 255>
2430 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 255, i64 255, i64 255, i64 255>
2431 %3 = trunc <4 x i64> %2 to <4 x i8>
2435 define void @trunc_usat_v4i64_v4i8_store(<4 x i64> %a0, <4 x i8> *%p1) {
2436 ; SSE2-LABEL: trunc_usat_v4i64_v4i8_store:
2438 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255]
2439 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
2440 ; SSE2-NEXT: movdqa %xmm0, %xmm3
2441 ; SSE2-NEXT: pxor %xmm4, %xmm3
2442 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259711,9223372039002259711]
2443 ; SSE2-NEXT: movdqa %xmm5, %xmm6
2444 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm6
2445 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2446 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm3
2447 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
2448 ; SSE2-NEXT: pand %xmm7, %xmm2
2449 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
2450 ; SSE2-NEXT: por %xmm2, %xmm3
2451 ; SSE2-NEXT: pand %xmm3, %xmm0
2452 ; SSE2-NEXT: pandn %xmm8, %xmm3
2453 ; SSE2-NEXT: por %xmm0, %xmm3
2454 ; SSE2-NEXT: pxor %xmm1, %xmm4
2455 ; SSE2-NEXT: movdqa %xmm5, %xmm0
2456 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm0
2457 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
2458 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm4
2459 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2460 ; SSE2-NEXT: pand %xmm2, %xmm4
2461 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2462 ; SSE2-NEXT: por %xmm4, %xmm0
2463 ; SSE2-NEXT: pand %xmm0, %xmm1
2464 ; SSE2-NEXT: pandn %xmm8, %xmm0
2465 ; SSE2-NEXT: por %xmm1, %xmm0
2466 ; SSE2-NEXT: pand %xmm8, %xmm0
2467 ; SSE2-NEXT: pand %xmm8, %xmm3
2468 ; SSE2-NEXT: packuswb %xmm0, %xmm3
2469 ; SSE2-NEXT: packuswb %xmm3, %xmm3
2470 ; SSE2-NEXT: packuswb %xmm3, %xmm3
2471 ; SSE2-NEXT: movd %xmm3, (%rdi)
2474 ; SSSE3-LABEL: trunc_usat_v4i64_v4i8_store:
2476 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255]
2477 ; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
2478 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
2479 ; SSSE3-NEXT: pxor %xmm4, %xmm3
2480 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259711,9223372039002259711]
2481 ; SSSE3-NEXT: movdqa %xmm5, %xmm6
2482 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm6
2483 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2484 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm3
2485 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
2486 ; SSSE3-NEXT: pand %xmm7, %xmm2
2487 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
2488 ; SSSE3-NEXT: por %xmm2, %xmm3
2489 ; SSSE3-NEXT: pand %xmm3, %xmm0
2490 ; SSSE3-NEXT: pandn %xmm8, %xmm3
2491 ; SSSE3-NEXT: por %xmm0, %xmm3
2492 ; SSSE3-NEXT: pxor %xmm1, %xmm4
2493 ; SSSE3-NEXT: movdqa %xmm5, %xmm0
2494 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm0
2495 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
2496 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm4
2497 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2498 ; SSSE3-NEXT: pand %xmm2, %xmm4
2499 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2500 ; SSSE3-NEXT: por %xmm4, %xmm0
2501 ; SSSE3-NEXT: pand %xmm0, %xmm1
2502 ; SSSE3-NEXT: pandn %xmm8, %xmm0
2503 ; SSSE3-NEXT: por %xmm1, %xmm0
2504 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2505 ; SSSE3-NEXT: pshufb %xmm1, %xmm0
2506 ; SSSE3-NEXT: pshufb %xmm1, %xmm3
2507 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3]
2508 ; SSSE3-NEXT: movd %xmm3, (%rdi)
2511 ; SSE41-LABEL: trunc_usat_v4i64_v4i8_store:
2513 ; SSE41-NEXT: movdqa %xmm0, %xmm2
2514 ; SSE41-NEXT: movapd {{.*#+}} xmm3 = [255,255]
2515 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
2516 ; SSE41-NEXT: pxor %xmm4, %xmm0
2517 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259711,9223372039002259711]
2518 ; SSE41-NEXT: movdqa %xmm5, %xmm6
2519 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm6
2520 ; SSE41-NEXT: movdqa %xmm5, %xmm7
2521 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
2522 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
2523 ; SSE41-NEXT: pand %xmm6, %xmm0
2524 ; SSE41-NEXT: por %xmm7, %xmm0
2525 ; SSE41-NEXT: movapd %xmm3, %xmm6
2526 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm6
2527 ; SSE41-NEXT: pxor %xmm1, %xmm4
2528 ; SSE41-NEXT: movdqa %xmm5, %xmm2
2529 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm2
2530 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm5
2531 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
2532 ; SSE41-NEXT: pand %xmm2, %xmm0
2533 ; SSE41-NEXT: por %xmm5, %xmm0
2534 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm3
2535 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2536 ; SSE41-NEXT: pshufb %xmm0, %xmm3
2537 ; SSE41-NEXT: pshufb %xmm0, %xmm6
2538 ; SSE41-NEXT: punpcklwd {{.*#+}} xmm6 = xmm6[0],xmm3[0],xmm6[1],xmm3[1],xmm6[2],xmm3[2],xmm6[3],xmm3[3]
2539 ; SSE41-NEXT: movd %xmm6, (%rdi)
2542 ; AVX1-LABEL: trunc_usat_v4i64_v4i8_store:
2544 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
2545 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm2
2546 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854776063,9223372036854776063]
2547 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
2548 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
2549 ; AVX1-NEXT: vpxor %xmm1, %xmm4, %xmm1
2550 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1
2551 ; AVX1-NEXT: vmovapd {{.*#+}} xmm3 = [255,255]
2552 ; AVX1-NEXT: vblendvpd %xmm1, %xmm4, %xmm3, %xmm1
2553 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2554 ; AVX1-NEXT: vpshufb %xmm4, %xmm1, %xmm1
2555 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
2556 ; AVX1-NEXT: vpshufb %xmm4, %xmm0, %xmm0
2557 ; AVX1-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2558 ; AVX1-NEXT: vmovd %xmm0, (%rdi)
2559 ; AVX1-NEXT: vzeroupper
2562 ; AVX2-LABEL: trunc_usat_v4i64_v4i8_store:
2564 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm1 = [255,255,255,255]
2565 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2566 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm2
2567 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
2568 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm3, %ymm2
2569 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
2570 ; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
2571 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2572 ; AVX2-NEXT: vpshufb %xmm2, %xmm1, %xmm1
2573 ; AVX2-NEXT: vpshufb %xmm2, %xmm0, %xmm0
2574 ; AVX2-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2575 ; AVX2-NEXT: vmovd %xmm0, (%rdi)
2576 ; AVX2-NEXT: vzeroupper
2579 ; AVX512F-LABEL: trunc_usat_v4i64_v4i8_store:
2581 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
2582 ; AVX512F-NEXT: vpmovusqb %zmm0, %xmm0
2583 ; AVX512F-NEXT: vmovd %xmm0, (%rdi)
2584 ; AVX512F-NEXT: vzeroupper
2585 ; AVX512F-NEXT: retq
2587 ; AVX512VL-LABEL: trunc_usat_v4i64_v4i8_store:
2588 ; AVX512VL: # %bb.0:
2589 ; AVX512VL-NEXT: vpmovusqb %ymm0, (%rdi)
2590 ; AVX512VL-NEXT: vzeroupper
2591 ; AVX512VL-NEXT: retq
2593 ; AVX512BW-LABEL: trunc_usat_v4i64_v4i8_store:
2594 ; AVX512BW: # %bb.0:
2595 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
2596 ; AVX512BW-NEXT: vpmovusqb %zmm0, %xmm0
2597 ; AVX512BW-NEXT: vmovd %xmm0, (%rdi)
2598 ; AVX512BW-NEXT: vzeroupper
2599 ; AVX512BW-NEXT: retq
2601 ; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i8_store:
2602 ; AVX512BWVL: # %bb.0:
2603 ; AVX512BWVL-NEXT: vpmovusqb %ymm0, (%rdi)
2604 ; AVX512BWVL-NEXT: vzeroupper
2605 ; AVX512BWVL-NEXT: retq
2607 ; SKX-LABEL: trunc_usat_v4i64_v4i8_store:
2609 ; SKX-NEXT: vpmovusqb %ymm0, (%rdi)
2610 ; SKX-NEXT: vzeroupper
2612 %1 = icmp ult <4 x i64> %a0, <i64 255, i64 255, i64 255, i64 255>
2613 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 255, i64 255, i64 255, i64 255>
2614 %3 = trunc <4 x i64> %2 to <4 x i8>
2615 store <4 x i8> %3, <4 x i8> *%p1
2619 define <8 x i8> @trunc_usat_v8i64_v8i8(<8 x i64>* %p0) {
2620 ; SSE2-LABEL: trunc_usat_v8i64_v8i8:
2622 ; SSE2-NEXT: movdqa (%rdi), %xmm6
2623 ; SSE2-NEXT: movdqa 16(%rdi), %xmm0
2624 ; SSE2-NEXT: movdqa 32(%rdi), %xmm9
2625 ; SSE2-NEXT: movdqa 48(%rdi), %xmm5
2626 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255]
2627 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
2628 ; SSE2-NEXT: movdqa %xmm0, %xmm7
2629 ; SSE2-NEXT: pxor %xmm3, %xmm7
2630 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [9223372039002259711,9223372039002259711]
2631 ; SSE2-NEXT: movdqa %xmm10, %xmm4
2632 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm4
2633 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm4[0,0,2,2]
2634 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm7
2635 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
2636 ; SSE2-NEXT: pand %xmm1, %xmm7
2637 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
2638 ; SSE2-NEXT: por %xmm7, %xmm1
2639 ; SSE2-NEXT: pand %xmm1, %xmm0
2640 ; SSE2-NEXT: pandn %xmm8, %xmm1
2641 ; SSE2-NEXT: por %xmm0, %xmm1
2642 ; SSE2-NEXT: movdqa %xmm6, %xmm0
2643 ; SSE2-NEXT: pxor %xmm3, %xmm0
2644 ; SSE2-NEXT: movdqa %xmm10, %xmm4
2645 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
2646 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
2647 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm0
2648 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
2649 ; SSE2-NEXT: pand %xmm7, %xmm2
2650 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
2651 ; SSE2-NEXT: por %xmm2, %xmm0
2652 ; SSE2-NEXT: pand %xmm0, %xmm6
2653 ; SSE2-NEXT: pandn %xmm8, %xmm0
2654 ; SSE2-NEXT: por %xmm6, %xmm0
2655 ; SSE2-NEXT: packuswb %xmm1, %xmm0
2656 ; SSE2-NEXT: movdqa %xmm5, %xmm1
2657 ; SSE2-NEXT: pxor %xmm3, %xmm1
2658 ; SSE2-NEXT: movdqa %xmm10, %xmm2
2659 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
2660 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2661 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm1
2662 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2663 ; SSE2-NEXT: pand %xmm4, %xmm1
2664 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2665 ; SSE2-NEXT: por %xmm1, %xmm2
2666 ; SSE2-NEXT: pand %xmm2, %xmm5
2667 ; SSE2-NEXT: pandn %xmm8, %xmm2
2668 ; SSE2-NEXT: por %xmm5, %xmm2
2669 ; SSE2-NEXT: pxor %xmm9, %xmm3
2670 ; SSE2-NEXT: movdqa %xmm10, %xmm1
2671 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm1
2672 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
2673 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm3
2674 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2675 ; SSE2-NEXT: pand %xmm4, %xmm3
2676 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2677 ; SSE2-NEXT: por %xmm3, %xmm1
2678 ; SSE2-NEXT: pand %xmm1, %xmm9
2679 ; SSE2-NEXT: pandn %xmm8, %xmm1
2680 ; SSE2-NEXT: por %xmm9, %xmm1
2681 ; SSE2-NEXT: packuswb %xmm2, %xmm1
2682 ; SSE2-NEXT: packuswb %xmm1, %xmm0
2683 ; SSE2-NEXT: packuswb %xmm0, %xmm0
2686 ; SSSE3-LABEL: trunc_usat_v8i64_v8i8:
2688 ; SSSE3-NEXT: movdqa (%rdi), %xmm6
2689 ; SSSE3-NEXT: movdqa 16(%rdi), %xmm0
2690 ; SSSE3-NEXT: movdqa 32(%rdi), %xmm9
2691 ; SSSE3-NEXT: movdqa 48(%rdi), %xmm5
2692 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255]
2693 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
2694 ; SSSE3-NEXT: movdqa %xmm0, %xmm7
2695 ; SSSE3-NEXT: pxor %xmm3, %xmm7
2696 ; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [9223372039002259711,9223372039002259711]
2697 ; SSSE3-NEXT: movdqa %xmm10, %xmm4
2698 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm4
2699 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm4[0,0,2,2]
2700 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm7
2701 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
2702 ; SSSE3-NEXT: pand %xmm1, %xmm7
2703 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
2704 ; SSSE3-NEXT: por %xmm7, %xmm1
2705 ; SSSE3-NEXT: pand %xmm1, %xmm0
2706 ; SSSE3-NEXT: pandn %xmm8, %xmm1
2707 ; SSSE3-NEXT: por %xmm0, %xmm1
2708 ; SSSE3-NEXT: movdqa %xmm6, %xmm0
2709 ; SSSE3-NEXT: pxor %xmm3, %xmm0
2710 ; SSSE3-NEXT: movdqa %xmm10, %xmm4
2711 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
2712 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
2713 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm0
2714 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
2715 ; SSSE3-NEXT: pand %xmm7, %xmm2
2716 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
2717 ; SSSE3-NEXT: por %xmm2, %xmm0
2718 ; SSSE3-NEXT: pand %xmm0, %xmm6
2719 ; SSSE3-NEXT: pandn %xmm8, %xmm0
2720 ; SSSE3-NEXT: por %xmm6, %xmm0
2721 ; SSSE3-NEXT: packuswb %xmm1, %xmm0
2722 ; SSSE3-NEXT: movdqa %xmm5, %xmm1
2723 ; SSSE3-NEXT: pxor %xmm3, %xmm1
2724 ; SSSE3-NEXT: movdqa %xmm10, %xmm2
2725 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
2726 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2727 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1
2728 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2729 ; SSSE3-NEXT: pand %xmm4, %xmm1
2730 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2731 ; SSSE3-NEXT: por %xmm1, %xmm2
2732 ; SSSE3-NEXT: pand %xmm2, %xmm5
2733 ; SSSE3-NEXT: pandn %xmm8, %xmm2
2734 ; SSSE3-NEXT: por %xmm5, %xmm2
2735 ; SSSE3-NEXT: pxor %xmm9, %xmm3
2736 ; SSSE3-NEXT: movdqa %xmm10, %xmm1
2737 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm1
2738 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
2739 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm3
2740 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2741 ; SSSE3-NEXT: pand %xmm4, %xmm3
2742 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2743 ; SSSE3-NEXT: por %xmm3, %xmm1
2744 ; SSSE3-NEXT: pand %xmm1, %xmm9
2745 ; SSSE3-NEXT: pandn %xmm8, %xmm1
2746 ; SSSE3-NEXT: por %xmm9, %xmm1
2747 ; SSSE3-NEXT: packuswb %xmm2, %xmm1
2748 ; SSSE3-NEXT: packuswb %xmm1, %xmm0
2749 ; SSSE3-NEXT: packuswb %xmm0, %xmm0
2752 ; SSE41-LABEL: trunc_usat_v8i64_v8i8:
2754 ; SSE41-NEXT: movdqa (%rdi), %xmm7
2755 ; SSE41-NEXT: movdqa 16(%rdi), %xmm1
2756 ; SSE41-NEXT: movdqa 32(%rdi), %xmm8
2757 ; SSE41-NEXT: movdqa 48(%rdi), %xmm9
2758 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [255,255]
2759 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
2760 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2761 ; SSE41-NEXT: pxor %xmm5, %xmm0
2762 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259711,9223372039002259711]
2763 ; SSE41-NEXT: movdqa %xmm3, %xmm6
2764 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm6
2765 ; SSE41-NEXT: movdqa %xmm3, %xmm4
2766 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
2767 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
2768 ; SSE41-NEXT: pand %xmm6, %xmm0
2769 ; SSE41-NEXT: por %xmm4, %xmm0
2770 ; SSE41-NEXT: movapd %xmm2, %xmm4
2771 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4
2772 ; SSE41-NEXT: movdqa %xmm7, %xmm0
2773 ; SSE41-NEXT: pxor %xmm5, %xmm0
2774 ; SSE41-NEXT: movdqa %xmm3, %xmm1
2775 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
2776 ; SSE41-NEXT: movdqa %xmm3, %xmm6
2777 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
2778 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2779 ; SSE41-NEXT: pand %xmm1, %xmm0
2780 ; SSE41-NEXT: por %xmm6, %xmm0
2781 ; SSE41-NEXT: movapd %xmm2, %xmm1
2782 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm1
2783 ; SSE41-NEXT: packusdw %xmm4, %xmm1
2784 ; SSE41-NEXT: movdqa %xmm9, %xmm0
2785 ; SSE41-NEXT: pxor %xmm5, %xmm0
2786 ; SSE41-NEXT: movdqa %xmm3, %xmm4
2787 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
2788 ; SSE41-NEXT: movdqa %xmm3, %xmm6
2789 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
2790 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2791 ; SSE41-NEXT: pand %xmm4, %xmm0
2792 ; SSE41-NEXT: por %xmm6, %xmm0
2793 ; SSE41-NEXT: movapd %xmm2, %xmm4
2794 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm4
2795 ; SSE41-NEXT: pxor %xmm8, %xmm5
2796 ; SSE41-NEXT: movdqa %xmm3, %xmm6
2797 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
2798 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm3
2799 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2800 ; SSE41-NEXT: pand %xmm6, %xmm0
2801 ; SSE41-NEXT: por %xmm3, %xmm0
2802 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm2
2803 ; SSE41-NEXT: packusdw %xmm4, %xmm2
2804 ; SSE41-NEXT: packusdw %xmm2, %xmm1
2805 ; SSE41-NEXT: packuswb %xmm1, %xmm1
2806 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2809 ; AVX1-LABEL: trunc_usat_v8i64_v8i8:
2811 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
2812 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
2813 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2
2814 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3
2815 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
2816 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm5
2817 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [9223372036854776063,9223372036854776063]
2818 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm8
2819 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm7
2820 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm6, %xmm7
2821 ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm5
2822 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5
2823 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm4
2824 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm4
2825 ; AVX1-NEXT: vmovapd {{.*#+}} xmm6 = [255,255]
2826 ; AVX1-NEXT: vblendvpd %xmm4, %xmm3, %xmm6, %xmm3
2827 ; AVX1-NEXT: vblendvpd %xmm5, %xmm2, %xmm6, %xmm2
2828 ; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2
2829 ; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm6, %xmm1
2830 ; AVX1-NEXT: vblendvpd %xmm8, %xmm0, %xmm6, %xmm0
2831 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
2832 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
2833 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2836 ; AVX2-LABEL: trunc_usat_v8i64_v8i8:
2838 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
2839 ; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1
2840 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [255,255,255,255]
2841 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2842 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm4
2843 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
2844 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
2845 ; AVX2-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
2846 ; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm3
2847 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
2848 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
2849 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
2850 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
2851 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
2852 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
2853 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2854 ; AVX2-NEXT: vzeroupper
2857 ; AVX512-LABEL: trunc_usat_v8i64_v8i8:
2859 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
2860 ; AVX512-NEXT: vpmovusqb %zmm0, %xmm0
2861 ; AVX512-NEXT: vzeroupper
2864 ; SKX-LABEL: trunc_usat_v8i64_v8i8:
2866 ; SKX-NEXT: vmovdqa64 (%rdi), %zmm0
2867 ; SKX-NEXT: vpmovusqb %zmm0, %xmm0
2868 ; SKX-NEXT: vzeroupper
2870 %a0 = load <8 x i64>, <8 x i64>* %p0
2871 %1 = icmp ult <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
2872 %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>
2873 %3 = trunc <8 x i64> %2 to <8 x i8>
2877 define void @trunc_usat_v8i64_v8i8_store(<8 x i64>* %p0, <8 x i8> *%p1) {
2878 ; SSE2-LABEL: trunc_usat_v8i64_v8i8_store:
2880 ; SSE2-NEXT: movdqa (%rdi), %xmm6
2881 ; SSE2-NEXT: movdqa 16(%rdi), %xmm5
2882 ; SSE2-NEXT: movdqa 32(%rdi), %xmm9
2883 ; SSE2-NEXT: movdqa 48(%rdi), %xmm4
2884 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255]
2885 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
2886 ; SSE2-NEXT: movdqa %xmm5, %xmm7
2887 ; SSE2-NEXT: pxor %xmm2, %xmm7
2888 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259711,9223372039002259711]
2889 ; SSE2-NEXT: movdqa %xmm1, %xmm3
2890 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm3
2891 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2892 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm7
2893 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
2894 ; SSE2-NEXT: pand %xmm0, %xmm7
2895 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
2896 ; SSE2-NEXT: por %xmm7, %xmm0
2897 ; SSE2-NEXT: pand %xmm0, %xmm5
2898 ; SSE2-NEXT: pandn %xmm8, %xmm0
2899 ; SSE2-NEXT: por %xmm5, %xmm0
2900 ; SSE2-NEXT: movdqa %xmm6, %xmm3
2901 ; SSE2-NEXT: pxor %xmm2, %xmm3
2902 ; SSE2-NEXT: movdqa %xmm1, %xmm5
2903 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
2904 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
2905 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm3
2906 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2907 ; SSE2-NEXT: pand %xmm7, %xmm3
2908 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2909 ; SSE2-NEXT: por %xmm3, %xmm5
2910 ; SSE2-NEXT: pand %xmm5, %xmm6
2911 ; SSE2-NEXT: pandn %xmm8, %xmm5
2912 ; SSE2-NEXT: por %xmm6, %xmm5
2913 ; SSE2-NEXT: packuswb %xmm0, %xmm5
2914 ; SSE2-NEXT: movdqa %xmm4, %xmm0
2915 ; SSE2-NEXT: pxor %xmm2, %xmm0
2916 ; SSE2-NEXT: movdqa %xmm1, %xmm3
2917 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm3
2918 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
2919 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
2920 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2921 ; SSE2-NEXT: pand %xmm6, %xmm0
2922 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2923 ; SSE2-NEXT: por %xmm0, %xmm3
2924 ; SSE2-NEXT: pand %xmm3, %xmm4
2925 ; SSE2-NEXT: pandn %xmm8, %xmm3
2926 ; SSE2-NEXT: por %xmm4, %xmm3
2927 ; SSE2-NEXT: pxor %xmm9, %xmm2
2928 ; SSE2-NEXT: movdqa %xmm1, %xmm0
2929 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm0
2930 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
2931 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2
2932 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
2933 ; SSE2-NEXT: pand %xmm4, %xmm1
2934 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2935 ; SSE2-NEXT: por %xmm1, %xmm0
2936 ; SSE2-NEXT: pand %xmm0, %xmm9
2937 ; SSE2-NEXT: pandn %xmm8, %xmm0
2938 ; SSE2-NEXT: por %xmm9, %xmm0
2939 ; SSE2-NEXT: packuswb %xmm3, %xmm0
2940 ; SSE2-NEXT: packuswb %xmm0, %xmm5
2941 ; SSE2-NEXT: packuswb %xmm5, %xmm5
2942 ; SSE2-NEXT: movq %xmm5, (%rsi)
2945 ; SSSE3-LABEL: trunc_usat_v8i64_v8i8_store:
2947 ; SSSE3-NEXT: movdqa (%rdi), %xmm6
2948 ; SSSE3-NEXT: movdqa 16(%rdi), %xmm5
2949 ; SSSE3-NEXT: movdqa 32(%rdi), %xmm9
2950 ; SSSE3-NEXT: movdqa 48(%rdi), %xmm4
2951 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255]
2952 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
2953 ; SSSE3-NEXT: movdqa %xmm5, %xmm7
2954 ; SSSE3-NEXT: pxor %xmm2, %xmm7
2955 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259711,9223372039002259711]
2956 ; SSSE3-NEXT: movdqa %xmm1, %xmm3
2957 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm3
2958 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2959 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm7
2960 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
2961 ; SSSE3-NEXT: pand %xmm0, %xmm7
2962 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
2963 ; SSSE3-NEXT: por %xmm7, %xmm0
2964 ; SSSE3-NEXT: pand %xmm0, %xmm5
2965 ; SSSE3-NEXT: pandn %xmm8, %xmm0
2966 ; SSSE3-NEXT: por %xmm5, %xmm0
2967 ; SSSE3-NEXT: movdqa %xmm6, %xmm3
2968 ; SSSE3-NEXT: pxor %xmm2, %xmm3
2969 ; SSSE3-NEXT: movdqa %xmm1, %xmm5
2970 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
2971 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
2972 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm3
2973 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2974 ; SSSE3-NEXT: pand %xmm7, %xmm3
2975 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2976 ; SSSE3-NEXT: por %xmm3, %xmm5
2977 ; SSSE3-NEXT: pand %xmm5, %xmm6
2978 ; SSSE3-NEXT: pandn %xmm8, %xmm5
2979 ; SSSE3-NEXT: por %xmm6, %xmm5
2980 ; SSSE3-NEXT: packuswb %xmm0, %xmm5
2981 ; SSSE3-NEXT: movdqa %xmm4, %xmm0
2982 ; SSSE3-NEXT: pxor %xmm2, %xmm0
2983 ; SSSE3-NEXT: movdqa %xmm1, %xmm3
2984 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm3
2985 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
2986 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm0
2987 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2988 ; SSSE3-NEXT: pand %xmm6, %xmm0
2989 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2990 ; SSSE3-NEXT: por %xmm0, %xmm3
2991 ; SSSE3-NEXT: pand %xmm3, %xmm4
2992 ; SSSE3-NEXT: pandn %xmm8, %xmm3
2993 ; SSSE3-NEXT: por %xmm4, %xmm3
2994 ; SSSE3-NEXT: pxor %xmm9, %xmm2
2995 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
2996 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0
2997 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
2998 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm2
2999 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
3000 ; SSSE3-NEXT: pand %xmm4, %xmm1
3001 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3002 ; SSSE3-NEXT: por %xmm1, %xmm0
3003 ; SSSE3-NEXT: pand %xmm0, %xmm9
3004 ; SSSE3-NEXT: pandn %xmm8, %xmm0
3005 ; SSSE3-NEXT: por %xmm9, %xmm0
3006 ; SSSE3-NEXT: packuswb %xmm3, %xmm0
3007 ; SSSE3-NEXT: packuswb %xmm0, %xmm5
3008 ; SSSE3-NEXT: packuswb %xmm5, %xmm5
3009 ; SSSE3-NEXT: movq %xmm5, (%rsi)
3012 ; SSE41-LABEL: trunc_usat_v8i64_v8i8_store:
3014 ; SSE41-NEXT: movdqa (%rdi), %xmm7
3015 ; SSE41-NEXT: movdqa 16(%rdi), %xmm6
3016 ; SSE41-NEXT: movdqa 32(%rdi), %xmm8
3017 ; SSE41-NEXT: movdqa 48(%rdi), %xmm9
3018 ; SSE41-NEXT: movapd {{.*#+}} xmm1 = [255,255]
3019 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
3020 ; SSE41-NEXT: movdqa %xmm6, %xmm0
3021 ; SSE41-NEXT: pxor %xmm4, %xmm0
3022 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259711,9223372039002259711]
3023 ; SSE41-NEXT: movdqa %xmm2, %xmm5
3024 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
3025 ; SSE41-NEXT: movdqa %xmm2, %xmm3
3026 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
3027 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
3028 ; SSE41-NEXT: pand %xmm5, %xmm0
3029 ; SSE41-NEXT: por %xmm3, %xmm0
3030 ; SSE41-NEXT: movapd %xmm1, %xmm3
3031 ; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm3
3032 ; SSE41-NEXT: movdqa %xmm7, %xmm0
3033 ; SSE41-NEXT: pxor %xmm4, %xmm0
3034 ; SSE41-NEXT: movdqa %xmm2, %xmm5
3035 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
3036 ; SSE41-NEXT: movdqa %xmm2, %xmm6
3037 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
3038 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3039 ; SSE41-NEXT: pand %xmm5, %xmm0
3040 ; SSE41-NEXT: por %xmm6, %xmm0
3041 ; SSE41-NEXT: movapd %xmm1, %xmm6
3042 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm6
3043 ; SSE41-NEXT: packusdw %xmm3, %xmm6
3044 ; SSE41-NEXT: movdqa %xmm9, %xmm0
3045 ; SSE41-NEXT: pxor %xmm4, %xmm0
3046 ; SSE41-NEXT: movdqa %xmm2, %xmm3
3047 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
3048 ; SSE41-NEXT: movdqa %xmm2, %xmm5
3049 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
3050 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
3051 ; SSE41-NEXT: pand %xmm3, %xmm0
3052 ; SSE41-NEXT: por %xmm5, %xmm0
3053 ; SSE41-NEXT: movapd %xmm1, %xmm3
3054 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm3
3055 ; SSE41-NEXT: pxor %xmm8, %xmm4
3056 ; SSE41-NEXT: movdqa %xmm2, %xmm5
3057 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm5
3058 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm2
3059 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
3060 ; SSE41-NEXT: pand %xmm5, %xmm0
3061 ; SSE41-NEXT: por %xmm2, %xmm0
3062 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm1
3063 ; SSE41-NEXT: packusdw %xmm3, %xmm1
3064 ; SSE41-NEXT: packusdw %xmm1, %xmm6
3065 ; SSE41-NEXT: packuswb %xmm6, %xmm6
3066 ; SSE41-NEXT: movq %xmm6, (%rsi)
3069 ; AVX1-LABEL: trunc_usat_v8i64_v8i8_store:
3071 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
3072 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
3073 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2
3074 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3
3075 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
3076 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm5
3077 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [9223372036854776063,9223372036854776063]
3078 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm8
3079 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm7
3080 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm6, %xmm7
3081 ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm5
3082 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5
3083 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm4
3084 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm4
3085 ; AVX1-NEXT: vmovapd {{.*#+}} xmm6 = [255,255]
3086 ; AVX1-NEXT: vblendvpd %xmm4, %xmm3, %xmm6, %xmm3
3087 ; AVX1-NEXT: vblendvpd %xmm5, %xmm2, %xmm6, %xmm2
3088 ; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2
3089 ; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm6, %xmm1
3090 ; AVX1-NEXT: vblendvpd %xmm8, %xmm0, %xmm6, %xmm0
3091 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
3092 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
3093 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3094 ; AVX1-NEXT: vmovq %xmm0, (%rsi)
3097 ; AVX2-LABEL: trunc_usat_v8i64_v8i8_store:
3099 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
3100 ; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1
3101 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [255,255,255,255]
3102 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
3103 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm4
3104 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
3105 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
3106 ; AVX2-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
3107 ; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm3
3108 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
3109 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
3110 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
3111 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
3112 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
3113 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
3114 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3115 ; AVX2-NEXT: vmovq %xmm0, (%rsi)
3116 ; AVX2-NEXT: vzeroupper
3119 ; AVX512-LABEL: trunc_usat_v8i64_v8i8_store:
3121 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
3122 ; AVX512-NEXT: vpmovusqb %zmm0, (%rsi)
3123 ; AVX512-NEXT: vzeroupper
3126 ; SKX-LABEL: trunc_usat_v8i64_v8i8_store:
3128 ; SKX-NEXT: vmovdqa64 (%rdi), %zmm0
3129 ; SKX-NEXT: vpmovusqb %zmm0, (%rsi)
3130 ; SKX-NEXT: vzeroupper
3132 %a0 = load <8 x i64>, <8 x i64>* %p0
3133 %1 = icmp ult <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
3134 %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>
3135 %3 = trunc <8 x i64> %2 to <8 x i8>
3136 store <8 x i8> %3, <8 x i8> *%p1
3140 define <16 x i8> @trunc_usat_v16i64_v16i8(<16 x i64>* %p0) {
3141 ; SSE2-LABEL: trunc_usat_v16i64_v16i8:
3143 ; SSE2-NEXT: movdqa 96(%rdi), %xmm9
3144 ; SSE2-NEXT: movdqa 112(%rdi), %xmm10
3145 ; SSE2-NEXT: movdqa 64(%rdi), %xmm11
3146 ; SSE2-NEXT: movdqa 80(%rdi), %xmm12
3147 ; SSE2-NEXT: movdqa (%rdi), %xmm3
3148 ; SSE2-NEXT: movdqa 16(%rdi), %xmm6
3149 ; SSE2-NEXT: movdqa 32(%rdi), %xmm13
3150 ; SSE2-NEXT: movdqa 48(%rdi), %xmm1
3151 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255]
3152 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
3153 ; SSE2-NEXT: movdqa %xmm6, %xmm0
3154 ; SSE2-NEXT: pxor %xmm4, %xmm0
3155 ; SSE2-NEXT: movdqa {{.*#+}} xmm14 = [9223372039002259711,9223372039002259711]
3156 ; SSE2-NEXT: movdqa %xmm14, %xmm5
3157 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm5
3158 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm5[0,0,2,2]
3159 ; SSE2-NEXT: pcmpeqd %xmm14, %xmm0
3160 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3161 ; SSE2-NEXT: pand %xmm2, %xmm0
3162 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
3163 ; SSE2-NEXT: por %xmm0, %xmm2
3164 ; SSE2-NEXT: pand %xmm2, %xmm6
3165 ; SSE2-NEXT: pandn %xmm8, %xmm2
3166 ; SSE2-NEXT: por %xmm6, %xmm2
3167 ; SSE2-NEXT: movdqa %xmm3, %xmm0
3168 ; SSE2-NEXT: pxor %xmm4, %xmm0
3169 ; SSE2-NEXT: movdqa %xmm14, %xmm5
3170 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm5
3171 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
3172 ; SSE2-NEXT: pcmpeqd %xmm14, %xmm0
3173 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
3174 ; SSE2-NEXT: pand %xmm6, %xmm7
3175 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
3176 ; SSE2-NEXT: por %xmm7, %xmm0
3177 ; SSE2-NEXT: pand %xmm0, %xmm3
3178 ; SSE2-NEXT: pandn %xmm8, %xmm0
3179 ; SSE2-NEXT: por %xmm3, %xmm0
3180 ; SSE2-NEXT: packuswb %xmm2, %xmm0
3181 ; SSE2-NEXT: movdqa %xmm1, %xmm2
3182 ; SSE2-NEXT: pxor %xmm4, %xmm2
3183 ; SSE2-NEXT: movdqa %xmm14, %xmm3
3184 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
3185 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
3186 ; SSE2-NEXT: pcmpeqd %xmm14, %xmm2
3187 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3188 ; SSE2-NEXT: pand %xmm5, %xmm2
3189 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3190 ; SSE2-NEXT: por %xmm2, %xmm3
3191 ; SSE2-NEXT: pand %xmm3, %xmm1
3192 ; SSE2-NEXT: pandn %xmm8, %xmm3
3193 ; SSE2-NEXT: por %xmm1, %xmm3
3194 ; SSE2-NEXT: movdqa %xmm13, %xmm1
3195 ; SSE2-NEXT: pxor %xmm4, %xmm1
3196 ; SSE2-NEXT: movdqa %xmm14, %xmm2
3197 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
3198 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
3199 ; SSE2-NEXT: pcmpeqd %xmm14, %xmm1
3200 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3201 ; SSE2-NEXT: pand %xmm5, %xmm1
3202 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3203 ; SSE2-NEXT: por %xmm1, %xmm2
3204 ; SSE2-NEXT: pand %xmm2, %xmm13
3205 ; SSE2-NEXT: pandn %xmm8, %xmm2
3206 ; SSE2-NEXT: por %xmm13, %xmm2
3207 ; SSE2-NEXT: packuswb %xmm3, %xmm2
3208 ; SSE2-NEXT: packuswb %xmm2, %xmm0
3209 ; SSE2-NEXT: movdqa %xmm12, %xmm1
3210 ; SSE2-NEXT: pxor %xmm4, %xmm1
3211 ; SSE2-NEXT: movdqa %xmm14, %xmm2
3212 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
3213 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
3214 ; SSE2-NEXT: pcmpeqd %xmm14, %xmm1
3215 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3216 ; SSE2-NEXT: pand %xmm3, %xmm1
3217 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3218 ; SSE2-NEXT: por %xmm1, %xmm2
3219 ; SSE2-NEXT: pand %xmm2, %xmm12
3220 ; SSE2-NEXT: pandn %xmm8, %xmm2
3221 ; SSE2-NEXT: por %xmm12, %xmm2
3222 ; SSE2-NEXT: movdqa %xmm11, %xmm1
3223 ; SSE2-NEXT: pxor %xmm4, %xmm1
3224 ; SSE2-NEXT: movdqa %xmm14, %xmm3
3225 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
3226 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
3227 ; SSE2-NEXT: pcmpeqd %xmm14, %xmm1
3228 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
3229 ; SSE2-NEXT: pand %xmm5, %xmm6
3230 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
3231 ; SSE2-NEXT: por %xmm6, %xmm1
3232 ; SSE2-NEXT: pand %xmm1, %xmm11
3233 ; SSE2-NEXT: pandn %xmm8, %xmm1
3234 ; SSE2-NEXT: por %xmm11, %xmm1
3235 ; SSE2-NEXT: packuswb %xmm2, %xmm1
3236 ; SSE2-NEXT: movdqa %xmm10, %xmm2
3237 ; SSE2-NEXT: pxor %xmm4, %xmm2
3238 ; SSE2-NEXT: movdqa %xmm14, %xmm3
3239 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
3240 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
3241 ; SSE2-NEXT: pcmpeqd %xmm14, %xmm2
3242 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3243 ; SSE2-NEXT: pand %xmm5, %xmm2
3244 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3245 ; SSE2-NEXT: por %xmm2, %xmm3
3246 ; SSE2-NEXT: pand %xmm3, %xmm10
3247 ; SSE2-NEXT: pandn %xmm8, %xmm3
3248 ; SSE2-NEXT: por %xmm10, %xmm3
3249 ; SSE2-NEXT: pxor %xmm9, %xmm4
3250 ; SSE2-NEXT: movdqa %xmm14, %xmm2
3251 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm2
3252 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
3253 ; SSE2-NEXT: pcmpeqd %xmm14, %xmm4
3254 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3255 ; SSE2-NEXT: pand %xmm5, %xmm4
3256 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3257 ; SSE2-NEXT: por %xmm4, %xmm2
3258 ; SSE2-NEXT: pand %xmm2, %xmm9
3259 ; SSE2-NEXT: pandn %xmm8, %xmm2
3260 ; SSE2-NEXT: por %xmm9, %xmm2
3261 ; SSE2-NEXT: packuswb %xmm3, %xmm2
3262 ; SSE2-NEXT: packuswb %xmm2, %xmm1
3263 ; SSE2-NEXT: packuswb %xmm1, %xmm0
3266 ; SSSE3-LABEL: trunc_usat_v16i64_v16i8:
3268 ; SSSE3-NEXT: movdqa 96(%rdi), %xmm9
3269 ; SSSE3-NEXT: movdqa 112(%rdi), %xmm10
3270 ; SSSE3-NEXT: movdqa 64(%rdi), %xmm11
3271 ; SSSE3-NEXT: movdqa 80(%rdi), %xmm12
3272 ; SSSE3-NEXT: movdqa (%rdi), %xmm3
3273 ; SSSE3-NEXT: movdqa 16(%rdi), %xmm6
3274 ; SSSE3-NEXT: movdqa 32(%rdi), %xmm13
3275 ; SSSE3-NEXT: movdqa 48(%rdi), %xmm1
3276 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255]
3277 ; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
3278 ; SSSE3-NEXT: movdqa %xmm6, %xmm0
3279 ; SSSE3-NEXT: pxor %xmm4, %xmm0
3280 ; SSSE3-NEXT: movdqa {{.*#+}} xmm14 = [9223372039002259711,9223372039002259711]
3281 ; SSSE3-NEXT: movdqa %xmm14, %xmm5
3282 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm5
3283 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm5[0,0,2,2]
3284 ; SSSE3-NEXT: pcmpeqd %xmm14, %xmm0
3285 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3286 ; SSSE3-NEXT: pand %xmm2, %xmm0
3287 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
3288 ; SSSE3-NEXT: por %xmm0, %xmm2
3289 ; SSSE3-NEXT: pand %xmm2, %xmm6
3290 ; SSSE3-NEXT: pandn %xmm8, %xmm2
3291 ; SSSE3-NEXT: por %xmm6, %xmm2
3292 ; SSSE3-NEXT: movdqa %xmm3, %xmm0
3293 ; SSSE3-NEXT: pxor %xmm4, %xmm0
3294 ; SSSE3-NEXT: movdqa %xmm14, %xmm5
3295 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm5
3296 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
3297 ; SSSE3-NEXT: pcmpeqd %xmm14, %xmm0
3298 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
3299 ; SSSE3-NEXT: pand %xmm6, %xmm7
3300 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
3301 ; SSSE3-NEXT: por %xmm7, %xmm0
3302 ; SSSE3-NEXT: pand %xmm0, %xmm3
3303 ; SSSE3-NEXT: pandn %xmm8, %xmm0
3304 ; SSSE3-NEXT: por %xmm3, %xmm0
3305 ; SSSE3-NEXT: packuswb %xmm2, %xmm0
3306 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
3307 ; SSSE3-NEXT: pxor %xmm4, %xmm2
3308 ; SSSE3-NEXT: movdqa %xmm14, %xmm3
3309 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
3310 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
3311 ; SSSE3-NEXT: pcmpeqd %xmm14, %xmm2
3312 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3313 ; SSSE3-NEXT: pand %xmm5, %xmm2
3314 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3315 ; SSSE3-NEXT: por %xmm2, %xmm3
3316 ; SSSE3-NEXT: pand %xmm3, %xmm1
3317 ; SSSE3-NEXT: pandn %xmm8, %xmm3
3318 ; SSSE3-NEXT: por %xmm1, %xmm3
3319 ; SSSE3-NEXT: movdqa %xmm13, %xmm1
3320 ; SSSE3-NEXT: pxor %xmm4, %xmm1
3321 ; SSSE3-NEXT: movdqa %xmm14, %xmm2
3322 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
3323 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
3324 ; SSSE3-NEXT: pcmpeqd %xmm14, %xmm1
3325 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3326 ; SSSE3-NEXT: pand %xmm5, %xmm1
3327 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3328 ; SSSE3-NEXT: por %xmm1, %xmm2
3329 ; SSSE3-NEXT: pand %xmm2, %xmm13
3330 ; SSSE3-NEXT: pandn %xmm8, %xmm2
3331 ; SSSE3-NEXT: por %xmm13, %xmm2
3332 ; SSSE3-NEXT: packuswb %xmm3, %xmm2
3333 ; SSSE3-NEXT: packuswb %xmm2, %xmm0
3334 ; SSSE3-NEXT: movdqa %xmm12, %xmm1
3335 ; SSSE3-NEXT: pxor %xmm4, %xmm1
3336 ; SSSE3-NEXT: movdqa %xmm14, %xmm2
3337 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
3338 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
3339 ; SSSE3-NEXT: pcmpeqd %xmm14, %xmm1
3340 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3341 ; SSSE3-NEXT: pand %xmm3, %xmm1
3342 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3343 ; SSSE3-NEXT: por %xmm1, %xmm2
3344 ; SSSE3-NEXT: pand %xmm2, %xmm12
3345 ; SSSE3-NEXT: pandn %xmm8, %xmm2
3346 ; SSSE3-NEXT: por %xmm12, %xmm2
3347 ; SSSE3-NEXT: movdqa %xmm11, %xmm1
3348 ; SSSE3-NEXT: pxor %xmm4, %xmm1
3349 ; SSSE3-NEXT: movdqa %xmm14, %xmm3
3350 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3
3351 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
3352 ; SSSE3-NEXT: pcmpeqd %xmm14, %xmm1
3353 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
3354 ; SSSE3-NEXT: pand %xmm5, %xmm6
3355 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
3356 ; SSSE3-NEXT: por %xmm6, %xmm1
3357 ; SSSE3-NEXT: pand %xmm1, %xmm11
3358 ; SSSE3-NEXT: pandn %xmm8, %xmm1
3359 ; SSSE3-NEXT: por %xmm11, %xmm1
3360 ; SSSE3-NEXT: packuswb %xmm2, %xmm1
3361 ; SSSE3-NEXT: movdqa %xmm10, %xmm2
3362 ; SSSE3-NEXT: pxor %xmm4, %xmm2
3363 ; SSSE3-NEXT: movdqa %xmm14, %xmm3
3364 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
3365 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
3366 ; SSSE3-NEXT: pcmpeqd %xmm14, %xmm2
3367 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3368 ; SSSE3-NEXT: pand %xmm5, %xmm2
3369 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3370 ; SSSE3-NEXT: por %xmm2, %xmm3
3371 ; SSSE3-NEXT: pand %xmm3, %xmm10
3372 ; SSSE3-NEXT: pandn %xmm8, %xmm3
3373 ; SSSE3-NEXT: por %xmm10, %xmm3
3374 ; SSSE3-NEXT: pxor %xmm9, %xmm4
3375 ; SSSE3-NEXT: movdqa %xmm14, %xmm2
3376 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm2
3377 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
3378 ; SSSE3-NEXT: pcmpeqd %xmm14, %xmm4
3379 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3380 ; SSSE3-NEXT: pand %xmm5, %xmm4
3381 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3382 ; SSSE3-NEXT: por %xmm4, %xmm2
3383 ; SSSE3-NEXT: pand %xmm2, %xmm9
3384 ; SSSE3-NEXT: pandn %xmm8, %xmm2
3385 ; SSSE3-NEXT: por %xmm9, %xmm2
3386 ; SSSE3-NEXT: packuswb %xmm3, %xmm2
3387 ; SSSE3-NEXT: packuswb %xmm2, %xmm1
3388 ; SSSE3-NEXT: packuswb %xmm1, %xmm0
3391 ; SSE41-LABEL: trunc_usat_v16i64_v16i8:
3393 ; SSE41-NEXT: movdqa 96(%rdi), %xmm8
3394 ; SSE41-NEXT: movdqa 112(%rdi), %xmm9
3395 ; SSE41-NEXT: movdqa 64(%rdi), %xmm10
3396 ; SSE41-NEXT: movdqa 80(%rdi), %xmm11
3397 ; SSE41-NEXT: movdqa (%rdi), %xmm2
3398 ; SSE41-NEXT: movdqa 16(%rdi), %xmm1
3399 ; SSE41-NEXT: movdqa 32(%rdi), %xmm12
3400 ; SSE41-NEXT: movdqa 48(%rdi), %xmm13
3401 ; SSE41-NEXT: movapd {{.*#+}} xmm3 = [255,255]
3402 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
3403 ; SSE41-NEXT: movdqa %xmm1, %xmm0
3404 ; SSE41-NEXT: pxor %xmm6, %xmm0
3405 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259711,9223372039002259711]
3406 ; SSE41-NEXT: movdqa %xmm4, %xmm7
3407 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm7
3408 ; SSE41-NEXT: movdqa %xmm4, %xmm5
3409 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
3410 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
3411 ; SSE41-NEXT: pand %xmm7, %xmm0
3412 ; SSE41-NEXT: por %xmm5, %xmm0
3413 ; SSE41-NEXT: movapd %xmm3, %xmm5
3414 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm5
3415 ; SSE41-NEXT: movdqa %xmm2, %xmm0
3416 ; SSE41-NEXT: pxor %xmm6, %xmm0
3417 ; SSE41-NEXT: movdqa %xmm4, %xmm1
3418 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
3419 ; SSE41-NEXT: movdqa %xmm4, %xmm7
3420 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
3421 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
3422 ; SSE41-NEXT: pand %xmm1, %xmm0
3423 ; SSE41-NEXT: por %xmm7, %xmm0
3424 ; SSE41-NEXT: movapd %xmm3, %xmm1
3425 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
3426 ; SSE41-NEXT: packusdw %xmm5, %xmm1
3427 ; SSE41-NEXT: movdqa %xmm13, %xmm0
3428 ; SSE41-NEXT: pxor %xmm6, %xmm0
3429 ; SSE41-NEXT: movdqa %xmm4, %xmm2
3430 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
3431 ; SSE41-NEXT: movdqa %xmm4, %xmm5
3432 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
3433 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
3434 ; SSE41-NEXT: pand %xmm2, %xmm0
3435 ; SSE41-NEXT: por %xmm5, %xmm0
3436 ; SSE41-NEXT: movapd %xmm3, %xmm2
3437 ; SSE41-NEXT: blendvpd %xmm0, %xmm13, %xmm2
3438 ; SSE41-NEXT: movdqa %xmm12, %xmm0
3439 ; SSE41-NEXT: pxor %xmm6, %xmm0
3440 ; SSE41-NEXT: movdqa %xmm4, %xmm5
3441 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
3442 ; SSE41-NEXT: movdqa %xmm4, %xmm7
3443 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
3444 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
3445 ; SSE41-NEXT: pand %xmm5, %xmm0
3446 ; SSE41-NEXT: por %xmm7, %xmm0
3447 ; SSE41-NEXT: movapd %xmm3, %xmm5
3448 ; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm5
3449 ; SSE41-NEXT: packusdw %xmm2, %xmm5
3450 ; SSE41-NEXT: packusdw %xmm5, %xmm1
3451 ; SSE41-NEXT: movdqa %xmm11, %xmm0
3452 ; SSE41-NEXT: pxor %xmm6, %xmm0
3453 ; SSE41-NEXT: movdqa %xmm4, %xmm2
3454 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
3455 ; SSE41-NEXT: movdqa %xmm4, %xmm5
3456 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
3457 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
3458 ; SSE41-NEXT: pand %xmm2, %xmm0
3459 ; SSE41-NEXT: por %xmm5, %xmm0
3460 ; SSE41-NEXT: movapd %xmm3, %xmm5
3461 ; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm5
3462 ; SSE41-NEXT: movdqa %xmm10, %xmm0
3463 ; SSE41-NEXT: pxor %xmm6, %xmm0
3464 ; SSE41-NEXT: movdqa %xmm4, %xmm2
3465 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
3466 ; SSE41-NEXT: movdqa %xmm4, %xmm7
3467 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
3468 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
3469 ; SSE41-NEXT: pand %xmm2, %xmm0
3470 ; SSE41-NEXT: por %xmm7, %xmm0
3471 ; SSE41-NEXT: movapd %xmm3, %xmm2
3472 ; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm2
3473 ; SSE41-NEXT: packusdw %xmm5, %xmm2
3474 ; SSE41-NEXT: movdqa %xmm9, %xmm0
3475 ; SSE41-NEXT: pxor %xmm6, %xmm0
3476 ; SSE41-NEXT: movdqa %xmm4, %xmm5
3477 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
3478 ; SSE41-NEXT: movdqa %xmm4, %xmm7
3479 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
3480 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
3481 ; SSE41-NEXT: pand %xmm5, %xmm0
3482 ; SSE41-NEXT: por %xmm7, %xmm0
3483 ; SSE41-NEXT: movapd %xmm3, %xmm5
3484 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm5
3485 ; SSE41-NEXT: pxor %xmm8, %xmm6
3486 ; SSE41-NEXT: movdqa %xmm4, %xmm7
3487 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm7
3488 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm4
3489 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
3490 ; SSE41-NEXT: pand %xmm7, %xmm0
3491 ; SSE41-NEXT: por %xmm4, %xmm0
3492 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm3
3493 ; SSE41-NEXT: packusdw %xmm5, %xmm3
3494 ; SSE41-NEXT: packusdw %xmm3, %xmm2
3495 ; SSE41-NEXT: packuswb %xmm2, %xmm1
3496 ; SSE41-NEXT: movdqa %xmm1, %xmm0
3499 ; AVX1-LABEL: trunc_usat_v16i64_v16i8:
3501 ; AVX1-NEXT: vmovdqa (%rdi), %xmm12
3502 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm13
3503 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm15
3504 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm9
3505 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
3506 ; AVX1-NEXT: vpxor %xmm4, %xmm12, %xmm5
3507 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [9223372036854776063,9223372036854776063]
3508 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm0
3509 ; AVX1-NEXT: vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3510 ; AVX1-NEXT: vpxor %xmm4, %xmm13, %xmm7
3511 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm6, %xmm0
3512 ; AVX1-NEXT: vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
3513 ; AVX1-NEXT: vpxor %xmm4, %xmm15, %xmm5
3514 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm10
3515 ; AVX1-NEXT: vpxor %xmm4, %xmm9, %xmm7
3516 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm6, %xmm11
3517 ; AVX1-NEXT: vmovdqa 64(%rdi), %xmm5
3518 ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm7
3519 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm6, %xmm14
3520 ; AVX1-NEXT: vmovdqa 80(%rdi), %xmm3
3521 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm1
3522 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm6, %xmm1
3523 ; AVX1-NEXT: vmovdqa 96(%rdi), %xmm7
3524 ; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm2
3525 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm6, %xmm2
3526 ; AVX1-NEXT: vmovdqa 112(%rdi), %xmm0
3527 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm4
3528 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm4
3529 ; AVX1-NEXT: vmovapd {{.*#+}} xmm6 = [255,255]
3530 ; AVX1-NEXT: vblendvpd %xmm4, %xmm0, %xmm6, %xmm8
3531 ; AVX1-NEXT: vblendvpd %xmm2, %xmm7, %xmm6, %xmm2
3532 ; AVX1-NEXT: vblendvpd %xmm1, %xmm3, %xmm6, %xmm1
3533 ; AVX1-NEXT: vblendvpd %xmm14, %xmm5, %xmm6, %xmm3
3534 ; AVX1-NEXT: vblendvpd %xmm11, %xmm9, %xmm6, %xmm4
3535 ; AVX1-NEXT: vblendvpd %xmm10, %xmm15, %xmm6, %xmm5
3536 ; AVX1-NEXT: vmovapd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3537 ; AVX1-NEXT: vblendvpd %xmm0, %xmm13, %xmm6, %xmm7
3538 ; AVX1-NEXT: vmovapd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
3539 ; AVX1-NEXT: vblendvpd %xmm0, %xmm12, %xmm6, %xmm6
3540 ; AVX1-NEXT: vpackusdw %xmm8, %xmm2, %xmm0
3541 ; AVX1-NEXT: vpackusdw %xmm1, %xmm3, %xmm1
3542 ; AVX1-NEXT: vpackusdw %xmm0, %xmm1, %xmm0
3543 ; AVX1-NEXT: vpackusdw %xmm4, %xmm5, %xmm1
3544 ; AVX1-NEXT: vpackusdw %xmm7, %xmm6, %xmm2
3545 ; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm1
3546 ; AVX1-NEXT: vpackuswb %xmm0, %xmm1, %xmm0
3549 ; AVX2-LABEL: trunc_usat_v16i64_v16i8:
3551 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
3552 ; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1
3553 ; AVX2-NEXT: vmovdqa 64(%rdi), %ymm2
3554 ; AVX2-NEXT: vmovdqa 96(%rdi), %ymm3
3555 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm4 = [255,255,255,255]
3556 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
3557 ; AVX2-NEXT: vpxor %ymm5, %ymm1, %ymm6
3558 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm7 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
3559 ; AVX2-NEXT: vpcmpgtq %ymm6, %ymm7, %ymm6
3560 ; AVX2-NEXT: vblendvpd %ymm6, %ymm1, %ymm4, %ymm1
3561 ; AVX2-NEXT: vpxor %ymm5, %ymm0, %ymm6
3562 ; AVX2-NEXT: vpcmpgtq %ymm6, %ymm7, %ymm6
3563 ; AVX2-NEXT: vblendvpd %ymm6, %ymm0, %ymm4, %ymm0
3564 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
3565 ; AVX2-NEXT: vpxor %ymm5, %ymm3, %ymm1
3566 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm7, %ymm1
3567 ; AVX2-NEXT: vblendvpd %ymm1, %ymm3, %ymm4, %ymm1
3568 ; AVX2-NEXT: vpxor %ymm5, %ymm2, %ymm3
3569 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm7, %ymm3
3570 ; AVX2-NEXT: vblendvpd %ymm3, %ymm2, %ymm4, %ymm2
3571 ; AVX2-NEXT: vpackusdw %ymm1, %ymm2, %ymm1
3572 ; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
3573 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
3574 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
3575 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
3576 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
3577 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
3578 ; AVX2-NEXT: vzeroupper
3581 ; AVX512-LABEL: trunc_usat_v16i64_v16i8:
3583 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
3584 ; AVX512-NEXT: vmovdqa64 64(%rdi), %zmm1
3585 ; AVX512-NEXT: vpmovusqb %zmm1, %xmm1
3586 ; AVX512-NEXT: vpmovusqb %zmm0, %xmm0
3587 ; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3588 ; AVX512-NEXT: vzeroupper
3591 ; SKX-LABEL: trunc_usat_v16i64_v16i8:
3593 ; SKX-NEXT: vmovdqa64 (%rdi), %zmm0
3594 ; SKX-NEXT: vmovdqa64 64(%rdi), %zmm1
3595 ; SKX-NEXT: vpmovusqb %zmm1, %xmm1
3596 ; SKX-NEXT: vpmovusqb %zmm0, %xmm0
3597 ; SKX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3598 ; SKX-NEXT: vzeroupper
3600 %a0 = load <16 x i64>, <16 x i64>* %p0
3601 %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>
3602 %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>
3603 %3 = trunc <16 x i64> %2 to <16 x i8>
3607 define <4 x i8> @trunc_usat_v4i32_v4i8(<4 x i32> %a0) {
3608 ; SSE2-LABEL: trunc_usat_v4i32_v4i8:
3610 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
3611 ; SSE2-NEXT: pxor %xmm0, %xmm2
3612 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483903,2147483903,2147483903,2147483903]
3613 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm1
3614 ; SSE2-NEXT: pand %xmm1, %xmm0
3615 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
3616 ; SSE2-NEXT: por %xmm0, %xmm1
3617 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
3618 ; SSE2-NEXT: packuswb %xmm1, %xmm1
3619 ; SSE2-NEXT: packuswb %xmm1, %xmm1
3620 ; SSE2-NEXT: movdqa %xmm1, %xmm0
3623 ; SSSE3-LABEL: trunc_usat_v4i32_v4i8:
3625 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
3626 ; SSSE3-NEXT: pxor %xmm0, %xmm1
3627 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483903,2147483903,2147483903,2147483903]
3628 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
3629 ; SSSE3-NEXT: pand %xmm2, %xmm0
3630 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
3631 ; SSSE3-NEXT: por %xmm2, %xmm0
3632 ; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
3635 ; SSE41-LABEL: trunc_usat_v4i32_v4i8:
3637 ; SSE41-NEXT: pminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3638 ; SSE41-NEXT: packusdw %xmm0, %xmm0
3639 ; SSE41-NEXT: packuswb %xmm0, %xmm0
3642 ; AVX1-LABEL: trunc_usat_v4i32_v4i8:
3644 ; AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
3645 ; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
3646 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3649 ; AVX2-LABEL: trunc_usat_v4i32_v4i8:
3651 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [255,255,255,255]
3652 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
3653 ; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
3654 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3657 ; AVX512F-LABEL: trunc_usat_v4i32_v4i8:
3659 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
3660 ; AVX512F-NEXT: vpmovusdb %zmm0, %xmm0
3661 ; AVX512F-NEXT: vzeroupper
3662 ; AVX512F-NEXT: retq
3664 ; AVX512VL-LABEL: trunc_usat_v4i32_v4i8:
3665 ; AVX512VL: # %bb.0:
3666 ; AVX512VL-NEXT: vpmovusdb %xmm0, %xmm0
3667 ; AVX512VL-NEXT: retq
3669 ; AVX512BW-LABEL: trunc_usat_v4i32_v4i8:
3670 ; AVX512BW: # %bb.0:
3671 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
3672 ; AVX512BW-NEXT: vpmovusdb %zmm0, %xmm0
3673 ; AVX512BW-NEXT: vzeroupper
3674 ; AVX512BW-NEXT: retq
3676 ; AVX512BWVL-LABEL: trunc_usat_v4i32_v4i8:
3677 ; AVX512BWVL: # %bb.0:
3678 ; AVX512BWVL-NEXT: vpmovusdb %xmm0, %xmm0
3679 ; AVX512BWVL-NEXT: retq
3681 ; SKX-LABEL: trunc_usat_v4i32_v4i8:
3683 ; SKX-NEXT: vpmovusdb %xmm0, %xmm0
3685 %1 = icmp ult <4 x i32> %a0, <i32 255, i32 255, i32 255, i32 255>
3686 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 255, i32 255, i32 255, i32 255>
3687 %3 = trunc <4 x i32> %2 to <4 x i8>
3691 define void @trunc_usat_v4i32_v4i8_store(<4 x i32> %a0, <4 x i8> *%p1) {
3692 ; SSE2-LABEL: trunc_usat_v4i32_v4i8_store:
3694 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
3695 ; SSE2-NEXT: pxor %xmm0, %xmm1
3696 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483903,2147483903,2147483903,2147483903]
3697 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
3698 ; SSE2-NEXT: pand %xmm2, %xmm0
3699 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
3700 ; SSE2-NEXT: por %xmm0, %xmm2
3701 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
3702 ; SSE2-NEXT: packuswb %xmm2, %xmm2
3703 ; SSE2-NEXT: packuswb %xmm2, %xmm2
3704 ; SSE2-NEXT: movd %xmm2, (%rdi)
3707 ; SSSE3-LABEL: trunc_usat_v4i32_v4i8_store:
3709 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
3710 ; SSSE3-NEXT: pxor %xmm0, %xmm1
3711 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483903,2147483903,2147483903,2147483903]
3712 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
3713 ; SSSE3-NEXT: pand %xmm2, %xmm0
3714 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
3715 ; SSSE3-NEXT: por %xmm0, %xmm2
3716 ; SSSE3-NEXT: pshufb {{.*#+}} xmm2 = xmm2[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
3717 ; SSSE3-NEXT: movd %xmm2, (%rdi)
3720 ; SSE41-LABEL: trunc_usat_v4i32_v4i8_store:
3722 ; SSE41-NEXT: pminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3723 ; SSE41-NEXT: packusdw %xmm0, %xmm0
3724 ; SSE41-NEXT: packuswb %xmm0, %xmm0
3725 ; SSE41-NEXT: movd %xmm0, (%rdi)
3728 ; AVX1-LABEL: trunc_usat_v4i32_v4i8_store:
3730 ; AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
3731 ; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
3732 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3733 ; AVX1-NEXT: vmovd %xmm0, (%rdi)
3736 ; AVX2-LABEL: trunc_usat_v4i32_v4i8_store:
3738 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [255,255,255,255]
3739 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
3740 ; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
3741 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3742 ; AVX2-NEXT: vmovd %xmm0, (%rdi)
3745 ; AVX512F-LABEL: trunc_usat_v4i32_v4i8_store:
3747 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
3748 ; AVX512F-NEXT: vpmovusdb %zmm0, %xmm0
3749 ; AVX512F-NEXT: vmovd %xmm0, (%rdi)
3750 ; AVX512F-NEXT: vzeroupper
3751 ; AVX512F-NEXT: retq
3753 ; AVX512VL-LABEL: trunc_usat_v4i32_v4i8_store:
3754 ; AVX512VL: # %bb.0:
3755 ; AVX512VL-NEXT: vpmovusdb %xmm0, (%rdi)
3756 ; AVX512VL-NEXT: retq
3758 ; AVX512BW-LABEL: trunc_usat_v4i32_v4i8_store:
3759 ; AVX512BW: # %bb.0:
3760 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
3761 ; AVX512BW-NEXT: vpmovusdb %zmm0, %xmm0
3762 ; AVX512BW-NEXT: vmovd %xmm0, (%rdi)
3763 ; AVX512BW-NEXT: vzeroupper
3764 ; AVX512BW-NEXT: retq
3766 ; AVX512BWVL-LABEL: trunc_usat_v4i32_v4i8_store:
3767 ; AVX512BWVL: # %bb.0:
3768 ; AVX512BWVL-NEXT: vpmovusdb %xmm0, (%rdi)
3769 ; AVX512BWVL-NEXT: retq
3771 ; SKX-LABEL: trunc_usat_v4i32_v4i8_store:
3773 ; SKX-NEXT: vpmovusdb %xmm0, (%rdi)
3775 %1 = icmp ult <4 x i32> %a0, <i32 255, i32 255, i32 255, i32 255>
3776 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 255, i32 255, i32 255, i32 255>
3777 %3 = trunc <4 x i32> %2 to <4 x i8>
3778 store <4 x i8> %3, <4 x i8> *%p1
3782 define <8 x i8> @trunc_usat_v8i32_v8i8(<8 x i32> %a0) {
3783 ; SSE2-LABEL: trunc_usat_v8i32_v8i8:
3785 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
3786 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
3787 ; SSE2-NEXT: movdqa %xmm1, %xmm4
3788 ; SSE2-NEXT: pxor %xmm3, %xmm4
3789 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
3790 ; SSE2-NEXT: movdqa %xmm5, %xmm6
3791 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm6
3792 ; SSE2-NEXT: pand %xmm6, %xmm1
3793 ; SSE2-NEXT: pandn %xmm2, %xmm6
3794 ; SSE2-NEXT: por %xmm1, %xmm6
3795 ; SSE2-NEXT: pxor %xmm0, %xmm3
3796 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
3797 ; SSE2-NEXT: pand %xmm5, %xmm0
3798 ; SSE2-NEXT: pandn %xmm2, %xmm5
3799 ; SSE2-NEXT: por %xmm5, %xmm0
3800 ; SSE2-NEXT: packuswb %xmm6, %xmm0
3801 ; SSE2-NEXT: packuswb %xmm0, %xmm0
3804 ; SSSE3-LABEL: trunc_usat_v8i32_v8i8:
3806 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
3807 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
3808 ; SSSE3-NEXT: movdqa %xmm1, %xmm4
3809 ; SSSE3-NEXT: pxor %xmm3, %xmm4
3810 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
3811 ; SSSE3-NEXT: movdqa %xmm5, %xmm6
3812 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
3813 ; SSSE3-NEXT: pand %xmm6, %xmm1
3814 ; SSSE3-NEXT: pandn %xmm2, %xmm6
3815 ; SSSE3-NEXT: por %xmm1, %xmm6
3816 ; SSSE3-NEXT: pxor %xmm0, %xmm3
3817 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
3818 ; SSSE3-NEXT: pand %xmm5, %xmm0
3819 ; SSSE3-NEXT: pandn %xmm2, %xmm5
3820 ; SSSE3-NEXT: por %xmm5, %xmm0
3821 ; SSSE3-NEXT: packuswb %xmm6, %xmm0
3822 ; SSSE3-NEXT: packuswb %xmm0, %xmm0
3825 ; SSE41-LABEL: trunc_usat_v8i32_v8i8:
3827 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
3828 ; SSE41-NEXT: pminud %xmm2, %xmm1
3829 ; SSE41-NEXT: pminud %xmm2, %xmm0
3830 ; SSE41-NEXT: packusdw %xmm1, %xmm0
3831 ; SSE41-NEXT: packuswb %xmm0, %xmm0
3834 ; AVX1-LABEL: trunc_usat_v8i32_v8i8:
3836 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
3837 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [255,255,255,255]
3838 ; AVX1-NEXT: vpminud %xmm2, %xmm1, %xmm1
3839 ; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0
3840 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
3841 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3842 ; AVX1-NEXT: vzeroupper
3845 ; AVX2-LABEL: trunc_usat_v8i32_v8i8:
3847 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
3848 ; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0
3849 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
3850 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
3851 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3852 ; AVX2-NEXT: vzeroupper
3855 ; AVX512F-LABEL: trunc_usat_v8i32_v8i8:
3857 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
3858 ; AVX512F-NEXT: vpmovusdb %zmm0, %xmm0
3859 ; AVX512F-NEXT: vzeroupper
3860 ; AVX512F-NEXT: retq
3862 ; AVX512VL-LABEL: trunc_usat_v8i32_v8i8:
3863 ; AVX512VL: # %bb.0:
3864 ; AVX512VL-NEXT: vpmovusdb %ymm0, %xmm0
3865 ; AVX512VL-NEXT: vzeroupper
3866 ; AVX512VL-NEXT: retq
3868 ; AVX512BW-LABEL: trunc_usat_v8i32_v8i8:
3869 ; AVX512BW: # %bb.0:
3870 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
3871 ; AVX512BW-NEXT: vpmovusdb %zmm0, %xmm0
3872 ; AVX512BW-NEXT: vzeroupper
3873 ; AVX512BW-NEXT: retq
3875 ; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i8:
3876 ; AVX512BWVL: # %bb.0:
3877 ; AVX512BWVL-NEXT: vpmovusdb %ymm0, %xmm0
3878 ; AVX512BWVL-NEXT: vzeroupper
3879 ; AVX512BWVL-NEXT: retq
3881 ; SKX-LABEL: trunc_usat_v8i32_v8i8:
3883 ; SKX-NEXT: vpmovusdb %ymm0, %xmm0
3884 ; SKX-NEXT: vzeroupper
3886 %1 = icmp ult <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
3887 %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>
3888 %3 = trunc <8 x i32> %2 to <8 x i8>
3892 define void @trunc_usat_v8i32_v8i8_store(<8 x i32> %a0, <8 x i8> *%p1) {
3893 ; SSE2-LABEL: trunc_usat_v8i32_v8i8_store:
3895 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
3896 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
3897 ; SSE2-NEXT: movdqa %xmm1, %xmm4
3898 ; SSE2-NEXT: pxor %xmm3, %xmm4
3899 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
3900 ; SSE2-NEXT: movdqa %xmm5, %xmm6
3901 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm6
3902 ; SSE2-NEXT: pand %xmm6, %xmm1
3903 ; SSE2-NEXT: pandn %xmm2, %xmm6
3904 ; SSE2-NEXT: por %xmm1, %xmm6
3905 ; SSE2-NEXT: pxor %xmm0, %xmm3
3906 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
3907 ; SSE2-NEXT: pand %xmm5, %xmm0
3908 ; SSE2-NEXT: pandn %xmm2, %xmm5
3909 ; SSE2-NEXT: por %xmm0, %xmm5
3910 ; SSE2-NEXT: packuswb %xmm6, %xmm5
3911 ; SSE2-NEXT: packuswb %xmm5, %xmm5
3912 ; SSE2-NEXT: movq %xmm5, (%rdi)
3915 ; SSSE3-LABEL: trunc_usat_v8i32_v8i8_store:
3917 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
3918 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
3919 ; SSSE3-NEXT: movdqa %xmm1, %xmm4
3920 ; SSSE3-NEXT: pxor %xmm3, %xmm4
3921 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
3922 ; SSSE3-NEXT: movdqa %xmm5, %xmm6
3923 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
3924 ; SSSE3-NEXT: pand %xmm6, %xmm1
3925 ; SSSE3-NEXT: pandn %xmm2, %xmm6
3926 ; SSSE3-NEXT: por %xmm1, %xmm6
3927 ; SSSE3-NEXT: pxor %xmm0, %xmm3
3928 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
3929 ; SSSE3-NEXT: pand %xmm5, %xmm0
3930 ; SSSE3-NEXT: pandn %xmm2, %xmm5
3931 ; SSSE3-NEXT: por %xmm0, %xmm5
3932 ; SSSE3-NEXT: packuswb %xmm6, %xmm5
3933 ; SSSE3-NEXT: packuswb %xmm5, %xmm5
3934 ; SSSE3-NEXT: movq %xmm5, (%rdi)
3937 ; SSE41-LABEL: trunc_usat_v8i32_v8i8_store:
3939 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
3940 ; SSE41-NEXT: pminud %xmm2, %xmm1
3941 ; SSE41-NEXT: pminud %xmm2, %xmm0
3942 ; SSE41-NEXT: packusdw %xmm1, %xmm0
3943 ; SSE41-NEXT: packuswb %xmm0, %xmm0
3944 ; SSE41-NEXT: movq %xmm0, (%rdi)
3947 ; AVX1-LABEL: trunc_usat_v8i32_v8i8_store:
3949 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
3950 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [255,255,255,255]
3951 ; AVX1-NEXT: vpminud %xmm2, %xmm1, %xmm1
3952 ; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0
3953 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
3954 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3955 ; AVX1-NEXT: vmovq %xmm0, (%rdi)
3956 ; AVX1-NEXT: vzeroupper
3959 ; AVX2-LABEL: trunc_usat_v8i32_v8i8_store:
3961 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
3962 ; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0
3963 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
3964 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
3965 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3966 ; AVX2-NEXT: vmovq %xmm0, (%rdi)
3967 ; AVX2-NEXT: vzeroupper
3970 ; AVX512F-LABEL: trunc_usat_v8i32_v8i8_store:
3972 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
3973 ; AVX512F-NEXT: vpmovusdb %zmm0, %xmm0
3974 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
3975 ; AVX512F-NEXT: vzeroupper
3976 ; AVX512F-NEXT: retq
3978 ; AVX512VL-LABEL: trunc_usat_v8i32_v8i8_store:
3979 ; AVX512VL: # %bb.0:
3980 ; AVX512VL-NEXT: vpmovusdb %ymm0, (%rdi)
3981 ; AVX512VL-NEXT: vzeroupper
3982 ; AVX512VL-NEXT: retq
3984 ; AVX512BW-LABEL: trunc_usat_v8i32_v8i8_store:
3985 ; AVX512BW: # %bb.0:
3986 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
3987 ; AVX512BW-NEXT: vpmovusdb %zmm0, %xmm0
3988 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
3989 ; AVX512BW-NEXT: vzeroupper
3990 ; AVX512BW-NEXT: retq
3992 ; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i8_store:
3993 ; AVX512BWVL: # %bb.0:
3994 ; AVX512BWVL-NEXT: vpmovusdb %ymm0, (%rdi)
3995 ; AVX512BWVL-NEXT: vzeroupper
3996 ; AVX512BWVL-NEXT: retq
3998 ; SKX-LABEL: trunc_usat_v8i32_v8i8_store:
4000 ; SKX-NEXT: vpmovusdb %ymm0, (%rdi)
4001 ; SKX-NEXT: vzeroupper
4003 %1 = icmp ult <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
4004 %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>
4005 %3 = trunc <8 x i32> %2 to <8 x i8>
4006 store <8 x i8> %3, <8 x i8> *%p1
4010 define <16 x i8> @trunc_usat_v16i32_v16i8(<16 x i32>* %p0) {
4011 ; SSE2-LABEL: trunc_usat_v16i32_v16i8:
4013 ; SSE2-NEXT: movdqa (%rdi), %xmm6
4014 ; SSE2-NEXT: movdqa 16(%rdi), %xmm0
4015 ; SSE2-NEXT: movdqa 32(%rdi), %xmm1
4016 ; SSE2-NEXT: movdqa 48(%rdi), %xmm5
4017 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255,255,255]
4018 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
4019 ; SSE2-NEXT: movdqa %xmm0, %xmm7
4020 ; SSE2-NEXT: pxor %xmm4, %xmm7
4021 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483903,2147483903,2147483903,2147483903]
4022 ; SSE2-NEXT: movdqa %xmm3, %xmm2
4023 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm2
4024 ; SSE2-NEXT: pand %xmm2, %xmm0
4025 ; SSE2-NEXT: pandn %xmm8, %xmm2
4026 ; SSE2-NEXT: por %xmm0, %xmm2
4027 ; SSE2-NEXT: movdqa %xmm6, %xmm7
4028 ; SSE2-NEXT: pxor %xmm4, %xmm7
4029 ; SSE2-NEXT: movdqa %xmm3, %xmm0
4030 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm0
4031 ; SSE2-NEXT: pand %xmm0, %xmm6
4032 ; SSE2-NEXT: pandn %xmm8, %xmm0
4033 ; SSE2-NEXT: por %xmm6, %xmm0
4034 ; SSE2-NEXT: packuswb %xmm2, %xmm0
4035 ; SSE2-NEXT: movdqa %xmm5, %xmm2
4036 ; SSE2-NEXT: pxor %xmm4, %xmm2
4037 ; SSE2-NEXT: movdqa %xmm3, %xmm6
4038 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm6
4039 ; SSE2-NEXT: pand %xmm6, %xmm5
4040 ; SSE2-NEXT: pandn %xmm8, %xmm6
4041 ; SSE2-NEXT: por %xmm5, %xmm6
4042 ; SSE2-NEXT: pxor %xmm1, %xmm4
4043 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm3
4044 ; SSE2-NEXT: pand %xmm3, %xmm1
4045 ; SSE2-NEXT: pandn %xmm8, %xmm3
4046 ; SSE2-NEXT: por %xmm1, %xmm3
4047 ; SSE2-NEXT: packuswb %xmm6, %xmm3
4048 ; SSE2-NEXT: packuswb %xmm3, %xmm0
4051 ; SSSE3-LABEL: trunc_usat_v16i32_v16i8:
4053 ; SSSE3-NEXT: movdqa (%rdi), %xmm6
4054 ; SSSE3-NEXT: movdqa 16(%rdi), %xmm0
4055 ; SSSE3-NEXT: movdqa 32(%rdi), %xmm1
4056 ; SSSE3-NEXT: movdqa 48(%rdi), %xmm5
4057 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255,255,255]
4058 ; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
4059 ; SSSE3-NEXT: movdqa %xmm0, %xmm7
4060 ; SSSE3-NEXT: pxor %xmm4, %xmm7
4061 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483903,2147483903,2147483903,2147483903]
4062 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
4063 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm2
4064 ; SSSE3-NEXT: pand %xmm2, %xmm0
4065 ; SSSE3-NEXT: pandn %xmm8, %xmm2
4066 ; SSSE3-NEXT: por %xmm0, %xmm2
4067 ; SSSE3-NEXT: movdqa %xmm6, %xmm7
4068 ; SSSE3-NEXT: pxor %xmm4, %xmm7
4069 ; SSSE3-NEXT: movdqa %xmm3, %xmm0
4070 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm0
4071 ; SSSE3-NEXT: pand %xmm0, %xmm6
4072 ; SSSE3-NEXT: pandn %xmm8, %xmm0
4073 ; SSSE3-NEXT: por %xmm6, %xmm0
4074 ; SSSE3-NEXT: packuswb %xmm2, %xmm0
4075 ; SSSE3-NEXT: movdqa %xmm5, %xmm2
4076 ; SSSE3-NEXT: pxor %xmm4, %xmm2
4077 ; SSSE3-NEXT: movdqa %xmm3, %xmm6
4078 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm6
4079 ; SSSE3-NEXT: pand %xmm6, %xmm5
4080 ; SSSE3-NEXT: pandn %xmm8, %xmm6
4081 ; SSSE3-NEXT: por %xmm5, %xmm6
4082 ; SSSE3-NEXT: pxor %xmm1, %xmm4
4083 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm3
4084 ; SSSE3-NEXT: pand %xmm3, %xmm1
4085 ; SSSE3-NEXT: pandn %xmm8, %xmm3
4086 ; SSSE3-NEXT: por %xmm1, %xmm3
4087 ; SSSE3-NEXT: packuswb %xmm6, %xmm3
4088 ; SSSE3-NEXT: packuswb %xmm3, %xmm0
4091 ; SSE41-LABEL: trunc_usat_v16i32_v16i8:
4093 ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [255,255,255,255]
4094 ; SSE41-NEXT: movdqa 16(%rdi), %xmm2
4095 ; SSE41-NEXT: pminud %xmm1, %xmm2
4096 ; SSE41-NEXT: movdqa (%rdi), %xmm0
4097 ; SSE41-NEXT: pminud %xmm1, %xmm0
4098 ; SSE41-NEXT: packusdw %xmm2, %xmm0
4099 ; SSE41-NEXT: movdqa 48(%rdi), %xmm2
4100 ; SSE41-NEXT: pminud %xmm1, %xmm2
4101 ; SSE41-NEXT: pminud 32(%rdi), %xmm1
4102 ; SSE41-NEXT: packusdw %xmm2, %xmm1
4103 ; SSE41-NEXT: packuswb %xmm1, %xmm0
4106 ; AVX1-LABEL: trunc_usat_v16i32_v16i8:
4108 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm0 = [255,255,255,255]
4109 ; AVX1-NEXT: vpminud 16(%rdi), %xmm0, %xmm1
4110 ; AVX1-NEXT: vpminud (%rdi), %xmm0, %xmm2
4111 ; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm1
4112 ; AVX1-NEXT: vpminud 48(%rdi), %xmm0, %xmm2
4113 ; AVX1-NEXT: vpminud 32(%rdi), %xmm0, %xmm0
4114 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
4115 ; AVX1-NEXT: vpackuswb %xmm0, %xmm1, %xmm0
4118 ; AVX2-LABEL: trunc_usat_v16i32_v16i8:
4120 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255]
4121 ; AVX2-NEXT: vpminud 32(%rdi), %ymm0, %ymm1
4122 ; AVX2-NEXT: vpminud (%rdi), %ymm0, %ymm0
4123 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
4124 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
4125 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
4126 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
4127 ; AVX2-NEXT: vzeroupper
4130 ; AVX512-LABEL: trunc_usat_v16i32_v16i8:
4132 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
4133 ; AVX512-NEXT: vpmovusdb %zmm0, %xmm0
4134 ; AVX512-NEXT: vzeroupper
4137 ; SKX-LABEL: trunc_usat_v16i32_v16i8:
4139 ; SKX-NEXT: vmovdqa64 (%rdi), %zmm0
4140 ; SKX-NEXT: vpmovusdb %zmm0, %xmm0
4141 ; SKX-NEXT: vzeroupper
4143 %a0 = load <16 x i32>, <16 x i32>* %p0
4144 %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>
4145 %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>
4146 %3 = trunc <16 x i32> %2 to <16 x i8>
4150 define void @trunc_usat_v16i32_v16i8_store(<16 x i32>* %p0, <16 x i8>* %p1) {
4151 ; SSE2-LABEL: trunc_usat_v16i32_v16i8_store:
4153 ; SSE2-NEXT: movdqa (%rdi), %xmm6
4154 ; SSE2-NEXT: movdqa 16(%rdi), %xmm5
4155 ; SSE2-NEXT: movdqa 32(%rdi), %xmm0
4156 ; SSE2-NEXT: movdqa 48(%rdi), %xmm4
4157 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255,255,255]
4158 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
4159 ; SSE2-NEXT: movdqa %xmm5, %xmm7
4160 ; SSE2-NEXT: pxor %xmm3, %xmm7
4161 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483903,2147483903,2147483903,2147483903]
4162 ; SSE2-NEXT: movdqa %xmm2, %xmm1
4163 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm1
4164 ; SSE2-NEXT: pand %xmm1, %xmm5
4165 ; SSE2-NEXT: pandn %xmm8, %xmm1
4166 ; SSE2-NEXT: por %xmm5, %xmm1
4167 ; SSE2-NEXT: movdqa %xmm6, %xmm7
4168 ; SSE2-NEXT: pxor %xmm3, %xmm7
4169 ; SSE2-NEXT: movdqa %xmm2, %xmm5
4170 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm5
4171 ; SSE2-NEXT: pand %xmm5, %xmm6
4172 ; SSE2-NEXT: pandn %xmm8, %xmm5
4173 ; SSE2-NEXT: por %xmm6, %xmm5
4174 ; SSE2-NEXT: packuswb %xmm1, %xmm5
4175 ; SSE2-NEXT: movdqa %xmm4, %xmm1
4176 ; SSE2-NEXT: pxor %xmm3, %xmm1
4177 ; SSE2-NEXT: movdqa %xmm2, %xmm6
4178 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm6
4179 ; SSE2-NEXT: pand %xmm6, %xmm4
4180 ; SSE2-NEXT: pandn %xmm8, %xmm6
4181 ; SSE2-NEXT: por %xmm4, %xmm6
4182 ; SSE2-NEXT: pxor %xmm0, %xmm3
4183 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm2
4184 ; SSE2-NEXT: pand %xmm2, %xmm0
4185 ; SSE2-NEXT: pandn %xmm8, %xmm2
4186 ; SSE2-NEXT: por %xmm0, %xmm2
4187 ; SSE2-NEXT: packuswb %xmm6, %xmm2
4188 ; SSE2-NEXT: packuswb %xmm2, %xmm5
4189 ; SSE2-NEXT: movdqa %xmm5, (%rsi)
4192 ; SSSE3-LABEL: trunc_usat_v16i32_v16i8_store:
4194 ; SSSE3-NEXT: movdqa (%rdi), %xmm6
4195 ; SSSE3-NEXT: movdqa 16(%rdi), %xmm5
4196 ; SSSE3-NEXT: movdqa 32(%rdi), %xmm0
4197 ; SSSE3-NEXT: movdqa 48(%rdi), %xmm4
4198 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255,255,255]
4199 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
4200 ; SSSE3-NEXT: movdqa %xmm5, %xmm7
4201 ; SSSE3-NEXT: pxor %xmm3, %xmm7
4202 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483903,2147483903,2147483903,2147483903]
4203 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
4204 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm1
4205 ; SSSE3-NEXT: pand %xmm1, %xmm5
4206 ; SSSE3-NEXT: pandn %xmm8, %xmm1
4207 ; SSSE3-NEXT: por %xmm5, %xmm1
4208 ; SSSE3-NEXT: movdqa %xmm6, %xmm7
4209 ; SSSE3-NEXT: pxor %xmm3, %xmm7
4210 ; SSSE3-NEXT: movdqa %xmm2, %xmm5
4211 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm5
4212 ; SSSE3-NEXT: pand %xmm5, %xmm6
4213 ; SSSE3-NEXT: pandn %xmm8, %xmm5
4214 ; SSSE3-NEXT: por %xmm6, %xmm5
4215 ; SSSE3-NEXT: packuswb %xmm1, %xmm5
4216 ; SSSE3-NEXT: movdqa %xmm4, %xmm1
4217 ; SSSE3-NEXT: pxor %xmm3, %xmm1
4218 ; SSSE3-NEXT: movdqa %xmm2, %xmm6
4219 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm6
4220 ; SSSE3-NEXT: pand %xmm6, %xmm4
4221 ; SSSE3-NEXT: pandn %xmm8, %xmm6
4222 ; SSSE3-NEXT: por %xmm4, %xmm6
4223 ; SSSE3-NEXT: pxor %xmm0, %xmm3
4224 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2
4225 ; SSSE3-NEXT: pand %xmm2, %xmm0
4226 ; SSSE3-NEXT: pandn %xmm8, %xmm2
4227 ; SSSE3-NEXT: por %xmm0, %xmm2
4228 ; SSSE3-NEXT: packuswb %xmm6, %xmm2
4229 ; SSSE3-NEXT: packuswb %xmm2, %xmm5
4230 ; SSSE3-NEXT: movdqa %xmm5, (%rsi)
4233 ; SSE41-LABEL: trunc_usat_v16i32_v16i8_store:
4235 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255]
4236 ; SSE41-NEXT: movdqa 16(%rdi), %xmm1
4237 ; SSE41-NEXT: pminud %xmm0, %xmm1
4238 ; SSE41-NEXT: movdqa (%rdi), %xmm2
4239 ; SSE41-NEXT: pminud %xmm0, %xmm2
4240 ; SSE41-NEXT: packusdw %xmm1, %xmm2
4241 ; SSE41-NEXT: movdqa 48(%rdi), %xmm1
4242 ; SSE41-NEXT: pminud %xmm0, %xmm1
4243 ; SSE41-NEXT: pminud 32(%rdi), %xmm0
4244 ; SSE41-NEXT: packusdw %xmm1, %xmm0
4245 ; SSE41-NEXT: packuswb %xmm0, %xmm2
4246 ; SSE41-NEXT: movdqa %xmm2, (%rsi)
4249 ; AVX1-LABEL: trunc_usat_v16i32_v16i8_store:
4251 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm0 = [255,255,255,255]
4252 ; AVX1-NEXT: vpminud 16(%rdi), %xmm0, %xmm1
4253 ; AVX1-NEXT: vpminud (%rdi), %xmm0, %xmm2
4254 ; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm1
4255 ; AVX1-NEXT: vpminud 48(%rdi), %xmm0, %xmm2
4256 ; AVX1-NEXT: vpminud 32(%rdi), %xmm0, %xmm0
4257 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
4258 ; AVX1-NEXT: vpackuswb %xmm0, %xmm1, %xmm0
4259 ; AVX1-NEXT: vmovdqa %xmm0, (%rsi)
4262 ; AVX2-LABEL: trunc_usat_v16i32_v16i8_store:
4264 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255]
4265 ; AVX2-NEXT: vpminud 32(%rdi), %ymm0, %ymm1
4266 ; AVX2-NEXT: vpminud (%rdi), %ymm0, %ymm0
4267 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
4268 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
4269 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
4270 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
4271 ; AVX2-NEXT: vmovdqa %xmm0, (%rsi)
4272 ; AVX2-NEXT: vzeroupper
4275 ; AVX512-LABEL: trunc_usat_v16i32_v16i8_store:
4277 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
4278 ; AVX512-NEXT: vpmovusdb %zmm0, (%rsi)
4279 ; AVX512-NEXT: vzeroupper
4282 ; SKX-LABEL: trunc_usat_v16i32_v16i8_store:
4284 ; SKX-NEXT: vmovdqa64 (%rdi), %zmm0
4285 ; SKX-NEXT: vpmovusdb %zmm0, (%rsi)
4286 ; SKX-NEXT: vzeroupper
4288 %a0 = load <16 x i32>, <16 x i32>* %p0
4289 %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>
4290 %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>
4291 %3 = trunc <16 x i32> %2 to <16 x i8>
4292 store <16 x i8> %3, <16 x i8>* %p1
4296 define <8 x i8> @trunc_usat_v8i16_v8i8(<8 x i16> %a0) {
4297 ; SSE2-LABEL: trunc_usat_v8i16_v8i8:
4299 ; SSE2-NEXT: movdqa %xmm0, %xmm1
4300 ; SSE2-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
4301 ; SSE2-NEXT: psubw %xmm1, %xmm0
4302 ; SSE2-NEXT: packuswb %xmm0, %xmm0
4305 ; SSSE3-LABEL: trunc_usat_v8i16_v8i8:
4307 ; SSSE3-NEXT: movdqa %xmm0, %xmm1
4308 ; SSSE3-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
4309 ; SSSE3-NEXT: psubw %xmm1, %xmm0
4310 ; SSSE3-NEXT: packuswb %xmm0, %xmm0
4313 ; SSE41-LABEL: trunc_usat_v8i16_v8i8:
4315 ; SSE41-NEXT: pminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
4316 ; SSE41-NEXT: packuswb %xmm0, %xmm0
4319 ; AVX-LABEL: trunc_usat_v8i16_v8i8:
4321 ; AVX-NEXT: vpminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
4322 ; AVX-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4325 ; AVX512F-LABEL: trunc_usat_v8i16_v8i8:
4327 ; AVX512F-NEXT: vpminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
4328 ; AVX512F-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4329 ; AVX512F-NEXT: retq
4331 ; AVX512VL-LABEL: trunc_usat_v8i16_v8i8:
4332 ; AVX512VL: # %bb.0:
4333 ; AVX512VL-NEXT: vpminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
4334 ; AVX512VL-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4335 ; AVX512VL-NEXT: retq
4337 ; AVX512BW-LABEL: trunc_usat_v8i16_v8i8:
4338 ; AVX512BW: # %bb.0:
4339 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
4340 ; AVX512BW-NEXT: vpmovuswb %zmm0, %ymm0
4341 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
4342 ; AVX512BW-NEXT: vzeroupper
4343 ; AVX512BW-NEXT: retq
4345 ; AVX512BWVL-LABEL: trunc_usat_v8i16_v8i8:
4346 ; AVX512BWVL: # %bb.0:
4347 ; AVX512BWVL-NEXT: vpmovuswb %xmm0, %xmm0
4348 ; AVX512BWVL-NEXT: retq
4350 ; SKX-LABEL: trunc_usat_v8i16_v8i8:
4352 ; SKX-NEXT: vpmovuswb %xmm0, %xmm0
4354 %1 = icmp ult <8 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
4355 %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>
4356 %3 = trunc <8 x i16> %2 to <8 x i8>
4360 define void @trunc_usat_v8i16_v8i8_store(<8 x i16> %a0, <8 x i8> *%p1) {
4361 ; SSE2-LABEL: trunc_usat_v8i16_v8i8_store:
4363 ; SSE2-NEXT: movdqa %xmm0, %xmm1
4364 ; SSE2-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
4365 ; SSE2-NEXT: psubw %xmm1, %xmm0
4366 ; SSE2-NEXT: packuswb %xmm0, %xmm0
4367 ; SSE2-NEXT: movq %xmm0, (%rdi)
4370 ; SSSE3-LABEL: trunc_usat_v8i16_v8i8_store:
4372 ; SSSE3-NEXT: movdqa %xmm0, %xmm1
4373 ; SSSE3-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
4374 ; SSSE3-NEXT: psubw %xmm1, %xmm0
4375 ; SSSE3-NEXT: packuswb %xmm0, %xmm0
4376 ; SSSE3-NEXT: movq %xmm0, (%rdi)
4379 ; SSE41-LABEL: trunc_usat_v8i16_v8i8_store:
4381 ; SSE41-NEXT: pminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
4382 ; SSE41-NEXT: packuswb %xmm0, %xmm0
4383 ; SSE41-NEXT: movq %xmm0, (%rdi)
4386 ; AVX-LABEL: trunc_usat_v8i16_v8i8_store:
4388 ; AVX-NEXT: vpminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
4389 ; AVX-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4390 ; AVX-NEXT: vmovq %xmm0, (%rdi)
4393 ; AVX512F-LABEL: trunc_usat_v8i16_v8i8_store:
4395 ; AVX512F-NEXT: vpminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
4396 ; AVX512F-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4397 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
4398 ; AVX512F-NEXT: retq
4400 ; AVX512VL-LABEL: trunc_usat_v8i16_v8i8_store:
4401 ; AVX512VL: # %bb.0:
4402 ; AVX512VL-NEXT: vpminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
4403 ; AVX512VL-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4404 ; AVX512VL-NEXT: vmovq %xmm0, (%rdi)
4405 ; AVX512VL-NEXT: retq
4407 ; AVX512BW-LABEL: trunc_usat_v8i16_v8i8_store:
4408 ; AVX512BW: # %bb.0:
4409 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
4410 ; AVX512BW-NEXT: vpmovuswb %zmm0, %ymm0
4411 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
4412 ; AVX512BW-NEXT: vzeroupper
4413 ; AVX512BW-NEXT: retq
4415 ; AVX512BWVL-LABEL: trunc_usat_v8i16_v8i8_store:
4416 ; AVX512BWVL: # %bb.0:
4417 ; AVX512BWVL-NEXT: vpmovuswb %xmm0, (%rdi)
4418 ; AVX512BWVL-NEXT: retq
4420 ; SKX-LABEL: trunc_usat_v8i16_v8i8_store:
4422 ; SKX-NEXT: vpmovuswb %xmm0, (%rdi)
4424 %1 = icmp ult <8 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
4425 %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>
4426 %3 = trunc <8 x i16> %2 to <8 x i8>
4427 store <8 x i8> %3, <8 x i8> *%p1
4431 define <16 x i8> @trunc_usat_v16i16_v16i8(<16 x i16> %a0) {
4432 ; SSE2-LABEL: trunc_usat_v16i16_v16i8:
4434 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
4435 ; SSE2-NEXT: movdqa %xmm1, %xmm3
4436 ; SSE2-NEXT: psubusw %xmm2, %xmm3
4437 ; SSE2-NEXT: psubw %xmm3, %xmm1
4438 ; SSE2-NEXT: movdqa %xmm0, %xmm3
4439 ; SSE2-NEXT: psubusw %xmm2, %xmm3
4440 ; SSE2-NEXT: psubw %xmm3, %xmm0
4441 ; SSE2-NEXT: packuswb %xmm1, %xmm0
4444 ; SSSE3-LABEL: trunc_usat_v16i16_v16i8:
4446 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
4447 ; SSSE3-NEXT: movdqa %xmm1, %xmm3
4448 ; SSSE3-NEXT: psubusw %xmm2, %xmm3
4449 ; SSSE3-NEXT: psubw %xmm3, %xmm1
4450 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
4451 ; SSSE3-NEXT: psubusw %xmm2, %xmm3
4452 ; SSSE3-NEXT: psubw %xmm3, %xmm0
4453 ; SSSE3-NEXT: packuswb %xmm1, %xmm0
4456 ; SSE41-LABEL: trunc_usat_v16i16_v16i8:
4458 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
4459 ; SSE41-NEXT: pminuw %xmm2, %xmm1
4460 ; SSE41-NEXT: pminuw %xmm2, %xmm0
4461 ; SSE41-NEXT: packuswb %xmm1, %xmm0
4464 ; AVX1-LABEL: trunc_usat_v16i16_v16i8:
4466 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
4467 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
4468 ; AVX1-NEXT: vpminuw %xmm2, %xmm1, %xmm1
4469 ; AVX1-NEXT: vpminuw %xmm2, %xmm0, %xmm0
4470 ; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
4471 ; AVX1-NEXT: vzeroupper
4474 ; AVX2-LABEL: trunc_usat_v16i16_v16i8:
4476 ; AVX2-NEXT: vpminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
4477 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
4478 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
4479 ; AVX2-NEXT: vzeroupper
4482 ; AVX512F-LABEL: trunc_usat_v16i16_v16i8:
4484 ; AVX512F-NEXT: vpminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
4485 ; 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
4486 ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0
4487 ; AVX512F-NEXT: vzeroupper
4488 ; AVX512F-NEXT: retq
4490 ; AVX512VL-LABEL: trunc_usat_v16i16_v16i8:
4491 ; AVX512VL: # %bb.0:
4492 ; AVX512VL-NEXT: vpminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
4493 ; 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
4494 ; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0
4495 ; AVX512VL-NEXT: vzeroupper
4496 ; AVX512VL-NEXT: retq
4498 ; AVX512BW-LABEL: trunc_usat_v16i16_v16i8:
4499 ; AVX512BW: # %bb.0:
4500 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
4501 ; AVX512BW-NEXT: vpmovuswb %zmm0, %ymm0
4502 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
4503 ; AVX512BW-NEXT: vzeroupper
4504 ; AVX512BW-NEXT: retq
4506 ; AVX512BWVL-LABEL: trunc_usat_v16i16_v16i8:
4507 ; AVX512BWVL: # %bb.0:
4508 ; AVX512BWVL-NEXT: vpmovuswb %ymm0, %xmm0
4509 ; AVX512BWVL-NEXT: vzeroupper
4510 ; AVX512BWVL-NEXT: retq
4512 ; SKX-LABEL: trunc_usat_v16i16_v16i8:
4514 ; SKX-NEXT: vpmovuswb %ymm0, %xmm0
4515 ; SKX-NEXT: vzeroupper
4517 %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>
4518 %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>
4519 %3 = trunc <16 x i16> %2 to <16 x i8>
4523 define <32 x i8> @trunc_usat_v32i16_v32i8(<32 x i16>* %p0) {
4524 ; SSE2-LABEL: trunc_usat_v32i16_v32i8:
4526 ; SSE2-NEXT: movdqa (%rdi), %xmm0
4527 ; SSE2-NEXT: movdqa 16(%rdi), %xmm2
4528 ; SSE2-NEXT: movdqa 32(%rdi), %xmm1
4529 ; SSE2-NEXT: movdqa 48(%rdi), %xmm3
4530 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
4531 ; SSE2-NEXT: movdqa %xmm3, %xmm5
4532 ; SSE2-NEXT: psubusw %xmm4, %xmm5
4533 ; SSE2-NEXT: psubw %xmm5, %xmm3
4534 ; SSE2-NEXT: movdqa %xmm1, %xmm5
4535 ; SSE2-NEXT: psubusw %xmm4, %xmm5
4536 ; SSE2-NEXT: psubw %xmm5, %xmm1
4537 ; SSE2-NEXT: packuswb %xmm3, %xmm1
4538 ; SSE2-NEXT: movdqa %xmm2, %xmm3
4539 ; SSE2-NEXT: psubusw %xmm4, %xmm3
4540 ; SSE2-NEXT: psubw %xmm3, %xmm2
4541 ; SSE2-NEXT: movdqa %xmm0, %xmm3
4542 ; SSE2-NEXT: psubusw %xmm4, %xmm3
4543 ; SSE2-NEXT: psubw %xmm3, %xmm0
4544 ; SSE2-NEXT: packuswb %xmm2, %xmm0
4547 ; SSSE3-LABEL: trunc_usat_v32i16_v32i8:
4549 ; SSSE3-NEXT: movdqa (%rdi), %xmm0
4550 ; SSSE3-NEXT: movdqa 16(%rdi), %xmm2
4551 ; SSSE3-NEXT: movdqa 32(%rdi), %xmm1
4552 ; SSSE3-NEXT: movdqa 48(%rdi), %xmm3
4553 ; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
4554 ; SSSE3-NEXT: movdqa %xmm3, %xmm5
4555 ; SSSE3-NEXT: psubusw %xmm4, %xmm5
4556 ; SSSE3-NEXT: psubw %xmm5, %xmm3
4557 ; SSSE3-NEXT: movdqa %xmm1, %xmm5
4558 ; SSSE3-NEXT: psubusw %xmm4, %xmm5
4559 ; SSSE3-NEXT: psubw %xmm5, %xmm1
4560 ; SSSE3-NEXT: packuswb %xmm3, %xmm1
4561 ; SSSE3-NEXT: movdqa %xmm2, %xmm3
4562 ; SSSE3-NEXT: psubusw %xmm4, %xmm3
4563 ; SSSE3-NEXT: psubw %xmm3, %xmm2
4564 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
4565 ; SSSE3-NEXT: psubusw %xmm4, %xmm3
4566 ; SSSE3-NEXT: psubw %xmm3, %xmm0
4567 ; SSSE3-NEXT: packuswb %xmm2, %xmm0
4570 ; SSE41-LABEL: trunc_usat_v32i16_v32i8:
4572 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255]
4573 ; SSE41-NEXT: movdqa 48(%rdi), %xmm2
4574 ; SSE41-NEXT: pminuw %xmm0, %xmm2
4575 ; SSE41-NEXT: movdqa 32(%rdi), %xmm1
4576 ; SSE41-NEXT: pminuw %xmm0, %xmm1
4577 ; SSE41-NEXT: packuswb %xmm2, %xmm1
4578 ; SSE41-NEXT: movdqa 16(%rdi), %xmm2
4579 ; SSE41-NEXT: pminuw %xmm0, %xmm2
4580 ; SSE41-NEXT: pminuw (%rdi), %xmm0
4581 ; SSE41-NEXT: packuswb %xmm2, %xmm0
4584 ; AVX1-LABEL: trunc_usat_v32i16_v32i8:
4586 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255]
4587 ; AVX1-NEXT: vpminuw 16(%rdi), %xmm0, %xmm1
4588 ; AVX1-NEXT: vpminuw (%rdi), %xmm0, %xmm2
4589 ; AVX1-NEXT: vpackuswb %xmm1, %xmm2, %xmm1
4590 ; AVX1-NEXT: vpminuw 48(%rdi), %xmm0, %xmm2
4591 ; AVX1-NEXT: vpminuw 32(%rdi), %xmm0, %xmm0
4592 ; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
4593 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
4596 ; AVX2-LABEL: trunc_usat_v32i16_v32i8:
4598 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
4599 ; AVX2-NEXT: vpminuw 32(%rdi), %ymm0, %ymm1
4600 ; AVX2-NEXT: vpminuw (%rdi), %ymm0, %ymm0
4601 ; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0
4602 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4605 ; AVX512F-LABEL: trunc_usat_v32i16_v32i8:
4607 ; AVX512F-NEXT: vmovdqa {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
4608 ; AVX512F-NEXT: vpminuw 32(%rdi), %ymm0, %ymm1
4609 ; AVX512F-NEXT: vpminuw (%rdi), %ymm0, %ymm0
4610 ; 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
4611 ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0
4612 ; 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
4613 ; AVX512F-NEXT: vpmovdb %zmm1, %xmm1
4614 ; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
4615 ; AVX512F-NEXT: retq
4617 ; AVX512VL-LABEL: trunc_usat_v32i16_v32i8:
4618 ; AVX512VL: # %bb.0:
4619 ; AVX512VL-NEXT: vmovdqa {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
4620 ; AVX512VL-NEXT: vpminuw 32(%rdi), %ymm0, %ymm1
4621 ; AVX512VL-NEXT: vpminuw (%rdi), %ymm0, %ymm0
4622 ; 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
4623 ; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0
4624 ; 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
4625 ; AVX512VL-NEXT: vpmovdb %zmm1, %xmm1
4626 ; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
4627 ; AVX512VL-NEXT: retq
4629 ; AVX512BW-LABEL: trunc_usat_v32i16_v32i8:
4630 ; AVX512BW: # %bb.0:
4631 ; AVX512BW-NEXT: vmovdqa64 (%rdi), %zmm0
4632 ; AVX512BW-NEXT: vpmovuswb %zmm0, %ymm0
4633 ; AVX512BW-NEXT: retq
4635 ; AVX512BWVL-LABEL: trunc_usat_v32i16_v32i8:
4636 ; AVX512BWVL: # %bb.0:
4637 ; AVX512BWVL-NEXT: vmovdqa64 (%rdi), %zmm0
4638 ; AVX512BWVL-NEXT: vpmovuswb %zmm0, %ymm0
4639 ; AVX512BWVL-NEXT: retq
4641 ; SKX-LABEL: trunc_usat_v32i16_v32i8:
4643 ; SKX-NEXT: vmovdqa64 (%rdi), %zmm0
4644 ; SKX-NEXT: vpmovuswb %zmm0, %ymm0
4646 %a0 = load <32 x i16>, <32 x i16>* %p0
4647 %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>
4648 %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>
4649 %3 = trunc <32 x i16> %2 to <32 x i8>
4653 define <32 x i8> @trunc_usat_v32i32_v32i8(<32 x i32>* %p0) {
4654 ; SSE2-LABEL: trunc_usat_v32i32_v32i8:
4656 ; SSE2-NEXT: movdqa (%rdi), %xmm11
4657 ; SSE2-NEXT: movdqa 16(%rdi), %xmm12
4658 ; SSE2-NEXT: movdqa 32(%rdi), %xmm9
4659 ; SSE2-NEXT: movdqa 48(%rdi), %xmm10
4660 ; SSE2-NEXT: movdqa 96(%rdi), %xmm0
4661 ; SSE2-NEXT: movdqa 112(%rdi), %xmm2
4662 ; SSE2-NEXT: movdqa 64(%rdi), %xmm5
4663 ; SSE2-NEXT: movdqa 80(%rdi), %xmm7
4664 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255,255,255]
4665 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
4666 ; SSE2-NEXT: movdqa %xmm7, %xmm1
4667 ; SSE2-NEXT: pxor %xmm6, %xmm1
4668 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483903,2147483903,2147483903,2147483903]
4669 ; SSE2-NEXT: movdqa %xmm4, %xmm3
4670 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
4671 ; SSE2-NEXT: pand %xmm3, %xmm7
4672 ; SSE2-NEXT: pandn %xmm8, %xmm3
4673 ; SSE2-NEXT: por %xmm7, %xmm3
4674 ; SSE2-NEXT: movdqa %xmm5, %xmm7
4675 ; SSE2-NEXT: pxor %xmm6, %xmm7
4676 ; SSE2-NEXT: movdqa %xmm4, %xmm1
4677 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm1
4678 ; SSE2-NEXT: pand %xmm1, %xmm5
4679 ; SSE2-NEXT: pandn %xmm8, %xmm1
4680 ; SSE2-NEXT: por %xmm5, %xmm1
4681 ; SSE2-NEXT: packuswb %xmm3, %xmm1
4682 ; SSE2-NEXT: movdqa %xmm2, %xmm3
4683 ; SSE2-NEXT: pxor %xmm6, %xmm3
4684 ; SSE2-NEXT: movdqa %xmm4, %xmm5
4685 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
4686 ; SSE2-NEXT: pand %xmm5, %xmm2
4687 ; SSE2-NEXT: pandn %xmm8, %xmm5
4688 ; SSE2-NEXT: por %xmm2, %xmm5
4689 ; SSE2-NEXT: movdqa %xmm0, %xmm2
4690 ; SSE2-NEXT: pxor %xmm6, %xmm2
4691 ; SSE2-NEXT: movdqa %xmm4, %xmm3
4692 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
4693 ; SSE2-NEXT: pand %xmm3, %xmm0
4694 ; SSE2-NEXT: pandn %xmm8, %xmm3
4695 ; SSE2-NEXT: por %xmm0, %xmm3
4696 ; SSE2-NEXT: packuswb %xmm5, %xmm3
4697 ; SSE2-NEXT: packuswb %xmm3, %xmm1
4698 ; SSE2-NEXT: movdqa %xmm12, %xmm0
4699 ; SSE2-NEXT: pxor %xmm6, %xmm0
4700 ; SSE2-NEXT: movdqa %xmm4, %xmm2
4701 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
4702 ; SSE2-NEXT: pand %xmm2, %xmm12
4703 ; SSE2-NEXT: pandn %xmm8, %xmm2
4704 ; SSE2-NEXT: por %xmm12, %xmm2
4705 ; SSE2-NEXT: movdqa %xmm11, %xmm3
4706 ; SSE2-NEXT: pxor %xmm6, %xmm3
4707 ; SSE2-NEXT: movdqa %xmm4, %xmm0
4708 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm0
4709 ; SSE2-NEXT: pand %xmm0, %xmm11
4710 ; SSE2-NEXT: pandn %xmm8, %xmm0
4711 ; SSE2-NEXT: por %xmm11, %xmm0
4712 ; SSE2-NEXT: packuswb %xmm2, %xmm0
4713 ; SSE2-NEXT: movdqa %xmm10, %xmm2
4714 ; SSE2-NEXT: pxor %xmm6, %xmm2
4715 ; SSE2-NEXT: movdqa %xmm4, %xmm3
4716 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
4717 ; SSE2-NEXT: pand %xmm3, %xmm10
4718 ; SSE2-NEXT: pandn %xmm8, %xmm3
4719 ; SSE2-NEXT: por %xmm10, %xmm3
4720 ; SSE2-NEXT: pxor %xmm9, %xmm6
4721 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm4
4722 ; SSE2-NEXT: pand %xmm4, %xmm9
4723 ; SSE2-NEXT: pandn %xmm8, %xmm4
4724 ; SSE2-NEXT: por %xmm9, %xmm4
4725 ; SSE2-NEXT: packuswb %xmm3, %xmm4
4726 ; SSE2-NEXT: packuswb %xmm4, %xmm0
4729 ; SSSE3-LABEL: trunc_usat_v32i32_v32i8:
4731 ; SSSE3-NEXT: movdqa (%rdi), %xmm11
4732 ; SSSE3-NEXT: movdqa 16(%rdi), %xmm12
4733 ; SSSE3-NEXT: movdqa 32(%rdi), %xmm9
4734 ; SSSE3-NEXT: movdqa 48(%rdi), %xmm10
4735 ; SSSE3-NEXT: movdqa 96(%rdi), %xmm0
4736 ; SSSE3-NEXT: movdqa 112(%rdi), %xmm2
4737 ; SSSE3-NEXT: movdqa 64(%rdi), %xmm5
4738 ; SSSE3-NEXT: movdqa 80(%rdi), %xmm7
4739 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255,255,255]
4740 ; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
4741 ; SSSE3-NEXT: movdqa %xmm7, %xmm1
4742 ; SSSE3-NEXT: pxor %xmm6, %xmm1
4743 ; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483903,2147483903,2147483903,2147483903]
4744 ; SSSE3-NEXT: movdqa %xmm4, %xmm3
4745 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3
4746 ; SSSE3-NEXT: pand %xmm3, %xmm7
4747 ; SSSE3-NEXT: pandn %xmm8, %xmm3
4748 ; SSSE3-NEXT: por %xmm7, %xmm3
4749 ; SSSE3-NEXT: movdqa %xmm5, %xmm7
4750 ; SSSE3-NEXT: pxor %xmm6, %xmm7
4751 ; SSSE3-NEXT: movdqa %xmm4, %xmm1
4752 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm1
4753 ; SSSE3-NEXT: pand %xmm1, %xmm5
4754 ; SSSE3-NEXT: pandn %xmm8, %xmm1
4755 ; SSSE3-NEXT: por %xmm5, %xmm1
4756 ; SSSE3-NEXT: packuswb %xmm3, %xmm1
4757 ; SSSE3-NEXT: movdqa %xmm2, %xmm3
4758 ; SSSE3-NEXT: pxor %xmm6, %xmm3
4759 ; SSSE3-NEXT: movdqa %xmm4, %xmm5
4760 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
4761 ; SSSE3-NEXT: pand %xmm5, %xmm2
4762 ; SSSE3-NEXT: pandn %xmm8, %xmm5
4763 ; SSSE3-NEXT: por %xmm2, %xmm5
4764 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
4765 ; SSSE3-NEXT: pxor %xmm6, %xmm2
4766 ; SSSE3-NEXT: movdqa %xmm4, %xmm3
4767 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
4768 ; SSSE3-NEXT: pand %xmm3, %xmm0
4769 ; SSSE3-NEXT: pandn %xmm8, %xmm3
4770 ; SSSE3-NEXT: por %xmm0, %xmm3
4771 ; SSSE3-NEXT: packuswb %xmm5, %xmm3
4772 ; SSSE3-NEXT: packuswb %xmm3, %xmm1
4773 ; SSSE3-NEXT: movdqa %xmm12, %xmm0
4774 ; SSSE3-NEXT: pxor %xmm6, %xmm0
4775 ; SSSE3-NEXT: movdqa %xmm4, %xmm2
4776 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
4777 ; SSSE3-NEXT: pand %xmm2, %xmm12
4778 ; SSSE3-NEXT: pandn %xmm8, %xmm2
4779 ; SSSE3-NEXT: por %xmm12, %xmm2
4780 ; SSSE3-NEXT: movdqa %xmm11, %xmm3
4781 ; SSSE3-NEXT: pxor %xmm6, %xmm3
4782 ; SSSE3-NEXT: movdqa %xmm4, %xmm0
4783 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm0
4784 ; SSSE3-NEXT: pand %xmm0, %xmm11
4785 ; SSSE3-NEXT: pandn %xmm8, %xmm0
4786 ; SSSE3-NEXT: por %xmm11, %xmm0
4787 ; SSSE3-NEXT: packuswb %xmm2, %xmm0
4788 ; SSSE3-NEXT: movdqa %xmm10, %xmm2
4789 ; SSSE3-NEXT: pxor %xmm6, %xmm2
4790 ; SSSE3-NEXT: movdqa %xmm4, %xmm3
4791 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
4792 ; SSSE3-NEXT: pand %xmm3, %xmm10
4793 ; SSSE3-NEXT: pandn %xmm8, %xmm3
4794 ; SSSE3-NEXT: por %xmm10, %xmm3
4795 ; SSSE3-NEXT: pxor %xmm9, %xmm6
4796 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm4
4797 ; SSSE3-NEXT: pand %xmm4, %xmm9
4798 ; SSSE3-NEXT: pandn %xmm8, %xmm4
4799 ; SSSE3-NEXT: por %xmm9, %xmm4
4800 ; SSSE3-NEXT: packuswb %xmm3, %xmm4
4801 ; SSSE3-NEXT: packuswb %xmm4, %xmm0
4804 ; SSE41-LABEL: trunc_usat_v32i32_v32i8:
4806 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
4807 ; SSE41-NEXT: movdqa 80(%rdi), %xmm0
4808 ; SSE41-NEXT: pminud %xmm2, %xmm0
4809 ; SSE41-NEXT: movdqa 64(%rdi), %xmm1
4810 ; SSE41-NEXT: pminud %xmm2, %xmm1
4811 ; SSE41-NEXT: packusdw %xmm0, %xmm1
4812 ; SSE41-NEXT: movdqa 112(%rdi), %xmm0
4813 ; SSE41-NEXT: pminud %xmm2, %xmm0
4814 ; SSE41-NEXT: movdqa 96(%rdi), %xmm3
4815 ; SSE41-NEXT: pminud %xmm2, %xmm3
4816 ; SSE41-NEXT: packusdw %xmm0, %xmm3
4817 ; SSE41-NEXT: packuswb %xmm3, %xmm1
4818 ; SSE41-NEXT: movdqa 16(%rdi), %xmm3
4819 ; SSE41-NEXT: pminud %xmm2, %xmm3
4820 ; SSE41-NEXT: movdqa (%rdi), %xmm0
4821 ; SSE41-NEXT: pminud %xmm2, %xmm0
4822 ; SSE41-NEXT: packusdw %xmm3, %xmm0
4823 ; SSE41-NEXT: movdqa 48(%rdi), %xmm3
4824 ; SSE41-NEXT: pminud %xmm2, %xmm3
4825 ; SSE41-NEXT: pminud 32(%rdi), %xmm2
4826 ; SSE41-NEXT: packusdw %xmm3, %xmm2
4827 ; SSE41-NEXT: packuswb %xmm2, %xmm0
4830 ; AVX1-LABEL: trunc_usat_v32i32_v32i8:
4832 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm0 = [255,255,255,255]
4833 ; AVX1-NEXT: vpminud 16(%rdi), %xmm0, %xmm1
4834 ; AVX1-NEXT: vpminud (%rdi), %xmm0, %xmm2
4835 ; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm1
4836 ; AVX1-NEXT: vpminud 48(%rdi), %xmm0, %xmm2
4837 ; AVX1-NEXT: vpminud 32(%rdi), %xmm0, %xmm3
4838 ; AVX1-NEXT: vpackusdw %xmm2, %xmm3, %xmm2
4839 ; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm1
4840 ; AVX1-NEXT: vpminud 80(%rdi), %xmm0, %xmm2
4841 ; AVX1-NEXT: vpminud 64(%rdi), %xmm0, %xmm3
4842 ; AVX1-NEXT: vpackusdw %xmm2, %xmm3, %xmm2
4843 ; AVX1-NEXT: vpminud 112(%rdi), %xmm0, %xmm3
4844 ; AVX1-NEXT: vpminud 96(%rdi), %xmm0, %xmm0
4845 ; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0
4846 ; AVX1-NEXT: vpackuswb %xmm0, %xmm2, %xmm0
4847 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
4850 ; AVX2-LABEL: trunc_usat_v32i32_v32i8:
4852 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255]
4853 ; AVX2-NEXT: vpminud 32(%rdi), %ymm0, %ymm1
4854 ; AVX2-NEXT: vpminud (%rdi), %ymm0, %ymm2
4855 ; AVX2-NEXT: vpackusdw %ymm1, %ymm2, %ymm1
4856 ; AVX2-NEXT: vpminud 96(%rdi), %ymm0, %ymm2
4857 ; AVX2-NEXT: vpminud 64(%rdi), %ymm0, %ymm0
4858 ; AVX2-NEXT: vpackusdw %ymm2, %ymm0, %ymm0
4859 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4860 ; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
4861 ; AVX2-NEXT: vpackuswb %ymm0, %ymm1, %ymm0
4862 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4865 ; AVX512-LABEL: trunc_usat_v32i32_v32i8:
4867 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
4868 ; AVX512-NEXT: vmovdqa64 64(%rdi), %zmm1
4869 ; AVX512-NEXT: vpmovusdb %zmm0, %xmm0
4870 ; AVX512-NEXT: vpmovusdb %zmm1, %xmm1
4871 ; AVX512-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
4874 ; SKX-LABEL: trunc_usat_v32i32_v32i8:
4876 ; SKX-NEXT: vmovdqa64 (%rdi), %zmm0
4877 ; SKX-NEXT: vmovdqa64 64(%rdi), %zmm1
4878 ; SKX-NEXT: vpmovusdb %zmm0, %xmm0
4879 ; SKX-NEXT: vpmovusdb %zmm1, %xmm1
4880 ; SKX-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
4882 %a0 = load <32 x i32>, <32 x i32>* %p0
4883 %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>
4884 %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>
4885 %3 = trunc <32 x i32> %2 to <32 x i8>