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: vextractf128 $1, %ymm0, %xmm1
116 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
117 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1
118 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372041149743103,9223372041149743103]
119 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1
120 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm2
121 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2
122 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
123 ; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,429496729]
124 ; AVX1-NEXT: vblendvpd %ymm1, %ymm0, %ymm2, %ymm0
125 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
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: vpermilps {{.*#+}} ymm0 = ymm0[0,2,2,3,4,6,6,7]
139 ; AVX2-SLOW-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,2,2,3]
140 ; AVX2-SLOW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
141 ; AVX2-SLOW-NEXT: vzeroupper
142 ; AVX2-SLOW-NEXT: retq
144 ; AVX2-FAST-LABEL: trunc_usat_v4i64_v4i32:
145 ; AVX2-FAST: # %bb.0:
146 ; AVX2-FAST-NEXT: vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
147 ; AVX2-FAST-NEXT: vpxor %ymm1, %ymm0, %ymm1
148 ; AVX2-FAST-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
149 ; AVX2-FAST-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm1
150 ; AVX2-FAST-NEXT: vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,429496729]
151 ; AVX2-FAST-NEXT: vblendvpd %ymm1, %ymm0, %ymm2, %ymm0
152 ; AVX2-FAST-NEXT: vmovapd {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7]
153 ; AVX2-FAST-NEXT: vpermps %ymm0, %ymm1, %ymm0
154 ; AVX2-FAST-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
155 ; AVX2-FAST-NEXT: vzeroupper
156 ; AVX2-FAST-NEXT: retq
158 ; AVX512F-LABEL: trunc_usat_v4i64_v4i32:
160 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
161 ; AVX512F-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
162 ; AVX512F-NEXT: vpcmpltuq %zmm1, %zmm0, %k1
163 ; AVX512F-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
164 ; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 {%k1}
165 ; AVX512F-NEXT: vpmovqd %zmm1, %ymm0
166 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
167 ; AVX512F-NEXT: vzeroupper
170 ; AVX512VL-LABEL: trunc_usat_v4i64_v4i32:
172 ; AVX512VL-NEXT: vpcmpltuq {{.*}}(%rip){1to4}, %ymm0, %k1
173 ; AVX512VL-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
174 ; AVX512VL-NEXT: vmovdqa64 %ymm0, %ymm1 {%k1}
175 ; AVX512VL-NEXT: vpmovqd %ymm1, %xmm0
176 ; AVX512VL-NEXT: vzeroupper
177 ; AVX512VL-NEXT: retq
179 ; AVX512BW-LABEL: trunc_usat_v4i64_v4i32:
181 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
182 ; AVX512BW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
183 ; AVX512BW-NEXT: vpcmpltuq %zmm1, %zmm0, %k1
184 ; AVX512BW-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
185 ; AVX512BW-NEXT: vmovdqa64 %zmm0, %zmm1 {%k1}
186 ; AVX512BW-NEXT: vpmovqd %zmm1, %ymm0
187 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
188 ; AVX512BW-NEXT: vzeroupper
189 ; AVX512BW-NEXT: retq
191 ; AVX512BWVL-LABEL: trunc_usat_v4i64_v4i32:
192 ; AVX512BWVL: # %bb.0:
193 ; AVX512BWVL-NEXT: vpcmpltuq {{.*}}(%rip){1to4}, %ymm0, %k1
194 ; AVX512BWVL-NEXT: vmovdqa {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,429496729]
195 ; AVX512BWVL-NEXT: vmovdqa64 %ymm0, %ymm1 {%k1}
196 ; AVX512BWVL-NEXT: vpmovqd %ymm1, %xmm0
197 ; AVX512BWVL-NEXT: vzeroupper
198 ; AVX512BWVL-NEXT: retq
199 %1 = icmp ult <4 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
200 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 429496729>
201 %3 = trunc <4 x i64> %2 to <4 x i32>
205 define <8 x i32> @trunc_usat_v8i64_v8i32(<8 x i64> %a0) {
206 ; SSE2-LABEL: trunc_usat_v8i64_v8i32:
208 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [4294967295,4294967295]
209 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
210 ; SSE2-NEXT: movdqa %xmm3, %xmm7
211 ; SSE2-NEXT: pxor %xmm5, %xmm7
212 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259455,9223372039002259455]
213 ; SSE2-NEXT: movdqa %xmm9, %xmm6
214 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm6
215 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
216 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm7
217 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
218 ; SSE2-NEXT: pand %xmm4, %xmm7
219 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
220 ; SSE2-NEXT: por %xmm7, %xmm4
221 ; SSE2-NEXT: pand %xmm4, %xmm3
222 ; SSE2-NEXT: pandn %xmm8, %xmm4
223 ; SSE2-NEXT: por %xmm3, %xmm4
224 ; SSE2-NEXT: movdqa %xmm2, %xmm3
225 ; SSE2-NEXT: pxor %xmm5, %xmm3
226 ; SSE2-NEXT: movdqa %xmm9, %xmm6
227 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm6
228 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
229 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm3
230 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
231 ; SSE2-NEXT: pand %xmm10, %xmm7
232 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
233 ; SSE2-NEXT: por %xmm7, %xmm3
234 ; SSE2-NEXT: pand %xmm3, %xmm2
235 ; SSE2-NEXT: pandn %xmm8, %xmm3
236 ; SSE2-NEXT: por %xmm2, %xmm3
237 ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm4[0,2]
238 ; SSE2-NEXT: movdqa %xmm1, %xmm2
239 ; SSE2-NEXT: pxor %xmm5, %xmm2
240 ; SSE2-NEXT: movdqa %xmm9, %xmm4
241 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
242 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
243 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm2
244 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
245 ; SSE2-NEXT: pand %xmm6, %xmm2
246 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
247 ; SSE2-NEXT: por %xmm2, %xmm4
248 ; SSE2-NEXT: pand %xmm4, %xmm1
249 ; SSE2-NEXT: pandn %xmm8, %xmm4
250 ; SSE2-NEXT: por %xmm1, %xmm4
251 ; SSE2-NEXT: pxor %xmm0, %xmm5
252 ; SSE2-NEXT: movdqa %xmm9, %xmm1
253 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm1
254 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
255 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm5
256 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
257 ; SSE2-NEXT: pand %xmm2, %xmm5
258 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
259 ; SSE2-NEXT: por %xmm5, %xmm1
260 ; SSE2-NEXT: pand %xmm1, %xmm0
261 ; SSE2-NEXT: pandn %xmm8, %xmm1
262 ; SSE2-NEXT: por %xmm1, %xmm0
263 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm4[0,2]
264 ; SSE2-NEXT: movaps %xmm3, %xmm1
267 ; SSSE3-LABEL: trunc_usat_v8i64_v8i32:
269 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [4294967295,4294967295]
270 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
271 ; SSSE3-NEXT: movdqa %xmm3, %xmm7
272 ; SSSE3-NEXT: pxor %xmm5, %xmm7
273 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259455,9223372039002259455]
274 ; SSSE3-NEXT: movdqa %xmm9, %xmm6
275 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm6
276 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
277 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm7
278 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
279 ; SSSE3-NEXT: pand %xmm4, %xmm7
280 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
281 ; SSSE3-NEXT: por %xmm7, %xmm4
282 ; SSSE3-NEXT: pand %xmm4, %xmm3
283 ; SSSE3-NEXT: pandn %xmm8, %xmm4
284 ; SSSE3-NEXT: por %xmm3, %xmm4
285 ; SSSE3-NEXT: movdqa %xmm2, %xmm3
286 ; SSSE3-NEXT: pxor %xmm5, %xmm3
287 ; SSSE3-NEXT: movdqa %xmm9, %xmm6
288 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm6
289 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
290 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm3
291 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
292 ; SSSE3-NEXT: pand %xmm10, %xmm7
293 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
294 ; SSSE3-NEXT: por %xmm7, %xmm3
295 ; SSSE3-NEXT: pand %xmm3, %xmm2
296 ; SSSE3-NEXT: pandn %xmm8, %xmm3
297 ; SSSE3-NEXT: por %xmm2, %xmm3
298 ; SSSE3-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm4[0,2]
299 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
300 ; SSSE3-NEXT: pxor %xmm5, %xmm2
301 ; SSSE3-NEXT: movdqa %xmm9, %xmm4
302 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
303 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
304 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm2
305 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
306 ; SSSE3-NEXT: pand %xmm6, %xmm2
307 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
308 ; SSSE3-NEXT: por %xmm2, %xmm4
309 ; SSSE3-NEXT: pand %xmm4, %xmm1
310 ; SSSE3-NEXT: pandn %xmm8, %xmm4
311 ; SSSE3-NEXT: por %xmm1, %xmm4
312 ; SSSE3-NEXT: pxor %xmm0, %xmm5
313 ; SSSE3-NEXT: movdqa %xmm9, %xmm1
314 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm1
315 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
316 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm5
317 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
318 ; SSSE3-NEXT: pand %xmm2, %xmm5
319 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
320 ; SSSE3-NEXT: por %xmm5, %xmm1
321 ; SSSE3-NEXT: pand %xmm1, %xmm0
322 ; SSSE3-NEXT: pandn %xmm8, %xmm1
323 ; SSSE3-NEXT: por %xmm1, %xmm0
324 ; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm4[0,2]
325 ; SSSE3-NEXT: movaps %xmm3, %xmm1
328 ; SSE41-LABEL: trunc_usat_v8i64_v8i32:
330 ; SSE41-NEXT: movdqa %xmm0, %xmm8
331 ; SSE41-NEXT: movapd {{.*#+}} xmm6 = [4294967295,4294967295]
332 ; SSE41-NEXT: movdqa {{.*#+}} xmm7 = [9223372039002259456,9223372039002259456]
333 ; SSE41-NEXT: movdqa %xmm3, %xmm0
334 ; SSE41-NEXT: pxor %xmm7, %xmm0
335 ; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259455,9223372039002259455]
336 ; SSE41-NEXT: movdqa %xmm9, %xmm4
337 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
338 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
339 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
340 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
341 ; SSE41-NEXT: pand %xmm5, %xmm0
342 ; SSE41-NEXT: por %xmm4, %xmm0
343 ; SSE41-NEXT: movapd %xmm6, %xmm5
344 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm5
345 ; SSE41-NEXT: movdqa %xmm2, %xmm0
346 ; SSE41-NEXT: pxor %xmm7, %xmm0
347 ; SSE41-NEXT: movdqa %xmm9, %xmm3
348 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
349 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
350 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
351 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
352 ; SSE41-NEXT: pand %xmm4, %xmm0
353 ; SSE41-NEXT: por %xmm3, %xmm0
354 ; SSE41-NEXT: movapd %xmm6, %xmm4
355 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4
356 ; SSE41-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,2],xmm5[0,2]
357 ; SSE41-NEXT: movdqa %xmm1, %xmm0
358 ; SSE41-NEXT: pxor %xmm7, %xmm0
359 ; SSE41-NEXT: movdqa %xmm9, %xmm2
360 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
361 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
362 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
363 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
364 ; SSE41-NEXT: pand %xmm3, %xmm0
365 ; SSE41-NEXT: por %xmm2, %xmm0
366 ; SSE41-NEXT: movapd %xmm6, %xmm2
367 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
368 ; SSE41-NEXT: pxor %xmm8, %xmm7
369 ; SSE41-NEXT: movdqa %xmm9, %xmm1
370 ; SSE41-NEXT: pcmpgtd %xmm7, %xmm1
371 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
372 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm7
373 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
374 ; SSE41-NEXT: pand %xmm3, %xmm0
375 ; SSE41-NEXT: por %xmm1, %xmm0
376 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm6
377 ; SSE41-NEXT: shufps {{.*#+}} xmm6 = xmm6[0,2],xmm2[0,2]
378 ; SSE41-NEXT: movaps %xmm6, %xmm0
379 ; SSE41-NEXT: movaps %xmm4, %xmm1
382 ; AVX1-LABEL: trunc_usat_v8i64_v8i32:
384 ; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
385 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
386 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
387 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
388 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [9223372041149743103,9223372041149743103]
389 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3
390 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm6
391 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm5, %xmm6
392 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm6, %ymm3
393 ; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
394 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
395 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
396 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3
397 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm4
398 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4
399 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
400 ; AVX1-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
401 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
402 ; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
403 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
404 ; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
405 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
408 ; AVX2-SLOW-LABEL: trunc_usat_v8i64_v8i32:
409 ; AVX2-SLOW: # %bb.0:
410 ; AVX2-SLOW-NEXT: vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
411 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
412 ; AVX2-SLOW-NEXT: vpxor %ymm3, %ymm1, %ymm4
413 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
414 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
415 ; AVX2-SLOW-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
416 ; AVX2-SLOW-NEXT: vpxor %ymm3, %ymm0, %ymm3
417 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
418 ; AVX2-SLOW-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
419 ; AVX2-SLOW-NEXT: vpermilps {{.*#+}} ymm0 = ymm0[0,2,2,3,4,6,6,7]
420 ; AVX2-SLOW-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,2,2,3]
421 ; AVX2-SLOW-NEXT: vpermilps {{.*#+}} ymm1 = ymm1[0,2,2,3,4,6,6,7]
422 ; AVX2-SLOW-NEXT: vpermpd {{.*#+}} ymm1 = ymm1[0,2,2,3]
423 ; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
424 ; AVX2-SLOW-NEXT: retq
426 ; AVX2-FAST-LABEL: trunc_usat_v8i64_v8i32:
427 ; AVX2-FAST: # %bb.0:
428 ; AVX2-FAST-NEXT: vbroadcastsd {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
429 ; AVX2-FAST-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
430 ; AVX2-FAST-NEXT: vpxor %ymm3, %ymm1, %ymm4
431 ; AVX2-FAST-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372041149743103,9223372041149743103,9223372041149743103,9223372041149743103]
432 ; AVX2-FAST-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
433 ; AVX2-FAST-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
434 ; AVX2-FAST-NEXT: vpxor %ymm3, %ymm0, %ymm3
435 ; AVX2-FAST-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
436 ; AVX2-FAST-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
437 ; AVX2-FAST-NEXT: vmovapd {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
438 ; AVX2-FAST-NEXT: vpermps %ymm0, %ymm2, %ymm0
439 ; AVX2-FAST-NEXT: vpermps %ymm1, %ymm2, %ymm1
440 ; AVX2-FAST-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
441 ; AVX2-FAST-NEXT: retq
443 ; AVX512-LABEL: trunc_usat_v8i64_v8i32:
445 ; AVX512-NEXT: vpmovusqd %zmm0, %ymm0
447 %1 = icmp ult <8 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
448 %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>
449 %3 = trunc <8 x i64> %2 to <8 x i32>
454 ; Unsigned saturation truncation to vXi16
457 define <8 x i16> @trunc_usat_v8i64_v8i16(<8 x i64> %a0) {
458 ; SSE2-LABEL: trunc_usat_v8i64_v8i16:
460 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [65535,65535]
461 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
462 ; SSE2-NEXT: movdqa %xmm2, %xmm5
463 ; SSE2-NEXT: pxor %xmm6, %xmm5
464 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002324991,9223372039002324991]
465 ; SSE2-NEXT: movdqa %xmm9, %xmm7
466 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm7
467 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
468 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm5
469 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
470 ; SSE2-NEXT: pand %xmm10, %xmm4
471 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
472 ; SSE2-NEXT: por %xmm4, %xmm5
473 ; SSE2-NEXT: pand %xmm5, %xmm2
474 ; SSE2-NEXT: pandn %xmm8, %xmm5
475 ; SSE2-NEXT: por %xmm2, %xmm5
476 ; SSE2-NEXT: movdqa %xmm3, %xmm2
477 ; SSE2-NEXT: pxor %xmm6, %xmm2
478 ; SSE2-NEXT: movdqa %xmm9, %xmm4
479 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
480 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
481 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm2
482 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
483 ; SSE2-NEXT: pand %xmm10, %xmm7
484 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
485 ; SSE2-NEXT: por %xmm7, %xmm2
486 ; SSE2-NEXT: pand %xmm2, %xmm3
487 ; SSE2-NEXT: pandn %xmm8, %xmm2
488 ; SSE2-NEXT: por %xmm3, %xmm2
489 ; SSE2-NEXT: movdqa %xmm0, %xmm3
490 ; SSE2-NEXT: pxor %xmm6, %xmm3
491 ; SSE2-NEXT: movdqa %xmm9, %xmm4
492 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
493 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
494 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm3
495 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
496 ; SSE2-NEXT: pand %xmm7, %xmm3
497 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
498 ; SSE2-NEXT: por %xmm3, %xmm4
499 ; SSE2-NEXT: pand %xmm4, %xmm0
500 ; SSE2-NEXT: pandn %xmm8, %xmm4
501 ; SSE2-NEXT: por %xmm0, %xmm4
502 ; SSE2-NEXT: pxor %xmm1, %xmm6
503 ; SSE2-NEXT: movdqa %xmm9, %xmm0
504 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm0
505 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2]
506 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm6
507 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
508 ; SSE2-NEXT: pand %xmm3, %xmm6
509 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
510 ; SSE2-NEXT: por %xmm6, %xmm0
511 ; SSE2-NEXT: pand %xmm0, %xmm1
512 ; SSE2-NEXT: pandn %xmm8, %xmm0
513 ; SSE2-NEXT: por %xmm1, %xmm0
514 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
515 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
516 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm4[0,2,2,3]
517 ; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
518 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
519 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
520 ; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm0[0,1,0,2,4,5,6,7]
521 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
522 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
523 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
524 ; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
527 ; SSSE3-LABEL: trunc_usat_v8i64_v8i16:
529 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [65535,65535]
530 ; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
531 ; SSSE3-NEXT: movdqa %xmm2, %xmm5
532 ; SSSE3-NEXT: pxor %xmm6, %xmm5
533 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002324991,9223372039002324991]
534 ; SSSE3-NEXT: movdqa %xmm9, %xmm7
535 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm7
536 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
537 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm5
538 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
539 ; SSSE3-NEXT: pand %xmm10, %xmm4
540 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
541 ; SSSE3-NEXT: por %xmm4, %xmm5
542 ; SSSE3-NEXT: pand %xmm5, %xmm2
543 ; SSSE3-NEXT: pandn %xmm8, %xmm5
544 ; SSSE3-NEXT: por %xmm2, %xmm5
545 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
546 ; SSSE3-NEXT: pxor %xmm6, %xmm2
547 ; SSSE3-NEXT: movdqa %xmm9, %xmm4
548 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
549 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
550 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm2
551 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
552 ; SSSE3-NEXT: pand %xmm10, %xmm7
553 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
554 ; SSSE3-NEXT: por %xmm7, %xmm2
555 ; SSSE3-NEXT: pand %xmm2, %xmm3
556 ; SSSE3-NEXT: pandn %xmm8, %xmm2
557 ; SSSE3-NEXT: por %xmm3, %xmm2
558 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
559 ; SSSE3-NEXT: pxor %xmm6, %xmm3
560 ; SSSE3-NEXT: movdqa %xmm9, %xmm4
561 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4
562 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
563 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm3
564 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
565 ; SSSE3-NEXT: pand %xmm7, %xmm3
566 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
567 ; SSSE3-NEXT: por %xmm3, %xmm4
568 ; SSSE3-NEXT: pand %xmm4, %xmm0
569 ; SSSE3-NEXT: pandn %xmm8, %xmm4
570 ; SSSE3-NEXT: por %xmm0, %xmm4
571 ; SSSE3-NEXT: pxor %xmm1, %xmm6
572 ; SSSE3-NEXT: movdqa %xmm9, %xmm0
573 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm0
574 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2]
575 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm6
576 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
577 ; SSSE3-NEXT: pand %xmm3, %xmm6
578 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
579 ; SSSE3-NEXT: por %xmm6, %xmm0
580 ; SSSE3-NEXT: pand %xmm0, %xmm1
581 ; SSSE3-NEXT: pandn %xmm8, %xmm0
582 ; SSSE3-NEXT: por %xmm1, %xmm0
583 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
584 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
585 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm4[0,2,2,3]
586 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
587 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
588 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
589 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm2 = xmm0[0,1,0,2,4,5,6,7]
590 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
591 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
592 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
593 ; SSSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
596 ; SSE41-LABEL: trunc_usat_v8i64_v8i16:
598 ; SSE41-NEXT: movdqa %xmm0, %xmm8
599 ; SSE41-NEXT: movapd {{.*#+}} xmm5 = [65535,65535]
600 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
601 ; SSE41-NEXT: movdqa %xmm1, %xmm0
602 ; SSE41-NEXT: pxor %xmm6, %xmm0
603 ; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002324991,9223372039002324991]
604 ; SSE41-NEXT: movdqa %xmm9, %xmm7
605 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
606 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
607 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
608 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
609 ; SSE41-NEXT: pand %xmm4, %xmm0
610 ; SSE41-NEXT: por %xmm7, %xmm0
611 ; SSE41-NEXT: movapd %xmm5, %xmm4
612 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4
613 ; SSE41-NEXT: movdqa %xmm8, %xmm0
614 ; SSE41-NEXT: pxor %xmm6, %xmm0
615 ; SSE41-NEXT: movdqa %xmm9, %xmm1
616 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
617 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,0,2,2]
618 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
619 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
620 ; SSE41-NEXT: pand %xmm7, %xmm0
621 ; SSE41-NEXT: por %xmm1, %xmm0
622 ; SSE41-NEXT: movapd %xmm5, %xmm1
623 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm1
624 ; SSE41-NEXT: packusdw %xmm4, %xmm1
625 ; SSE41-NEXT: movdqa %xmm3, %xmm0
626 ; SSE41-NEXT: pxor %xmm6, %xmm0
627 ; SSE41-NEXT: movdqa %xmm9, %xmm4
628 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
629 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
630 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
631 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
632 ; SSE41-NEXT: pand %xmm7, %xmm0
633 ; SSE41-NEXT: por %xmm4, %xmm0
634 ; SSE41-NEXT: movapd %xmm5, %xmm4
635 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm4
636 ; SSE41-NEXT: pxor %xmm2, %xmm6
637 ; SSE41-NEXT: movdqa %xmm9, %xmm3
638 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm3
639 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm3[0,0,2,2]
640 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm6
641 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
642 ; SSE41-NEXT: pand %xmm7, %xmm0
643 ; SSE41-NEXT: por %xmm3, %xmm0
644 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5
645 ; SSE41-NEXT: packusdw %xmm4, %xmm5
646 ; SSE41-NEXT: packusdw %xmm5, %xmm1
647 ; SSE41-NEXT: movdqa %xmm1, %xmm0
650 ; AVX1-LABEL: trunc_usat_v8i64_v8i16:
652 ; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [65535,65535,65535,65535]
653 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
654 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
655 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
656 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [9223372036854841343,9223372036854841343]
657 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3
658 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm6
659 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm5, %xmm6
660 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm6, %ymm3
661 ; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
662 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
663 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
664 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3
665 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm4
666 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4
667 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
668 ; AVX1-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
669 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
670 ; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1
671 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
672 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
673 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
674 ; AVX1-NEXT: vzeroupper
677 ; AVX2-LABEL: trunc_usat_v8i64_v8i16:
679 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [65535,65535,65535,65535]
680 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
681 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm4
682 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343]
683 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
684 ; AVX2-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
685 ; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm3
686 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
687 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
688 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
689 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
690 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
691 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
692 ; AVX2-NEXT: vzeroupper
695 ; AVX512-LABEL: trunc_usat_v8i64_v8i16:
697 ; AVX512-NEXT: vpmovusqw %zmm0, %xmm0
698 ; AVX512-NEXT: vzeroupper
700 %1 = icmp ult <8 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
701 %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>
702 %3 = trunc <8 x i64> %2 to <8 x i16>
706 define <8 x i16> @trunc_usat_v8i32_v8i16(<8 x i32> %a0) {
707 ; SSE2-LABEL: trunc_usat_v8i32_v8i16:
709 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
710 ; SSE2-NEXT: movdqa %xmm0, %xmm3
711 ; SSE2-NEXT: pxor %xmm2, %xmm3
712 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147549183,2147549183,2147549183,2147549183]
713 ; SSE2-NEXT: movdqa %xmm4, %xmm5
714 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
715 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm3
716 ; SSE2-NEXT: pand %xmm5, %xmm0
717 ; SSE2-NEXT: pxor %xmm3, %xmm5
718 ; SSE2-NEXT: por %xmm5, %xmm0
719 ; SSE2-NEXT: pxor %xmm1, %xmm2
720 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
721 ; SSE2-NEXT: pxor %xmm4, %xmm3
722 ; SSE2-NEXT: pand %xmm1, %xmm4
723 ; SSE2-NEXT: por %xmm3, %xmm4
724 ; SSE2-NEXT: pslld $16, %xmm4
725 ; SSE2-NEXT: psrad $16, %xmm4
726 ; SSE2-NEXT: pslld $16, %xmm0
727 ; SSE2-NEXT: psrad $16, %xmm0
728 ; SSE2-NEXT: packssdw %xmm4, %xmm0
731 ; SSSE3-LABEL: trunc_usat_v8i32_v8i16:
733 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
734 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
735 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
736 ; SSSE3-NEXT: pxor %xmm3, %xmm4
737 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
738 ; SSSE3-NEXT: movdqa %xmm5, %xmm6
739 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
740 ; SSSE3-NEXT: pand %xmm6, %xmm0
741 ; SSSE3-NEXT: pandn %xmm2, %xmm6
742 ; SSSE3-NEXT: por %xmm6, %xmm0
743 ; SSSE3-NEXT: pxor %xmm1, %xmm3
744 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
745 ; SSSE3-NEXT: pand %xmm5, %xmm1
746 ; SSSE3-NEXT: pandn %xmm2, %xmm5
747 ; SSSE3-NEXT: por %xmm1, %xmm5
748 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
749 ; SSSE3-NEXT: pshufb %xmm1, %xmm5
750 ; SSSE3-NEXT: pshufb %xmm1, %xmm0
751 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0]
754 ; SSE41-LABEL: trunc_usat_v8i32_v8i16:
756 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
757 ; SSE41-NEXT: pminud %xmm2, %xmm1
758 ; SSE41-NEXT: pminud %xmm2, %xmm0
759 ; SSE41-NEXT: packusdw %xmm1, %xmm0
762 ; AVX1-LABEL: trunc_usat_v8i32_v8i16:
764 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
765 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
766 ; AVX1-NEXT: vpminud %xmm2, %xmm1, %xmm1
767 ; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0
768 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
769 ; AVX1-NEXT: vzeroupper
772 ; AVX2-LABEL: trunc_usat_v8i32_v8i16:
774 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535]
775 ; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0
776 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
777 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
778 ; AVX2-NEXT: vzeroupper
781 ; AVX512F-LABEL: trunc_usat_v8i32_v8i16:
783 ; AVX512F-NEXT: vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535]
784 ; AVX512F-NEXT: vpminud %ymm1, %ymm0, %ymm0
785 ; AVX512F-NEXT: vpmovdw %zmm0, %ymm0
786 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
787 ; AVX512F-NEXT: vzeroupper
790 ; AVX512VL-LABEL: trunc_usat_v8i32_v8i16:
792 ; AVX512VL-NEXT: vpmovusdw %ymm0, %xmm0
793 ; AVX512VL-NEXT: vzeroupper
794 ; AVX512VL-NEXT: retq
796 ; AVX512BW-LABEL: trunc_usat_v8i32_v8i16:
798 ; AVX512BW-NEXT: vpbroadcastd {{.*#+}} ymm1 = [65535,65535,65535,65535,65535,65535,65535,65535]
799 ; AVX512BW-NEXT: vpminud %ymm1, %ymm0, %ymm0
800 ; AVX512BW-NEXT: vpmovdw %zmm0, %ymm0
801 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
802 ; AVX512BW-NEXT: vzeroupper
803 ; AVX512BW-NEXT: retq
805 ; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i16:
806 ; AVX512BWVL: # %bb.0:
807 ; AVX512BWVL-NEXT: vpmovusdw %ymm0, %xmm0
808 ; AVX512BWVL-NEXT: vzeroupper
809 ; AVX512BWVL-NEXT: retq
810 %1 = icmp ult <8 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
811 %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>
812 %3 = trunc <8 x i32> %2 to <8 x i16>
816 define <16 x i16> @trunc_usat_v16i32_v16i16(<16 x i32> %a0) {
817 ; SSE2-LABEL: trunc_usat_v16i32_v16i16:
819 ; SSE2-NEXT: movdqa %xmm1, %xmm8
820 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
821 ; SSE2-NEXT: movdqa %xmm2, %xmm7
822 ; SSE2-NEXT: pxor %xmm6, %xmm7
823 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
824 ; SSE2-NEXT: movdqa %xmm5, %xmm1
825 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm1
826 ; SSE2-NEXT: pcmpeqd %xmm7, %xmm7
827 ; SSE2-NEXT: pand %xmm1, %xmm2
828 ; SSE2-NEXT: pxor %xmm7, %xmm1
829 ; SSE2-NEXT: por %xmm2, %xmm1
830 ; SSE2-NEXT: movdqa %xmm3, %xmm4
831 ; SSE2-NEXT: pxor %xmm6, %xmm4
832 ; SSE2-NEXT: movdqa %xmm5, %xmm2
833 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm2
834 ; SSE2-NEXT: pand %xmm2, %xmm3
835 ; SSE2-NEXT: pxor %xmm7, %xmm2
836 ; SSE2-NEXT: por %xmm3, %xmm2
837 ; SSE2-NEXT: movdqa %xmm0, %xmm3
838 ; SSE2-NEXT: pxor %xmm6, %xmm3
839 ; SSE2-NEXT: movdqa %xmm5, %xmm4
840 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
841 ; SSE2-NEXT: pand %xmm4, %xmm0
842 ; SSE2-NEXT: pxor %xmm7, %xmm4
843 ; SSE2-NEXT: por %xmm4, %xmm0
844 ; SSE2-NEXT: pxor %xmm8, %xmm6
845 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm5
846 ; SSE2-NEXT: pxor %xmm5, %xmm7
847 ; SSE2-NEXT: pand %xmm8, %xmm5
848 ; SSE2-NEXT: por %xmm7, %xmm5
849 ; SSE2-NEXT: pslld $16, %xmm5
850 ; SSE2-NEXT: psrad $16, %xmm5
851 ; SSE2-NEXT: pslld $16, %xmm0
852 ; SSE2-NEXT: psrad $16, %xmm0
853 ; SSE2-NEXT: packssdw %xmm5, %xmm0
854 ; SSE2-NEXT: pslld $16, %xmm2
855 ; SSE2-NEXT: psrad $16, %xmm2
856 ; SSE2-NEXT: pslld $16, %xmm1
857 ; SSE2-NEXT: psrad $16, %xmm1
858 ; SSE2-NEXT: packssdw %xmm2, %xmm1
861 ; SSSE3-LABEL: trunc_usat_v16i32_v16i16:
863 ; SSSE3-NEXT: movdqa %xmm1, %xmm8
864 ; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
865 ; SSSE3-NEXT: movdqa %xmm2, %xmm7
866 ; SSSE3-NEXT: pxor %xmm6, %xmm7
867 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147549183,2147549183,2147549183,2147549183]
868 ; SSSE3-NEXT: movdqa %xmm5, %xmm1
869 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm1
870 ; SSSE3-NEXT: pcmpeqd %xmm7, %xmm7
871 ; SSSE3-NEXT: pand %xmm1, %xmm2
872 ; SSSE3-NEXT: pxor %xmm7, %xmm1
873 ; SSSE3-NEXT: por %xmm2, %xmm1
874 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
875 ; SSSE3-NEXT: pxor %xmm6, %xmm4
876 ; SSSE3-NEXT: movdqa %xmm5, %xmm2
877 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm2
878 ; SSSE3-NEXT: pand %xmm2, %xmm3
879 ; SSSE3-NEXT: pxor %xmm7, %xmm2
880 ; SSSE3-NEXT: por %xmm3, %xmm2
881 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
882 ; SSSE3-NEXT: pxor %xmm6, %xmm3
883 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
884 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4
885 ; SSSE3-NEXT: pand %xmm4, %xmm0
886 ; SSSE3-NEXT: pxor %xmm7, %xmm4
887 ; SSSE3-NEXT: por %xmm4, %xmm0
888 ; SSSE3-NEXT: pxor %xmm8, %xmm6
889 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm5
890 ; SSSE3-NEXT: pxor %xmm5, %xmm7
891 ; SSSE3-NEXT: pand %xmm8, %xmm5
892 ; SSSE3-NEXT: por %xmm7, %xmm5
893 ; SSSE3-NEXT: pslld $16, %xmm5
894 ; SSSE3-NEXT: psrad $16, %xmm5
895 ; SSSE3-NEXT: pslld $16, %xmm0
896 ; SSSE3-NEXT: psrad $16, %xmm0
897 ; SSSE3-NEXT: packssdw %xmm5, %xmm0
898 ; SSSE3-NEXT: pslld $16, %xmm2
899 ; SSSE3-NEXT: psrad $16, %xmm2
900 ; SSSE3-NEXT: pslld $16, %xmm1
901 ; SSSE3-NEXT: psrad $16, %xmm1
902 ; SSSE3-NEXT: packssdw %xmm2, %xmm1
905 ; SSE41-LABEL: trunc_usat_v16i32_v16i16:
907 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [65535,65535,65535,65535]
908 ; SSE41-NEXT: pminud %xmm4, %xmm3
909 ; SSE41-NEXT: pminud %xmm4, %xmm2
910 ; SSE41-NEXT: packusdw %xmm3, %xmm2
911 ; SSE41-NEXT: pminud %xmm4, %xmm1
912 ; SSE41-NEXT: pminud %xmm4, %xmm0
913 ; SSE41-NEXT: packusdw %xmm1, %xmm0
914 ; SSE41-NEXT: movdqa %xmm2, %xmm1
917 ; AVX1-LABEL: trunc_usat_v16i32_v16i16:
919 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
920 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [65535,65535,65535,65535]
921 ; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm2
922 ; AVX1-NEXT: vpminud %xmm3, %xmm0, %xmm0
923 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
924 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
925 ; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm2
926 ; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm1
927 ; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1
928 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
931 ; AVX2-LABEL: trunc_usat_v16i32_v16i16:
933 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535]
934 ; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm1
935 ; AVX2-NEXT: vpminud %ymm2, %ymm0, %ymm0
936 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
937 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
940 ; AVX512-LABEL: trunc_usat_v16i32_v16i16:
942 ; AVX512-NEXT: vpmovusdw %zmm0, %ymm0
944 %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>
945 %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>
946 %3 = trunc <16 x i32> %2 to <16 x i16>
951 ; Unsigned saturation truncation to v16i8
954 define <8 x i8> @trunc_usat_v8i64_v8i8(<8 x i64> %a0) {
955 ; SSE2-LABEL: trunc_usat_v8i64_v8i8:
957 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255]
958 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
959 ; SSE2-NEXT: movdqa %xmm1, %xmm7
960 ; SSE2-NEXT: pxor %xmm5, %xmm7
961 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
962 ; SSE2-NEXT: movdqa %xmm9, %xmm6
963 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm6
964 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
965 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm7
966 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
967 ; SSE2-NEXT: pand %xmm4, %xmm7
968 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
969 ; SSE2-NEXT: por %xmm7, %xmm4
970 ; SSE2-NEXT: pand %xmm4, %xmm1
971 ; SSE2-NEXT: pandn %xmm8, %xmm4
972 ; SSE2-NEXT: por %xmm1, %xmm4
973 ; SSE2-NEXT: movdqa %xmm0, %xmm1
974 ; SSE2-NEXT: pxor %xmm5, %xmm1
975 ; SSE2-NEXT: movdqa %xmm9, %xmm6
976 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm6
977 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
978 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm1
979 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
980 ; SSE2-NEXT: pand %xmm7, %xmm1
981 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
982 ; SSE2-NEXT: por %xmm1, %xmm6
983 ; SSE2-NEXT: pand %xmm6, %xmm0
984 ; SSE2-NEXT: pandn %xmm8, %xmm6
985 ; SSE2-NEXT: por %xmm6, %xmm0
986 ; SSE2-NEXT: packuswb %xmm4, %xmm0
987 ; SSE2-NEXT: movdqa %xmm3, %xmm1
988 ; SSE2-NEXT: pxor %xmm5, %xmm1
989 ; SSE2-NEXT: movdqa %xmm9, %xmm4
990 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4
991 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
992 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm1
993 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
994 ; SSE2-NEXT: pand %xmm6, %xmm1
995 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
996 ; SSE2-NEXT: por %xmm1, %xmm4
997 ; SSE2-NEXT: pand %xmm4, %xmm3
998 ; SSE2-NEXT: pandn %xmm8, %xmm4
999 ; SSE2-NEXT: por %xmm3, %xmm4
1000 ; SSE2-NEXT: pxor %xmm2, %xmm5
1001 ; SSE2-NEXT: movdqa %xmm9, %xmm1
1002 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm1
1003 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
1004 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm5
1005 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1006 ; SSE2-NEXT: pand %xmm3, %xmm5
1007 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1008 ; SSE2-NEXT: por %xmm5, %xmm1
1009 ; SSE2-NEXT: pand %xmm1, %xmm2
1010 ; SSE2-NEXT: pandn %xmm8, %xmm1
1011 ; SSE2-NEXT: por %xmm2, %xmm1
1012 ; SSE2-NEXT: packuswb %xmm4, %xmm1
1013 ; SSE2-NEXT: packuswb %xmm1, %xmm0
1016 ; SSSE3-LABEL: trunc_usat_v8i64_v8i8:
1018 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255]
1019 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456]
1020 ; SSSE3-NEXT: movdqa %xmm1, %xmm7
1021 ; SSSE3-NEXT: pxor %xmm5, %xmm7
1022 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
1023 ; SSSE3-NEXT: movdqa %xmm9, %xmm6
1024 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm6
1025 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
1026 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm7
1027 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1028 ; SSSE3-NEXT: pand %xmm4, %xmm7
1029 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
1030 ; SSSE3-NEXT: por %xmm7, %xmm4
1031 ; SSSE3-NEXT: pand %xmm4, %xmm1
1032 ; SSSE3-NEXT: pandn %xmm8, %xmm4
1033 ; SSSE3-NEXT: por %xmm1, %xmm4
1034 ; SSSE3-NEXT: movdqa %xmm0, %xmm1
1035 ; SSSE3-NEXT: pxor %xmm5, %xmm1
1036 ; SSSE3-NEXT: movdqa %xmm9, %xmm6
1037 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm6
1038 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1039 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm1
1040 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1041 ; SSSE3-NEXT: pand %xmm7, %xmm1
1042 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1043 ; SSSE3-NEXT: por %xmm1, %xmm6
1044 ; SSSE3-NEXT: pand %xmm6, %xmm0
1045 ; SSSE3-NEXT: pandn %xmm8, %xmm6
1046 ; SSSE3-NEXT: por %xmm6, %xmm0
1047 ; SSSE3-NEXT: packuswb %xmm4, %xmm0
1048 ; SSSE3-NEXT: movdqa %xmm3, %xmm1
1049 ; SSSE3-NEXT: pxor %xmm5, %xmm1
1050 ; SSSE3-NEXT: movdqa %xmm9, %xmm4
1051 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4
1052 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1053 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm1
1054 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1055 ; SSSE3-NEXT: pand %xmm6, %xmm1
1056 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1057 ; SSSE3-NEXT: por %xmm1, %xmm4
1058 ; SSSE3-NEXT: pand %xmm4, %xmm3
1059 ; SSSE3-NEXT: pandn %xmm8, %xmm4
1060 ; SSSE3-NEXT: por %xmm3, %xmm4
1061 ; SSSE3-NEXT: pxor %xmm2, %xmm5
1062 ; SSSE3-NEXT: movdqa %xmm9, %xmm1
1063 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm1
1064 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
1065 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm5
1066 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1067 ; SSSE3-NEXT: pand %xmm3, %xmm5
1068 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1069 ; SSSE3-NEXT: por %xmm5, %xmm1
1070 ; SSSE3-NEXT: pand %xmm1, %xmm2
1071 ; SSSE3-NEXT: pandn %xmm8, %xmm1
1072 ; SSSE3-NEXT: por %xmm2, %xmm1
1073 ; SSSE3-NEXT: packuswb %xmm4, %xmm1
1074 ; SSSE3-NEXT: packuswb %xmm1, %xmm0
1077 ; SSE41-LABEL: trunc_usat_v8i64_v8i8:
1079 ; SSE41-NEXT: movdqa %xmm0, %xmm8
1080 ; SSE41-NEXT: movapd {{.*#+}} xmm5 = [255,255]
1081 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
1082 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1083 ; SSE41-NEXT: pxor %xmm6, %xmm0
1084 ; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
1085 ; SSE41-NEXT: movdqa %xmm9, %xmm7
1086 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
1087 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
1088 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
1089 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1090 ; SSE41-NEXT: pand %xmm4, %xmm0
1091 ; SSE41-NEXT: por %xmm7, %xmm0
1092 ; SSE41-NEXT: movapd %xmm5, %xmm4
1093 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4
1094 ; SSE41-NEXT: movdqa %xmm8, %xmm0
1095 ; SSE41-NEXT: pxor %xmm6, %xmm0
1096 ; SSE41-NEXT: movdqa %xmm9, %xmm1
1097 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
1098 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,0,2,2]
1099 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
1100 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1101 ; SSE41-NEXT: pand %xmm7, %xmm0
1102 ; SSE41-NEXT: por %xmm1, %xmm0
1103 ; SSE41-NEXT: movapd %xmm5, %xmm1
1104 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm1
1105 ; SSE41-NEXT: packusdw %xmm4, %xmm1
1106 ; SSE41-NEXT: movdqa %xmm3, %xmm0
1107 ; SSE41-NEXT: pxor %xmm6, %xmm0
1108 ; SSE41-NEXT: movdqa %xmm9, %xmm4
1109 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
1110 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
1111 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
1112 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1113 ; SSE41-NEXT: pand %xmm7, %xmm0
1114 ; SSE41-NEXT: por %xmm4, %xmm0
1115 ; SSE41-NEXT: movapd %xmm5, %xmm4
1116 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm4
1117 ; SSE41-NEXT: pxor %xmm2, %xmm6
1118 ; SSE41-NEXT: movdqa %xmm9, %xmm3
1119 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm3
1120 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm3[0,0,2,2]
1121 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm6
1122 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
1123 ; SSE41-NEXT: pand %xmm7, %xmm0
1124 ; SSE41-NEXT: por %xmm3, %xmm0
1125 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5
1126 ; SSE41-NEXT: packusdw %xmm4, %xmm5
1127 ; SSE41-NEXT: packusdw %xmm5, %xmm1
1128 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1131 ; AVX1-LABEL: trunc_usat_v8i64_v8i8:
1133 ; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [255,255,255,255]
1134 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1135 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
1136 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
1137 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [9223372036854776063,9223372036854776063]
1138 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3
1139 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm6
1140 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm5, %xmm6
1141 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm6, %ymm3
1142 ; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1143 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
1144 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
1145 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3
1146 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm4
1147 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4
1148 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
1149 ; AVX1-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
1150 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1151 ; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1
1152 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
1153 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
1154 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1155 ; AVX1-NEXT: vzeroupper
1158 ; AVX2-LABEL: trunc_usat_v8i64_v8i8:
1160 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [255,255,255,255]
1161 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1162 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm4
1163 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
1164 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
1165 ; AVX2-NEXT: vblendvpd %ymm4, %ymm1, %ymm2, %ymm1
1166 ; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm3
1167 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
1168 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1169 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
1170 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1171 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1172 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1173 ; AVX2-NEXT: vzeroupper
1176 ; AVX512-LABEL: trunc_usat_v8i64_v8i8:
1178 ; AVX512-NEXT: vpminuq {{.*}}(%rip){1to8}, %zmm0, %zmm0
1179 ; AVX512-NEXT: vpmovqw %zmm0, %xmm0
1180 ; AVX512-NEXT: vzeroupper
1182 %1 = icmp ult <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
1183 %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>
1184 %3 = trunc <8 x i64> %2 to <8 x i8>
1188 define void @trunc_usat_v8i64_v8i8_store(<8 x i64> %a0, <8 x i8> *%p1) {
1189 ; SSE2-LABEL: trunc_usat_v8i64_v8i8_store:
1191 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255]
1192 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
1193 ; SSE2-NEXT: movdqa %xmm0, %xmm5
1194 ; SSE2-NEXT: pxor %xmm6, %xmm5
1195 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
1196 ; SSE2-NEXT: movdqa %xmm9, %xmm7
1197 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm7
1198 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
1199 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm5
1200 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1201 ; SSE2-NEXT: pand %xmm10, %xmm4
1202 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1203 ; SSE2-NEXT: por %xmm4, %xmm5
1204 ; SSE2-NEXT: pand %xmm5, %xmm0
1205 ; SSE2-NEXT: pandn %xmm8, %xmm5
1206 ; SSE2-NEXT: por %xmm0, %xmm5
1207 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1208 ; SSE2-NEXT: pxor %xmm6, %xmm0
1209 ; SSE2-NEXT: movdqa %xmm9, %xmm4
1210 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
1211 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
1212 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm0
1213 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
1214 ; SSE2-NEXT: pand %xmm10, %xmm7
1215 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1216 ; SSE2-NEXT: por %xmm7, %xmm0
1217 ; SSE2-NEXT: pand %xmm0, %xmm1
1218 ; SSE2-NEXT: pandn %xmm8, %xmm0
1219 ; SSE2-NEXT: por %xmm1, %xmm0
1220 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1221 ; SSE2-NEXT: pxor %xmm6, %xmm1
1222 ; SSE2-NEXT: movdqa %xmm9, %xmm4
1223 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4
1224 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
1225 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm1
1226 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
1227 ; SSE2-NEXT: pand %xmm10, %xmm7
1228 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
1229 ; SSE2-NEXT: por %xmm7, %xmm1
1230 ; SSE2-NEXT: pand %xmm1, %xmm2
1231 ; SSE2-NEXT: pandn %xmm8, %xmm1
1232 ; SSE2-NEXT: por %xmm2, %xmm1
1233 ; SSE2-NEXT: pxor %xmm3, %xmm6
1234 ; SSE2-NEXT: movdqa %xmm9, %xmm2
1235 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm2
1236 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1237 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm6
1238 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1239 ; SSE2-NEXT: pand %xmm4, %xmm6
1240 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1241 ; SSE2-NEXT: por %xmm6, %xmm2
1242 ; SSE2-NEXT: pand %xmm2, %xmm3
1243 ; SSE2-NEXT: pandn %xmm8, %xmm2
1244 ; SSE2-NEXT: por %xmm3, %xmm2
1245 ; SSE2-NEXT: pand %xmm8, %xmm2
1246 ; SSE2-NEXT: pand %xmm8, %xmm1
1247 ; SSE2-NEXT: packuswb %xmm2, %xmm1
1248 ; SSE2-NEXT: pand %xmm8, %xmm0
1249 ; SSE2-NEXT: pand %xmm8, %xmm5
1250 ; SSE2-NEXT: packuswb %xmm0, %xmm5
1251 ; SSE2-NEXT: packuswb %xmm1, %xmm5
1252 ; SSE2-NEXT: packuswb %xmm5, %xmm5
1253 ; SSE2-NEXT: movq %xmm5, (%rdi)
1256 ; SSSE3-LABEL: trunc_usat_v8i64_v8i8_store:
1258 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255]
1259 ; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259456,9223372039002259456]
1260 ; SSSE3-NEXT: movdqa %xmm0, %xmm5
1261 ; SSSE3-NEXT: pxor %xmm6, %xmm5
1262 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
1263 ; SSSE3-NEXT: movdqa %xmm9, %xmm7
1264 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm7
1265 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
1266 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm5
1267 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1268 ; SSSE3-NEXT: pand %xmm10, %xmm4
1269 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1270 ; SSSE3-NEXT: por %xmm4, %xmm5
1271 ; SSSE3-NEXT: pand %xmm5, %xmm0
1272 ; SSSE3-NEXT: pandn %xmm8, %xmm5
1273 ; SSSE3-NEXT: por %xmm0, %xmm5
1274 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
1275 ; SSSE3-NEXT: pxor %xmm6, %xmm0
1276 ; SSSE3-NEXT: movdqa %xmm9, %xmm4
1277 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
1278 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
1279 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm0
1280 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
1281 ; SSSE3-NEXT: pand %xmm10, %xmm7
1282 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1283 ; SSSE3-NEXT: por %xmm7, %xmm0
1284 ; SSSE3-NEXT: pand %xmm0, %xmm1
1285 ; SSSE3-NEXT: pandn %xmm8, %xmm0
1286 ; SSSE3-NEXT: por %xmm1, %xmm0
1287 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
1288 ; SSSE3-NEXT: pxor %xmm6, %xmm1
1289 ; SSSE3-NEXT: movdqa %xmm9, %xmm4
1290 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4
1291 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
1292 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm1
1293 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
1294 ; SSSE3-NEXT: pand %xmm10, %xmm7
1295 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
1296 ; SSSE3-NEXT: por %xmm7, %xmm1
1297 ; SSSE3-NEXT: pand %xmm1, %xmm2
1298 ; SSSE3-NEXT: pandn %xmm8, %xmm1
1299 ; SSSE3-NEXT: por %xmm2, %xmm1
1300 ; SSSE3-NEXT: pxor %xmm3, %xmm6
1301 ; SSSE3-NEXT: movdqa %xmm9, %xmm2
1302 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm2
1303 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1304 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm6
1305 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1306 ; SSSE3-NEXT: pand %xmm4, %xmm6
1307 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1308 ; SSSE3-NEXT: por %xmm6, %xmm2
1309 ; SSSE3-NEXT: pand %xmm2, %xmm3
1310 ; SSSE3-NEXT: pandn %xmm8, %xmm2
1311 ; SSSE3-NEXT: por %xmm3, %xmm2
1312 ; SSSE3-NEXT: pand %xmm8, %xmm2
1313 ; SSSE3-NEXT: pand %xmm8, %xmm1
1314 ; SSSE3-NEXT: packuswb %xmm2, %xmm1
1315 ; SSSE3-NEXT: pand %xmm8, %xmm0
1316 ; SSSE3-NEXT: pand %xmm8, %xmm5
1317 ; SSSE3-NEXT: packuswb %xmm0, %xmm5
1318 ; SSSE3-NEXT: packuswb %xmm1, %xmm5
1319 ; SSSE3-NEXT: packuswb %xmm5, %xmm5
1320 ; SSSE3-NEXT: movq %xmm5, (%rdi)
1323 ; SSE41-LABEL: trunc_usat_v8i64_v8i8_store:
1325 ; SSE41-NEXT: movdqa %xmm0, %xmm4
1326 ; SSE41-NEXT: movapd {{.*#+}} xmm8 = [255,255]
1327 ; SSE41-NEXT: movdqa {{.*#+}} xmm7 = [9223372039002259456,9223372039002259456]
1328 ; SSE41-NEXT: pxor %xmm7, %xmm0
1329 ; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711]
1330 ; SSE41-NEXT: movdqa %xmm9, %xmm6
1331 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
1332 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm6[0,0,2,2]
1333 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
1334 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1335 ; SSE41-NEXT: pand %xmm5, %xmm0
1336 ; SSE41-NEXT: por %xmm6, %xmm0
1337 ; SSE41-NEXT: movapd %xmm8, %xmm6
1338 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm6
1339 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1340 ; SSE41-NEXT: pxor %xmm7, %xmm0
1341 ; SSE41-NEXT: movdqa %xmm9, %xmm4
1342 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
1343 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1344 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
1345 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1346 ; SSE41-NEXT: pand %xmm5, %xmm0
1347 ; SSE41-NEXT: por %xmm4, %xmm0
1348 ; SSE41-NEXT: movapd %xmm8, %xmm4
1349 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4
1350 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1351 ; SSE41-NEXT: pxor %xmm7, %xmm0
1352 ; SSE41-NEXT: movdqa %xmm9, %xmm1
1353 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
1354 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2]
1355 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm0
1356 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1357 ; SSE41-NEXT: pand %xmm5, %xmm0
1358 ; SSE41-NEXT: por %xmm1, %xmm0
1359 ; SSE41-NEXT: movapd %xmm8, %xmm1
1360 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
1361 ; SSE41-NEXT: pxor %xmm3, %xmm7
1362 ; SSE41-NEXT: movdqa %xmm9, %xmm2
1363 ; SSE41-NEXT: pcmpgtd %xmm7, %xmm2
1364 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
1365 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm7
1366 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
1367 ; SSE41-NEXT: pand %xmm5, %xmm0
1368 ; SSE41-NEXT: por %xmm2, %xmm0
1369 ; SSE41-NEXT: movapd %xmm8, %xmm2
1370 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm2
1371 ; SSE41-NEXT: andpd %xmm8, %xmm2
1372 ; SSE41-NEXT: andpd %xmm8, %xmm1
1373 ; SSE41-NEXT: packusdw %xmm2, %xmm1
1374 ; SSE41-NEXT: andpd %xmm8, %xmm4
1375 ; SSE41-NEXT: andpd %xmm8, %xmm6
1376 ; SSE41-NEXT: packusdw %xmm4, %xmm6
1377 ; SSE41-NEXT: packusdw %xmm1, %xmm6
1378 ; SSE41-NEXT: packuswb %xmm6, %xmm6
1379 ; SSE41-NEXT: movq %xmm6, (%rdi)
1382 ; AVX1-LABEL: trunc_usat_v8i64_v8i8_store:
1384 ; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [255,255,255,255]
1385 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1386 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
1387 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
1388 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [9223372036854776063,9223372036854776063]
1389 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3
1390 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm6
1391 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm5, %xmm6
1392 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm6, %ymm3
1393 ; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1394 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
1395 ; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3
1396 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3
1397 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm4
1398 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4
1399 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3
1400 ; AVX1-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
1401 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1402 ; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [1.2598673968951787E-321,1.2598673968951787E-321]
1403 ; AVX1-NEXT: # xmm3 = mem[0,0]
1404 ; AVX1-NEXT: vandpd %xmm3, %xmm2, %xmm2
1405 ; AVX1-NEXT: vandpd %xmm3, %xmm1, %xmm1
1406 ; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1
1407 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
1408 ; AVX1-NEXT: vandpd %xmm3, %xmm2, %xmm2
1409 ; AVX1-NEXT: vandpd %xmm3, %xmm0, %xmm0
1410 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
1411 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1412 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
1413 ; AVX1-NEXT: vmovq %xmm0, (%rdi)
1414 ; AVX1-NEXT: vzeroupper
1417 ; AVX2-LABEL: trunc_usat_v8i64_v8i8_store:
1419 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [255,255,255,255]
1420 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1421 ; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm4
1422 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
1423 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4
1424 ; AVX2-NEXT: vblendvpd %ymm4, %ymm0, %ymm2, %ymm0
1425 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm3
1426 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm5, %ymm3
1427 ; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
1428 ; AVX2-NEXT: vextractf128 $1, %ymm1, %xmm2
1429 ; AVX2-NEXT: vpackusdw %xmm2, %xmm1, %xmm1
1430 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1431 ; AVX2-NEXT: vpshufb %xmm2, %xmm1, %xmm1
1432 ; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm3
1433 ; AVX2-NEXT: vpackusdw %xmm3, %xmm0, %xmm0
1434 ; AVX2-NEXT: vpshufb %xmm2, %xmm0, %xmm0
1435 ; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1436 ; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
1437 ; AVX2-NEXT: vmovq %xmm0, (%rdi)
1438 ; AVX2-NEXT: vzeroupper
1441 ; AVX512-LABEL: trunc_usat_v8i64_v8i8_store:
1443 ; AVX512-NEXT: vpmovusqb %zmm0, (%rdi)
1444 ; AVX512-NEXT: vzeroupper
1446 %1 = icmp ult <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
1447 %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>
1448 %3 = trunc <8 x i64> %2 to <8 x i8>
1449 store <8 x i8> %3, <8 x i8> *%p1
1453 define <16 x i8> @trunc_usat_v16i64_v16i8(<16 x i64> %a0) {
1454 ; SSE2-LABEL: trunc_usat_v16i64_v16i8:
1456 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255]
1457 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259456,9223372039002259456]
1458 ; SSE2-NEXT: movdqa %xmm1, %xmm11
1459 ; SSE2-NEXT: pxor %xmm9, %xmm11
1460 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [9223372039002259711,9223372039002259711]
1461 ; SSE2-NEXT: movdqa %xmm10, %xmm12
1462 ; SSE2-NEXT: pcmpgtd %xmm11, %xmm12
1463 ; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
1464 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm11
1465 ; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]
1466 ; SSE2-NEXT: pand %xmm13, %xmm11
1467 ; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
1468 ; SSE2-NEXT: por %xmm11, %xmm12
1469 ; SSE2-NEXT: pand %xmm12, %xmm1
1470 ; SSE2-NEXT: pandn %xmm8, %xmm12
1471 ; SSE2-NEXT: por %xmm1, %xmm12
1472 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1473 ; SSE2-NEXT: pxor %xmm9, %xmm1
1474 ; SSE2-NEXT: movdqa %xmm10, %xmm11
1475 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm11
1476 ; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm11[0,0,2,2]
1477 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm1
1478 ; SSE2-NEXT: pshufd {{.*#+}} xmm14 = xmm1[1,1,3,3]
1479 ; SSE2-NEXT: pand %xmm13, %xmm14
1480 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3]
1481 ; SSE2-NEXT: por %xmm14, %xmm1
1482 ; SSE2-NEXT: pand %xmm1, %xmm0
1483 ; SSE2-NEXT: pandn %xmm8, %xmm1
1484 ; SSE2-NEXT: por %xmm1, %xmm0
1485 ; SSE2-NEXT: packuswb %xmm12, %xmm0
1486 ; SSE2-NEXT: movdqa %xmm3, %xmm1
1487 ; SSE2-NEXT: pxor %xmm9, %xmm1
1488 ; SSE2-NEXT: movdqa %xmm10, %xmm11
1489 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm11
1490 ; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1491 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm1
1492 ; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm1[1,1,3,3]
1493 ; SSE2-NEXT: pand %xmm12, %xmm13
1494 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3]
1495 ; SSE2-NEXT: por %xmm13, %xmm1
1496 ; SSE2-NEXT: pand %xmm1, %xmm3
1497 ; SSE2-NEXT: pandn %xmm8, %xmm1
1498 ; SSE2-NEXT: por %xmm3, %xmm1
1499 ; SSE2-NEXT: movdqa %xmm2, %xmm3
1500 ; SSE2-NEXT: pxor %xmm9, %xmm3
1501 ; SSE2-NEXT: movdqa %xmm10, %xmm11
1502 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm11
1503 ; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1504 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm3
1505 ; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm3[1,1,3,3]
1506 ; SSE2-NEXT: pand %xmm12, %xmm13
1507 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm11[1,1,3,3]
1508 ; SSE2-NEXT: por %xmm13, %xmm3
1509 ; SSE2-NEXT: pand %xmm3, %xmm2
1510 ; SSE2-NEXT: pandn %xmm8, %xmm3
1511 ; SSE2-NEXT: por %xmm2, %xmm3
1512 ; SSE2-NEXT: packuswb %xmm1, %xmm3
1513 ; SSE2-NEXT: packuswb %xmm3, %xmm0
1514 ; SSE2-NEXT: movdqa %xmm5, %xmm1
1515 ; SSE2-NEXT: pxor %xmm9, %xmm1
1516 ; SSE2-NEXT: movdqa %xmm10, %xmm2
1517 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
1518 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
1519 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm1
1520 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1521 ; SSE2-NEXT: pand %xmm3, %xmm1
1522 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1523 ; SSE2-NEXT: por %xmm1, %xmm2
1524 ; SSE2-NEXT: pand %xmm2, %xmm5
1525 ; SSE2-NEXT: pandn %xmm8, %xmm2
1526 ; SSE2-NEXT: por %xmm5, %xmm2
1527 ; SSE2-NEXT: movdqa %xmm4, %xmm1
1528 ; SSE2-NEXT: pxor %xmm9, %xmm1
1529 ; SSE2-NEXT: movdqa %xmm10, %xmm3
1530 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
1531 ; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm3[0,0,2,2]
1532 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm1
1533 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
1534 ; SSE2-NEXT: pand %xmm11, %xmm5
1535 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
1536 ; SSE2-NEXT: por %xmm5, %xmm1
1537 ; SSE2-NEXT: pand %xmm1, %xmm4
1538 ; SSE2-NEXT: pandn %xmm8, %xmm1
1539 ; SSE2-NEXT: por %xmm4, %xmm1
1540 ; SSE2-NEXT: packuswb %xmm2, %xmm1
1541 ; SSE2-NEXT: movdqa %xmm7, %xmm2
1542 ; SSE2-NEXT: pxor %xmm9, %xmm2
1543 ; SSE2-NEXT: movdqa %xmm10, %xmm3
1544 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
1545 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1546 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm2
1547 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1548 ; SSE2-NEXT: pand %xmm4, %xmm2
1549 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1550 ; SSE2-NEXT: por %xmm2, %xmm3
1551 ; SSE2-NEXT: pand %xmm3, %xmm7
1552 ; SSE2-NEXT: pandn %xmm8, %xmm3
1553 ; SSE2-NEXT: por %xmm7, %xmm3
1554 ; SSE2-NEXT: pxor %xmm6, %xmm9
1555 ; SSE2-NEXT: movdqa %xmm10, %xmm2
1556 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm2
1557 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1558 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm9
1559 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm9[1,1,3,3]
1560 ; SSE2-NEXT: pand %xmm4, %xmm5
1561 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1562 ; SSE2-NEXT: por %xmm5, %xmm2
1563 ; SSE2-NEXT: pand %xmm2, %xmm6
1564 ; SSE2-NEXT: pandn %xmm8, %xmm2
1565 ; SSE2-NEXT: por %xmm6, %xmm2
1566 ; SSE2-NEXT: packuswb %xmm3, %xmm2
1567 ; SSE2-NEXT: packuswb %xmm2, %xmm1
1568 ; SSE2-NEXT: packuswb %xmm1, %xmm0
1571 ; SSSE3-LABEL: trunc_usat_v16i64_v16i8:
1573 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255]
1574 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259456,9223372039002259456]
1575 ; SSSE3-NEXT: movdqa %xmm1, %xmm11
1576 ; SSSE3-NEXT: pxor %xmm9, %xmm11
1577 ; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [9223372039002259711,9223372039002259711]
1578 ; SSSE3-NEXT: movdqa %xmm10, %xmm12
1579 ; SSSE3-NEXT: pcmpgtd %xmm11, %xmm12
1580 ; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
1581 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm11
1582 ; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]
1583 ; SSSE3-NEXT: pand %xmm13, %xmm11
1584 ; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
1585 ; SSSE3-NEXT: por %xmm11, %xmm12
1586 ; SSSE3-NEXT: pand %xmm12, %xmm1
1587 ; SSSE3-NEXT: pandn %xmm8, %xmm12
1588 ; SSSE3-NEXT: por %xmm1, %xmm12
1589 ; SSSE3-NEXT: movdqa %xmm0, %xmm1
1590 ; SSSE3-NEXT: pxor %xmm9, %xmm1
1591 ; SSSE3-NEXT: movdqa %xmm10, %xmm11
1592 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm11
1593 ; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm11[0,0,2,2]
1594 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1
1595 ; SSSE3-NEXT: pshufd {{.*#+}} xmm14 = xmm1[1,1,3,3]
1596 ; SSSE3-NEXT: pand %xmm13, %xmm14
1597 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3]
1598 ; SSSE3-NEXT: por %xmm14, %xmm1
1599 ; SSSE3-NEXT: pand %xmm1, %xmm0
1600 ; SSSE3-NEXT: pandn %xmm8, %xmm1
1601 ; SSSE3-NEXT: por %xmm1, %xmm0
1602 ; SSSE3-NEXT: packuswb %xmm12, %xmm0
1603 ; SSSE3-NEXT: movdqa %xmm3, %xmm1
1604 ; SSSE3-NEXT: pxor %xmm9, %xmm1
1605 ; SSSE3-NEXT: movdqa %xmm10, %xmm11
1606 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm11
1607 ; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1608 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1
1609 ; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm1[1,1,3,3]
1610 ; SSSE3-NEXT: pand %xmm12, %xmm13
1611 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm11[1,1,3,3]
1612 ; SSSE3-NEXT: por %xmm13, %xmm1
1613 ; SSSE3-NEXT: pand %xmm1, %xmm3
1614 ; SSSE3-NEXT: pandn %xmm8, %xmm1
1615 ; SSSE3-NEXT: por %xmm3, %xmm1
1616 ; SSSE3-NEXT: movdqa %xmm2, %xmm3
1617 ; SSSE3-NEXT: pxor %xmm9, %xmm3
1618 ; SSSE3-NEXT: movdqa %xmm10, %xmm11
1619 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm11
1620 ; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1621 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm3
1622 ; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm3[1,1,3,3]
1623 ; SSSE3-NEXT: pand %xmm12, %xmm13
1624 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm11[1,1,3,3]
1625 ; SSSE3-NEXT: por %xmm13, %xmm3
1626 ; SSSE3-NEXT: pand %xmm3, %xmm2
1627 ; SSSE3-NEXT: pandn %xmm8, %xmm3
1628 ; SSSE3-NEXT: por %xmm2, %xmm3
1629 ; SSSE3-NEXT: packuswb %xmm1, %xmm3
1630 ; SSSE3-NEXT: packuswb %xmm3, %xmm0
1631 ; SSSE3-NEXT: movdqa %xmm5, %xmm1
1632 ; SSSE3-NEXT: pxor %xmm9, %xmm1
1633 ; SSSE3-NEXT: movdqa %xmm10, %xmm2
1634 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
1635 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
1636 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1
1637 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1638 ; SSSE3-NEXT: pand %xmm3, %xmm1
1639 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1640 ; SSSE3-NEXT: por %xmm1, %xmm2
1641 ; SSSE3-NEXT: pand %xmm2, %xmm5
1642 ; SSSE3-NEXT: pandn %xmm8, %xmm2
1643 ; SSSE3-NEXT: por %xmm5, %xmm2
1644 ; SSSE3-NEXT: movdqa %xmm4, %xmm1
1645 ; SSSE3-NEXT: pxor %xmm9, %xmm1
1646 ; SSSE3-NEXT: movdqa %xmm10, %xmm3
1647 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3
1648 ; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm3[0,0,2,2]
1649 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1
1650 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
1651 ; SSSE3-NEXT: pand %xmm11, %xmm5
1652 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
1653 ; SSSE3-NEXT: por %xmm5, %xmm1
1654 ; SSSE3-NEXT: pand %xmm1, %xmm4
1655 ; SSSE3-NEXT: pandn %xmm8, %xmm1
1656 ; SSSE3-NEXT: por %xmm4, %xmm1
1657 ; SSSE3-NEXT: packuswb %xmm2, %xmm1
1658 ; SSSE3-NEXT: movdqa %xmm7, %xmm2
1659 ; SSSE3-NEXT: pxor %xmm9, %xmm2
1660 ; SSSE3-NEXT: movdqa %xmm10, %xmm3
1661 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
1662 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1663 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm2
1664 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1665 ; SSSE3-NEXT: pand %xmm4, %xmm2
1666 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1667 ; SSSE3-NEXT: por %xmm2, %xmm3
1668 ; SSSE3-NEXT: pand %xmm3, %xmm7
1669 ; SSSE3-NEXT: pandn %xmm8, %xmm3
1670 ; SSSE3-NEXT: por %xmm7, %xmm3
1671 ; SSSE3-NEXT: pxor %xmm6, %xmm9
1672 ; SSSE3-NEXT: movdqa %xmm10, %xmm2
1673 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm2
1674 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1675 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm9
1676 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm9[1,1,3,3]
1677 ; SSSE3-NEXT: pand %xmm4, %xmm5
1678 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1679 ; SSSE3-NEXT: por %xmm5, %xmm2
1680 ; SSSE3-NEXT: pand %xmm2, %xmm6
1681 ; SSSE3-NEXT: pandn %xmm8, %xmm2
1682 ; SSSE3-NEXT: por %xmm6, %xmm2
1683 ; SSSE3-NEXT: packuswb %xmm3, %xmm2
1684 ; SSSE3-NEXT: packuswb %xmm2, %xmm1
1685 ; SSSE3-NEXT: packuswb %xmm1, %xmm0
1688 ; SSE41-LABEL: trunc_usat_v16i64_v16i8:
1690 ; SSE41-NEXT: movdqa %xmm0, %xmm8
1691 ; SSE41-NEXT: movapd {{.*#+}} xmm9 = [255,255]
1692 ; SSE41-NEXT: movdqa {{.*#+}} xmm10 = [9223372039002259456,9223372039002259456]
1693 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1694 ; SSE41-NEXT: pxor %xmm10, %xmm0
1695 ; SSE41-NEXT: movdqa {{.*#+}} xmm11 = [9223372039002259711,9223372039002259711]
1696 ; SSE41-NEXT: movdqa %xmm11, %xmm12
1697 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm12
1698 ; SSE41-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
1699 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0
1700 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1701 ; SSE41-NEXT: pand %xmm13, %xmm0
1702 ; SSE41-NEXT: por %xmm12, %xmm0
1703 ; SSE41-NEXT: movapd %xmm9, %xmm12
1704 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm12
1705 ; SSE41-NEXT: movdqa %xmm8, %xmm0
1706 ; SSE41-NEXT: pxor %xmm10, %xmm0
1707 ; SSE41-NEXT: movdqa %xmm11, %xmm1
1708 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
1709 ; SSE41-NEXT: pshufd {{.*#+}} xmm13 = xmm1[0,0,2,2]
1710 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0
1711 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1712 ; SSE41-NEXT: pand %xmm13, %xmm0
1713 ; SSE41-NEXT: por %xmm1, %xmm0
1714 ; SSE41-NEXT: movapd %xmm9, %xmm13
1715 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm13
1716 ; SSE41-NEXT: packusdw %xmm12, %xmm13
1717 ; SSE41-NEXT: movdqa %xmm3, %xmm0
1718 ; SSE41-NEXT: pxor %xmm10, %xmm0
1719 ; SSE41-NEXT: movdqa %xmm11, %xmm1
1720 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
1721 ; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm1[0,0,2,2]
1722 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0
1723 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1724 ; SSE41-NEXT: pand %xmm8, %xmm0
1725 ; SSE41-NEXT: por %xmm1, %xmm0
1726 ; SSE41-NEXT: movapd %xmm9, %xmm1
1727 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm1
1728 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1729 ; SSE41-NEXT: pxor %xmm10, %xmm0
1730 ; SSE41-NEXT: movdqa %xmm11, %xmm3
1731 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
1732 ; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm3[0,0,2,2]
1733 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0
1734 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1735 ; SSE41-NEXT: pand %xmm8, %xmm0
1736 ; SSE41-NEXT: por %xmm3, %xmm0
1737 ; SSE41-NEXT: movapd %xmm9, %xmm3
1738 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm3
1739 ; SSE41-NEXT: packusdw %xmm1, %xmm3
1740 ; SSE41-NEXT: packusdw %xmm3, %xmm13
1741 ; SSE41-NEXT: movdqa %xmm5, %xmm0
1742 ; SSE41-NEXT: pxor %xmm10, %xmm0
1743 ; SSE41-NEXT: movdqa %xmm11, %xmm1
1744 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
1745 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
1746 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0
1747 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1748 ; SSE41-NEXT: pand %xmm2, %xmm0
1749 ; SSE41-NEXT: por %xmm1, %xmm0
1750 ; SSE41-NEXT: movapd %xmm9, %xmm1
1751 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1
1752 ; SSE41-NEXT: movdqa %xmm4, %xmm0
1753 ; SSE41-NEXT: pxor %xmm10, %xmm0
1754 ; SSE41-NEXT: movdqa %xmm11, %xmm2
1755 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
1756 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
1757 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0
1758 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1759 ; SSE41-NEXT: pand %xmm3, %xmm0
1760 ; SSE41-NEXT: por %xmm2, %xmm0
1761 ; SSE41-NEXT: movapd %xmm9, %xmm2
1762 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2
1763 ; SSE41-NEXT: packusdw %xmm1, %xmm2
1764 ; SSE41-NEXT: movdqa %xmm7, %xmm0
1765 ; SSE41-NEXT: pxor %xmm10, %xmm0
1766 ; SSE41-NEXT: movdqa %xmm11, %xmm1
1767 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
1768 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
1769 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm0
1770 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1771 ; SSE41-NEXT: pand %xmm3, %xmm0
1772 ; SSE41-NEXT: por %xmm1, %xmm0
1773 ; SSE41-NEXT: movapd %xmm9, %xmm1
1774 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm1
1775 ; SSE41-NEXT: pxor %xmm6, %xmm10
1776 ; SSE41-NEXT: movdqa %xmm11, %xmm3
1777 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm3
1778 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1779 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm10
1780 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]
1781 ; SSE41-NEXT: pand %xmm4, %xmm0
1782 ; SSE41-NEXT: por %xmm3, %xmm0
1783 ; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm9
1784 ; SSE41-NEXT: packusdw %xmm1, %xmm9
1785 ; SSE41-NEXT: packusdw %xmm9, %xmm2
1786 ; SSE41-NEXT: packuswb %xmm2, %xmm13
1787 ; SSE41-NEXT: movdqa %xmm13, %xmm0
1790 ; AVX1-LABEL: trunc_usat_v16i64_v16i8:
1792 ; AVX1-NEXT: vmovapd {{.*#+}} ymm8 = [255,255,255,255]
1793 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
1794 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [9223372036854775808,9223372036854775808]
1795 ; AVX1-NEXT: vpxor %xmm6, %xmm5, %xmm5
1796 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [9223372036854776063,9223372036854776063]
1797 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm7, %xmm5
1798 ; AVX1-NEXT: vpxor %xmm6, %xmm0, %xmm4
1799 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm7, %xmm4
1800 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm4, %ymm4
1801 ; AVX1-NEXT: vblendvpd %ymm4, %ymm0, %ymm8, %ymm0
1802 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
1803 ; AVX1-NEXT: vpxor %xmm6, %xmm4, %xmm4
1804 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm7, %xmm4
1805 ; AVX1-NEXT: vpxor %xmm6, %xmm1, %xmm5
1806 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm7, %xmm5
1807 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm5, %ymm4
1808 ; AVX1-NEXT: vblendvpd %ymm4, %ymm1, %ymm8, %ymm1
1809 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
1810 ; AVX1-NEXT: vpxor %xmm6, %xmm4, %xmm4
1811 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm7, %xmm4
1812 ; AVX1-NEXT: vpxor %xmm6, %xmm2, %xmm5
1813 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm7, %xmm5
1814 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm5, %ymm4
1815 ; AVX1-NEXT: vblendvpd %ymm4, %ymm2, %ymm8, %ymm2
1816 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
1817 ; AVX1-NEXT: vpxor %xmm6, %xmm4, %xmm4
1818 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm7, %xmm4
1819 ; AVX1-NEXT: vpxor %xmm6, %xmm3, %xmm5
1820 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm7, %xmm5
1821 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm5, %ymm4
1822 ; AVX1-NEXT: vblendvpd %ymm4, %ymm3, %ymm8, %ymm3
1823 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
1824 ; AVX1-NEXT: vpackusdw %xmm4, %xmm3, %xmm3
1825 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
1826 ; AVX1-NEXT: vpackusdw %xmm4, %xmm2, %xmm2
1827 ; AVX1-NEXT: vpackusdw %xmm3, %xmm2, %xmm2
1828 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
1829 ; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1
1830 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1831 ; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0
1832 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1833 ; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
1834 ; AVX1-NEXT: vzeroupper
1837 ; AVX2-LABEL: trunc_usat_v16i64_v16i8:
1839 ; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm4 = [255,255,255,255]
1840 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1841 ; AVX2-NEXT: vpxor %ymm5, %ymm1, %ymm6
1842 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm7 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063]
1843 ; AVX2-NEXT: vpcmpgtq %ymm6, %ymm7, %ymm6
1844 ; AVX2-NEXT: vblendvpd %ymm6, %ymm1, %ymm4, %ymm1
1845 ; AVX2-NEXT: vpxor %ymm5, %ymm0, %ymm6
1846 ; AVX2-NEXT: vpcmpgtq %ymm6, %ymm7, %ymm6
1847 ; AVX2-NEXT: vblendvpd %ymm6, %ymm0, %ymm4, %ymm0
1848 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
1849 ; AVX2-NEXT: vpxor %ymm5, %ymm3, %ymm1
1850 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm7, %ymm1
1851 ; AVX2-NEXT: vblendvpd %ymm1, %ymm3, %ymm4, %ymm1
1852 ; AVX2-NEXT: vpxor %ymm5, %ymm2, %ymm3
1853 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm7, %ymm3
1854 ; AVX2-NEXT: vblendvpd %ymm3, %ymm2, %ymm4, %ymm2
1855 ; AVX2-NEXT: vpackusdw %ymm1, %ymm2, %ymm1
1856 ; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
1857 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1858 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
1859 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1860 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1861 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
1862 ; AVX2-NEXT: vzeroupper
1865 ; AVX512-LABEL: trunc_usat_v16i64_v16i8:
1867 ; AVX512-NEXT: vpbroadcastq {{.*#+}} zmm2 = [255,255,255,255,255,255,255,255]
1868 ; AVX512-NEXT: vpminuq %zmm2, %zmm1, %zmm1
1869 ; AVX512-NEXT: vpminuq %zmm2, %zmm0, %zmm0
1870 ; AVX512-NEXT: vpmovqd %zmm0, %ymm0
1871 ; AVX512-NEXT: vpmovqd %zmm1, %ymm1
1872 ; AVX512-NEXT: vinserti64x4 $1, %ymm1, %zmm0, %zmm0
1873 ; AVX512-NEXT: vpmovdb %zmm0, %xmm0
1874 ; AVX512-NEXT: vzeroupper
1876 %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>
1877 %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>
1878 %3 = trunc <16 x i64> %2 to <16 x i8>
1882 define <8 x i8> @trunc_usat_v8i32_v8i8(<8 x i32> %a0) {
1883 ; SSE2-LABEL: trunc_usat_v8i32_v8i8:
1885 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
1886 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
1887 ; SSE2-NEXT: movdqa %xmm1, %xmm4
1888 ; SSE2-NEXT: pxor %xmm3, %xmm4
1889 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
1890 ; SSE2-NEXT: movdqa %xmm5, %xmm6
1891 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm6
1892 ; SSE2-NEXT: pand %xmm6, %xmm1
1893 ; SSE2-NEXT: pandn %xmm2, %xmm6
1894 ; SSE2-NEXT: por %xmm1, %xmm6
1895 ; SSE2-NEXT: pxor %xmm0, %xmm3
1896 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
1897 ; SSE2-NEXT: pand %xmm5, %xmm0
1898 ; SSE2-NEXT: pandn %xmm2, %xmm5
1899 ; SSE2-NEXT: por %xmm5, %xmm0
1900 ; SSE2-NEXT: packuswb %xmm6, %xmm0
1903 ; SSSE3-LABEL: trunc_usat_v8i32_v8i8:
1905 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
1906 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
1907 ; SSSE3-NEXT: movdqa %xmm1, %xmm4
1908 ; SSSE3-NEXT: pxor %xmm3, %xmm4
1909 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
1910 ; SSSE3-NEXT: movdqa %xmm5, %xmm6
1911 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
1912 ; SSSE3-NEXT: pand %xmm6, %xmm1
1913 ; SSSE3-NEXT: pandn %xmm2, %xmm6
1914 ; SSSE3-NEXT: por %xmm1, %xmm6
1915 ; SSSE3-NEXT: pxor %xmm0, %xmm3
1916 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
1917 ; SSSE3-NEXT: pand %xmm5, %xmm0
1918 ; SSSE3-NEXT: pandn %xmm2, %xmm5
1919 ; SSSE3-NEXT: por %xmm5, %xmm0
1920 ; SSSE3-NEXT: packuswb %xmm6, %xmm0
1923 ; SSE41-LABEL: trunc_usat_v8i32_v8i8:
1925 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
1926 ; SSE41-NEXT: pminud %xmm2, %xmm1
1927 ; SSE41-NEXT: pminud %xmm2, %xmm0
1928 ; SSE41-NEXT: packusdw %xmm1, %xmm0
1931 ; AVX1-LABEL: trunc_usat_v8i32_v8i8:
1933 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1934 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [255,255,255,255]
1935 ; AVX1-NEXT: vpminud %xmm2, %xmm1, %xmm1
1936 ; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0
1937 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1938 ; AVX1-NEXT: vzeroupper
1941 ; AVX2-LABEL: trunc_usat_v8i32_v8i8:
1943 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
1944 ; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0
1945 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1946 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1947 ; AVX2-NEXT: vzeroupper
1950 ; AVX512F-LABEL: trunc_usat_v8i32_v8i8:
1952 ; AVX512F-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
1953 ; AVX512F-NEXT: vpminud %ymm1, %ymm0, %ymm0
1954 ; AVX512F-NEXT: vpmovdw %zmm0, %ymm0
1955 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
1956 ; AVX512F-NEXT: vzeroupper
1957 ; AVX512F-NEXT: retq
1959 ; AVX512VL-LABEL: trunc_usat_v8i32_v8i8:
1960 ; AVX512VL: # %bb.0:
1961 ; AVX512VL-NEXT: vpminud {{.*}}(%rip){1to8}, %ymm0, %ymm0
1962 ; AVX512VL-NEXT: vpmovdw %ymm0, %xmm0
1963 ; AVX512VL-NEXT: vzeroupper
1964 ; AVX512VL-NEXT: retq
1966 ; AVX512BW-LABEL: trunc_usat_v8i32_v8i8:
1967 ; AVX512BW: # %bb.0:
1968 ; AVX512BW-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
1969 ; AVX512BW-NEXT: vpminud %ymm1, %ymm0, %ymm0
1970 ; AVX512BW-NEXT: vpmovdw %zmm0, %ymm0
1971 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
1972 ; AVX512BW-NEXT: vzeroupper
1973 ; AVX512BW-NEXT: retq
1975 ; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i8:
1976 ; AVX512BWVL: # %bb.0:
1977 ; AVX512BWVL-NEXT: vpminud {{.*}}(%rip){1to8}, %ymm0, %ymm0
1978 ; AVX512BWVL-NEXT: vpmovdw %ymm0, %xmm0
1979 ; AVX512BWVL-NEXT: vzeroupper
1980 ; AVX512BWVL-NEXT: retq
1981 %1 = icmp ult <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
1982 %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>
1983 %3 = trunc <8 x i32> %2 to <8 x i8>
1987 define void @trunc_usat_v8i32_v8i8_store(<8 x i32> %a0, <8 x i8> *%p1) {
1988 ; SSE2-LABEL: trunc_usat_v8i32_v8i8_store:
1990 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
1991 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
1992 ; SSE2-NEXT: movdqa %xmm0, %xmm4
1993 ; SSE2-NEXT: pxor %xmm3, %xmm4
1994 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
1995 ; SSE2-NEXT: movdqa %xmm5, %xmm6
1996 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm6
1997 ; SSE2-NEXT: pand %xmm6, %xmm0
1998 ; SSE2-NEXT: pandn %xmm2, %xmm6
1999 ; SSE2-NEXT: por %xmm0, %xmm6
2000 ; SSE2-NEXT: pxor %xmm1, %xmm3
2001 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm5
2002 ; SSE2-NEXT: pand %xmm5, %xmm1
2003 ; SSE2-NEXT: pandn %xmm2, %xmm5
2004 ; SSE2-NEXT: por %xmm1, %xmm5
2005 ; SSE2-NEXT: pand %xmm2, %xmm5
2006 ; SSE2-NEXT: pand %xmm2, %xmm6
2007 ; SSE2-NEXT: packuswb %xmm5, %xmm6
2008 ; SSE2-NEXT: packuswb %xmm6, %xmm6
2009 ; SSE2-NEXT: movq %xmm6, (%rdi)
2012 ; SSSE3-LABEL: trunc_usat_v8i32_v8i8_store:
2014 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
2015 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
2016 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
2017 ; SSSE3-NEXT: pxor %xmm3, %xmm4
2018 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
2019 ; SSSE3-NEXT: movdqa %xmm5, %xmm6
2020 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
2021 ; SSSE3-NEXT: pand %xmm6, %xmm0
2022 ; SSSE3-NEXT: pandn %xmm2, %xmm6
2023 ; SSSE3-NEXT: por %xmm0, %xmm6
2024 ; SSSE3-NEXT: pxor %xmm1, %xmm3
2025 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
2026 ; SSSE3-NEXT: pand %xmm5, %xmm1
2027 ; SSSE3-NEXT: pandn %xmm2, %xmm5
2028 ; SSSE3-NEXT: por %xmm1, %xmm5
2029 ; SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
2030 ; SSSE3-NEXT: pshufb %xmm0, %xmm5
2031 ; SSSE3-NEXT: pshufb %xmm0, %xmm6
2032 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm6 = xmm6[0],xmm5[0]
2033 ; SSSE3-NEXT: pshufb {{.*#+}} xmm6 = xmm6[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
2034 ; SSSE3-NEXT: movq %xmm6, (%rdi)
2037 ; SSE41-LABEL: trunc_usat_v8i32_v8i8_store:
2039 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255]
2040 ; SSE41-NEXT: pminud %xmm2, %xmm1
2041 ; SSE41-NEXT: pminud %xmm2, %xmm0
2042 ; SSE41-NEXT: packusdw %xmm1, %xmm0
2043 ; SSE41-NEXT: packuswb %xmm0, %xmm0
2044 ; SSE41-NEXT: movq %xmm0, (%rdi)
2047 ; AVX1-LABEL: trunc_usat_v8i32_v8i8_store:
2049 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
2050 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [255,255,255,255]
2051 ; AVX1-NEXT: vpminud %xmm2, %xmm1, %xmm1
2052 ; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0
2053 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
2054 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2055 ; AVX1-NEXT: vmovq %xmm0, (%rdi)
2056 ; AVX1-NEXT: vzeroupper
2059 ; AVX2-LABEL: trunc_usat_v8i32_v8i8_store:
2061 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
2062 ; AVX2-NEXT: vpminud %ymm1, %ymm0, %ymm0
2063 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
2064 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
2065 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2066 ; AVX2-NEXT: vmovq %xmm0, (%rdi)
2067 ; AVX2-NEXT: vzeroupper
2070 ; AVX512F-LABEL: trunc_usat_v8i32_v8i8_store:
2072 ; AVX512F-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
2073 ; AVX512F-NEXT: vpminud %ymm1, %ymm0, %ymm0
2074 ; AVX512F-NEXT: vpmovdw %zmm0, %ymm0
2075 ; AVX512F-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2076 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
2077 ; AVX512F-NEXT: vzeroupper
2078 ; AVX512F-NEXT: retq
2080 ; AVX512VL-LABEL: trunc_usat_v8i32_v8i8_store:
2081 ; AVX512VL: # %bb.0:
2082 ; AVX512VL-NEXT: vpmovusdb %ymm0, (%rdi)
2083 ; AVX512VL-NEXT: vzeroupper
2084 ; AVX512VL-NEXT: retq
2086 ; AVX512BW-LABEL: trunc_usat_v8i32_v8i8_store:
2087 ; AVX512BW: # %bb.0:
2088 ; AVX512BW-NEXT: vpbroadcastd {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255]
2089 ; AVX512BW-NEXT: vpminud %ymm1, %ymm0, %ymm0
2090 ; AVX512BW-NEXT: vpmovdw %zmm0, %ymm0
2091 ; AVX512BW-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2092 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
2093 ; AVX512BW-NEXT: vzeroupper
2094 ; AVX512BW-NEXT: retq
2096 ; AVX512BWVL-LABEL: trunc_usat_v8i32_v8i8_store:
2097 ; AVX512BWVL: # %bb.0:
2098 ; AVX512BWVL-NEXT: vpmovusdb %ymm0, (%rdi)
2099 ; AVX512BWVL-NEXT: vzeroupper
2100 ; AVX512BWVL-NEXT: retq
2101 %1 = icmp ult <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
2102 %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>
2103 %3 = trunc <8 x i32> %2 to <8 x i8>
2104 store <8 x i8> %3, <8 x i8> *%p1
2108 define <16 x i8> @trunc_usat_v16i32_v16i8(<16 x i32> %a0) {
2109 ; SSE2-LABEL: trunc_usat_v16i32_v16i8:
2111 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255,255,255]
2112 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
2113 ; SSE2-NEXT: movdqa %xmm1, %xmm7
2114 ; SSE2-NEXT: pxor %xmm6, %xmm7
2115 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
2116 ; SSE2-NEXT: movdqa %xmm5, %xmm4
2117 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm4
2118 ; SSE2-NEXT: pand %xmm4, %xmm1
2119 ; SSE2-NEXT: pandn %xmm8, %xmm4
2120 ; SSE2-NEXT: por %xmm1, %xmm4
2121 ; SSE2-NEXT: movdqa %xmm0, %xmm1
2122 ; SSE2-NEXT: pxor %xmm6, %xmm1
2123 ; SSE2-NEXT: movdqa %xmm5, %xmm7
2124 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm7
2125 ; SSE2-NEXT: pand %xmm7, %xmm0
2126 ; SSE2-NEXT: pandn %xmm8, %xmm7
2127 ; SSE2-NEXT: por %xmm7, %xmm0
2128 ; SSE2-NEXT: packuswb %xmm4, %xmm0
2129 ; SSE2-NEXT: movdqa %xmm3, %xmm1
2130 ; SSE2-NEXT: pxor %xmm6, %xmm1
2131 ; SSE2-NEXT: movdqa %xmm5, %xmm4
2132 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4
2133 ; SSE2-NEXT: pand %xmm4, %xmm3
2134 ; SSE2-NEXT: pandn %xmm8, %xmm4
2135 ; SSE2-NEXT: por %xmm3, %xmm4
2136 ; SSE2-NEXT: pxor %xmm2, %xmm6
2137 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm5
2138 ; SSE2-NEXT: pand %xmm5, %xmm2
2139 ; SSE2-NEXT: pandn %xmm8, %xmm5
2140 ; SSE2-NEXT: por %xmm2, %xmm5
2141 ; SSE2-NEXT: packuswb %xmm4, %xmm5
2142 ; SSE2-NEXT: packuswb %xmm5, %xmm0
2145 ; SSSE3-LABEL: trunc_usat_v16i32_v16i8:
2147 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [255,255,255,255]
2148 ; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
2149 ; SSSE3-NEXT: movdqa %xmm1, %xmm7
2150 ; SSSE3-NEXT: pxor %xmm6, %xmm7
2151 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483903,2147483903,2147483903,2147483903]
2152 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
2153 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm4
2154 ; SSSE3-NEXT: pand %xmm4, %xmm1
2155 ; SSSE3-NEXT: pandn %xmm8, %xmm4
2156 ; SSSE3-NEXT: por %xmm1, %xmm4
2157 ; SSSE3-NEXT: movdqa %xmm0, %xmm1
2158 ; SSSE3-NEXT: pxor %xmm6, %xmm1
2159 ; SSSE3-NEXT: movdqa %xmm5, %xmm7
2160 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm7
2161 ; SSSE3-NEXT: pand %xmm7, %xmm0
2162 ; SSSE3-NEXT: pandn %xmm8, %xmm7
2163 ; SSSE3-NEXT: por %xmm7, %xmm0
2164 ; SSSE3-NEXT: packuswb %xmm4, %xmm0
2165 ; SSSE3-NEXT: movdqa %xmm3, %xmm1
2166 ; SSSE3-NEXT: pxor %xmm6, %xmm1
2167 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
2168 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4
2169 ; SSSE3-NEXT: pand %xmm4, %xmm3
2170 ; SSSE3-NEXT: pandn %xmm8, %xmm4
2171 ; SSSE3-NEXT: por %xmm3, %xmm4
2172 ; SSSE3-NEXT: pxor %xmm2, %xmm6
2173 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm5
2174 ; SSSE3-NEXT: pand %xmm5, %xmm2
2175 ; SSSE3-NEXT: pandn %xmm8, %xmm5
2176 ; SSSE3-NEXT: por %xmm2, %xmm5
2177 ; SSSE3-NEXT: packuswb %xmm4, %xmm5
2178 ; SSSE3-NEXT: packuswb %xmm5, %xmm0
2181 ; SSE41-LABEL: trunc_usat_v16i32_v16i8:
2183 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255]
2184 ; SSE41-NEXT: pminud %xmm4, %xmm1
2185 ; SSE41-NEXT: pminud %xmm4, %xmm0
2186 ; SSE41-NEXT: packusdw %xmm1, %xmm0
2187 ; SSE41-NEXT: pminud %xmm4, %xmm3
2188 ; SSE41-NEXT: pminud %xmm4, %xmm2
2189 ; SSE41-NEXT: packusdw %xmm3, %xmm2
2190 ; SSE41-NEXT: packuswb %xmm2, %xmm0
2193 ; AVX1-LABEL: trunc_usat_v16i32_v16i8:
2195 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
2196 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255]
2197 ; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm2
2198 ; AVX1-NEXT: vpminud %xmm3, %xmm0, %xmm0
2199 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
2200 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
2201 ; AVX1-NEXT: vpminud %xmm3, %xmm2, %xmm2
2202 ; AVX1-NEXT: vpminud %xmm3, %xmm1, %xmm1
2203 ; AVX1-NEXT: vpackusdw %xmm2, %xmm1, %xmm1
2204 ; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
2205 ; AVX1-NEXT: vzeroupper
2208 ; AVX2-LABEL: trunc_usat_v16i32_v16i8:
2210 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]
2211 ; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm1
2212 ; AVX2-NEXT: vpminud %ymm2, %ymm0, %ymm0
2213 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
2214 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2215 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
2216 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
2217 ; AVX2-NEXT: vzeroupper
2220 ; AVX512-LABEL: trunc_usat_v16i32_v16i8:
2222 ; AVX512-NEXT: vpmovusdb %zmm0, %xmm0
2223 ; AVX512-NEXT: vzeroupper
2225 %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>
2226 %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>
2227 %3 = trunc <16 x i32> %2 to <16 x i8>
2231 define <16 x i8> @trunc_usat_v16i16_v16i8(<16 x i16> %a0) {
2232 ; SSE2-LABEL: trunc_usat_v16i16_v16i8:
2234 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
2235 ; SSE2-NEXT: pxor %xmm2, %xmm1
2236 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [33023,33023,33023,33023,33023,33023,33023,33023]
2237 ; SSE2-NEXT: pminsw %xmm3, %xmm1
2238 ; SSE2-NEXT: pxor %xmm2, %xmm1
2239 ; SSE2-NEXT: pxor %xmm2, %xmm0
2240 ; SSE2-NEXT: pminsw %xmm3, %xmm0
2241 ; SSE2-NEXT: pxor %xmm2, %xmm0
2242 ; SSE2-NEXT: packuswb %xmm1, %xmm0
2245 ; SSSE3-LABEL: trunc_usat_v16i16_v16i8:
2247 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
2248 ; SSSE3-NEXT: pxor %xmm2, %xmm1
2249 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [33023,33023,33023,33023,33023,33023,33023,33023]
2250 ; SSSE3-NEXT: pminsw %xmm3, %xmm1
2251 ; SSSE3-NEXT: pxor %xmm2, %xmm1
2252 ; SSSE3-NEXT: pxor %xmm2, %xmm0
2253 ; SSSE3-NEXT: pminsw %xmm3, %xmm0
2254 ; SSSE3-NEXT: pxor %xmm2, %xmm0
2255 ; SSSE3-NEXT: packuswb %xmm1, %xmm0
2258 ; SSE41-LABEL: trunc_usat_v16i16_v16i8:
2260 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
2261 ; SSE41-NEXT: pminuw %xmm2, %xmm1
2262 ; SSE41-NEXT: pminuw %xmm2, %xmm0
2263 ; SSE41-NEXT: packuswb %xmm1, %xmm0
2266 ; AVX1-LABEL: trunc_usat_v16i16_v16i8:
2268 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
2269 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
2270 ; AVX1-NEXT: vpminuw %xmm2, %xmm1, %xmm1
2271 ; AVX1-NEXT: vpminuw %xmm2, %xmm0, %xmm0
2272 ; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
2273 ; AVX1-NEXT: vzeroupper
2276 ; AVX2-LABEL: trunc_usat_v16i16_v16i8:
2278 ; AVX2-NEXT: vpminuw {{.*}}(%rip), %ymm0, %ymm0
2279 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
2280 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
2281 ; AVX2-NEXT: vzeroupper
2284 ; AVX512F-LABEL: trunc_usat_v16i16_v16i8:
2286 ; AVX512F-NEXT: vpminuw {{.*}}(%rip), %ymm0, %ymm0
2287 ; 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
2288 ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0
2289 ; AVX512F-NEXT: vzeroupper
2290 ; AVX512F-NEXT: retq
2292 ; AVX512VL-LABEL: trunc_usat_v16i16_v16i8:
2293 ; AVX512VL: # %bb.0:
2294 ; AVX512VL-NEXT: vpminuw {{.*}}(%rip), %ymm0, %ymm0
2295 ; 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
2296 ; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0
2297 ; AVX512VL-NEXT: vzeroupper
2298 ; AVX512VL-NEXT: retq
2300 ; AVX512BW-LABEL: trunc_usat_v16i16_v16i8:
2301 ; AVX512BW: # %bb.0:
2302 ; AVX512BW-NEXT: vpminuw {{.*}}(%rip), %ymm0, %ymm0
2303 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
2304 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
2305 ; AVX512BW-NEXT: vzeroupper
2306 ; AVX512BW-NEXT: retq
2308 ; AVX512BWVL-LABEL: trunc_usat_v16i16_v16i8:
2309 ; AVX512BWVL: # %bb.0:
2310 ; AVX512BWVL-NEXT: vpmovuswb %ymm0, %xmm0
2311 ; AVX512BWVL-NEXT: vzeroupper
2312 ; AVX512BWVL-NEXT: retq
2313 %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>
2314 %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>
2315 %3 = trunc <16 x i16> %2 to <16 x i8>
2319 define <32 x i8> @trunc_usat_v32i16_v32i8(<32 x i16> %a0) {
2320 ; SSE2-LABEL: trunc_usat_v32i16_v32i8:
2322 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
2323 ; SSE2-NEXT: pxor %xmm4, %xmm3
2324 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [33023,33023,33023,33023,33023,33023,33023,33023]
2325 ; SSE2-NEXT: pminsw %xmm5, %xmm3
2326 ; SSE2-NEXT: pxor %xmm4, %xmm3
2327 ; SSE2-NEXT: pxor %xmm4, %xmm2
2328 ; SSE2-NEXT: pminsw %xmm5, %xmm2
2329 ; SSE2-NEXT: pxor %xmm4, %xmm2
2330 ; SSE2-NEXT: packuswb %xmm3, %xmm2
2331 ; SSE2-NEXT: pxor %xmm4, %xmm1
2332 ; SSE2-NEXT: pminsw %xmm5, %xmm1
2333 ; SSE2-NEXT: pxor %xmm4, %xmm1
2334 ; SSE2-NEXT: pxor %xmm4, %xmm0
2335 ; SSE2-NEXT: pminsw %xmm5, %xmm0
2336 ; SSE2-NEXT: pxor %xmm4, %xmm0
2337 ; SSE2-NEXT: packuswb %xmm1, %xmm0
2338 ; SSE2-NEXT: movdqa %xmm2, %xmm1
2341 ; SSSE3-LABEL: trunc_usat_v32i16_v32i8:
2343 ; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
2344 ; SSSE3-NEXT: pxor %xmm4, %xmm3
2345 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [33023,33023,33023,33023,33023,33023,33023,33023]
2346 ; SSSE3-NEXT: pminsw %xmm5, %xmm3
2347 ; SSSE3-NEXT: pxor %xmm4, %xmm3
2348 ; SSSE3-NEXT: pxor %xmm4, %xmm2
2349 ; SSSE3-NEXT: pminsw %xmm5, %xmm2
2350 ; SSSE3-NEXT: pxor %xmm4, %xmm2
2351 ; SSSE3-NEXT: packuswb %xmm3, %xmm2
2352 ; SSSE3-NEXT: pxor %xmm4, %xmm1
2353 ; SSSE3-NEXT: pminsw %xmm5, %xmm1
2354 ; SSSE3-NEXT: pxor %xmm4, %xmm1
2355 ; SSSE3-NEXT: pxor %xmm4, %xmm0
2356 ; SSSE3-NEXT: pminsw %xmm5, %xmm0
2357 ; SSSE3-NEXT: pxor %xmm4, %xmm0
2358 ; SSSE3-NEXT: packuswb %xmm1, %xmm0
2359 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
2362 ; SSE41-LABEL: trunc_usat_v32i16_v32i8:
2364 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
2365 ; SSE41-NEXT: pminuw %xmm4, %xmm3
2366 ; SSE41-NEXT: pminuw %xmm4, %xmm2
2367 ; SSE41-NEXT: packuswb %xmm3, %xmm2
2368 ; SSE41-NEXT: pminuw %xmm4, %xmm1
2369 ; SSE41-NEXT: pminuw %xmm4, %xmm0
2370 ; SSE41-NEXT: packuswb %xmm1, %xmm0
2371 ; SSE41-NEXT: movdqa %xmm2, %xmm1
2374 ; AVX1-LABEL: trunc_usat_v32i16_v32i8:
2376 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
2377 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
2378 ; AVX1-NEXT: vpminuw %xmm3, %xmm2, %xmm2
2379 ; AVX1-NEXT: vpminuw %xmm3, %xmm0, %xmm0
2380 ; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0
2381 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
2382 ; AVX1-NEXT: vpminuw %xmm3, %xmm2, %xmm2
2383 ; AVX1-NEXT: vpminuw %xmm3, %xmm1, %xmm1
2384 ; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm1
2385 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
2388 ; AVX2-LABEL: trunc_usat_v32i16_v32i8:
2390 ; AVX2-NEXT: vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2391 ; AVX2-NEXT: vpminuw %ymm2, %ymm1, %ymm1
2392 ; AVX2-NEXT: vpminuw %ymm2, %ymm0, %ymm0
2393 ; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0
2394 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2397 ; AVX512F-LABEL: trunc_usat_v32i16_v32i8:
2399 ; AVX512F-NEXT: vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2400 ; AVX512F-NEXT: vpminuw %ymm2, %ymm1, %ymm1
2401 ; AVX512F-NEXT: vpminuw %ymm2, %ymm0, %ymm0
2402 ; 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
2403 ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0
2404 ; 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
2405 ; AVX512F-NEXT: vpmovdb %zmm1, %xmm1
2406 ; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
2407 ; AVX512F-NEXT: retq
2409 ; AVX512VL-LABEL: trunc_usat_v32i16_v32i8:
2410 ; AVX512VL: # %bb.0:
2411 ; AVX512VL-NEXT: vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2412 ; AVX512VL-NEXT: vpminuw %ymm2, %ymm1, %ymm1
2413 ; AVX512VL-NEXT: vpminuw %ymm2, %ymm0, %ymm0
2414 ; 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
2415 ; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0
2416 ; 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
2417 ; AVX512VL-NEXT: vpmovdb %zmm1, %xmm1
2418 ; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
2419 ; AVX512VL-NEXT: retq
2421 ; AVX512BW-LABEL: trunc_usat_v32i16_v32i8:
2422 ; AVX512BW: # %bb.0:
2423 ; AVX512BW-NEXT: vpmovuswb %zmm0, %ymm0
2424 ; AVX512BW-NEXT: retq
2426 ; AVX512BWVL-LABEL: trunc_usat_v32i16_v32i8:
2427 ; AVX512BWVL: # %bb.0:
2428 ; AVX512BWVL-NEXT: vpmovuswb %zmm0, %ymm0
2429 ; AVX512BWVL-NEXT: retq
2430 %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>
2431 %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>
2432 %3 = trunc <32 x i16> %2 to <32 x i8>