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: pcmpgtd %xmm3, %xmm5
91 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
92 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm3
93 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
94 ; SSE41-NEXT: pand %xmm6, %xmm3
95 ; SSE41-NEXT: por %xmm5, %xmm3
96 ; SSE41-NEXT: pxor %xmm1, %xmm0
97 ; SSE41-NEXT: movdqa %xmm4, %xmm5
98 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
99 ; SSE41-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
100 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm0
101 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
102 ; SSE41-NEXT: pand %xmm6, %xmm0
103 ; SSE41-NEXT: por %xmm5, %xmm0
104 ; SSE41-NEXT: movapd {{.*#+}} xmm4 = [4294967295,4294967295]
105 ; SSE41-NEXT: movapd {{.*#+}} xmm5 = [4294967295,429496729]
106 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm5
107 ; SSE41-NEXT: movdqa %xmm3, %xmm0
108 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4
109 ; SSE41-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,2],xmm5[0,2]
110 ; SSE41-NEXT: movaps %xmm4, %xmm0
113 ; AVX1-LABEL: trunc_usat_v4i64_v4i32:
115 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
116 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm2
117 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372041149743103,9223372041149743103]
118 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
119 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
120 ; AVX1-NEXT: vpxor %xmm1, %xmm4, %xmm1
121 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1
122 ; AVX1-NEXT: vmovapd {{.*#+}} xmm3 = [4294967295,429496729]
123 ; AVX1-NEXT: vblendvpd %xmm1, %xmm4, %xmm3, %xmm1
124 ; AVX1-NEXT: vmovapd {{.*#+}} xmm3 = [4294967295,4294967295]
125 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
126 ; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
127 ; AVX1-NEXT: vzeroupper
130 ; AVX2-SLOW-LABEL: trunc_usat_v4i64_v4i32:
131 ; AVX2-SLOW: # %bb.0:
132 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
133 ; AVX2-SLOW-NEXT: vpxor %ymm1, %ymm0, %ymm1
134 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
135 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm1
136 ; AVX2-SLOW-NEXT: vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,429496729]
137 ; AVX2-SLOW-NEXT: vblendvpd %ymm1, %ymm0, %ymm2, %ymm0
138 ; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1
139 ; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
140 ; AVX2-SLOW-NEXT: vzeroupper
141 ; AVX2-SLOW-NEXT: retq
143 ; AVX2-FAST-LABEL: trunc_usat_v4i64_v4i32:
144 ; AVX2-FAST: # %bb.0:
145 ; AVX2-FAST-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
146 ; AVX2-FAST-NEXT: vpxor %ymm1, %ymm0, %ymm1
147 ; AVX2-FAST-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
148 ; AVX2-FAST-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm1
149 ; AVX2-FAST-NEXT: vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,429496729]
150 ; AVX2-FAST-NEXT: vblendvpd %ymm1, %ymm0, %ymm2, %ymm0
151 ; AVX2-FAST-NEXT: vmovapd {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7]
152 ; AVX2-FAST-NEXT: vpermps %ymm0, %ymm1, %ymm0
153 ; AVX2-FAST-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
154 ; AVX2-FAST-NEXT: vzeroupper
155 ; AVX2-FAST-NEXT: retq
157 ; AVX512F-LABEL: trunc_usat_v4i64_v4i32:
159 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
160 ; AVX512F-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
161 ; AVX512F-NEXT: vpcmpltuq %zmm1, %zmm0, %k1
162 ; AVX512F-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
163 ; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 {%k1}
164 ; AVX512F-NEXT: vpmovqd %zmm1, %ymm0
165 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
166 ; AVX512F-NEXT: vzeroupper
169 ; AVX512VL-LABEL: trunc_usat_v4i64_v4i32:
171 ; AVX512VL-NEXT: vpcmpltuq {{.*}}(%rip){1to4}, %ymm0, %k1
172 ; AVX512VL-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
173 ; AVX512VL-NEXT: vmovdqa64 %ymm0, %ymm1 {%k1}
174 ; AVX512VL-NEXT: vpmovqd %ymm1, %xmm0
175 ; AVX512VL-NEXT: vzeroupper
176 ; AVX512VL-NEXT: retq
178 ; AVX512BW-LABEL: trunc_usat_v4i64_v4i32:
180 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
181 ; AVX512BW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
182 ; AVX512BW-NEXT: vpcmpltuq %zmm1, %zmm0, %k1
183 ; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
184 ; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 {%k1}
185 ; AVX512BW-NEXT: vpmovqd %zmm1, %ymm0
186 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
187 ; AVX512BW-NEXT: vzeroupper
188 ; AVX512BW-NEXT: retq
190 ; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i32:
191 ; AVX512BWVL: # %bb.0:
192 ; AVX512BWVL-NEXT: vpcmpltuq {{.*}}(%rip){1to4}, %ymm0, %k1
193 ; AVX512BWVL-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
194 ; AVX512BWVL-NEXT: vmovdqa64 %ymm0, %ymm1 {%k1}
195 ; AVX512BWVL-NEXT: vpmovqd %ymm1, %xmm0
196 ; AVX512BWVL-NEXT: vzeroupper
197 ; AVX512BWVL-NEXT: retq
198 %1 = icmp ult <4 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
199 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 429496729>
200 %3 = trunc <4 x i64> %2 to <4 x i32>
204 define <8 x i32> @trunc_usat_v8i64_v8i32(<8 x i64> %a0) {
205 ; SSE2-LABEL: trunc_usat_v8i64_v8i32:
207 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [4294967295,4294967295]
208 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
209 ; SSE2-NEXT: movdqa %xmm3, %xmm7
210 ; SSE2-NEXT: pxor %xmm5, %xmm7
211 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259455,9223372039002259455]
212 ; SSE2-NEXT: movdqa %xmm9, %xmm6
213 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm6
214 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
215 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm7
216 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
217 ; SSE2-NEXT: pand %xmm4, %xmm7
218 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
219 ; SSE2-NEXT: por %xmm7, %xmm4
220 ; SSE2-NEXT: pand %xmm4, %xmm3
221 ; SSE2-NEXT: pandn %xmm8, %xmm4
222 ; SSE2-NEXT: por %xmm3, %xmm4
223 ; SSE2-NEXT: movdqa %xmm2, %xmm3
224 ; SSE2-NEXT: pxor %xmm5, %xmm3
225 ; SSE2-NEXT: movdqa %xmm9, %xmm6
226 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm6
227 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
228 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm3
229 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
230 ; SSE2-NEXT: pand %xmm10, %xmm7
231 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
232 ; SSE2-NEXT: por %xmm7, %xmm3
233 ; SSE2-NEXT: pand %xmm3, %xmm2
234 ; SSE2-NEXT: pandn %xmm8, %xmm3
235 ; SSE2-NEXT: por %xmm2, %xmm3
236 ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm4[0,2]
237 ; SSE2-NEXT: movdqa %xmm1, %xmm2
238 ; SSE2-NEXT: pxor %xmm5, %xmm2
239 ; SSE2-NEXT: movdqa %xmm9, %xmm4
240 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
241 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
242 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm2
243 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
244 ; SSE2-NEXT: pand %xmm6, %xmm2
245 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
246 ; SSE2-NEXT: por %xmm2, %xmm4
247 ; SSE2-NEXT: pand %xmm4, %xmm1
248 ; SSE2-NEXT: pandn %xmm8, %xmm4
249 ; SSE2-NEXT: por %xmm1, %xmm4
250 ; SSE2-NEXT: pxor %xmm0, %xmm5
251 ; SSE2-NEXT: movdqa %xmm9, %xmm1
252 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm1
253 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
254 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm5
255 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
256 ; SSE2-NEXT: pand %xmm2, %xmm5
257 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
258 ; SSE2-NEXT: por %xmm5, %xmm1
259 ; SSE2-NEXT: pand %xmm1, %xmm0
260 ; SSE2-NEXT: pandn %xmm8, %xmm1
261 ; SSE2-NEXT: por %xmm1, %xmm0
262 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm4[0,2]
263 ; SSE2-NEXT: movaps %xmm3, %xmm1
266 ; SSSE3-LABEL: trunc_usat_v8i64_v8i32:
268 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [4294967295,4294967295]
269 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
270 ; SSSE3-NEXT: movdqa %xmm3, %xmm7
271 ; SSSE3-NEXT: pxor %xmm5, %xmm7
272 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259455,9223372039002259455]
273 ; SSSE3-NEXT: movdqa %xmm9, %xmm6
274 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm6
275 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
276 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm7
277 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
278 ; SSSE3-NEXT: pand %xmm4, %xmm7
279 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
280 ; SSSE3-NEXT: por %xmm7, %xmm4
281 ; SSSE3-NEXT: pand %xmm4, %xmm3
282 ; SSSE3-NEXT: pandn %xmm8, %xmm4
283 ; SSSE3-NEXT: por %xmm3, %xmm4
284 ; SSSE3-NEXT: movdqa %xmm2, %xmm3
285 ; SSSE3-NEXT: pxor %xmm5, %xmm3
286 ; SSSE3-NEXT: movdqa %xmm9, %xmm6
287 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm6
288 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
289 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm3
290 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
291 ; SSSE3-NEXT: pand %xmm10, %xmm7
292 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
293 ; SSSE3-NEXT: por %xmm7, %xmm3
294 ; SSSE3-NEXT: pand %xmm3, %xmm2
295 ; SSSE3-NEXT: pandn %xmm8, %xmm3
296 ; SSSE3-NEXT: por %xmm2, %xmm3
297 ; SSSE3-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm4[0,2]
298 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
299 ; SSSE3-NEXT: pxor %xmm5, %xmm2
300 ; SSSE3-NEXT: movdqa %xmm9, %xmm4
301 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
302 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
303 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm2
304 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
305 ; SSSE3-NEXT: pand %xmm6, %xmm2
306 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
307 ; SSSE3-NEXT: por %xmm2, %xmm4
308 ; SSSE3-NEXT: pand %xmm4, %xmm1
309 ; SSSE3-NEXT: pandn %xmm8, %xmm4
310 ; SSSE3-NEXT: por %xmm1, %xmm4
311 ; SSSE3-NEXT: pxor %xmm0, %xmm5
312 ; SSSE3-NEXT: movdqa %xmm9, %xmm1
313 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm1
314 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
315 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm5
316 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
317 ; SSSE3-NEXT: pand %xmm2, %xmm5
318 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
319 ; SSSE3-NEXT: por %xmm5, %xmm1
320 ; SSSE3-NEXT: pand %xmm1, %xmm0
321 ; SSSE3-NEXT: pandn %xmm8, %xmm1
322 ; SSSE3-NEXT: por %xmm1, %xmm0
323 ; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm4[0,2]
324 ; SSSE3-NEXT: movaps %xmm3, %xmm1
327 ; SSE41-LABEL: trunc_usat_v8i64_v8i32:
329 ; SSE41-NEXT: movdqa %xmm0, %xmm8
330 ; SSE41-NEXT: movapd {{.*#+}} xmm6 = [4294967295,4294967295]
331 ; SSE41-NEXT: movdqa {{.*#+}} xmm7 = [9223372039002259456,9223372039002259456]
332 ; SSE41-NEXT: movdqa %xmm3, %xmm0
333 ; SSE41-NEXT: pxor %xmm7, %xmm0
334 ; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259455,9223372039002259455]
335 ; SSE41-NEXT: movdqa %xmm9, %xmm4
336 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
337 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
338 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
339 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
340 ; SSE41-NEXT: pand %xmm5, %xmm0
341 ; SSE41-NEXT: por %xmm4, %xmm0
342 ; SSE41-NEXT: movapd %xmm6, %xmm5
343 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm5
344 ; SSE41-NEXT: movdqa %xmm2, %xmm0
345 ; SSE41-NEXT: pxor %xmm7, %xmm0
346 ; SSE41-NEXT: movdqa %xmm9, %xmm3
347 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
348 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
349 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
350 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
351 ; SSE41-NEXT: pand %xmm4, %xmm0
352 ; SSE41-NEXT: por %xmm3, %xmm0
353 ; SSE41-NEXT: movapd %xmm6, %xmm4
354 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4
355 ; SSE41-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,2],xmm5[0,2]
356 ; SSE41-NEXT: movdqa %xmm1, %xmm0
357 ; SSE41-NEXT: pxor %xmm7, %xmm0
358 ; SSE41-NEXT: movdqa %xmm9, %xmm2
359 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
360 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
361 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
362 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
363 ; SSE41-NEXT: pand %xmm3, %xmm0
364 ; SSE41-NEXT: por %xmm2, %xmm0
365 ; SSE41-NEXT: movapd %xmm6, %xmm2
366 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
367 ; SSE41-NEXT: pxor %xmm8, %xmm7
368 ; SSE41-NEXT: movdqa %xmm9, %xmm1
369 ; SSE41-NEXT: pcmpgtd %xmm7, %xmm1
370 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
371 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm7
372 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
373 ; SSE41-NEXT: pand %xmm3, %xmm0
374 ; SSE41-NEXT: por %xmm1, %xmm0
375 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm6
376 ; SSE41-NEXT: shufps {{.*#+}} xmm6 = xmm6[0,2],xmm2[0,2]
377 ; SSE41-NEXT: movaps %xmm6, %xmm0
378 ; SSE41-NEXT: movaps %xmm4, %xmm1
381 ; AVX1-LABEL: trunc_usat_v8i64_v8i32:
383 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
384 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm3
385 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372041149743103,9223372041149743103]
386 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm8
387 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
388 ; AVX1-NEXT: vpxor %xmm2, %xmm5, %xmm6
389 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm4, %xmm6
390 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm7
391 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm4, %xmm7
392 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
393 ; AVX1-NEXT: vpxor %xmm2, %xmm3, %xmm2
394 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm2
395 ; AVX1-NEXT: vmovapd {{.*#+}} xmm4 = [4294967295,4294967295]
396 ; AVX1-NEXT: vblendvpd %xmm2, %xmm3, %xmm4, %xmm2
397 ; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm4, %xmm1
398 ; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
399 ; AVX1-NEXT: vblendvpd %xmm6, %xmm5, %xmm4, %xmm2
400 ; AVX1-NEXT: vblendvpd %xmm8, %xmm0, %xmm4, %xmm0
401 ; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
402 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
405 ; AVX2-SLOW-LABEL: trunc_usat_v8i64_v8i32:
406 ; AVX2-SLOW: # %bb.0:
407 ; AVX2-SLOW-NEXT: vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
408 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
409 ; AVX2-SLOW-NEXT: vpxor %ymm3, %ymm0, %ymm4
410 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
411 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
412 ; AVX2-SLOW-NEXT: vblendvpd %ymm4, %ymm0, %ymm2, %ymm0
413 ; AVX2-SLOW-NEXT: vpxor %ymm3, %ymm1, %ymm3
414 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
415 ; AVX2-SLOW-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
416 ; AVX2-SLOW-NEXT: vextractf128 $1, %ymm1, %xmm2
417 ; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
418 ; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm2
419 ; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
420 ; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
421 ; AVX2-SLOW-NEXT: retq
423 ; AVX2-FAST-LABEL: trunc_usat_v8i64_v8i32:
424 ; AVX2-FAST: # %bb.0:
425 ; AVX2-FAST-NEXT: vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
426 ; AVX2-FAST-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
427 ; AVX2-FAST-NEXT: vpxor %ymm3, %ymm1, %ymm4
428 ; AVX2-FAST-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
429 ; AVX2-FAST-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
430 ; AVX2-FAST-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
431 ; AVX2-FAST-NEXT: vpxor %ymm3, %ymm0, %ymm3
432 ; AVX2-FAST-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
433 ; AVX2-FAST-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
434 ; AVX2-FAST-NEXT: vmovapd {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
435 ; AVX2-FAST-NEXT: vpermps %ymm0, %ymm2, %ymm0
436 ; AVX2-FAST-NEXT: vpermps %ymm1, %ymm2, %ymm1
437 ; AVX2-FAST-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
438 ; AVX2-FAST-NEXT: retq
440 ; AVX512-LABEL: trunc_usat_v8i64_v8i32:
442 ; AVX512-NEXT: vpmovusqd %zmm0, %ymm0
444 %1 = icmp ult <8 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
445 %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>
446 %3 = trunc <8 x i64> %2 to <8 x i32>
451 ; Unsigned saturation truncation to vXi16
454 define <8 x i16> @trunc_usat_v8i64_v8i16(<8 x i64> %a0) {
455 ; SSE2-LABEL: trunc_usat_v8i64_v8i16:
457 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [65535,65535]
458 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
459 ; SSE2-NEXT: movdqa %xmm2, %xmm5
460 ; SSE2-NEXT: pxor %xmm6, %xmm5
461 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002324991,9223372039002324991]
462 ; SSE2-NEXT: movdqa %xmm9, %xmm7
463 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm7
464 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
465 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm5
466 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
467 ; SSE2-NEXT: pand %xmm10, %xmm4
468 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
469 ; SSE2-NEXT: por %xmm4, %xmm5
470 ; SSE2-NEXT: pand %xmm5, %xmm2
471 ; SSE2-NEXT: pandn %xmm8, %xmm5
472 ; SSE2-NEXT: por %xmm2, %xmm5
473 ; SSE2-NEXT: movdqa %xmm3, %xmm2
474 ; SSE2-NEXT: pxor %xmm6, %xmm2
475 ; SSE2-NEXT: movdqa %xmm9, %xmm4
476 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
477 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
478 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm2
479 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
480 ; SSE2-NEXT: pand %xmm10, %xmm7
481 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
482 ; SSE2-NEXT: por %xmm7, %xmm2
483 ; SSE2-NEXT: pand %xmm2, %xmm3
484 ; SSE2-NEXT: pandn %xmm8, %xmm2
485 ; SSE2-NEXT: por %xmm3, %xmm2
486 ; SSE2-NEXT: movdqa %xmm0, %xmm3
487 ; SSE2-NEXT: pxor %xmm6, %xmm3
488 ; SSE2-NEXT: movdqa %xmm9, %xmm4
489 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
490 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
491 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm3
492 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
493 ; SSE2-NEXT: pand %xmm7, %xmm3
494 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
495 ; SSE2-NEXT: por %xmm3, %xmm4
496 ; SSE2-NEXT: pand %xmm4, %xmm0
497 ; SSE2-NEXT: pandn %xmm8, %xmm4
498 ; SSE2-NEXT: por %xmm0, %xmm4
499 ; SSE2-NEXT: pxor %xmm1, %xmm6
500 ; SSE2-NEXT: movdqa %xmm9, %xmm0
501 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm0
502 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2]
503 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm6
504 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
505 ; SSE2-NEXT: pand %xmm3, %xmm6
506 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
507 ; SSE2-NEXT: por %xmm6, %xmm0
508 ; SSE2-NEXT: pand %xmm0, %xmm1
509 ; SSE2-NEXT: pandn %xmm8, %xmm0
510 ; SSE2-NEXT: por %xmm1, %xmm0
511 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
512 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
513 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm4[0,2,2,3]
514 ; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
515 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
516 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
517 ; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm0[0,1,0,2,4,5,6,7]
518 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
519 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
520 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
521 ; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
524 ; SSSE3-LABEL: trunc_usat_v8i64_v8i16:
526 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [65535,65535]
527 ; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
528 ; SSSE3-NEXT: movdqa %xmm2, %xmm5
529 ; SSSE3-NEXT: pxor %xmm6, %xmm5
530 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002324991,9223372039002324991]
531 ; SSSE3-NEXT: movdqa %xmm9, %xmm7
532 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm7
533 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
534 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm5
535 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
536 ; SSSE3-NEXT: pand %xmm10, %xmm4
537 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
538 ; SSSE3-NEXT: por %xmm4, %xmm5
539 ; SSSE3-NEXT: pand %xmm5, %xmm2
540 ; SSSE3-NEXT: pandn %xmm8, %xmm5
541 ; SSSE3-NEXT: por %xmm2, %xmm5
542 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
543 ; SSSE3-NEXT: pxor %xmm6, %xmm2
544 ; SSSE3-NEXT: movdqa %xmm9, %xmm4
545 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
546 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
547 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm2
548 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
549 ; SSSE3-NEXT: pand %xmm10, %xmm7
550 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
551 ; SSSE3-NEXT: por %xmm7, %xmm2
552 ; SSSE3-NEXT: pand %xmm2, %xmm3
553 ; SSSE3-NEXT: pandn %xmm8, %xmm2
554 ; SSSE3-NEXT: por %xmm3, %xmm2
555 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
556 ; SSSE3-NEXT: pxor %xmm6, %xmm3
557 ; SSSE3-NEXT: movdqa %xmm9, %xmm4
558 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4
559 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
560 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm3
561 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
562 ; SSSE3-NEXT: pand %xmm7, %xmm3
563 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
564 ; SSSE3-NEXT: por %xmm3, %xmm4
565 ; SSSE3-NEXT: pand %xmm4, %xmm0
566 ; SSSE3-NEXT: pandn %xmm8, %xmm4
567 ; SSSE3-NEXT: por %xmm0, %xmm4
568 ; SSSE3-NEXT: pxor %xmm1, %xmm6
569 ; SSSE3-NEXT: movdqa %xmm9, %xmm0
570 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm0
571 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2]
572 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm6
573 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
574 ; SSSE3-NEXT: pand %xmm3, %xmm6
575 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
576 ; SSSE3-NEXT: por %xmm6, %xmm0
577 ; SSSE3-NEXT: pand %xmm0, %xmm1
578 ; SSSE3-NEXT: pandn %xmm8, %xmm0
579 ; SSSE3-NEXT: por %xmm1, %xmm0
580 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
581 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
582 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm4[0,2,2,3]
583 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
584 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
585 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
586 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm2 = xmm0[0,1,0,2,4,5,6,7]
587 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
588 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
589 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
590 ; SSSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
593 ; SSE41-LABEL: trunc_usat_v8i64_v8i16:
595 ; SSE41-NEXT: movdqa %xmm0, %xmm8
596 ; SSE41-NEXT: movapd {{.*#+}} xmm5 = [65535,65535]
597 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
598 ; SSE41-NEXT: movdqa %xmm1, %xmm0
599 ; SSE41-NEXT: pxor %xmm6, %xmm0
600 ; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002324991,9223372039002324991]
601 ; SSE41-NEXT: movdqa %xmm9, %xmm7
602 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
603 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
604 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
605 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
606 ; SSE41-NEXT: pand %xmm4, %xmm0
607 ; SSE41-NEXT: por %xmm7, %xmm0
608 ; SSE41-NEXT: movapd %xmm5, %xmm4
609 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4
610 ; SSE41-NEXT: movdqa %xmm8, %xmm0
611 ; SSE41-NEXT: pxor %xmm6, %xmm0
612 ; SSE41-NEXT: movdqa %xmm9, %xmm1
613 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
614 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,0,2,2]
615 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
616 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
617 ; SSE41-NEXT: pand %xmm7, %xmm0
618 ; SSE41-NEXT: por %xmm1, %xmm0
619 ; SSE41-NEXT: movapd %xmm5, %xmm1
620 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm1
621 ; SSE41-NEXT: packusdw %xmm4, %xmm1
622 ; SSE41-NEXT: movdqa %xmm3, %xmm0
623 ; SSE41-NEXT: pxor %xmm6, %xmm0
624 ; SSE41-NEXT: movdqa %xmm9, %xmm4
625 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
626 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
627 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
628 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
629 ; SSE41-NEXT: pand %xmm7, %xmm0
630 ; SSE41-NEXT: por %xmm4, %xmm0
631 ; SSE41-NEXT: movapd %xmm5, %xmm4
632 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm4
633 ; SSE41-NEXT: pxor %xmm2, %xmm6
634 ; SSE41-NEXT: movdqa %xmm9, %xmm3
635 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm3
636 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm3[0,0,2,2]
637 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm6
638 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
639 ; SSE41-NEXT: pand %xmm7, %xmm0
640 ; SSE41-NEXT: por %xmm3, %xmm0
641 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5
642 ; SSE41-NEXT: packusdw %xmm4, %xmm5
643 ; SSE41-NEXT: packusdw %xmm5, %xmm1
644 ; SSE41-NEXT: movdqa %xmm1, %xmm0
647 ; AVX1-LABEL: trunc_usat_v8i64_v8i16:
649 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
650 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm3
651 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854841343,9223372036854841343]
652 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm8
653 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
654 ; AVX1-NEXT: vpxor %xmm2, %xmm5, %xmm6
655 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm4, %xmm6
656 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm7
657 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm4, %xmm7
658 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
659 ; AVX1-NEXT: vpxor %xmm2, %xmm3, %xmm2
660 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm2
661 ; AVX1-NEXT: vmovapd {{.*#+}} xmm4 = [65535,65535]
662 ; AVX1-NEXT: vblendvpd %xmm2, %xmm3, %xmm4, %xmm2
663 ; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm4, %xmm1
664 ; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1
665 ; AVX1-NEXT: vblendvpd %xmm6, %xmm5, %xmm4, %xmm2
666 ; AVX1-NEXT: vblendvpd %xmm8, %xmm0, %xmm4, %xmm0
667 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
668 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
669 ; AVX1-NEXT: vzeroupper
672 ; AVX2-LABEL: trunc_usat_v8i64_v8i16:
674 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [65535,65535,65535,65535]
675 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
676 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm4
677 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343]
678 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
679 ; AVX2-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
680 ; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm3
681 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
682 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
683 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
684 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
685 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
686 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
687 ; AVX2-NEXT: vzeroupper
690 ; AVX512-LABEL: trunc_usat_v8i64_v8i16:
692 ; AVX512-NEXT: vpmovusqw %zmm0, %xmm0
693 ; AVX512-NEXT: vzeroupper
695 %1 = icmp ult <8 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
696 %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>
697 %3 = trunc <8 x i64> %2 to <8 x i16>
701 define <8 x i16> @trunc_usat_v8i32_v8i16(<8 x i32> %a0) {
702 ; SSE2-LABEL: trunc_usat_v8i32_v8i16:
704 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
705 ; SSE2-NEXT: movdqa %xmm0, %xmm3
706 ; SSE2-NEXT: pxor %xmm2, %xmm3
707 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147549183,2147549183,2147549183,2147549183]
708 ; SSE2-NEXT: movdqa %xmm4, %xmm5
709 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
710 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm3
711 ; SSE2-NEXT: pand %xmm5, %xmm0
712 ; SSE2-NEXT: pxor %xmm3, %xmm5
713 ; SSE2-NEXT: por %xmm5, %xmm0
714 ; SSE2-NEXT: pxor %xmm1, %xmm2
715 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
716 ; SSE2-NEXT: pxor %xmm4, %xmm3
717 ; SSE2-NEXT: pand %xmm1, %xmm4
718 ; SSE2-NEXT: por %xmm3, %xmm4
719 ; SSE2-NEXT: pslld $16, %xmm4
720 ; SSE2-NEXT: psrad $16, %xmm4
721 ; SSE2-NEXT: pslld $16, %xmm0
722 ; SSE2-NEXT: psrad $16, %xmm0
723 ; SSE2-NEXT: packssdw %xmm4, %xmm0
726 ; SSSE3-LABEL: trunc_usat_v8i32_v8i16:
728 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
729 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
730 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
731 ; SSSE3-NEXT: pxor %xmm3, %xmm4
732 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
733 ; SSSE3-NEXT: movdqa %xmm5, %xmm6
734 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
735 ; SSSE3-NEXT: pand %xmm6, %xmm0
736 ; SSSE3-NEXT: pandn %xmm2, %xmm6
737 ; SSSE3-NEXT: por %xmm6, %xmm0
738 ; SSSE3-NEXT: pxor %xmm1, %xmm3
739 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
740 ; SSSE3-NEXT: pand %xmm5, %xmm1
741 ; SSSE3-NEXT: pandn %xmm2, %xmm5
742 ; SSSE3-NEXT: por %xmm1, %xmm5
743 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
744 ; SSSE3-NEXT: pshufb %xmm1, %xmm5
745 ; SSSE3-NEXT: pshufb %xmm1, %xmm0
746 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0]
749 ; SSE41-LABEL: trunc_usat_v8i32_v8i16:
751 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
752 ; SSE41-NEXT: pminud %xmm2, %xmm1
753 ; SSE41-NEXT: pminud %xmm2, %xmm0
754 ; SSE41-NEXT: packusdw %xmm1, %xmm0
757 ; AVX1-LABEL: trunc_usat_v8i32_v8i16:
759 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
760 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
761 ; AVX1-NEXT: vpminud %xmm2, %xmm1, %xmm1
762 ; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0
763 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
764 ; AVX1-NEXT: vzeroupper
767 ; AVX2-LABEL: trunc_usat_v8i32_v8i16:
769 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535]
770 ; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0
771 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
772 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
773 ; AVX2-NEXT: vzeroupper
776 ; AVX512F-LABEL: trunc_usat_v8i32_v8i16:
778 ; AVX512F-NEXT: vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535]
779 ; AVX512F-NEXT: vpminud %ymm1, %ymm0, %ymm0
780 ; AVX512F-NEXT: vpmovdw %zmm0, %ymm0
781 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
782 ; AVX512F-NEXT: vzeroupper
785 ; AVX512VL-LABEL: trunc_usat_v8i32_v8i16:
787 ; AVX512VL-NEXT: vpmovusdw %ymm0, %xmm0
788 ; AVX512VL-NEXT: vzeroupper
789 ; AVX512VL-NEXT: retq
791 ; AVX512BW-LABEL: trunc_usat_v8i32_v8i16:
793 ; AVX512BW-NEXT: vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535]
794 ; AVX512BW-NEXT: vpminud %ymm1, %ymm0, %ymm0
795 ; AVX512BW-NEXT: vpmovdw %zmm0, %ymm0
796 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
797 ; AVX512BW-NEXT: vzeroupper
798 ; AVX512BW-NEXT: retq
800 ; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i16:
801 ; AVX512BWVL: # %bb.0:
802 ; AVX512BWVL-NEXT: vpmovusdw %ymm0, %xmm0
803 ; AVX512BWVL-NEXT: vzeroupper
804 ; AVX512BWVL-NEXT: retq
805 %1 = icmp ult <8 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
806 %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>
807 %3 = trunc <8 x i32> %2 to <8 x i16>
811 define <16 x i16> @trunc_usat_v16i32_v16i16(<16 x i32> %a0) {
812 ; SSE2-LABEL: trunc_usat_v16i32_v16i16:
814 ; SSE2-NEXT: movdqa %xmm1, %xmm8
815 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
816 ; SSE2-NEXT: movdqa %xmm2, %xmm7
817 ; SSE2-NEXT: pxor %xmm6, %xmm7
818 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
819 ; SSE2-NEXT: movdqa %xmm5, %xmm1
820 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm1
821 ; SSE2-NEXT: pcmpeqd %xmm7, %xmm7
822 ; SSE2-NEXT: pand %xmm1, %xmm2
823 ; SSE2-NEXT: pxor %xmm7, %xmm1
824 ; SSE2-NEXT: por %xmm2, %xmm1
825 ; SSE2-NEXT: movdqa %xmm3, %xmm4
826 ; SSE2-NEXT: pxor %xmm6, %xmm4
827 ; SSE2-NEXT: movdqa %xmm5, %xmm2
828 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm2
829 ; SSE2-NEXT: pand %xmm2, %xmm3
830 ; SSE2-NEXT: pxor %xmm7, %xmm2
831 ; SSE2-NEXT: por %xmm3, %xmm2
832 ; SSE2-NEXT: movdqa %xmm0, %xmm3
833 ; SSE2-NEXT: pxor %xmm6, %xmm3
834 ; SSE2-NEXT: movdqa %xmm5, %xmm4
835 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
836 ; SSE2-NEXT: pand %xmm4, %xmm0
837 ; SSE2-NEXT: pxor %xmm7, %xmm4
838 ; SSE2-NEXT: por %xmm4, %xmm0
839 ; SSE2-NEXT: pxor %xmm8, %xmm6
840 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm5
841 ; SSE2-NEXT: pxor %xmm5, %xmm7
842 ; SSE2-NEXT: pand %xmm8, %xmm5
843 ; SSE2-NEXT: por %xmm7, %xmm5
844 ; SSE2-NEXT: pslld $16, %xmm5
845 ; SSE2-NEXT: psrad $16, %xmm5
846 ; SSE2-NEXT: pslld $16, %xmm0
847 ; SSE2-NEXT: psrad $16, %xmm0
848 ; SSE2-NEXT: packssdw %xmm5, %xmm0
849 ; SSE2-NEXT: pslld $16, %xmm2
850 ; SSE2-NEXT: psrad $16, %xmm2
851 ; SSE2-NEXT: pslld $16, %xmm1
852 ; SSE2-NEXT: psrad $16, %xmm1
853 ; SSE2-NEXT: packssdw %xmm2, %xmm1
856 ; SSSE3-LABEL: trunc_usat_v16i32_v16i16:
858 ; SSSE3-NEXT: movdqa %xmm1, %xmm8
859 ; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
860 ; SSSE3-NEXT: movdqa %xmm2, %xmm7
861 ; SSSE3-NEXT: pxor %xmm6, %xmm7
862 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
863 ; SSSE3-NEXT: movdqa %xmm5, %xmm1
864 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm1
865 ; SSSE3-NEXT: pcmpeqd %xmm7, %xmm7
866 ; SSSE3-NEXT: pand %xmm1, %xmm2
867 ; SSSE3-NEXT: pxor %xmm7, %xmm1
868 ; SSSE3-NEXT: por %xmm2, %xmm1
869 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
870 ; SSSE3-NEXT: pxor %xmm6, %xmm4
871 ; SSSE3-NEXT: movdqa %xmm5, %xmm2
872 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm2
873 ; SSSE3-NEXT: pand %xmm2, %xmm3
874 ; SSSE3-NEXT: pxor %xmm7, %xmm2
875 ; SSSE3-NEXT: por %xmm3, %xmm2
876 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
877 ; SSSE3-NEXT: pxor %xmm6, %xmm3
878 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
879 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4
880 ; SSSE3-NEXT: pand %xmm4, %xmm0
881 ; SSSE3-NEXT: pxor %xmm7, %xmm4
882 ; SSSE3-NEXT: por %xmm4, %xmm0
883 ; SSSE3-NEXT: pxor %xmm8, %xmm6
884 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm5
885 ; SSSE3-NEXT: pxor %xmm5, %xmm7
886 ; SSSE3-NEXT: pand %xmm8, %xmm5
887 ; SSSE3-NEXT: por %xmm7, %xmm5
888 ; SSSE3-NEXT: pslld $16, %xmm5
889 ; SSSE3-NEXT: psrad $16, %xmm5
890 ; SSSE3-NEXT: pslld $16, %xmm0
891 ; SSSE3-NEXT: psrad $16, %xmm0
892 ; SSSE3-NEXT: packssdw %xmm5, %xmm0
893 ; SSSE3-NEXT: pslld $16, %xmm2
894 ; SSSE3-NEXT: psrad $16, %xmm2
895 ; SSSE3-NEXT: pslld $16, %xmm1
896 ; SSSE3-NEXT: psrad $16, %xmm1
897 ; SSSE3-NEXT: packssdw %xmm2, %xmm1
900 ; SSE41-LABEL: trunc_usat_v16i32_v16i16:
902 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [65535,65535,65535,65535]
903 ; SSE41-NEXT: pminud %xmm4, %xmm3
904 ; SSE41-NEXT: pminud %xmm4, %xmm2
905 ; SSE41-NEXT: packusdw %xmm3, %xmm2
906 ; SSE41-NEXT: pminud %xmm4, %xmm1
907 ; SSE41-NEXT: pminud %xmm4, %xmm0
908 ; SSE41-NEXT: packusdw %xmm1, %xmm0
909 ; SSE41-NEXT: movdqa %xmm2, %xmm1
912 ; AVX1-LABEL: trunc_usat_v16i32_v16i16:
914 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
915 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [65535,65535,65535,65535]
916 ; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm2
917 ; AVX1-NEXT: vpminud %xmm3, %xmm0, %xmm0
918 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
919 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
920 ; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm2
921 ; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm1
922 ; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1
923 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
926 ; AVX2-LABEL: trunc_usat_v16i32_v16i16:
928 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535]
929 ; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm1
930 ; AVX2-NEXT: vpminud %ymm2, %ymm0, %ymm0
931 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
932 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
935 ; AVX512-LABEL: trunc_usat_v16i32_v16i16:
937 ; AVX512-NEXT: vpmovusdw %zmm0, %ymm0
939 %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>
940 %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>
941 %3 = trunc <16 x i32> %2 to <16 x i16>
946 ; Unsigned saturation truncation to v16i8
949 define <8 x i8> @trunc_usat_v8i64_v8i8(<8 x i64> %a0) {
950 ; SSE2-LABEL: trunc_usat_v8i64_v8i8:
952 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255]
953 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
954 ; SSE2-NEXT: movdqa %xmm1, %xmm7
955 ; SSE2-NEXT: pxor %xmm5, %xmm7
956 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
957 ; SSE2-NEXT: movdqa %xmm9, %xmm6
958 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm6
959 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
960 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm7
961 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
962 ; SSE2-NEXT: pand %xmm4, %xmm7
963 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
964 ; SSE2-NEXT: por %xmm7, %xmm4
965 ; SSE2-NEXT: pand %xmm4, %xmm1
966 ; SSE2-NEXT: pandn %xmm8, %xmm4
967 ; SSE2-NEXT: por %xmm1, %xmm4
968 ; SSE2-NEXT: movdqa %xmm0, %xmm1
969 ; SSE2-NEXT: pxor %xmm5, %xmm1
970 ; SSE2-NEXT: movdqa %xmm9, %xmm6
971 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm6
972 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
973 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm1
974 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
975 ; SSE2-NEXT: pand %xmm7, %xmm1
976 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
977 ; SSE2-NEXT: por %xmm1, %xmm6
978 ; SSE2-NEXT: pand %xmm6, %xmm0
979 ; SSE2-NEXT: pandn %xmm8, %xmm6
980 ; SSE2-NEXT: por %xmm6, %xmm0
981 ; SSE2-NEXT: packuswb %xmm4, %xmm0
982 ; SSE2-NEXT: movdqa %xmm3, %xmm1
983 ; SSE2-NEXT: pxor %xmm5, %xmm1
984 ; SSE2-NEXT: movdqa %xmm9, %xmm4
985 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4
986 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
987 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm1
988 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
989 ; SSE2-NEXT: pand %xmm6, %xmm1
990 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
991 ; SSE2-NEXT: por %xmm1, %xmm4
992 ; SSE2-NEXT: pand %xmm4, %xmm3
993 ; SSE2-NEXT: pandn %xmm8, %xmm4
994 ; SSE2-NEXT: por %xmm3, %xmm4
995 ; SSE2-NEXT: pxor %xmm2, %xmm5
996 ; SSE2-NEXT: movdqa %xmm9, %xmm1
997 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm1
998 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
999 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm5
1000 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1001 ; SSE2-NEXT: pand %xmm3, %xmm5
1002 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1003 ; SSE2-NEXT: por %xmm5, %xmm1
1004 ; SSE2-NEXT: pand %xmm1, %xmm2
1005 ; SSE2-NEXT: pandn %xmm8, %xmm1
1006 ; SSE2-NEXT: por %xmm2, %xmm1
1007 ; SSE2-NEXT: packuswb %xmm4, %xmm1
1008 ; SSE2-NEXT: packuswb %xmm1, %xmm0
1011 ; SSSE3-LABEL: trunc_usat_v8i64_v8i8:
1013 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255]
1014 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
1015 ; SSSE3-NEXT: movdqa %xmm1, %xmm7
1016 ; SSSE3-NEXT: pxor %xmm5, %xmm7
1017 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
1018 ; SSSE3-NEXT: movdqa %xmm9, %xmm6
1019 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm6
1020 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
1021 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm7
1022 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1023 ; SSSE3-NEXT: pand %xmm4, %xmm7
1024 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
1025 ; SSSE3-NEXT: por %xmm7, %xmm4
1026 ; SSSE3-NEXT: pand %xmm4, %xmm1
1027 ; SSSE3-NEXT: pandn %xmm8, %xmm4
1028 ; SSSE3-NEXT: por %xmm1, %xmm4
1029 ; SSSE3-NEXT: movdqa %xmm0, %xmm1
1030 ; SSSE3-NEXT: pxor %xmm5, %xmm1
1031 ; SSSE3-NEXT: movdqa %xmm9, %xmm6
1032 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm6
1033 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1034 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm1
1035 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1036 ; SSSE3-NEXT: pand %xmm7, %xmm1
1037 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1038 ; SSSE3-NEXT: por %xmm1, %xmm6
1039 ; SSSE3-NEXT: pand %xmm6, %xmm0
1040 ; SSSE3-NEXT: pandn %xmm8, %xmm6
1041 ; SSSE3-NEXT: por %xmm6, %xmm0
1042 ; SSSE3-NEXT: packuswb %xmm4, %xmm0
1043 ; SSSE3-NEXT: movdqa %xmm3, %xmm1
1044 ; SSSE3-NEXT: pxor %xmm5, %xmm1
1045 ; SSSE3-NEXT: movdqa %xmm9, %xmm4
1046 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4
1047 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = 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 %xmm6, %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, %xmm5
1057 ; SSSE3-NEXT: movdqa %xmm9, %xmm1
1058 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm1
1059 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
1060 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm5
1061 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[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
1072 ; SSE41-LABEL: trunc_usat_v8i64_v8i8:
1074 ; SSE41-NEXT: movdqa %xmm0, %xmm8
1075 ; SSE41-NEXT: movapd {{.*#+}} xmm5 = [255,255]
1076 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
1077 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1078 ; SSE41-NEXT: pxor %xmm6, %xmm0
1079 ; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
1080 ; SSE41-NEXT: movdqa %xmm9, %xmm7
1081 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
1082 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
1083 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
1084 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1085 ; SSE41-NEXT: pand %xmm4, %xmm0
1086 ; SSE41-NEXT: por %xmm7, %xmm0
1087 ; SSE41-NEXT: movapd %xmm5, %xmm4
1088 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4
1089 ; SSE41-NEXT: movdqa %xmm8, %xmm0
1090 ; SSE41-NEXT: pxor %xmm6, %xmm0
1091 ; SSE41-NEXT: movdqa %xmm9, %xmm1
1092 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
1093 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,0,2,2]
1094 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
1095 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1096 ; SSE41-NEXT: pand %xmm7, %xmm0
1097 ; SSE41-NEXT: por %xmm1, %xmm0
1098 ; SSE41-NEXT: movapd %xmm5, %xmm1
1099 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm1
1100 ; SSE41-NEXT: packusdw %xmm4, %xmm1
1101 ; SSE41-NEXT: movdqa %xmm3, %xmm0
1102 ; SSE41-NEXT: pxor %xmm6, %xmm0
1103 ; SSE41-NEXT: movdqa %xmm9, %xmm4
1104 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
1105 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
1106 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
1107 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1108 ; SSE41-NEXT: pand %xmm7, %xmm0
1109 ; SSE41-NEXT: por %xmm4, %xmm0
1110 ; SSE41-NEXT: movapd %xmm5, %xmm4
1111 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm4
1112 ; SSE41-NEXT: pxor %xmm2, %xmm6
1113 ; SSE41-NEXT: movdqa %xmm9, %xmm3
1114 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm3
1115 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm3[0,0,2,2]
1116 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm6
1117 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
1118 ; SSE41-NEXT: pand %xmm7, %xmm0
1119 ; SSE41-NEXT: por %xmm3, %xmm0
1120 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5
1121 ; SSE41-NEXT: packusdw %xmm4, %xmm5
1122 ; SSE41-NEXT: packusdw %xmm5, %xmm1
1123 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1126 ; AVX1-LABEL: trunc_usat_v8i64_v8i8:
1128 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1129 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm3
1130 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854776063,9223372036854776063]
1131 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm8
1132 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
1133 ; AVX1-NEXT: vpxor %xmm2, %xmm5, %xmm6
1134 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm4, %xmm6
1135 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm7
1136 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm4, %xmm7
1137 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
1138 ; AVX1-NEXT: vpxor %xmm2, %xmm3, %xmm2
1139 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm2
1140 ; AVX1-NEXT: vmovapd {{.*#+}} xmm4 = [255,255]
1141 ; AVX1-NEXT: vblendvpd %xmm2, %xmm3, %xmm4, %xmm2
1142 ; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm4, %xmm1
1143 ; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1
1144 ; AVX1-NEXT: vblendvpd %xmm6, %xmm5, %xmm4, %xmm2
1145 ; AVX1-NEXT: vblendvpd %xmm8, %xmm0, %xmm4, %xmm0
1146 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
1147 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1148 ; AVX1-NEXT: vzeroupper
1151 ; AVX2-LABEL: trunc_usat_v8i64_v8i8:
1153 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [255,255,255,255]
1154 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1155 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm4
1156 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
1157 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
1158 ; AVX2-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
1159 ; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm3
1160 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
1161 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1162 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
1163 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1164 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1165 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1166 ; AVX2-NEXT: vzeroupper
1169 ; AVX512-LABEL: trunc_usat_v8i64_v8i8:
1171 ; AVX512-NEXT: vpminuq {{.*}}(%rip){1to8}, %zmm0, %zmm0
1172 ; AVX512-NEXT: vpmovqw %zmm0, %xmm0
1173 ; AVX512-NEXT: vzeroupper
1175 %1 = icmp ult <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
1176 %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>
1177 %3 = trunc <8 x i64> %2 to <8 x i8>
1181 define void @trunc_usat_v8i64_v8i8_store(<8 x i64> %a0, <8 x i8> *%p1) {
1182 ; SSE2-LABEL: trunc_usat_v8i64_v8i8_store:
1184 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255]
1185 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
1186 ; SSE2-NEXT: movdqa %xmm1, %xmm7
1187 ; SSE2-NEXT: pxor %xmm5, %xmm7
1188 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
1189 ; SSE2-NEXT: movdqa %xmm9, %xmm6
1190 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm6
1191 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
1192 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm7
1193 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1194 ; SSE2-NEXT: pand %xmm4, %xmm7
1195 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
1196 ; SSE2-NEXT: por %xmm7, %xmm4
1197 ; SSE2-NEXT: pand %xmm4, %xmm1
1198 ; SSE2-NEXT: pandn %xmm8, %xmm4
1199 ; SSE2-NEXT: por %xmm1, %xmm4
1200 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1201 ; SSE2-NEXT: pxor %xmm5, %xmm1
1202 ; SSE2-NEXT: movdqa %xmm9, %xmm6
1203 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm6
1204 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
1205 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm1
1206 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
1207 ; SSE2-NEXT: pand %xmm10, %xmm7
1208 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
1209 ; SSE2-NEXT: por %xmm7, %xmm1
1210 ; SSE2-NEXT: pand %xmm1, %xmm0
1211 ; SSE2-NEXT: pandn %xmm8, %xmm1
1212 ; SSE2-NEXT: por %xmm0, %xmm1
1213 ; SSE2-NEXT: packuswb %xmm4, %xmm1
1214 ; SSE2-NEXT: movdqa %xmm3, %xmm0
1215 ; SSE2-NEXT: pxor %xmm5, %xmm0
1216 ; SSE2-NEXT: movdqa %xmm9, %xmm4
1217 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
1218 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1219 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm0
1220 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1221 ; SSE2-NEXT: pand %xmm6, %xmm0
1222 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1223 ; SSE2-NEXT: por %xmm0, %xmm4
1224 ; SSE2-NEXT: pand %xmm4, %xmm3
1225 ; SSE2-NEXT: pandn %xmm8, %xmm4
1226 ; SSE2-NEXT: por %xmm3, %xmm4
1227 ; SSE2-NEXT: pxor %xmm2, %xmm5
1228 ; SSE2-NEXT: movdqa %xmm9, %xmm0
1229 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm0
1230 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2]
1231 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm5
1232 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1233 ; SSE2-NEXT: pand %xmm3, %xmm5
1234 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1235 ; SSE2-NEXT: por %xmm5, %xmm0
1236 ; SSE2-NEXT: pand %xmm0, %xmm2
1237 ; SSE2-NEXT: pandn %xmm8, %xmm0
1238 ; SSE2-NEXT: por %xmm2, %xmm0
1239 ; SSE2-NEXT: packuswb %xmm4, %xmm0
1240 ; SSE2-NEXT: packuswb %xmm0, %xmm1
1241 ; SSE2-NEXT: packuswb %xmm1, %xmm1
1242 ; SSE2-NEXT: movq %xmm1, (%rdi)
1245 ; SSSE3-LABEL: trunc_usat_v8i64_v8i8_store:
1247 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255]
1248 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
1249 ; SSSE3-NEXT: movdqa %xmm1, %xmm7
1250 ; SSSE3-NEXT: pxor %xmm5, %xmm7
1251 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
1252 ; SSSE3-NEXT: movdqa %xmm9, %xmm6
1253 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm6
1254 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
1255 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm7
1256 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1257 ; SSSE3-NEXT: pand %xmm4, %xmm7
1258 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
1259 ; SSSE3-NEXT: por %xmm7, %xmm4
1260 ; SSSE3-NEXT: pand %xmm4, %xmm1
1261 ; SSSE3-NEXT: pandn %xmm8, %xmm4
1262 ; SSSE3-NEXT: por %xmm1, %xmm4
1263 ; SSSE3-NEXT: movdqa %xmm0, %xmm1
1264 ; SSSE3-NEXT: pxor %xmm5, %xmm1
1265 ; SSSE3-NEXT: movdqa %xmm9, %xmm6
1266 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm6
1267 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
1268 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm1
1269 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
1270 ; SSSE3-NEXT: pand %xmm10, %xmm7
1271 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
1272 ; SSSE3-NEXT: por %xmm7, %xmm1
1273 ; SSSE3-NEXT: pand %xmm1, %xmm0
1274 ; SSSE3-NEXT: pandn %xmm8, %xmm1
1275 ; SSSE3-NEXT: por %xmm0, %xmm1
1276 ; SSSE3-NEXT: packuswb %xmm4, %xmm1
1277 ; SSSE3-NEXT: movdqa %xmm3, %xmm0
1278 ; SSSE3-NEXT: pxor %xmm5, %xmm0
1279 ; SSSE3-NEXT: movdqa %xmm9, %xmm4
1280 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
1281 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1282 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm0
1283 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1284 ; SSSE3-NEXT: pand %xmm6, %xmm0
1285 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1286 ; SSSE3-NEXT: por %xmm0, %xmm4
1287 ; SSSE3-NEXT: pand %xmm4, %xmm3
1288 ; SSSE3-NEXT: pandn %xmm8, %xmm4
1289 ; SSSE3-NEXT: por %xmm3, %xmm4
1290 ; SSSE3-NEXT: pxor %xmm2, %xmm5
1291 ; SSSE3-NEXT: movdqa %xmm9, %xmm0
1292 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm0
1293 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2]
1294 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm5
1295 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1296 ; SSSE3-NEXT: pand %xmm3, %xmm5
1297 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1298 ; SSSE3-NEXT: por %xmm5, %xmm0
1299 ; SSSE3-NEXT: pand %xmm0, %xmm2
1300 ; SSSE3-NEXT: pandn %xmm8, %xmm0
1301 ; SSSE3-NEXT: por %xmm2, %xmm0
1302 ; SSSE3-NEXT: packuswb %xmm4, %xmm0
1303 ; SSSE3-NEXT: packuswb %xmm0, %xmm1
1304 ; SSSE3-NEXT: packuswb %xmm1, %xmm1
1305 ; SSSE3-NEXT: movq %xmm1, (%rdi)
1308 ; SSE41-LABEL: trunc_usat_v8i64_v8i8_store:
1310 ; SSE41-NEXT: movdqa %xmm0, %xmm8
1311 ; SSE41-NEXT: movapd {{.*#+}} xmm5 = [255,255]
1312 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
1313 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1314 ; SSE41-NEXT: pxor %xmm6, %xmm0
1315 ; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
1316 ; SSE41-NEXT: movdqa %xmm9, %xmm7
1317 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
1318 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
1319 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
1320 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1321 ; SSE41-NEXT: pand %xmm4, %xmm0
1322 ; SSE41-NEXT: por %xmm7, %xmm0
1323 ; SSE41-NEXT: movapd %xmm5, %xmm4
1324 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4
1325 ; SSE41-NEXT: movdqa %xmm8, %xmm0
1326 ; SSE41-NEXT: pxor %xmm6, %xmm0
1327 ; SSE41-NEXT: movdqa %xmm9, %xmm1
1328 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
1329 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,0,2,2]
1330 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
1331 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1332 ; SSE41-NEXT: pand %xmm7, %xmm0
1333 ; SSE41-NEXT: por %xmm1, %xmm0
1334 ; SSE41-NEXT: movapd %xmm5, %xmm1
1335 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm1
1336 ; SSE41-NEXT: packusdw %xmm4, %xmm1
1337 ; SSE41-NEXT: movdqa %xmm3, %xmm0
1338 ; SSE41-NEXT: pxor %xmm6, %xmm0
1339 ; SSE41-NEXT: movdqa %xmm9, %xmm4
1340 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
1341 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
1342 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
1343 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1344 ; SSE41-NEXT: pand %xmm7, %xmm0
1345 ; SSE41-NEXT: por %xmm4, %xmm0
1346 ; SSE41-NEXT: movapd %xmm5, %xmm4
1347 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm4
1348 ; SSE41-NEXT: pxor %xmm2, %xmm6
1349 ; SSE41-NEXT: movdqa %xmm9, %xmm3
1350 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm3
1351 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm3[0,0,2,2]
1352 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm6
1353 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
1354 ; SSE41-NEXT: pand %xmm7, %xmm0
1355 ; SSE41-NEXT: por %xmm3, %xmm0
1356 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5
1357 ; SSE41-NEXT: packusdw %xmm4, %xmm5
1358 ; SSE41-NEXT: packusdw %xmm5, %xmm1
1359 ; SSE41-NEXT: packuswb %xmm1, %xmm1
1360 ; SSE41-NEXT: movq %xmm1, (%rdi)
1363 ; AVX1-LABEL: trunc_usat_v8i64_v8i8_store:
1365 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1366 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm3
1367 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854776063,9223372036854776063]
1368 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm8
1369 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
1370 ; AVX1-NEXT: vpxor %xmm2, %xmm5, %xmm6
1371 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm4, %xmm6
1372 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm7
1373 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm4, %xmm7
1374 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
1375 ; AVX1-NEXT: vpxor %xmm2, %xmm3, %xmm2
1376 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm2
1377 ; AVX1-NEXT: vmovapd {{.*#+}} xmm4 = [255,255]
1378 ; AVX1-NEXT: vblendvpd %xmm2, %xmm3, %xmm4, %xmm2
1379 ; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm4, %xmm1
1380 ; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1
1381 ; AVX1-NEXT: vblendvpd %xmm6, %xmm5, %xmm4, %xmm2
1382 ; AVX1-NEXT: vblendvpd %xmm8, %xmm0, %xmm4, %xmm0
1383 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
1384 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1385 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
1386 ; AVX1-NEXT: vmovq %xmm0, (%rdi)
1387 ; AVX1-NEXT: vzeroupper
1390 ; AVX2-LABEL: trunc_usat_v8i64_v8i8_store:
1392 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [255,255,255,255]
1393 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1394 ; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm4
1395 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
1396 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
1397 ; AVX2-NEXT: vblendvpd %ymm4, %ymm0, %ymm2, %ymm0
1398 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm3
1399 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
1400 ; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
1401 ; AVX2-NEXT: vextractf128 $1, %ymm1, %xmm2
1402 ; AVX2-NEXT: vpackusdw %xmm2, %xmm1, %xmm1
1403 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1404 ; AVX2-NEXT: vpshufb %xmm2, %xmm1, %xmm1
1405 ; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm3
1406 ; AVX2-NEXT: vpackusdw %xmm3, %xmm0, %xmm0
1407 ; AVX2-NEXT: vpshufb %xmm2, %xmm0, %xmm0
1408 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1409 ; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
1410 ; AVX2-NEXT: vmovq %xmm0, (%rdi)
1411 ; AVX2-NEXT: vzeroupper
1414 ; AVX512-LABEL: trunc_usat_v8i64_v8i8_store:
1416 ; AVX512-NEXT: vpmovusqb %zmm0, (%rdi)
1417 ; AVX512-NEXT: vzeroupper
1419 %1 = icmp ult <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
1420 %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>
1421 %3 = trunc <8 x i64> %2 to <8 x i8>
1422 store <8 x i8> %3, <8 x i8> *%p1
1426 define <16 x i8> @trunc_usat_v16i64_v16i8(<16 x i64> %a0) {
1427 ; SSE2-LABEL: trunc_usat_v16i64_v16i8:
1429 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255]
1430 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259456,9223372039002259456]
1431 ; SSE2-NEXT: movdqa %xmm1, %xmm11
1432 ; SSE2-NEXT: pxor %xmm9, %xmm11
1433 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [9223372039002259711,9223372039002259711]
1434 ; SSE2-NEXT: movdqa %xmm10, %xmm12
1435 ; SSE2-NEXT: pcmpgtd %xmm11, %xmm12
1436 ; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
1437 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm11
1438 ; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]
1439 ; SSE2-NEXT: pand %xmm13, %xmm11
1440 ; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
1441 ; SSE2-NEXT: por %xmm11, %xmm12
1442 ; SSE2-NEXT: pand %xmm12, %xmm1
1443 ; SSE2-NEXT: pandn %xmm8, %xmm12
1444 ; SSE2-NEXT: por %xmm1, %xmm12
1445 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1446 ; SSE2-NEXT: pxor %xmm9, %xmm1
1447 ; SSE2-NEXT: movdqa %xmm10, %xmm11
1448 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm11
1449 ; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm11[0,0,2,2]
1450 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm1
1451 ; SSE2-NEXT: pshufd {{.*#+}} xmm14 = xmm1[1,1,3,3]
1452 ; SSE2-NEXT: pand %xmm13, %xmm14
1453 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3]
1454 ; SSE2-NEXT: por %xmm14, %xmm1
1455 ; SSE2-NEXT: pand %xmm1, %xmm0
1456 ; SSE2-NEXT: pandn %xmm8, %xmm1
1457 ; SSE2-NEXT: por %xmm1, %xmm0
1458 ; SSE2-NEXT: packuswb %xmm12, %xmm0
1459 ; SSE2-NEXT: movdqa %xmm3, %xmm1
1460 ; SSE2-NEXT: pxor %xmm9, %xmm1
1461 ; SSE2-NEXT: movdqa %xmm10, %xmm11
1462 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm11
1463 ; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1464 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm1
1465 ; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm1[1,1,3,3]
1466 ; SSE2-NEXT: pand %xmm12, %xmm13
1467 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3]
1468 ; SSE2-NEXT: por %xmm13, %xmm1
1469 ; SSE2-NEXT: pand %xmm1, %xmm3
1470 ; SSE2-NEXT: pandn %xmm8, %xmm1
1471 ; SSE2-NEXT: por %xmm3, %xmm1
1472 ; SSE2-NEXT: movdqa %xmm2, %xmm3
1473 ; SSE2-NEXT: pxor %xmm9, %xmm3
1474 ; SSE2-NEXT: movdqa %xmm10, %xmm11
1475 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm11
1476 ; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1477 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm3
1478 ; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm3[1,1,3,3]
1479 ; SSE2-NEXT: pand %xmm12, %xmm13
1480 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm11[1,1,3,3]
1481 ; SSE2-NEXT: por %xmm13, %xmm3
1482 ; SSE2-NEXT: pand %xmm3, %xmm2
1483 ; SSE2-NEXT: pandn %xmm8, %xmm3
1484 ; SSE2-NEXT: por %xmm2, %xmm3
1485 ; SSE2-NEXT: packuswb %xmm1, %xmm3
1486 ; SSE2-NEXT: packuswb %xmm3, %xmm0
1487 ; SSE2-NEXT: movdqa %xmm5, %xmm1
1488 ; SSE2-NEXT: pxor %xmm9, %xmm1
1489 ; SSE2-NEXT: movdqa %xmm10, %xmm2
1490 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
1491 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
1492 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm1
1493 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1494 ; SSE2-NEXT: pand %xmm3, %xmm1
1495 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1496 ; SSE2-NEXT: por %xmm1, %xmm2
1497 ; SSE2-NEXT: pand %xmm2, %xmm5
1498 ; SSE2-NEXT: pandn %xmm8, %xmm2
1499 ; SSE2-NEXT: por %xmm5, %xmm2
1500 ; SSE2-NEXT: movdqa %xmm4, %xmm1
1501 ; SSE2-NEXT: pxor %xmm9, %xmm1
1502 ; SSE2-NEXT: movdqa %xmm10, %xmm3
1503 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
1504 ; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm3[0,0,2,2]
1505 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm1
1506 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
1507 ; SSE2-NEXT: pand %xmm11, %xmm5
1508 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
1509 ; SSE2-NEXT: por %xmm5, %xmm1
1510 ; SSE2-NEXT: pand %xmm1, %xmm4
1511 ; SSE2-NEXT: pandn %xmm8, %xmm1
1512 ; SSE2-NEXT: por %xmm4, %xmm1
1513 ; SSE2-NEXT: packuswb %xmm2, %xmm1
1514 ; SSE2-NEXT: movdqa %xmm7, %xmm2
1515 ; SSE2-NEXT: pxor %xmm9, %xmm2
1516 ; SSE2-NEXT: movdqa %xmm10, %xmm3
1517 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
1518 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1519 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm2
1520 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1521 ; SSE2-NEXT: pand %xmm4, %xmm2
1522 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1523 ; SSE2-NEXT: por %xmm2, %xmm3
1524 ; SSE2-NEXT: pand %xmm3, %xmm7
1525 ; SSE2-NEXT: pandn %xmm8, %xmm3
1526 ; SSE2-NEXT: por %xmm7, %xmm3
1527 ; SSE2-NEXT: pxor %xmm6, %xmm9
1528 ; SSE2-NEXT: movdqa %xmm10, %xmm2
1529 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm2
1530 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1531 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm9
1532 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm9[1,1,3,3]
1533 ; SSE2-NEXT: pand %xmm4, %xmm5
1534 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1535 ; SSE2-NEXT: por %xmm5, %xmm2
1536 ; SSE2-NEXT: pand %xmm2, %xmm6
1537 ; SSE2-NEXT: pandn %xmm8, %xmm2
1538 ; SSE2-NEXT: por %xmm6, %xmm2
1539 ; SSE2-NEXT: packuswb %xmm3, %xmm2
1540 ; SSE2-NEXT: packuswb %xmm2, %xmm1
1541 ; SSE2-NEXT: packuswb %xmm1, %xmm0
1544 ; SSSE3-LABEL: trunc_usat_v16i64_v16i8:
1546 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255]
1547 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259456,9223372039002259456]
1548 ; SSSE3-NEXT: movdqa %xmm1, %xmm11
1549 ; SSSE3-NEXT: pxor %xmm9, %xmm11
1550 ; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [9223372039002259711,9223372039002259711]
1551 ; SSSE3-NEXT: movdqa %xmm10, %xmm12
1552 ; SSSE3-NEXT: pcmpgtd %xmm11, %xmm12
1553 ; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
1554 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm11
1555 ; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]
1556 ; SSSE3-NEXT: pand %xmm13, %xmm11
1557 ; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
1558 ; SSSE3-NEXT: por %xmm11, %xmm12
1559 ; SSSE3-NEXT: pand %xmm12, %xmm1
1560 ; SSSE3-NEXT: pandn %xmm8, %xmm12
1561 ; SSSE3-NEXT: por %xmm1, %xmm12
1562 ; SSSE3-NEXT: movdqa %xmm0, %xmm1
1563 ; SSSE3-NEXT: pxor %xmm9, %xmm1
1564 ; SSSE3-NEXT: movdqa %xmm10, %xmm11
1565 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm11
1566 ; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm11[0,0,2,2]
1567 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1
1568 ; SSSE3-NEXT: pshufd {{.*#+}} xmm14 = xmm1[1,1,3,3]
1569 ; SSSE3-NEXT: pand %xmm13, %xmm14
1570 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3]
1571 ; SSSE3-NEXT: por %xmm14, %xmm1
1572 ; SSSE3-NEXT: pand %xmm1, %xmm0
1573 ; SSSE3-NEXT: pandn %xmm8, %xmm1
1574 ; SSSE3-NEXT: por %xmm1, %xmm0
1575 ; SSSE3-NEXT: packuswb %xmm12, %xmm0
1576 ; SSSE3-NEXT: movdqa %xmm3, %xmm1
1577 ; SSSE3-NEXT: pxor %xmm9, %xmm1
1578 ; SSSE3-NEXT: movdqa %xmm10, %xmm11
1579 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm11
1580 ; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1581 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1
1582 ; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm1[1,1,3,3]
1583 ; SSSE3-NEXT: pand %xmm12, %xmm13
1584 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3]
1585 ; SSSE3-NEXT: por %xmm13, %xmm1
1586 ; SSSE3-NEXT: pand %xmm1, %xmm3
1587 ; SSSE3-NEXT: pandn %xmm8, %xmm1
1588 ; SSSE3-NEXT: por %xmm3, %xmm1
1589 ; SSSE3-NEXT: movdqa %xmm2, %xmm3
1590 ; SSSE3-NEXT: pxor %xmm9, %xmm3
1591 ; SSSE3-NEXT: movdqa %xmm10, %xmm11
1592 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm11
1593 ; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1594 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm3
1595 ; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm3[1,1,3,3]
1596 ; SSSE3-NEXT: pand %xmm12, %xmm13
1597 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm11[1,1,3,3]
1598 ; SSSE3-NEXT: por %xmm13, %xmm3
1599 ; SSSE3-NEXT: pand %xmm3, %xmm2
1600 ; SSSE3-NEXT: pandn %xmm8, %xmm3
1601 ; SSSE3-NEXT: por %xmm2, %xmm3
1602 ; SSSE3-NEXT: packuswb %xmm1, %xmm3
1603 ; SSSE3-NEXT: packuswb %xmm3, %xmm0
1604 ; SSSE3-NEXT: movdqa %xmm5, %xmm1
1605 ; SSSE3-NEXT: pxor %xmm9, %xmm1
1606 ; SSSE3-NEXT: movdqa %xmm10, %xmm2
1607 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
1608 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
1609 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1
1610 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1611 ; SSSE3-NEXT: pand %xmm3, %xmm1
1612 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1613 ; SSSE3-NEXT: por %xmm1, %xmm2
1614 ; SSSE3-NEXT: pand %xmm2, %xmm5
1615 ; SSSE3-NEXT: pandn %xmm8, %xmm2
1616 ; SSSE3-NEXT: por %xmm5, %xmm2
1617 ; SSSE3-NEXT: movdqa %xmm4, %xmm1
1618 ; SSSE3-NEXT: pxor %xmm9, %xmm1
1619 ; SSSE3-NEXT: movdqa %xmm10, %xmm3
1620 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3
1621 ; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm3[0,0,2,2]
1622 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1
1623 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
1624 ; SSSE3-NEXT: pand %xmm11, %xmm5
1625 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
1626 ; SSSE3-NEXT: por %xmm5, %xmm1
1627 ; SSSE3-NEXT: pand %xmm1, %xmm4
1628 ; SSSE3-NEXT: pandn %xmm8, %xmm1
1629 ; SSSE3-NEXT: por %xmm4, %xmm1
1630 ; SSSE3-NEXT: packuswb %xmm2, %xmm1
1631 ; SSSE3-NEXT: movdqa %xmm7, %xmm2
1632 ; SSSE3-NEXT: pxor %xmm9, %xmm2
1633 ; SSSE3-NEXT: movdqa %xmm10, %xmm3
1634 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
1635 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1636 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm2
1637 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1638 ; SSSE3-NEXT: pand %xmm4, %xmm2
1639 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1640 ; SSSE3-NEXT: por %xmm2, %xmm3
1641 ; SSSE3-NEXT: pand %xmm3, %xmm7
1642 ; SSSE3-NEXT: pandn %xmm8, %xmm3
1643 ; SSSE3-NEXT: por %xmm7, %xmm3
1644 ; SSSE3-NEXT: pxor %xmm6, %xmm9
1645 ; SSSE3-NEXT: movdqa %xmm10, %xmm2
1646 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm2
1647 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1648 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm9
1649 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm9[1,1,3,3]
1650 ; SSSE3-NEXT: pand %xmm4, %xmm5
1651 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1652 ; SSSE3-NEXT: por %xmm5, %xmm2
1653 ; SSSE3-NEXT: pand %xmm2, %xmm6
1654 ; SSSE3-NEXT: pandn %xmm8, %xmm2
1655 ; SSSE3-NEXT: por %xmm6, %xmm2
1656 ; SSSE3-NEXT: packuswb %xmm3, %xmm2
1657 ; SSSE3-NEXT: packuswb %xmm2, %xmm1
1658 ; SSSE3-NEXT: packuswb %xmm1, %xmm0
1661 ; SSE41-LABEL: trunc_usat_v16i64_v16i8:
1663 ; SSE41-NEXT: movdqa %xmm0, %xmm8
1664 ; SSE41-NEXT: movapd {{.*#+}} xmm9 = [255,255]
1665 ; SSE41-NEXT: movdqa {{.*#+}} xmm10 = [9223372039002259456,9223372039002259456]
1666 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1667 ; SSE41-NEXT: pxor %xmm10, %xmm0
1668 ; SSE41-NEXT: movdqa {{.*#+}} xmm11 = [9223372039002259711,9223372039002259711]
1669 ; SSE41-NEXT: movdqa %xmm11, %xmm12
1670 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm12
1671 ; SSE41-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
1672 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0
1673 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1674 ; SSE41-NEXT: pand %xmm13, %xmm0
1675 ; SSE41-NEXT: por %xmm12, %xmm0
1676 ; SSE41-NEXT: movapd %xmm9, %xmm12
1677 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm12
1678 ; SSE41-NEXT: movdqa %xmm8, %xmm0
1679 ; SSE41-NEXT: pxor %xmm10, %xmm0
1680 ; SSE41-NEXT: movdqa %xmm11, %xmm1
1681 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
1682 ; SSE41-NEXT: pshufd {{.*#+}} xmm13 = xmm1[0,0,2,2]
1683 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0
1684 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1685 ; SSE41-NEXT: pand %xmm13, %xmm0
1686 ; SSE41-NEXT: por %xmm1, %xmm0
1687 ; SSE41-NEXT: movapd %xmm9, %xmm13
1688 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm13
1689 ; SSE41-NEXT: packusdw %xmm12, %xmm13
1690 ; SSE41-NEXT: movdqa %xmm3, %xmm0
1691 ; SSE41-NEXT: pxor %xmm10, %xmm0
1692 ; SSE41-NEXT: movdqa %xmm11, %xmm1
1693 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
1694 ; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm1[0,0,2,2]
1695 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0
1696 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1697 ; SSE41-NEXT: pand %xmm8, %xmm0
1698 ; SSE41-NEXT: por %xmm1, %xmm0
1699 ; SSE41-NEXT: movapd %xmm9, %xmm1
1700 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm1
1701 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1702 ; SSE41-NEXT: pxor %xmm10, %xmm0
1703 ; SSE41-NEXT: movdqa %xmm11, %xmm3
1704 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
1705 ; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm3[0,0,2,2]
1706 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0
1707 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1708 ; SSE41-NEXT: pand %xmm8, %xmm0
1709 ; SSE41-NEXT: por %xmm3, %xmm0
1710 ; SSE41-NEXT: movapd %xmm9, %xmm3
1711 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm3
1712 ; SSE41-NEXT: packusdw %xmm1, %xmm3
1713 ; SSE41-NEXT: packusdw %xmm3, %xmm13
1714 ; SSE41-NEXT: movdqa %xmm5, %xmm0
1715 ; SSE41-NEXT: pxor %xmm10, %xmm0
1716 ; SSE41-NEXT: movdqa %xmm11, %xmm1
1717 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
1718 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
1719 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0
1720 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1721 ; SSE41-NEXT: pand %xmm2, %xmm0
1722 ; SSE41-NEXT: por %xmm1, %xmm0
1723 ; SSE41-NEXT: movapd %xmm9, %xmm1
1724 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1
1725 ; SSE41-NEXT: movdqa %xmm4, %xmm0
1726 ; SSE41-NEXT: pxor %xmm10, %xmm0
1727 ; SSE41-NEXT: movdqa %xmm11, %xmm2
1728 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
1729 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
1730 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0
1731 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1732 ; SSE41-NEXT: pand %xmm3, %xmm0
1733 ; SSE41-NEXT: por %xmm2, %xmm0
1734 ; SSE41-NEXT: movapd %xmm9, %xmm2
1735 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2
1736 ; SSE41-NEXT: packusdw %xmm1, %xmm2
1737 ; SSE41-NEXT: movdqa %xmm7, %xmm0
1738 ; SSE41-NEXT: pxor %xmm10, %xmm0
1739 ; SSE41-NEXT: movdqa %xmm11, %xmm1
1740 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
1741 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
1742 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0
1743 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1744 ; SSE41-NEXT: pand %xmm3, %xmm0
1745 ; SSE41-NEXT: por %xmm1, %xmm0
1746 ; SSE41-NEXT: movapd %xmm9, %xmm1
1747 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm1
1748 ; SSE41-NEXT: pxor %xmm6, %xmm10
1749 ; SSE41-NEXT: movdqa %xmm11, %xmm3
1750 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm3
1751 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1752 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm10
1753 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]
1754 ; SSE41-NEXT: pand %xmm4, %xmm0
1755 ; SSE41-NEXT: por %xmm3, %xmm0
1756 ; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm9
1757 ; SSE41-NEXT: packusdw %xmm1, %xmm9
1758 ; SSE41-NEXT: packusdw %xmm9, %xmm2
1759 ; SSE41-NEXT: packuswb %xmm2, %xmm13
1760 ; SSE41-NEXT: movdqa %xmm13, %xmm0
1763 ; AVX1-LABEL: trunc_usat_v16i64_v16i8:
1765 ; AVX1-NEXT: vmovdqa %ymm0, %ymm8
1766 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]
1767 ; AVX1-NEXT: vpxor %xmm5, %xmm8, %xmm4
1768 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [9223372036854776063,9223372036854776063]
1769 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm0
1770 ; AVX1-NEXT: vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1771 ; AVX1-NEXT: vextractf128 $1, %ymm8, %xmm11
1772 ; AVX1-NEXT: vpxor %xmm5, %xmm11, %xmm4
1773 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm0
1774 ; AVX1-NEXT: vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1775 ; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm4
1776 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm10
1777 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm14
1778 ; AVX1-NEXT: vpxor %xmm5, %xmm14, %xmm7
1779 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm6, %xmm12
1780 ; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm7
1781 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm6, %xmm13
1782 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm7
1783 ; AVX1-NEXT: vpxor %xmm5, %xmm7, %xmm4
1784 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm15
1785 ; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm4
1786 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm4
1787 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm0
1788 ; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm5
1789 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5
1790 ; AVX1-NEXT: vmovapd {{.*#+}} xmm6 = [255,255]
1791 ; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm6, %xmm9
1792 ; AVX1-NEXT: vblendvpd %xmm4, %xmm3, %xmm6, %xmm3
1793 ; AVX1-NEXT: vblendvpd %xmm15, %xmm7, %xmm6, %xmm4
1794 ; AVX1-NEXT: vblendvpd %xmm13, %xmm2, %xmm6, %xmm2
1795 ; AVX1-NEXT: vblendvpd %xmm12, %xmm14, %xmm6, %xmm5
1796 ; AVX1-NEXT: vblendvpd %xmm10, %xmm1, %xmm6, %xmm1
1797 ; AVX1-NEXT: vmovapd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1798 ; AVX1-NEXT: vblendvpd %xmm0, %xmm11, %xmm6, %xmm7
1799 ; AVX1-NEXT: vmovapd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1800 ; AVX1-NEXT: vblendvpd %xmm0, %xmm8, %xmm6, %xmm6
1801 ; AVX1-NEXT: vpackusdw %xmm9, %xmm3, %xmm0
1802 ; AVX1-NEXT: vpackusdw %xmm4, %xmm2, %xmm2
1803 ; AVX1-NEXT: vpackusdw %xmm0, %xmm2, %xmm0
1804 ; AVX1-NEXT: vpackusdw %xmm5, %xmm1, %xmm1
1805 ; AVX1-NEXT: vpackusdw %xmm7, %xmm6, %xmm2
1806 ; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm1
1807 ; AVX1-NEXT: vpackuswb %xmm0, %xmm1, %xmm0
1808 ; AVX1-NEXT: vzeroupper
1811 ; AVX2-LABEL: trunc_usat_v16i64_v16i8:
1813 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm4 = [255,255,255,255]
1814 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1815 ; AVX2-NEXT: vpxor %ymm5, %ymm1, %ymm6
1816 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm7 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
1817 ; AVX2-NEXT: vpcmpgtq %ymm6, %ymm7, %ymm6
1818 ; AVX2-NEXT: vblendvpd %ymm6, %ymm1, %ymm4, %ymm1
1819 ; AVX2-NEXT: vpxor %ymm5, %ymm0, %ymm6
1820 ; AVX2-NEXT: vpcmpgtq %ymm6, %ymm7, %ymm6
1821 ; AVX2-NEXT: vblendvpd %ymm6, %ymm0, %ymm4, %ymm0
1822 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
1823 ; AVX2-NEXT: vpxor %ymm5, %ymm3, %ymm1
1824 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm7, %ymm1
1825 ; AVX2-NEXT: vblendvpd %ymm1, %ymm3, %ymm4, %ymm1
1826 ; AVX2-NEXT: vpxor %ymm5, %ymm2, %ymm3
1827 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm7, %ymm3
1828 ; AVX2-NEXT: vblendvpd %ymm3, %ymm2, %ymm4, %ymm2
1829 ; AVX2-NEXT: vpackusdw %ymm1, %ymm2, %ymm1
1830 ; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
1831 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1832 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
1833 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1834 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1835 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
1836 ; AVX2-NEXT: vzeroupper
1839 ; AVX512-LABEL: trunc_usat_v16i64_v16i8:
1841 ; AVX512-NEXT: vpbroadcastq {{.*#+}} zmm2 = [255,255,255,255,255,255,255,255]
1842 ; AVX512-NEXT: vpminuq %zmm2, %zmm1, %zmm1
1843 ; AVX512-NEXT: vpminuq %zmm2, %zmm0, %zmm0
1844 ; AVX512-NEXT: vpmovqd %zmm0, %ymm0
1845 ; AVX512-NEXT: vpmovqd %zmm1, %ymm1
1846 ; AVX512-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0
1847 ; AVX512-NEXT: vpmovdb %zmm0, %xmm0
1848 ; AVX512-NEXT: vzeroupper
1850 %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>
1851 %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>
1852 %3 = trunc <16 x i64> %2 to <16 x i8>
1856 define <8 x i8> @trunc_usat_v8i32_v8i8(<8 x i32> %a0) {
1857 ; SSE2-LABEL: trunc_usat_v8i32_v8i8:
1859 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
1860 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
1861 ; SSE2-NEXT: movdqa %xmm1, %xmm4
1862 ; SSE2-NEXT: pxor %xmm3, %xmm4
1863 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
1864 ; SSE2-NEXT: movdqa %xmm5, %xmm6
1865 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm6
1866 ; SSE2-NEXT: pand %xmm6, %xmm1
1867 ; SSE2-NEXT: pandn %xmm2, %xmm6
1868 ; SSE2-NEXT: por %xmm1, %xmm6
1869 ; SSE2-NEXT: pxor %xmm0, %xmm3
1870 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
1871 ; SSE2-NEXT: pand %xmm5, %xmm0
1872 ; SSE2-NEXT: pandn %xmm2, %xmm5
1873 ; SSE2-NEXT: por %xmm5, %xmm0
1874 ; SSE2-NEXT: packuswb %xmm6, %xmm0
1877 ; SSSE3-LABEL: trunc_usat_v8i32_v8i8:
1879 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
1880 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
1881 ; SSSE3-NEXT: movdqa %xmm1, %xmm4
1882 ; SSSE3-NEXT: pxor %xmm3, %xmm4
1883 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
1884 ; SSSE3-NEXT: movdqa %xmm5, %xmm6
1885 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
1886 ; SSSE3-NEXT: pand %xmm6, %xmm1
1887 ; SSSE3-NEXT: pandn %xmm2, %xmm6
1888 ; SSSE3-NEXT: por %xmm1, %xmm6
1889 ; SSSE3-NEXT: pxor %xmm0, %xmm3
1890 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
1891 ; SSSE3-NEXT: pand %xmm5, %xmm0
1892 ; SSSE3-NEXT: pandn %xmm2, %xmm5
1893 ; SSSE3-NEXT: por %xmm5, %xmm0
1894 ; SSSE3-NEXT: packuswb %xmm6, %xmm0
1897 ; SSE41-LABEL: trunc_usat_v8i32_v8i8:
1899 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
1900 ; SSE41-NEXT: pminud %xmm2, %xmm1
1901 ; SSE41-NEXT: pminud %xmm2, %xmm0
1902 ; SSE41-NEXT: packusdw %xmm1, %xmm0
1905 ; AVX1-LABEL: trunc_usat_v8i32_v8i8:
1907 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1908 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [255,255,255,255]
1909 ; AVX1-NEXT: vpminud %xmm2, %xmm1, %xmm1
1910 ; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0
1911 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1912 ; AVX1-NEXT: vzeroupper
1915 ; AVX2-LABEL: trunc_usat_v8i32_v8i8:
1917 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
1918 ; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0
1919 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1920 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1921 ; AVX2-NEXT: vzeroupper
1924 ; AVX512F-LABEL: trunc_usat_v8i32_v8i8:
1926 ; AVX512F-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
1927 ; AVX512F-NEXT: vpminud %ymm1, %ymm0, %ymm0
1928 ; AVX512F-NEXT: vpmovdw %zmm0, %ymm0
1929 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
1930 ; AVX512F-NEXT: vzeroupper
1931 ; AVX512F-NEXT: retq
1933 ; AVX512VL-LABEL: trunc_usat_v8i32_v8i8:
1934 ; AVX512VL: # %bb.0:
1935 ; AVX512VL-NEXT: vpminud {{.*}}(%rip){1to8}, %ymm0, %ymm0
1936 ; AVX512VL-NEXT: vpmovdw %ymm0, %xmm0
1937 ; AVX512VL-NEXT: vzeroupper
1938 ; AVX512VL-NEXT: retq
1940 ; AVX512BW-LABEL: trunc_usat_v8i32_v8i8:
1941 ; AVX512BW: # %bb.0:
1942 ; AVX512BW-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
1943 ; AVX512BW-NEXT: vpminud %ymm1, %ymm0, %ymm0
1944 ; AVX512BW-NEXT: vpmovdw %zmm0, %ymm0
1945 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
1946 ; AVX512BW-NEXT: vzeroupper
1947 ; AVX512BW-NEXT: retq
1949 ; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i8:
1950 ; AVX512BWVL: # %bb.0:
1951 ; AVX512BWVL-NEXT: vpminud {{.*}}(%rip){1to8}, %ymm0, %ymm0
1952 ; AVX512BWVL-NEXT: vpmovdw %ymm0, %xmm0
1953 ; AVX512BWVL-NEXT: vzeroupper
1954 ; AVX512BWVL-NEXT: retq
1955 %1 = icmp ult <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
1956 %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>
1957 %3 = trunc <8 x i32> %2 to <8 x i8>
1961 define void @trunc_usat_v8i32_v8i8_store(<8 x i32> %a0, <8 x i8> *%p1) {
1962 ; SSE2-LABEL: trunc_usat_v8i32_v8i8_store:
1964 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
1965 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
1966 ; SSE2-NEXT: movdqa %xmm1, %xmm4
1967 ; SSE2-NEXT: pxor %xmm3, %xmm4
1968 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
1969 ; SSE2-NEXT: movdqa %xmm5, %xmm6
1970 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm6
1971 ; SSE2-NEXT: pand %xmm6, %xmm1
1972 ; SSE2-NEXT: pandn %xmm2, %xmm6
1973 ; SSE2-NEXT: por %xmm1, %xmm6
1974 ; SSE2-NEXT: pxor %xmm0, %xmm3
1975 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
1976 ; SSE2-NEXT: pand %xmm5, %xmm0
1977 ; SSE2-NEXT: pandn %xmm2, %xmm5
1978 ; SSE2-NEXT: por %xmm0, %xmm5
1979 ; SSE2-NEXT: packuswb %xmm6, %xmm5
1980 ; SSE2-NEXT: packuswb %xmm5, %xmm5
1981 ; SSE2-NEXT: movq %xmm5, (%rdi)
1984 ; SSSE3-LABEL: trunc_usat_v8i32_v8i8_store:
1986 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
1987 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
1988 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
1989 ; SSSE3-NEXT: pxor %xmm3, %xmm4
1990 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
1991 ; SSSE3-NEXT: movdqa %xmm5, %xmm6
1992 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
1993 ; SSSE3-NEXT: pand %xmm6, %xmm0
1994 ; SSSE3-NEXT: pandn %xmm2, %xmm6
1995 ; SSSE3-NEXT: por %xmm0, %xmm6
1996 ; SSSE3-NEXT: pxor %xmm1, %xmm3
1997 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
1998 ; SSSE3-NEXT: pand %xmm5, %xmm1
1999 ; SSSE3-NEXT: pandn %xmm2, %xmm5
2000 ; SSSE3-NEXT: por %xmm1, %xmm5
2001 ; SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
2002 ; SSSE3-NEXT: pshufb %xmm0, %xmm5
2003 ; SSSE3-NEXT: pshufb %xmm0, %xmm6
2004 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm6 = xmm6[0],xmm5[0]
2005 ; SSSE3-NEXT: pshufb {{.*#+}} xmm6 = xmm6[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
2006 ; SSSE3-NEXT: movq %xmm6, (%rdi)
2009 ; SSE41-LABEL: trunc_usat_v8i32_v8i8_store:
2011 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
2012 ; SSE41-NEXT: pminud %xmm2, %xmm1
2013 ; SSE41-NEXT: pminud %xmm2, %xmm0
2014 ; SSE41-NEXT: packusdw %xmm1, %xmm0
2015 ; SSE41-NEXT: packuswb %xmm0, %xmm0
2016 ; SSE41-NEXT: movq %xmm0, (%rdi)
2019 ; AVX1-LABEL: trunc_usat_v8i32_v8i8_store:
2021 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
2022 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [255,255,255,255]
2023 ; AVX1-NEXT: vpminud %xmm2, %xmm1, %xmm1
2024 ; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0
2025 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
2026 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2027 ; AVX1-NEXT: vmovq %xmm0, (%rdi)
2028 ; AVX1-NEXT: vzeroupper
2031 ; AVX2-LABEL: trunc_usat_v8i32_v8i8_store:
2033 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
2034 ; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0
2035 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
2036 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
2037 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2038 ; AVX2-NEXT: vmovq %xmm0, (%rdi)
2039 ; AVX2-NEXT: vzeroupper
2042 ; AVX512F-LABEL: trunc_usat_v8i32_v8i8_store:
2044 ; AVX512F-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
2045 ; AVX512F-NEXT: vpminud %ymm1, %ymm0, %ymm0
2046 ; AVX512F-NEXT: vpmovdw %zmm0, %ymm0
2047 ; AVX512F-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2048 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
2049 ; AVX512F-NEXT: vzeroupper
2050 ; AVX512F-NEXT: retq
2052 ; AVX512VL-LABEL: trunc_usat_v8i32_v8i8_store:
2053 ; AVX512VL: # %bb.0:
2054 ; AVX512VL-NEXT: vpmovusdb %ymm0, (%rdi)
2055 ; AVX512VL-NEXT: vzeroupper
2056 ; AVX512VL-NEXT: retq
2058 ; AVX512BW-LABEL: trunc_usat_v8i32_v8i8_store:
2059 ; AVX512BW: # %bb.0:
2060 ; AVX512BW-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
2061 ; AVX512BW-NEXT: vpminud %ymm1, %ymm0, %ymm0
2062 ; AVX512BW-NEXT: vpmovdw %zmm0, %ymm0
2063 ; AVX512BW-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2064 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
2065 ; AVX512BW-NEXT: vzeroupper
2066 ; AVX512BW-NEXT: retq
2068 ; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i8_store:
2069 ; AVX512BWVL: # %bb.0:
2070 ; AVX512BWVL-NEXT: vpmovusdb %ymm0, (%rdi)
2071 ; AVX512BWVL-NEXT: vzeroupper
2072 ; AVX512BWVL-NEXT: retq
2073 %1 = icmp ult <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
2074 %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>
2075 %3 = trunc <8 x i32> %2 to <8 x i8>
2076 store <8 x i8> %3, <8 x i8> *%p1
2080 define <16 x i8> @trunc_usat_v16i32_v16i8(<16 x i32> %a0) {
2081 ; SSE2-LABEL: trunc_usat_v16i32_v16i8:
2083 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255,255,255]
2084 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
2085 ; SSE2-NEXT: movdqa %xmm1, %xmm7
2086 ; SSE2-NEXT: pxor %xmm6, %xmm7
2087 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
2088 ; SSE2-NEXT: movdqa %xmm5, %xmm4
2089 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm4
2090 ; SSE2-NEXT: pand %xmm4, %xmm1
2091 ; SSE2-NEXT: pandn %xmm8, %xmm4
2092 ; SSE2-NEXT: por %xmm1, %xmm4
2093 ; SSE2-NEXT: movdqa %xmm0, %xmm1
2094 ; SSE2-NEXT: pxor %xmm6, %xmm1
2095 ; SSE2-NEXT: movdqa %xmm5, %xmm7
2096 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm7
2097 ; SSE2-NEXT: pand %xmm7, %xmm0
2098 ; SSE2-NEXT: pandn %xmm8, %xmm7
2099 ; SSE2-NEXT: por %xmm7, %xmm0
2100 ; SSE2-NEXT: packuswb %xmm4, %xmm0
2101 ; SSE2-NEXT: movdqa %xmm3, %xmm1
2102 ; SSE2-NEXT: pxor %xmm6, %xmm1
2103 ; SSE2-NEXT: movdqa %xmm5, %xmm4
2104 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4
2105 ; SSE2-NEXT: pand %xmm4, %xmm3
2106 ; SSE2-NEXT: pandn %xmm8, %xmm4
2107 ; SSE2-NEXT: por %xmm3, %xmm4
2108 ; SSE2-NEXT: pxor %xmm2, %xmm6
2109 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm5
2110 ; SSE2-NEXT: pand %xmm5, %xmm2
2111 ; SSE2-NEXT: pandn %xmm8, %xmm5
2112 ; SSE2-NEXT: por %xmm2, %xmm5
2113 ; SSE2-NEXT: packuswb %xmm4, %xmm5
2114 ; SSE2-NEXT: packuswb %xmm5, %xmm0
2117 ; SSSE3-LABEL: trunc_usat_v16i32_v16i8:
2119 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255,255,255]
2120 ; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
2121 ; SSSE3-NEXT: movdqa %xmm1, %xmm7
2122 ; SSSE3-NEXT: pxor %xmm6, %xmm7
2123 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
2124 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
2125 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm4
2126 ; SSSE3-NEXT: pand %xmm4, %xmm1
2127 ; SSSE3-NEXT: pandn %xmm8, %xmm4
2128 ; SSSE3-NEXT: por %xmm1, %xmm4
2129 ; SSSE3-NEXT: movdqa %xmm0, %xmm1
2130 ; SSSE3-NEXT: pxor %xmm6, %xmm1
2131 ; SSSE3-NEXT: movdqa %xmm5, %xmm7
2132 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm7
2133 ; SSSE3-NEXT: pand %xmm7, %xmm0
2134 ; SSSE3-NEXT: pandn %xmm8, %xmm7
2135 ; SSSE3-NEXT: por %xmm7, %xmm0
2136 ; SSSE3-NEXT: packuswb %xmm4, %xmm0
2137 ; SSSE3-NEXT: movdqa %xmm3, %xmm1
2138 ; SSSE3-NEXT: pxor %xmm6, %xmm1
2139 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
2140 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4
2141 ; SSSE3-NEXT: pand %xmm4, %xmm3
2142 ; SSSE3-NEXT: pandn %xmm8, %xmm4
2143 ; SSSE3-NEXT: por %xmm3, %xmm4
2144 ; SSSE3-NEXT: pxor %xmm2, %xmm6
2145 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm5
2146 ; SSSE3-NEXT: pand %xmm5, %xmm2
2147 ; SSSE3-NEXT: pandn %xmm8, %xmm5
2148 ; SSSE3-NEXT: por %xmm2, %xmm5
2149 ; SSSE3-NEXT: packuswb %xmm4, %xmm5
2150 ; SSSE3-NEXT: packuswb %xmm5, %xmm0
2153 ; SSE41-LABEL: trunc_usat_v16i32_v16i8:
2155 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255]
2156 ; SSE41-NEXT: pminud %xmm4, %xmm1
2157 ; SSE41-NEXT: pminud %xmm4, %xmm0
2158 ; SSE41-NEXT: packusdw %xmm1, %xmm0
2159 ; SSE41-NEXT: pminud %xmm4, %xmm3
2160 ; SSE41-NEXT: pminud %xmm4, %xmm2
2161 ; SSE41-NEXT: packusdw %xmm3, %xmm2
2162 ; SSE41-NEXT: packuswb %xmm2, %xmm0
2165 ; AVX1-LABEL: trunc_usat_v16i32_v16i8:
2167 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
2168 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255]
2169 ; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm2
2170 ; AVX1-NEXT: vpminud %xmm3, %xmm0, %xmm0
2171 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
2172 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
2173 ; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm2
2174 ; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm1
2175 ; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1
2176 ; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
2177 ; AVX1-NEXT: vzeroupper
2180 ; AVX2-LABEL: trunc_usat_v16i32_v16i8:
2182 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]
2183 ; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm1
2184 ; AVX2-NEXT: vpminud %ymm2, %ymm0, %ymm0
2185 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
2186 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2187 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
2188 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
2189 ; AVX2-NEXT: vzeroupper
2192 ; AVX512-LABEL: trunc_usat_v16i32_v16i8:
2194 ; AVX512-NEXT: vpmovusdb %zmm0, %xmm0
2195 ; AVX512-NEXT: vzeroupper
2197 %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>
2198 %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>
2199 %3 = trunc <16 x i32> %2 to <16 x i8>
2203 define <16 x i8> @trunc_usat_v16i16_v16i8(<16 x i16> %a0) {
2204 ; SSE2-LABEL: trunc_usat_v16i16_v16i8:
2206 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
2207 ; SSE2-NEXT: pxor %xmm2, %xmm1
2208 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [33023,33023,33023,33023,33023,33023,33023,33023]
2209 ; SSE2-NEXT: pminsw %xmm3, %xmm1
2210 ; SSE2-NEXT: pxor %xmm2, %xmm1
2211 ; SSE2-NEXT: pxor %xmm2, %xmm0
2212 ; SSE2-NEXT: pminsw %xmm3, %xmm0
2213 ; SSE2-NEXT: pxor %xmm2, %xmm0
2214 ; SSE2-NEXT: packuswb %xmm1, %xmm0
2217 ; SSSE3-LABEL: trunc_usat_v16i16_v16i8:
2219 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
2220 ; SSSE3-NEXT: pxor %xmm2, %xmm1
2221 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [33023,33023,33023,33023,33023,33023,33023,33023]
2222 ; SSSE3-NEXT: pminsw %xmm3, %xmm1
2223 ; SSSE3-NEXT: pxor %xmm2, %xmm1
2224 ; SSSE3-NEXT: pxor %xmm2, %xmm0
2225 ; SSSE3-NEXT: pminsw %xmm3, %xmm0
2226 ; SSSE3-NEXT: pxor %xmm2, %xmm0
2227 ; SSSE3-NEXT: packuswb %xmm1, %xmm0
2230 ; SSE41-LABEL: trunc_usat_v16i16_v16i8:
2232 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
2233 ; SSE41-NEXT: pminuw %xmm2, %xmm1
2234 ; SSE41-NEXT: pminuw %xmm2, %xmm0
2235 ; SSE41-NEXT: packuswb %xmm1, %xmm0
2238 ; AVX1-LABEL: trunc_usat_v16i16_v16i8:
2240 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
2241 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
2242 ; AVX1-NEXT: vpminuw %xmm2, %xmm1, %xmm1
2243 ; AVX1-NEXT: vpminuw %xmm2, %xmm0, %xmm0
2244 ; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
2245 ; AVX1-NEXT: vzeroupper
2248 ; AVX2-LABEL: trunc_usat_v16i16_v16i8:
2250 ; AVX2-NEXT: vpminuw {{.*}}(%rip), %ymm0, %ymm0
2251 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
2252 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
2253 ; AVX2-NEXT: vzeroupper
2256 ; AVX512F-LABEL: trunc_usat_v16i16_v16i8:
2258 ; AVX512F-NEXT: vpminuw {{.*}}(%rip), %ymm0, %ymm0
2259 ; 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
2260 ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0
2261 ; AVX512F-NEXT: vzeroupper
2262 ; AVX512F-NEXT: retq
2264 ; AVX512VL-LABEL: trunc_usat_v16i16_v16i8:
2265 ; AVX512VL: # %bb.0:
2266 ; AVX512VL-NEXT: vpminuw {{.*}}(%rip), %ymm0, %ymm0
2267 ; 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
2268 ; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0
2269 ; AVX512VL-NEXT: vzeroupper
2270 ; AVX512VL-NEXT: retq
2272 ; AVX512BW-LABEL: trunc_usat_v16i16_v16i8:
2273 ; AVX512BW: # %bb.0:
2274 ; AVX512BW-NEXT: vpminuw {{.*}}(%rip), %ymm0, %ymm0
2275 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
2276 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
2277 ; AVX512BW-NEXT: vzeroupper
2278 ; AVX512BW-NEXT: retq
2280 ; AVX512BWVL-LABEL: trunc_usat_v16i16_v16i8:
2281 ; AVX512BWVL: # %bb.0:
2282 ; AVX512BWVL-NEXT: vpmovuswb %ymm0, %xmm0
2283 ; AVX512BWVL-NEXT: vzeroupper
2284 ; AVX512BWVL-NEXT: retq
2285 %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>
2286 %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>
2287 %3 = trunc <16 x i16> %2 to <16 x i8>
2291 define <32 x i8> @trunc_usat_v32i16_v32i8(<32 x i16> %a0) {
2292 ; SSE2-LABEL: trunc_usat_v32i16_v32i8:
2294 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
2295 ; SSE2-NEXT: pxor %xmm4, %xmm3
2296 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [33023,33023,33023,33023,33023,33023,33023,33023]
2297 ; SSE2-NEXT: pminsw %xmm5, %xmm3
2298 ; SSE2-NEXT: pxor %xmm4, %xmm3
2299 ; SSE2-NEXT: pxor %xmm4, %xmm2
2300 ; SSE2-NEXT: pminsw %xmm5, %xmm2
2301 ; SSE2-NEXT: pxor %xmm4, %xmm2
2302 ; SSE2-NEXT: packuswb %xmm3, %xmm2
2303 ; SSE2-NEXT: pxor %xmm4, %xmm1
2304 ; SSE2-NEXT: pminsw %xmm5, %xmm1
2305 ; SSE2-NEXT: pxor %xmm4, %xmm1
2306 ; SSE2-NEXT: pxor %xmm4, %xmm0
2307 ; SSE2-NEXT: pminsw %xmm5, %xmm0
2308 ; SSE2-NEXT: pxor %xmm4, %xmm0
2309 ; SSE2-NEXT: packuswb %xmm1, %xmm0
2310 ; SSE2-NEXT: movdqa %xmm2, %xmm1
2313 ; SSSE3-LABEL: trunc_usat_v32i16_v32i8:
2315 ; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
2316 ; SSSE3-NEXT: pxor %xmm4, %xmm3
2317 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [33023,33023,33023,33023,33023,33023,33023,33023]
2318 ; SSSE3-NEXT: pminsw %xmm5, %xmm3
2319 ; SSSE3-NEXT: pxor %xmm4, %xmm3
2320 ; SSSE3-NEXT: pxor %xmm4, %xmm2
2321 ; SSSE3-NEXT: pminsw %xmm5, %xmm2
2322 ; SSSE3-NEXT: pxor %xmm4, %xmm2
2323 ; SSSE3-NEXT: packuswb %xmm3, %xmm2
2324 ; SSSE3-NEXT: pxor %xmm4, %xmm1
2325 ; SSSE3-NEXT: pminsw %xmm5, %xmm1
2326 ; SSSE3-NEXT: pxor %xmm4, %xmm1
2327 ; SSSE3-NEXT: pxor %xmm4, %xmm0
2328 ; SSSE3-NEXT: pminsw %xmm5, %xmm0
2329 ; SSSE3-NEXT: pxor %xmm4, %xmm0
2330 ; SSSE3-NEXT: packuswb %xmm1, %xmm0
2331 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
2334 ; SSE41-LABEL: trunc_usat_v32i16_v32i8:
2336 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
2337 ; SSE41-NEXT: pminuw %xmm4, %xmm3
2338 ; SSE41-NEXT: pminuw %xmm4, %xmm2
2339 ; SSE41-NEXT: packuswb %xmm3, %xmm2
2340 ; SSE41-NEXT: pminuw %xmm4, %xmm1
2341 ; SSE41-NEXT: pminuw %xmm4, %xmm0
2342 ; SSE41-NEXT: packuswb %xmm1, %xmm0
2343 ; SSE41-NEXT: movdqa %xmm2, %xmm1
2346 ; AVX1-LABEL: trunc_usat_v32i16_v32i8:
2348 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
2349 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
2350 ; AVX1-NEXT: vpminuw %xmm3, %xmm2, %xmm2
2351 ; AVX1-NEXT: vpminuw %xmm3, %xmm0, %xmm0
2352 ; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
2353 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
2354 ; AVX1-NEXT: vpminuw %xmm3, %xmm2, %xmm2
2355 ; AVX1-NEXT: vpminuw %xmm3, %xmm1, %xmm1
2356 ; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm1
2357 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
2360 ; AVX2-LABEL: trunc_usat_v32i16_v32i8:
2362 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2363 ; AVX2-NEXT: vpminuw %ymm2, %ymm1, %ymm1
2364 ; AVX2-NEXT: vpminuw %ymm2, %ymm0, %ymm0
2365 ; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0
2366 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2369 ; AVX512F-LABEL: trunc_usat_v32i16_v32i8:
2371 ; AVX512F-NEXT: vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2372 ; AVX512F-NEXT: vpminuw %ymm2, %ymm1, %ymm1
2373 ; AVX512F-NEXT: vpminuw %ymm2, %ymm0, %ymm0
2374 ; 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
2375 ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0
2376 ; 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
2377 ; AVX512F-NEXT: vpmovdb %zmm1, %xmm1
2378 ; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
2379 ; AVX512F-NEXT: retq
2381 ; AVX512VL-LABEL: trunc_usat_v32i16_v32i8:
2382 ; AVX512VL: # %bb.0:
2383 ; AVX512VL-NEXT: vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2384 ; AVX512VL-NEXT: vpminuw %ymm2, %ymm1, %ymm1
2385 ; AVX512VL-NEXT: vpminuw %ymm2, %ymm0, %ymm0
2386 ; 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
2387 ; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0
2388 ; 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
2389 ; AVX512VL-NEXT: vpmovdb %zmm1, %xmm1
2390 ; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
2391 ; AVX512VL-NEXT: retq
2393 ; AVX512BW-LABEL: trunc_usat_v32i16_v32i8:
2394 ; AVX512BW: # %bb.0:
2395 ; AVX512BW-NEXT: vpmovuswb %zmm0, %ymm0
2396 ; AVX512BW-NEXT: retq
2398 ; AVX512BWVL-LABEL: trunc_usat_v32i16_v32i8:
2399 ; AVX512BWVL: # %bb.0:
2400 ; AVX512BWVL-NEXT: vpmovuswb %zmm0, %ymm0
2401 ; AVX512BWVL-NEXT: retq
2402 %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>
2403 %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>
2404 %3 = trunc <32 x i16> %2 to <32 x i8>