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-prefixes=SSE2-SSSE3,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE2-SSSE3,SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,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-prefixes=AVX512,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-SSSE3-LABEL: trunc_usat_v2i64_v2i32:
24 ; SSE2-SSSE3: # %bb.0:
25 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
26 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm1
27 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
28 ; SSE2-SSSE3-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
29 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]
30 ; SSE2-SSSE3-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
31 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm1
32 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm2
33 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm2
34 ; SSE2-SSSE3-NEXT: pand %xmm0, %xmm1
35 ; SSE2-SSSE3-NEXT: por %xmm2, %xmm1
36 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
37 ; SSE2-SSSE3-NEXT: retq
39 ; SSE41-LABEL: trunc_usat_v2i64_v2i32:
41 ; SSE41-NEXT: movdqa %xmm0, %xmm1
42 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [4294967295,4294967295]
43 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
44 ; SSE41-NEXT: pxor %xmm0, %xmm3
45 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
46 ; SSE41-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
47 ; SSE41-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
48 ; SSE41-NEXT: pandn %xmm3, %xmm0
49 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
50 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
53 ; AVX-LABEL: trunc_usat_v2i64_v2i32:
55 ; AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
56 ; AVX-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
57 ; AVX-NEXT: vblendvpd %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
58 ; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
61 ; AVX512F-LABEL: trunc_usat_v2i64_v2i32:
63 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
64 ; AVX512F-NEXT: vpmovusqd %zmm0, %ymm0
65 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
66 ; AVX512F-NEXT: vzeroupper
69 ; AVX512VL-LABEL: trunc_usat_v2i64_v2i32:
71 ; AVX512VL-NEXT: vpmovusqd %xmm0, %xmm0
74 ; AVX512BW-LABEL: trunc_usat_v2i64_v2i32:
76 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
77 ; AVX512BW-NEXT: vpmovusqd %zmm0, %ymm0
78 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
79 ; AVX512BW-NEXT: vzeroupper
82 ; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i32:
83 ; AVX512BWVL: # %bb.0:
84 ; AVX512BWVL-NEXT: vpmovusqd %xmm0, %xmm0
85 ; AVX512BWVL-NEXT: retq
87 ; SKX-LABEL: trunc_usat_v2i64_v2i32:
89 ; SKX-NEXT: vpmovusqd %xmm0, %xmm0
91 %1 = icmp ult <2 x i64> %a0, <i64 4294967295, i64 4294967295>
92 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 4294967295, i64 4294967295>
93 %3 = trunc <2 x i64> %2 to <2 x i32>
97 define void @trunc_usat_v2i64_v2i32_store(<2 x i64> %a0, ptr %p1) {
98 ; SSE2-SSSE3-LABEL: trunc_usat_v2i64_v2i32_store:
99 ; SSE2-SSSE3: # %bb.0:
100 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
101 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm1
102 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
103 ; SSE2-SSSE3-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
104 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]
105 ; SSE2-SSSE3-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
106 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm1
107 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm2
108 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm2
109 ; SSE2-SSSE3-NEXT: pand %xmm0, %xmm1
110 ; SSE2-SSSE3-NEXT: por %xmm2, %xmm1
111 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
112 ; SSE2-SSSE3-NEXT: movq %xmm0, (%rdi)
113 ; SSE2-SSSE3-NEXT: retq
115 ; SSE41-LABEL: trunc_usat_v2i64_v2i32_store:
117 ; SSE41-NEXT: movdqa %xmm0, %xmm1
118 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [4294967295,4294967295]
119 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
120 ; SSE41-NEXT: pxor %xmm0, %xmm3
121 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
122 ; SSE41-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
123 ; SSE41-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
124 ; SSE41-NEXT: pandn %xmm3, %xmm0
125 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
126 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
127 ; SSE41-NEXT: movq %xmm0, (%rdi)
130 ; AVX-LABEL: trunc_usat_v2i64_v2i32_store:
132 ; AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
133 ; AVX-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
134 ; AVX-NEXT: vblendvpd %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
135 ; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
136 ; AVX-NEXT: vmovlpd %xmm0, (%rdi)
139 ; AVX512F-LABEL: trunc_usat_v2i64_v2i32_store:
141 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
142 ; AVX512F-NEXT: vpmovusqd %zmm0, %ymm0
143 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
144 ; AVX512F-NEXT: vzeroupper
147 ; AVX512VL-LABEL: trunc_usat_v2i64_v2i32_store:
149 ; AVX512VL-NEXT: vpmovusqd %xmm0, (%rdi)
150 ; AVX512VL-NEXT: retq
152 ; AVX512BW-LABEL: trunc_usat_v2i64_v2i32_store:
154 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
155 ; AVX512BW-NEXT: vpmovusqd %zmm0, %ymm0
156 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
157 ; AVX512BW-NEXT: vzeroupper
158 ; AVX512BW-NEXT: retq
160 ; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i32_store:
161 ; AVX512BWVL: # %bb.0:
162 ; AVX512BWVL-NEXT: vpmovusqd %xmm0, (%rdi)
163 ; AVX512BWVL-NEXT: retq
165 ; SKX-LABEL: trunc_usat_v2i64_v2i32_store:
167 ; SKX-NEXT: vpmovusqd %xmm0, (%rdi)
169 %1 = icmp ult <2 x i64> %a0, <i64 4294967295, i64 4294967295>
170 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 4294967295, i64 4294967295>
171 %3 = trunc <2 x i64> %2 to <2 x i32>
172 store <2 x i32> %3, ptr %p1
176 define <4 x i32> @trunc_usat_v4i64_v4i32(<4 x i64> %a0) {
177 ; SSE2-SSSE3-LABEL: trunc_usat_v4i64_v4i32:
178 ; SSE2-SSSE3: # %bb.0:
179 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
180 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm3
181 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm3
182 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
183 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483647,2147483647,2147483647,2147483647]
184 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm6
185 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
186 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
187 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm3
188 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm3
189 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm4
190 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm4
191 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
192 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm6, %xmm5
193 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
194 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm4
195 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm4
196 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm1
197 ; SSE2-SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
198 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm4
199 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm1
200 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm1
201 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm0
202 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm0
203 ; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm4[0,2]
204 ; SSE2-SSSE3-NEXT: retq
206 ; SSE41-LABEL: trunc_usat_v4i64_v4i32:
208 ; SSE41-NEXT: movdqa %xmm0, %xmm2
209 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
210 ; SSE41-NEXT: pxor %xmm4, %xmm0
211 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259455,9223372039002259455]
212 ; SSE41-NEXT: movdqa %xmm5, %xmm6
213 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm6
214 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm0[0,0,2,2]
215 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [2147483647,2147483647,2147483647,2147483647]
216 ; SSE41-NEXT: movdqa %xmm0, %xmm3
217 ; SSE41-NEXT: pcmpgtd %xmm7, %xmm3
218 ; SSE41-NEXT: pand %xmm6, %xmm3
219 ; SSE41-NEXT: pxor %xmm1, %xmm4
220 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm5
221 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,0,2,2]
222 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm0
223 ; SSE41-NEXT: pand %xmm5, %xmm0
224 ; SSE41-NEXT: movapd {{.*#+}} xmm4 = [4294967295,4294967295]
225 ; SSE41-NEXT: movapd {{.*#+}} xmm5 = [4294967295,429496729]
226 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm5
227 ; SSE41-NEXT: movdqa %xmm3, %xmm0
228 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4
229 ; SSE41-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,2],xmm5[0,2]
230 ; SSE41-NEXT: movaps %xmm4, %xmm0
233 ; AVX1-LABEL: trunc_usat_v4i64_v4i32:
235 ; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
236 ; AVX1-NEXT: # xmm1 = mem[0,0]
237 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm2
238 ; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [9223372041149743103,9223372041149743103]
239 ; AVX1-NEXT: # xmm3 = mem[0,0]
240 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
241 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
242 ; AVX1-NEXT: vpxor %xmm1, %xmm4, %xmm1
243 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1
244 ; AVX1-NEXT: vmovapd {{.*#+}} xmm3 = [4294967295,429496729]
245 ; AVX1-NEXT: vblendvpd %xmm1, %xmm4, %xmm3, %xmm1
246 ; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [4294967295,4294967295]
247 ; AVX1-NEXT: # xmm3 = mem[0,0]
248 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
249 ; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
250 ; AVX1-NEXT: vzeroupper
253 ; AVX2-SLOW-LABEL: trunc_usat_v4i64_v4i32:
254 ; AVX2-SLOW: # %bb.0:
255 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
256 ; AVX2-SLOW-NEXT: vpxor %ymm1, %ymm0, %ymm1
257 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372041149743102,9223372041149743102,9223372041149743102,9223372041149743102]
258 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm1
259 ; AVX2-SLOW-NEXT: vblendvpd %ymm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
260 ; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1
261 ; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
262 ; AVX2-SLOW-NEXT: vzeroupper
263 ; AVX2-SLOW-NEXT: retq
265 ; AVX2-FAST-ALL-LABEL: trunc_usat_v4i64_v4i32:
266 ; AVX2-FAST-ALL: # %bb.0:
267 ; AVX2-FAST-ALL-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
268 ; AVX2-FAST-ALL-NEXT: vpxor %ymm1, %ymm0, %ymm1
269 ; AVX2-FAST-ALL-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372041149743102,9223372041149743102,9223372041149743102,9223372041149743102]
270 ; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm1
271 ; AVX2-FAST-ALL-NEXT: vblendvpd %ymm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
272 ; AVX2-FAST-ALL-NEXT: vbroadcastf128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]
273 ; AVX2-FAST-ALL-NEXT: # ymm1 = mem[0,1,0,1]
274 ; AVX2-FAST-ALL-NEXT: vpermps %ymm0, %ymm1, %ymm0
275 ; AVX2-FAST-ALL-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
276 ; AVX2-FAST-ALL-NEXT: vzeroupper
277 ; AVX2-FAST-ALL-NEXT: retq
279 ; AVX2-FAST-PERLANE-LABEL: trunc_usat_v4i64_v4i32:
280 ; AVX2-FAST-PERLANE: # %bb.0:
281 ; AVX2-FAST-PERLANE-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
282 ; AVX2-FAST-PERLANE-NEXT: vpxor %ymm1, %ymm0, %ymm1
283 ; AVX2-FAST-PERLANE-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372041149743102,9223372041149743102,9223372041149743102,9223372041149743102]
284 ; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm1
285 ; AVX2-FAST-PERLANE-NEXT: vblendvpd %ymm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
286 ; AVX2-FAST-PERLANE-NEXT: vextractf128 $1, %ymm0, %xmm1
287 ; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
288 ; AVX2-FAST-PERLANE-NEXT: vzeroupper
289 ; AVX2-FAST-PERLANE-NEXT: retq
291 ; AVX512F-LABEL: trunc_usat_v4i64_v4i32:
293 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
294 ; AVX512F-NEXT: vpcmpltuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %k1
295 ; AVX512F-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
296 ; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 {%k1}
297 ; AVX512F-NEXT: vpmovqd %zmm1, %ymm0
298 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
299 ; AVX512F-NEXT: vzeroupper
302 ; AVX512VL-LABEL: trunc_usat_v4i64_v4i32:
304 ; AVX512VL-NEXT: vpcmpltuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %k1
305 ; AVX512VL-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
306 ; AVX512VL-NEXT: vmovdqa64 %ymm0, %ymm1 {%k1}
307 ; AVX512VL-NEXT: vpmovqd %ymm1, %xmm0
308 ; AVX512VL-NEXT: vzeroupper
309 ; AVX512VL-NEXT: retq
311 ; AVX512BW-LABEL: trunc_usat_v4i64_v4i32:
313 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
314 ; AVX512BW-NEXT: vpcmpltuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %k1
315 ; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
316 ; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 {%k1}
317 ; AVX512BW-NEXT: vpmovqd %zmm1, %ymm0
318 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
319 ; AVX512BW-NEXT: vzeroupper
320 ; AVX512BW-NEXT: retq
322 ; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i32:
323 ; AVX512BWVL: # %bb.0:
324 ; AVX512BWVL-NEXT: vpcmpltuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %k1
325 ; AVX512BWVL-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
326 ; AVX512BWVL-NEXT: vmovdqa64 %ymm0, %ymm1 {%k1}
327 ; AVX512BWVL-NEXT: vpmovqd %ymm1, %xmm0
328 ; AVX512BWVL-NEXT: vzeroupper
329 ; AVX512BWVL-NEXT: retq
331 ; SKX-LABEL: trunc_usat_v4i64_v4i32:
333 ; SKX-NEXT: vpcmpltuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %k1
334 ; SKX-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
335 ; SKX-NEXT: vmovdqa64 %ymm0, %ymm1 {%k1}
336 ; SKX-NEXT: vpmovqd %ymm1, %xmm0
337 ; SKX-NEXT: vzeroupper
339 %1 = icmp ult <4 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
340 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 429496729>
341 %3 = trunc <4 x i64> %2 to <4 x i32>
345 define <8 x i32> @trunc_usat_v8i64_v8i32(ptr %p0) {
346 ; SSE2-SSSE3-LABEL: trunc_usat_v8i64_v8i32:
347 ; SSE2-SSSE3: # %bb.0:
348 ; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm2
349 ; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm0
350 ; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm6
351 ; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm1
352 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
353 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm5
354 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm5
355 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
356 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483647,2147483647,2147483647,2147483647]
357 ; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm8
358 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm8
359 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm5[1,1,3,3]
360 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm7
361 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm7
362 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm5, %xmm5
363 ; SSE2-SSSE3-NEXT: pand %xmm7, %xmm1
364 ; SSE2-SSSE3-NEXT: pxor %xmm5, %xmm7
365 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm7
366 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm1
367 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm1
368 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm1[0,0,2,2]
369 ; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm9
370 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm8, %xmm9
371 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
372 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm1
373 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm1
374 ; SSE2-SSSE3-NEXT: pand %xmm1, %xmm6
375 ; SSE2-SSSE3-NEXT: pxor %xmm5, %xmm1
376 ; SSE2-SSSE3-NEXT: por %xmm6, %xmm1
377 ; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm7[0,2]
378 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm6
379 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm6
380 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
381 ; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm8
382 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm8
383 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
384 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm6
385 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm6
386 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm0
387 ; SSE2-SSSE3-NEXT: pxor %xmm5, %xmm6
388 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm6
389 ; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm0
390 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm0
391 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm0[0,0,2,2]
392 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm4
393 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
394 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm0
395 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm0
396 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm5
397 ; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0
398 ; SSE2-SSSE3-NEXT: por %xmm5, %xmm0
399 ; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm6[0,2]
400 ; SSE2-SSSE3-NEXT: retq
402 ; SSE41-LABEL: trunc_usat_v8i64_v8i32:
404 ; SSE41-NEXT: movdqa (%rdi), %xmm4
405 ; SSE41-NEXT: movdqa 16(%rdi), %xmm7
406 ; SSE41-NEXT: movdqa 32(%rdi), %xmm8
407 ; SSE41-NEXT: movdqa 48(%rdi), %xmm1
408 ; SSE41-NEXT: movapd {{.*#+}} xmm3 = [4294967295,4294967295]
409 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
410 ; SSE41-NEXT: movdqa %xmm1, %xmm0
411 ; SSE41-NEXT: pxor %xmm6, %xmm0
412 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259455,9223372039002259455]
413 ; SSE41-NEXT: movdqa %xmm5, %xmm9
414 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm9
415 ; SSE41-NEXT: pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]
416 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483647,2147483647,2147483647,2147483647]
417 ; SSE41-NEXT: movdqa %xmm2, %xmm0
418 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm0
419 ; SSE41-NEXT: pand %xmm9, %xmm0
420 ; SSE41-NEXT: movapd %xmm3, %xmm9
421 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm9
422 ; SSE41-NEXT: movdqa %xmm8, %xmm0
423 ; SSE41-NEXT: pxor %xmm6, %xmm0
424 ; SSE41-NEXT: movdqa %xmm5, %xmm1
425 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
426 ; SSE41-NEXT: pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]
427 ; SSE41-NEXT: movdqa %xmm2, %xmm0
428 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm0
429 ; SSE41-NEXT: pand %xmm1, %xmm0
430 ; SSE41-NEXT: movapd %xmm3, %xmm1
431 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm1
432 ; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm9[0,2]
433 ; SSE41-NEXT: movdqa %xmm7, %xmm0
434 ; SSE41-NEXT: pxor %xmm6, %xmm0
435 ; SSE41-NEXT: movdqa %xmm5, %xmm8
436 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm8
437 ; SSE41-NEXT: pshufd {{.*#+}} xmm9 = xmm0[0,0,2,2]
438 ; SSE41-NEXT: movdqa %xmm2, %xmm0
439 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm0
440 ; SSE41-NEXT: pand %xmm8, %xmm0
441 ; SSE41-NEXT: movapd %xmm3, %xmm8
442 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm8
443 ; SSE41-NEXT: pxor %xmm4, %xmm6
444 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm5
445 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
446 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
447 ; SSE41-NEXT: pand %xmm5, %xmm2
448 ; SSE41-NEXT: movdqa %xmm2, %xmm0
449 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm3
450 ; SSE41-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm8[0,2]
451 ; SSE41-NEXT: movaps %xmm3, %xmm0
454 ; AVX1-LABEL: trunc_usat_v8i64_v8i32:
456 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
457 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
458 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2
459 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3
460 ; AVX1-NEXT: vmovddup {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
461 ; AVX1-NEXT: # xmm4 = mem[0,0]
462 ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm5
463 ; AVX1-NEXT: vmovddup {{.*#+}} xmm6 = [9223372041149743103,9223372041149743103]
464 ; AVX1-NEXT: # xmm6 = mem[0,0]
465 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5
466 ; AVX1-NEXT: vmovddup {{.*#+}} xmm7 = [4294967295,4294967295]
467 ; AVX1-NEXT: # xmm7 = mem[0,0]
468 ; AVX1-NEXT: vblendvpd %xmm5, %xmm2, %xmm7, %xmm2
469 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm5
470 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5
471 ; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm7, %xmm0
472 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm5
473 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5
474 ; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm7, %xmm3
475 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm4
476 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm4
477 ; AVX1-NEXT: vblendvpd %xmm4, %xmm1, %xmm7, %xmm1
478 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
479 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
480 ; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm1[0,2],ymm0[4,6],ymm1[4,6]
483 ; AVX2-SLOW-LABEL: trunc_usat_v8i64_v8i32:
484 ; AVX2-SLOW: # %bb.0:
485 ; AVX2-SLOW-NEXT: vmovdqa (%rdi), %ymm0
486 ; AVX2-SLOW-NEXT: vmovdqa 32(%rdi), %ymm1
487 ; AVX2-SLOW-NEXT: vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
488 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
489 ; AVX2-SLOW-NEXT: vpxor %ymm3, %ymm1, %ymm4
490 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
491 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
492 ; AVX2-SLOW-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
493 ; AVX2-SLOW-NEXT: vpxor %ymm3, %ymm0, %ymm3
494 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
495 ; AVX2-SLOW-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
496 ; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
497 ; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
498 ; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
499 ; AVX2-SLOW-NEXT: retq
501 ; AVX2-FAST-ALL-LABEL: trunc_usat_v8i64_v8i32:
502 ; AVX2-FAST-ALL: # %bb.0:
503 ; AVX2-FAST-ALL-NEXT: vmovdqa (%rdi), %ymm0
504 ; AVX2-FAST-ALL-NEXT: vmovdqa 32(%rdi), %ymm1
505 ; AVX2-FAST-ALL-NEXT: vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
506 ; AVX2-FAST-ALL-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
507 ; AVX2-FAST-ALL-NEXT: vpxor %ymm3, %ymm1, %ymm4
508 ; AVX2-FAST-ALL-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
509 ; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
510 ; AVX2-FAST-ALL-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
511 ; AVX2-FAST-ALL-NEXT: vpxor %ymm3, %ymm0, %ymm3
512 ; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
513 ; AVX2-FAST-ALL-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
514 ; AVX2-FAST-ALL-NEXT: vmovapd {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
515 ; AVX2-FAST-ALL-NEXT: vpermps %ymm0, %ymm2, %ymm0
516 ; AVX2-FAST-ALL-NEXT: vpermps %ymm1, %ymm2, %ymm1
517 ; AVX2-FAST-ALL-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
518 ; AVX2-FAST-ALL-NEXT: retq
520 ; AVX2-FAST-PERLANE-LABEL: trunc_usat_v8i64_v8i32:
521 ; AVX2-FAST-PERLANE: # %bb.0:
522 ; AVX2-FAST-PERLANE-NEXT: vmovdqa (%rdi), %ymm0
523 ; AVX2-FAST-PERLANE-NEXT: vmovdqa 32(%rdi), %ymm1
524 ; AVX2-FAST-PERLANE-NEXT: vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
525 ; AVX2-FAST-PERLANE-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
526 ; AVX2-FAST-PERLANE-NEXT: vpxor %ymm3, %ymm1, %ymm4
527 ; AVX2-FAST-PERLANE-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
528 ; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
529 ; AVX2-FAST-PERLANE-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
530 ; AVX2-FAST-PERLANE-NEXT: vpxor %ymm3, %ymm0, %ymm3
531 ; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
532 ; AVX2-FAST-PERLANE-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
533 ; AVX2-FAST-PERLANE-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
534 ; AVX2-FAST-PERLANE-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
535 ; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
536 ; AVX2-FAST-PERLANE-NEXT: retq
538 ; AVX512-LABEL: trunc_usat_v8i64_v8i32:
540 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
541 ; AVX512-NEXT: vpmovusqd %zmm0, %ymm0
544 ; SKX-LABEL: trunc_usat_v8i64_v8i32:
546 ; SKX-NEXT: vmovdqa64 (%rdi), %zmm0
547 ; SKX-NEXT: vpmovusqd %zmm0, %ymm0
549 %a0 = load <8 x i64>, ptr %p0
550 %1 = icmp ult <8 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
551 %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>
552 %3 = trunc <8 x i64> %2 to <8 x i32>
557 ; Unsigned saturation truncation to vXi16
560 define <2 x i16> @trunc_usat_v2i64_v2i16(<2 x i64> %a0) {
561 ; SSE2-SSSE3-LABEL: trunc_usat_v2i64_v2i16:
562 ; SSE2-SSSE3: # %bb.0:
563 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
564 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm1
565 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
566 ; SSE2-SSSE3-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
567 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]
568 ; SSE2-SSSE3-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
569 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm1
570 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm2
571 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm2
572 ; SSE2-SSSE3-NEXT: pand %xmm0, %xmm1
573 ; SSE2-SSSE3-NEXT: por %xmm2, %xmm1
574 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
575 ; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
576 ; SSE2-SSSE3-NEXT: retq
578 ; SSE41-LABEL: trunc_usat_v2i64_v2i16:
580 ; SSE41-NEXT: movdqa %xmm0, %xmm1
581 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [65535,65535]
582 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
583 ; SSE41-NEXT: pxor %xmm0, %xmm3
584 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
585 ; SSE41-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
586 ; SSE41-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
587 ; SSE41-NEXT: pandn %xmm3, %xmm0
588 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
589 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
590 ; SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
593 ; AVX1-LABEL: trunc_usat_v2i64_v2i16:
595 ; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
596 ; AVX1-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
597 ; AVX1-NEXT: vblendvpd %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
598 ; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
599 ; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
602 ; AVX2-SLOW-LABEL: trunc_usat_v2i64_v2i16:
603 ; AVX2-SLOW: # %bb.0:
604 ; AVX2-SLOW-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
605 ; AVX2-SLOW-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
606 ; AVX2-SLOW-NEXT: vblendvpd %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
607 ; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
608 ; AVX2-SLOW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
609 ; AVX2-SLOW-NEXT: retq
611 ; AVX2-FAST-LABEL: trunc_usat_v2i64_v2i16:
612 ; AVX2-FAST: # %bb.0:
613 ; AVX2-FAST-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
614 ; AVX2-FAST-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
615 ; AVX2-FAST-NEXT: vblendvpd %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
616 ; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
617 ; AVX2-FAST-NEXT: retq
619 ; AVX512F-LABEL: trunc_usat_v2i64_v2i16:
621 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
622 ; AVX512F-NEXT: vpmovusqw %zmm0, %xmm0
623 ; AVX512F-NEXT: vzeroupper
626 ; AVX512VL-LABEL: trunc_usat_v2i64_v2i16:
628 ; AVX512VL-NEXT: vpmovusqw %xmm0, %xmm0
629 ; AVX512VL-NEXT: retq
631 ; AVX512BW-LABEL: trunc_usat_v2i64_v2i16:
633 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
634 ; AVX512BW-NEXT: vpmovusqw %zmm0, %xmm0
635 ; AVX512BW-NEXT: vzeroupper
636 ; AVX512BW-NEXT: retq
638 ; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i16:
639 ; AVX512BWVL: # %bb.0:
640 ; AVX512BWVL-NEXT: vpmovusqw %xmm0, %xmm0
641 ; AVX512BWVL-NEXT: retq
643 ; SKX-LABEL: trunc_usat_v2i64_v2i16:
645 ; SKX-NEXT: vpmovusqw %xmm0, %xmm0
647 %1 = icmp ult <2 x i64> %a0, <i64 65535, i64 65535>
648 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 65535, i64 65535>
649 %3 = trunc <2 x i64> %2 to <2 x i16>
653 define void @trunc_usat_v2i64_v2i16_store(<2 x i64> %a0, ptr %p1) {
654 ; SSE2-SSSE3-LABEL: trunc_usat_v2i64_v2i16_store:
655 ; SSE2-SSSE3: # %bb.0:
656 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
657 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm1
658 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
659 ; SSE2-SSSE3-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
660 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]
661 ; SSE2-SSSE3-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
662 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm1
663 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm2
664 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm2
665 ; SSE2-SSSE3-NEXT: pand %xmm0, %xmm1
666 ; SSE2-SSSE3-NEXT: por %xmm2, %xmm1
667 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
668 ; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
669 ; SSE2-SSSE3-NEXT: movd %xmm0, (%rdi)
670 ; SSE2-SSSE3-NEXT: retq
672 ; SSE41-LABEL: trunc_usat_v2i64_v2i16_store:
674 ; SSE41-NEXT: movdqa %xmm0, %xmm1
675 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [65535,65535]
676 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
677 ; SSE41-NEXT: pxor %xmm0, %xmm3
678 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
679 ; SSE41-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
680 ; SSE41-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
681 ; SSE41-NEXT: pandn %xmm3, %xmm0
682 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
683 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
684 ; SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
685 ; SSE41-NEXT: movd %xmm0, (%rdi)
688 ; AVX1-LABEL: trunc_usat_v2i64_v2i16_store:
690 ; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
691 ; AVX1-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
692 ; AVX1-NEXT: vblendvpd %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
693 ; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
694 ; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
695 ; AVX1-NEXT: vmovd %xmm0, (%rdi)
698 ; AVX2-SLOW-LABEL: trunc_usat_v2i64_v2i16_store:
699 ; AVX2-SLOW: # %bb.0:
700 ; AVX2-SLOW-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
701 ; AVX2-SLOW-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
702 ; AVX2-SLOW-NEXT: vblendvpd %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
703 ; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
704 ; AVX2-SLOW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
705 ; AVX2-SLOW-NEXT: vmovd %xmm0, (%rdi)
706 ; AVX2-SLOW-NEXT: retq
708 ; AVX2-FAST-LABEL: trunc_usat_v2i64_v2i16_store:
709 ; AVX2-FAST: # %bb.0:
710 ; AVX2-FAST-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
711 ; AVX2-FAST-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
712 ; AVX2-FAST-NEXT: vblendvpd %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
713 ; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,u,u,u,u,u,u,u,u,u,u,u,u]
714 ; AVX2-FAST-NEXT: vmovd %xmm0, (%rdi)
715 ; AVX2-FAST-NEXT: retq
717 ; AVX512F-LABEL: trunc_usat_v2i64_v2i16_store:
719 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
720 ; AVX512F-NEXT: vpmovusqw %zmm0, %xmm0
721 ; AVX512F-NEXT: vmovd %xmm0, (%rdi)
722 ; AVX512F-NEXT: vzeroupper
725 ; AVX512VL-LABEL: trunc_usat_v2i64_v2i16_store:
727 ; AVX512VL-NEXT: vpmovusqw %xmm0, (%rdi)
728 ; AVX512VL-NEXT: retq
730 ; AVX512BW-LABEL: trunc_usat_v2i64_v2i16_store:
732 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
733 ; AVX512BW-NEXT: vpmovusqw %zmm0, %xmm0
734 ; AVX512BW-NEXT: vmovd %xmm0, (%rdi)
735 ; AVX512BW-NEXT: vzeroupper
736 ; AVX512BW-NEXT: retq
738 ; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i16_store:
739 ; AVX512BWVL: # %bb.0:
740 ; AVX512BWVL-NEXT: vpmovusqw %xmm0, (%rdi)
741 ; AVX512BWVL-NEXT: retq
743 ; SKX-LABEL: trunc_usat_v2i64_v2i16_store:
745 ; SKX-NEXT: vpmovusqw %xmm0, (%rdi)
747 %1 = icmp ult <2 x i64> %a0, <i64 65535, i64 65535>
748 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 65535, i64 65535>
749 %3 = trunc <2 x i64> %2 to <2 x i16>
750 store <2 x i16> %3, ptr %p1
754 define <4 x i16> @trunc_usat_v4i64_v4i16(<4 x i64> %a0) {
755 ; SSE2-SSSE3-LABEL: trunc_usat_v4i64_v4i16:
756 ; SSE2-SSSE3: # %bb.0:
757 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
758 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm3
759 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm3
760 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
761 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
762 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm6
763 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
764 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
765 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm3
766 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm3
767 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm4, %xmm4
768 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm1
769 ; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm3
770 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm3
771 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm1
772 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm1
773 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
774 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm6, %xmm5
775 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
776 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm1
777 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1
778 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm4
779 ; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
780 ; SSE2-SSSE3-NEXT: por %xmm4, %xmm0
781 ; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
782 ; SSE2-SSSE3-NEXT: pslld $16, %xmm0
783 ; SSE2-SSSE3-NEXT: psrad $16, %xmm0
784 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm1
785 ; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm0
786 ; SSE2-SSSE3-NEXT: retq
788 ; SSE41-LABEL: trunc_usat_v4i64_v4i16:
790 ; SSE41-NEXT: movdqa %xmm0, %xmm3
791 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [65535,65535]
792 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
793 ; SSE41-NEXT: movdqa %xmm1, %xmm0
794 ; SSE41-NEXT: pxor %xmm5, %xmm0
795 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002324991,9223372039002324991]
796 ; SSE41-NEXT: movdqa %xmm6, %xmm7
797 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm7
798 ; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm0[0,0,2,2]
799 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147549183,2147549183,2147549183,2147549183]
800 ; SSE41-NEXT: movdqa %xmm4, %xmm0
801 ; SSE41-NEXT: pcmpgtd %xmm8, %xmm0
802 ; SSE41-NEXT: pand %xmm7, %xmm0
803 ; SSE41-NEXT: movapd %xmm2, %xmm7
804 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm7
805 ; SSE41-NEXT: pxor %xmm3, %xmm5
806 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
807 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
808 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
809 ; SSE41-NEXT: pand %xmm6, %xmm4
810 ; SSE41-NEXT: movdqa %xmm4, %xmm0
811 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm2
812 ; SSE41-NEXT: packusdw %xmm7, %xmm2
813 ; SSE41-NEXT: packusdw %xmm2, %xmm2
814 ; SSE41-NEXT: movdqa %xmm2, %xmm0
817 ; AVX1-LABEL: trunc_usat_v4i64_v4i16:
819 ; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
820 ; AVX1-NEXT: # xmm1 = mem[0,0]
821 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm2
822 ; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
823 ; AVX1-NEXT: # xmm3 = mem[0,0]
824 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
825 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
826 ; AVX1-NEXT: vpxor %xmm1, %xmm4, %xmm1
827 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1
828 ; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [65535,65535]
829 ; AVX1-NEXT: # xmm3 = mem[0,0]
830 ; AVX1-NEXT: vblendvpd %xmm1, %xmm4, %xmm3, %xmm1
831 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
832 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
833 ; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
834 ; AVX1-NEXT: vzeroupper
837 ; AVX2-LABEL: trunc_usat_v4i64_v4i16:
839 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm1 = [65535,65535,65535,65535]
840 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
841 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm2
842 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854841342,9223372036854841342,9223372036854841342,9223372036854841342]
843 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
844 ; AVX2-NEXT: vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
845 ; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
846 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
847 ; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
848 ; AVX2-NEXT: vzeroupper
851 ; AVX512F-LABEL: trunc_usat_v4i64_v4i16:
853 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
854 ; AVX512F-NEXT: vpmovusqw %zmm0, %xmm0
855 ; AVX512F-NEXT: vzeroupper
858 ; AVX512VL-LABEL: trunc_usat_v4i64_v4i16:
860 ; AVX512VL-NEXT: vpmovusqw %ymm0, %xmm0
861 ; AVX512VL-NEXT: vzeroupper
862 ; AVX512VL-NEXT: retq
864 ; AVX512BW-LABEL: trunc_usat_v4i64_v4i16:
866 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
867 ; AVX512BW-NEXT: vpmovusqw %zmm0, %xmm0
868 ; AVX512BW-NEXT: vzeroupper
869 ; AVX512BW-NEXT: retq
871 ; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i16:
872 ; AVX512BWVL: # %bb.0:
873 ; AVX512BWVL-NEXT: vpmovusqw %ymm0, %xmm0
874 ; AVX512BWVL-NEXT: vzeroupper
875 ; AVX512BWVL-NEXT: retq
877 ; SKX-LABEL: trunc_usat_v4i64_v4i16:
879 ; SKX-NEXT: vpmovusqw %ymm0, %xmm0
880 ; SKX-NEXT: vzeroupper
882 %1 = icmp ult <4 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535>
883 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 65535, i64 65535, i64 65535, i64 65535>
884 %3 = trunc <4 x i64> %2 to <4 x i16>
888 define void @trunc_usat_v4i64_v4i16_store(<4 x i64> %a0, ptr%p1) {
889 ; SSE2-SSSE3-LABEL: trunc_usat_v4i64_v4i16_store:
890 ; SSE2-SSSE3: # %bb.0:
891 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
892 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm3
893 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm3
894 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
895 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
896 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm6
897 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
898 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
899 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm3
900 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm3
901 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm4, %xmm4
902 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm1
903 ; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm3
904 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm3
905 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm1
906 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm1
907 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
908 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm6, %xmm5
909 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
910 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm1
911 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1
912 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm4
913 ; SSE2-SSSE3-NEXT: pand %xmm0, %xmm1
914 ; SSE2-SSSE3-NEXT: por %xmm4, %xmm1
915 ; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm3[0,2]
916 ; SSE2-SSSE3-NEXT: pslld $16, %xmm1
917 ; SSE2-SSSE3-NEXT: psrad $16, %xmm1
918 ; SSE2-SSSE3-NEXT: packssdw %xmm1, %xmm1
919 ; SSE2-SSSE3-NEXT: movq %xmm1, (%rdi)
920 ; SSE2-SSSE3-NEXT: retq
922 ; SSE41-LABEL: trunc_usat_v4i64_v4i16_store:
924 ; SSE41-NEXT: movdqa %xmm0, %xmm2
925 ; SSE41-NEXT: movapd {{.*#+}} xmm4 = [65535,65535]
926 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
927 ; SSE41-NEXT: movdqa %xmm1, %xmm0
928 ; SSE41-NEXT: pxor %xmm5, %xmm0
929 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002324991,9223372039002324991]
930 ; SSE41-NEXT: movdqa %xmm6, %xmm7
931 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm7
932 ; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm0[0,0,2,2]
933 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147549183,2147549183,2147549183,2147549183]
934 ; SSE41-NEXT: movdqa %xmm3, %xmm0
935 ; SSE41-NEXT: pcmpgtd %xmm8, %xmm0
936 ; SSE41-NEXT: pand %xmm7, %xmm0
937 ; SSE41-NEXT: movapd %xmm4, %xmm7
938 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm7
939 ; SSE41-NEXT: pxor %xmm2, %xmm5
940 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
941 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
942 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
943 ; SSE41-NEXT: pand %xmm6, %xmm3
944 ; SSE41-NEXT: movdqa %xmm3, %xmm0
945 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4
946 ; SSE41-NEXT: packusdw %xmm7, %xmm4
947 ; SSE41-NEXT: packusdw %xmm4, %xmm4
948 ; SSE41-NEXT: movq %xmm4, (%rdi)
951 ; AVX1-LABEL: trunc_usat_v4i64_v4i16_store:
953 ; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
954 ; AVX1-NEXT: # xmm1 = mem[0,0]
955 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm2
956 ; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343]
957 ; AVX1-NEXT: # xmm3 = mem[0,0]
958 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
959 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
960 ; AVX1-NEXT: vpxor %xmm1, %xmm4, %xmm1
961 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1
962 ; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [65535,65535]
963 ; AVX1-NEXT: # xmm3 = mem[0,0]
964 ; AVX1-NEXT: vblendvpd %xmm1, %xmm4, %xmm3, %xmm1
965 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
966 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
967 ; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
968 ; AVX1-NEXT: vmovq %xmm0, (%rdi)
969 ; AVX1-NEXT: vzeroupper
972 ; AVX2-LABEL: trunc_usat_v4i64_v4i16_store:
974 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm1 = [65535,65535,65535,65535]
975 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
976 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm2
977 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854841342,9223372036854841342,9223372036854841342,9223372036854841342]
978 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
979 ; AVX2-NEXT: vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
980 ; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
981 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
982 ; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
983 ; AVX2-NEXT: vmovq %xmm0, (%rdi)
984 ; AVX2-NEXT: vzeroupper
987 ; AVX512F-LABEL: trunc_usat_v4i64_v4i16_store:
989 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
990 ; AVX512F-NEXT: vpmovusqw %zmm0, %xmm0
991 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
992 ; AVX512F-NEXT: vzeroupper
995 ; AVX512VL-LABEL: trunc_usat_v4i64_v4i16_store:
997 ; AVX512VL-NEXT: vpmovusqw %ymm0, (%rdi)
998 ; AVX512VL-NEXT: vzeroupper
999 ; AVX512VL-NEXT: retq
1001 ; AVX512BW-LABEL: trunc_usat_v4i64_v4i16_store:
1002 ; AVX512BW: # %bb.0:
1003 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1004 ; AVX512BW-NEXT: vpmovusqw %zmm0, %xmm0
1005 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
1006 ; AVX512BW-NEXT: vzeroupper
1007 ; AVX512BW-NEXT: retq
1009 ; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i16_store:
1010 ; AVX512BWVL: # %bb.0:
1011 ; AVX512BWVL-NEXT: vpmovusqw %ymm0, (%rdi)
1012 ; AVX512BWVL-NEXT: vzeroupper
1013 ; AVX512BWVL-NEXT: retq
1015 ; SKX-LABEL: trunc_usat_v4i64_v4i16_store:
1017 ; SKX-NEXT: vpmovusqw %ymm0, (%rdi)
1018 ; SKX-NEXT: vzeroupper
1020 %1 = icmp ult <4 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535>
1021 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 65535, i64 65535, i64 65535, i64 65535>
1022 %3 = trunc <4 x i64> %2 to <4 x i16>
1023 store <4 x i16> %3, ptr%p1
1027 define <8 x i16> @trunc_usat_v8i64_v8i16(ptr %p0) {
1028 ; SSE2-SSSE3-LABEL: trunc_usat_v8i64_v8i16:
1029 ; SSE2-SSSE3: # %bb.0:
1030 ; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm6
1031 ; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm0
1032 ; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm1
1033 ; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm5
1034 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
1035 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm4
1036 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm4
1037 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
1038 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147549183,2147549183,2147549183,2147549183]
1039 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm8
1040 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm8
1041 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
1042 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm7
1043 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm7
1044 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm4, %xmm4
1045 ; SSE2-SSSE3-NEXT: pand %xmm7, %xmm0
1046 ; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm7
1047 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm7
1048 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm0
1049 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm0
1050 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm0[0,0,2,2]
1051 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm9
1052 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm8, %xmm9
1053 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1054 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm0
1055 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm0
1056 ; SSE2-SSSE3-NEXT: pand %xmm0, %xmm6
1057 ; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm0
1058 ; SSE2-SSSE3-NEXT: por %xmm6, %xmm0
1059 ; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm7[0,2]
1060 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm6
1061 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm6
1062 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1063 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm8
1064 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm8
1065 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1066 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm6
1067 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm6
1068 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm5
1069 ; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm6
1070 ; SSE2-SSSE3-NEXT: por %xmm5, %xmm6
1071 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm5
1072 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm5
1073 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
1074 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm3
1075 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1076 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm5
1077 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm5
1078 ; SSE2-SSSE3-NEXT: pxor %xmm5, %xmm4
1079 ; SSE2-SSSE3-NEXT: pand %xmm1, %xmm5
1080 ; SSE2-SSSE3-NEXT: por %xmm4, %xmm5
1081 ; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm5 = xmm5[0,2],xmm6[0,2]
1082 ; SSE2-SSSE3-NEXT: pslld $16, %xmm5
1083 ; SSE2-SSSE3-NEXT: psrad $16, %xmm5
1084 ; SSE2-SSSE3-NEXT: pslld $16, %xmm0
1085 ; SSE2-SSSE3-NEXT: psrad $16, %xmm0
1086 ; SSE2-SSSE3-NEXT: packssdw %xmm5, %xmm0
1087 ; SSE2-SSSE3-NEXT: retq
1089 ; SSE41-LABEL: trunc_usat_v8i64_v8i16:
1091 ; SSE41-NEXT: movdqa (%rdi), %xmm8
1092 ; SSE41-NEXT: movdqa 16(%rdi), %xmm2
1093 ; SSE41-NEXT: movdqa 32(%rdi), %xmm4
1094 ; SSE41-NEXT: movdqa 48(%rdi), %xmm7
1095 ; SSE41-NEXT: movapd {{.*#+}} xmm3 = [65535,65535]
1096 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
1097 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1098 ; SSE41-NEXT: pxor %xmm6, %xmm0
1099 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002324991,9223372039002324991]
1100 ; SSE41-NEXT: movdqa %xmm5, %xmm9
1101 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm9
1102 ; SSE41-NEXT: pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]
1103 ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [2147549183,2147549183,2147549183,2147549183]
1104 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1105 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm0
1106 ; SSE41-NEXT: pand %xmm9, %xmm0
1107 ; SSE41-NEXT: movapd %xmm3, %xmm9
1108 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm9
1109 ; SSE41-NEXT: movdqa %xmm8, %xmm0
1110 ; SSE41-NEXT: pxor %xmm6, %xmm0
1111 ; SSE41-NEXT: movdqa %xmm5, %xmm2
1112 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
1113 ; SSE41-NEXT: pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]
1114 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1115 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm0
1116 ; SSE41-NEXT: pand %xmm2, %xmm0
1117 ; SSE41-NEXT: movapd %xmm3, %xmm2
1118 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm2
1119 ; SSE41-NEXT: packusdw %xmm9, %xmm2
1120 ; SSE41-NEXT: movdqa %xmm7, %xmm0
1121 ; SSE41-NEXT: pxor %xmm6, %xmm0
1122 ; SSE41-NEXT: movdqa %xmm5, %xmm8
1123 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm8
1124 ; SSE41-NEXT: pshufd {{.*#+}} xmm9 = xmm0[0,0,2,2]
1125 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1126 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm0
1127 ; SSE41-NEXT: pand %xmm8, %xmm0
1128 ; SSE41-NEXT: movapd %xmm3, %xmm8
1129 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm8
1130 ; SSE41-NEXT: pxor %xmm4, %xmm6
1131 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm5
1132 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1133 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
1134 ; SSE41-NEXT: pand %xmm5, %xmm1
1135 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1136 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm3
1137 ; SSE41-NEXT: packusdw %xmm8, %xmm3
1138 ; SSE41-NEXT: packusdw %xmm3, %xmm2
1139 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1142 ; AVX1-LABEL: trunc_usat_v8i64_v8i16:
1144 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
1145 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
1146 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2
1147 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3
1148 ; AVX1-NEXT: vmovddup {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
1149 ; AVX1-NEXT: # xmm4 = mem[0,0]
1150 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm5
1151 ; AVX1-NEXT: vmovddup {{.*#+}} xmm6 = [9223372036854841343,9223372036854841343]
1152 ; AVX1-NEXT: # xmm6 = mem[0,0]
1153 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5
1154 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm7
1155 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm6, %xmm7
1156 ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm8
1157 ; AVX1-NEXT: vpcmpgtq %xmm8, %xmm6, %xmm8
1158 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm4
1159 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm4
1160 ; AVX1-NEXT: vmovddup {{.*#+}} xmm6 = [65535,65535]
1161 ; AVX1-NEXT: # xmm6 = mem[0,0]
1162 ; AVX1-NEXT: vblendvpd %xmm4, %xmm3, %xmm6, %xmm3
1163 ; AVX1-NEXT: vblendvpd %xmm8, %xmm2, %xmm6, %xmm2
1164 ; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2
1165 ; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm6, %xmm1
1166 ; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm6, %xmm0
1167 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1168 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
1171 ; AVX2-LABEL: trunc_usat_v8i64_v8i16:
1173 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
1174 ; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1
1175 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [65535,65535,65535,65535]
1176 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1177 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm4
1178 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343]
1179 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
1180 ; AVX2-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
1181 ; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm3
1182 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
1183 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1184 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
1185 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1186 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1187 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
1188 ; AVX2-NEXT: vzeroupper
1191 ; AVX512-LABEL: trunc_usat_v8i64_v8i16:
1193 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
1194 ; AVX512-NEXT: vpmovusqw %zmm0, %xmm0
1195 ; AVX512-NEXT: vzeroupper
1198 ; SKX-LABEL: trunc_usat_v8i64_v8i16:
1200 ; SKX-NEXT: vmovdqa64 (%rdi), %zmm0
1201 ; SKX-NEXT: vpmovusqw %zmm0, %xmm0
1202 ; SKX-NEXT: vzeroupper
1204 %a0 = load <8 x i64>, ptr %p0
1205 %1 = icmp ult <8 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
1206 %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>
1207 %3 = trunc <8 x i64> %2 to <8 x i16>
1211 define <4 x i16> @trunc_usat_v4i32_v4i16(<4 x i32> %a0) {
1212 ; SSE2-LABEL: trunc_usat_v4i32_v4i16:
1214 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
1215 ; SSE2-NEXT: pxor %xmm0, %xmm1
1216 ; SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1217 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1218 ; SSE2-NEXT: pandn %xmm0, %xmm2
1219 ; SSE2-NEXT: psrld $16, %xmm1
1220 ; SSE2-NEXT: por %xmm2, %xmm1
1221 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm1[0,2,2,3,4,5,6,7]
1222 ; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
1223 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1226 ; SSSE3-LABEL: trunc_usat_v4i32_v4i16:
1228 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
1229 ; SSSE3-NEXT: pxor %xmm0, %xmm1
1230 ; SSSE3-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1231 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
1232 ; SSSE3-NEXT: pandn %xmm0, %xmm2
1233 ; SSSE3-NEXT: psrld $16, %xmm1
1234 ; SSSE3-NEXT: por %xmm2, %xmm1
1235 ; SSSE3-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1236 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
1239 ; SSE41-LABEL: trunc_usat_v4i32_v4i16:
1241 ; SSE41-NEXT: pminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1242 ; SSE41-NEXT: packusdw %xmm0, %xmm0
1245 ; AVX1-LABEL: trunc_usat_v4i32_v4i16:
1247 ; AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1248 ; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1251 ; AVX2-LABEL: trunc_usat_v4i32_v4i16:
1253 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [65535,65535,65535,65535]
1254 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
1255 ; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1258 ; AVX512F-LABEL: trunc_usat_v4i32_v4i16:
1260 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1261 ; AVX512F-NEXT: vpmovusdw %zmm0, %ymm0
1262 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
1263 ; AVX512F-NEXT: vzeroupper
1264 ; AVX512F-NEXT: retq
1266 ; AVX512VL-LABEL: trunc_usat_v4i32_v4i16:
1267 ; AVX512VL: # %bb.0:
1268 ; AVX512VL-NEXT: vpmovusdw %xmm0, %xmm0
1269 ; AVX512VL-NEXT: retq
1271 ; AVX512BW-LABEL: trunc_usat_v4i32_v4i16:
1272 ; AVX512BW: # %bb.0:
1273 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1274 ; AVX512BW-NEXT: vpmovusdw %zmm0, %ymm0
1275 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
1276 ; AVX512BW-NEXT: vzeroupper
1277 ; AVX512BW-NEXT: retq
1279 ; AVX512BWVL-LABEL: trunc_usat_v4i32_v4i16:
1280 ; AVX512BWVL: # %bb.0:
1281 ; AVX512BWVL-NEXT: vpmovusdw %xmm0, %xmm0
1282 ; AVX512BWVL-NEXT: retq
1284 ; SKX-LABEL: trunc_usat_v4i32_v4i16:
1286 ; SKX-NEXT: vpmovusdw %xmm0, %xmm0
1288 %1 = icmp ult <4 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535>
1289 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
1290 %3 = trunc <4 x i32> %2 to <4 x i16>
1294 define void @trunc_usat_v4i32_v4i16_store(<4 x i32> %a0, ptr%p1) {
1295 ; SSE2-LABEL: trunc_usat_v4i32_v4i16_store:
1297 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
1298 ; SSE2-NEXT: pxor %xmm0, %xmm1
1299 ; SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1300 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1301 ; SSE2-NEXT: pandn %xmm0, %xmm2
1302 ; SSE2-NEXT: psrld $16, %xmm1
1303 ; SSE2-NEXT: por %xmm2, %xmm1
1304 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm1[0,2,2,3,4,5,6,7]
1305 ; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
1306 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1307 ; SSE2-NEXT: movq %xmm0, (%rdi)
1310 ; SSSE3-LABEL: trunc_usat_v4i32_v4i16_store:
1312 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
1313 ; SSSE3-NEXT: pxor %xmm0, %xmm1
1314 ; SSSE3-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1315 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
1316 ; SSSE3-NEXT: pandn %xmm0, %xmm2
1317 ; SSSE3-NEXT: psrld $16, %xmm1
1318 ; SSSE3-NEXT: por %xmm2, %xmm1
1319 ; SSSE3-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]
1320 ; SSSE3-NEXT: movq %xmm1, (%rdi)
1323 ; SSE41-LABEL: trunc_usat_v4i32_v4i16_store:
1325 ; SSE41-NEXT: pminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1326 ; SSE41-NEXT: packusdw %xmm0, %xmm0
1327 ; SSE41-NEXT: movq %xmm0, (%rdi)
1330 ; AVX1-LABEL: trunc_usat_v4i32_v4i16_store:
1332 ; AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1333 ; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1334 ; AVX1-NEXT: vmovq %xmm0, (%rdi)
1337 ; AVX2-LABEL: trunc_usat_v4i32_v4i16_store:
1339 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [65535,65535,65535,65535]
1340 ; AVX2-NEXT: vpminud %xmm1, %xmm0, %xmm0
1341 ; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1342 ; AVX2-NEXT: vmovq %xmm0, (%rdi)
1345 ; AVX512F-LABEL: trunc_usat_v4i32_v4i16_store:
1347 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1348 ; AVX512F-NEXT: vpmovusdw %zmm0, %ymm0
1349 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
1350 ; AVX512F-NEXT: vzeroupper
1351 ; AVX512F-NEXT: retq
1353 ; AVX512VL-LABEL: trunc_usat_v4i32_v4i16_store:
1354 ; AVX512VL: # %bb.0:
1355 ; AVX512VL-NEXT: vpmovusdw %xmm0, (%rdi)
1356 ; AVX512VL-NEXT: retq
1358 ; AVX512BW-LABEL: trunc_usat_v4i32_v4i16_store:
1359 ; AVX512BW: # %bb.0:
1360 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1361 ; AVX512BW-NEXT: vpmovusdw %zmm0, %ymm0
1362 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
1363 ; AVX512BW-NEXT: vzeroupper
1364 ; AVX512BW-NEXT: retq
1366 ; AVX512BWVL-LABEL: trunc_usat_v4i32_v4i16_store:
1367 ; AVX512BWVL: # %bb.0:
1368 ; AVX512BWVL-NEXT: vpmovusdw %xmm0, (%rdi)
1369 ; AVX512BWVL-NEXT: retq
1371 ; SKX-LABEL: trunc_usat_v4i32_v4i16_store:
1373 ; SKX-NEXT: vpmovusdw %xmm0, (%rdi)
1375 %1 = icmp ult <4 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535>
1376 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
1377 %3 = trunc <4 x i32> %2 to <4 x i16>
1378 store <4 x i16> %3, ptr%p1
1382 define <8 x i16> @trunc_usat_v8i32_v8i16(<8 x i32> %a0) {
1383 ; SSE2-LABEL: trunc_usat_v8i32_v8i16:
1385 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
1386 ; SSE2-NEXT: movdqa %xmm0, %xmm3
1387 ; SSE2-NEXT: pxor %xmm2, %xmm3
1388 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147549183,2147549183,2147549183,2147549183]
1389 ; SSE2-NEXT: movdqa %xmm4, %xmm5
1390 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
1391 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm3
1392 ; SSE2-NEXT: pand %xmm5, %xmm0
1393 ; SSE2-NEXT: pxor %xmm3, %xmm5
1394 ; SSE2-NEXT: por %xmm5, %xmm0
1395 ; SSE2-NEXT: pxor %xmm1, %xmm2
1396 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
1397 ; SSE2-NEXT: pxor %xmm4, %xmm3
1398 ; SSE2-NEXT: pand %xmm1, %xmm4
1399 ; SSE2-NEXT: por %xmm3, %xmm4
1400 ; SSE2-NEXT: pslld $16, %xmm4
1401 ; SSE2-NEXT: psrad $16, %xmm4
1402 ; SSE2-NEXT: pslld $16, %xmm0
1403 ; SSE2-NEXT: psrad $16, %xmm0
1404 ; SSE2-NEXT: packssdw %xmm4, %xmm0
1407 ; SSSE3-LABEL: trunc_usat_v8i32_v8i16:
1409 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
1410 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
1411 ; SSSE3-NEXT: pxor %xmm2, %xmm3
1412 ; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147549183,2147549183,2147549183,2147549183]
1413 ; SSSE3-NEXT: movdqa %xmm4, %xmm5
1414 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
1415 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm3
1416 ; SSSE3-NEXT: pand %xmm5, %xmm0
1417 ; SSSE3-NEXT: pxor %xmm3, %xmm5
1418 ; SSSE3-NEXT: por %xmm5, %xmm0
1419 ; SSSE3-NEXT: pxor %xmm1, %xmm2
1420 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
1421 ; SSSE3-NEXT: pxor %xmm4, %xmm3
1422 ; SSSE3-NEXT: pand %xmm1, %xmm4
1423 ; SSSE3-NEXT: por %xmm3, %xmm4
1424 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1425 ; SSSE3-NEXT: pshufb %xmm1, %xmm4
1426 ; SSSE3-NEXT: pshufb %xmm1, %xmm0
1427 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm4[0]
1430 ; SSE41-LABEL: trunc_usat_v8i32_v8i16:
1432 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
1433 ; SSE41-NEXT: pminud %xmm2, %xmm1
1434 ; SSE41-NEXT: pminud %xmm2, %xmm0
1435 ; SSE41-NEXT: packusdw %xmm1, %xmm0
1438 ; AVX1-LABEL: trunc_usat_v8i32_v8i16:
1440 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1441 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [65535,65535,65535,65535]
1442 ; AVX1-NEXT: vpminud %xmm2, %xmm1, %xmm1
1443 ; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0
1444 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1445 ; AVX1-NEXT: vzeroupper
1448 ; AVX2-LABEL: trunc_usat_v8i32_v8i16:
1450 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535]
1451 ; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0
1452 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1453 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1454 ; AVX2-NEXT: vzeroupper
1457 ; AVX512F-LABEL: trunc_usat_v8i32_v8i16:
1459 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1460 ; AVX512F-NEXT: vpmovusdw %zmm0, %ymm0
1461 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
1462 ; AVX512F-NEXT: vzeroupper
1463 ; AVX512F-NEXT: retq
1465 ; AVX512VL-LABEL: trunc_usat_v8i32_v8i16:
1466 ; AVX512VL: # %bb.0:
1467 ; AVX512VL-NEXT: vpmovusdw %ymm0, %xmm0
1468 ; AVX512VL-NEXT: vzeroupper
1469 ; AVX512VL-NEXT: retq
1471 ; AVX512BW-LABEL: trunc_usat_v8i32_v8i16:
1472 ; AVX512BW: # %bb.0:
1473 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1474 ; AVX512BW-NEXT: vpmovusdw %zmm0, %ymm0
1475 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
1476 ; AVX512BW-NEXT: vzeroupper
1477 ; AVX512BW-NEXT: retq
1479 ; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i16:
1480 ; AVX512BWVL: # %bb.0:
1481 ; AVX512BWVL-NEXT: vpmovusdw %ymm0, %xmm0
1482 ; AVX512BWVL-NEXT: vzeroupper
1483 ; AVX512BWVL-NEXT: retq
1485 ; SKX-LABEL: trunc_usat_v8i32_v8i16:
1487 ; SKX-NEXT: vpmovusdw %ymm0, %xmm0
1488 ; SKX-NEXT: vzeroupper
1490 %1 = icmp ult <8 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
1491 %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>
1492 %3 = trunc <8 x i32> %2 to <8 x i16>
1496 define <16 x i16> @trunc_usat_v16i32_v16i16(ptr %p0) {
1497 ; SSE2-LABEL: trunc_usat_v16i32_v16i16:
1499 ; SSE2-NEXT: movdqa (%rdi), %xmm5
1500 ; SSE2-NEXT: movdqa 16(%rdi), %xmm4
1501 ; SSE2-NEXT: movdqa 32(%rdi), %xmm0
1502 ; SSE2-NEXT: movdqa 48(%rdi), %xmm8
1503 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
1504 ; SSE2-NEXT: movdqa %xmm0, %xmm3
1505 ; SSE2-NEXT: pxor %xmm6, %xmm3
1506 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147549183,2147549183,2147549183,2147549183]
1507 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1508 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm1
1509 ; SSE2-NEXT: pcmpeqd %xmm7, %xmm7
1510 ; SSE2-NEXT: pand %xmm1, %xmm0
1511 ; SSE2-NEXT: pxor %xmm7, %xmm1
1512 ; SSE2-NEXT: por %xmm0, %xmm1
1513 ; SSE2-NEXT: movdqa %xmm8, %xmm0
1514 ; SSE2-NEXT: pxor %xmm6, %xmm0
1515 ; SSE2-NEXT: movdqa %xmm2, %xmm3
1516 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm3
1517 ; SSE2-NEXT: pand %xmm3, %xmm8
1518 ; SSE2-NEXT: pxor %xmm7, %xmm3
1519 ; SSE2-NEXT: por %xmm8, %xmm3
1520 ; SSE2-NEXT: movdqa %xmm5, %xmm8
1521 ; SSE2-NEXT: pxor %xmm6, %xmm8
1522 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1523 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm0
1524 ; SSE2-NEXT: pand %xmm0, %xmm5
1525 ; SSE2-NEXT: pxor %xmm7, %xmm0
1526 ; SSE2-NEXT: por %xmm5, %xmm0
1527 ; SSE2-NEXT: pxor %xmm4, %xmm6
1528 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm2
1529 ; SSE2-NEXT: pxor %xmm2, %xmm7
1530 ; SSE2-NEXT: pand %xmm4, %xmm2
1531 ; SSE2-NEXT: por %xmm7, %xmm2
1532 ; SSE2-NEXT: pslld $16, %xmm2
1533 ; SSE2-NEXT: psrad $16, %xmm2
1534 ; SSE2-NEXT: pslld $16, %xmm0
1535 ; SSE2-NEXT: psrad $16, %xmm0
1536 ; SSE2-NEXT: packssdw %xmm2, %xmm0
1537 ; SSE2-NEXT: pslld $16, %xmm3
1538 ; SSE2-NEXT: psrad $16, %xmm3
1539 ; SSE2-NEXT: pslld $16, %xmm1
1540 ; SSE2-NEXT: psrad $16, %xmm1
1541 ; SSE2-NEXT: packssdw %xmm3, %xmm1
1544 ; SSSE3-LABEL: trunc_usat_v16i32_v16i16:
1546 ; SSSE3-NEXT: movdqa (%rdi), %xmm5
1547 ; SSSE3-NEXT: movdqa 16(%rdi), %xmm3
1548 ; SSSE3-NEXT: movdqa 32(%rdi), %xmm0
1549 ; SSSE3-NEXT: movdqa 48(%rdi), %xmm8
1550 ; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
1551 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
1552 ; SSSE3-NEXT: pxor %xmm6, %xmm4
1553 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147549183,2147549183,2147549183,2147549183]
1554 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
1555 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm1
1556 ; SSSE3-NEXT: pcmpeqd %xmm7, %xmm7
1557 ; SSSE3-NEXT: pand %xmm1, %xmm0
1558 ; SSSE3-NEXT: pxor %xmm7, %xmm1
1559 ; SSSE3-NEXT: por %xmm0, %xmm1
1560 ; SSSE3-NEXT: movdqa %xmm8, %xmm0
1561 ; SSSE3-NEXT: pxor %xmm6, %xmm0
1562 ; SSSE3-NEXT: movdqa %xmm2, %xmm4
1563 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
1564 ; SSSE3-NEXT: pand %xmm4, %xmm8
1565 ; SSSE3-NEXT: pxor %xmm7, %xmm4
1566 ; SSSE3-NEXT: por %xmm8, %xmm4
1567 ; SSSE3-NEXT: movdqa %xmm5, %xmm8
1568 ; SSSE3-NEXT: pxor %xmm6, %xmm8
1569 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
1570 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm0
1571 ; SSSE3-NEXT: pand %xmm0, %xmm5
1572 ; SSSE3-NEXT: pxor %xmm7, %xmm0
1573 ; SSSE3-NEXT: por %xmm5, %xmm0
1574 ; SSSE3-NEXT: pxor %xmm3, %xmm6
1575 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm2
1576 ; SSSE3-NEXT: pxor %xmm2, %xmm7
1577 ; SSSE3-NEXT: pand %xmm3, %xmm2
1578 ; SSSE3-NEXT: por %xmm7, %xmm2
1579 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1580 ; SSSE3-NEXT: pshufb %xmm3, %xmm2
1581 ; SSSE3-NEXT: pshufb %xmm3, %xmm0
1582 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
1583 ; SSSE3-NEXT: pshufb %xmm3, %xmm4
1584 ; SSSE3-NEXT: pshufb %xmm3, %xmm1
1585 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm4[0]
1588 ; SSE41-LABEL: trunc_usat_v16i32_v16i16:
1590 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [65535,65535,65535,65535]
1591 ; SSE41-NEXT: movdqa 48(%rdi), %xmm2
1592 ; SSE41-NEXT: pminud %xmm0, %xmm2
1593 ; SSE41-NEXT: movdqa 32(%rdi), %xmm1
1594 ; SSE41-NEXT: pminud %xmm0, %xmm1
1595 ; SSE41-NEXT: packusdw %xmm2, %xmm1
1596 ; SSE41-NEXT: movdqa 16(%rdi), %xmm2
1597 ; SSE41-NEXT: pminud %xmm0, %xmm2
1598 ; SSE41-NEXT: pminud (%rdi), %xmm0
1599 ; SSE41-NEXT: packusdw %xmm2, %xmm0
1602 ; AVX1-LABEL: trunc_usat_v16i32_v16i16:
1604 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm0 = [65535,65535,65535,65535]
1605 ; AVX1-NEXT: vpminud 16(%rdi), %xmm0, %xmm1
1606 ; AVX1-NEXT: vpminud (%rdi), %xmm0, %xmm2
1607 ; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm1
1608 ; AVX1-NEXT: vpminud 48(%rdi), %xmm0, %xmm2
1609 ; AVX1-NEXT: vpminud 32(%rdi), %xmm0, %xmm0
1610 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
1611 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1614 ; AVX2-LABEL: trunc_usat_v16i32_v16i16:
1616 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm0 = [65535,65535,65535,65535,65535,65535,65535,65535]
1617 ; AVX2-NEXT: vpminud 32(%rdi), %ymm0, %ymm1
1618 ; AVX2-NEXT: vpminud (%rdi), %ymm0, %ymm0
1619 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
1620 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1623 ; AVX512-LABEL: trunc_usat_v16i32_v16i16:
1625 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
1626 ; AVX512-NEXT: vpmovusdw %zmm0, %ymm0
1629 ; SKX-LABEL: trunc_usat_v16i32_v16i16:
1631 ; SKX-NEXT: vmovdqa64 (%rdi), %zmm0
1632 ; SKX-NEXT: vpmovusdw %zmm0, %ymm0
1634 %a0 = load <16 x i32>, ptr %p0
1635 %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>
1636 %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>
1637 %3 = trunc <16 x i32> %2 to <16 x i16>
1642 ; Unsigned saturation truncation to vXi8
1645 define <2 x i8> @trunc_usat_v2i64_v2i8(<2 x i64> %a0) {
1646 ; SSE2-LABEL: trunc_usat_v2i64_v2i8:
1648 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
1649 ; SSE2-NEXT: pxor %xmm0, %xmm1
1650 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1651 ; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
1652 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]
1653 ; SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1654 ; SSE2-NEXT: pandn %xmm2, %xmm1
1655 ; SSE2-NEXT: pand %xmm1, %xmm0
1656 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1657 ; SSE2-NEXT: por %xmm1, %xmm0
1658 ; SSE2-NEXT: packuswb %xmm0, %xmm0
1659 ; SSE2-NEXT: packuswb %xmm0, %xmm0
1660 ; SSE2-NEXT: packuswb %xmm0, %xmm0
1663 ; SSSE3-LABEL: trunc_usat_v2i64_v2i8:
1665 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
1666 ; SSSE3-NEXT: pxor %xmm0, %xmm1
1667 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1668 ; SSSE3-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
1669 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]
1670 ; SSSE3-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1671 ; SSSE3-NEXT: pandn %xmm2, %xmm1
1672 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm2
1673 ; SSSE3-NEXT: pxor %xmm1, %xmm2
1674 ; SSSE3-NEXT: pand %xmm1, %xmm0
1675 ; SSSE3-NEXT: por %xmm2, %xmm0
1676 ; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
1679 ; SSE41-LABEL: trunc_usat_v2i64_v2i8:
1681 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1682 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [255,255]
1683 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
1684 ; SSE41-NEXT: pxor %xmm0, %xmm3
1685 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1686 ; SSE41-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
1687 ; SSE41-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1688 ; SSE41-NEXT: pandn %xmm3, %xmm0
1689 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
1690 ; SSE41-NEXT: pshufb {{.*#+}} xmm2 = xmm2[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
1691 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1694 ; AVX-LABEL: trunc_usat_v2i64_v2i8:
1696 ; AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
1697 ; AVX-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1698 ; AVX-NEXT: vblendvpd %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1699 ; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
1702 ; AVX512F-LABEL: trunc_usat_v2i64_v2i8:
1704 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1705 ; AVX512F-NEXT: vpmovusqb %zmm0, %xmm0
1706 ; AVX512F-NEXT: vzeroupper
1707 ; AVX512F-NEXT: retq
1709 ; AVX512VL-LABEL: trunc_usat_v2i64_v2i8:
1710 ; AVX512VL: # %bb.0:
1711 ; AVX512VL-NEXT: vpmovusqb %xmm0, %xmm0
1712 ; AVX512VL-NEXT: retq
1714 ; AVX512BW-LABEL: trunc_usat_v2i64_v2i8:
1715 ; AVX512BW: # %bb.0:
1716 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1717 ; AVX512BW-NEXT: vpmovusqb %zmm0, %xmm0
1718 ; AVX512BW-NEXT: vzeroupper
1719 ; AVX512BW-NEXT: retq
1721 ; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i8:
1722 ; AVX512BWVL: # %bb.0:
1723 ; AVX512BWVL-NEXT: vpmovusqb %xmm0, %xmm0
1724 ; AVX512BWVL-NEXT: retq
1726 ; SKX-LABEL: trunc_usat_v2i64_v2i8:
1728 ; SKX-NEXT: vpmovusqb %xmm0, %xmm0
1730 %1 = icmp ult <2 x i64> %a0, <i64 255, i64 255>
1731 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 255, i64 255>
1732 %3 = trunc <2 x i64> %2 to <2 x i8>
1736 define void @trunc_usat_v2i64_v2i8_store(<2 x i64> %a0, ptr %p1) {
1737 ; SSE2-LABEL: trunc_usat_v2i64_v2i8_store:
1739 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
1740 ; SSE2-NEXT: pxor %xmm0, %xmm1
1741 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1742 ; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
1743 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]
1744 ; SSE2-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1745 ; SSE2-NEXT: pandn %xmm2, %xmm1
1746 ; SSE2-NEXT: pand %xmm1, %xmm0
1747 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1748 ; SSE2-NEXT: por %xmm0, %xmm1
1749 ; SSE2-NEXT: packuswb %xmm1, %xmm1
1750 ; SSE2-NEXT: packuswb %xmm1, %xmm1
1751 ; SSE2-NEXT: packuswb %xmm1, %xmm1
1752 ; SSE2-NEXT: movd %xmm1, %eax
1753 ; SSE2-NEXT: movw %ax, (%rdi)
1756 ; SSSE3-LABEL: trunc_usat_v2i64_v2i8_store:
1758 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456]
1759 ; SSSE3-NEXT: pxor %xmm0, %xmm1
1760 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1761 ; SSSE3-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
1762 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,2,2]
1763 ; SSSE3-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1764 ; SSSE3-NEXT: pandn %xmm2, %xmm1
1765 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm2
1766 ; SSSE3-NEXT: pxor %xmm1, %xmm2
1767 ; SSSE3-NEXT: pand %xmm0, %xmm1
1768 ; SSSE3-NEXT: por %xmm2, %xmm1
1769 ; SSSE3-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
1770 ; SSSE3-NEXT: movd %xmm1, %eax
1771 ; SSSE3-NEXT: movw %ax, (%rdi)
1774 ; SSE41-LABEL: trunc_usat_v2i64_v2i8_store:
1776 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1777 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [255,255]
1778 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
1779 ; SSE41-NEXT: pxor %xmm0, %xmm3
1780 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1781 ; SSE41-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
1782 ; SSE41-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1783 ; SSE41-NEXT: pandn %xmm3, %xmm0
1784 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
1785 ; SSE41-NEXT: pshufb {{.*#+}} xmm2 = xmm2[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
1786 ; SSE41-NEXT: pextrw $0, %xmm2, (%rdi)
1789 ; AVX-LABEL: trunc_usat_v2i64_v2i8_store:
1791 ; AVX-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
1792 ; AVX-NEXT: vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
1793 ; AVX-NEXT: vblendvpd %xmm1, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
1794 ; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
1795 ; AVX-NEXT: vpextrw $0, %xmm0, (%rdi)
1798 ; AVX512F-LABEL: trunc_usat_v2i64_v2i8_store:
1800 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1801 ; AVX512F-NEXT: vpmovusqb %zmm0, %xmm0
1802 ; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi)
1803 ; AVX512F-NEXT: vzeroupper
1804 ; AVX512F-NEXT: retq
1806 ; AVX512VL-LABEL: trunc_usat_v2i64_v2i8_store:
1807 ; AVX512VL: # %bb.0:
1808 ; AVX512VL-NEXT: vpmovusqb %xmm0, (%rdi)
1809 ; AVX512VL-NEXT: retq
1811 ; AVX512BW-LABEL: trunc_usat_v2i64_v2i8_store:
1812 ; AVX512BW: # %bb.0:
1813 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1814 ; AVX512BW-NEXT: vpmovusqb %zmm0, %xmm0
1815 ; AVX512BW-NEXT: vpextrw $0, %xmm0, (%rdi)
1816 ; AVX512BW-NEXT: vzeroupper
1817 ; AVX512BW-NEXT: retq
1819 ; AVX512BWVL-LABEL: trunc_usat_v2i64_v2i8_store:
1820 ; AVX512BWVL: # %bb.0:
1821 ; AVX512BWVL-NEXT: vpmovusqb %xmm0, (%rdi)
1822 ; AVX512BWVL-NEXT: retq
1824 ; SKX-LABEL: trunc_usat_v2i64_v2i8_store:
1826 ; SKX-NEXT: vpmovusqb %xmm0, (%rdi)
1828 %1 = icmp ult <2 x i64> %a0, <i64 255, i64 255>
1829 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 255, i64 255>
1830 %3 = trunc <2 x i64> %2 to <2 x i8>
1831 store <2 x i8> %3, ptr %p1
1835 define <4 x i8> @trunc_usat_v4i64_v4i8(<4 x i64> %a0) {
1836 ; SSE2-SSSE3-LABEL: trunc_usat_v4i64_v4i8:
1837 ; SSE2-SSSE3: # %bb.0:
1838 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,255]
1839 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
1840 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm4
1841 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm4
1842 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1843 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483903,2147483903,2147483903,2147483903]
1844 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm7
1845 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm7
1846 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1847 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm4
1848 ; SSE2-SSSE3-NEXT: pand %xmm7, %xmm4
1849 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm1
1850 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm4
1851 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm4
1852 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm1
1853 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm1
1854 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2]
1855 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm6
1856 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1857 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm1
1858 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm1
1859 ; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
1860 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm1
1861 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm0
1862 ; SSE2-SSSE3-NEXT: packuswb %xmm4, %xmm0
1863 ; SSE2-SSSE3-NEXT: packuswb %xmm0, %xmm0
1864 ; SSE2-SSSE3-NEXT: packuswb %xmm0, %xmm0
1865 ; SSE2-SSSE3-NEXT: retq
1867 ; SSE41-LABEL: trunc_usat_v4i64_v4i8:
1869 ; SSE41-NEXT: movdqa %xmm0, %xmm3
1870 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [255,255]
1871 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
1872 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1873 ; SSE41-NEXT: pxor %xmm5, %xmm0
1874 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259711,9223372039002259711]
1875 ; SSE41-NEXT: movdqa %xmm6, %xmm7
1876 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm7
1877 ; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm0[0,0,2,2]
1878 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147483903,2147483903,2147483903,2147483903]
1879 ; SSE41-NEXT: movdqa %xmm4, %xmm0
1880 ; SSE41-NEXT: pcmpgtd %xmm8, %xmm0
1881 ; SSE41-NEXT: pand %xmm7, %xmm0
1882 ; SSE41-NEXT: movapd %xmm2, %xmm7
1883 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm7
1884 ; SSE41-NEXT: pxor %xmm3, %xmm5
1885 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
1886 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
1887 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
1888 ; SSE41-NEXT: pand %xmm6, %xmm4
1889 ; SSE41-NEXT: movdqa %xmm4, %xmm0
1890 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm2
1891 ; SSE41-NEXT: packusdw %xmm7, %xmm2
1892 ; SSE41-NEXT: packusdw %xmm2, %xmm2
1893 ; SSE41-NEXT: packuswb %xmm2, %xmm2
1894 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1897 ; AVX1-LABEL: trunc_usat_v4i64_v4i8:
1899 ; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
1900 ; AVX1-NEXT: # xmm1 = mem[0,0]
1901 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm2
1902 ; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [9223372036854776063,9223372036854776063]
1903 ; AVX1-NEXT: # xmm3 = mem[0,0]
1904 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
1905 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
1906 ; AVX1-NEXT: vpxor %xmm1, %xmm4, %xmm1
1907 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1
1908 ; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [255,255]
1909 ; AVX1-NEXT: # xmm3 = mem[0,0]
1910 ; AVX1-NEXT: vblendvpd %xmm1, %xmm4, %xmm3, %xmm1
1911 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
1912 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1913 ; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1914 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
1915 ; AVX1-NEXT: vzeroupper
1918 ; AVX2-LABEL: trunc_usat_v4i64_v4i8:
1920 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm1 = [255,255,255,255]
1921 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1922 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm2
1923 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854776062,9223372036854776062,9223372036854776062,9223372036854776062]
1924 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
1925 ; AVX2-NEXT: vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
1926 ; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
1927 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1928 ; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1929 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
1930 ; AVX2-NEXT: vzeroupper
1933 ; AVX512F-LABEL: trunc_usat_v4i64_v4i8:
1935 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1936 ; AVX512F-NEXT: vpmovusqb %zmm0, %xmm0
1937 ; AVX512F-NEXT: vzeroupper
1938 ; AVX512F-NEXT: retq
1940 ; AVX512VL-LABEL: trunc_usat_v4i64_v4i8:
1941 ; AVX512VL: # %bb.0:
1942 ; AVX512VL-NEXT: vpmovusqb %ymm0, %xmm0
1943 ; AVX512VL-NEXT: vzeroupper
1944 ; AVX512VL-NEXT: retq
1946 ; AVX512BW-LABEL: trunc_usat_v4i64_v4i8:
1947 ; AVX512BW: # %bb.0:
1948 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1949 ; AVX512BW-NEXT: vpmovusqb %zmm0, %xmm0
1950 ; AVX512BW-NEXT: vzeroupper
1951 ; AVX512BW-NEXT: retq
1953 ; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i8:
1954 ; AVX512BWVL: # %bb.0:
1955 ; AVX512BWVL-NEXT: vpmovusqb %ymm0, %xmm0
1956 ; AVX512BWVL-NEXT: vzeroupper
1957 ; AVX512BWVL-NEXT: retq
1959 ; SKX-LABEL: trunc_usat_v4i64_v4i8:
1961 ; SKX-NEXT: vpmovusqb %ymm0, %xmm0
1962 ; SKX-NEXT: vzeroupper
1964 %1 = icmp ult <4 x i64> %a0, <i64 255, i64 255, i64 255, i64 255>
1965 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 255, i64 255, i64 255, i64 255>
1966 %3 = trunc <4 x i64> %2 to <4 x i8>
1970 define void @trunc_usat_v4i64_v4i8_store(<4 x i64> %a0, ptr%p1) {
1971 ; SSE2-SSSE3-LABEL: trunc_usat_v4i64_v4i8_store:
1972 ; SSE2-SSSE3: # %bb.0:
1973 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,255]
1974 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
1975 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm4
1976 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm4
1977 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1978 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483903,2147483903,2147483903,2147483903]
1979 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm7
1980 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm7
1981 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1982 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm4
1983 ; SSE2-SSSE3-NEXT: pand %xmm7, %xmm4
1984 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm1
1985 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm4
1986 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm4
1987 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm1
1988 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm1
1989 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2]
1990 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm6
1991 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1992 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm1
1993 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm1
1994 ; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
1995 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm1
1996 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm1
1997 ; SSE2-SSSE3-NEXT: packuswb %xmm4, %xmm1
1998 ; SSE2-SSSE3-NEXT: packuswb %xmm1, %xmm1
1999 ; SSE2-SSSE3-NEXT: packuswb %xmm1, %xmm1
2000 ; SSE2-SSSE3-NEXT: movd %xmm1, (%rdi)
2001 ; SSE2-SSSE3-NEXT: retq
2003 ; SSE41-LABEL: trunc_usat_v4i64_v4i8_store:
2005 ; SSE41-NEXT: movdqa %xmm0, %xmm2
2006 ; SSE41-NEXT: movapd {{.*#+}} xmm4 = [255,255]
2007 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
2008 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2009 ; SSE41-NEXT: pxor %xmm5, %xmm0
2010 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259711,9223372039002259711]
2011 ; SSE41-NEXT: movdqa %xmm6, %xmm7
2012 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm7
2013 ; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm0[0,0,2,2]
2014 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483903,2147483903,2147483903,2147483903]
2015 ; SSE41-NEXT: movdqa %xmm3, %xmm0
2016 ; SSE41-NEXT: pcmpgtd %xmm8, %xmm0
2017 ; SSE41-NEXT: pand %xmm7, %xmm0
2018 ; SSE41-NEXT: movapd %xmm4, %xmm7
2019 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm7
2020 ; SSE41-NEXT: pxor %xmm2, %xmm5
2021 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
2022 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
2023 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
2024 ; SSE41-NEXT: pand %xmm6, %xmm3
2025 ; SSE41-NEXT: movdqa %xmm3, %xmm0
2026 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4
2027 ; SSE41-NEXT: packusdw %xmm7, %xmm4
2028 ; SSE41-NEXT: packusdw %xmm4, %xmm4
2029 ; SSE41-NEXT: packuswb %xmm4, %xmm4
2030 ; SSE41-NEXT: movd %xmm4, (%rdi)
2033 ; AVX1-LABEL: trunc_usat_v4i64_v4i8_store:
2035 ; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
2036 ; AVX1-NEXT: # xmm1 = mem[0,0]
2037 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm2
2038 ; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [9223372036854776063,9223372036854776063]
2039 ; AVX1-NEXT: # xmm3 = mem[0,0]
2040 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
2041 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
2042 ; AVX1-NEXT: vpxor %xmm1, %xmm4, %xmm1
2043 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1
2044 ; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [255,255]
2045 ; AVX1-NEXT: # xmm3 = mem[0,0]
2046 ; AVX1-NEXT: vblendvpd %xmm1, %xmm4, %xmm3, %xmm1
2047 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
2048 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
2049 ; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
2050 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2051 ; AVX1-NEXT: vmovd %xmm0, (%rdi)
2052 ; AVX1-NEXT: vzeroupper
2055 ; AVX2-LABEL: trunc_usat_v4i64_v4i8_store:
2057 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm1 = [255,255,255,255]
2058 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2059 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm2
2060 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854776062,9223372036854776062,9223372036854776062,9223372036854776062]
2061 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
2062 ; AVX2-NEXT: vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
2063 ; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
2064 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
2065 ; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
2066 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2067 ; AVX2-NEXT: vmovd %xmm0, (%rdi)
2068 ; AVX2-NEXT: vzeroupper
2071 ; AVX512F-LABEL: trunc_usat_v4i64_v4i8_store:
2073 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
2074 ; AVX512F-NEXT: vpmovusqb %zmm0, %xmm0
2075 ; AVX512F-NEXT: vmovd %xmm0, (%rdi)
2076 ; AVX512F-NEXT: vzeroupper
2077 ; AVX512F-NEXT: retq
2079 ; AVX512VL-LABEL: trunc_usat_v4i64_v4i8_store:
2080 ; AVX512VL: # %bb.0:
2081 ; AVX512VL-NEXT: vpmovusqb %ymm0, (%rdi)
2082 ; AVX512VL-NEXT: vzeroupper
2083 ; AVX512VL-NEXT: retq
2085 ; AVX512BW-LABEL: trunc_usat_v4i64_v4i8_store:
2086 ; AVX512BW: # %bb.0:
2087 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
2088 ; AVX512BW-NEXT: vpmovusqb %zmm0, %xmm0
2089 ; AVX512BW-NEXT: vmovd %xmm0, (%rdi)
2090 ; AVX512BW-NEXT: vzeroupper
2091 ; AVX512BW-NEXT: retq
2093 ; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i8_store:
2094 ; AVX512BWVL: # %bb.0:
2095 ; AVX512BWVL-NEXT: vpmovusqb %ymm0, (%rdi)
2096 ; AVX512BWVL-NEXT: vzeroupper
2097 ; AVX512BWVL-NEXT: retq
2099 ; SKX-LABEL: trunc_usat_v4i64_v4i8_store:
2101 ; SKX-NEXT: vpmovusqb %ymm0, (%rdi)
2102 ; SKX-NEXT: vzeroupper
2104 %1 = icmp ult <4 x i64> %a0, <i64 255, i64 255, i64 255, i64 255>
2105 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 255, i64 255, i64 255, i64 255>
2106 %3 = trunc <4 x i64> %2 to <4 x i8>
2107 store <4 x i8> %3, ptr%p1
2111 define <8 x i8> @trunc_usat_v8i64_v8i8(ptr %p0) {
2112 ; SSE2-SSSE3-LABEL: trunc_usat_v8i64_v8i8:
2113 ; SSE2-SSSE3: # %bb.0:
2114 ; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm6
2115 ; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm0
2116 ; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm1
2117 ; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm5
2118 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,255]
2119 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
2120 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm7
2121 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm7
2122 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
2123 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483903,2147483903,2147483903,2147483903]
2124 ; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm9
2125 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm8, %xmm9
2126 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
2127 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm7
2128 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm7
2129 ; SSE2-SSSE3-NEXT: pand %xmm7, %xmm0
2130 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm7
2131 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm7
2132 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm0
2133 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm0
2134 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm0[0,0,2,2]
2135 ; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm9
2136 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm8, %xmm9
2137 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2138 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm0
2139 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm0
2140 ; SSE2-SSSE3-NEXT: pand %xmm0, %xmm6
2141 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm0
2142 ; SSE2-SSSE3-NEXT: por %xmm6, %xmm0
2143 ; SSE2-SSSE3-NEXT: packuswb %xmm7, %xmm0
2144 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm6
2145 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm6
2146 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2147 ; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm8
2148 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm8
2149 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2150 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm6
2151 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm6
2152 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm5
2153 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm6
2154 ; SSE2-SSSE3-NEXT: por %xmm5, %xmm6
2155 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm5
2156 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm5
2157 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
2158 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm4
2159 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2160 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm5
2161 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm5
2162 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1
2163 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm5
2164 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm5
2165 ; SSE2-SSSE3-NEXT: packuswb %xmm6, %xmm5
2166 ; SSE2-SSSE3-NEXT: packuswb %xmm5, %xmm0
2167 ; SSE2-SSSE3-NEXT: packuswb %xmm0, %xmm0
2168 ; SSE2-SSSE3-NEXT: retq
2170 ; SSE41-LABEL: trunc_usat_v8i64_v8i8:
2172 ; SSE41-NEXT: movdqa (%rdi), %xmm8
2173 ; SSE41-NEXT: movdqa 16(%rdi), %xmm2
2174 ; SSE41-NEXT: movdqa 32(%rdi), %xmm4
2175 ; SSE41-NEXT: movdqa 48(%rdi), %xmm7
2176 ; SSE41-NEXT: movapd {{.*#+}} xmm3 = [255,255]
2177 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
2178 ; SSE41-NEXT: movdqa %xmm2, %xmm0
2179 ; SSE41-NEXT: pxor %xmm6, %xmm0
2180 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259711,9223372039002259711]
2181 ; SSE41-NEXT: movdqa %xmm5, %xmm9
2182 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm9
2183 ; SSE41-NEXT: pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]
2184 ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [2147483903,2147483903,2147483903,2147483903]
2185 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2186 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm0
2187 ; SSE41-NEXT: pand %xmm9, %xmm0
2188 ; SSE41-NEXT: movapd %xmm3, %xmm9
2189 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm9
2190 ; SSE41-NEXT: movdqa %xmm8, %xmm0
2191 ; SSE41-NEXT: pxor %xmm6, %xmm0
2192 ; SSE41-NEXT: movdqa %xmm5, %xmm2
2193 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
2194 ; SSE41-NEXT: pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]
2195 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2196 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm0
2197 ; SSE41-NEXT: pand %xmm2, %xmm0
2198 ; SSE41-NEXT: movapd %xmm3, %xmm2
2199 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm2
2200 ; SSE41-NEXT: packusdw %xmm9, %xmm2
2201 ; SSE41-NEXT: movdqa %xmm7, %xmm0
2202 ; SSE41-NEXT: pxor %xmm6, %xmm0
2203 ; SSE41-NEXT: movdqa %xmm5, %xmm8
2204 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm8
2205 ; SSE41-NEXT: pshufd {{.*#+}} xmm9 = xmm0[0,0,2,2]
2206 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2207 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm0
2208 ; SSE41-NEXT: pand %xmm8, %xmm0
2209 ; SSE41-NEXT: movapd %xmm3, %xmm8
2210 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm8
2211 ; SSE41-NEXT: pxor %xmm4, %xmm6
2212 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm5
2213 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2214 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
2215 ; SSE41-NEXT: pand %xmm5, %xmm1
2216 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2217 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm3
2218 ; SSE41-NEXT: packusdw %xmm8, %xmm3
2219 ; SSE41-NEXT: packusdw %xmm3, %xmm2
2220 ; SSE41-NEXT: packuswb %xmm2, %xmm2
2221 ; SSE41-NEXT: movdqa %xmm2, %xmm0
2224 ; AVX1-LABEL: trunc_usat_v8i64_v8i8:
2226 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
2227 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
2228 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2
2229 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3
2230 ; AVX1-NEXT: vmovddup {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
2231 ; AVX1-NEXT: # xmm4 = mem[0,0]
2232 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm5
2233 ; AVX1-NEXT: vmovddup {{.*#+}} xmm6 = [9223372036854776063,9223372036854776063]
2234 ; AVX1-NEXT: # xmm6 = mem[0,0]
2235 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5
2236 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm7
2237 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm6, %xmm7
2238 ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm8
2239 ; AVX1-NEXT: vpcmpgtq %xmm8, %xmm6, %xmm8
2240 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm4
2241 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm4
2242 ; AVX1-NEXT: vmovddup {{.*#+}} xmm6 = [255,255]
2243 ; AVX1-NEXT: # xmm6 = mem[0,0]
2244 ; AVX1-NEXT: vblendvpd %xmm4, %xmm3, %xmm6, %xmm3
2245 ; AVX1-NEXT: vblendvpd %xmm8, %xmm2, %xmm6, %xmm2
2246 ; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2
2247 ; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm6, %xmm1
2248 ; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm6, %xmm0
2249 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
2250 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
2251 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2254 ; AVX2-LABEL: trunc_usat_v8i64_v8i8:
2256 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
2257 ; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1
2258 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [255,255,255,255]
2259 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2260 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm4
2261 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
2262 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
2263 ; AVX2-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
2264 ; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm3
2265 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
2266 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
2267 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
2268 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
2269 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
2270 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
2271 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2272 ; AVX2-NEXT: vzeroupper
2275 ; AVX512-LABEL: trunc_usat_v8i64_v8i8:
2277 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
2278 ; AVX512-NEXT: vpmovusqb %zmm0, %xmm0
2279 ; AVX512-NEXT: vzeroupper
2282 ; SKX-LABEL: trunc_usat_v8i64_v8i8:
2284 ; SKX-NEXT: vmovdqa64 (%rdi), %zmm0
2285 ; SKX-NEXT: vpmovusqb %zmm0, %xmm0
2286 ; SKX-NEXT: vzeroupper
2288 %a0 = load <8 x i64>, ptr %p0
2289 %1 = icmp ult <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
2290 %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>
2291 %3 = trunc <8 x i64> %2 to <8 x i8>
2295 define void @trunc_usat_v8i64_v8i8_store(ptr %p0, ptr%p1) {
2296 ; SSE2-SSSE3-LABEL: trunc_usat_v8i64_v8i8_store:
2297 ; SSE2-SSSE3: # %bb.0:
2298 ; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm6
2299 ; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm5
2300 ; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm0
2301 ; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm4
2302 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [255,255]
2303 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
2304 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm7
2305 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm7
2306 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
2307 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483903,2147483903,2147483903,2147483903]
2308 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm9
2309 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm8, %xmm9
2310 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
2311 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm7
2312 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm7
2313 ; SSE2-SSSE3-NEXT: pand %xmm7, %xmm5
2314 ; SSE2-SSSE3-NEXT: pandn %xmm1, %xmm7
2315 ; SSE2-SSSE3-NEXT: por %xmm5, %xmm7
2316 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm5
2317 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm5
2318 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm5[0,0,2,2]
2319 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm9
2320 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm8, %xmm9
2321 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2322 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm5
2323 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm5
2324 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm6
2325 ; SSE2-SSSE3-NEXT: pandn %xmm1, %xmm5
2326 ; SSE2-SSSE3-NEXT: por %xmm6, %xmm5
2327 ; SSE2-SSSE3-NEXT: packuswb %xmm7, %xmm5
2328 ; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm6
2329 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm6
2330 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2331 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm8
2332 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm8
2333 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2334 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm6
2335 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm6
2336 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm4
2337 ; SSE2-SSSE3-NEXT: pandn %xmm1, %xmm6
2338 ; SSE2-SSSE3-NEXT: por %xmm4, %xmm6
2339 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm4
2340 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm4
2341 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
2342 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm3
2343 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2344 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm4
2345 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm4
2346 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm0
2347 ; SSE2-SSSE3-NEXT: pandn %xmm1, %xmm4
2348 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm4
2349 ; SSE2-SSSE3-NEXT: packuswb %xmm6, %xmm4
2350 ; SSE2-SSSE3-NEXT: packuswb %xmm4, %xmm5
2351 ; SSE2-SSSE3-NEXT: packuswb %xmm5, %xmm5
2352 ; SSE2-SSSE3-NEXT: movq %xmm5, (%rsi)
2353 ; SSE2-SSSE3-NEXT: retq
2355 ; SSE41-LABEL: trunc_usat_v8i64_v8i8_store:
2357 ; SSE41-NEXT: movdqa (%rdi), %xmm8
2358 ; SSE41-NEXT: movdqa 16(%rdi), %xmm7
2359 ; SSE41-NEXT: movdqa 32(%rdi), %xmm3
2360 ; SSE41-NEXT: movdqa 48(%rdi), %xmm6
2361 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [255,255]
2362 ; SSE41-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
2363 ; SSE41-NEXT: movdqa %xmm7, %xmm0
2364 ; SSE41-NEXT: pxor %xmm5, %xmm0
2365 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259711,9223372039002259711]
2366 ; SSE41-NEXT: movdqa %xmm4, %xmm9
2367 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm9
2368 ; SSE41-NEXT: pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]
2369 ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [2147483903,2147483903,2147483903,2147483903]
2370 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2371 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm0
2372 ; SSE41-NEXT: pand %xmm9, %xmm0
2373 ; SSE41-NEXT: movapd %xmm2, %xmm9
2374 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm9
2375 ; SSE41-NEXT: movdqa %xmm8, %xmm0
2376 ; SSE41-NEXT: pxor %xmm5, %xmm0
2377 ; SSE41-NEXT: movdqa %xmm4, %xmm7
2378 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm7
2379 ; SSE41-NEXT: pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]
2380 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2381 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm0
2382 ; SSE41-NEXT: pand %xmm7, %xmm0
2383 ; SSE41-NEXT: movapd %xmm2, %xmm7
2384 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm7
2385 ; SSE41-NEXT: packusdw %xmm9, %xmm7
2386 ; SSE41-NEXT: movdqa %xmm6, %xmm0
2387 ; SSE41-NEXT: pxor %xmm5, %xmm0
2388 ; SSE41-NEXT: movdqa %xmm4, %xmm8
2389 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm8
2390 ; SSE41-NEXT: pshufd {{.*#+}} xmm9 = xmm0[0,0,2,2]
2391 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2392 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm0
2393 ; SSE41-NEXT: pand %xmm8, %xmm0
2394 ; SSE41-NEXT: movapd %xmm2, %xmm8
2395 ; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm8
2396 ; SSE41-NEXT: pxor %xmm3, %xmm5
2397 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm4
2398 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
2399 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
2400 ; SSE41-NEXT: pand %xmm4, %xmm1
2401 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2402 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm2
2403 ; SSE41-NEXT: packusdw %xmm8, %xmm2
2404 ; SSE41-NEXT: packusdw %xmm2, %xmm7
2405 ; SSE41-NEXT: packuswb %xmm7, %xmm7
2406 ; SSE41-NEXT: movq %xmm7, (%rsi)
2409 ; AVX1-LABEL: trunc_usat_v8i64_v8i8_store:
2411 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
2412 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
2413 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2
2414 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3
2415 ; AVX1-NEXT: vmovddup {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
2416 ; AVX1-NEXT: # xmm4 = mem[0,0]
2417 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm5
2418 ; AVX1-NEXT: vmovddup {{.*#+}} xmm6 = [9223372036854776063,9223372036854776063]
2419 ; AVX1-NEXT: # xmm6 = mem[0,0]
2420 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5
2421 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm7
2422 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm6, %xmm7
2423 ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm8
2424 ; AVX1-NEXT: vpcmpgtq %xmm8, %xmm6, %xmm8
2425 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm4
2426 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm4
2427 ; AVX1-NEXT: vmovddup {{.*#+}} xmm6 = [255,255]
2428 ; AVX1-NEXT: # xmm6 = mem[0,0]
2429 ; AVX1-NEXT: vblendvpd %xmm4, %xmm3, %xmm6, %xmm3
2430 ; AVX1-NEXT: vblendvpd %xmm8, %xmm2, %xmm6, %xmm2
2431 ; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2
2432 ; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm6, %xmm1
2433 ; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm6, %xmm0
2434 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
2435 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
2436 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2437 ; AVX1-NEXT: vmovq %xmm0, (%rsi)
2440 ; AVX2-LABEL: trunc_usat_v8i64_v8i8_store:
2442 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
2443 ; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1
2444 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [255,255,255,255]
2445 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2446 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm4
2447 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
2448 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
2449 ; AVX2-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
2450 ; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm3
2451 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
2452 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
2453 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
2454 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
2455 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
2456 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
2457 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2458 ; AVX2-NEXT: vmovq %xmm0, (%rsi)
2459 ; AVX2-NEXT: vzeroupper
2462 ; AVX512-LABEL: trunc_usat_v8i64_v8i8_store:
2464 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
2465 ; AVX512-NEXT: vpmovusqb %zmm0, (%rsi)
2466 ; AVX512-NEXT: vzeroupper
2469 ; SKX-LABEL: trunc_usat_v8i64_v8i8_store:
2471 ; SKX-NEXT: vmovdqa64 (%rdi), %zmm0
2472 ; SKX-NEXT: vpmovusqb %zmm0, (%rsi)
2473 ; SKX-NEXT: vzeroupper
2475 %a0 = load <8 x i64>, ptr %p0
2476 %1 = icmp ult <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
2477 %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>
2478 %3 = trunc <8 x i64> %2 to <8 x i8>
2479 store <8 x i8> %3, ptr%p1
2483 define <16 x i8> @trunc_usat_v16i64_v16i8(ptr %p0) {
2484 ; SSE2-SSSE3-LABEL: trunc_usat_v16i64_v16i8:
2485 ; SSE2-SSSE3: # %bb.0:
2486 ; SSE2-SSSE3-NEXT: movdqa 96(%rdi), %xmm1
2487 ; SSE2-SSSE3-NEXT: movdqa 112(%rdi), %xmm4
2488 ; SSE2-SSSE3-NEXT: movdqa 64(%rdi), %xmm6
2489 ; SSE2-SSSE3-NEXT: movdqa 80(%rdi), %xmm7
2490 ; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm10
2491 ; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm0
2492 ; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm8
2493 ; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm9
2494 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,255]
2495 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259456,9223372039002259456]
2496 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm11
2497 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm11
2498 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
2499 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
2500 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm13
2501 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm12, %xmm13
2502 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]
2503 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm11
2504 ; SSE2-SSSE3-NEXT: pand %xmm13, %xmm11
2505 ; SSE2-SSSE3-NEXT: pand %xmm11, %xmm0
2506 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm11
2507 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm11
2508 ; SSE2-SSSE3-NEXT: movdqa %xmm10, %xmm0
2509 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm0
2510 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm0[0,0,2,2]
2511 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm13
2512 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm12, %xmm13
2513 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2514 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm0
2515 ; SSE2-SSSE3-NEXT: pand %xmm13, %xmm0
2516 ; SSE2-SSSE3-NEXT: pand %xmm0, %xmm10
2517 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm0
2518 ; SSE2-SSSE3-NEXT: por %xmm10, %xmm0
2519 ; SSE2-SSSE3-NEXT: packuswb %xmm11, %xmm0
2520 ; SSE2-SSSE3-NEXT: movdqa %xmm9, %xmm10
2521 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm10
2522 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
2523 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm12
2524 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm11, %xmm12
2525 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
2526 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm10
2527 ; SSE2-SSSE3-NEXT: pand %xmm12, %xmm10
2528 ; SSE2-SSSE3-NEXT: pand %xmm10, %xmm9
2529 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm10
2530 ; SSE2-SSSE3-NEXT: por %xmm9, %xmm10
2531 ; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm9
2532 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm9
2533 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm9[0,0,2,2]
2534 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm12
2535 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm11, %xmm12
2536 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
2537 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm9
2538 ; SSE2-SSSE3-NEXT: pand %xmm12, %xmm9
2539 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm8
2540 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm9
2541 ; SSE2-SSSE3-NEXT: por %xmm8, %xmm9
2542 ; SSE2-SSSE3-NEXT: packuswb %xmm10, %xmm9
2543 ; SSE2-SSSE3-NEXT: packuswb %xmm9, %xmm0
2544 ; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm8
2545 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm8
2546 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
2547 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm10
2548 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm9, %xmm10
2549 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
2550 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm8
2551 ; SSE2-SSSE3-NEXT: pand %xmm10, %xmm8
2552 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm7
2553 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm8
2554 ; SSE2-SSSE3-NEXT: por %xmm7, %xmm8
2555 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm7
2556 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm7
2557 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm7[0,0,2,2]
2558 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm10
2559 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm9, %xmm10
2560 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
2561 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm7
2562 ; SSE2-SSSE3-NEXT: pand %xmm10, %xmm7
2563 ; SSE2-SSSE3-NEXT: pand %xmm7, %xmm6
2564 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm7
2565 ; SSE2-SSSE3-NEXT: por %xmm6, %xmm7
2566 ; SSE2-SSSE3-NEXT: packuswb %xmm8, %xmm7
2567 ; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm6
2568 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm6
2569 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
2570 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm9
2571 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm8, %xmm9
2572 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2573 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm6
2574 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm6
2575 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm4
2576 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm6
2577 ; SSE2-SSSE3-NEXT: por %xmm4, %xmm6
2578 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm4
2579 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm4
2580 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2]
2581 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm8, %xmm5
2582 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2583 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm4
2584 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm4
2585 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm1
2586 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm4
2587 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm4
2588 ; SSE2-SSSE3-NEXT: packuswb %xmm6, %xmm4
2589 ; SSE2-SSSE3-NEXT: packuswb %xmm4, %xmm7
2590 ; SSE2-SSSE3-NEXT: packuswb %xmm7, %xmm0
2591 ; SSE2-SSSE3-NEXT: retq
2593 ; SSE41-LABEL: trunc_usat_v16i64_v16i8:
2595 ; SSE41-NEXT: movdqa 96(%rdi), %xmm3
2596 ; SSE41-NEXT: movdqa 112(%rdi), %xmm5
2597 ; SSE41-NEXT: movdqa 64(%rdi), %xmm8
2598 ; SSE41-NEXT: movdqa 80(%rdi), %xmm9
2599 ; SSE41-NEXT: movdqa (%rdi), %xmm12
2600 ; SSE41-NEXT: movdqa 16(%rdi), %xmm2
2601 ; SSE41-NEXT: movdqa 32(%rdi), %xmm10
2602 ; SSE41-NEXT: movdqa 48(%rdi), %xmm11
2603 ; SSE41-NEXT: movapd {{.*#+}} xmm4 = [255,255]
2604 ; SSE41-NEXT: movdqa {{.*#+}} xmm7 = [9223372039002259456,9223372039002259456]
2605 ; SSE41-NEXT: movdqa %xmm2, %xmm0
2606 ; SSE41-NEXT: pxor %xmm7, %xmm0
2607 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259711,9223372039002259711]
2608 ; SSE41-NEXT: movdqa %xmm6, %xmm13
2609 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm13
2610 ; SSE41-NEXT: pshufd {{.*#+}} xmm14 = xmm0[0,0,2,2]
2611 ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [2147483903,2147483903,2147483903,2147483903]
2612 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2613 ; SSE41-NEXT: pcmpgtd %xmm14, %xmm0
2614 ; SSE41-NEXT: pand %xmm13, %xmm0
2615 ; SSE41-NEXT: movapd %xmm4, %xmm13
2616 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm13
2617 ; SSE41-NEXT: movdqa %xmm12, %xmm0
2618 ; SSE41-NEXT: pxor %xmm7, %xmm0
2619 ; SSE41-NEXT: movdqa %xmm6, %xmm2
2620 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
2621 ; SSE41-NEXT: pshufd {{.*#+}} xmm14 = xmm0[0,0,2,2]
2622 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2623 ; SSE41-NEXT: pcmpgtd %xmm14, %xmm0
2624 ; SSE41-NEXT: pand %xmm2, %xmm0
2625 ; SSE41-NEXT: movapd %xmm4, %xmm2
2626 ; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm2
2627 ; SSE41-NEXT: packusdw %xmm13, %xmm2
2628 ; SSE41-NEXT: movdqa %xmm11, %xmm0
2629 ; SSE41-NEXT: pxor %xmm7, %xmm0
2630 ; SSE41-NEXT: movdqa %xmm6, %xmm12
2631 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm12
2632 ; SSE41-NEXT: pshufd {{.*#+}} xmm13 = xmm0[0,0,2,2]
2633 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2634 ; SSE41-NEXT: pcmpgtd %xmm13, %xmm0
2635 ; SSE41-NEXT: pand %xmm12, %xmm0
2636 ; SSE41-NEXT: movapd %xmm4, %xmm12
2637 ; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm12
2638 ; SSE41-NEXT: movdqa %xmm10, %xmm0
2639 ; SSE41-NEXT: pxor %xmm7, %xmm0
2640 ; SSE41-NEXT: movdqa %xmm6, %xmm11
2641 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm11
2642 ; SSE41-NEXT: pshufd {{.*#+}} xmm13 = xmm0[0,0,2,2]
2643 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2644 ; SSE41-NEXT: pcmpgtd %xmm13, %xmm0
2645 ; SSE41-NEXT: pand %xmm11, %xmm0
2646 ; SSE41-NEXT: movapd %xmm4, %xmm11
2647 ; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm11
2648 ; SSE41-NEXT: packusdw %xmm12, %xmm11
2649 ; SSE41-NEXT: packusdw %xmm11, %xmm2
2650 ; SSE41-NEXT: movdqa %xmm9, %xmm0
2651 ; SSE41-NEXT: pxor %xmm7, %xmm0
2652 ; SSE41-NEXT: movdqa %xmm6, %xmm10
2653 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm10
2654 ; SSE41-NEXT: pshufd {{.*#+}} xmm11 = xmm0[0,0,2,2]
2655 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2656 ; SSE41-NEXT: pcmpgtd %xmm11, %xmm0
2657 ; SSE41-NEXT: pand %xmm10, %xmm0
2658 ; SSE41-NEXT: movapd %xmm4, %xmm10
2659 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm10
2660 ; SSE41-NEXT: movdqa %xmm8, %xmm0
2661 ; SSE41-NEXT: pxor %xmm7, %xmm0
2662 ; SSE41-NEXT: movdqa %xmm6, %xmm9
2663 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm9
2664 ; SSE41-NEXT: pshufd {{.*#+}} xmm11 = xmm0[0,0,2,2]
2665 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2666 ; SSE41-NEXT: pcmpgtd %xmm11, %xmm0
2667 ; SSE41-NEXT: pand %xmm9, %xmm0
2668 ; SSE41-NEXT: movapd %xmm4, %xmm9
2669 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm9
2670 ; SSE41-NEXT: packusdw %xmm10, %xmm9
2671 ; SSE41-NEXT: movdqa %xmm5, %xmm0
2672 ; SSE41-NEXT: pxor %xmm7, %xmm0
2673 ; SSE41-NEXT: movdqa %xmm6, %xmm8
2674 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm8
2675 ; SSE41-NEXT: pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]
2676 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2677 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm0
2678 ; SSE41-NEXT: pand %xmm8, %xmm0
2679 ; SSE41-NEXT: movapd %xmm4, %xmm8
2680 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm8
2681 ; SSE41-NEXT: pxor %xmm3, %xmm7
2682 ; SSE41-NEXT: pcmpeqd %xmm7, %xmm6
2683 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
2684 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
2685 ; SSE41-NEXT: pand %xmm6, %xmm1
2686 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2687 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm4
2688 ; SSE41-NEXT: packusdw %xmm8, %xmm4
2689 ; SSE41-NEXT: packusdw %xmm4, %xmm9
2690 ; SSE41-NEXT: packuswb %xmm9, %xmm2
2691 ; SSE41-NEXT: movdqa %xmm2, %xmm0
2694 ; AVX1-LABEL: trunc_usat_v16i64_v16i8:
2696 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
2697 ; AVX1-NEXT: vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
2698 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
2699 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2
2700 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3
2701 ; AVX1-NEXT: vmovddup {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
2702 ; AVX1-NEXT: # xmm4 = mem[0,0]
2703 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm5
2704 ; AVX1-NEXT: vmovddup {{.*#+}} xmm6 = [9223372036854776063,9223372036854776063]
2705 ; AVX1-NEXT: # xmm6 = mem[0,0]
2706 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5
2707 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm7
2708 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm6, %xmm7
2709 ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm8
2710 ; AVX1-NEXT: vpcmpgtq %xmm8, %xmm6, %xmm8
2711 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm9
2712 ; AVX1-NEXT: vpcmpgtq %xmm9, %xmm6, %xmm9
2713 ; AVX1-NEXT: vmovdqa 64(%rdi), %xmm10
2714 ; AVX1-NEXT: vpxor %xmm4, %xmm10, %xmm11
2715 ; AVX1-NEXT: vpcmpgtq %xmm11, %xmm6, %xmm11
2716 ; AVX1-NEXT: vmovdqa 80(%rdi), %xmm12
2717 ; AVX1-NEXT: vpxor %xmm4, %xmm12, %xmm13
2718 ; AVX1-NEXT: vpcmpgtq %xmm13, %xmm6, %xmm13
2719 ; AVX1-NEXT: vmovdqa 96(%rdi), %xmm14
2720 ; AVX1-NEXT: vpxor %xmm4, %xmm14, %xmm15
2721 ; AVX1-NEXT: vpcmpgtq %xmm15, %xmm6, %xmm15
2722 ; AVX1-NEXT: vmovdqa 112(%rdi), %xmm0
2723 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm4
2724 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm4
2725 ; AVX1-NEXT: vmovddup {{.*#+}} xmm6 = [255,255]
2726 ; AVX1-NEXT: # xmm6 = mem[0,0]
2727 ; AVX1-NEXT: vblendvpd %xmm4, %xmm0, %xmm6, %xmm0
2728 ; AVX1-NEXT: vblendvpd %xmm15, %xmm14, %xmm6, %xmm4
2729 ; AVX1-NEXT: vblendvpd %xmm13, %xmm12, %xmm6, %xmm12
2730 ; AVX1-NEXT: vblendvpd %xmm11, %xmm10, %xmm6, %xmm10
2731 ; AVX1-NEXT: vblendvpd %xmm9, %xmm3, %xmm6, %xmm3
2732 ; AVX1-NEXT: vblendvpd %xmm8, %xmm2, %xmm6, %xmm2
2733 ; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm6, %xmm1
2734 ; AVX1-NEXT: vblendvpd %xmm5, {{[-0-9]+}}(%r{{[sb]}}p), %xmm6, %xmm5 # 16-byte Folded Reload
2735 ; AVX1-NEXT: vpackusdw %xmm0, %xmm4, %xmm0
2736 ; AVX1-NEXT: vpackusdw %xmm12, %xmm10, %xmm4
2737 ; AVX1-NEXT: vpackusdw %xmm0, %xmm4, %xmm0
2738 ; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2
2739 ; AVX1-NEXT: vpackusdw %xmm1, %xmm5, %xmm1
2740 ; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1
2741 ; AVX1-NEXT: vpackuswb %xmm0, %xmm1, %xmm0
2744 ; AVX2-LABEL: trunc_usat_v16i64_v16i8:
2746 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
2747 ; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1
2748 ; AVX2-NEXT: vmovdqa 64(%rdi), %ymm2
2749 ; AVX2-NEXT: vmovdqa 96(%rdi), %ymm3
2750 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm4 = [255,255,255,255]
2751 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
2752 ; AVX2-NEXT: vpxor %ymm5, %ymm1, %ymm6
2753 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm7 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
2754 ; AVX2-NEXT: vpcmpgtq %ymm6, %ymm7, %ymm6
2755 ; AVX2-NEXT: vblendvpd %ymm6, %ymm1, %ymm4, %ymm1
2756 ; AVX2-NEXT: vpxor %ymm5, %ymm0, %ymm6
2757 ; AVX2-NEXT: vpcmpgtq %ymm6, %ymm7, %ymm6
2758 ; AVX2-NEXT: vblendvpd %ymm6, %ymm0, %ymm4, %ymm0
2759 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
2760 ; AVX2-NEXT: vpxor %ymm5, %ymm3, %ymm1
2761 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm7, %ymm1
2762 ; AVX2-NEXT: vblendvpd %ymm1, %ymm3, %ymm4, %ymm1
2763 ; AVX2-NEXT: vpxor %ymm5, %ymm2, %ymm3
2764 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm7, %ymm3
2765 ; AVX2-NEXT: vblendvpd %ymm3, %ymm2, %ymm4, %ymm2
2766 ; AVX2-NEXT: vpackusdw %ymm1, %ymm2, %ymm1
2767 ; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
2768 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2769 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
2770 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
2771 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
2772 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
2773 ; AVX2-NEXT: vzeroupper
2776 ; AVX512-LABEL: trunc_usat_v16i64_v16i8:
2778 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
2779 ; AVX512-NEXT: vmovdqa64 64(%rdi), %zmm1
2780 ; AVX512-NEXT: vpmovusqb %zmm1, %xmm1
2781 ; AVX512-NEXT: vpmovusqb %zmm0, %xmm0
2782 ; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2783 ; AVX512-NEXT: vzeroupper
2786 ; SKX-LABEL: trunc_usat_v16i64_v16i8:
2788 ; SKX-NEXT: vmovdqa64 (%rdi), %zmm0
2789 ; SKX-NEXT: vmovdqa64 64(%rdi), %zmm1
2790 ; SKX-NEXT: vpmovusqb %zmm1, %xmm1
2791 ; SKX-NEXT: vpmovusqb %zmm0, %xmm0
2792 ; SKX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2793 ; SKX-NEXT: vzeroupper
2795 %a0 = load <16 x i64>, ptr %p0
2796 %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>
2797 %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>
2798 %3 = trunc <16 x i64> %2 to <16 x i8>
2802 define <4 x i8> @trunc_usat_v4i32_v4i8(<4 x i32> %a0) {
2803 ; SSE2-SSSE3-LABEL: trunc_usat_v4i32_v4i8:
2804 ; SSE2-SSSE3: # %bb.0:
2805 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
2806 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm1
2807 ; SSE2-SSSE3-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2808 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm2
2809 ; SSE2-SSSE3-NEXT: pandn %xmm0, %xmm2
2810 ; SSE2-SSSE3-NEXT: psrld $24, %xmm1
2811 ; SSE2-SSSE3-NEXT: por %xmm2, %xmm1
2812 ; SSE2-SSSE3-NEXT: packuswb %xmm1, %xmm1
2813 ; SSE2-SSSE3-NEXT: packuswb %xmm1, %xmm1
2814 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm0
2815 ; SSE2-SSSE3-NEXT: retq
2817 ; SSE41-LABEL: trunc_usat_v4i32_v4i8:
2819 ; SSE41-NEXT: pminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2820 ; SSE41-NEXT: packusdw %xmm0, %xmm0
2821 ; SSE41-NEXT: packuswb %xmm0, %xmm0
2824 ; AVX1-LABEL: trunc_usat_v4i32_v4i8:
2826 ; AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2827 ; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
2828 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2831 ; AVX2-SLOW-LABEL: trunc_usat_v4i32_v4i8:
2832 ; AVX2-SLOW: # %bb.0:
2833 ; AVX2-SLOW-NEXT: vpbroadcastd {{.*#+}} xmm1 = [255,255,255,255]
2834 ; AVX2-SLOW-NEXT: vpminud %xmm1, %xmm0, %xmm0
2835 ; AVX2-SLOW-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
2836 ; AVX2-SLOW-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2837 ; AVX2-SLOW-NEXT: retq
2839 ; AVX2-FAST-LABEL: trunc_usat_v4i32_v4i8:
2840 ; AVX2-FAST: # %bb.0:
2841 ; AVX2-FAST-NEXT: vpbroadcastd {{.*#+}} xmm1 = [255,255,255,255]
2842 ; AVX2-FAST-NEXT: vpminud %xmm1, %xmm0, %xmm0
2843 ; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,0,4,8,12,0,4,8,12,0,4,8,12]
2844 ; AVX2-FAST-NEXT: retq
2846 ; AVX512F-LABEL: trunc_usat_v4i32_v4i8:
2848 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
2849 ; AVX512F-NEXT: vpmovusdb %zmm0, %xmm0
2850 ; AVX512F-NEXT: vzeroupper
2851 ; AVX512F-NEXT: retq
2853 ; AVX512VL-LABEL: trunc_usat_v4i32_v4i8:
2854 ; AVX512VL: # %bb.0:
2855 ; AVX512VL-NEXT: vpmovusdb %xmm0, %xmm0
2856 ; AVX512VL-NEXT: retq
2858 ; AVX512BW-LABEL: trunc_usat_v4i32_v4i8:
2859 ; AVX512BW: # %bb.0:
2860 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
2861 ; AVX512BW-NEXT: vpmovusdb %zmm0, %xmm0
2862 ; AVX512BW-NEXT: vzeroupper
2863 ; AVX512BW-NEXT: retq
2865 ; AVX512BWVL-LABEL: trunc_usat_v4i32_v4i8:
2866 ; AVX512BWVL: # %bb.0:
2867 ; AVX512BWVL-NEXT: vpmovusdb %xmm0, %xmm0
2868 ; AVX512BWVL-NEXT: retq
2870 ; SKX-LABEL: trunc_usat_v4i32_v4i8:
2872 ; SKX-NEXT: vpmovusdb %xmm0, %xmm0
2874 %1 = icmp ult <4 x i32> %a0, <i32 255, i32 255, i32 255, i32 255>
2875 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 255, i32 255, i32 255, i32 255>
2876 %3 = trunc <4 x i32> %2 to <4 x i8>
2880 define void @trunc_usat_v4i32_v4i8_store(<4 x i32> %a0, ptr%p1) {
2881 ; SSE2-SSSE3-LABEL: trunc_usat_v4i32_v4i8_store:
2882 ; SSE2-SSSE3: # %bb.0:
2883 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
2884 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm1
2885 ; SSE2-SSSE3-NEXT: pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2886 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm2
2887 ; SSE2-SSSE3-NEXT: pandn %xmm0, %xmm2
2888 ; SSE2-SSSE3-NEXT: psrld $24, %xmm1
2889 ; SSE2-SSSE3-NEXT: por %xmm2, %xmm1
2890 ; SSE2-SSSE3-NEXT: packuswb %xmm1, %xmm1
2891 ; SSE2-SSSE3-NEXT: packuswb %xmm1, %xmm1
2892 ; SSE2-SSSE3-NEXT: movd %xmm1, (%rdi)
2893 ; SSE2-SSSE3-NEXT: retq
2895 ; SSE41-LABEL: trunc_usat_v4i32_v4i8_store:
2897 ; SSE41-NEXT: pminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2898 ; SSE41-NEXT: packusdw %xmm0, %xmm0
2899 ; SSE41-NEXT: packuswb %xmm0, %xmm0
2900 ; SSE41-NEXT: movd %xmm0, (%rdi)
2903 ; AVX1-LABEL: trunc_usat_v4i32_v4i8_store:
2905 ; AVX1-NEXT: vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2906 ; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
2907 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2908 ; AVX1-NEXT: vmovd %xmm0, (%rdi)
2911 ; AVX2-SLOW-LABEL: trunc_usat_v4i32_v4i8_store:
2912 ; AVX2-SLOW: # %bb.0:
2913 ; AVX2-SLOW-NEXT: vpbroadcastd {{.*#+}} xmm1 = [255,255,255,255]
2914 ; AVX2-SLOW-NEXT: vpminud %xmm1, %xmm0, %xmm0
2915 ; AVX2-SLOW-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
2916 ; AVX2-SLOW-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2917 ; AVX2-SLOW-NEXT: vmovd %xmm0, (%rdi)
2918 ; AVX2-SLOW-NEXT: retq
2920 ; AVX2-FAST-LABEL: trunc_usat_v4i32_v4i8_store:
2921 ; AVX2-FAST: # %bb.0:
2922 ; AVX2-FAST-NEXT: vpbroadcastd {{.*#+}} xmm1 = [255,255,255,255]
2923 ; AVX2-FAST-NEXT: vpminud %xmm1, %xmm0, %xmm0
2924 ; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
2925 ; AVX2-FAST-NEXT: vmovd %xmm0, (%rdi)
2926 ; AVX2-FAST-NEXT: retq
2928 ; AVX512F-LABEL: trunc_usat_v4i32_v4i8_store:
2930 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
2931 ; AVX512F-NEXT: vpmovusdb %zmm0, %xmm0
2932 ; AVX512F-NEXT: vmovd %xmm0, (%rdi)
2933 ; AVX512F-NEXT: vzeroupper
2934 ; AVX512F-NEXT: retq
2936 ; AVX512VL-LABEL: trunc_usat_v4i32_v4i8_store:
2937 ; AVX512VL: # %bb.0:
2938 ; AVX512VL-NEXT: vpmovusdb %xmm0, (%rdi)
2939 ; AVX512VL-NEXT: retq
2941 ; AVX512BW-LABEL: trunc_usat_v4i32_v4i8_store:
2942 ; AVX512BW: # %bb.0:
2943 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
2944 ; AVX512BW-NEXT: vpmovusdb %zmm0, %xmm0
2945 ; AVX512BW-NEXT: vmovd %xmm0, (%rdi)
2946 ; AVX512BW-NEXT: vzeroupper
2947 ; AVX512BW-NEXT: retq
2949 ; AVX512BWVL-LABEL: trunc_usat_v4i32_v4i8_store:
2950 ; AVX512BWVL: # %bb.0:
2951 ; AVX512BWVL-NEXT: vpmovusdb %xmm0, (%rdi)
2952 ; AVX512BWVL-NEXT: retq
2954 ; SKX-LABEL: trunc_usat_v4i32_v4i8_store:
2956 ; SKX-NEXT: vpmovusdb %xmm0, (%rdi)
2958 %1 = icmp ult <4 x i32> %a0, <i32 255, i32 255, i32 255, i32 255>
2959 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 255, i32 255, i32 255, i32 255>
2960 %3 = trunc <4 x i32> %2 to <4 x i8>
2961 store <4 x i8> %3, ptr%p1
2965 define <8 x i8> @trunc_usat_v8i32_v8i8(<8 x i32> %a0) {
2966 ; SSE2-SSSE3-LABEL: trunc_usat_v8i32_v8i8:
2967 ; SSE2-SSSE3: # %bb.0:
2968 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
2969 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
2970 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm4
2971 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm4
2972 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
2973 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm6
2974 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
2975 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm1
2976 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm6
2977 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm6
2978 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm3
2979 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
2980 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm0
2981 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm5
2982 ; SSE2-SSSE3-NEXT: por %xmm5, %xmm0
2983 ; SSE2-SSSE3-NEXT: packuswb %xmm6, %xmm0
2984 ; SSE2-SSSE3-NEXT: packuswb %xmm0, %xmm0
2985 ; SSE2-SSSE3-NEXT: retq
2987 ; SSE41-LABEL: trunc_usat_v8i32_v8i8:
2989 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
2990 ; SSE41-NEXT: pminud %xmm2, %xmm1
2991 ; SSE41-NEXT: pminud %xmm2, %xmm0
2992 ; SSE41-NEXT: packusdw %xmm1, %xmm0
2993 ; SSE41-NEXT: packuswb %xmm0, %xmm0
2996 ; AVX1-LABEL: trunc_usat_v8i32_v8i8:
2998 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
2999 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [255,255,255,255]
3000 ; AVX1-NEXT: vpminud %xmm2, %xmm1, %xmm1
3001 ; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0
3002 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
3003 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3004 ; AVX1-NEXT: vzeroupper
3007 ; AVX2-LABEL: trunc_usat_v8i32_v8i8:
3009 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
3010 ; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0
3011 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
3012 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
3013 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3014 ; AVX2-NEXT: vzeroupper
3017 ; AVX512F-LABEL: trunc_usat_v8i32_v8i8:
3019 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
3020 ; AVX512F-NEXT: vpmovusdb %zmm0, %xmm0
3021 ; AVX512F-NEXT: vzeroupper
3022 ; AVX512F-NEXT: retq
3024 ; AVX512VL-LABEL: trunc_usat_v8i32_v8i8:
3025 ; AVX512VL: # %bb.0:
3026 ; AVX512VL-NEXT: vpmovusdb %ymm0, %xmm0
3027 ; AVX512VL-NEXT: vzeroupper
3028 ; AVX512VL-NEXT: retq
3030 ; AVX512BW-LABEL: trunc_usat_v8i32_v8i8:
3031 ; AVX512BW: # %bb.0:
3032 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
3033 ; AVX512BW-NEXT: vpmovusdb %zmm0, %xmm0
3034 ; AVX512BW-NEXT: vzeroupper
3035 ; AVX512BW-NEXT: retq
3037 ; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i8:
3038 ; AVX512BWVL: # %bb.0:
3039 ; AVX512BWVL-NEXT: vpmovusdb %ymm0, %xmm0
3040 ; AVX512BWVL-NEXT: vzeroupper
3041 ; AVX512BWVL-NEXT: retq
3043 ; SKX-LABEL: trunc_usat_v8i32_v8i8:
3045 ; SKX-NEXT: vpmovusdb %ymm0, %xmm0
3046 ; SKX-NEXT: vzeroupper
3048 %1 = icmp ult <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
3049 %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>
3050 %3 = trunc <8 x i32> %2 to <8 x i8>
3054 define void @trunc_usat_v8i32_v8i8_store(<8 x i32> %a0, ptr%p1) {
3055 ; SSE2-SSSE3-LABEL: trunc_usat_v8i32_v8i8_store:
3056 ; SSE2-SSSE3: # %bb.0:
3057 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
3058 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
3059 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm4
3060 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm4
3061 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
3062 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm6
3063 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
3064 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm1
3065 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm6
3066 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm6
3067 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm3
3068 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
3069 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm0
3070 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm5
3071 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm5
3072 ; SSE2-SSSE3-NEXT: packuswb %xmm6, %xmm5
3073 ; SSE2-SSSE3-NEXT: packuswb %xmm5, %xmm5
3074 ; SSE2-SSSE3-NEXT: movq %xmm5, (%rdi)
3075 ; SSE2-SSSE3-NEXT: retq
3077 ; SSE41-LABEL: trunc_usat_v8i32_v8i8_store:
3079 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
3080 ; SSE41-NEXT: pminud %xmm2, %xmm1
3081 ; SSE41-NEXT: pminud %xmm2, %xmm0
3082 ; SSE41-NEXT: packusdw %xmm1, %xmm0
3083 ; SSE41-NEXT: packuswb %xmm0, %xmm0
3084 ; SSE41-NEXT: movq %xmm0, (%rdi)
3087 ; AVX1-LABEL: trunc_usat_v8i32_v8i8_store:
3089 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
3090 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [255,255,255,255]
3091 ; AVX1-NEXT: vpminud %xmm2, %xmm1, %xmm1
3092 ; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0
3093 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
3094 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3095 ; AVX1-NEXT: vmovq %xmm0, (%rdi)
3096 ; AVX1-NEXT: vzeroupper
3099 ; AVX2-LABEL: trunc_usat_v8i32_v8i8_store:
3101 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
3102 ; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0
3103 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
3104 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
3105 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3106 ; AVX2-NEXT: vmovq %xmm0, (%rdi)
3107 ; AVX2-NEXT: vzeroupper
3110 ; AVX512F-LABEL: trunc_usat_v8i32_v8i8_store:
3112 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
3113 ; AVX512F-NEXT: vpmovusdb %zmm0, %xmm0
3114 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
3115 ; AVX512F-NEXT: vzeroupper
3116 ; AVX512F-NEXT: retq
3118 ; AVX512VL-LABEL: trunc_usat_v8i32_v8i8_store:
3119 ; AVX512VL: # %bb.0:
3120 ; AVX512VL-NEXT: vpmovusdb %ymm0, (%rdi)
3121 ; AVX512VL-NEXT: vzeroupper
3122 ; AVX512VL-NEXT: retq
3124 ; AVX512BW-LABEL: trunc_usat_v8i32_v8i8_store:
3125 ; AVX512BW: # %bb.0:
3126 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
3127 ; AVX512BW-NEXT: vpmovusdb %zmm0, %xmm0
3128 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
3129 ; AVX512BW-NEXT: vzeroupper
3130 ; AVX512BW-NEXT: retq
3132 ; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i8_store:
3133 ; AVX512BWVL: # %bb.0:
3134 ; AVX512BWVL-NEXT: vpmovusdb %ymm0, (%rdi)
3135 ; AVX512BWVL-NEXT: vzeroupper
3136 ; AVX512BWVL-NEXT: retq
3138 ; SKX-LABEL: trunc_usat_v8i32_v8i8_store:
3140 ; SKX-NEXT: vpmovusdb %ymm0, (%rdi)
3141 ; SKX-NEXT: vzeroupper
3143 %1 = icmp ult <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
3144 %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>
3145 %3 = trunc <8 x i32> %2 to <8 x i8>
3146 store <8 x i8> %3, ptr%p1
3150 define <16 x i8> @trunc_usat_v16i32_v16i8(ptr %p0) {
3151 ; SSE2-SSSE3-LABEL: trunc_usat_v16i32_v16i8:
3152 ; SSE2-SSSE3: # %bb.0:
3153 ; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm6
3154 ; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm0
3155 ; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm1
3156 ; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm5
3157 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,255]
3158 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
3159 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm7
3160 ; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm7
3161 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483903,2147483903,2147483903,2147483903]
3162 ; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm8
3163 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm8
3164 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm0
3165 ; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm8
3166 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm8
3167 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm7
3168 ; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm7
3169 ; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm0
3170 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm0
3171 ; SSE2-SSSE3-NEXT: pand %xmm0, %xmm6
3172 ; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm0
3173 ; SSE2-SSSE3-NEXT: por %xmm6, %xmm0
3174 ; SSE2-SSSE3-NEXT: packuswb %xmm8, %xmm0
3175 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm6
3176 ; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm6
3177 ; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm7
3178 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm6, %xmm7
3179 ; SSE2-SSSE3-NEXT: pand %xmm7, %xmm5
3180 ; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm7
3181 ; SSE2-SSSE3-NEXT: por %xmm5, %xmm7
3182 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm4
3183 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm2
3184 ; SSE2-SSSE3-NEXT: pand %xmm2, %xmm1
3185 ; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm2
3186 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm2
3187 ; SSE2-SSSE3-NEXT: packuswb %xmm7, %xmm2
3188 ; SSE2-SSSE3-NEXT: packuswb %xmm2, %xmm0
3189 ; SSE2-SSSE3-NEXT: retq
3191 ; SSE41-LABEL: trunc_usat_v16i32_v16i8:
3193 ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [255,255,255,255]
3194 ; SSE41-NEXT: movdqa 16(%rdi), %xmm2
3195 ; SSE41-NEXT: pminud %xmm1, %xmm2
3196 ; SSE41-NEXT: movdqa (%rdi), %xmm0
3197 ; SSE41-NEXT: pminud %xmm1, %xmm0
3198 ; SSE41-NEXT: packusdw %xmm2, %xmm0
3199 ; SSE41-NEXT: movdqa 48(%rdi), %xmm2
3200 ; SSE41-NEXT: pminud %xmm1, %xmm2
3201 ; SSE41-NEXT: pminud 32(%rdi), %xmm1
3202 ; SSE41-NEXT: packusdw %xmm2, %xmm1
3203 ; SSE41-NEXT: packuswb %xmm1, %xmm0
3206 ; AVX1-LABEL: trunc_usat_v16i32_v16i8:
3208 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm0 = [255,255,255,255]
3209 ; AVX1-NEXT: vpminud 16(%rdi), %xmm0, %xmm1
3210 ; AVX1-NEXT: vpminud (%rdi), %xmm0, %xmm2
3211 ; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm1
3212 ; AVX1-NEXT: vpminud 48(%rdi), %xmm0, %xmm2
3213 ; AVX1-NEXT: vpminud 32(%rdi), %xmm0, %xmm0
3214 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
3215 ; AVX1-NEXT: vpackuswb %xmm0, %xmm1, %xmm0
3218 ; AVX2-LABEL: trunc_usat_v16i32_v16i8:
3220 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255]
3221 ; AVX2-NEXT: vpminud 32(%rdi), %ymm0, %ymm1
3222 ; AVX2-NEXT: vpminud (%rdi), %ymm0, %ymm0
3223 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
3224 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
3225 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
3226 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
3227 ; AVX2-NEXT: vzeroupper
3230 ; AVX512-LABEL: trunc_usat_v16i32_v16i8:
3232 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
3233 ; AVX512-NEXT: vpmovusdb %zmm0, %xmm0
3234 ; AVX512-NEXT: vzeroupper
3237 ; SKX-LABEL: trunc_usat_v16i32_v16i8:
3239 ; SKX-NEXT: vmovdqa64 (%rdi), %zmm0
3240 ; SKX-NEXT: vpmovusdb %zmm0, %xmm0
3241 ; SKX-NEXT: vzeroupper
3243 %a0 = load <16 x i32>, ptr %p0
3244 %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>
3245 %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>
3246 %3 = trunc <16 x i32> %2 to <16 x i8>
3250 define void @trunc_usat_v16i32_v16i8_store(ptr %p0, ptr %p1) {
3251 ; SSE2-SSSE3-LABEL: trunc_usat_v16i32_v16i8_store:
3252 ; SSE2-SSSE3: # %bb.0:
3253 ; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm6
3254 ; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm5
3255 ; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm0
3256 ; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm4
3257 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
3258 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
3259 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm7
3260 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm7
3261 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483903,2147483903,2147483903,2147483903]
3262 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm8
3263 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm8
3264 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm5
3265 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm8
3266 ; SSE2-SSSE3-NEXT: por %xmm5, %xmm8
3267 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm7
3268 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm7
3269 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm5
3270 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm5
3271 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm6
3272 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm5
3273 ; SSE2-SSSE3-NEXT: por %xmm6, %xmm5
3274 ; SSE2-SSSE3-NEXT: packuswb %xmm8, %xmm5
3275 ; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm6
3276 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm6
3277 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm7
3278 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm6, %xmm7
3279 ; SSE2-SSSE3-NEXT: pand %xmm7, %xmm4
3280 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm7
3281 ; SSE2-SSSE3-NEXT: por %xmm4, %xmm7
3282 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm3
3283 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm1
3284 ; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
3285 ; SSE2-SSSE3-NEXT: pandn %xmm2, %xmm1
3286 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm1
3287 ; SSE2-SSSE3-NEXT: packuswb %xmm7, %xmm1
3288 ; SSE2-SSSE3-NEXT: packuswb %xmm1, %xmm5
3289 ; SSE2-SSSE3-NEXT: movdqa %xmm5, (%rsi)
3290 ; SSE2-SSSE3-NEXT: retq
3292 ; SSE41-LABEL: trunc_usat_v16i32_v16i8_store:
3294 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255]
3295 ; SSE41-NEXT: movdqa 16(%rdi), %xmm1
3296 ; SSE41-NEXT: pminud %xmm0, %xmm1
3297 ; SSE41-NEXT: movdqa (%rdi), %xmm2
3298 ; SSE41-NEXT: pminud %xmm0, %xmm2
3299 ; SSE41-NEXT: packusdw %xmm1, %xmm2
3300 ; SSE41-NEXT: movdqa 48(%rdi), %xmm1
3301 ; SSE41-NEXT: pminud %xmm0, %xmm1
3302 ; SSE41-NEXT: pminud 32(%rdi), %xmm0
3303 ; SSE41-NEXT: packusdw %xmm1, %xmm0
3304 ; SSE41-NEXT: packuswb %xmm0, %xmm2
3305 ; SSE41-NEXT: movdqa %xmm2, (%rsi)
3308 ; AVX1-LABEL: trunc_usat_v16i32_v16i8_store:
3310 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm0 = [255,255,255,255]
3311 ; AVX1-NEXT: vpminud 16(%rdi), %xmm0, %xmm1
3312 ; AVX1-NEXT: vpminud (%rdi), %xmm0, %xmm2
3313 ; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm1
3314 ; AVX1-NEXT: vpminud 48(%rdi), %xmm0, %xmm2
3315 ; AVX1-NEXT: vpminud 32(%rdi), %xmm0, %xmm0
3316 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
3317 ; AVX1-NEXT: vpackuswb %xmm0, %xmm1, %xmm0
3318 ; AVX1-NEXT: vmovdqa %xmm0, (%rsi)
3321 ; AVX2-LABEL: trunc_usat_v16i32_v16i8_store:
3323 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255]
3324 ; AVX2-NEXT: vpminud 32(%rdi), %ymm0, %ymm1
3325 ; AVX2-NEXT: vpminud (%rdi), %ymm0, %ymm0
3326 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
3327 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
3328 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
3329 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
3330 ; AVX2-NEXT: vmovdqa %xmm0, (%rsi)
3331 ; AVX2-NEXT: vzeroupper
3334 ; AVX512-LABEL: trunc_usat_v16i32_v16i8_store:
3336 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
3337 ; AVX512-NEXT: vpmovusdb %zmm0, (%rsi)
3338 ; AVX512-NEXT: vzeroupper
3341 ; SKX-LABEL: trunc_usat_v16i32_v16i8_store:
3343 ; SKX-NEXT: vmovdqa64 (%rdi), %zmm0
3344 ; SKX-NEXT: vpmovusdb %zmm0, (%rsi)
3345 ; SKX-NEXT: vzeroupper
3347 %a0 = load <16 x i32>, ptr %p0
3348 %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>
3349 %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>
3350 %3 = trunc <16 x i32> %2 to <16 x i8>
3351 store <16 x i8> %3, ptr %p1
3355 define <8 x i8> @trunc_usat_v8i16_v8i8(<8 x i16> %a0) {
3356 ; SSE2-SSSE3-LABEL: trunc_usat_v8i16_v8i8:
3357 ; SSE2-SSSE3: # %bb.0:
3358 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm1
3359 ; SSE2-SSSE3-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
3360 ; SSE2-SSSE3-NEXT: psubw %xmm1, %xmm0
3361 ; SSE2-SSSE3-NEXT: packuswb %xmm0, %xmm0
3362 ; SSE2-SSSE3-NEXT: retq
3364 ; SSE41-LABEL: trunc_usat_v8i16_v8i8:
3366 ; SSE41-NEXT: pminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3367 ; SSE41-NEXT: packuswb %xmm0, %xmm0
3370 ; AVX-LABEL: trunc_usat_v8i16_v8i8:
3372 ; AVX-NEXT: vpminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
3373 ; AVX-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3376 ; AVX512F-LABEL: trunc_usat_v8i16_v8i8:
3378 ; AVX512F-NEXT: vpminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
3379 ; AVX512F-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3380 ; AVX512F-NEXT: retq
3382 ; AVX512VL-LABEL: trunc_usat_v8i16_v8i8:
3383 ; AVX512VL: # %bb.0:
3384 ; AVX512VL-NEXT: vpminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
3385 ; AVX512VL-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3386 ; AVX512VL-NEXT: retq
3388 ; AVX512BW-LABEL: trunc_usat_v8i16_v8i8:
3389 ; AVX512BW: # %bb.0:
3390 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
3391 ; AVX512BW-NEXT: vpmovuswb %zmm0, %ymm0
3392 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
3393 ; AVX512BW-NEXT: vzeroupper
3394 ; AVX512BW-NEXT: retq
3396 ; AVX512BWVL-LABEL: trunc_usat_v8i16_v8i8:
3397 ; AVX512BWVL: # %bb.0:
3398 ; AVX512BWVL-NEXT: vpmovuswb %xmm0, %xmm0
3399 ; AVX512BWVL-NEXT: retq
3401 ; SKX-LABEL: trunc_usat_v8i16_v8i8:
3403 ; SKX-NEXT: vpmovuswb %xmm0, %xmm0
3405 %1 = icmp ult <8 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
3406 %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>
3407 %3 = trunc <8 x i16> %2 to <8 x i8>
3411 define void @trunc_usat_v8i16_v8i8_store(<8 x i16> %a0, ptr%p1) {
3412 ; SSE2-SSSE3-LABEL: trunc_usat_v8i16_v8i8_store:
3413 ; SSE2-SSSE3: # %bb.0:
3414 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm1
3415 ; SSE2-SSSE3-NEXT: psubusw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
3416 ; SSE2-SSSE3-NEXT: psubw %xmm1, %xmm0
3417 ; SSE2-SSSE3-NEXT: packuswb %xmm0, %xmm0
3418 ; SSE2-SSSE3-NEXT: movq %xmm0, (%rdi)
3419 ; SSE2-SSSE3-NEXT: retq
3421 ; SSE41-LABEL: trunc_usat_v8i16_v8i8_store:
3423 ; SSE41-NEXT: pminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3424 ; SSE41-NEXT: packuswb %xmm0, %xmm0
3425 ; SSE41-NEXT: movq %xmm0, (%rdi)
3428 ; AVX-LABEL: trunc_usat_v8i16_v8i8_store:
3430 ; AVX-NEXT: vpminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
3431 ; AVX-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3432 ; AVX-NEXT: vmovq %xmm0, (%rdi)
3435 ; AVX512F-LABEL: trunc_usat_v8i16_v8i8_store:
3437 ; AVX512F-NEXT: vpminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
3438 ; AVX512F-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3439 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
3440 ; AVX512F-NEXT: retq
3442 ; AVX512VL-LABEL: trunc_usat_v8i16_v8i8_store:
3443 ; AVX512VL: # %bb.0:
3444 ; AVX512VL-NEXT: vpminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
3445 ; AVX512VL-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3446 ; AVX512VL-NEXT: vmovq %xmm0, (%rdi)
3447 ; AVX512VL-NEXT: retq
3449 ; AVX512BW-LABEL: trunc_usat_v8i16_v8i8_store:
3450 ; AVX512BW: # %bb.0:
3451 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
3452 ; AVX512BW-NEXT: vpmovuswb %zmm0, %ymm0
3453 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
3454 ; AVX512BW-NEXT: vzeroupper
3455 ; AVX512BW-NEXT: retq
3457 ; AVX512BWVL-LABEL: trunc_usat_v8i16_v8i8_store:
3458 ; AVX512BWVL: # %bb.0:
3459 ; AVX512BWVL-NEXT: vpmovuswb %xmm0, (%rdi)
3460 ; AVX512BWVL-NEXT: retq
3462 ; SKX-LABEL: trunc_usat_v8i16_v8i8_store:
3464 ; SKX-NEXT: vpmovuswb %xmm0, (%rdi)
3466 %1 = icmp ult <8 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
3467 %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>
3468 %3 = trunc <8 x i16> %2 to <8 x i8>
3469 store <8 x i8> %3, ptr%p1
3473 define <16 x i8> @trunc_usat_v16i16_v16i8(<16 x i16> %a0) {
3474 ; SSE2-SSSE3-LABEL: trunc_usat_v16i16_v16i8:
3475 ; SSE2-SSSE3: # %bb.0:
3476 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
3477 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm3
3478 ; SSE2-SSSE3-NEXT: psubusw %xmm2, %xmm3
3479 ; SSE2-SSSE3-NEXT: psubw %xmm3, %xmm1
3480 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm3
3481 ; SSE2-SSSE3-NEXT: psubusw %xmm2, %xmm3
3482 ; SSE2-SSSE3-NEXT: psubw %xmm3, %xmm0
3483 ; SSE2-SSSE3-NEXT: packuswb %xmm1, %xmm0
3484 ; SSE2-SSSE3-NEXT: retq
3486 ; SSE41-LABEL: trunc_usat_v16i16_v16i8:
3488 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
3489 ; SSE41-NEXT: pminuw %xmm2, %xmm1
3490 ; SSE41-NEXT: pminuw %xmm2, %xmm0
3491 ; SSE41-NEXT: packuswb %xmm1, %xmm0
3494 ; AVX1-LABEL: trunc_usat_v16i16_v16i8:
3496 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
3497 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
3498 ; AVX1-NEXT: vpminuw %xmm2, %xmm1, %xmm1
3499 ; AVX1-NEXT: vpminuw %xmm2, %xmm0, %xmm0
3500 ; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
3501 ; AVX1-NEXT: vzeroupper
3504 ; AVX2-LABEL: trunc_usat_v16i16_v16i8:
3506 ; AVX2-NEXT: vpminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
3507 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
3508 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
3509 ; AVX2-NEXT: vzeroupper
3512 ; AVX512F-LABEL: trunc_usat_v16i16_v16i8:
3514 ; AVX512F-NEXT: vpminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
3515 ; 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
3516 ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0
3517 ; AVX512F-NEXT: vzeroupper
3518 ; AVX512F-NEXT: retq
3520 ; AVX512VL-LABEL: trunc_usat_v16i16_v16i8:
3521 ; AVX512VL: # %bb.0:
3522 ; AVX512VL-NEXT: vpminuw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
3523 ; 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
3524 ; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0
3525 ; AVX512VL-NEXT: vzeroupper
3526 ; AVX512VL-NEXT: retq
3528 ; AVX512BW-LABEL: trunc_usat_v16i16_v16i8:
3529 ; AVX512BW: # %bb.0:
3530 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
3531 ; AVX512BW-NEXT: vpmovuswb %zmm0, %ymm0
3532 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
3533 ; AVX512BW-NEXT: vzeroupper
3534 ; AVX512BW-NEXT: retq
3536 ; AVX512BWVL-LABEL: trunc_usat_v16i16_v16i8:
3537 ; AVX512BWVL: # %bb.0:
3538 ; AVX512BWVL-NEXT: vpmovuswb %ymm0, %xmm0
3539 ; AVX512BWVL-NEXT: vzeroupper
3540 ; AVX512BWVL-NEXT: retq
3542 ; SKX-LABEL: trunc_usat_v16i16_v16i8:
3544 ; SKX-NEXT: vpmovuswb %ymm0, %xmm0
3545 ; SKX-NEXT: vzeroupper
3547 %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>
3548 %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>
3549 %3 = trunc <16 x i16> %2 to <16 x i8>
3553 define <32 x i8> @trunc_usat_v32i16_v32i8(ptr %p0) {
3554 ; SSE2-SSSE3-LABEL: trunc_usat_v32i16_v32i8:
3555 ; SSE2-SSSE3: # %bb.0:
3556 ; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm0
3557 ; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm2
3558 ; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm1
3559 ; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm3
3560 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
3561 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm5
3562 ; SSE2-SSSE3-NEXT: psubusw %xmm4, %xmm5
3563 ; SSE2-SSSE3-NEXT: psubw %xmm5, %xmm3
3564 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm5
3565 ; SSE2-SSSE3-NEXT: psubusw %xmm4, %xmm5
3566 ; SSE2-SSSE3-NEXT: psubw %xmm5, %xmm1
3567 ; SSE2-SSSE3-NEXT: packuswb %xmm3, %xmm1
3568 ; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm3
3569 ; SSE2-SSSE3-NEXT: psubusw %xmm4, %xmm3
3570 ; SSE2-SSSE3-NEXT: psubw %xmm3, %xmm2
3571 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm3
3572 ; SSE2-SSSE3-NEXT: psubusw %xmm4, %xmm3
3573 ; SSE2-SSSE3-NEXT: psubw %xmm3, %xmm0
3574 ; SSE2-SSSE3-NEXT: packuswb %xmm2, %xmm0
3575 ; SSE2-SSSE3-NEXT: retq
3577 ; SSE41-LABEL: trunc_usat_v32i16_v32i8:
3579 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255]
3580 ; SSE41-NEXT: movdqa 48(%rdi), %xmm2
3581 ; SSE41-NEXT: pminuw %xmm0, %xmm2
3582 ; SSE41-NEXT: movdqa 32(%rdi), %xmm1
3583 ; SSE41-NEXT: pminuw %xmm0, %xmm1
3584 ; SSE41-NEXT: packuswb %xmm2, %xmm1
3585 ; SSE41-NEXT: movdqa 16(%rdi), %xmm2
3586 ; SSE41-NEXT: pminuw %xmm0, %xmm2
3587 ; SSE41-NEXT: pminuw (%rdi), %xmm0
3588 ; SSE41-NEXT: packuswb %xmm2, %xmm0
3591 ; AVX1-LABEL: trunc_usat_v32i16_v32i8:
3593 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255]
3594 ; AVX1-NEXT: vpminuw 16(%rdi), %xmm0, %xmm1
3595 ; AVX1-NEXT: vpminuw (%rdi), %xmm0, %xmm2
3596 ; AVX1-NEXT: vpackuswb %xmm1, %xmm2, %xmm1
3597 ; AVX1-NEXT: vpminuw 48(%rdi), %xmm0, %xmm2
3598 ; AVX1-NEXT: vpminuw 32(%rdi), %xmm0, %xmm0
3599 ; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
3600 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
3603 ; AVX2-LABEL: trunc_usat_v32i16_v32i8:
3605 ; AVX2-NEXT: vpbroadcastw {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3606 ; AVX2-NEXT: vpminuw 32(%rdi), %ymm0, %ymm1
3607 ; AVX2-NEXT: vpminuw (%rdi), %ymm0, %ymm0
3608 ; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0
3609 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
3612 ; AVX512F-LABEL: trunc_usat_v32i16_v32i8:
3614 ; AVX512F-NEXT: vpbroadcastw {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3615 ; AVX512F-NEXT: vpminuw 32(%rdi), %ymm0, %ymm1
3616 ; AVX512F-NEXT: vpminuw (%rdi), %ymm0, %ymm0
3617 ; AVX512F-NEXT: vpackuswb %ymm1, %ymm0, %ymm0
3618 ; AVX512F-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
3619 ; AVX512F-NEXT: retq
3621 ; AVX512VL-LABEL: trunc_usat_v32i16_v32i8:
3622 ; AVX512VL: # %bb.0:
3623 ; AVX512VL-NEXT: vpbroadcastd {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
3624 ; AVX512VL-NEXT: vpminuw 32(%rdi), %ymm0, %ymm1
3625 ; AVX512VL-NEXT: vpminuw (%rdi), %ymm0, %ymm0
3626 ; AVX512VL-NEXT: vpackuswb %ymm1, %ymm0, %ymm0
3627 ; AVX512VL-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
3628 ; AVX512VL-NEXT: retq
3630 ; AVX512BW-LABEL: trunc_usat_v32i16_v32i8:
3631 ; AVX512BW: # %bb.0:
3632 ; AVX512BW-NEXT: vmovdqa64 (%rdi), %zmm0
3633 ; AVX512BW-NEXT: vpmovuswb %zmm0, %ymm0
3634 ; AVX512BW-NEXT: retq
3636 ; AVX512BWVL-LABEL: trunc_usat_v32i16_v32i8:
3637 ; AVX512BWVL: # %bb.0:
3638 ; AVX512BWVL-NEXT: vmovdqa64 (%rdi), %zmm0
3639 ; AVX512BWVL-NEXT: vpmovuswb %zmm0, %ymm0
3640 ; AVX512BWVL-NEXT: retq
3642 ; SKX-LABEL: trunc_usat_v32i16_v32i8:
3644 ; SKX-NEXT: vmovdqa64 (%rdi), %zmm0
3645 ; SKX-NEXT: vpmovuswb %zmm0, %ymm0
3647 %a0 = load <32 x i16>, ptr %p0
3648 %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>
3649 %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>
3650 %3 = trunc <32 x i16> %2 to <32 x i8>
3654 define <32 x i8> @trunc_usat_v32i32_v32i8(ptr %p0) {
3655 ; SSE2-SSSE3-LABEL: trunc_usat_v32i32_v32i8:
3656 ; SSE2-SSSE3: # %bb.0:
3657 ; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm7
3658 ; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm0
3659 ; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm2
3660 ; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm5
3661 ; SSE2-SSSE3-NEXT: movdqa 96(%rdi), %xmm8
3662 ; SSE2-SSSE3-NEXT: movdqa 112(%rdi), %xmm9
3663 ; SSE2-SSSE3-NEXT: movdqa 64(%rdi), %xmm10
3664 ; SSE2-SSSE3-NEXT: movdqa 80(%rdi), %xmm1
3665 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255]
3666 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
3667 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm11
3668 ; SSE2-SSSE3-NEXT: pxor %xmm6, %xmm11
3669 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483903,2147483903,2147483903,2147483903]
3670 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm12
3671 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm11, %xmm12
3672 ; SSE2-SSSE3-NEXT: pand %xmm12, %xmm1
3673 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm12
3674 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm12
3675 ; SSE2-SSSE3-NEXT: movdqa %xmm10, %xmm11
3676 ; SSE2-SSSE3-NEXT: pxor %xmm6, %xmm11
3677 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm1
3678 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm11, %xmm1
3679 ; SSE2-SSSE3-NEXT: pand %xmm1, %xmm10
3680 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm1
3681 ; SSE2-SSSE3-NEXT: por %xmm10, %xmm1
3682 ; SSE2-SSSE3-NEXT: packuswb %xmm12, %xmm1
3683 ; SSE2-SSSE3-NEXT: movdqa %xmm9, %xmm10
3684 ; SSE2-SSSE3-NEXT: pxor %xmm6, %xmm10
3685 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm11
3686 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm10, %xmm11
3687 ; SSE2-SSSE3-NEXT: pand %xmm11, %xmm9
3688 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm11
3689 ; SSE2-SSSE3-NEXT: por %xmm9, %xmm11
3690 ; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm9
3691 ; SSE2-SSSE3-NEXT: pxor %xmm6, %xmm9
3692 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm10
3693 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm9, %xmm10
3694 ; SSE2-SSSE3-NEXT: pand %xmm10, %xmm8
3695 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm10
3696 ; SSE2-SSSE3-NEXT: por %xmm8, %xmm10
3697 ; SSE2-SSSE3-NEXT: packuswb %xmm11, %xmm10
3698 ; SSE2-SSSE3-NEXT: packuswb %xmm10, %xmm1
3699 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm8
3700 ; SSE2-SSSE3-NEXT: pxor %xmm6, %xmm8
3701 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm9
3702 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm8, %xmm9
3703 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm0
3704 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm9
3705 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm9
3706 ; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm8
3707 ; SSE2-SSSE3-NEXT: pxor %xmm6, %xmm8
3708 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm0
3709 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm8, %xmm0
3710 ; SSE2-SSSE3-NEXT: pand %xmm0, %xmm7
3711 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm0
3712 ; SSE2-SSSE3-NEXT: por %xmm7, %xmm0
3713 ; SSE2-SSSE3-NEXT: packuswb %xmm9, %xmm0
3714 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm7
3715 ; SSE2-SSSE3-NEXT: pxor %xmm6, %xmm7
3716 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm8
3717 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm8
3718 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm5
3719 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm8
3720 ; SSE2-SSSE3-NEXT: por %xmm5, %xmm8
3721 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm6
3722 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm6, %xmm3
3723 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm2
3724 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm3
3725 ; SSE2-SSSE3-NEXT: por %xmm2, %xmm3
3726 ; SSE2-SSSE3-NEXT: packuswb %xmm8, %xmm3
3727 ; SSE2-SSSE3-NEXT: packuswb %xmm3, %xmm0
3728 ; SSE2-SSSE3-NEXT: retq
3730 ; SSE41-LABEL: trunc_usat_v32i32_v32i8:
3732 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
3733 ; SSE41-NEXT: movdqa 80(%rdi), %xmm0
3734 ; SSE41-NEXT: pminud %xmm2, %xmm0
3735 ; SSE41-NEXT: movdqa 64(%rdi), %xmm1
3736 ; SSE41-NEXT: pminud %xmm2, %xmm1
3737 ; SSE41-NEXT: packusdw %xmm0, %xmm1
3738 ; SSE41-NEXT: movdqa 112(%rdi), %xmm0
3739 ; SSE41-NEXT: pminud %xmm2, %xmm0
3740 ; SSE41-NEXT: movdqa 96(%rdi), %xmm3
3741 ; SSE41-NEXT: pminud %xmm2, %xmm3
3742 ; SSE41-NEXT: packusdw %xmm0, %xmm3
3743 ; SSE41-NEXT: packuswb %xmm3, %xmm1
3744 ; SSE41-NEXT: movdqa 16(%rdi), %xmm3
3745 ; SSE41-NEXT: pminud %xmm2, %xmm3
3746 ; SSE41-NEXT: movdqa (%rdi), %xmm0
3747 ; SSE41-NEXT: pminud %xmm2, %xmm0
3748 ; SSE41-NEXT: packusdw %xmm3, %xmm0
3749 ; SSE41-NEXT: movdqa 48(%rdi), %xmm3
3750 ; SSE41-NEXT: pminud %xmm2, %xmm3
3751 ; SSE41-NEXT: pminud 32(%rdi), %xmm2
3752 ; SSE41-NEXT: packusdw %xmm3, %xmm2
3753 ; SSE41-NEXT: packuswb %xmm2, %xmm0
3756 ; AVX1-LABEL: trunc_usat_v32i32_v32i8:
3758 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm0 = [255,255,255,255]
3759 ; AVX1-NEXT: vpminud 16(%rdi), %xmm0, %xmm1
3760 ; AVX1-NEXT: vpminud (%rdi), %xmm0, %xmm2
3761 ; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm1
3762 ; AVX1-NEXT: vpminud 48(%rdi), %xmm0, %xmm2
3763 ; AVX1-NEXT: vpminud 32(%rdi), %xmm0, %xmm3
3764 ; AVX1-NEXT: vpackusdw %xmm2, %xmm3, %xmm2
3765 ; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm1
3766 ; AVX1-NEXT: vpminud 80(%rdi), %xmm0, %xmm2
3767 ; AVX1-NEXT: vpminud 64(%rdi), %xmm0, %xmm3
3768 ; AVX1-NEXT: vpackusdw %xmm2, %xmm3, %xmm2
3769 ; AVX1-NEXT: vpminud 112(%rdi), %xmm0, %xmm3
3770 ; AVX1-NEXT: vpminud 96(%rdi), %xmm0, %xmm0
3771 ; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0
3772 ; AVX1-NEXT: vpackuswb %xmm0, %xmm2, %xmm0
3773 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
3776 ; AVX2-LABEL: trunc_usat_v32i32_v32i8:
3778 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm0 = [255,255,255,255,255,255,255,255]
3779 ; AVX2-NEXT: vpminud 32(%rdi), %ymm0, %ymm1
3780 ; AVX2-NEXT: vpminud (%rdi), %ymm0, %ymm2
3781 ; AVX2-NEXT: vpackusdw %ymm1, %ymm2, %ymm1
3782 ; AVX2-NEXT: vpminud 96(%rdi), %ymm0, %ymm2
3783 ; AVX2-NEXT: vpminud 64(%rdi), %ymm0, %ymm0
3784 ; AVX2-NEXT: vpackusdw %ymm2, %ymm0, %ymm0
3785 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
3786 ; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
3787 ; AVX2-NEXT: vpackuswb %ymm0, %ymm1, %ymm0
3788 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
3791 ; AVX512-LABEL: trunc_usat_v32i32_v32i8:
3793 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
3794 ; AVX512-NEXT: vmovdqa64 64(%rdi), %zmm1
3795 ; AVX512-NEXT: vpmovusdb %zmm0, %xmm0
3796 ; AVX512-NEXT: vpmovusdb %zmm1, %xmm1
3797 ; AVX512-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
3800 ; SKX-LABEL: trunc_usat_v32i32_v32i8:
3802 ; SKX-NEXT: vmovdqa64 (%rdi), %zmm0
3803 ; SKX-NEXT: vmovdqa64 64(%rdi), %zmm1
3804 ; SKX-NEXT: vpmovusdb %zmm0, %xmm0
3805 ; SKX-NEXT: vpmovusdb %zmm1, %xmm1
3806 ; SKX-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
3808 %a0 = load <32 x i32>, ptr %p0
3809 %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>
3810 %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>
3811 %3 = trunc <32 x i32> %2 to <32 x i8>