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