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