[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / vector-trunc-ssat.ll
blob543708caaea8291e38f63a743cb64acdde3fa196
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-SLOW
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BW
11 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL
12 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=skx | FileCheck %s --check-prefixes=SKX
15 ; Signed saturation truncation to vXi32
18 define <2 x i32> @trunc_ssat_v2i64_v2i32(<2 x i64> %a0) {
19 ; SSE2-LABEL: trunc_ssat_v2i64_v2i32:
20 ; SSE2:       # %bb.0:
21 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
22 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
23 ; SSE2-NEXT:    pxor %xmm1, %xmm2
24 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [4294967295,4294967295]
25 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
26 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
27 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
28 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
29 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
30 ; SSE2-NEXT:    pand %xmm5, %xmm2
31 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
32 ; SSE2-NEXT:    por %xmm2, %xmm3
33 ; SSE2-NEXT:    pand %xmm3, %xmm0
34 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm3
35 ; SSE2-NEXT:    por %xmm0, %xmm3
36 ; SSE2-NEXT:    pxor %xmm3, %xmm1
37 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [18446744069414584320,18446744069414584320]
38 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
39 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
40 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
41 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
42 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
43 ; SSE2-NEXT:    pand %xmm4, %xmm0
44 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
45 ; SSE2-NEXT:    por %xmm0, %xmm1
46 ; SSE2-NEXT:    pand %xmm1, %xmm3
47 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm1
48 ; SSE2-NEXT:    por %xmm3, %xmm1
49 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
50 ; SSE2-NEXT:    retq
52 ; SSSE3-LABEL: trunc_ssat_v2i64_v2i32:
53 ; SSSE3:       # %bb.0:
54 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
55 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
56 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
57 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [4294967295,4294967295]
58 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
59 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
60 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
61 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm2
62 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
63 ; SSSE3-NEXT:    pand %xmm5, %xmm2
64 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
65 ; SSSE3-NEXT:    por %xmm2, %xmm3
66 ; SSSE3-NEXT:    pand %xmm3, %xmm0
67 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm3
68 ; SSSE3-NEXT:    por %xmm0, %xmm3
69 ; SSSE3-NEXT:    pxor %xmm3, %xmm1
70 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [18446744069414584320,18446744069414584320]
71 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
72 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
73 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
74 ; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm1
75 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
76 ; SSSE3-NEXT:    pand %xmm4, %xmm0
77 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
78 ; SSSE3-NEXT:    por %xmm0, %xmm1
79 ; SSSE3-NEXT:    pand %xmm1, %xmm3
80 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm1
81 ; SSSE3-NEXT:    por %xmm3, %xmm1
82 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
83 ; SSSE3-NEXT:    retq
85 ; SSE41-LABEL: trunc_ssat_v2i64_v2i32:
86 ; SSE41:       # %bb.0:
87 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
88 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [2147483647,2147483647]
89 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
90 ; SSE41-NEXT:    pxor %xmm3, %xmm0
91 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [4294967295,4294967295]
92 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
93 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
94 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
95 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
96 ; SSE41-NEXT:    pand %xmm5, %xmm0
97 ; SSE41-NEXT:    por %xmm4, %xmm0
98 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
99 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
100 ; SSE41-NEXT:    pxor %xmm2, %xmm3
101 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [18446744069414584320,18446744069414584320]
102 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
103 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
104 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
105 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
106 ; SSE41-NEXT:    pand %xmm4, %xmm0
107 ; SSE41-NEXT:    por %xmm3, %xmm0
108 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
109 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
110 ; SSE41-NEXT:    retq
112 ; AVX-LABEL: trunc_ssat_v2i64_v2i32:
113 ; AVX:       # %bb.0:
114 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [2147483647,2147483647]
115 ; AVX-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
116 ; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
117 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
118 ; AVX-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
119 ; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
120 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
121 ; AVX-NEXT:    retq
123 ; AVX512F-LABEL: trunc_ssat_v2i64_v2i32:
124 ; AVX512F:       # %bb.0:
125 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
126 ; AVX512F-NEXT:    vpmovsqd %zmm0, %ymm0
127 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
128 ; AVX512F-NEXT:    vzeroupper
129 ; AVX512F-NEXT:    retq
131 ; AVX512VL-LABEL: trunc_ssat_v2i64_v2i32:
132 ; AVX512VL:       # %bb.0:
133 ; AVX512VL-NEXT:    vpmovsqd %xmm0, %xmm0
134 ; AVX512VL-NEXT:    retq
136 ; AVX512BW-LABEL: trunc_ssat_v2i64_v2i32:
137 ; AVX512BW:       # %bb.0:
138 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
139 ; AVX512BW-NEXT:    vpmovsqd %zmm0, %ymm0
140 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
141 ; AVX512BW-NEXT:    vzeroupper
142 ; AVX512BW-NEXT:    retq
144 ; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i32:
145 ; AVX512BWVL:       # %bb.0:
146 ; AVX512BWVL-NEXT:    vpmovsqd %xmm0, %xmm0
147 ; AVX512BWVL-NEXT:    retq
149 ; SKX-LABEL: trunc_ssat_v2i64_v2i32:
150 ; SKX:       # %bb.0:
151 ; SKX-NEXT:    vpmovsqd %xmm0, %xmm0
152 ; SKX-NEXT:    retq
153   %1 = icmp slt <2 x i64> %a0, <i64 2147483647, i64 2147483647>
154   %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 2147483647, i64 2147483647>
155   %3 = icmp sgt <2 x i64> %2, <i64 -2147483648, i64 -2147483648>
156   %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -2147483648, i64 -2147483648>
157   %5 = trunc <2 x i64> %4 to <2 x i32>
158   ret <2 x i32> %5
161 define void @trunc_ssat_v2i64_v2i32_store(<2 x i64> %a0, <2 x i32>* %p1) {
162 ; SSE2-LABEL: trunc_ssat_v2i64_v2i32_store:
163 ; SSE2:       # %bb.0:
164 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
165 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
166 ; SSE2-NEXT:    pxor %xmm1, %xmm2
167 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [4294967295,4294967295]
168 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
169 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
170 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
171 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
172 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
173 ; SSE2-NEXT:    pand %xmm5, %xmm2
174 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
175 ; SSE2-NEXT:    por %xmm2, %xmm3
176 ; SSE2-NEXT:    pand %xmm3, %xmm0
177 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm3
178 ; SSE2-NEXT:    por %xmm0, %xmm3
179 ; SSE2-NEXT:    pxor %xmm3, %xmm1
180 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [18446744069414584320,18446744069414584320]
181 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
182 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
183 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
184 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
185 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
186 ; SSE2-NEXT:    pand %xmm4, %xmm0
187 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
188 ; SSE2-NEXT:    por %xmm0, %xmm1
189 ; SSE2-NEXT:    pand %xmm1, %xmm3
190 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm1
191 ; SSE2-NEXT:    por %xmm3, %xmm1
192 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
193 ; SSE2-NEXT:    movq %xmm0, (%rdi)
194 ; SSE2-NEXT:    retq
196 ; SSSE3-LABEL: trunc_ssat_v2i64_v2i32_store:
197 ; SSSE3:       # %bb.0:
198 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
199 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
200 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
201 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [4294967295,4294967295]
202 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
203 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
204 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
205 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm2
206 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
207 ; SSSE3-NEXT:    pand %xmm5, %xmm2
208 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
209 ; SSSE3-NEXT:    por %xmm2, %xmm3
210 ; SSSE3-NEXT:    pand %xmm3, %xmm0
211 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm3
212 ; SSSE3-NEXT:    por %xmm0, %xmm3
213 ; SSSE3-NEXT:    pxor %xmm3, %xmm1
214 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [18446744069414584320,18446744069414584320]
215 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
216 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
217 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
218 ; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm1
219 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
220 ; SSSE3-NEXT:    pand %xmm4, %xmm0
221 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
222 ; SSSE3-NEXT:    por %xmm0, %xmm1
223 ; SSSE3-NEXT:    pand %xmm1, %xmm3
224 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm1
225 ; SSSE3-NEXT:    por %xmm3, %xmm1
226 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
227 ; SSSE3-NEXT:    movq %xmm0, (%rdi)
228 ; SSSE3-NEXT:    retq
230 ; SSE41-LABEL: trunc_ssat_v2i64_v2i32_store:
231 ; SSE41:       # %bb.0:
232 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
233 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [2147483647,2147483647]
234 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
235 ; SSE41-NEXT:    pxor %xmm3, %xmm0
236 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [4294967295,4294967295]
237 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
238 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
239 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
240 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
241 ; SSE41-NEXT:    pand %xmm5, %xmm0
242 ; SSE41-NEXT:    por %xmm4, %xmm0
243 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
244 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
245 ; SSE41-NEXT:    pxor %xmm2, %xmm3
246 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [18446744069414584320,18446744069414584320]
247 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
248 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
249 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
250 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
251 ; SSE41-NEXT:    pand %xmm4, %xmm0
252 ; SSE41-NEXT:    por %xmm3, %xmm0
253 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
254 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
255 ; SSE41-NEXT:    movq %xmm0, (%rdi)
256 ; SSE41-NEXT:    retq
258 ; AVX-LABEL: trunc_ssat_v2i64_v2i32_store:
259 ; AVX:       # %bb.0:
260 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [2147483647,2147483647]
261 ; AVX-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
262 ; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
263 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
264 ; AVX-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
265 ; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
266 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
267 ; AVX-NEXT:    vmovlpd %xmm0, (%rdi)
268 ; AVX-NEXT:    retq
270 ; AVX512F-LABEL: trunc_ssat_v2i64_v2i32_store:
271 ; AVX512F:       # %bb.0:
272 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
273 ; AVX512F-NEXT:    vpmovsqd %zmm0, %ymm0
274 ; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
275 ; AVX512F-NEXT:    vzeroupper
276 ; AVX512F-NEXT:    retq
278 ; AVX512VL-LABEL: trunc_ssat_v2i64_v2i32_store:
279 ; AVX512VL:       # %bb.0:
280 ; AVX512VL-NEXT:    vpmovsqd %xmm0, (%rdi)
281 ; AVX512VL-NEXT:    retq
283 ; AVX512BW-LABEL: trunc_ssat_v2i64_v2i32_store:
284 ; AVX512BW:       # %bb.0:
285 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
286 ; AVX512BW-NEXT:    vpmovsqd %zmm0, %ymm0
287 ; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
288 ; AVX512BW-NEXT:    vzeroupper
289 ; AVX512BW-NEXT:    retq
291 ; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i32_store:
292 ; AVX512BWVL:       # %bb.0:
293 ; AVX512BWVL-NEXT:    vpmovsqd %xmm0, (%rdi)
294 ; AVX512BWVL-NEXT:    retq
296 ; SKX-LABEL: trunc_ssat_v2i64_v2i32_store:
297 ; SKX:       # %bb.0:
298 ; SKX-NEXT:    vpmovsqd %xmm0, (%rdi)
299 ; SKX-NEXT:    retq
300   %1 = icmp slt <2 x i64> %a0, <i64 2147483647, i64 2147483647>
301   %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 2147483647, i64 2147483647>
302   %3 = icmp sgt <2 x i64> %2, <i64 -2147483648, i64 -2147483648>
303   %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -2147483648, i64 -2147483648>
304   %5 = trunc <2 x i64> %4 to <2 x i32>
305   store <2 x i32> %5, <2 x i32>* %p1
306   ret void
309 define <4 x i32> @trunc_ssat_v4i64_v4i32(<4 x i64> %a0) {
310 ; SSE2-LABEL: trunc_ssat_v4i64_v4i32:
311 ; SSE2:       # %bb.0:
312 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483647,2147483647]
313 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
314 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
315 ; SSE2-NEXT:    pxor %xmm2, %xmm3
316 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [4294967295,4294967295]
317 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
318 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
319 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
320 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
321 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
322 ; SSE2-NEXT:    pand %xmm7, %xmm4
323 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
324 ; SSE2-NEXT:    por %xmm4, %xmm3
325 ; SSE2-NEXT:    pand %xmm3, %xmm0
326 ; SSE2-NEXT:    pandn %xmm8, %xmm3
327 ; SSE2-NEXT:    por %xmm0, %xmm3
328 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
329 ; SSE2-NEXT:    pxor %xmm2, %xmm0
330 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
331 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
332 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
333 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm0
334 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
335 ; SSE2-NEXT:    pand %xmm6, %xmm0
336 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
337 ; SSE2-NEXT:    por %xmm0, %xmm4
338 ; SSE2-NEXT:    pand %xmm4, %xmm1
339 ; SSE2-NEXT:    pandn %xmm8, %xmm4
340 ; SSE2-NEXT:    por %xmm1, %xmm4
341 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
342 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
343 ; SSE2-NEXT:    pxor %xmm2, %xmm0
344 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [18446744069414584320,18446744069414584320]
345 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
346 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
347 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
348 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm0
349 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
350 ; SSE2-NEXT:    pand %xmm7, %xmm0
351 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
352 ; SSE2-NEXT:    por %xmm0, %xmm6
353 ; SSE2-NEXT:    pand %xmm6, %xmm4
354 ; SSE2-NEXT:    pandn %xmm1, %xmm6
355 ; SSE2-NEXT:    por %xmm4, %xmm6
356 ; SSE2-NEXT:    pxor %xmm3, %xmm2
357 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
358 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm0
359 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
360 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm2
361 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
362 ; SSE2-NEXT:    pand %xmm4, %xmm2
363 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
364 ; SSE2-NEXT:    por %xmm2, %xmm0
365 ; SSE2-NEXT:    pand %xmm0, %xmm3
366 ; SSE2-NEXT:    pandn %xmm1, %xmm0
367 ; SSE2-NEXT:    por %xmm3, %xmm0
368 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm6[0,2]
369 ; SSE2-NEXT:    retq
371 ; SSSE3-LABEL: trunc_ssat_v4i64_v4i32:
372 ; SSSE3:       # %bb.0:
373 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [2147483647,2147483647]
374 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
375 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
376 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
377 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [4294967295,4294967295]
378 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
379 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm6
380 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
381 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm3
382 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
383 ; SSSE3-NEXT:    pand %xmm7, %xmm4
384 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
385 ; SSSE3-NEXT:    por %xmm4, %xmm3
386 ; SSSE3-NEXT:    pand %xmm3, %xmm0
387 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
388 ; SSSE3-NEXT:    por %xmm0, %xmm3
389 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
390 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
391 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
392 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm4
393 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
394 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm0
395 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
396 ; SSSE3-NEXT:    pand %xmm6, %xmm0
397 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
398 ; SSSE3-NEXT:    por %xmm0, %xmm4
399 ; SSSE3-NEXT:    pand %xmm4, %xmm1
400 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
401 ; SSSE3-NEXT:    por %xmm1, %xmm4
402 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
403 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
404 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
405 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [18446744069414584320,18446744069414584320]
406 ; SSSE3-NEXT:    movdqa %xmm0, %xmm6
407 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm6
408 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
409 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm0
410 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
411 ; SSSE3-NEXT:    pand %xmm7, %xmm0
412 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
413 ; SSSE3-NEXT:    por %xmm0, %xmm6
414 ; SSSE3-NEXT:    pand %xmm6, %xmm4
415 ; SSSE3-NEXT:    pandn %xmm1, %xmm6
416 ; SSSE3-NEXT:    por %xmm4, %xmm6
417 ; SSSE3-NEXT:    pxor %xmm3, %xmm2
418 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
419 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm0
420 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
421 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm2
422 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
423 ; SSSE3-NEXT:    pand %xmm4, %xmm2
424 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
425 ; SSSE3-NEXT:    por %xmm2, %xmm0
426 ; SSSE3-NEXT:    pand %xmm0, %xmm3
427 ; SSSE3-NEXT:    pandn %xmm1, %xmm0
428 ; SSSE3-NEXT:    por %xmm3, %xmm0
429 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm6[0,2]
430 ; SSSE3-NEXT:    retq
432 ; SSE41-LABEL: trunc_ssat_v4i64_v4i32:
433 ; SSE41:       # %bb.0:
434 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
435 ; SSE41-NEXT:    movapd {{.*#+}} xmm4 = [2147483647,2147483647]
436 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
437 ; SSE41-NEXT:    pxor %xmm3, %xmm0
438 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [4294967295,4294967295]
439 ; SSE41-NEXT:    movdqa %xmm6, %xmm5
440 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
441 ; SSE41-NEXT:    movdqa %xmm6, %xmm7
442 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
443 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
444 ; SSE41-NEXT:    pand %xmm5, %xmm0
445 ; SSE41-NEXT:    por %xmm7, %xmm0
446 ; SSE41-NEXT:    movapd %xmm4, %xmm5
447 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
448 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
449 ; SSE41-NEXT:    pxor %xmm3, %xmm0
450 ; SSE41-NEXT:    movdqa %xmm6, %xmm2
451 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
452 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
453 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
454 ; SSE41-NEXT:    pand %xmm2, %xmm0
455 ; SSE41-NEXT:    por %xmm6, %xmm0
456 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
457 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
458 ; SSE41-NEXT:    movapd %xmm4, %xmm2
459 ; SSE41-NEXT:    xorpd %xmm3, %xmm2
460 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [18446744069414584320,18446744069414584320]
461 ; SSE41-NEXT:    movapd %xmm2, %xmm7
462 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm7
463 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm2
464 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
465 ; SSE41-NEXT:    pand %xmm7, %xmm0
466 ; SSE41-NEXT:    por %xmm2, %xmm0
467 ; SSE41-NEXT:    movapd %xmm1, %xmm2
468 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
469 ; SSE41-NEXT:    xorpd %xmm5, %xmm3
470 ; SSE41-NEXT:    movapd %xmm3, %xmm4
471 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm4
472 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm3
473 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
474 ; SSE41-NEXT:    pand %xmm4, %xmm0
475 ; SSE41-NEXT:    por %xmm3, %xmm0
476 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
477 ; SSE41-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
478 ; SSE41-NEXT:    movaps %xmm1, %xmm0
479 ; SSE41-NEXT:    retq
481 ; AVX1-LABEL: trunc_ssat_v4i64_v4i32:
482 ; AVX1:       # %bb.0:
483 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
484 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [2147483647,2147483647]
485 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
486 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm4
487 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm0, %xmm2, %xmm0
488 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [18446744071562067968,18446744071562067968]
489 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm0, %xmm5
490 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm1, %xmm2, %xmm1
491 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm1, %xmm2
492 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm4, %xmm1
493 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
494 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
495 ; AVX1-NEXT:    vzeroupper
496 ; AVX1-NEXT:    retq
498 ; AVX2-SLOW-LABEL: trunc_ssat_v4i64_v4i32:
499 ; AVX2-SLOW:       # %bb.0:
500 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [2147483647,2147483647,2147483647,2147483647]
501 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
502 ; AVX2-SLOW-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
503 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
504 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
505 ; AVX2-SLOW-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
506 ; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1
507 ; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
508 ; AVX2-SLOW-NEXT:    vzeroupper
509 ; AVX2-SLOW-NEXT:    retq
511 ; AVX2-FAST-LABEL: trunc_ssat_v4i64_v4i32:
512 ; AVX2-FAST:       # %bb.0:
513 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [2147483647,2147483647,2147483647,2147483647]
514 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
515 ; AVX2-FAST-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
516 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
517 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
518 ; AVX2-FAST-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
519 ; AVX2-FAST-NEXT:    vmovapd {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7]
520 ; AVX2-FAST-NEXT:    vpermps %ymm0, %ymm1, %ymm0
521 ; AVX2-FAST-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
522 ; AVX2-FAST-NEXT:    vzeroupper
523 ; AVX2-FAST-NEXT:    retq
525 ; AVX512F-LABEL: trunc_ssat_v4i64_v4i32:
526 ; AVX512F:       # %bb.0:
527 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
528 ; AVX512F-NEXT:    vpmovsqd %zmm0, %ymm0
529 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
530 ; AVX512F-NEXT:    vzeroupper
531 ; AVX512F-NEXT:    retq
533 ; AVX512VL-LABEL: trunc_ssat_v4i64_v4i32:
534 ; AVX512VL:       # %bb.0:
535 ; AVX512VL-NEXT:    vpmovsqd %ymm0, %xmm0
536 ; AVX512VL-NEXT:    vzeroupper
537 ; AVX512VL-NEXT:    retq
539 ; AVX512BW-LABEL: trunc_ssat_v4i64_v4i32:
540 ; AVX512BW:       # %bb.0:
541 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
542 ; AVX512BW-NEXT:    vpmovsqd %zmm0, %ymm0
543 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
544 ; AVX512BW-NEXT:    vzeroupper
545 ; AVX512BW-NEXT:    retq
547 ; AVX512BWVL-LABEL: trunc_ssat_v4i64_v4i32:
548 ; AVX512BWVL:       # %bb.0:
549 ; AVX512BWVL-NEXT:    vpmovsqd %ymm0, %xmm0
550 ; AVX512BWVL-NEXT:    vzeroupper
551 ; AVX512BWVL-NEXT:    retq
553 ; SKX-LABEL: trunc_ssat_v4i64_v4i32:
554 ; SKX:       # %bb.0:
555 ; SKX-NEXT:    vpmovsqd %ymm0, %xmm0
556 ; SKX-NEXT:    vzeroupper
557 ; SKX-NEXT:    retq
558   %1 = icmp slt <4 x i64> %a0, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
559   %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
560   %3 = icmp sgt <4 x i64> %2, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
561   %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
562   %5 = trunc <4 x i64> %4 to <4 x i32>
563   ret <4 x i32> %5
567 define <8 x i32> @trunc_ssat_v8i64_v8i32(<8 x i64>* %p0) "min-legal-vector-width"="256" {
568 ; SSE2-LABEL: trunc_ssat_v8i64_v8i32:
569 ; SSE2:       # %bb.0:
570 ; SSE2-NEXT:    movdqa (%rdi), %xmm3
571 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm5
572 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm7
573 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm9
574 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483647,2147483647]
575 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
576 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
577 ; SSE2-NEXT:    pxor %xmm0, %xmm2
578 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [4294967295,4294967295]
579 ; SSE2-NEXT:    movdqa %xmm10, %xmm6
580 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
581 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[0,0,2,2]
582 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm2
583 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
584 ; SSE2-NEXT:    pand %xmm1, %xmm4
585 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
586 ; SSE2-NEXT:    por %xmm4, %xmm2
587 ; SSE2-NEXT:    pand %xmm2, %xmm3
588 ; SSE2-NEXT:    pandn %xmm8, %xmm2
589 ; SSE2-NEXT:    por %xmm3, %xmm2
590 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
591 ; SSE2-NEXT:    pxor %xmm0, %xmm1
592 ; SSE2-NEXT:    movdqa %xmm10, %xmm3
593 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
594 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
595 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
596 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
597 ; SSE2-NEXT:    pand %xmm4, %xmm1
598 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
599 ; SSE2-NEXT:    por %xmm1, %xmm3
600 ; SSE2-NEXT:    pand %xmm3, %xmm5
601 ; SSE2-NEXT:    pandn %xmm8, %xmm3
602 ; SSE2-NEXT:    por %xmm5, %xmm3
603 ; SSE2-NEXT:    movdqa %xmm7, %xmm1
604 ; SSE2-NEXT:    pxor %xmm0, %xmm1
605 ; SSE2-NEXT:    movdqa %xmm10, %xmm4
606 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
607 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
608 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
609 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
610 ; SSE2-NEXT:    pand %xmm5, %xmm1
611 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
612 ; SSE2-NEXT:    por %xmm1, %xmm5
613 ; SSE2-NEXT:    pand %xmm5, %xmm7
614 ; SSE2-NEXT:    pandn %xmm8, %xmm5
615 ; SSE2-NEXT:    por %xmm7, %xmm5
616 ; SSE2-NEXT:    movdqa %xmm9, %xmm1
617 ; SSE2-NEXT:    pxor %xmm0, %xmm1
618 ; SSE2-NEXT:    movdqa %xmm10, %xmm4
619 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
620 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
621 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
622 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
623 ; SSE2-NEXT:    pand %xmm6, %xmm1
624 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
625 ; SSE2-NEXT:    por %xmm1, %xmm7
626 ; SSE2-NEXT:    pand %xmm7, %xmm9
627 ; SSE2-NEXT:    pandn %xmm8, %xmm7
628 ; SSE2-NEXT:    por %xmm9, %xmm7
629 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [18446744071562067968,18446744071562067968]
630 ; SSE2-NEXT:    movdqa %xmm7, %xmm1
631 ; SSE2-NEXT:    pxor %xmm0, %xmm1
632 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [18446744069414584320,18446744069414584320]
633 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
634 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm4
635 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
636 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
637 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
638 ; SSE2-NEXT:    pand %xmm6, %xmm1
639 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
640 ; SSE2-NEXT:    por %xmm1, %xmm4
641 ; SSE2-NEXT:    pand %xmm4, %xmm7
642 ; SSE2-NEXT:    pandn %xmm8, %xmm4
643 ; SSE2-NEXT:    por %xmm7, %xmm4
644 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
645 ; SSE2-NEXT:    pxor %xmm0, %xmm1
646 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
647 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm6
648 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
649 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
650 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
651 ; SSE2-NEXT:    pand %xmm10, %xmm7
652 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
653 ; SSE2-NEXT:    por %xmm7, %xmm1
654 ; SSE2-NEXT:    pand %xmm1, %xmm5
655 ; SSE2-NEXT:    pandn %xmm8, %xmm1
656 ; SSE2-NEXT:    por %xmm5, %xmm1
657 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm4[0,2]
658 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
659 ; SSE2-NEXT:    pxor %xmm0, %xmm4
660 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
661 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm5
662 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
663 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
664 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
665 ; SSE2-NEXT:    pand %xmm6, %xmm4
666 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
667 ; SSE2-NEXT:    por %xmm4, %xmm5
668 ; SSE2-NEXT:    pand %xmm5, %xmm3
669 ; SSE2-NEXT:    pandn %xmm8, %xmm5
670 ; SSE2-NEXT:    por %xmm3, %xmm5
671 ; SSE2-NEXT:    pxor %xmm2, %xmm0
672 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
673 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm3
674 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
675 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
676 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
677 ; SSE2-NEXT:    pand %xmm4, %xmm6
678 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
679 ; SSE2-NEXT:    por %xmm6, %xmm0
680 ; SSE2-NEXT:    pand %xmm0, %xmm2
681 ; SSE2-NEXT:    pandn %xmm8, %xmm0
682 ; SSE2-NEXT:    por %xmm2, %xmm0
683 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm5[0,2]
684 ; SSE2-NEXT:    retq
686 ; SSSE3-LABEL: trunc_ssat_v8i64_v8i32:
687 ; SSSE3:       # %bb.0:
688 ; SSSE3-NEXT:    movdqa (%rdi), %xmm3
689 ; SSSE3-NEXT:    movdqa 16(%rdi), %xmm5
690 ; SSSE3-NEXT:    movdqa 32(%rdi), %xmm7
691 ; SSSE3-NEXT:    movdqa 48(%rdi), %xmm9
692 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [2147483647,2147483647]
693 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
694 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
695 ; SSSE3-NEXT:    pxor %xmm0, %xmm2
696 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [4294967295,4294967295]
697 ; SSSE3-NEXT:    movdqa %xmm10, %xmm6
698 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm6
699 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[0,0,2,2]
700 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm2
701 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
702 ; SSSE3-NEXT:    pand %xmm1, %xmm4
703 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
704 ; SSSE3-NEXT:    por %xmm4, %xmm2
705 ; SSSE3-NEXT:    pand %xmm2, %xmm3
706 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
707 ; SSSE3-NEXT:    por %xmm3, %xmm2
708 ; SSSE3-NEXT:    movdqa %xmm5, %xmm1
709 ; SSSE3-NEXT:    pxor %xmm0, %xmm1
710 ; SSSE3-NEXT:    movdqa %xmm10, %xmm3
711 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
712 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
713 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm1
714 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
715 ; SSSE3-NEXT:    pand %xmm4, %xmm1
716 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
717 ; SSSE3-NEXT:    por %xmm1, %xmm3
718 ; SSSE3-NEXT:    pand %xmm3, %xmm5
719 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
720 ; SSSE3-NEXT:    por %xmm5, %xmm3
721 ; SSSE3-NEXT:    movdqa %xmm7, %xmm1
722 ; SSSE3-NEXT:    pxor %xmm0, %xmm1
723 ; SSSE3-NEXT:    movdqa %xmm10, %xmm4
724 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
725 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
726 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm1
727 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
728 ; SSSE3-NEXT:    pand %xmm5, %xmm1
729 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
730 ; SSSE3-NEXT:    por %xmm1, %xmm5
731 ; SSSE3-NEXT:    pand %xmm5, %xmm7
732 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
733 ; SSSE3-NEXT:    por %xmm7, %xmm5
734 ; SSSE3-NEXT:    movdqa %xmm9, %xmm1
735 ; SSSE3-NEXT:    pxor %xmm0, %xmm1
736 ; SSSE3-NEXT:    movdqa %xmm10, %xmm4
737 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
738 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
739 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm1
740 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
741 ; SSSE3-NEXT:    pand %xmm6, %xmm1
742 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
743 ; SSSE3-NEXT:    por %xmm1, %xmm7
744 ; SSSE3-NEXT:    pand %xmm7, %xmm9
745 ; SSSE3-NEXT:    pandn %xmm8, %xmm7
746 ; SSSE3-NEXT:    por %xmm9, %xmm7
747 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [18446744071562067968,18446744071562067968]
748 ; SSSE3-NEXT:    movdqa %xmm7, %xmm1
749 ; SSSE3-NEXT:    pxor %xmm0, %xmm1
750 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [18446744069414584320,18446744069414584320]
751 ; SSSE3-NEXT:    movdqa %xmm1, %xmm4
752 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm4
753 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
754 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
755 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
756 ; SSSE3-NEXT:    pand %xmm6, %xmm1
757 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
758 ; SSSE3-NEXT:    por %xmm1, %xmm4
759 ; SSSE3-NEXT:    pand %xmm4, %xmm7
760 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
761 ; SSSE3-NEXT:    por %xmm7, %xmm4
762 ; SSSE3-NEXT:    movdqa %xmm5, %xmm1
763 ; SSSE3-NEXT:    pxor %xmm0, %xmm1
764 ; SSSE3-NEXT:    movdqa %xmm1, %xmm6
765 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm6
766 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
767 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
768 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
769 ; SSSE3-NEXT:    pand %xmm10, %xmm7
770 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
771 ; SSSE3-NEXT:    por %xmm7, %xmm1
772 ; SSSE3-NEXT:    pand %xmm1, %xmm5
773 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
774 ; SSSE3-NEXT:    por %xmm5, %xmm1
775 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm4[0,2]
776 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
777 ; SSSE3-NEXT:    pxor %xmm0, %xmm4
778 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
779 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm5
780 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
781 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
782 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
783 ; SSSE3-NEXT:    pand %xmm6, %xmm4
784 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
785 ; SSSE3-NEXT:    por %xmm4, %xmm5
786 ; SSSE3-NEXT:    pand %xmm5, %xmm3
787 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
788 ; SSSE3-NEXT:    por %xmm3, %xmm5
789 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
790 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
791 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm3
792 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
793 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
794 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
795 ; SSSE3-NEXT:    pand %xmm4, %xmm6
796 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
797 ; SSSE3-NEXT:    por %xmm6, %xmm0
798 ; SSSE3-NEXT:    pand %xmm0, %xmm2
799 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
800 ; SSSE3-NEXT:    por %xmm2, %xmm0
801 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm5[0,2]
802 ; SSSE3-NEXT:    retq
804 ; SSE41-LABEL: trunc_ssat_v8i64_v8i32:
805 ; SSE41:       # %bb.0:
806 ; SSE41-NEXT:    movdqa (%rdi), %xmm5
807 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm4
808 ; SSE41-NEXT:    movdqa 32(%rdi), %xmm10
809 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm9
810 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [2147483647,2147483647]
811 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
812 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
813 ; SSE41-NEXT:    pxor %xmm3, %xmm0
814 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [4294967295,4294967295]
815 ; SSE41-NEXT:    movdqa %xmm2, %xmm7
816 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm7
817 ; SSE41-NEXT:    movdqa %xmm2, %xmm6
818 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
819 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
820 ; SSE41-NEXT:    pand %xmm7, %xmm0
821 ; SSE41-NEXT:    por %xmm6, %xmm0
822 ; SSE41-NEXT:    movapd %xmm1, %xmm8
823 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm8
824 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
825 ; SSE41-NEXT:    pxor %xmm3, %xmm0
826 ; SSE41-NEXT:    movdqa %xmm2, %xmm5
827 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
828 ; SSE41-NEXT:    movdqa %xmm2, %xmm6
829 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
830 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
831 ; SSE41-NEXT:    pand %xmm5, %xmm0
832 ; SSE41-NEXT:    por %xmm6, %xmm0
833 ; SSE41-NEXT:    movapd %xmm1, %xmm11
834 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm11
835 ; SSE41-NEXT:    movdqa %xmm10, %xmm0
836 ; SSE41-NEXT:    pxor %xmm3, %xmm0
837 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
838 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
839 ; SSE41-NEXT:    movdqa %xmm2, %xmm6
840 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
841 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
842 ; SSE41-NEXT:    pand %xmm4, %xmm0
843 ; SSE41-NEXT:    por %xmm6, %xmm0
844 ; SSE41-NEXT:    movapd %xmm1, %xmm4
845 ; SSE41-NEXT:    blendvpd %xmm0, %xmm10, %xmm4
846 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
847 ; SSE41-NEXT:    pxor %xmm3, %xmm0
848 ; SSE41-NEXT:    movdqa %xmm2, %xmm6
849 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
850 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
851 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
852 ; SSE41-NEXT:    pand %xmm6, %xmm0
853 ; SSE41-NEXT:    por %xmm2, %xmm0
854 ; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm1
855 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [18446744071562067968,18446744071562067968]
856 ; SSE41-NEXT:    movapd %xmm1, %xmm7
857 ; SSE41-NEXT:    xorpd %xmm3, %xmm7
858 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [18446744069414584320,18446744069414584320]
859 ; SSE41-NEXT:    movapd %xmm7, %xmm5
860 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm5
861 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm7
862 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
863 ; SSE41-NEXT:    pand %xmm5, %xmm0
864 ; SSE41-NEXT:    por %xmm7, %xmm0
865 ; SSE41-NEXT:    movapd %xmm2, %xmm5
866 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
867 ; SSE41-NEXT:    movapd %xmm4, %xmm1
868 ; SSE41-NEXT:    xorpd %xmm3, %xmm1
869 ; SSE41-NEXT:    movapd %xmm1, %xmm7
870 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm7
871 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm1
872 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
873 ; SSE41-NEXT:    pand %xmm7, %xmm0
874 ; SSE41-NEXT:    por %xmm1, %xmm0
875 ; SSE41-NEXT:    movapd %xmm2, %xmm1
876 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm1
877 ; SSE41-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm5[0,2]
878 ; SSE41-NEXT:    movapd %xmm11, %xmm4
879 ; SSE41-NEXT:    xorpd %xmm3, %xmm4
880 ; SSE41-NEXT:    movapd %xmm4, %xmm5
881 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm5
882 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm4
883 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
884 ; SSE41-NEXT:    pand %xmm5, %xmm0
885 ; SSE41-NEXT:    por %xmm4, %xmm0
886 ; SSE41-NEXT:    movapd %xmm2, %xmm4
887 ; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm4
888 ; SSE41-NEXT:    xorpd %xmm8, %xmm3
889 ; SSE41-NEXT:    movapd %xmm3, %xmm5
890 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm5
891 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm3
892 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
893 ; SSE41-NEXT:    pand %xmm5, %xmm0
894 ; SSE41-NEXT:    por %xmm3, %xmm0
895 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm2
896 ; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm4[0,2]
897 ; SSE41-NEXT:    movaps %xmm2, %xmm0
898 ; SSE41-NEXT:    retq
900 ; AVX1-LABEL: trunc_ssat_v8i64_v8i32:
901 ; AVX1:       # %bb.0:
902 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
903 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
904 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm2
905 ; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm3
906 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [2147483647,2147483647]
907 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm8
908 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm6
909 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm7
910 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm4, %xmm5
911 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
912 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [18446744071562067968,18446744071562067968]
913 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm0, %xmm9
914 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm1, %xmm4, %xmm1
915 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm1, %xmm7
916 ; AVX1-NEXT:    vblendvpd %xmm6, %xmm2, %xmm4, %xmm2
917 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm2, %xmm6
918 ; AVX1-NEXT:    vblendvpd %xmm8, %xmm3, %xmm4, %xmm3
919 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm3, %xmm4
920 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm5, %xmm3
921 ; AVX1-NEXT:    vblendvpd %xmm6, %xmm2, %xmm5, %xmm2
922 ; AVX1-NEXT:    vshufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]
923 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm1, %xmm5, %xmm1
924 ; AVX1-NEXT:    vblendvpd %xmm9, %xmm0, %xmm5, %xmm0
925 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
926 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
927 ; AVX1-NEXT:    retq
929 ; AVX2-SLOW-LABEL: trunc_ssat_v8i64_v8i32:
930 ; AVX2-SLOW:       # %bb.0:
931 ; AVX2-SLOW-NEXT:    vmovdqa (%rdi), %ymm0
932 ; AVX2-SLOW-NEXT:    vmovdqa 32(%rdi), %ymm1
933 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [2147483647,2147483647,2147483647,2147483647]
934 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
935 ; AVX2-SLOW-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
936 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
937 ; AVX2-SLOW-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
938 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
939 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
940 ; AVX2-SLOW-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
941 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm3
942 ; AVX2-SLOW-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
943 ; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm1, %xmm2
944 ; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
945 ; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm2
946 ; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
947 ; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
948 ; AVX2-SLOW-NEXT:    retq
950 ; AVX2-FAST-LABEL: trunc_ssat_v8i64_v8i32:
951 ; AVX2-FAST:       # %bb.0:
952 ; AVX2-FAST-NEXT:    vmovdqa (%rdi), %ymm0
953 ; AVX2-FAST-NEXT:    vmovdqa 32(%rdi), %ymm1
954 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [2147483647,2147483647,2147483647,2147483647]
955 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
956 ; AVX2-FAST-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
957 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
958 ; AVX2-FAST-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
959 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
960 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm3
961 ; AVX2-FAST-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
962 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
963 ; AVX2-FAST-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
964 ; AVX2-FAST-NEXT:    vmovapd {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
965 ; AVX2-FAST-NEXT:    vpermps %ymm0, %ymm2, %ymm0
966 ; AVX2-FAST-NEXT:    vpermps %ymm1, %ymm2, %ymm1
967 ; AVX2-FAST-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
968 ; AVX2-FAST-NEXT:    retq
970 ; AVX512-LABEL: trunc_ssat_v8i64_v8i32:
971 ; AVX512:       # %bb.0:
972 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
973 ; AVX512-NEXT:    vpmovsqd %zmm0, %ymm0
974 ; AVX512-NEXT:    retq
976 ; SKX-LABEL: trunc_ssat_v8i64_v8i32:
977 ; SKX:       # %bb.0:
978 ; SKX-NEXT:    vmovdqa (%rdi), %ymm0
979 ; SKX-NEXT:    vmovdqa 32(%rdi), %ymm1
980 ; SKX-NEXT:    vpmovsqd %ymm0, %xmm0
981 ; SKX-NEXT:    vpmovsqd %ymm1, %xmm1
982 ; SKX-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
983 ; SKX-NEXT:    retq
984   %a0 = load <8 x i64>, <8 x i64>* %p0
985   %1 = icmp slt <8 x i64> %a0, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
986   %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
987   %3 = icmp sgt <8 x i64> %2, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
988   %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
989   %5 = trunc <8 x i64> %4 to <8 x i32>
990   ret <8 x i32> %5
994 ; Signed saturation truncation to vXi16
997 define <2 x i16> @trunc_ssat_v2i64_v2i16(<2 x i64> %a0) {
998 ; SSE2-LABEL: trunc_ssat_v2i64_v2i16:
999 ; SSE2:       # %bb.0:
1000 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
1001 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1002 ; SSE2-NEXT:    pxor %xmm1, %xmm2
1003 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147516415,2147516415]
1004 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
1005 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
1006 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1007 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
1008 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1009 ; SSE2-NEXT:    pand %xmm5, %xmm2
1010 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1011 ; SSE2-NEXT:    por %xmm2, %xmm3
1012 ; SSE2-NEXT:    pand %xmm3, %xmm0
1013 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm3
1014 ; SSE2-NEXT:    por %xmm0, %xmm3
1015 ; SSE2-NEXT:    pxor %xmm3, %xmm1
1016 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [18446744071562035200,18446744071562035200]
1017 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1018 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
1019 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1020 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
1021 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1022 ; SSE2-NEXT:    pand %xmm4, %xmm0
1023 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1024 ; SSE2-NEXT:    por %xmm0, %xmm1
1025 ; SSE2-NEXT:    pand %xmm1, %xmm3
1026 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm1
1027 ; SSE2-NEXT:    por %xmm3, %xmm1
1028 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1029 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1030 ; SSE2-NEXT:    retq
1032 ; SSSE3-LABEL: trunc_ssat_v2i64_v2i16:
1033 ; SSSE3:       # %bb.0:
1034 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
1035 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
1036 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
1037 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147516415,2147516415]
1038 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
1039 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
1040 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1041 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm2
1042 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1043 ; SSSE3-NEXT:    pand %xmm5, %xmm2
1044 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1045 ; SSSE3-NEXT:    por %xmm2, %xmm3
1046 ; SSSE3-NEXT:    pand %xmm3, %xmm0
1047 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm3
1048 ; SSSE3-NEXT:    por %xmm0, %xmm3
1049 ; SSSE3-NEXT:    pxor %xmm3, %xmm1
1050 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [18446744071562035200,18446744071562035200]
1051 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1052 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
1053 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1054 ; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm1
1055 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1056 ; SSSE3-NEXT:    pand %xmm4, %xmm0
1057 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1058 ; SSSE3-NEXT:    por %xmm0, %xmm1
1059 ; SSSE3-NEXT:    pand %xmm1, %xmm3
1060 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm1
1061 ; SSSE3-NEXT:    por %xmm3, %xmm1
1062 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1063 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1064 ; SSSE3-NEXT:    retq
1066 ; SSE41-LABEL: trunc_ssat_v2i64_v2i16:
1067 ; SSE41:       # %bb.0:
1068 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
1069 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [32767,32767]
1070 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
1071 ; SSE41-NEXT:    pxor %xmm3, %xmm0
1072 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [2147516415,2147516415]
1073 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
1074 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
1075 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
1076 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
1077 ; SSE41-NEXT:    pand %xmm5, %xmm0
1078 ; SSE41-NEXT:    por %xmm4, %xmm0
1079 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
1080 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1081 ; SSE41-NEXT:    pxor %xmm2, %xmm3
1082 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [18446744071562035200,18446744071562035200]
1083 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
1084 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
1085 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
1086 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1087 ; SSE41-NEXT:    pand %xmm4, %xmm0
1088 ; SSE41-NEXT:    por %xmm3, %xmm0
1089 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
1090 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1091 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1092 ; SSE41-NEXT:    retq
1094 ; AVX1-LABEL: trunc_ssat_v2i64_v2i16:
1095 ; AVX1:       # %bb.0:
1096 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [32767,32767]
1097 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
1098 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1099 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1100 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
1101 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1102 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1103 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1104 ; AVX1-NEXT:    retq
1106 ; AVX2-SLOW-LABEL: trunc_ssat_v2i64_v2i16:
1107 ; AVX2-SLOW:       # %bb.0:
1108 ; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} xmm1 = [32767,32767]
1109 ; AVX2-SLOW-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
1110 ; AVX2-SLOW-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1111 ; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1112 ; AVX2-SLOW-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
1113 ; AVX2-SLOW-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1114 ; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1115 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1116 ; AVX2-SLOW-NEXT:    retq
1118 ; AVX2-FAST-LABEL: trunc_ssat_v2i64_v2i16:
1119 ; AVX2-FAST:       # %bb.0:
1120 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm1 = [32767,32767]
1121 ; AVX2-FAST-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
1122 ; AVX2-FAST-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1123 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1124 ; AVX2-FAST-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
1125 ; AVX2-FAST-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1126 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
1127 ; AVX2-FAST-NEXT:    retq
1129 ; AVX512F-LABEL: trunc_ssat_v2i64_v2i16:
1130 ; AVX512F:       # %bb.0:
1131 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1132 ; AVX512F-NEXT:    vpmovsqw %zmm0, %xmm0
1133 ; AVX512F-NEXT:    vzeroupper
1134 ; AVX512F-NEXT:    retq
1136 ; AVX512VL-LABEL: trunc_ssat_v2i64_v2i16:
1137 ; AVX512VL:       # %bb.0:
1138 ; AVX512VL-NEXT:    vpmovsqw %xmm0, %xmm0
1139 ; AVX512VL-NEXT:    retq
1141 ; AVX512BW-LABEL: trunc_ssat_v2i64_v2i16:
1142 ; AVX512BW:       # %bb.0:
1143 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1144 ; AVX512BW-NEXT:    vpmovsqw %zmm0, %xmm0
1145 ; AVX512BW-NEXT:    vzeroupper
1146 ; AVX512BW-NEXT:    retq
1148 ; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i16:
1149 ; AVX512BWVL:       # %bb.0:
1150 ; AVX512BWVL-NEXT:    vpmovsqw %xmm0, %xmm0
1151 ; AVX512BWVL-NEXT:    retq
1153 ; SKX-LABEL: trunc_ssat_v2i64_v2i16:
1154 ; SKX:       # %bb.0:
1155 ; SKX-NEXT:    vpmovsqw %xmm0, %xmm0
1156 ; SKX-NEXT:    retq
1157   %1 = icmp slt <2 x i64> %a0, <i64 32767, i64 32767>
1158   %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 32767, i64 32767>
1159   %3 = icmp sgt <2 x i64> %2, <i64 -32768, i64 -32768>
1160   %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -32768, i64 -32768>
1161   %5 = trunc <2 x i64> %4 to <2 x i16>
1162   ret <2 x i16> %5
1165 define void @trunc_ssat_v2i64_v2i16_store(<2 x i64> %a0, <2 x i16> *%p1) {
1166 ; SSE2-LABEL: trunc_ssat_v2i64_v2i16_store:
1167 ; SSE2:       # %bb.0:
1168 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
1169 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1170 ; SSE2-NEXT:    pxor %xmm1, %xmm2
1171 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147516415,2147516415]
1172 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
1173 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
1174 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1175 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
1176 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1177 ; SSE2-NEXT:    pand %xmm5, %xmm2
1178 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1179 ; SSE2-NEXT:    por %xmm2, %xmm3
1180 ; SSE2-NEXT:    pand %xmm3, %xmm0
1181 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm3
1182 ; SSE2-NEXT:    por %xmm0, %xmm3
1183 ; SSE2-NEXT:    pxor %xmm3, %xmm1
1184 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [18446744071562035200,18446744071562035200]
1185 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1186 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
1187 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1188 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
1189 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1190 ; SSE2-NEXT:    pand %xmm4, %xmm0
1191 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1192 ; SSE2-NEXT:    por %xmm0, %xmm1
1193 ; SSE2-NEXT:    pand %xmm1, %xmm3
1194 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm1
1195 ; SSE2-NEXT:    por %xmm3, %xmm1
1196 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1197 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1198 ; SSE2-NEXT:    movd %xmm0, (%rdi)
1199 ; SSE2-NEXT:    retq
1201 ; SSSE3-LABEL: trunc_ssat_v2i64_v2i16_store:
1202 ; SSSE3:       # %bb.0:
1203 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
1204 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
1205 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
1206 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147516415,2147516415]
1207 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
1208 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
1209 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1210 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm2
1211 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1212 ; SSSE3-NEXT:    pand %xmm5, %xmm2
1213 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1214 ; SSSE3-NEXT:    por %xmm2, %xmm3
1215 ; SSSE3-NEXT:    pand %xmm3, %xmm0
1216 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm3
1217 ; SSSE3-NEXT:    por %xmm0, %xmm3
1218 ; SSSE3-NEXT:    pxor %xmm3, %xmm1
1219 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [18446744071562035200,18446744071562035200]
1220 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1221 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
1222 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1223 ; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm1
1224 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1225 ; SSSE3-NEXT:    pand %xmm4, %xmm0
1226 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1227 ; SSSE3-NEXT:    por %xmm0, %xmm1
1228 ; SSSE3-NEXT:    pand %xmm1, %xmm3
1229 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm1
1230 ; SSSE3-NEXT:    por %xmm3, %xmm1
1231 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1232 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1233 ; SSSE3-NEXT:    movd %xmm0, (%rdi)
1234 ; SSSE3-NEXT:    retq
1236 ; SSE41-LABEL: trunc_ssat_v2i64_v2i16_store:
1237 ; SSE41:       # %bb.0:
1238 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
1239 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [32767,32767]
1240 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
1241 ; SSE41-NEXT:    pxor %xmm3, %xmm0
1242 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [2147516415,2147516415]
1243 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
1244 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
1245 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
1246 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
1247 ; SSE41-NEXT:    pand %xmm5, %xmm0
1248 ; SSE41-NEXT:    por %xmm4, %xmm0
1249 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
1250 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1251 ; SSE41-NEXT:    pxor %xmm2, %xmm3
1252 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [18446744071562035200,18446744071562035200]
1253 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
1254 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
1255 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
1256 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1257 ; SSE41-NEXT:    pand %xmm4, %xmm0
1258 ; SSE41-NEXT:    por %xmm3, %xmm0
1259 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
1260 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1261 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1262 ; SSE41-NEXT:    movd %xmm0, (%rdi)
1263 ; SSE41-NEXT:    retq
1265 ; AVX1-LABEL: trunc_ssat_v2i64_v2i16_store:
1266 ; AVX1:       # %bb.0:
1267 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [32767,32767]
1268 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
1269 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1270 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1271 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
1272 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1273 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1274 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1275 ; AVX1-NEXT:    vmovd %xmm0, (%rdi)
1276 ; AVX1-NEXT:    retq
1278 ; AVX2-SLOW-LABEL: trunc_ssat_v2i64_v2i16_store:
1279 ; AVX2-SLOW:       # %bb.0:
1280 ; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} xmm1 = [32767,32767]
1281 ; AVX2-SLOW-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
1282 ; AVX2-SLOW-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1283 ; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1284 ; AVX2-SLOW-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
1285 ; AVX2-SLOW-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1286 ; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1287 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1288 ; AVX2-SLOW-NEXT:    vmovd %xmm0, (%rdi)
1289 ; AVX2-SLOW-NEXT:    retq
1291 ; AVX2-FAST-LABEL: trunc_ssat_v2i64_v2i16_store:
1292 ; AVX2-FAST:       # %bb.0:
1293 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm1 = [32767,32767]
1294 ; AVX2-FAST-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
1295 ; AVX2-FAST-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1296 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1297 ; AVX2-FAST-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
1298 ; AVX2-FAST-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1299 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
1300 ; AVX2-FAST-NEXT:    vmovd %xmm0, (%rdi)
1301 ; AVX2-FAST-NEXT:    retq
1303 ; AVX512F-LABEL: trunc_ssat_v2i64_v2i16_store:
1304 ; AVX512F:       # %bb.0:
1305 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1306 ; AVX512F-NEXT:    vpmovsqw %zmm0, %xmm0
1307 ; AVX512F-NEXT:    vmovd %xmm0, (%rdi)
1308 ; AVX512F-NEXT:    vzeroupper
1309 ; AVX512F-NEXT:    retq
1311 ; AVX512VL-LABEL: trunc_ssat_v2i64_v2i16_store:
1312 ; AVX512VL:       # %bb.0:
1313 ; AVX512VL-NEXT:    vpmovsqw %xmm0, (%rdi)
1314 ; AVX512VL-NEXT:    retq
1316 ; AVX512BW-LABEL: trunc_ssat_v2i64_v2i16_store:
1317 ; AVX512BW:       # %bb.0:
1318 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1319 ; AVX512BW-NEXT:    vpmovsqw %zmm0, %xmm0
1320 ; AVX512BW-NEXT:    vmovd %xmm0, (%rdi)
1321 ; AVX512BW-NEXT:    vzeroupper
1322 ; AVX512BW-NEXT:    retq
1324 ; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i16_store:
1325 ; AVX512BWVL:       # %bb.0:
1326 ; AVX512BWVL-NEXT:    vpmovsqw %xmm0, (%rdi)
1327 ; AVX512BWVL-NEXT:    retq
1329 ; SKX-LABEL: trunc_ssat_v2i64_v2i16_store:
1330 ; SKX:       # %bb.0:
1331 ; SKX-NEXT:    vpmovsqw %xmm0, (%rdi)
1332 ; SKX-NEXT:    retq
1333   %1 = icmp slt <2 x i64> %a0, <i64 32767, i64 32767>
1334   %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 32767, i64 32767>
1335   %3 = icmp sgt <2 x i64> %2, <i64 -32768, i64 -32768>
1336   %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -32768, i64 -32768>
1337   %5 = trunc <2 x i64> %4 to <2 x i16>
1338   store <2 x i16> %5, <2 x i16> *%p1
1339   ret void
1342 define <4 x i16> @trunc_ssat_v4i64_v4i16(<4 x i64> %a0) {
1343 ; SSE2-LABEL: trunc_ssat_v4i64_v4i16:
1344 ; SSE2:       # %bb.0:
1345 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [32767,32767]
1346 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1347 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
1348 ; SSE2-NEXT:    pxor %xmm2, %xmm3
1349 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147516415,2147516415]
1350 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
1351 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
1352 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1353 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
1354 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
1355 ; SSE2-NEXT:    pand %xmm7, %xmm4
1356 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
1357 ; SSE2-NEXT:    por %xmm4, %xmm3
1358 ; SSE2-NEXT:    pand %xmm3, %xmm1
1359 ; SSE2-NEXT:    pandn %xmm8, %xmm3
1360 ; SSE2-NEXT:    por %xmm1, %xmm3
1361 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1362 ; SSE2-NEXT:    pxor %xmm2, %xmm1
1363 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
1364 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
1365 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1366 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm1
1367 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1368 ; SSE2-NEXT:    pand %xmm6, %xmm1
1369 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1370 ; SSE2-NEXT:    por %xmm1, %xmm4
1371 ; SSE2-NEXT:    pand %xmm4, %xmm0
1372 ; SSE2-NEXT:    pandn %xmm8, %xmm4
1373 ; SSE2-NEXT:    por %xmm0, %xmm4
1374 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [18446744073709518848,18446744073709518848]
1375 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
1376 ; SSE2-NEXT:    pxor %xmm2, %xmm1
1377 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [18446744071562035200,18446744071562035200]
1378 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
1379 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
1380 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1381 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm1
1382 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1383 ; SSE2-NEXT:    pand %xmm7, %xmm1
1384 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1385 ; SSE2-NEXT:    por %xmm1, %xmm6
1386 ; SSE2-NEXT:    pand %xmm6, %xmm4
1387 ; SSE2-NEXT:    pandn %xmm0, %xmm6
1388 ; SSE2-NEXT:    por %xmm4, %xmm6
1389 ; SSE2-NEXT:    pxor %xmm3, %xmm2
1390 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1391 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm1
1392 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
1393 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm2
1394 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1395 ; SSE2-NEXT:    pand %xmm4, %xmm2
1396 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1397 ; SSE2-NEXT:    por %xmm2, %xmm1
1398 ; SSE2-NEXT:    pand %xmm1, %xmm3
1399 ; SSE2-NEXT:    pandn %xmm0, %xmm1
1400 ; SSE2-NEXT:    por %xmm3, %xmm1
1401 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1402 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,2,2,3,4,5,6,7]
1403 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,2,2,3]
1404 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1405 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1406 ; SSE2-NEXT:    retq
1408 ; SSSE3-LABEL: trunc_ssat_v4i64_v4i16:
1409 ; SSSE3:       # %bb.0:
1410 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [32767,32767]
1411 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1412 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
1413 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
1414 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147516415,2147516415]
1415 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
1416 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm6
1417 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1418 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm3
1419 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
1420 ; SSSE3-NEXT:    pand %xmm7, %xmm4
1421 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
1422 ; SSSE3-NEXT:    por %xmm4, %xmm3
1423 ; SSSE3-NEXT:    pand %xmm3, %xmm1
1424 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
1425 ; SSSE3-NEXT:    por %xmm1, %xmm3
1426 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
1427 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
1428 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
1429 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
1430 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1431 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm1
1432 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1433 ; SSSE3-NEXT:    pand %xmm6, %xmm1
1434 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1435 ; SSSE3-NEXT:    por %xmm1, %xmm4
1436 ; SSSE3-NEXT:    pand %xmm4, %xmm0
1437 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
1438 ; SSSE3-NEXT:    por %xmm0, %xmm4
1439 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [18446744073709518848,18446744073709518848]
1440 ; SSSE3-NEXT:    movdqa %xmm4, %xmm1
1441 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
1442 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [18446744071562035200,18446744071562035200]
1443 ; SSSE3-NEXT:    movdqa %xmm1, %xmm6
1444 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm6
1445 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1446 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm1
1447 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1448 ; SSSE3-NEXT:    pand %xmm7, %xmm1
1449 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1450 ; SSSE3-NEXT:    por %xmm1, %xmm6
1451 ; SSSE3-NEXT:    pand %xmm6, %xmm4
1452 ; SSSE3-NEXT:    pandn %xmm0, %xmm6
1453 ; SSSE3-NEXT:    por %xmm4, %xmm6
1454 ; SSSE3-NEXT:    pxor %xmm3, %xmm2
1455 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1456 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm1
1457 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
1458 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm2
1459 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1460 ; SSSE3-NEXT:    pand %xmm4, %xmm2
1461 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1462 ; SSSE3-NEXT:    por %xmm2, %xmm1
1463 ; SSSE3-NEXT:    pand %xmm1, %xmm3
1464 ; SSSE3-NEXT:    pandn %xmm0, %xmm1
1465 ; SSSE3-NEXT:    por %xmm3, %xmm1
1466 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1467 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,2,2,3,4,5,6,7]
1468 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,2,2,3]
1469 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1470 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1471 ; SSSE3-NEXT:    retq
1473 ; SSE41-LABEL: trunc_ssat_v4i64_v4i16:
1474 ; SSE41:       # %bb.0:
1475 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1476 ; SSE41-NEXT:    movapd {{.*#+}} xmm4 = [32767,32767]
1477 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
1478 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1479 ; SSE41-NEXT:    pxor %xmm3, %xmm0
1480 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [2147516415,2147516415]
1481 ; SSE41-NEXT:    movdqa %xmm6, %xmm5
1482 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
1483 ; SSE41-NEXT:    movdqa %xmm6, %xmm7
1484 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
1485 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1486 ; SSE41-NEXT:    pand %xmm5, %xmm0
1487 ; SSE41-NEXT:    por %xmm7, %xmm0
1488 ; SSE41-NEXT:    movapd %xmm4, %xmm5
1489 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
1490 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1491 ; SSE41-NEXT:    pxor %xmm3, %xmm0
1492 ; SSE41-NEXT:    movdqa %xmm6, %xmm1
1493 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
1494 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
1495 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1496 ; SSE41-NEXT:    pand %xmm1, %xmm0
1497 ; SSE41-NEXT:    por %xmm6, %xmm0
1498 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
1499 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1500 ; SSE41-NEXT:    movapd %xmm4, %xmm2
1501 ; SSE41-NEXT:    xorpd %xmm3, %xmm2
1502 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [18446744071562035200,18446744071562035200]
1503 ; SSE41-NEXT:    movapd %xmm2, %xmm7
1504 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm7
1505 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm2
1506 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
1507 ; SSE41-NEXT:    pand %xmm7, %xmm0
1508 ; SSE41-NEXT:    por %xmm2, %xmm0
1509 ; SSE41-NEXT:    movapd %xmm1, %xmm2
1510 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
1511 ; SSE41-NEXT:    xorpd %xmm5, %xmm3
1512 ; SSE41-NEXT:    movapd %xmm3, %xmm4
1513 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm4
1514 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm3
1515 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1516 ; SSE41-NEXT:    pand %xmm4, %xmm0
1517 ; SSE41-NEXT:    por %xmm3, %xmm0
1518 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
1519 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1520 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,2,2,3,4,5,6,7]
1521 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
1522 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1523 ; SSE41-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1524 ; SSE41-NEXT:    retq
1526 ; AVX1-LABEL: trunc_ssat_v4i64_v4i16:
1527 ; AVX1:       # %bb.0:
1528 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1529 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [32767,32767]
1530 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
1531 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm4
1532 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm0, %xmm2, %xmm0
1533 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [18446744073709518848,18446744073709518848]
1534 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm0, %xmm5
1535 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm1, %xmm2, %xmm1
1536 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm1, %xmm2
1537 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm4, %xmm1
1538 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[0,2,2,3]
1539 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1540 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
1541 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1542 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1543 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1544 ; AVX1-NEXT:    vzeroupper
1545 ; AVX1-NEXT:    retq
1547 ; AVX2-SLOW-LABEL: trunc_ssat_v4i64_v4i16:
1548 ; AVX2-SLOW:       # %bb.0:
1549 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [32767,32767,32767,32767]
1550 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
1551 ; AVX2-SLOW-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1552 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848]
1553 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
1554 ; AVX2-SLOW-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1555 ; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1
1556 ; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[0,2,2,3]
1557 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1558 ; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1559 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1560 ; AVX2-SLOW-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1561 ; AVX2-SLOW-NEXT:    vzeroupper
1562 ; AVX2-SLOW-NEXT:    retq
1564 ; AVX2-FAST-LABEL: trunc_ssat_v4i64_v4i16:
1565 ; AVX2-FAST:       # %bb.0:
1566 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [32767,32767,32767,32767]
1567 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
1568 ; AVX2-FAST-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1569 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848]
1570 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
1571 ; AVX2-FAST-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1572 ; AVX2-FAST-NEXT:    vextractf128 $1, %ymm0, %xmm1
1573 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
1574 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1575 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1576 ; AVX2-FAST-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1577 ; AVX2-FAST-NEXT:    vzeroupper
1578 ; AVX2-FAST-NEXT:    retq
1580 ; AVX512F-LABEL: trunc_ssat_v4i64_v4i16:
1581 ; AVX512F:       # %bb.0:
1582 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1583 ; AVX512F-NEXT:    vpmovsqw %zmm0, %xmm0
1584 ; AVX512F-NEXT:    vzeroupper
1585 ; AVX512F-NEXT:    retq
1587 ; AVX512VL-LABEL: trunc_ssat_v4i64_v4i16:
1588 ; AVX512VL:       # %bb.0:
1589 ; AVX512VL-NEXT:    vpmovsqw %ymm0, %xmm0
1590 ; AVX512VL-NEXT:    vzeroupper
1591 ; AVX512VL-NEXT:    retq
1593 ; AVX512BW-LABEL: trunc_ssat_v4i64_v4i16:
1594 ; AVX512BW:       # %bb.0:
1595 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1596 ; AVX512BW-NEXT:    vpmovsqw %zmm0, %xmm0
1597 ; AVX512BW-NEXT:    vzeroupper
1598 ; AVX512BW-NEXT:    retq
1600 ; AVX512BWVL-LABEL: trunc_ssat_v4i64_v4i16:
1601 ; AVX512BWVL:       # %bb.0:
1602 ; AVX512BWVL-NEXT:    vpmovsqw %ymm0, %xmm0
1603 ; AVX512BWVL-NEXT:    vzeroupper
1604 ; AVX512BWVL-NEXT:    retq
1606 ; SKX-LABEL: trunc_ssat_v4i64_v4i16:
1607 ; SKX:       # %bb.0:
1608 ; SKX-NEXT:    vpmovsqw %ymm0, %xmm0
1609 ; SKX-NEXT:    vzeroupper
1610 ; SKX-NEXT:    retq
1611   %1 = icmp slt <4 x i64> %a0, <i64 32767, i64 32767, i64 32767, i64 32767>
1612   %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 32767, i64 32767, i64 32767, i64 32767>
1613   %3 = icmp sgt <4 x i64> %2, <i64 -32768, i64 -32768, i64 -32768, i64 -32768>
1614   %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> <i64 -32768, i64 -32768, i64 -32768, i64 -32768>
1615   %5 = trunc <4 x i64> %4 to <4 x i16>
1616   ret <4 x i16> %5
1619 define void @trunc_ssat_v4i64_v4i16_store(<4 x i64> %a0, <4 x i16> *%p1) {
1620 ; SSE2-LABEL: trunc_ssat_v4i64_v4i16_store:
1621 ; SSE2:       # %bb.0:
1622 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [32767,32767]
1623 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1624 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
1625 ; SSE2-NEXT:    pxor %xmm2, %xmm3
1626 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147516415,2147516415]
1627 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
1628 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
1629 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1630 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
1631 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
1632 ; SSE2-NEXT:    pand %xmm7, %xmm4
1633 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
1634 ; SSE2-NEXT:    por %xmm4, %xmm3
1635 ; SSE2-NEXT:    pand %xmm3, %xmm1
1636 ; SSE2-NEXT:    pandn %xmm8, %xmm3
1637 ; SSE2-NEXT:    por %xmm1, %xmm3
1638 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1639 ; SSE2-NEXT:    pxor %xmm2, %xmm1
1640 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
1641 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
1642 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1643 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm1
1644 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1645 ; SSE2-NEXT:    pand %xmm6, %xmm1
1646 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1647 ; SSE2-NEXT:    por %xmm1, %xmm4
1648 ; SSE2-NEXT:    pand %xmm4, %xmm0
1649 ; SSE2-NEXT:    pandn %xmm8, %xmm4
1650 ; SSE2-NEXT:    por %xmm0, %xmm4
1651 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [18446744073709518848,18446744073709518848]
1652 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
1653 ; SSE2-NEXT:    pxor %xmm2, %xmm1
1654 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [18446744071562035200,18446744071562035200]
1655 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
1656 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
1657 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1658 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm1
1659 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1660 ; SSE2-NEXT:    pand %xmm7, %xmm1
1661 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1662 ; SSE2-NEXT:    por %xmm1, %xmm6
1663 ; SSE2-NEXT:    pand %xmm6, %xmm4
1664 ; SSE2-NEXT:    pandn %xmm0, %xmm6
1665 ; SSE2-NEXT:    por %xmm4, %xmm6
1666 ; SSE2-NEXT:    pxor %xmm3, %xmm2
1667 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1668 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm1
1669 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
1670 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm2
1671 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1672 ; SSE2-NEXT:    pand %xmm4, %xmm2
1673 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1674 ; SSE2-NEXT:    por %xmm2, %xmm1
1675 ; SSE2-NEXT:    pand %xmm1, %xmm3
1676 ; SSE2-NEXT:    pandn %xmm0, %xmm1
1677 ; SSE2-NEXT:    por %xmm3, %xmm1
1678 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1679 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1680 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[0,2,2,3]
1681 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1682 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1683 ; SSE2-NEXT:    movq %xmm1, (%rdi)
1684 ; SSE2-NEXT:    retq
1686 ; SSSE3-LABEL: trunc_ssat_v4i64_v4i16_store:
1687 ; SSSE3:       # %bb.0:
1688 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [32767,32767]
1689 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1690 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
1691 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
1692 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147516415,2147516415]
1693 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
1694 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm6
1695 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1696 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm3
1697 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
1698 ; SSSE3-NEXT:    pand %xmm7, %xmm4
1699 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
1700 ; SSSE3-NEXT:    por %xmm4, %xmm3
1701 ; SSSE3-NEXT:    pand %xmm3, %xmm1
1702 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
1703 ; SSSE3-NEXT:    por %xmm1, %xmm3
1704 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
1705 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
1706 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
1707 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
1708 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1709 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm1
1710 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1711 ; SSSE3-NEXT:    pand %xmm6, %xmm1
1712 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1713 ; SSSE3-NEXT:    por %xmm1, %xmm4
1714 ; SSSE3-NEXT:    pand %xmm4, %xmm0
1715 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
1716 ; SSSE3-NEXT:    por %xmm0, %xmm4
1717 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [18446744073709518848,18446744073709518848]
1718 ; SSSE3-NEXT:    movdqa %xmm4, %xmm1
1719 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
1720 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [18446744071562035200,18446744071562035200]
1721 ; SSSE3-NEXT:    movdqa %xmm1, %xmm6
1722 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm6
1723 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1724 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm1
1725 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1726 ; SSSE3-NEXT:    pand %xmm7, %xmm1
1727 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1728 ; SSSE3-NEXT:    por %xmm1, %xmm6
1729 ; SSSE3-NEXT:    pand %xmm6, %xmm4
1730 ; SSSE3-NEXT:    pandn %xmm0, %xmm6
1731 ; SSSE3-NEXT:    por %xmm4, %xmm6
1732 ; SSSE3-NEXT:    pxor %xmm3, %xmm2
1733 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1734 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm1
1735 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
1736 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm2
1737 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1738 ; SSSE3-NEXT:    pand %xmm4, %xmm2
1739 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1740 ; SSSE3-NEXT:    por %xmm2, %xmm1
1741 ; SSSE3-NEXT:    pand %xmm1, %xmm3
1742 ; SSSE3-NEXT:    pandn %xmm0, %xmm1
1743 ; SSSE3-NEXT:    por %xmm3, %xmm1
1744 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1745 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1746 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[0,2,2,3]
1747 ; SSSE3-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1748 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1749 ; SSSE3-NEXT:    movq %xmm1, (%rdi)
1750 ; SSSE3-NEXT:    retq
1752 ; SSE41-LABEL: trunc_ssat_v4i64_v4i16_store:
1753 ; SSE41:       # %bb.0:
1754 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1755 ; SSE41-NEXT:    movapd {{.*#+}} xmm4 = [32767,32767]
1756 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
1757 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1758 ; SSE41-NEXT:    pxor %xmm3, %xmm0
1759 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [2147516415,2147516415]
1760 ; SSE41-NEXT:    movdqa %xmm6, %xmm5
1761 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
1762 ; SSE41-NEXT:    movdqa %xmm6, %xmm7
1763 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
1764 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1765 ; SSE41-NEXT:    pand %xmm5, %xmm0
1766 ; SSE41-NEXT:    por %xmm7, %xmm0
1767 ; SSE41-NEXT:    movapd %xmm4, %xmm5
1768 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
1769 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1770 ; SSE41-NEXT:    pxor %xmm3, %xmm0
1771 ; SSE41-NEXT:    movdqa %xmm6, %xmm1
1772 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
1773 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
1774 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1775 ; SSE41-NEXT:    pand %xmm1, %xmm0
1776 ; SSE41-NEXT:    por %xmm6, %xmm0
1777 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
1778 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1779 ; SSE41-NEXT:    movapd %xmm4, %xmm2
1780 ; SSE41-NEXT:    xorpd %xmm3, %xmm2
1781 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [18446744071562035200,18446744071562035200]
1782 ; SSE41-NEXT:    movapd %xmm2, %xmm7
1783 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm7
1784 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm2
1785 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
1786 ; SSE41-NEXT:    pand %xmm7, %xmm0
1787 ; SSE41-NEXT:    por %xmm2, %xmm0
1788 ; SSE41-NEXT:    movapd %xmm1, %xmm2
1789 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
1790 ; SSE41-NEXT:    xorpd %xmm5, %xmm3
1791 ; SSE41-NEXT:    movapd %xmm3, %xmm4
1792 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm4
1793 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm3
1794 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1795 ; SSE41-NEXT:    pand %xmm4, %xmm0
1796 ; SSE41-NEXT:    por %xmm3, %xmm0
1797 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
1798 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1799 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1800 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
1801 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1802 ; SSE41-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1803 ; SSE41-NEXT:    movq %xmm1, (%rdi)
1804 ; SSE41-NEXT:    retq
1806 ; AVX1-LABEL: trunc_ssat_v4i64_v4i16_store:
1807 ; AVX1:       # %bb.0:
1808 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1809 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [32767,32767]
1810 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
1811 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm4
1812 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm0, %xmm2, %xmm0
1813 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [18446744073709518848,18446744073709518848]
1814 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm0, %xmm5
1815 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm1, %xmm2, %xmm1
1816 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm1, %xmm2
1817 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm4, %xmm1
1818 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[0,2,2,3]
1819 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1820 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
1821 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1822 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1823 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1824 ; AVX1-NEXT:    vmovq %xmm0, (%rdi)
1825 ; AVX1-NEXT:    vzeroupper
1826 ; AVX1-NEXT:    retq
1828 ; AVX2-SLOW-LABEL: trunc_ssat_v4i64_v4i16_store:
1829 ; AVX2-SLOW:       # %bb.0:
1830 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [32767,32767,32767,32767]
1831 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
1832 ; AVX2-SLOW-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1833 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848]
1834 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
1835 ; AVX2-SLOW-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1836 ; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1
1837 ; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[0,2,2,3]
1838 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1839 ; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1840 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1841 ; AVX2-SLOW-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1842 ; AVX2-SLOW-NEXT:    vmovq %xmm0, (%rdi)
1843 ; AVX2-SLOW-NEXT:    vzeroupper
1844 ; AVX2-SLOW-NEXT:    retq
1846 ; AVX2-FAST-LABEL: trunc_ssat_v4i64_v4i16_store:
1847 ; AVX2-FAST:       # %bb.0:
1848 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [32767,32767,32767,32767]
1849 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
1850 ; AVX2-FAST-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1851 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848]
1852 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
1853 ; AVX2-FAST-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1854 ; AVX2-FAST-NEXT:    vextractf128 $1, %ymm0, %xmm1
1855 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
1856 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1857 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1858 ; AVX2-FAST-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1859 ; AVX2-FAST-NEXT:    vmovq %xmm0, (%rdi)
1860 ; AVX2-FAST-NEXT:    vzeroupper
1861 ; AVX2-FAST-NEXT:    retq
1863 ; AVX512F-LABEL: trunc_ssat_v4i64_v4i16_store:
1864 ; AVX512F:       # %bb.0:
1865 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1866 ; AVX512F-NEXT:    vpmovsqw %zmm0, %xmm0
1867 ; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
1868 ; AVX512F-NEXT:    vzeroupper
1869 ; AVX512F-NEXT:    retq
1871 ; AVX512VL-LABEL: trunc_ssat_v4i64_v4i16_store:
1872 ; AVX512VL:       # %bb.0:
1873 ; AVX512VL-NEXT:    vpmovsqw %ymm0, (%rdi)
1874 ; AVX512VL-NEXT:    vzeroupper
1875 ; AVX512VL-NEXT:    retq
1877 ; AVX512BW-LABEL: trunc_ssat_v4i64_v4i16_store:
1878 ; AVX512BW:       # %bb.0:
1879 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1880 ; AVX512BW-NEXT:    vpmovsqw %zmm0, %xmm0
1881 ; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
1882 ; AVX512BW-NEXT:    vzeroupper
1883 ; AVX512BW-NEXT:    retq
1885 ; AVX512BWVL-LABEL: trunc_ssat_v4i64_v4i16_store:
1886 ; AVX512BWVL:       # %bb.0:
1887 ; AVX512BWVL-NEXT:    vpmovsqw %ymm0, (%rdi)
1888 ; AVX512BWVL-NEXT:    vzeroupper
1889 ; AVX512BWVL-NEXT:    retq
1891 ; SKX-LABEL: trunc_ssat_v4i64_v4i16_store:
1892 ; SKX:       # %bb.0:
1893 ; SKX-NEXT:    vpmovsqw %ymm0, (%rdi)
1894 ; SKX-NEXT:    vzeroupper
1895 ; SKX-NEXT:    retq
1896   %1 = icmp slt <4 x i64> %a0, <i64 32767, i64 32767, i64 32767, i64 32767>
1897   %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 32767, i64 32767, i64 32767, i64 32767>
1898   %3 = icmp sgt <4 x i64> %2, <i64 -32768, i64 -32768, i64 -32768, i64 -32768>
1899   %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> <i64 -32768, i64 -32768, i64 -32768, i64 -32768>
1900   %5 = trunc <4 x i64> %4 to <4 x i16>
1901   store <4 x i16> %5, <4 x i16> *%p1
1902   ret void
1905 define <8 x i16> @trunc_ssat_v8i64_v8i16(<8 x i64>* %p0) "min-legal-vector-width"="256" {
1906 ; SSE2-LABEL: trunc_ssat_v8i64_v8i16:
1907 ; SSE2:       # %bb.0:
1908 ; SSE2-NEXT:    movdqa (%rdi), %xmm6
1909 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm9
1910 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm3
1911 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm5
1912 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [32767,32767]
1913 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
1914 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
1915 ; SSE2-NEXT:    pxor %xmm1, %xmm2
1916 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147516415,2147516415]
1917 ; SSE2-NEXT:    movdqa %xmm10, %xmm7
1918 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm7
1919 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1920 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm2
1921 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
1922 ; SSE2-NEXT:    pand %xmm0, %xmm4
1923 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]
1924 ; SSE2-NEXT:    por %xmm4, %xmm2
1925 ; SSE2-NEXT:    pand %xmm2, %xmm3
1926 ; SSE2-NEXT:    pandn %xmm8, %xmm2
1927 ; SSE2-NEXT:    por %xmm3, %xmm2
1928 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
1929 ; SSE2-NEXT:    pxor %xmm1, %xmm0
1930 ; SSE2-NEXT:    movdqa %xmm10, %xmm3
1931 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1932 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1933 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
1934 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1935 ; SSE2-NEXT:    pand %xmm4, %xmm0
1936 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1937 ; SSE2-NEXT:    por %xmm0, %xmm3
1938 ; SSE2-NEXT:    pand %xmm3, %xmm5
1939 ; SSE2-NEXT:    pandn %xmm8, %xmm3
1940 ; SSE2-NEXT:    por %xmm5, %xmm3
1941 ; SSE2-NEXT:    movdqa %xmm6, %xmm0
1942 ; SSE2-NEXT:    pxor %xmm1, %xmm0
1943 ; SSE2-NEXT:    movdqa %xmm10, %xmm4
1944 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
1945 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1946 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
1947 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1948 ; SSE2-NEXT:    pand %xmm5, %xmm0
1949 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
1950 ; SSE2-NEXT:    por %xmm0, %xmm5
1951 ; SSE2-NEXT:    pand %xmm5, %xmm6
1952 ; SSE2-NEXT:    pandn %xmm8, %xmm5
1953 ; SSE2-NEXT:    por %xmm6, %xmm5
1954 ; SSE2-NEXT:    movdqa %xmm9, %xmm0
1955 ; SSE2-NEXT:    pxor %xmm1, %xmm0
1956 ; SSE2-NEXT:    movdqa %xmm10, %xmm4
1957 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
1958 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1959 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
1960 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1961 ; SSE2-NEXT:    pand %xmm6, %xmm0
1962 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
1963 ; SSE2-NEXT:    por %xmm0, %xmm7
1964 ; SSE2-NEXT:    pand %xmm7, %xmm9
1965 ; SSE2-NEXT:    pandn %xmm8, %xmm7
1966 ; SSE2-NEXT:    por %xmm9, %xmm7
1967 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [18446744073709518848,18446744073709518848]
1968 ; SSE2-NEXT:    movdqa %xmm7, %xmm0
1969 ; SSE2-NEXT:    pxor %xmm1, %xmm0
1970 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [18446744071562035200,18446744071562035200]
1971 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
1972 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm4
1973 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1974 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
1975 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1976 ; SSE2-NEXT:    pand %xmm6, %xmm0
1977 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1978 ; SSE2-NEXT:    por %xmm0, %xmm4
1979 ; SSE2-NEXT:    pand %xmm4, %xmm7
1980 ; SSE2-NEXT:    pandn %xmm8, %xmm4
1981 ; SSE2-NEXT:    por %xmm7, %xmm4
1982 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
1983 ; SSE2-NEXT:    pxor %xmm1, %xmm0
1984 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
1985 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm6
1986 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
1987 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
1988 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
1989 ; SSE2-NEXT:    pand %xmm10, %xmm7
1990 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
1991 ; SSE2-NEXT:    por %xmm7, %xmm0
1992 ; SSE2-NEXT:    pand %xmm0, %xmm5
1993 ; SSE2-NEXT:    pandn %xmm8, %xmm0
1994 ; SSE2-NEXT:    por %xmm5, %xmm0
1995 ; SSE2-NEXT:    packssdw %xmm4, %xmm0
1996 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
1997 ; SSE2-NEXT:    pxor %xmm1, %xmm4
1998 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
1999 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm5
2000 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
2001 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
2002 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2003 ; SSE2-NEXT:    pand %xmm6, %xmm4
2004 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2005 ; SSE2-NEXT:    por %xmm4, %xmm5
2006 ; SSE2-NEXT:    pand %xmm5, %xmm3
2007 ; SSE2-NEXT:    pandn %xmm8, %xmm5
2008 ; SSE2-NEXT:    por %xmm3, %xmm5
2009 ; SSE2-NEXT:    pxor %xmm2, %xmm1
2010 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
2011 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm3
2012 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2013 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
2014 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2015 ; SSE2-NEXT:    pand %xmm4, %xmm1
2016 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2017 ; SSE2-NEXT:    por %xmm1, %xmm3
2018 ; SSE2-NEXT:    pand %xmm3, %xmm2
2019 ; SSE2-NEXT:    pandn %xmm8, %xmm3
2020 ; SSE2-NEXT:    por %xmm2, %xmm3
2021 ; SSE2-NEXT:    packssdw %xmm5, %xmm3
2022 ; SSE2-NEXT:    packssdw %xmm3, %xmm0
2023 ; SSE2-NEXT:    retq
2025 ; SSSE3-LABEL: trunc_ssat_v8i64_v8i16:
2026 ; SSSE3:       # %bb.0:
2027 ; SSSE3-NEXT:    movdqa (%rdi), %xmm6
2028 ; SSSE3-NEXT:    movdqa 16(%rdi), %xmm9
2029 ; SSSE3-NEXT:    movdqa 32(%rdi), %xmm3
2030 ; SSSE3-NEXT:    movdqa 48(%rdi), %xmm5
2031 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [32767,32767]
2032 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
2033 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
2034 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
2035 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [2147516415,2147516415]
2036 ; SSSE3-NEXT:    movdqa %xmm10, %xmm7
2037 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm7
2038 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
2039 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm2
2040 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
2041 ; SSSE3-NEXT:    pand %xmm0, %xmm4
2042 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]
2043 ; SSSE3-NEXT:    por %xmm4, %xmm2
2044 ; SSSE3-NEXT:    pand %xmm2, %xmm3
2045 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
2046 ; SSSE3-NEXT:    por %xmm3, %xmm2
2047 ; SSSE3-NEXT:    movdqa %xmm5, %xmm0
2048 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
2049 ; SSSE3-NEXT:    movdqa %xmm10, %xmm3
2050 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm3
2051 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2052 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm0
2053 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2054 ; SSSE3-NEXT:    pand %xmm4, %xmm0
2055 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2056 ; SSSE3-NEXT:    por %xmm0, %xmm3
2057 ; SSSE3-NEXT:    pand %xmm3, %xmm5
2058 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
2059 ; SSSE3-NEXT:    por %xmm5, %xmm3
2060 ; SSSE3-NEXT:    movdqa %xmm6, %xmm0
2061 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
2062 ; SSSE3-NEXT:    movdqa %xmm10, %xmm4
2063 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm4
2064 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2065 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm0
2066 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2067 ; SSSE3-NEXT:    pand %xmm5, %xmm0
2068 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
2069 ; SSSE3-NEXT:    por %xmm0, %xmm5
2070 ; SSSE3-NEXT:    pand %xmm5, %xmm6
2071 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
2072 ; SSSE3-NEXT:    por %xmm6, %xmm5
2073 ; SSSE3-NEXT:    movdqa %xmm9, %xmm0
2074 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
2075 ; SSSE3-NEXT:    movdqa %xmm10, %xmm4
2076 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm4
2077 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2078 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm0
2079 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2080 ; SSSE3-NEXT:    pand %xmm6, %xmm0
2081 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
2082 ; SSSE3-NEXT:    por %xmm0, %xmm7
2083 ; SSSE3-NEXT:    pand %xmm7, %xmm9
2084 ; SSSE3-NEXT:    pandn %xmm8, %xmm7
2085 ; SSSE3-NEXT:    por %xmm9, %xmm7
2086 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [18446744073709518848,18446744073709518848]
2087 ; SSSE3-NEXT:    movdqa %xmm7, %xmm0
2088 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
2089 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [18446744071562035200,18446744071562035200]
2090 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
2091 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm4
2092 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2093 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
2094 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2095 ; SSSE3-NEXT:    pand %xmm6, %xmm0
2096 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2097 ; SSSE3-NEXT:    por %xmm0, %xmm4
2098 ; SSSE3-NEXT:    pand %xmm4, %xmm7
2099 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
2100 ; SSSE3-NEXT:    por %xmm7, %xmm4
2101 ; SSSE3-NEXT:    movdqa %xmm5, %xmm0
2102 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
2103 ; SSSE3-NEXT:    movdqa %xmm0, %xmm6
2104 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm6
2105 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
2106 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
2107 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
2108 ; SSSE3-NEXT:    pand %xmm10, %xmm7
2109 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
2110 ; SSSE3-NEXT:    por %xmm7, %xmm0
2111 ; SSSE3-NEXT:    pand %xmm0, %xmm5
2112 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
2113 ; SSSE3-NEXT:    por %xmm5, %xmm0
2114 ; SSSE3-NEXT:    packssdw %xmm4, %xmm0
2115 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
2116 ; SSSE3-NEXT:    pxor %xmm1, %xmm4
2117 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
2118 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm5
2119 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
2120 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
2121 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2122 ; SSSE3-NEXT:    pand %xmm6, %xmm4
2123 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2124 ; SSSE3-NEXT:    por %xmm4, %xmm5
2125 ; SSSE3-NEXT:    pand %xmm5, %xmm3
2126 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
2127 ; SSSE3-NEXT:    por %xmm3, %xmm5
2128 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
2129 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
2130 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm3
2131 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2132 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
2133 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2134 ; SSSE3-NEXT:    pand %xmm4, %xmm1
2135 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2136 ; SSSE3-NEXT:    por %xmm1, %xmm3
2137 ; SSSE3-NEXT:    pand %xmm3, %xmm2
2138 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
2139 ; SSSE3-NEXT:    por %xmm2, %xmm3
2140 ; SSSE3-NEXT:    packssdw %xmm5, %xmm3
2141 ; SSSE3-NEXT:    packssdw %xmm3, %xmm0
2142 ; SSSE3-NEXT:    retq
2144 ; SSE41-LABEL: trunc_ssat_v8i64_v8i16:
2145 ; SSE41:       # %bb.0:
2146 ; SSE41-NEXT:    movdqa (%rdi), %xmm10
2147 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm9
2148 ; SSE41-NEXT:    movdqa 32(%rdi), %xmm3
2149 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm5
2150 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [32767,32767]
2151 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
2152 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
2153 ; SSE41-NEXT:    pxor %xmm2, %xmm0
2154 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [2147516415,2147516415]
2155 ; SSE41-NEXT:    movdqa %xmm4, %xmm7
2156 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm7
2157 ; SSE41-NEXT:    movdqa %xmm4, %xmm6
2158 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
2159 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2160 ; SSE41-NEXT:    pand %xmm7, %xmm0
2161 ; SSE41-NEXT:    por %xmm6, %xmm0
2162 ; SSE41-NEXT:    movapd %xmm1, %xmm8
2163 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm8
2164 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
2165 ; SSE41-NEXT:    pxor %xmm2, %xmm0
2166 ; SSE41-NEXT:    movdqa %xmm4, %xmm3
2167 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
2168 ; SSE41-NEXT:    movdqa %xmm4, %xmm6
2169 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
2170 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2171 ; SSE41-NEXT:    pand %xmm3, %xmm0
2172 ; SSE41-NEXT:    por %xmm6, %xmm0
2173 ; SSE41-NEXT:    movapd %xmm1, %xmm11
2174 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm11
2175 ; SSE41-NEXT:    movdqa %xmm10, %xmm0
2176 ; SSE41-NEXT:    pxor %xmm2, %xmm0
2177 ; SSE41-NEXT:    movdqa %xmm4, %xmm3
2178 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
2179 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
2180 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
2181 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
2182 ; SSE41-NEXT:    pand %xmm3, %xmm0
2183 ; SSE41-NEXT:    por %xmm5, %xmm0
2184 ; SSE41-NEXT:    movapd %xmm1, %xmm3
2185 ; SSE41-NEXT:    blendvpd %xmm0, %xmm10, %xmm3
2186 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
2187 ; SSE41-NEXT:    pxor %xmm2, %xmm0
2188 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
2189 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
2190 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
2191 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
2192 ; SSE41-NEXT:    pand %xmm5, %xmm0
2193 ; SSE41-NEXT:    por %xmm4, %xmm0
2194 ; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm1
2195 ; SSE41-NEXT:    movapd {{.*#+}} xmm5 = [18446744073709518848,18446744073709518848]
2196 ; SSE41-NEXT:    movapd %xmm1, %xmm4
2197 ; SSE41-NEXT:    xorpd %xmm2, %xmm4
2198 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [18446744071562035200,18446744071562035200]
2199 ; SSE41-NEXT:    movapd %xmm4, %xmm7
2200 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm7
2201 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm4
2202 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
2203 ; SSE41-NEXT:    pand %xmm7, %xmm0
2204 ; SSE41-NEXT:    por %xmm4, %xmm0
2205 ; SSE41-NEXT:    movapd %xmm5, %xmm4
2206 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
2207 ; SSE41-NEXT:    movapd %xmm3, %xmm1
2208 ; SSE41-NEXT:    xorpd %xmm2, %xmm1
2209 ; SSE41-NEXT:    movapd %xmm1, %xmm7
2210 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm7
2211 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm1
2212 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
2213 ; SSE41-NEXT:    pand %xmm7, %xmm0
2214 ; SSE41-NEXT:    por %xmm1, %xmm0
2215 ; SSE41-NEXT:    movapd %xmm5, %xmm1
2216 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
2217 ; SSE41-NEXT:    packssdw %xmm4, %xmm1
2218 ; SSE41-NEXT:    movapd %xmm11, %xmm3
2219 ; SSE41-NEXT:    xorpd %xmm2, %xmm3
2220 ; SSE41-NEXT:    movapd %xmm3, %xmm4
2221 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm4
2222 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm3
2223 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2224 ; SSE41-NEXT:    pand %xmm4, %xmm0
2225 ; SSE41-NEXT:    por %xmm3, %xmm0
2226 ; SSE41-NEXT:    movapd %xmm5, %xmm3
2227 ; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm3
2228 ; SSE41-NEXT:    xorpd %xmm8, %xmm2
2229 ; SSE41-NEXT:    movapd %xmm2, %xmm4
2230 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm4
2231 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm2
2232 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
2233 ; SSE41-NEXT:    pand %xmm4, %xmm0
2234 ; SSE41-NEXT:    por %xmm2, %xmm0
2235 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm5
2236 ; SSE41-NEXT:    packssdw %xmm3, %xmm5
2237 ; SSE41-NEXT:    packssdw %xmm5, %xmm1
2238 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
2239 ; SSE41-NEXT:    retq
2241 ; AVX1-LABEL: trunc_ssat_v8i64_v8i16:
2242 ; AVX1:       # %bb.0:
2243 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
2244 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
2245 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm2
2246 ; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm3
2247 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [32767,32767]
2248 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm8
2249 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm6
2250 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm7
2251 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm4, %xmm5
2252 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
2253 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [18446744073709518848,18446744073709518848]
2254 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm0, %xmm9
2255 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm1, %xmm4, %xmm1
2256 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm1, %xmm7
2257 ; AVX1-NEXT:    vblendvpd %xmm6, %xmm2, %xmm4, %xmm2
2258 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm2, %xmm6
2259 ; AVX1-NEXT:    vblendvpd %xmm8, %xmm3, %xmm4, %xmm3
2260 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm3, %xmm4
2261 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm5, %xmm3
2262 ; AVX1-NEXT:    vblendvpd %xmm6, %xmm2, %xmm5, %xmm2
2263 ; AVX1-NEXT:    vpackssdw %xmm3, %xmm2, %xmm2
2264 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm1, %xmm5, %xmm1
2265 ; AVX1-NEXT:    vblendvpd %xmm9, %xmm0, %xmm5, %xmm0
2266 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
2267 ; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0
2268 ; AVX1-NEXT:    retq
2270 ; AVX2-LABEL: trunc_ssat_v8i64_v8i16:
2271 ; AVX2:       # %bb.0:
2272 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
2273 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
2274 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [32767,32767,32767,32767]
2275 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
2276 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
2277 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
2278 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
2279 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848]
2280 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm3
2281 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
2282 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
2283 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
2284 ; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
2285 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2286 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2287 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
2288 ; AVX2-NEXT:    vzeroupper
2289 ; AVX2-NEXT:    retq
2291 ; AVX512-LABEL: trunc_ssat_v8i64_v8i16:
2292 ; AVX512:       # %bb.0:
2293 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
2294 ; AVX512-NEXT:    vpmovsqw %zmm0, %xmm0
2295 ; AVX512-NEXT:    vzeroupper
2296 ; AVX512-NEXT:    retq
2298 ; SKX-LABEL: trunc_ssat_v8i64_v8i16:
2299 ; SKX:       # %bb.0:
2300 ; SKX-NEXT:    vmovdqa (%rdi), %ymm0
2301 ; SKX-NEXT:    vmovdqa 32(%rdi), %ymm1
2302 ; SKX-NEXT:    vpmovsqw %ymm1, %xmm1
2303 ; SKX-NEXT:    vpmovsqw %ymm0, %xmm0
2304 ; SKX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2305 ; SKX-NEXT:    vzeroupper
2306 ; SKX-NEXT:    retq
2307   %a0 = load <8 x i64>, <8 x i64>* %p0
2308   %1 = icmp slt <8 x i64> %a0, <i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767>
2309   %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767>
2310   %3 = icmp sgt <8 x i64> %2, <i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768>
2311   %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> <i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768>
2312   %5 = trunc <8 x i64> %4 to <8 x i16>
2313   ret <8 x i16> %5
2316 define <4 x i16> @trunc_ssat_v4i32_v4i16(<4 x i32> %a0) {
2317 ; SSE-LABEL: trunc_ssat_v4i32_v4i16:
2318 ; SSE:       # %bb.0:
2319 ; SSE-NEXT:    packssdw %xmm0, %xmm0
2320 ; SSE-NEXT:    retq
2322 ; AVX-LABEL: trunc_ssat_v4i32_v4i16:
2323 ; AVX:       # %bb.0:
2324 ; AVX-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
2325 ; AVX-NEXT:    retq
2327 ; AVX512-LABEL: trunc_ssat_v4i32_v4i16:
2328 ; AVX512:       # %bb.0:
2329 ; AVX512-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
2330 ; AVX512-NEXT:    retq
2332 ; SKX-LABEL: trunc_ssat_v4i32_v4i16:
2333 ; SKX:       # %bb.0:
2334 ; SKX-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
2335 ; SKX-NEXT:    retq
2336   %1 = icmp slt <4 x i32> %a0, <i32 32767, i32 32767, i32 32767, i32 32767>
2337   %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767>
2338   %3 = icmp sgt <4 x i32> %2, <i32 -32768, i32 -32768, i32 -32768, i32 -32768>
2339   %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768>
2340   %5 = trunc <4 x i32> %4 to <4 x i16>
2341   ret <4 x i16> %5
2344 define void @trunc_ssat_v4i32_v4i16_store(<4 x i32> %a0, <4 x i16> *%p1) {
2345 ; SSE-LABEL: trunc_ssat_v4i32_v4i16_store:
2346 ; SSE:       # %bb.0:
2347 ; SSE-NEXT:    packssdw %xmm0, %xmm0
2348 ; SSE-NEXT:    movq %xmm0, (%rdi)
2349 ; SSE-NEXT:    retq
2351 ; AVX-LABEL: trunc_ssat_v4i32_v4i16_store:
2352 ; AVX:       # %bb.0:
2353 ; AVX-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
2354 ; AVX-NEXT:    vmovq %xmm0, (%rdi)
2355 ; AVX-NEXT:    retq
2357 ; AVX512F-LABEL: trunc_ssat_v4i32_v4i16_store:
2358 ; AVX512F:       # %bb.0:
2359 ; AVX512F-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
2360 ; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
2361 ; AVX512F-NEXT:    retq
2363 ; AVX512VL-LABEL: trunc_ssat_v4i32_v4i16_store:
2364 ; AVX512VL:       # %bb.0:
2365 ; AVX512VL-NEXT:    vpmovsdw %xmm0, (%rdi)
2366 ; AVX512VL-NEXT:    retq
2368 ; AVX512BW-LABEL: trunc_ssat_v4i32_v4i16_store:
2369 ; AVX512BW:       # %bb.0:
2370 ; AVX512BW-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
2371 ; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
2372 ; AVX512BW-NEXT:    retq
2374 ; AVX512BWVL-LABEL: trunc_ssat_v4i32_v4i16_store:
2375 ; AVX512BWVL:       # %bb.0:
2376 ; AVX512BWVL-NEXT:    vpmovsdw %xmm0, (%rdi)
2377 ; AVX512BWVL-NEXT:    retq
2379 ; SKX-LABEL: trunc_ssat_v4i32_v4i16_store:
2380 ; SKX:       # %bb.0:
2381 ; SKX-NEXT:    vpmovsdw %xmm0, (%rdi)
2382 ; SKX-NEXT:    retq
2383   %1 = icmp slt <4 x i32> %a0, <i32 32767, i32 32767, i32 32767, i32 32767>
2384   %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767>
2385   %3 = icmp sgt <4 x i32> %2, <i32 -32768, i32 -32768, i32 -32768, i32 -32768>
2386   %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768>
2387   %5 = trunc <4 x i32> %4 to <4 x i16>
2388   store <4 x i16> %5, <4 x i16> *%p1
2389   ret void
2392 define <8 x i16> @trunc_ssat_v8i32_v8i16(<8 x i32> %a0) {
2393 ; SSE-LABEL: trunc_ssat_v8i32_v8i16:
2394 ; SSE:       # %bb.0:
2395 ; SSE-NEXT:    packssdw %xmm1, %xmm0
2396 ; SSE-NEXT:    retq
2398 ; AVX1-LABEL: trunc_ssat_v8i32_v8i16:
2399 ; AVX1:       # %bb.0:
2400 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2401 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
2402 ; AVX1-NEXT:    vzeroupper
2403 ; AVX1-NEXT:    retq
2405 ; AVX2-LABEL: trunc_ssat_v8i32_v8i16:
2406 ; AVX2:       # %bb.0:
2407 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2408 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
2409 ; AVX2-NEXT:    vzeroupper
2410 ; AVX2-NEXT:    retq
2412 ; AVX512F-LABEL: trunc_ssat_v8i32_v8i16:
2413 ; AVX512F:       # %bb.0:
2414 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
2415 ; AVX512F-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
2416 ; AVX512F-NEXT:    vzeroupper
2417 ; AVX512F-NEXT:    retq
2419 ; AVX512VL-LABEL: trunc_ssat_v8i32_v8i16:
2420 ; AVX512VL:       # %bb.0:
2421 ; AVX512VL-NEXT:    vpmovsdw %ymm0, %xmm0
2422 ; AVX512VL-NEXT:    vzeroupper
2423 ; AVX512VL-NEXT:    retq
2425 ; AVX512BW-LABEL: trunc_ssat_v8i32_v8i16:
2426 ; AVX512BW:       # %bb.0:
2427 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
2428 ; AVX512BW-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
2429 ; AVX512BW-NEXT:    vzeroupper
2430 ; AVX512BW-NEXT:    retq
2432 ; AVX512BWVL-LABEL: trunc_ssat_v8i32_v8i16:
2433 ; AVX512BWVL:       # %bb.0:
2434 ; AVX512BWVL-NEXT:    vpmovsdw %ymm0, %xmm0
2435 ; AVX512BWVL-NEXT:    vzeroupper
2436 ; AVX512BWVL-NEXT:    retq
2438 ; SKX-LABEL: trunc_ssat_v8i32_v8i16:
2439 ; SKX:       # %bb.0:
2440 ; SKX-NEXT:    vpmovsdw %ymm0, %xmm0
2441 ; SKX-NEXT:    vzeroupper
2442 ; SKX-NEXT:    retq
2443   %1 = icmp slt <8 x i32> %a0, <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>
2444   %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>
2445   %3 = icmp sgt <8 x i32> %2, <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>
2446   %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>
2447   %5 = trunc <8 x i32> %4 to <8 x i16>
2448   ret <8 x i16> %5
2451 define <16 x i16> @trunc_ssat_v16i32_v16i16(<16 x i32>* %p0) "min-legal-vector-width"="256" {
2452 ; SSE-LABEL: trunc_ssat_v16i32_v16i16:
2453 ; SSE:       # %bb.0:
2454 ; SSE-NEXT:    movdqa (%rdi), %xmm0
2455 ; SSE-NEXT:    movdqa 32(%rdi), %xmm1
2456 ; SSE-NEXT:    packssdw 16(%rdi), %xmm0
2457 ; SSE-NEXT:    packssdw 48(%rdi), %xmm1
2458 ; SSE-NEXT:    retq
2460 ; AVX1-LABEL: trunc_ssat_v16i32_v16i16:
2461 ; AVX1:       # %bb.0:
2462 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
2463 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm1
2464 ; AVX1-NEXT:    vpackssdw 48(%rdi), %xmm1, %xmm1
2465 ; AVX1-NEXT:    vpackssdw 16(%rdi), %xmm0, %xmm0
2466 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2467 ; AVX1-NEXT:    retq
2469 ; AVX2-LABEL: trunc_ssat_v16i32_v16i16:
2470 ; AVX2:       # %bb.0:
2471 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
2472 ; AVX2-NEXT:    vpackssdw 32(%rdi), %ymm0, %ymm0
2473 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2474 ; AVX2-NEXT:    retq
2476 ; AVX512-LABEL: trunc_ssat_v16i32_v16i16:
2477 ; AVX512:       # %bb.0:
2478 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
2479 ; AVX512-NEXT:    vpmovsdw %zmm0, %ymm0
2480 ; AVX512-NEXT:    retq
2482 ; SKX-LABEL: trunc_ssat_v16i32_v16i16:
2483 ; SKX:       # %bb.0:
2484 ; SKX-NEXT:    vmovdqa (%rdi), %ymm0
2485 ; SKX-NEXT:    vpackssdw 32(%rdi), %ymm0, %ymm0
2486 ; SKX-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2487 ; SKX-NEXT:    retq
2488   %a0 = load <16 x i32>, <16 x i32>* %p0
2489   %1 = icmp slt <16 x i32> %a0, <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>
2490   %2 = select <16 x i1> %1, <16 x i32> %a0, <16 x i32> <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>
2491   %3 = icmp sgt <16 x i32> %2, <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>
2492   %4 = select <16 x i1> %3, <16 x i32> %2, <16 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>
2493   %5 = trunc <16 x i32> %4 to <16 x i16>
2494   ret <16 x i16> %5
2498 ; Signed saturation truncation to vXi8
2501 define <2 x i8> @trunc_ssat_v2i64_v2i8(<2 x i64> %a0) {
2502 ; SSE2-LABEL: trunc_ssat_v2i64_v2i8:
2503 ; SSE2:       # %bb.0:
2504 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
2505 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
2506 ; SSE2-NEXT:    pxor %xmm1, %xmm2
2507 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483775,2147483775]
2508 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
2509 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
2510 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2511 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
2512 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2513 ; SSE2-NEXT:    pand %xmm5, %xmm2
2514 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
2515 ; SSE2-NEXT:    por %xmm2, %xmm3
2516 ; SSE2-NEXT:    pand %xmm3, %xmm0
2517 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm3
2518 ; SSE2-NEXT:    por %xmm0, %xmm3
2519 ; SSE2-NEXT:    pxor %xmm3, %xmm1
2520 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [18446744071562067840,18446744071562067840]
2521 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
2522 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
2523 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2524 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
2525 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2526 ; SSE2-NEXT:    pand %xmm4, %xmm1
2527 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
2528 ; SSE2-NEXT:    por %xmm1, %xmm0
2529 ; SSE2-NEXT:    pand %xmm0, %xmm3
2530 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm0
2531 ; SSE2-NEXT:    por %xmm3, %xmm0
2532 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
2533 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
2534 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
2535 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
2536 ; SSE2-NEXT:    retq
2538 ; SSSE3-LABEL: trunc_ssat_v2i64_v2i8:
2539 ; SSSE3:       # %bb.0:
2540 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
2541 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
2542 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
2543 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483775,2147483775]
2544 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
2545 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
2546 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2547 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm2
2548 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2549 ; SSSE3-NEXT:    pand %xmm5, %xmm2
2550 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
2551 ; SSSE3-NEXT:    por %xmm2, %xmm3
2552 ; SSSE3-NEXT:    pand %xmm3, %xmm0
2553 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm3
2554 ; SSSE3-NEXT:    por %xmm0, %xmm3
2555 ; SSSE3-NEXT:    pxor %xmm3, %xmm1
2556 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [18446744071562067840,18446744071562067840]
2557 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
2558 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
2559 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2560 ; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm1
2561 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2562 ; SSSE3-NEXT:    pand %xmm4, %xmm1
2563 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
2564 ; SSSE3-NEXT:    por %xmm1, %xmm0
2565 ; SSSE3-NEXT:    pand %xmm0, %xmm3
2566 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm0
2567 ; SSSE3-NEXT:    por %xmm3, %xmm0
2568 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2569 ; SSSE3-NEXT:    retq
2571 ; SSE41-LABEL: trunc_ssat_v2i64_v2i8:
2572 ; SSE41:       # %bb.0:
2573 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
2574 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [127,127]
2575 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
2576 ; SSE41-NEXT:    pxor %xmm3, %xmm0
2577 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [2147483775,2147483775]
2578 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
2579 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
2580 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
2581 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
2582 ; SSE41-NEXT:    pand %xmm5, %xmm0
2583 ; SSE41-NEXT:    por %xmm4, %xmm0
2584 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
2585 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
2586 ; SSE41-NEXT:    pxor %xmm2, %xmm3
2587 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [18446744071562067840,18446744071562067840]
2588 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
2589 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
2590 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
2591 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2592 ; SSE41-NEXT:    pand %xmm4, %xmm0
2593 ; SSE41-NEXT:    por %xmm3, %xmm0
2594 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
2595 ; SSE41-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2596 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
2597 ; SSE41-NEXT:    retq
2599 ; AVX-LABEL: trunc_ssat_v2i64_v2i8:
2600 ; AVX:       # %bb.0:
2601 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [127,127]
2602 ; AVX-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
2603 ; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2604 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
2605 ; AVX-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
2606 ; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2607 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2608 ; AVX-NEXT:    retq
2610 ; AVX512F-LABEL: trunc_ssat_v2i64_v2i8:
2611 ; AVX512F:       # %bb.0:
2612 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2613 ; AVX512F-NEXT:    vpmovsqb %zmm0, %xmm0
2614 ; AVX512F-NEXT:    vzeroupper
2615 ; AVX512F-NEXT:    retq
2617 ; AVX512VL-LABEL: trunc_ssat_v2i64_v2i8:
2618 ; AVX512VL:       # %bb.0:
2619 ; AVX512VL-NEXT:    vpmovsqb %xmm0, %xmm0
2620 ; AVX512VL-NEXT:    retq
2622 ; AVX512BW-LABEL: trunc_ssat_v2i64_v2i8:
2623 ; AVX512BW:       # %bb.0:
2624 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2625 ; AVX512BW-NEXT:    vpmovsqb %zmm0, %xmm0
2626 ; AVX512BW-NEXT:    vzeroupper
2627 ; AVX512BW-NEXT:    retq
2629 ; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i8:
2630 ; AVX512BWVL:       # %bb.0:
2631 ; AVX512BWVL-NEXT:    vpmovsqb %xmm0, %xmm0
2632 ; AVX512BWVL-NEXT:    retq
2634 ; SKX-LABEL: trunc_ssat_v2i64_v2i8:
2635 ; SKX:       # %bb.0:
2636 ; SKX-NEXT:    vpmovsqb %xmm0, %xmm0
2637 ; SKX-NEXT:    retq
2638   %1 = icmp slt <2 x i64> %a0, <i64 127, i64 127>
2639   %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 127, i64 127>
2640   %3 = icmp sgt <2 x i64> %2, <i64 -128, i64 -128>
2641   %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -128, i64 -128>
2642   %5 = trunc <2 x i64> %4 to <2 x i8>
2643   ret <2 x i8> %5
2646 define void @trunc_ssat_v2i64_v2i8_store(<2 x i64> %a0, <2 x i8> *%p1) {
2647 ; SSE2-LABEL: trunc_ssat_v2i64_v2i8_store:
2648 ; SSE2:       # %bb.0:
2649 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
2650 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
2651 ; SSE2-NEXT:    pxor %xmm1, %xmm2
2652 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483775,2147483775]
2653 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
2654 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
2655 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2656 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
2657 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2658 ; SSE2-NEXT:    pand %xmm5, %xmm2
2659 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
2660 ; SSE2-NEXT:    por %xmm2, %xmm3
2661 ; SSE2-NEXT:    pand %xmm3, %xmm0
2662 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm3
2663 ; SSE2-NEXT:    por %xmm0, %xmm3
2664 ; SSE2-NEXT:    pxor %xmm3, %xmm1
2665 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [18446744071562067840,18446744071562067840]
2666 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
2667 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
2668 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2669 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
2670 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
2671 ; SSE2-NEXT:    pand %xmm4, %xmm0
2672 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
2673 ; SSE2-NEXT:    por %xmm0, %xmm1
2674 ; SSE2-NEXT:    pand %xmm1, %xmm3
2675 ; SSE2-NEXT:    pandn {{.*}}(%rip), %xmm1
2676 ; SSE2-NEXT:    por %xmm3, %xmm1
2677 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
2678 ; SSE2-NEXT:    packuswb %xmm1, %xmm1
2679 ; SSE2-NEXT:    packuswb %xmm0, %xmm1
2680 ; SSE2-NEXT:    packuswb %xmm0, %xmm1
2681 ; SSE2-NEXT:    movd %xmm1, %eax
2682 ; SSE2-NEXT:    movw %ax, (%rdi)
2683 ; SSE2-NEXT:    retq
2685 ; SSSE3-LABEL: trunc_ssat_v2i64_v2i8_store:
2686 ; SSSE3:       # %bb.0:
2687 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
2688 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
2689 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
2690 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483775,2147483775]
2691 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
2692 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
2693 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2694 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm2
2695 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2696 ; SSSE3-NEXT:    pand %xmm5, %xmm2
2697 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
2698 ; SSSE3-NEXT:    por %xmm2, %xmm3
2699 ; SSSE3-NEXT:    pand %xmm3, %xmm0
2700 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm3
2701 ; SSSE3-NEXT:    por %xmm0, %xmm3
2702 ; SSSE3-NEXT:    pxor %xmm3, %xmm1
2703 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [18446744071562067840,18446744071562067840]
2704 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
2705 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
2706 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2707 ; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm1
2708 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
2709 ; SSSE3-NEXT:    pand %xmm4, %xmm0
2710 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
2711 ; SSSE3-NEXT:    por %xmm0, %xmm1
2712 ; SSSE3-NEXT:    pand %xmm1, %xmm3
2713 ; SSSE3-NEXT:    pandn {{.*}}(%rip), %xmm1
2714 ; SSSE3-NEXT:    por %xmm3, %xmm1
2715 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2716 ; SSSE3-NEXT:    movd %xmm1, %eax
2717 ; SSSE3-NEXT:    movw %ax, (%rdi)
2718 ; SSSE3-NEXT:    retq
2720 ; SSE41-LABEL: trunc_ssat_v2i64_v2i8_store:
2721 ; SSE41:       # %bb.0:
2722 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
2723 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [127,127]
2724 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
2725 ; SSE41-NEXT:    pxor %xmm3, %xmm0
2726 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [2147483775,2147483775]
2727 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
2728 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
2729 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
2730 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
2731 ; SSE41-NEXT:    pand %xmm5, %xmm0
2732 ; SSE41-NEXT:    por %xmm4, %xmm0
2733 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
2734 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
2735 ; SSE41-NEXT:    pxor %xmm2, %xmm3
2736 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [18446744071562067840,18446744071562067840]
2737 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
2738 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
2739 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
2740 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2741 ; SSE41-NEXT:    pand %xmm4, %xmm0
2742 ; SSE41-NEXT:    por %xmm3, %xmm0
2743 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
2744 ; SSE41-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2745 ; SSE41-NEXT:    pextrw $0, %xmm1, (%rdi)
2746 ; SSE41-NEXT:    retq
2748 ; AVX-LABEL: trunc_ssat_v2i64_v2i8_store:
2749 ; AVX:       # %bb.0:
2750 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [127,127]
2751 ; AVX-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
2752 ; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2753 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
2754 ; AVX-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
2755 ; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2756 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2757 ; AVX-NEXT:    vpextrw $0, %xmm0, (%rdi)
2758 ; AVX-NEXT:    retq
2760 ; AVX512F-LABEL: trunc_ssat_v2i64_v2i8_store:
2761 ; AVX512F:       # %bb.0:
2762 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2763 ; AVX512F-NEXT:    vpmovsqb %zmm0, %xmm0
2764 ; AVX512F-NEXT:    vpextrw $0, %xmm0, (%rdi)
2765 ; AVX512F-NEXT:    vzeroupper
2766 ; AVX512F-NEXT:    retq
2768 ; AVX512VL-LABEL: trunc_ssat_v2i64_v2i8_store:
2769 ; AVX512VL:       # %bb.0:
2770 ; AVX512VL-NEXT:    vpmovsqb %xmm0, (%rdi)
2771 ; AVX512VL-NEXT:    retq
2773 ; AVX512BW-LABEL: trunc_ssat_v2i64_v2i8_store:
2774 ; AVX512BW:       # %bb.0:
2775 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2776 ; AVX512BW-NEXT:    vpmovsqb %zmm0, %xmm0
2777 ; AVX512BW-NEXT:    vpextrw $0, %xmm0, (%rdi)
2778 ; AVX512BW-NEXT:    vzeroupper
2779 ; AVX512BW-NEXT:    retq
2781 ; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i8_store:
2782 ; AVX512BWVL:       # %bb.0:
2783 ; AVX512BWVL-NEXT:    vpmovsqb %xmm0, (%rdi)
2784 ; AVX512BWVL-NEXT:    retq
2786 ; SKX-LABEL: trunc_ssat_v2i64_v2i8_store:
2787 ; SKX:       # %bb.0:
2788 ; SKX-NEXT:    vpmovsqb %xmm0, (%rdi)
2789 ; SKX-NEXT:    retq
2790   %1 = icmp slt <2 x i64> %a0, <i64 127, i64 127>
2791   %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 127, i64 127>
2792   %3 = icmp sgt <2 x i64> %2, <i64 -128, i64 -128>
2793   %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -128, i64 -128>
2794   %5 = trunc <2 x i64> %4 to <2 x i8>
2795   store <2 x i8> %5, <2 x i8> *%p1
2796   ret void
2799 define <4 x i8> @trunc_ssat_v4i64_v4i8(<4 x i64> %a0) {
2800 ; SSE2-LABEL: trunc_ssat_v4i64_v4i8:
2801 ; SSE2:       # %bb.0:
2802 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [127,127]
2803 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
2804 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
2805 ; SSE2-NEXT:    pxor %xmm2, %xmm3
2806 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483775,2147483775]
2807 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
2808 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
2809 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2810 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
2811 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
2812 ; SSE2-NEXT:    pand %xmm7, %xmm4
2813 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
2814 ; SSE2-NEXT:    por %xmm4, %xmm3
2815 ; SSE2-NEXT:    pand %xmm3, %xmm1
2816 ; SSE2-NEXT:    pandn %xmm8, %xmm3
2817 ; SSE2-NEXT:    por %xmm1, %xmm3
2818 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
2819 ; SSE2-NEXT:    pxor %xmm2, %xmm1
2820 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
2821 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
2822 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2823 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm1
2824 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2825 ; SSE2-NEXT:    pand %xmm6, %xmm1
2826 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2827 ; SSE2-NEXT:    por %xmm1, %xmm4
2828 ; SSE2-NEXT:    pand %xmm4, %xmm0
2829 ; SSE2-NEXT:    pandn %xmm8, %xmm4
2830 ; SSE2-NEXT:    por %xmm0, %xmm4
2831 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
2832 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
2833 ; SSE2-NEXT:    pxor %xmm2, %xmm0
2834 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [18446744071562067840,18446744071562067840]
2835 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
2836 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
2837 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2838 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm0
2839 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
2840 ; SSE2-NEXT:    pand %xmm7, %xmm1
2841 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
2842 ; SSE2-NEXT:    por %xmm1, %xmm0
2843 ; SSE2-NEXT:    pand %xmm0, %xmm4
2844 ; SSE2-NEXT:    pandn %xmm8, %xmm0
2845 ; SSE2-NEXT:    por %xmm4, %xmm0
2846 ; SSE2-NEXT:    pxor %xmm3, %xmm2
2847 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
2848 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm1
2849 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
2850 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm2
2851 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2852 ; SSE2-NEXT:    pand %xmm4, %xmm2
2853 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2854 ; SSE2-NEXT:    por %xmm2, %xmm1
2855 ; SSE2-NEXT:    pand %xmm1, %xmm3
2856 ; SSE2-NEXT:    pandn %xmm8, %xmm1
2857 ; SSE2-NEXT:    por %xmm3, %xmm1
2858 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
2859 ; SSE2-NEXT:    pand %xmm2, %xmm1
2860 ; SSE2-NEXT:    pand %xmm2, %xmm0
2861 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
2862 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
2863 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
2864 ; SSE2-NEXT:    retq
2866 ; SSSE3-LABEL: trunc_ssat_v4i64_v4i8:
2867 ; SSSE3:       # %bb.0:
2868 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [127,127]
2869 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
2870 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
2871 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
2872 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147483775,2147483775]
2873 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
2874 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm6
2875 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2876 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm3
2877 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
2878 ; SSSE3-NEXT:    pand %xmm7, %xmm4
2879 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
2880 ; SSSE3-NEXT:    por %xmm4, %xmm3
2881 ; SSSE3-NEXT:    pand %xmm3, %xmm1
2882 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
2883 ; SSSE3-NEXT:    por %xmm1, %xmm3
2884 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
2885 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
2886 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
2887 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
2888 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2889 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm1
2890 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2891 ; SSSE3-NEXT:    pand %xmm6, %xmm1
2892 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2893 ; SSSE3-NEXT:    por %xmm1, %xmm4
2894 ; SSSE3-NEXT:    pand %xmm4, %xmm0
2895 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
2896 ; SSSE3-NEXT:    por %xmm0, %xmm4
2897 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
2898 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
2899 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
2900 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [18446744071562067840,18446744071562067840]
2901 ; SSSE3-NEXT:    movdqa %xmm0, %xmm6
2902 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm6
2903 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2904 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm0
2905 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
2906 ; SSSE3-NEXT:    pand %xmm7, %xmm1
2907 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
2908 ; SSSE3-NEXT:    por %xmm1, %xmm0
2909 ; SSSE3-NEXT:    pand %xmm0, %xmm4
2910 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
2911 ; SSSE3-NEXT:    por %xmm4, %xmm0
2912 ; SSSE3-NEXT:    pxor %xmm3, %xmm2
2913 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
2914 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm1
2915 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
2916 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm2
2917 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2918 ; SSSE3-NEXT:    pand %xmm4, %xmm2
2919 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2920 ; SSSE3-NEXT:    por %xmm2, %xmm1
2921 ; SSSE3-NEXT:    pand %xmm1, %xmm3
2922 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
2923 ; SSSE3-NEXT:    por %xmm3, %xmm1
2924 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2925 ; SSSE3-NEXT:    pshufb %xmm2, %xmm1
2926 ; SSSE3-NEXT:    pshufb %xmm2, %xmm0
2927 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2928 ; SSSE3-NEXT:    retq
2930 ; SSE41-LABEL: trunc_ssat_v4i64_v4i8:
2931 ; SSE41:       # %bb.0:
2932 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
2933 ; SSE41-NEXT:    movapd {{.*#+}} xmm4 = [127,127]
2934 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
2935 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
2936 ; SSE41-NEXT:    pxor %xmm3, %xmm0
2937 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [2147483775,2147483775]
2938 ; SSE41-NEXT:    movdqa %xmm6, %xmm5
2939 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
2940 ; SSE41-NEXT:    movdqa %xmm6, %xmm7
2941 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
2942 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
2943 ; SSE41-NEXT:    pand %xmm5, %xmm0
2944 ; SSE41-NEXT:    por %xmm7, %xmm0
2945 ; SSE41-NEXT:    movapd %xmm4, %xmm5
2946 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
2947 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
2948 ; SSE41-NEXT:    pxor %xmm3, %xmm0
2949 ; SSE41-NEXT:    movdqa %xmm6, %xmm1
2950 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
2951 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
2952 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2953 ; SSE41-NEXT:    pand %xmm1, %xmm0
2954 ; SSE41-NEXT:    por %xmm6, %xmm0
2955 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
2956 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [18446744073709551488,18446744073709551488]
2957 ; SSE41-NEXT:    movapd %xmm4, %xmm1
2958 ; SSE41-NEXT:    xorpd %xmm3, %xmm1
2959 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [18446744071562067840,18446744071562067840]
2960 ; SSE41-NEXT:    movapd %xmm1, %xmm7
2961 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm7
2962 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm1
2963 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
2964 ; SSE41-NEXT:    pand %xmm7, %xmm0
2965 ; SSE41-NEXT:    por %xmm1, %xmm0
2966 ; SSE41-NEXT:    movapd %xmm2, %xmm1
2967 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm1
2968 ; SSE41-NEXT:    xorpd %xmm5, %xmm3
2969 ; SSE41-NEXT:    movapd %xmm3, %xmm4
2970 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm4
2971 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm3
2972 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2973 ; SSE41-NEXT:    pand %xmm4, %xmm0
2974 ; SSE41-NEXT:    por %xmm3, %xmm0
2975 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
2976 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2977 ; SSE41-NEXT:    pshufb %xmm0, %xmm2
2978 ; SSE41-NEXT:    pshufb %xmm0, %xmm1
2979 ; SSE41-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
2980 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
2981 ; SSE41-NEXT:    retq
2983 ; AVX1-LABEL: trunc_ssat_v4i64_v4i8:
2984 ; AVX1:       # %bb.0:
2985 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2986 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [127,127]
2987 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
2988 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm4
2989 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm0, %xmm2, %xmm0
2990 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [18446744073709551488,18446744073709551488]
2991 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm0, %xmm5
2992 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm1, %xmm2, %xmm1
2993 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm1, %xmm2
2994 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm4, %xmm1
2995 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2996 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
2997 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
2998 ; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
2999 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3000 ; AVX1-NEXT:    vzeroupper
3001 ; AVX1-NEXT:    retq
3003 ; AVX2-LABEL: trunc_ssat_v4i64_v4i8:
3004 ; AVX2:       # %bb.0:
3005 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [127,127,127,127]
3006 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
3007 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
3008 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
3009 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
3010 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
3011 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
3012 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
3013 ; AVX2-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
3014 ; AVX2-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
3015 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3016 ; AVX2-NEXT:    vzeroupper
3017 ; AVX2-NEXT:    retq
3019 ; AVX512F-LABEL: trunc_ssat_v4i64_v4i8:
3020 ; AVX512F:       # %bb.0:
3021 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
3022 ; AVX512F-NEXT:    vpmovsqb %zmm0, %xmm0
3023 ; AVX512F-NEXT:    vzeroupper
3024 ; AVX512F-NEXT:    retq
3026 ; AVX512VL-LABEL: trunc_ssat_v4i64_v4i8:
3027 ; AVX512VL:       # %bb.0:
3028 ; AVX512VL-NEXT:    vpmovsqb %ymm0, %xmm0
3029 ; AVX512VL-NEXT:    vzeroupper
3030 ; AVX512VL-NEXT:    retq
3032 ; AVX512BW-LABEL: trunc_ssat_v4i64_v4i8:
3033 ; AVX512BW:       # %bb.0:
3034 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
3035 ; AVX512BW-NEXT:    vpmovsqb %zmm0, %xmm0
3036 ; AVX512BW-NEXT:    vzeroupper
3037 ; AVX512BW-NEXT:    retq
3039 ; AVX512BWVL-LABEL: trunc_ssat_v4i64_v4i8:
3040 ; AVX512BWVL:       # %bb.0:
3041 ; AVX512BWVL-NEXT:    vpmovsqb %ymm0, %xmm0
3042 ; AVX512BWVL-NEXT:    vzeroupper
3043 ; AVX512BWVL-NEXT:    retq
3045 ; SKX-LABEL: trunc_ssat_v4i64_v4i8:
3046 ; SKX:       # %bb.0:
3047 ; SKX-NEXT:    vpmovsqb %ymm0, %xmm0
3048 ; SKX-NEXT:    vzeroupper
3049 ; SKX-NEXT:    retq
3050   %1 = icmp slt <4 x i64> %a0, <i64 127, i64 127, i64 127, i64 127>
3051   %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 127, i64 127, i64 127, i64 127>
3052   %3 = icmp sgt <4 x i64> %2, <i64 -128, i64 -128, i64 -128, i64 -128>
3053   %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> <i64 -128, i64 -128, i64 -128, i64 -128>
3054   %5 = trunc <4 x i64> %4 to <4 x i8>
3055   ret <4 x i8> %5
3058 define void @trunc_ssat_v4i64_v4i8_store(<4 x i64> %a0, <4 x i8> *%p1) {
3059 ; SSE2-LABEL: trunc_ssat_v4i64_v4i8_store:
3060 ; SSE2:       # %bb.0:
3061 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [127,127]
3062 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
3063 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
3064 ; SSE2-NEXT:    pxor %xmm2, %xmm3
3065 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483775,2147483775]
3066 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
3067 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
3068 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
3069 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
3070 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
3071 ; SSE2-NEXT:    pand %xmm7, %xmm4
3072 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
3073 ; SSE2-NEXT:    por %xmm4, %xmm3
3074 ; SSE2-NEXT:    pand %xmm3, %xmm1
3075 ; SSE2-NEXT:    pandn %xmm8, %xmm3
3076 ; SSE2-NEXT:    por %xmm1, %xmm3
3077 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
3078 ; SSE2-NEXT:    pxor %xmm2, %xmm1
3079 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
3080 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
3081 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
3082 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm1
3083 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3084 ; SSE2-NEXT:    pand %xmm6, %xmm1
3085 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3086 ; SSE2-NEXT:    por %xmm1, %xmm4
3087 ; SSE2-NEXT:    pand %xmm4, %xmm0
3088 ; SSE2-NEXT:    pandn %xmm8, %xmm4
3089 ; SSE2-NEXT:    por %xmm0, %xmm4
3090 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
3091 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
3092 ; SSE2-NEXT:    pxor %xmm2, %xmm0
3093 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [18446744071562067840,18446744071562067840]
3094 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
3095 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
3096 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
3097 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm0
3098 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
3099 ; SSE2-NEXT:    pand %xmm7, %xmm1
3100 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
3101 ; SSE2-NEXT:    por %xmm1, %xmm0
3102 ; SSE2-NEXT:    pand %xmm0, %xmm4
3103 ; SSE2-NEXT:    pandn %xmm8, %xmm0
3104 ; SSE2-NEXT:    por %xmm4, %xmm0
3105 ; SSE2-NEXT:    pxor %xmm3, %xmm2
3106 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
3107 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm1
3108 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
3109 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm2
3110 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3111 ; SSE2-NEXT:    pand %xmm4, %xmm2
3112 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3113 ; SSE2-NEXT:    por %xmm2, %xmm1
3114 ; SSE2-NEXT:    pand %xmm1, %xmm3
3115 ; SSE2-NEXT:    pandn %xmm8, %xmm1
3116 ; SSE2-NEXT:    por %xmm3, %xmm1
3117 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
3118 ; SSE2-NEXT:    pand %xmm2, %xmm1
3119 ; SSE2-NEXT:    pand %xmm2, %xmm0
3120 ; SSE2-NEXT:    packuswb %xmm1, %xmm0
3121 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
3122 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
3123 ; SSE2-NEXT:    movd %xmm0, (%rdi)
3124 ; SSE2-NEXT:    retq
3126 ; SSSE3-LABEL: trunc_ssat_v4i64_v4i8_store:
3127 ; SSSE3:       # %bb.0:
3128 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [127,127]
3129 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
3130 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
3131 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
3132 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [2147483775,2147483775]
3133 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
3134 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm6
3135 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
3136 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm3
3137 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
3138 ; SSSE3-NEXT:    pand %xmm7, %xmm4
3139 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
3140 ; SSSE3-NEXT:    por %xmm4, %xmm3
3141 ; SSSE3-NEXT:    pand %xmm3, %xmm1
3142 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
3143 ; SSSE3-NEXT:    por %xmm1, %xmm3
3144 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
3145 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
3146 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
3147 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
3148 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
3149 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm1
3150 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3151 ; SSSE3-NEXT:    pand %xmm6, %xmm1
3152 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3153 ; SSSE3-NEXT:    por %xmm1, %xmm4
3154 ; SSSE3-NEXT:    pand %xmm4, %xmm0
3155 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
3156 ; SSSE3-NEXT:    por %xmm0, %xmm4
3157 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
3158 ; SSSE3-NEXT:    movdqa %xmm4, %xmm1
3159 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
3160 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [18446744071562067840,18446744071562067840]
3161 ; SSSE3-NEXT:    movdqa %xmm1, %xmm6
3162 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm6
3163 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
3164 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm1
3165 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
3166 ; SSSE3-NEXT:    pand %xmm7, %xmm0
3167 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
3168 ; SSSE3-NEXT:    por %xmm0, %xmm1
3169 ; SSSE3-NEXT:    pand %xmm1, %xmm4
3170 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
3171 ; SSSE3-NEXT:    por %xmm4, %xmm1
3172 ; SSSE3-NEXT:    pxor %xmm3, %xmm2
3173 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
3174 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm0
3175 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
3176 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm2
3177 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3178 ; SSSE3-NEXT:    pand %xmm4, %xmm2
3179 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3180 ; SSSE3-NEXT:    por %xmm2, %xmm0
3181 ; SSSE3-NEXT:    pand %xmm0, %xmm3
3182 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
3183 ; SSSE3-NEXT:    por %xmm3, %xmm0
3184 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
3185 ; SSSE3-NEXT:    pshufb %xmm2, %xmm0
3186 ; SSSE3-NEXT:    pshufb %xmm2, %xmm1
3187 ; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3188 ; SSSE3-NEXT:    movd %xmm1, (%rdi)
3189 ; SSSE3-NEXT:    retq
3191 ; SSE41-LABEL: trunc_ssat_v4i64_v4i8_store:
3192 ; SSE41:       # %bb.0:
3193 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
3194 ; SSE41-NEXT:    movapd {{.*#+}} xmm4 = [127,127]
3195 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
3196 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
3197 ; SSE41-NEXT:    pxor %xmm3, %xmm0
3198 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [2147483775,2147483775]
3199 ; SSE41-NEXT:    movdqa %xmm6, %xmm5
3200 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
3201 ; SSE41-NEXT:    movdqa %xmm6, %xmm7
3202 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
3203 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
3204 ; SSE41-NEXT:    pand %xmm5, %xmm0
3205 ; SSE41-NEXT:    por %xmm7, %xmm0
3206 ; SSE41-NEXT:    movapd %xmm4, %xmm5
3207 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
3208 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
3209 ; SSE41-NEXT:    pxor %xmm3, %xmm0
3210 ; SSE41-NEXT:    movdqa %xmm6, %xmm1
3211 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
3212 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
3213 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3214 ; SSE41-NEXT:    pand %xmm1, %xmm0
3215 ; SSE41-NEXT:    por %xmm6, %xmm0
3216 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
3217 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
3218 ; SSE41-NEXT:    movapd %xmm4, %xmm2
3219 ; SSE41-NEXT:    xorpd %xmm3, %xmm2
3220 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [18446744071562067840,18446744071562067840]
3221 ; SSE41-NEXT:    movapd %xmm2, %xmm7
3222 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm7
3223 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm2
3224 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
3225 ; SSE41-NEXT:    pand %xmm7, %xmm0
3226 ; SSE41-NEXT:    por %xmm2, %xmm0
3227 ; SSE41-NEXT:    movapd %xmm1, %xmm2
3228 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
3229 ; SSE41-NEXT:    xorpd %xmm5, %xmm3
3230 ; SSE41-NEXT:    movapd %xmm3, %xmm4
3231 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm4
3232 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm3
3233 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
3234 ; SSE41-NEXT:    pand %xmm4, %xmm0
3235 ; SSE41-NEXT:    por %xmm3, %xmm0
3236 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
3237 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
3238 ; SSE41-NEXT:    pshufb %xmm0, %xmm1
3239 ; SSE41-NEXT:    pshufb %xmm0, %xmm2
3240 ; SSE41-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
3241 ; SSE41-NEXT:    movd %xmm2, (%rdi)
3242 ; SSE41-NEXT:    retq
3244 ; AVX1-LABEL: trunc_ssat_v4i64_v4i8_store:
3245 ; AVX1:       # %bb.0:
3246 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
3247 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [127,127]
3248 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
3249 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm4
3250 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm0, %xmm2, %xmm0
3251 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [18446744073709551488,18446744073709551488]
3252 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm0, %xmm5
3253 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm1, %xmm2, %xmm1
3254 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm1, %xmm2
3255 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm4, %xmm1
3256 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
3257 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
3258 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
3259 ; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
3260 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3261 ; AVX1-NEXT:    vmovd %xmm0, (%rdi)
3262 ; AVX1-NEXT:    vzeroupper
3263 ; AVX1-NEXT:    retq
3265 ; AVX2-LABEL: trunc_ssat_v4i64_v4i8_store:
3266 ; AVX2:       # %bb.0:
3267 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [127,127,127,127]
3268 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
3269 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
3270 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
3271 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
3272 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
3273 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
3274 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
3275 ; AVX2-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
3276 ; AVX2-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
3277 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3278 ; AVX2-NEXT:    vmovd %xmm0, (%rdi)
3279 ; AVX2-NEXT:    vzeroupper
3280 ; AVX2-NEXT:    retq
3282 ; AVX512F-LABEL: trunc_ssat_v4i64_v4i8_store:
3283 ; AVX512F:       # %bb.0:
3284 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
3285 ; AVX512F-NEXT:    vpmovsqb %zmm0, %xmm0
3286 ; AVX512F-NEXT:    vmovd %xmm0, (%rdi)
3287 ; AVX512F-NEXT:    vzeroupper
3288 ; AVX512F-NEXT:    retq
3290 ; AVX512VL-LABEL: trunc_ssat_v4i64_v4i8_store:
3291 ; AVX512VL:       # %bb.0:
3292 ; AVX512VL-NEXT:    vpmovsqb %ymm0, (%rdi)
3293 ; AVX512VL-NEXT:    vzeroupper
3294 ; AVX512VL-NEXT:    retq
3296 ; AVX512BW-LABEL: trunc_ssat_v4i64_v4i8_store:
3297 ; AVX512BW:       # %bb.0:
3298 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
3299 ; AVX512BW-NEXT:    vpmovsqb %zmm0, %xmm0
3300 ; AVX512BW-NEXT:    vmovd %xmm0, (%rdi)
3301 ; AVX512BW-NEXT:    vzeroupper
3302 ; AVX512BW-NEXT:    retq
3304 ; AVX512BWVL-LABEL: trunc_ssat_v4i64_v4i8_store:
3305 ; AVX512BWVL:       # %bb.0:
3306 ; AVX512BWVL-NEXT:    vpmovsqb %ymm0, (%rdi)
3307 ; AVX512BWVL-NEXT:    vzeroupper
3308 ; AVX512BWVL-NEXT:    retq
3310 ; SKX-LABEL: trunc_ssat_v4i64_v4i8_store:
3311 ; SKX:       # %bb.0:
3312 ; SKX-NEXT:    vpmovsqb %ymm0, (%rdi)
3313 ; SKX-NEXT:    vzeroupper
3314 ; SKX-NEXT:    retq
3315   %1 = icmp slt <4 x i64> %a0, <i64 127, i64 127, i64 127, i64 127>
3316   %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 127, i64 127, i64 127, i64 127>
3317   %3 = icmp sgt <4 x i64> %2, <i64 -128, i64 -128, i64 -128, i64 -128>
3318   %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> <i64 -128, i64 -128, i64 -128, i64 -128>
3319   %5 = trunc <4 x i64> %4 to <4 x i8>
3320   store <4 x i8> %5, <4 x i8> *%p1
3321   ret void
3324 define <8 x i8> @trunc_ssat_v8i64_v8i8(<8 x i64>* %p0) "min-legal-vector-width"="256" {
3325 ; SSE2-LABEL: trunc_ssat_v8i64_v8i8:
3326 ; SSE2:       # %bb.0:
3327 ; SSE2-NEXT:    movdqa (%rdi), %xmm9
3328 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm7
3329 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm5
3330 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm3
3331 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [127,127]
3332 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
3333 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
3334 ; SSE2-NEXT:    pxor %xmm1, %xmm2
3335 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147483775,2147483775]
3336 ; SSE2-NEXT:    movdqa %xmm10, %xmm6
3337 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
3338 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3339 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm2
3340 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
3341 ; SSE2-NEXT:    pand %xmm0, %xmm4
3342 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
3343 ; SSE2-NEXT:    por %xmm4, %xmm2
3344 ; SSE2-NEXT:    pand %xmm2, %xmm3
3345 ; SSE2-NEXT:    pandn %xmm8, %xmm2
3346 ; SSE2-NEXT:    por %xmm3, %xmm2
3347 ; SSE2-NEXT:    movdqa %xmm5, %xmm0
3348 ; SSE2-NEXT:    pxor %xmm1, %xmm0
3349 ; SSE2-NEXT:    movdqa %xmm10, %xmm3
3350 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
3351 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
3352 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
3353 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3354 ; SSE2-NEXT:    pand %xmm4, %xmm0
3355 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3356 ; SSE2-NEXT:    por %xmm0, %xmm3
3357 ; SSE2-NEXT:    pand %xmm3, %xmm5
3358 ; SSE2-NEXT:    pandn %xmm8, %xmm3
3359 ; SSE2-NEXT:    por %xmm5, %xmm3
3360 ; SSE2-NEXT:    movdqa %xmm7, %xmm0
3361 ; SSE2-NEXT:    pxor %xmm1, %xmm0
3362 ; SSE2-NEXT:    movdqa %xmm10, %xmm4
3363 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
3364 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
3365 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
3366 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3367 ; SSE2-NEXT:    pand %xmm5, %xmm0
3368 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
3369 ; SSE2-NEXT:    por %xmm0, %xmm5
3370 ; SSE2-NEXT:    pand %xmm5, %xmm7
3371 ; SSE2-NEXT:    pandn %xmm8, %xmm5
3372 ; SSE2-NEXT:    por %xmm7, %xmm5
3373 ; SSE2-NEXT:    movdqa %xmm9, %xmm0
3374 ; SSE2-NEXT:    pxor %xmm1, %xmm0
3375 ; SSE2-NEXT:    movdqa %xmm10, %xmm4
3376 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
3377 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
3378 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
3379 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3380 ; SSE2-NEXT:    pand %xmm6, %xmm0
3381 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
3382 ; SSE2-NEXT:    por %xmm0, %xmm7
3383 ; SSE2-NEXT:    pand %xmm7, %xmm9
3384 ; SSE2-NEXT:    pandn %xmm8, %xmm7
3385 ; SSE2-NEXT:    por %xmm9, %xmm7
3386 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
3387 ; SSE2-NEXT:    movdqa %xmm7, %xmm0
3388 ; SSE2-NEXT:    pxor %xmm1, %xmm0
3389 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [18446744071562067840,18446744071562067840]
3390 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
3391 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm4
3392 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
3393 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
3394 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
3395 ; SSE2-NEXT:    pand %xmm10, %xmm6
3396 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
3397 ; SSE2-NEXT:    por %xmm6, %xmm0
3398 ; SSE2-NEXT:    pand %xmm0, %xmm7
3399 ; SSE2-NEXT:    pandn %xmm8, %xmm0
3400 ; SSE2-NEXT:    por %xmm7, %xmm0
3401 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
3402 ; SSE2-NEXT:    pxor %xmm1, %xmm4
3403 ; SSE2-NEXT:    movdqa %xmm4, %xmm6
3404 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm6
3405 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
3406 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
3407 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3408 ; SSE2-NEXT:    pand %xmm7, %xmm4
3409 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
3410 ; SSE2-NEXT:    por %xmm4, %xmm7
3411 ; SSE2-NEXT:    pand %xmm7, %xmm5
3412 ; SSE2-NEXT:    pandn %xmm8, %xmm7
3413 ; SSE2-NEXT:    por %xmm5, %xmm7
3414 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
3415 ; SSE2-NEXT:    pxor %xmm1, %xmm4
3416 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
3417 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm5
3418 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
3419 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
3420 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3421 ; SSE2-NEXT:    pand %xmm6, %xmm4
3422 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
3423 ; SSE2-NEXT:    por %xmm4, %xmm5
3424 ; SSE2-NEXT:    pand %xmm5, %xmm3
3425 ; SSE2-NEXT:    pandn %xmm8, %xmm5
3426 ; SSE2-NEXT:    por %xmm3, %xmm5
3427 ; SSE2-NEXT:    pxor %xmm2, %xmm1
3428 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
3429 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm3
3430 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
3431 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
3432 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3433 ; SSE2-NEXT:    pand %xmm4, %xmm1
3434 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3435 ; SSE2-NEXT:    por %xmm1, %xmm3
3436 ; SSE2-NEXT:    pand %xmm3, %xmm2
3437 ; SSE2-NEXT:    pandn %xmm8, %xmm3
3438 ; SSE2-NEXT:    por %xmm2, %xmm3
3439 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
3440 ; SSE2-NEXT:    pand %xmm1, %xmm3
3441 ; SSE2-NEXT:    pand %xmm1, %xmm5
3442 ; SSE2-NEXT:    packuswb %xmm3, %xmm5
3443 ; SSE2-NEXT:    pand %xmm1, %xmm7
3444 ; SSE2-NEXT:    pand %xmm1, %xmm0
3445 ; SSE2-NEXT:    packuswb %xmm7, %xmm0
3446 ; SSE2-NEXT:    packuswb %xmm5, %xmm0
3447 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
3448 ; SSE2-NEXT:    retq
3450 ; SSSE3-LABEL: trunc_ssat_v8i64_v8i8:
3451 ; SSSE3:       # %bb.0:
3452 ; SSSE3-NEXT:    movdqa (%rdi), %xmm9
3453 ; SSSE3-NEXT:    movdqa 16(%rdi), %xmm7
3454 ; SSSE3-NEXT:    movdqa 32(%rdi), %xmm5
3455 ; SSSE3-NEXT:    movdqa 48(%rdi), %xmm3
3456 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [127,127]
3457 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
3458 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
3459 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
3460 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [2147483775,2147483775]
3461 ; SSSE3-NEXT:    movdqa %xmm10, %xmm6
3462 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm6
3463 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3464 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm2
3465 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
3466 ; SSSE3-NEXT:    pand %xmm0, %xmm4
3467 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
3468 ; SSSE3-NEXT:    por %xmm4, %xmm2
3469 ; SSSE3-NEXT:    pand %xmm2, %xmm3
3470 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
3471 ; SSSE3-NEXT:    por %xmm3, %xmm2
3472 ; SSSE3-NEXT:    movdqa %xmm5, %xmm0
3473 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
3474 ; SSSE3-NEXT:    movdqa %xmm10, %xmm3
3475 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm3
3476 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
3477 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm0
3478 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3479 ; SSSE3-NEXT:    pand %xmm4, %xmm0
3480 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3481 ; SSSE3-NEXT:    por %xmm0, %xmm3
3482 ; SSSE3-NEXT:    pand %xmm3, %xmm5
3483 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
3484 ; SSSE3-NEXT:    por %xmm5, %xmm3
3485 ; SSSE3-NEXT:    movdqa %xmm7, %xmm0
3486 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
3487 ; SSSE3-NEXT:    movdqa %xmm10, %xmm4
3488 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm4
3489 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
3490 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm0
3491 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3492 ; SSSE3-NEXT:    pand %xmm5, %xmm0
3493 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
3494 ; SSSE3-NEXT:    por %xmm0, %xmm5
3495 ; SSSE3-NEXT:    pand %xmm5, %xmm7
3496 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
3497 ; SSSE3-NEXT:    por %xmm7, %xmm5
3498 ; SSSE3-NEXT:    movdqa %xmm9, %xmm0
3499 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
3500 ; SSSE3-NEXT:    movdqa %xmm10, %xmm4
3501 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm4
3502 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
3503 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm0
3504 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3505 ; SSSE3-NEXT:    pand %xmm6, %xmm0
3506 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
3507 ; SSSE3-NEXT:    por %xmm0, %xmm7
3508 ; SSSE3-NEXT:    pand %xmm7, %xmm9
3509 ; SSSE3-NEXT:    pandn %xmm8, %xmm7
3510 ; SSSE3-NEXT:    por %xmm9, %xmm7
3511 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
3512 ; SSSE3-NEXT:    movdqa %xmm7, %xmm0
3513 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
3514 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [18446744071562067840,18446744071562067840]
3515 ; SSSE3-NEXT:    movdqa %xmm0, %xmm4
3516 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm4
3517 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
3518 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
3519 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
3520 ; SSSE3-NEXT:    pand %xmm10, %xmm6
3521 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
3522 ; SSSE3-NEXT:    por %xmm6, %xmm0
3523 ; SSSE3-NEXT:    pand %xmm0, %xmm7
3524 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
3525 ; SSSE3-NEXT:    por %xmm7, %xmm0
3526 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
3527 ; SSSE3-NEXT:    pxor %xmm1, %xmm4
3528 ; SSSE3-NEXT:    movdqa %xmm4, %xmm6
3529 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm6
3530 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
3531 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
3532 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3533 ; SSSE3-NEXT:    pand %xmm7, %xmm4
3534 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
3535 ; SSSE3-NEXT:    por %xmm4, %xmm7
3536 ; SSSE3-NEXT:    pand %xmm7, %xmm5
3537 ; SSSE3-NEXT:    pandn %xmm8, %xmm7
3538 ; SSSE3-NEXT:    por %xmm5, %xmm7
3539 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
3540 ; SSSE3-NEXT:    pxor %xmm1, %xmm4
3541 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
3542 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm5
3543 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
3544 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
3545 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3546 ; SSSE3-NEXT:    pand %xmm6, %xmm4
3547 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
3548 ; SSSE3-NEXT:    por %xmm4, %xmm5
3549 ; SSSE3-NEXT:    pand %xmm5, %xmm3
3550 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
3551 ; SSSE3-NEXT:    por %xmm3, %xmm5
3552 ; SSSE3-NEXT:    pxor %xmm2, %xmm1
3553 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
3554 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm3
3555 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
3556 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
3557 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3558 ; SSSE3-NEXT:    pand %xmm4, %xmm1
3559 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3560 ; SSSE3-NEXT:    por %xmm1, %xmm3
3561 ; SSSE3-NEXT:    pand %xmm3, %xmm2
3562 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
3563 ; SSSE3-NEXT:    por %xmm2, %xmm3
3564 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
3565 ; SSSE3-NEXT:    pand %xmm1, %xmm3
3566 ; SSSE3-NEXT:    pand %xmm1, %xmm5
3567 ; SSSE3-NEXT:    packuswb %xmm3, %xmm5
3568 ; SSSE3-NEXT:    pand %xmm1, %xmm7
3569 ; SSSE3-NEXT:    pand %xmm1, %xmm0
3570 ; SSSE3-NEXT:    packuswb %xmm7, %xmm0
3571 ; SSSE3-NEXT:    packuswb %xmm5, %xmm0
3572 ; SSSE3-NEXT:    packuswb %xmm0, %xmm0
3573 ; SSSE3-NEXT:    retq
3575 ; SSE41-LABEL: trunc_ssat_v8i64_v8i8:
3576 ; SSE41:       # %bb.0:
3577 ; SSE41-NEXT:    movdqa (%rdi), %xmm9
3578 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm10
3579 ; SSE41-NEXT:    movdqa 32(%rdi), %xmm3
3580 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm5
3581 ; SSE41-NEXT:    movapd {{.*#+}} xmm4 = [127,127]
3582 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
3583 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
3584 ; SSE41-NEXT:    pxor %xmm2, %xmm0
3585 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [2147483775,2147483775]
3586 ; SSE41-NEXT:    movdqa %xmm1, %xmm7
3587 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm7
3588 ; SSE41-NEXT:    movdqa %xmm1, %xmm6
3589 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
3590 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3591 ; SSE41-NEXT:    pand %xmm7, %xmm0
3592 ; SSE41-NEXT:    por %xmm6, %xmm0
3593 ; SSE41-NEXT:    movapd %xmm4, %xmm8
3594 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm8
3595 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
3596 ; SSE41-NEXT:    pxor %xmm2, %xmm0
3597 ; SSE41-NEXT:    movdqa %xmm1, %xmm5
3598 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
3599 ; SSE41-NEXT:    movdqa %xmm1, %xmm6
3600 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
3601 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3602 ; SSE41-NEXT:    pand %xmm5, %xmm0
3603 ; SSE41-NEXT:    por %xmm6, %xmm0
3604 ; SSE41-NEXT:    movapd %xmm4, %xmm11
3605 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm11
3606 ; SSE41-NEXT:    movdqa %xmm10, %xmm0
3607 ; SSE41-NEXT:    pxor %xmm2, %xmm0
3608 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
3609 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
3610 ; SSE41-NEXT:    movdqa %xmm1, %xmm6
3611 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
3612 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3613 ; SSE41-NEXT:    pand %xmm3, %xmm0
3614 ; SSE41-NEXT:    por %xmm6, %xmm0
3615 ; SSE41-NEXT:    movapd %xmm4, %xmm3
3616 ; SSE41-NEXT:    blendvpd %xmm0, %xmm10, %xmm3
3617 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
3618 ; SSE41-NEXT:    pxor %xmm2, %xmm0
3619 ; SSE41-NEXT:    movdqa %xmm1, %xmm6
3620 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
3621 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
3622 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
3623 ; SSE41-NEXT:    pand %xmm6, %xmm0
3624 ; SSE41-NEXT:    por %xmm1, %xmm0
3625 ; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm4
3626 ; SSE41-NEXT:    movapd {{.*#+}} xmm6 = [18446744073709551488,18446744073709551488]
3627 ; SSE41-NEXT:    movapd %xmm4, %xmm1
3628 ; SSE41-NEXT:    xorpd %xmm2, %xmm1
3629 ; SSE41-NEXT:    movdqa {{.*#+}} xmm7 = [18446744071562067840,18446744071562067840]
3630 ; SSE41-NEXT:    movapd %xmm1, %xmm5
3631 ; SSE41-NEXT:    pcmpeqd %xmm7, %xmm5
3632 ; SSE41-NEXT:    pcmpgtd %xmm7, %xmm1
3633 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
3634 ; SSE41-NEXT:    pand %xmm5, %xmm0
3635 ; SSE41-NEXT:    por %xmm1, %xmm0
3636 ; SSE41-NEXT:    movapd %xmm6, %xmm1
3637 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm1
3638 ; SSE41-NEXT:    movapd %xmm3, %xmm4
3639 ; SSE41-NEXT:    xorpd %xmm2, %xmm4
3640 ; SSE41-NEXT:    movapd %xmm4, %xmm5
3641 ; SSE41-NEXT:    pcmpeqd %xmm7, %xmm5
3642 ; SSE41-NEXT:    pcmpgtd %xmm7, %xmm4
3643 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
3644 ; SSE41-NEXT:    pand %xmm5, %xmm0
3645 ; SSE41-NEXT:    por %xmm4, %xmm0
3646 ; SSE41-NEXT:    movapd %xmm6, %xmm4
3647 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm4
3648 ; SSE41-NEXT:    movapd %xmm11, %xmm3
3649 ; SSE41-NEXT:    xorpd %xmm2, %xmm3
3650 ; SSE41-NEXT:    movapd %xmm3, %xmm5
3651 ; SSE41-NEXT:    pcmpeqd %xmm7, %xmm5
3652 ; SSE41-NEXT:    pcmpgtd %xmm7, %xmm3
3653 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
3654 ; SSE41-NEXT:    pand %xmm5, %xmm0
3655 ; SSE41-NEXT:    por %xmm3, %xmm0
3656 ; SSE41-NEXT:    movapd %xmm6, %xmm3
3657 ; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm3
3658 ; SSE41-NEXT:    xorpd %xmm8, %xmm2
3659 ; SSE41-NEXT:    movapd %xmm2, %xmm5
3660 ; SSE41-NEXT:    pcmpeqd %xmm7, %xmm5
3661 ; SSE41-NEXT:    pcmpgtd %xmm7, %xmm2
3662 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
3663 ; SSE41-NEXT:    pand %xmm5, %xmm0
3664 ; SSE41-NEXT:    por %xmm2, %xmm0
3665 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm6
3666 ; SSE41-NEXT:    movapd {{.*#+}} xmm0 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
3667 ; SSE41-NEXT:    andpd %xmm0, %xmm6
3668 ; SSE41-NEXT:    andpd %xmm0, %xmm3
3669 ; SSE41-NEXT:    packusdw %xmm6, %xmm3
3670 ; SSE41-NEXT:    andpd %xmm0, %xmm4
3671 ; SSE41-NEXT:    andpd %xmm0, %xmm1
3672 ; SSE41-NEXT:    packusdw %xmm4, %xmm1
3673 ; SSE41-NEXT:    packusdw %xmm3, %xmm1
3674 ; SSE41-NEXT:    packuswb %xmm1, %xmm1
3675 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
3676 ; SSE41-NEXT:    retq
3678 ; AVX1-LABEL: trunc_ssat_v8i64_v8i8:
3679 ; AVX1:       # %bb.0:
3680 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm9 = [127,127,127,127]
3681 ; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm1
3682 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [127,127]
3683 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
3684 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm4
3685 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm5
3686 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm6
3687 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm2, %xmm7
3688 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm7, %ymm8
3689 ; AVX1-NEXT:    vblendvpd %ymm8, 32(%rdi), %ymm9, %ymm8
3690 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm2, %xmm0
3691 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm2, %xmm10
3692 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm10, %ymm11
3693 ; AVX1-NEXT:    vblendvpd %ymm11, (%rdi), %ymm9, %ymm9
3694 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm11 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
3695 ; AVX1-NEXT:    vblendvpd %xmm0, %xmm5, %xmm2, %xmm0
3696 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [18446744073709551488,18446744073709551488]
3697 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm0, %xmm0
3698 ; AVX1-NEXT:    vblendvpd %xmm10, %xmm4, %xmm2, %xmm4
3699 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm4, %xmm4
3700 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm4, %ymm0
3701 ; AVX1-NEXT:    vblendvpd %ymm0, %ymm9, %ymm11, %ymm0
3702 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm1, %xmm2, %xmm1
3703 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm1, %xmm1
3704 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm6, %xmm2, %xmm2
3705 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm2, %xmm2
3706 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
3707 ; AVX1-NEXT:    vblendvpd %ymm1, %ymm8, %ymm11, %ymm1
3708 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm2 = [255,255,255,255]
3709 ; AVX1-NEXT:    vandpd %ymm2, %ymm1, %ymm1
3710 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
3711 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
3712 ; AVX1-NEXT:    vandpd %ymm2, %ymm0, %ymm0
3713 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
3714 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
3715 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
3716 ; AVX1-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
3717 ; AVX1-NEXT:    vzeroupper
3718 ; AVX1-NEXT:    retq
3720 ; AVX2-LABEL: trunc_ssat_v8i64_v8i8:
3721 ; AVX2:       # %bb.0:
3722 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
3723 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
3724 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [127,127,127,127]
3725 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
3726 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
3727 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
3728 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
3729 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
3730 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
3731 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
3732 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm3
3733 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
3734 ; AVX2-NEXT:    vextractf128 $1, %ymm1, %xmm2
3735 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = <u,u,0,8,u,u,u,u,u,u,u,u,u,u,u,u>
3736 ; AVX2-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
3737 ; AVX2-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
3738 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
3739 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm2
3740 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
3741 ; AVX2-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
3742 ; AVX2-NEXT:    vpshufb %xmm3, %xmm0, %xmm0
3743 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
3744 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
3745 ; AVX2-NEXT:    vzeroupper
3746 ; AVX2-NEXT:    retq
3748 ; AVX512-LABEL: trunc_ssat_v8i64_v8i8:
3749 ; AVX512:       # %bb.0:
3750 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
3751 ; AVX512-NEXT:    vpmovsqb %zmm0, %xmm0
3752 ; AVX512-NEXT:    vzeroupper
3753 ; AVX512-NEXT:    retq
3755 ; SKX-LABEL: trunc_ssat_v8i64_v8i8:
3756 ; SKX:       # %bb.0:
3757 ; SKX-NEXT:    vmovdqa (%rdi), %ymm0
3758 ; SKX-NEXT:    vmovdqa 32(%rdi), %ymm1
3759 ; SKX-NEXT:    vpmovsqb %ymm1, %xmm1
3760 ; SKX-NEXT:    vpmovsqb %ymm0, %xmm0
3761 ; SKX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3762 ; SKX-NEXT:    vzeroupper
3763 ; SKX-NEXT:    retq
3764   %a0 = load <8 x i64>, <8 x i64>* %p0
3765   %1 = icmp slt <8 x i64> %a0, <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>
3766   %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>
3767   %3 = icmp sgt <8 x i64> %2, <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>
3768   %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>
3769   %5 = trunc <8 x i64> %4 to <8 x i8>
3770   ret <8 x i8> %5
3773 ; TODO: The AVX1 codegen shows a missed opportunity to narrow blendv+logic to 128-bit.
3775 define void @trunc_ssat_v8i64_v8i8_store(<8 x i64>* %p0, <8 x i8> *%p1) "min-legal-vector-width"="256" {
3776 ; SSE2-LABEL: trunc_ssat_v8i64_v8i8_store:
3777 ; SSE2:       # %bb.0:
3778 ; SSE2-NEXT:    movdqa (%rdi), %xmm9
3779 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm7
3780 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm5
3781 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm2
3782 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [127,127]
3783 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
3784 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
3785 ; SSE2-NEXT:    pxor %xmm0, %xmm1
3786 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147483775,2147483775]
3787 ; SSE2-NEXT:    movdqa %xmm10, %xmm6
3788 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm6
3789 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[0,0,2,2]
3790 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
3791 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
3792 ; SSE2-NEXT:    pand %xmm3, %xmm4
3793 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
3794 ; SSE2-NEXT:    por %xmm4, %xmm1
3795 ; SSE2-NEXT:    pand %xmm1, %xmm2
3796 ; SSE2-NEXT:    pandn %xmm8, %xmm1
3797 ; SSE2-NEXT:    por %xmm2, %xmm1
3798 ; SSE2-NEXT:    movdqa %xmm5, %xmm2
3799 ; SSE2-NEXT:    pxor %xmm0, %xmm2
3800 ; SSE2-NEXT:    movdqa %xmm10, %xmm3
3801 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
3802 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
3803 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm2
3804 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[1,1,3,3]
3805 ; SSE2-NEXT:    pand %xmm4, %xmm6
3806 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
3807 ; SSE2-NEXT:    por %xmm6, %xmm2
3808 ; SSE2-NEXT:    pand %xmm2, %xmm5
3809 ; SSE2-NEXT:    pandn %xmm8, %xmm2
3810 ; SSE2-NEXT:    por %xmm5, %xmm2
3811 ; SSE2-NEXT:    movdqa %xmm7, %xmm3
3812 ; SSE2-NEXT:    pxor %xmm0, %xmm3
3813 ; SSE2-NEXT:    movdqa %xmm10, %xmm4
3814 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
3815 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
3816 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm3
3817 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3818 ; SSE2-NEXT:    pand %xmm5, %xmm3
3819 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
3820 ; SSE2-NEXT:    por %xmm3, %xmm5
3821 ; SSE2-NEXT:    pand %xmm5, %xmm7
3822 ; SSE2-NEXT:    pandn %xmm8, %xmm5
3823 ; SSE2-NEXT:    por %xmm7, %xmm5
3824 ; SSE2-NEXT:    movdqa %xmm9, %xmm3
3825 ; SSE2-NEXT:    pxor %xmm0, %xmm3
3826 ; SSE2-NEXT:    movdqa %xmm10, %xmm4
3827 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
3828 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
3829 ; SSE2-NEXT:    pcmpeqd %xmm10, %xmm3
3830 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3831 ; SSE2-NEXT:    pand %xmm6, %xmm3
3832 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
3833 ; SSE2-NEXT:    por %xmm3, %xmm7
3834 ; SSE2-NEXT:    pand %xmm7, %xmm9
3835 ; SSE2-NEXT:    pandn %xmm8, %xmm7
3836 ; SSE2-NEXT:    por %xmm9, %xmm7
3837 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
3838 ; SSE2-NEXT:    movdqa %xmm7, %xmm3
3839 ; SSE2-NEXT:    pxor %xmm0, %xmm3
3840 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [18446744071562067840,18446744071562067840]
3841 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
3842 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm4
3843 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
3844 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm3
3845 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[1,1,3,3]
3846 ; SSE2-NEXT:    pand %xmm10, %xmm6
3847 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
3848 ; SSE2-NEXT:    por %xmm6, %xmm3
3849 ; SSE2-NEXT:    pand %xmm3, %xmm7
3850 ; SSE2-NEXT:    pandn %xmm8, %xmm3
3851 ; SSE2-NEXT:    por %xmm7, %xmm3
3852 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
3853 ; SSE2-NEXT:    pxor %xmm0, %xmm4
3854 ; SSE2-NEXT:    movdqa %xmm4, %xmm6
3855 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm6
3856 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
3857 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
3858 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3859 ; SSE2-NEXT:    pand %xmm7, %xmm4
3860 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
3861 ; SSE2-NEXT:    por %xmm4, %xmm7
3862 ; SSE2-NEXT:    pand %xmm7, %xmm5
3863 ; SSE2-NEXT:    pandn %xmm8, %xmm7
3864 ; SSE2-NEXT:    por %xmm5, %xmm7
3865 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
3866 ; SSE2-NEXT:    pxor %xmm0, %xmm4
3867 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
3868 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm5
3869 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
3870 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
3871 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3872 ; SSE2-NEXT:    pand %xmm6, %xmm4
3873 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
3874 ; SSE2-NEXT:    por %xmm4, %xmm5
3875 ; SSE2-NEXT:    pand %xmm5, %xmm2
3876 ; SSE2-NEXT:    pandn %xmm8, %xmm5
3877 ; SSE2-NEXT:    por %xmm2, %xmm5
3878 ; SSE2-NEXT:    pxor %xmm1, %xmm0
3879 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
3880 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm2
3881 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
3882 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
3883 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3884 ; SSE2-NEXT:    pand %xmm4, %xmm0
3885 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3886 ; SSE2-NEXT:    por %xmm0, %xmm2
3887 ; SSE2-NEXT:    pand %xmm2, %xmm1
3888 ; SSE2-NEXT:    pandn %xmm8, %xmm2
3889 ; SSE2-NEXT:    por %xmm1, %xmm2
3890 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
3891 ; SSE2-NEXT:    pand %xmm0, %xmm2
3892 ; SSE2-NEXT:    pand %xmm0, %xmm5
3893 ; SSE2-NEXT:    packuswb %xmm2, %xmm5
3894 ; SSE2-NEXT:    pand %xmm0, %xmm7
3895 ; SSE2-NEXT:    pand %xmm0, %xmm3
3896 ; SSE2-NEXT:    packuswb %xmm7, %xmm3
3897 ; SSE2-NEXT:    packuswb %xmm5, %xmm3
3898 ; SSE2-NEXT:    packuswb %xmm0, %xmm3
3899 ; SSE2-NEXT:    movq %xmm3, (%rsi)
3900 ; SSE2-NEXT:    retq
3902 ; SSSE3-LABEL: trunc_ssat_v8i64_v8i8_store:
3903 ; SSSE3:       # %bb.0:
3904 ; SSSE3-NEXT:    movdqa (%rdi), %xmm9
3905 ; SSSE3-NEXT:    movdqa 16(%rdi), %xmm7
3906 ; SSSE3-NEXT:    movdqa 32(%rdi), %xmm5
3907 ; SSSE3-NEXT:    movdqa 48(%rdi), %xmm2
3908 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [127,127]
3909 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
3910 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
3911 ; SSSE3-NEXT:    pxor %xmm0, %xmm1
3912 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [2147483775,2147483775]
3913 ; SSSE3-NEXT:    movdqa %xmm10, %xmm6
3914 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm6
3915 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[0,0,2,2]
3916 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm1
3917 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
3918 ; SSSE3-NEXT:    pand %xmm3, %xmm4
3919 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
3920 ; SSSE3-NEXT:    por %xmm4, %xmm1
3921 ; SSSE3-NEXT:    pand %xmm1, %xmm2
3922 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
3923 ; SSSE3-NEXT:    por %xmm2, %xmm1
3924 ; SSSE3-NEXT:    movdqa %xmm5, %xmm2
3925 ; SSSE3-NEXT:    pxor %xmm0, %xmm2
3926 ; SSSE3-NEXT:    movdqa %xmm10, %xmm3
3927 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
3928 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
3929 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm2
3930 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[1,1,3,3]
3931 ; SSSE3-NEXT:    pand %xmm4, %xmm6
3932 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
3933 ; SSSE3-NEXT:    por %xmm6, %xmm2
3934 ; SSSE3-NEXT:    pand %xmm2, %xmm5
3935 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
3936 ; SSSE3-NEXT:    por %xmm5, %xmm2
3937 ; SSSE3-NEXT:    movdqa %xmm7, %xmm3
3938 ; SSSE3-NEXT:    pxor %xmm0, %xmm3
3939 ; SSSE3-NEXT:    movdqa %xmm10, %xmm4
3940 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
3941 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
3942 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm3
3943 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3944 ; SSSE3-NEXT:    pand %xmm5, %xmm3
3945 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
3946 ; SSSE3-NEXT:    por %xmm3, %xmm5
3947 ; SSSE3-NEXT:    pand %xmm5, %xmm7
3948 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
3949 ; SSSE3-NEXT:    por %xmm7, %xmm5
3950 ; SSSE3-NEXT:    movdqa %xmm9, %xmm3
3951 ; SSSE3-NEXT:    pxor %xmm0, %xmm3
3952 ; SSSE3-NEXT:    movdqa %xmm10, %xmm4
3953 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
3954 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
3955 ; SSSE3-NEXT:    pcmpeqd %xmm10, %xmm3
3956 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3957 ; SSSE3-NEXT:    pand %xmm6, %xmm3
3958 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
3959 ; SSSE3-NEXT:    por %xmm3, %xmm7
3960 ; SSSE3-NEXT:    pand %xmm7, %xmm9
3961 ; SSSE3-NEXT:    pandn %xmm8, %xmm7
3962 ; SSSE3-NEXT:    por %xmm9, %xmm7
3963 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
3964 ; SSSE3-NEXT:    movdqa %xmm7, %xmm3
3965 ; SSSE3-NEXT:    pxor %xmm0, %xmm3
3966 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [18446744071562067840,18446744071562067840]
3967 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
3968 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm4
3969 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
3970 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm3
3971 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[1,1,3,3]
3972 ; SSSE3-NEXT:    pand %xmm10, %xmm6
3973 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
3974 ; SSSE3-NEXT:    por %xmm6, %xmm3
3975 ; SSSE3-NEXT:    pand %xmm3, %xmm7
3976 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
3977 ; SSSE3-NEXT:    por %xmm7, %xmm3
3978 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
3979 ; SSSE3-NEXT:    pxor %xmm0, %xmm4
3980 ; SSSE3-NEXT:    movdqa %xmm4, %xmm6
3981 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm6
3982 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
3983 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
3984 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3985 ; SSSE3-NEXT:    pand %xmm7, %xmm4
3986 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
3987 ; SSSE3-NEXT:    por %xmm4, %xmm7
3988 ; SSSE3-NEXT:    pand %xmm7, %xmm5
3989 ; SSSE3-NEXT:    pandn %xmm8, %xmm7
3990 ; SSSE3-NEXT:    por %xmm5, %xmm7
3991 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
3992 ; SSSE3-NEXT:    pxor %xmm0, %xmm4
3993 ; SSSE3-NEXT:    movdqa %xmm4, %xmm5
3994 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm5
3995 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
3996 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
3997 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3998 ; SSSE3-NEXT:    pand %xmm6, %xmm4
3999 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
4000 ; SSSE3-NEXT:    por %xmm4, %xmm5
4001 ; SSSE3-NEXT:    pand %xmm5, %xmm2
4002 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
4003 ; SSSE3-NEXT:    por %xmm2, %xmm5
4004 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
4005 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
4006 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm2
4007 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
4008 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
4009 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4010 ; SSSE3-NEXT:    pand %xmm4, %xmm0
4011 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
4012 ; SSSE3-NEXT:    por %xmm0, %xmm2
4013 ; SSSE3-NEXT:    pand %xmm2, %xmm1
4014 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
4015 ; SSSE3-NEXT:    por %xmm1, %xmm2
4016 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
4017 ; SSSE3-NEXT:    pand %xmm0, %xmm2
4018 ; SSSE3-NEXT:    pand %xmm0, %xmm5
4019 ; SSSE3-NEXT:    packuswb %xmm2, %xmm5
4020 ; SSSE3-NEXT:    pand %xmm0, %xmm7
4021 ; SSSE3-NEXT:    pand %xmm0, %xmm3
4022 ; SSSE3-NEXT:    packuswb %xmm7, %xmm3
4023 ; SSSE3-NEXT:    packuswb %xmm5, %xmm3
4024 ; SSSE3-NEXT:    packuswb %xmm0, %xmm3
4025 ; SSSE3-NEXT:    movq %xmm3, (%rsi)
4026 ; SSSE3-NEXT:    retq
4028 ; SSE41-LABEL: trunc_ssat_v8i64_v8i8_store:
4029 ; SSE41:       # %bb.0:
4030 ; SSE41-NEXT:    movdqa (%rdi), %xmm9
4031 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm10
4032 ; SSE41-NEXT:    movdqa 32(%rdi), %xmm2
4033 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm4
4034 ; SSE41-NEXT:    movapd {{.*#+}} xmm3 = [127,127]
4035 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
4036 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
4037 ; SSE41-NEXT:    pxor %xmm1, %xmm0
4038 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [2147483775,2147483775]
4039 ; SSE41-NEXT:    movdqa %xmm5, %xmm7
4040 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm7
4041 ; SSE41-NEXT:    movdqa %xmm5, %xmm6
4042 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
4043 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
4044 ; SSE41-NEXT:    pand %xmm7, %xmm0
4045 ; SSE41-NEXT:    por %xmm6, %xmm0
4046 ; SSE41-NEXT:    movapd %xmm3, %xmm8
4047 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm8
4048 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
4049 ; SSE41-NEXT:    pxor %xmm1, %xmm0
4050 ; SSE41-NEXT:    movdqa %xmm5, %xmm4
4051 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
4052 ; SSE41-NEXT:    movdqa %xmm5, %xmm6
4053 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
4054 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
4055 ; SSE41-NEXT:    pand %xmm4, %xmm0
4056 ; SSE41-NEXT:    por %xmm6, %xmm0
4057 ; SSE41-NEXT:    movapd %xmm3, %xmm11
4058 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm11
4059 ; SSE41-NEXT:    movdqa %xmm10, %xmm0
4060 ; SSE41-NEXT:    pxor %xmm1, %xmm0
4061 ; SSE41-NEXT:    movdqa %xmm5, %xmm2
4062 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
4063 ; SSE41-NEXT:    movdqa %xmm5, %xmm6
4064 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
4065 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
4066 ; SSE41-NEXT:    pand %xmm2, %xmm0
4067 ; SSE41-NEXT:    por %xmm6, %xmm0
4068 ; SSE41-NEXT:    movapd %xmm3, %xmm2
4069 ; SSE41-NEXT:    blendvpd %xmm0, %xmm10, %xmm2
4070 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
4071 ; SSE41-NEXT:    pxor %xmm1, %xmm0
4072 ; SSE41-NEXT:    movdqa %xmm5, %xmm6
4073 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
4074 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
4075 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
4076 ; SSE41-NEXT:    pand %xmm6, %xmm0
4077 ; SSE41-NEXT:    por %xmm5, %xmm0
4078 ; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm3
4079 ; SSE41-NEXT:    movapd {{.*#+}} xmm5 = [18446744073709551488,18446744073709551488]
4080 ; SSE41-NEXT:    movapd %xmm3, %xmm6
4081 ; SSE41-NEXT:    xorpd %xmm1, %xmm6
4082 ; SSE41-NEXT:    movdqa {{.*#+}} xmm7 = [18446744071562067840,18446744071562067840]
4083 ; SSE41-NEXT:    movapd %xmm6, %xmm4
4084 ; SSE41-NEXT:    pcmpeqd %xmm7, %xmm4
4085 ; SSE41-NEXT:    pcmpgtd %xmm7, %xmm6
4086 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
4087 ; SSE41-NEXT:    pand %xmm4, %xmm0
4088 ; SSE41-NEXT:    por %xmm6, %xmm0
4089 ; SSE41-NEXT:    movapd %xmm5, %xmm6
4090 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm6
4091 ; SSE41-NEXT:    movapd %xmm2, %xmm3
4092 ; SSE41-NEXT:    xorpd %xmm1, %xmm3
4093 ; SSE41-NEXT:    movapd %xmm3, %xmm4
4094 ; SSE41-NEXT:    pcmpeqd %xmm7, %xmm4
4095 ; SSE41-NEXT:    pcmpgtd %xmm7, %xmm3
4096 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
4097 ; SSE41-NEXT:    pand %xmm4, %xmm0
4098 ; SSE41-NEXT:    por %xmm3, %xmm0
4099 ; SSE41-NEXT:    movapd %xmm5, %xmm3
4100 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
4101 ; SSE41-NEXT:    movapd %xmm11, %xmm2
4102 ; SSE41-NEXT:    xorpd %xmm1, %xmm2
4103 ; SSE41-NEXT:    movapd %xmm2, %xmm4
4104 ; SSE41-NEXT:    pcmpeqd %xmm7, %xmm4
4105 ; SSE41-NEXT:    pcmpgtd %xmm7, %xmm2
4106 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
4107 ; SSE41-NEXT:    pand %xmm4, %xmm0
4108 ; SSE41-NEXT:    por %xmm2, %xmm0
4109 ; SSE41-NEXT:    movapd %xmm5, %xmm2
4110 ; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm2
4111 ; SSE41-NEXT:    xorpd %xmm8, %xmm1
4112 ; SSE41-NEXT:    movapd %xmm1, %xmm4
4113 ; SSE41-NEXT:    pcmpeqd %xmm7, %xmm4
4114 ; SSE41-NEXT:    pcmpgtd %xmm7, %xmm1
4115 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
4116 ; SSE41-NEXT:    pand %xmm4, %xmm0
4117 ; SSE41-NEXT:    por %xmm1, %xmm0
4118 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm5
4119 ; SSE41-NEXT:    movapd {{.*#+}} xmm0 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
4120 ; SSE41-NEXT:    andpd %xmm0, %xmm5
4121 ; SSE41-NEXT:    andpd %xmm0, %xmm2
4122 ; SSE41-NEXT:    packusdw %xmm5, %xmm2
4123 ; SSE41-NEXT:    andpd %xmm0, %xmm3
4124 ; SSE41-NEXT:    andpd %xmm0, %xmm6
4125 ; SSE41-NEXT:    packusdw %xmm3, %xmm6
4126 ; SSE41-NEXT:    packusdw %xmm2, %xmm6
4127 ; SSE41-NEXT:    packuswb %xmm0, %xmm6
4128 ; SSE41-NEXT:    movq %xmm6, (%rsi)
4129 ; SSE41-NEXT:    retq
4131 ; AVX1-LABEL: trunc_ssat_v8i64_v8i8_store:
4132 ; AVX1:       # %bb.0:
4133 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm9 = [127,127,127,127]
4134 ; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm1
4135 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [127,127]
4136 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
4137 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm4
4138 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm5
4139 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm6
4140 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm2, %xmm7
4141 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm7, %ymm8
4142 ; AVX1-NEXT:    vblendvpd %ymm8, 32(%rdi), %ymm9, %ymm8
4143 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm2, %xmm0
4144 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm2, %xmm10
4145 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm10, %ymm11
4146 ; AVX1-NEXT:    vblendvpd %ymm11, (%rdi), %ymm9, %ymm9
4147 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm11 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
4148 ; AVX1-NEXT:    vblendvpd %xmm0, %xmm5, %xmm2, %xmm0
4149 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [18446744073709551488,18446744073709551488]
4150 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm0, %xmm0
4151 ; AVX1-NEXT:    vblendvpd %xmm10, %xmm4, %xmm2, %xmm4
4152 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm4, %xmm4
4153 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm4, %ymm0
4154 ; AVX1-NEXT:    vblendvpd %ymm0, %ymm9, %ymm11, %ymm0
4155 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm1, %xmm2, %xmm1
4156 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm1, %xmm1
4157 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm6, %xmm2, %xmm2
4158 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm2, %xmm2
4159 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
4160 ; AVX1-NEXT:    vblendvpd %ymm1, %ymm8, %ymm11, %ymm1
4161 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm2 = [255,255,255,255]
4162 ; AVX1-NEXT:    vandpd %ymm2, %ymm1, %ymm1
4163 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
4164 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
4165 ; AVX1-NEXT:    vandpd %ymm2, %ymm0, %ymm0
4166 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
4167 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
4168 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
4169 ; AVX1-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
4170 ; AVX1-NEXT:    vmovq %xmm0, (%rsi)
4171 ; AVX1-NEXT:    vzeroupper
4172 ; AVX1-NEXT:    retq
4174 ; AVX2-LABEL: trunc_ssat_v8i64_v8i8_store:
4175 ; AVX2:       # %bb.0:
4176 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
4177 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
4178 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [127,127,127,127]
4179 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
4180 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
4181 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
4182 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
4183 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
4184 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
4185 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
4186 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm3
4187 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
4188 ; AVX2-NEXT:    vextractf128 $1, %ymm1, %xmm2
4189 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = <u,u,0,8,u,u,u,u,u,u,u,u,u,u,u,u>
4190 ; AVX2-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
4191 ; AVX2-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
4192 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
4193 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm2
4194 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
4195 ; AVX2-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
4196 ; AVX2-NEXT:    vpshufb %xmm3, %xmm0, %xmm0
4197 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
4198 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
4199 ; AVX2-NEXT:    vmovq %xmm0, (%rsi)
4200 ; AVX2-NEXT:    vzeroupper
4201 ; AVX2-NEXT:    retq
4203 ; AVX512-LABEL: trunc_ssat_v8i64_v8i8_store:
4204 ; AVX512:       # %bb.0:
4205 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
4206 ; AVX512-NEXT:    vpmovsqb %zmm0, (%rsi)
4207 ; AVX512-NEXT:    vzeroupper
4208 ; AVX512-NEXT:    retq
4210 ; SKX-LABEL: trunc_ssat_v8i64_v8i8_store:
4211 ; SKX:       # %bb.0:
4212 ; SKX-NEXT:    vmovdqa (%rdi), %ymm0
4213 ; SKX-NEXT:    vmovdqa 32(%rdi), %ymm1
4214 ; SKX-NEXT:    vpmovsqb %ymm1, %xmm1
4215 ; SKX-NEXT:    vpmovsqb %ymm0, %xmm0
4216 ; SKX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
4217 ; SKX-NEXT:    vmovq %xmm0, (%rsi)
4218 ; SKX-NEXT:    vzeroupper
4219 ; SKX-NEXT:    retq
4220   %a0 = load <8 x i64>, <8 x i64>* %p0
4221   %1 = icmp slt <8 x i64> %a0, <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>
4222   %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>
4223   %3 = icmp sgt <8 x i64> %2, <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>
4224   %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>
4225   %5 = trunc <8 x i64> %4 to <8 x i8>
4226   store <8 x i8> %5, <8 x i8> *%p1
4227   ret void
4230 define <16 x i8> @trunc_ssat_v16i64_v16i8(<16 x i64>* %p0) "min-legal-vector-width"="256" {
4231 ; SSE2-LABEL: trunc_ssat_v16i64_v16i8:
4232 ; SSE2:       # %bb.0:
4233 ; SSE2-NEXT:    movdqa (%rdi), %xmm10
4234 ; SSE2-NEXT:    movdqa 16(%rdi), %xmm9
4235 ; SSE2-NEXT:    movdqa 32(%rdi), %xmm15
4236 ; SSE2-NEXT:    movdqa 48(%rdi), %xmm13
4237 ; SSE2-NEXT:    movdqa 80(%rdi), %xmm6
4238 ; SSE2-NEXT:    movdqa 64(%rdi), %xmm3
4239 ; SSE2-NEXT:    movdqa 112(%rdi), %xmm4
4240 ; SSE2-NEXT:    movdqa 96(%rdi), %xmm7
4241 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [127,127]
4242 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
4243 ; SSE2-NEXT:    movdqa %xmm7, %xmm5
4244 ; SSE2-NEXT:    pxor %xmm1, %xmm5
4245 ; SSE2-NEXT:    movdqa {{.*#+}} xmm14 = [2147483775,2147483775]
4246 ; SSE2-NEXT:    movdqa %xmm14, %xmm0
4247 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm0
4248 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
4249 ; SSE2-NEXT:    pcmpeqd %xmm14, %xmm5
4250 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
4251 ; SSE2-NEXT:    pand %xmm2, %xmm5
4252 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm0[1,1,3,3]
4253 ; SSE2-NEXT:    por %xmm5, %xmm11
4254 ; SSE2-NEXT:    pand %xmm11, %xmm7
4255 ; SSE2-NEXT:    pandn %xmm8, %xmm11
4256 ; SSE2-NEXT:    por %xmm7, %xmm11
4257 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
4258 ; SSE2-NEXT:    pxor %xmm1, %xmm0
4259 ; SSE2-NEXT:    movdqa %xmm14, %xmm2
4260 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
4261 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
4262 ; SSE2-NEXT:    pcmpeqd %xmm14, %xmm0
4263 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4264 ; SSE2-NEXT:    pand %xmm5, %xmm0
4265 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm2[1,1,3,3]
4266 ; SSE2-NEXT:    por %xmm0, %xmm12
4267 ; SSE2-NEXT:    pand %xmm12, %xmm4
4268 ; SSE2-NEXT:    pandn %xmm8, %xmm12
4269 ; SSE2-NEXT:    por %xmm4, %xmm12
4270 ; SSE2-NEXT:    movdqa %xmm3, %xmm0
4271 ; SSE2-NEXT:    pxor %xmm1, %xmm0
4272 ; SSE2-NEXT:    movdqa %xmm14, %xmm2
4273 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
4274 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
4275 ; SSE2-NEXT:    pcmpeqd %xmm14, %xmm0
4276 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4277 ; SSE2-NEXT:    pand %xmm4, %xmm0
4278 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
4279 ; SSE2-NEXT:    por %xmm0, %xmm4
4280 ; SSE2-NEXT:    pand %xmm4, %xmm3
4281 ; SSE2-NEXT:    pandn %xmm8, %xmm4
4282 ; SSE2-NEXT:    por %xmm3, %xmm4
4283 ; SSE2-NEXT:    movdqa %xmm6, %xmm0
4284 ; SSE2-NEXT:    pxor %xmm1, %xmm0
4285 ; SSE2-NEXT:    movdqa %xmm14, %xmm2
4286 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
4287 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
4288 ; SSE2-NEXT:    pcmpeqd %xmm14, %xmm0
4289 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4290 ; SSE2-NEXT:    pand %xmm3, %xmm0
4291 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]
4292 ; SSE2-NEXT:    por %xmm0, %xmm5
4293 ; SSE2-NEXT:    pand %xmm5, %xmm6
4294 ; SSE2-NEXT:    pandn %xmm8, %xmm5
4295 ; SSE2-NEXT:    por %xmm6, %xmm5
4296 ; SSE2-NEXT:    movdqa %xmm15, %xmm0
4297 ; SSE2-NEXT:    pxor %xmm1, %xmm0
4298 ; SSE2-NEXT:    movdqa %xmm14, %xmm2
4299 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
4300 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
4301 ; SSE2-NEXT:    pcmpeqd %xmm14, %xmm0
4302 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4303 ; SSE2-NEXT:    pand %xmm3, %xmm0
4304 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[1,1,3,3]
4305 ; SSE2-NEXT:    por %xmm0, %xmm6
4306 ; SSE2-NEXT:    pand %xmm6, %xmm15
4307 ; SSE2-NEXT:    pandn %xmm8, %xmm6
4308 ; SSE2-NEXT:    por %xmm15, %xmm6
4309 ; SSE2-NEXT:    movdqa %xmm13, %xmm0
4310 ; SSE2-NEXT:    pxor %xmm1, %xmm0
4311 ; SSE2-NEXT:    movdqa %xmm14, %xmm2
4312 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
4313 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
4314 ; SSE2-NEXT:    pcmpeqd %xmm14, %xmm0
4315 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4316 ; SSE2-NEXT:    pand %xmm3, %xmm0
4317 ; SSE2-NEXT:    pshufd {{.*#+}} xmm15 = xmm2[1,1,3,3]
4318 ; SSE2-NEXT:    por %xmm0, %xmm15
4319 ; SSE2-NEXT:    pand %xmm15, %xmm13
4320 ; SSE2-NEXT:    pandn %xmm8, %xmm15
4321 ; SSE2-NEXT:    por %xmm13, %xmm15
4322 ; SSE2-NEXT:    movdqa %xmm10, %xmm0
4323 ; SSE2-NEXT:    pxor %xmm1, %xmm0
4324 ; SSE2-NEXT:    movdqa %xmm14, %xmm3
4325 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
4326 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[0,0,2,2]
4327 ; SSE2-NEXT:    pcmpeqd %xmm14, %xmm0
4328 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4329 ; SSE2-NEXT:    pand %xmm7, %xmm0
4330 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm3[1,1,3,3]
4331 ; SSE2-NEXT:    por %xmm0, %xmm13
4332 ; SSE2-NEXT:    pand %xmm13, %xmm10
4333 ; SSE2-NEXT:    pandn %xmm8, %xmm13
4334 ; SSE2-NEXT:    por %xmm10, %xmm13
4335 ; SSE2-NEXT:    movdqa %xmm9, %xmm0
4336 ; SSE2-NEXT:    pxor %xmm1, %xmm0
4337 ; SSE2-NEXT:    movdqa %xmm14, %xmm7
4338 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm7
4339 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
4340 ; SSE2-NEXT:    pcmpeqd %xmm14, %xmm0
4341 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4342 ; SSE2-NEXT:    pand %xmm10, %xmm0
4343 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
4344 ; SSE2-NEXT:    por %xmm0, %xmm7
4345 ; SSE2-NEXT:    pand %xmm7, %xmm9
4346 ; SSE2-NEXT:    pandn %xmm8, %xmm7
4347 ; SSE2-NEXT:    por %xmm9, %xmm7
4348 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
4349 ; SSE2-NEXT:    movdqa %xmm7, %xmm0
4350 ; SSE2-NEXT:    pxor %xmm1, %xmm0
4351 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [18446744071562067840,18446744071562067840]
4352 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
4353 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm2
4354 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm2[0,0,2,2]
4355 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
4356 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4357 ; SSE2-NEXT:    pand %xmm10, %xmm0
4358 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
4359 ; SSE2-NEXT:    por %xmm0, %xmm2
4360 ; SSE2-NEXT:    pand %xmm2, %xmm7
4361 ; SSE2-NEXT:    pandn %xmm8, %xmm2
4362 ; SSE2-NEXT:    por %xmm7, %xmm2
4363 ; SSE2-NEXT:    movdqa %xmm13, %xmm0
4364 ; SSE2-NEXT:    pxor %xmm1, %xmm0
4365 ; SSE2-NEXT:    movdqa %xmm0, %xmm7
4366 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm7
4367 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
4368 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
4369 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
4370 ; SSE2-NEXT:    pand %xmm10, %xmm3
4371 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
4372 ; SSE2-NEXT:    por %xmm3, %xmm0
4373 ; SSE2-NEXT:    pand %xmm0, %xmm13
4374 ; SSE2-NEXT:    pandn %xmm8, %xmm0
4375 ; SSE2-NEXT:    por %xmm13, %xmm0
4376 ; SSE2-NEXT:    packssdw %xmm2, %xmm0
4377 ; SSE2-NEXT:    movdqa %xmm15, %xmm2
4378 ; SSE2-NEXT:    pxor %xmm1, %xmm2
4379 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
4380 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm3
4381 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[0,0,2,2]
4382 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm2
4383 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
4384 ; SSE2-NEXT:    pand %xmm7, %xmm2
4385 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
4386 ; SSE2-NEXT:    por %xmm2, %xmm3
4387 ; SSE2-NEXT:    pand %xmm3, %xmm15
4388 ; SSE2-NEXT:    pandn %xmm8, %xmm3
4389 ; SSE2-NEXT:    por %xmm15, %xmm3
4390 ; SSE2-NEXT:    movdqa %xmm6, %xmm2
4391 ; SSE2-NEXT:    pxor %xmm1, %xmm2
4392 ; SSE2-NEXT:    movdqa %xmm2, %xmm7
4393 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm7
4394 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
4395 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm2
4396 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
4397 ; SSE2-NEXT:    pand %xmm10, %xmm2
4398 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
4399 ; SSE2-NEXT:    por %xmm2, %xmm7
4400 ; SSE2-NEXT:    pand %xmm7, %xmm6
4401 ; SSE2-NEXT:    pandn %xmm8, %xmm7
4402 ; SSE2-NEXT:    por %xmm6, %xmm7
4403 ; SSE2-NEXT:    packssdw %xmm3, %xmm7
4404 ; SSE2-NEXT:    packssdw %xmm7, %xmm0
4405 ; SSE2-NEXT:    movdqa %xmm5, %xmm2
4406 ; SSE2-NEXT:    pxor %xmm1, %xmm2
4407 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
4408 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm3
4409 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
4410 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm2
4411 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
4412 ; SSE2-NEXT:    pand %xmm6, %xmm2
4413 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
4414 ; SSE2-NEXT:    por %xmm2, %xmm3
4415 ; SSE2-NEXT:    pand %xmm3, %xmm5
4416 ; SSE2-NEXT:    pandn %xmm8, %xmm3
4417 ; SSE2-NEXT:    por %xmm5, %xmm3
4418 ; SSE2-NEXT:    movdqa %xmm4, %xmm2
4419 ; SSE2-NEXT:    pxor %xmm1, %xmm2
4420 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
4421 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm5
4422 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
4423 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm2
4424 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
4425 ; SSE2-NEXT:    pand %xmm6, %xmm7
4426 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
4427 ; SSE2-NEXT:    por %xmm7, %xmm2
4428 ; SSE2-NEXT:    pand %xmm2, %xmm4
4429 ; SSE2-NEXT:    pandn %xmm8, %xmm2
4430 ; SSE2-NEXT:    por %xmm4, %xmm2
4431 ; SSE2-NEXT:    packssdw %xmm3, %xmm2
4432 ; SSE2-NEXT:    movdqa %xmm12, %xmm3
4433 ; SSE2-NEXT:    pxor %xmm1, %xmm3
4434 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
4435 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm4
4436 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
4437 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm3
4438 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
4439 ; SSE2-NEXT:    pand %xmm5, %xmm3
4440 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
4441 ; SSE2-NEXT:    por %xmm3, %xmm4
4442 ; SSE2-NEXT:    pand %xmm4, %xmm12
4443 ; SSE2-NEXT:    pandn %xmm8, %xmm4
4444 ; SSE2-NEXT:    por %xmm12, %xmm4
4445 ; SSE2-NEXT:    pxor %xmm11, %xmm1
4446 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
4447 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm3
4448 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
4449 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
4450 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
4451 ; SSE2-NEXT:    pand %xmm5, %xmm1
4452 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
4453 ; SSE2-NEXT:    por %xmm1, %xmm3
4454 ; SSE2-NEXT:    pand %xmm3, %xmm11
4455 ; SSE2-NEXT:    pandn %xmm8, %xmm3
4456 ; SSE2-NEXT:    por %xmm11, %xmm3
4457 ; SSE2-NEXT:    packssdw %xmm4, %xmm3
4458 ; SSE2-NEXT:    packssdw %xmm3, %xmm2
4459 ; SSE2-NEXT:    packsswb %xmm2, %xmm0
4460 ; SSE2-NEXT:    retq
4462 ; SSSE3-LABEL: trunc_ssat_v16i64_v16i8:
4463 ; SSSE3:       # %bb.0:
4464 ; SSSE3-NEXT:    movdqa (%rdi), %xmm10
4465 ; SSSE3-NEXT:    movdqa 16(%rdi), %xmm9
4466 ; SSSE3-NEXT:    movdqa 32(%rdi), %xmm15
4467 ; SSSE3-NEXT:    movdqa 48(%rdi), %xmm13
4468 ; SSSE3-NEXT:    movdqa 80(%rdi), %xmm6
4469 ; SSSE3-NEXT:    movdqa 64(%rdi), %xmm3
4470 ; SSSE3-NEXT:    movdqa 112(%rdi), %xmm4
4471 ; SSSE3-NEXT:    movdqa 96(%rdi), %xmm7
4472 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [127,127]
4473 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
4474 ; SSSE3-NEXT:    movdqa %xmm7, %xmm5
4475 ; SSSE3-NEXT:    pxor %xmm1, %xmm5
4476 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm14 = [2147483775,2147483775]
4477 ; SSSE3-NEXT:    movdqa %xmm14, %xmm0
4478 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm0
4479 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
4480 ; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm5
4481 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
4482 ; SSSE3-NEXT:    pand %xmm2, %xmm5
4483 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm0[1,1,3,3]
4484 ; SSSE3-NEXT:    por %xmm5, %xmm11
4485 ; SSSE3-NEXT:    pand %xmm11, %xmm7
4486 ; SSSE3-NEXT:    pandn %xmm8, %xmm11
4487 ; SSSE3-NEXT:    por %xmm7, %xmm11
4488 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
4489 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
4490 ; SSSE3-NEXT:    movdqa %xmm14, %xmm2
4491 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
4492 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
4493 ; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm0
4494 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4495 ; SSSE3-NEXT:    pand %xmm5, %xmm0
4496 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm2[1,1,3,3]
4497 ; SSSE3-NEXT:    por %xmm0, %xmm12
4498 ; SSSE3-NEXT:    pand %xmm12, %xmm4
4499 ; SSSE3-NEXT:    pandn %xmm8, %xmm12
4500 ; SSSE3-NEXT:    por %xmm4, %xmm12
4501 ; SSSE3-NEXT:    movdqa %xmm3, %xmm0
4502 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
4503 ; SSSE3-NEXT:    movdqa %xmm14, %xmm2
4504 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
4505 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
4506 ; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm0
4507 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4508 ; SSSE3-NEXT:    pand %xmm4, %xmm0
4509 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
4510 ; SSSE3-NEXT:    por %xmm0, %xmm4
4511 ; SSSE3-NEXT:    pand %xmm4, %xmm3
4512 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
4513 ; SSSE3-NEXT:    por %xmm3, %xmm4
4514 ; SSSE3-NEXT:    movdqa %xmm6, %xmm0
4515 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
4516 ; SSSE3-NEXT:    movdqa %xmm14, %xmm2
4517 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
4518 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
4519 ; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm0
4520 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4521 ; SSSE3-NEXT:    pand %xmm3, %xmm0
4522 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]
4523 ; SSSE3-NEXT:    por %xmm0, %xmm5
4524 ; SSSE3-NEXT:    pand %xmm5, %xmm6
4525 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
4526 ; SSSE3-NEXT:    por %xmm6, %xmm5
4527 ; SSSE3-NEXT:    movdqa %xmm15, %xmm0
4528 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
4529 ; SSSE3-NEXT:    movdqa %xmm14, %xmm2
4530 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
4531 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
4532 ; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm0
4533 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4534 ; SSSE3-NEXT:    pand %xmm3, %xmm0
4535 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[1,1,3,3]
4536 ; SSSE3-NEXT:    por %xmm0, %xmm6
4537 ; SSSE3-NEXT:    pand %xmm6, %xmm15
4538 ; SSSE3-NEXT:    pandn %xmm8, %xmm6
4539 ; SSSE3-NEXT:    por %xmm15, %xmm6
4540 ; SSSE3-NEXT:    movdqa %xmm13, %xmm0
4541 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
4542 ; SSSE3-NEXT:    movdqa %xmm14, %xmm2
4543 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
4544 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
4545 ; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm0
4546 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4547 ; SSSE3-NEXT:    pand %xmm3, %xmm0
4548 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm15 = xmm2[1,1,3,3]
4549 ; SSSE3-NEXT:    por %xmm0, %xmm15
4550 ; SSSE3-NEXT:    pand %xmm15, %xmm13
4551 ; SSSE3-NEXT:    pandn %xmm8, %xmm15
4552 ; SSSE3-NEXT:    por %xmm13, %xmm15
4553 ; SSSE3-NEXT:    movdqa %xmm10, %xmm0
4554 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
4555 ; SSSE3-NEXT:    movdqa %xmm14, %xmm3
4556 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm3
4557 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[0,0,2,2]
4558 ; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm0
4559 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4560 ; SSSE3-NEXT:    pand %xmm7, %xmm0
4561 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm3[1,1,3,3]
4562 ; SSSE3-NEXT:    por %xmm0, %xmm13
4563 ; SSSE3-NEXT:    pand %xmm13, %xmm10
4564 ; SSSE3-NEXT:    pandn %xmm8, %xmm13
4565 ; SSSE3-NEXT:    por %xmm10, %xmm13
4566 ; SSSE3-NEXT:    movdqa %xmm9, %xmm0
4567 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
4568 ; SSSE3-NEXT:    movdqa %xmm14, %xmm7
4569 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm7
4570 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
4571 ; SSSE3-NEXT:    pcmpeqd %xmm14, %xmm0
4572 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4573 ; SSSE3-NEXT:    pand %xmm10, %xmm0
4574 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
4575 ; SSSE3-NEXT:    por %xmm0, %xmm7
4576 ; SSSE3-NEXT:    pand %xmm7, %xmm9
4577 ; SSSE3-NEXT:    pandn %xmm8, %xmm7
4578 ; SSSE3-NEXT:    por %xmm9, %xmm7
4579 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
4580 ; SSSE3-NEXT:    movdqa %xmm7, %xmm0
4581 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
4582 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [18446744071562067840,18446744071562067840]
4583 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
4584 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm2
4585 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm2[0,0,2,2]
4586 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
4587 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4588 ; SSSE3-NEXT:    pand %xmm10, %xmm0
4589 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
4590 ; SSSE3-NEXT:    por %xmm0, %xmm2
4591 ; SSSE3-NEXT:    pand %xmm2, %xmm7
4592 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
4593 ; SSSE3-NEXT:    por %xmm7, %xmm2
4594 ; SSSE3-NEXT:    movdqa %xmm13, %xmm0
4595 ; SSSE3-NEXT:    pxor %xmm1, %xmm0
4596 ; SSSE3-NEXT:    movdqa %xmm0, %xmm7
4597 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm7
4598 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
4599 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
4600 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
4601 ; SSSE3-NEXT:    pand %xmm10, %xmm3
4602 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
4603 ; SSSE3-NEXT:    por %xmm3, %xmm0
4604 ; SSSE3-NEXT:    pand %xmm0, %xmm13
4605 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
4606 ; SSSE3-NEXT:    por %xmm13, %xmm0
4607 ; SSSE3-NEXT:    packssdw %xmm2, %xmm0
4608 ; SSSE3-NEXT:    movdqa %xmm15, %xmm2
4609 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
4610 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
4611 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm3
4612 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[0,0,2,2]
4613 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm2
4614 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
4615 ; SSSE3-NEXT:    pand %xmm7, %xmm2
4616 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
4617 ; SSSE3-NEXT:    por %xmm2, %xmm3
4618 ; SSSE3-NEXT:    pand %xmm3, %xmm15
4619 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
4620 ; SSSE3-NEXT:    por %xmm15, %xmm3
4621 ; SSSE3-NEXT:    movdqa %xmm6, %xmm2
4622 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
4623 ; SSSE3-NEXT:    movdqa %xmm2, %xmm7
4624 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm7
4625 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
4626 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm2
4627 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
4628 ; SSSE3-NEXT:    pand %xmm10, %xmm2
4629 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
4630 ; SSSE3-NEXT:    por %xmm2, %xmm7
4631 ; SSSE3-NEXT:    pand %xmm7, %xmm6
4632 ; SSSE3-NEXT:    pandn %xmm8, %xmm7
4633 ; SSSE3-NEXT:    por %xmm6, %xmm7
4634 ; SSSE3-NEXT:    packssdw %xmm3, %xmm7
4635 ; SSSE3-NEXT:    packssdw %xmm7, %xmm0
4636 ; SSSE3-NEXT:    movdqa %xmm5, %xmm2
4637 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
4638 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
4639 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm3
4640 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
4641 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm2
4642 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
4643 ; SSSE3-NEXT:    pand %xmm6, %xmm2
4644 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
4645 ; SSSE3-NEXT:    por %xmm2, %xmm3
4646 ; SSSE3-NEXT:    pand %xmm3, %xmm5
4647 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
4648 ; SSSE3-NEXT:    por %xmm5, %xmm3
4649 ; SSSE3-NEXT:    movdqa %xmm4, %xmm2
4650 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
4651 ; SSSE3-NEXT:    movdqa %xmm2, %xmm5
4652 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm5
4653 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
4654 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm2
4655 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
4656 ; SSSE3-NEXT:    pand %xmm6, %xmm7
4657 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
4658 ; SSSE3-NEXT:    por %xmm7, %xmm2
4659 ; SSSE3-NEXT:    pand %xmm2, %xmm4
4660 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
4661 ; SSSE3-NEXT:    por %xmm4, %xmm2
4662 ; SSSE3-NEXT:    packssdw %xmm3, %xmm2
4663 ; SSSE3-NEXT:    movdqa %xmm12, %xmm3
4664 ; SSSE3-NEXT:    pxor %xmm1, %xmm3
4665 ; SSSE3-NEXT:    movdqa %xmm3, %xmm4
4666 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm4
4667 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
4668 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm3
4669 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
4670 ; SSSE3-NEXT:    pand %xmm5, %xmm3
4671 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
4672 ; SSSE3-NEXT:    por %xmm3, %xmm4
4673 ; SSSE3-NEXT:    pand %xmm4, %xmm12
4674 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
4675 ; SSSE3-NEXT:    por %xmm12, %xmm4
4676 ; SSSE3-NEXT:    pxor %xmm11, %xmm1
4677 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
4678 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm3
4679 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
4680 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
4681 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
4682 ; SSSE3-NEXT:    pand %xmm5, %xmm1
4683 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
4684 ; SSSE3-NEXT:    por %xmm1, %xmm3
4685 ; SSSE3-NEXT:    pand %xmm3, %xmm11
4686 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
4687 ; SSSE3-NEXT:    por %xmm11, %xmm3
4688 ; SSSE3-NEXT:    packssdw %xmm4, %xmm3
4689 ; SSSE3-NEXT:    packssdw %xmm3, %xmm2
4690 ; SSSE3-NEXT:    packsswb %xmm2, %xmm0
4691 ; SSSE3-NEXT:    retq
4693 ; SSE41-LABEL: trunc_ssat_v16i64_v16i8:
4694 ; SSE41:       # %bb.0:
4695 ; SSE41-NEXT:    movdqa (%rdi), %xmm11
4696 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm9
4697 ; SSE41-NEXT:    movdqa 32(%rdi), %xmm15
4698 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm12
4699 ; SSE41-NEXT:    movdqa 80(%rdi), %xmm4
4700 ; SSE41-NEXT:    movdqa 64(%rdi), %xmm14
4701 ; SSE41-NEXT:    movdqa 112(%rdi), %xmm13
4702 ; SSE41-NEXT:    movdqa 96(%rdi), %xmm3
4703 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [127,127]
4704 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
4705 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
4706 ; SSE41-NEXT:    pxor %xmm2, %xmm0
4707 ; SSE41-NEXT:    movdqa {{.*#+}} xmm7 = [2147483775,2147483775]
4708 ; SSE41-NEXT:    movdqa %xmm7, %xmm5
4709 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
4710 ; SSE41-NEXT:    movdqa %xmm7, %xmm6
4711 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
4712 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
4713 ; SSE41-NEXT:    pand %xmm5, %xmm0
4714 ; SSE41-NEXT:    por %xmm6, %xmm0
4715 ; SSE41-NEXT:    movapd %xmm1, %xmm8
4716 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm8
4717 ; SSE41-NEXT:    movdqa %xmm13, %xmm0
4718 ; SSE41-NEXT:    pxor %xmm2, %xmm0
4719 ; SSE41-NEXT:    movdqa %xmm7, %xmm3
4720 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
4721 ; SSE41-NEXT:    movdqa %xmm7, %xmm5
4722 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
4723 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
4724 ; SSE41-NEXT:    pand %xmm3, %xmm0
4725 ; SSE41-NEXT:    por %xmm5, %xmm0
4726 ; SSE41-NEXT:    movapd %xmm1, %xmm10
4727 ; SSE41-NEXT:    blendvpd %xmm0, %xmm13, %xmm10
4728 ; SSE41-NEXT:    movdqa %xmm14, %xmm0
4729 ; SSE41-NEXT:    pxor %xmm2, %xmm0
4730 ; SSE41-NEXT:    movdqa %xmm7, %xmm3
4731 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
4732 ; SSE41-NEXT:    movdqa %xmm7, %xmm5
4733 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
4734 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
4735 ; SSE41-NEXT:    pand %xmm3, %xmm0
4736 ; SSE41-NEXT:    por %xmm5, %xmm0
4737 ; SSE41-NEXT:    movapd %xmm1, %xmm13
4738 ; SSE41-NEXT:    blendvpd %xmm0, %xmm14, %xmm13
4739 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
4740 ; SSE41-NEXT:    pxor %xmm2, %xmm0
4741 ; SSE41-NEXT:    movdqa %xmm7, %xmm3
4742 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
4743 ; SSE41-NEXT:    movdqa %xmm7, %xmm5
4744 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
4745 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
4746 ; SSE41-NEXT:    pand %xmm3, %xmm0
4747 ; SSE41-NEXT:    por %xmm5, %xmm0
4748 ; SSE41-NEXT:    movapd %xmm1, %xmm14
4749 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm14
4750 ; SSE41-NEXT:    movdqa %xmm15, %xmm0
4751 ; SSE41-NEXT:    pxor %xmm2, %xmm0
4752 ; SSE41-NEXT:    movdqa %xmm7, %xmm3
4753 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
4754 ; SSE41-NEXT:    movdqa %xmm7, %xmm4
4755 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
4756 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
4757 ; SSE41-NEXT:    pand %xmm3, %xmm0
4758 ; SSE41-NEXT:    por %xmm4, %xmm0
4759 ; SSE41-NEXT:    movapd %xmm1, %xmm4
4760 ; SSE41-NEXT:    blendvpd %xmm0, %xmm15, %xmm4
4761 ; SSE41-NEXT:    movdqa %xmm12, %xmm0
4762 ; SSE41-NEXT:    pxor %xmm2, %xmm0
4763 ; SSE41-NEXT:    movdqa %xmm7, %xmm3
4764 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
4765 ; SSE41-NEXT:    movdqa %xmm7, %xmm5
4766 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
4767 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
4768 ; SSE41-NEXT:    pand %xmm3, %xmm0
4769 ; SSE41-NEXT:    por %xmm5, %xmm0
4770 ; SSE41-NEXT:    movapd %xmm1, %xmm15
4771 ; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm15
4772 ; SSE41-NEXT:    movdqa %xmm11, %xmm0
4773 ; SSE41-NEXT:    pxor %xmm2, %xmm0
4774 ; SSE41-NEXT:    movdqa %xmm7, %xmm3
4775 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
4776 ; SSE41-NEXT:    movdqa %xmm7, %xmm6
4777 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
4778 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
4779 ; SSE41-NEXT:    pand %xmm3, %xmm0
4780 ; SSE41-NEXT:    por %xmm6, %xmm0
4781 ; SSE41-NEXT:    movapd %xmm1, %xmm6
4782 ; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm6
4783 ; SSE41-NEXT:    movdqa %xmm9, %xmm0
4784 ; SSE41-NEXT:    pxor %xmm2, %xmm0
4785 ; SSE41-NEXT:    movdqa %xmm7, %xmm3
4786 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
4787 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
4788 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
4789 ; SSE41-NEXT:    pand %xmm3, %xmm0
4790 ; SSE41-NEXT:    por %xmm7, %xmm0
4791 ; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm1
4792 ; SSE41-NEXT:    movapd {{.*#+}} xmm7 = [18446744073709551488,18446744073709551488]
4793 ; SSE41-NEXT:    movapd %xmm1, %xmm5
4794 ; SSE41-NEXT:    xorpd %xmm2, %xmm5
4795 ; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [18446744071562067840,18446744071562067840]
4796 ; SSE41-NEXT:    movapd %xmm5, %xmm3
4797 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm3
4798 ; SSE41-NEXT:    pcmpgtd %xmm9, %xmm5
4799 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
4800 ; SSE41-NEXT:    pand %xmm3, %xmm0
4801 ; SSE41-NEXT:    por %xmm5, %xmm0
4802 ; SSE41-NEXT:    movapd %xmm7, %xmm3
4803 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
4804 ; SSE41-NEXT:    movapd %xmm6, %xmm1
4805 ; SSE41-NEXT:    xorpd %xmm2, %xmm1
4806 ; SSE41-NEXT:    movapd %xmm1, %xmm5
4807 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm5
4808 ; SSE41-NEXT:    pcmpgtd %xmm9, %xmm1
4809 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
4810 ; SSE41-NEXT:    pand %xmm5, %xmm0
4811 ; SSE41-NEXT:    por %xmm1, %xmm0
4812 ; SSE41-NEXT:    movapd %xmm7, %xmm1
4813 ; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm1
4814 ; SSE41-NEXT:    packssdw %xmm3, %xmm1
4815 ; SSE41-NEXT:    movapd %xmm15, %xmm3
4816 ; SSE41-NEXT:    xorpd %xmm2, %xmm3
4817 ; SSE41-NEXT:    movapd %xmm3, %xmm5
4818 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm5
4819 ; SSE41-NEXT:    pcmpgtd %xmm9, %xmm3
4820 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
4821 ; SSE41-NEXT:    pand %xmm5, %xmm0
4822 ; SSE41-NEXT:    por %xmm3, %xmm0
4823 ; SSE41-NEXT:    movapd %xmm7, %xmm3
4824 ; SSE41-NEXT:    blendvpd %xmm0, %xmm15, %xmm3
4825 ; SSE41-NEXT:    movapd %xmm4, %xmm5
4826 ; SSE41-NEXT:    xorpd %xmm2, %xmm5
4827 ; SSE41-NEXT:    movapd %xmm5, %xmm6
4828 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm6
4829 ; SSE41-NEXT:    pcmpgtd %xmm9, %xmm5
4830 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
4831 ; SSE41-NEXT:    pand %xmm6, %xmm0
4832 ; SSE41-NEXT:    por %xmm5, %xmm0
4833 ; SSE41-NEXT:    movapd %xmm7, %xmm5
4834 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm5
4835 ; SSE41-NEXT:    packssdw %xmm3, %xmm5
4836 ; SSE41-NEXT:    packssdw %xmm5, %xmm1
4837 ; SSE41-NEXT:    movapd %xmm14, %xmm3
4838 ; SSE41-NEXT:    xorpd %xmm2, %xmm3
4839 ; SSE41-NEXT:    movapd %xmm3, %xmm4
4840 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm4
4841 ; SSE41-NEXT:    pcmpgtd %xmm9, %xmm3
4842 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
4843 ; SSE41-NEXT:    pand %xmm4, %xmm0
4844 ; SSE41-NEXT:    por %xmm3, %xmm0
4845 ; SSE41-NEXT:    movapd %xmm7, %xmm3
4846 ; SSE41-NEXT:    blendvpd %xmm0, %xmm14, %xmm3
4847 ; SSE41-NEXT:    movapd %xmm13, %xmm4
4848 ; SSE41-NEXT:    xorpd %xmm2, %xmm4
4849 ; SSE41-NEXT:    movapd %xmm4, %xmm5
4850 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm5
4851 ; SSE41-NEXT:    pcmpgtd %xmm9, %xmm4
4852 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
4853 ; SSE41-NEXT:    pand %xmm5, %xmm0
4854 ; SSE41-NEXT:    por %xmm4, %xmm0
4855 ; SSE41-NEXT:    movapd %xmm7, %xmm4
4856 ; SSE41-NEXT:    blendvpd %xmm0, %xmm13, %xmm4
4857 ; SSE41-NEXT:    packssdw %xmm3, %xmm4
4858 ; SSE41-NEXT:    movapd %xmm10, %xmm3
4859 ; SSE41-NEXT:    xorpd %xmm2, %xmm3
4860 ; SSE41-NEXT:    movapd %xmm3, %xmm5
4861 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm5
4862 ; SSE41-NEXT:    pcmpgtd %xmm9, %xmm3
4863 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
4864 ; SSE41-NEXT:    pand %xmm5, %xmm0
4865 ; SSE41-NEXT:    por %xmm3, %xmm0
4866 ; SSE41-NEXT:    movapd %xmm7, %xmm3
4867 ; SSE41-NEXT:    blendvpd %xmm0, %xmm10, %xmm3
4868 ; SSE41-NEXT:    xorpd %xmm8, %xmm2
4869 ; SSE41-NEXT:    movapd %xmm2, %xmm5
4870 ; SSE41-NEXT:    pcmpeqd %xmm9, %xmm5
4871 ; SSE41-NEXT:    pcmpgtd %xmm9, %xmm2
4872 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
4873 ; SSE41-NEXT:    pand %xmm5, %xmm0
4874 ; SSE41-NEXT:    por %xmm2, %xmm0
4875 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm7
4876 ; SSE41-NEXT:    packssdw %xmm3, %xmm7
4877 ; SSE41-NEXT:    packssdw %xmm7, %xmm4
4878 ; SSE41-NEXT:    packsswb %xmm4, %xmm1
4879 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
4880 ; SSE41-NEXT:    retq
4882 ; AVX1-LABEL: trunc_ssat_v16i64_v16i8:
4883 ; AVX1:       # %bb.0:
4884 ; AVX1-NEXT:    vmovdqa 112(%rdi), %xmm8
4885 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [127,127]
4886 ; AVX1-NEXT:    vmovdqa 96(%rdi), %xmm9
4887 ; AVX1-NEXT:    vmovdqa 80(%rdi), %xmm3
4888 ; AVX1-NEXT:    vmovdqa 64(%rdi), %xmm4
4889 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm5
4890 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm6
4891 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm7
4892 ; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm0
4893 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm1, %xmm2
4894 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm5, %xmm1, %xmm10
4895 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm1, %xmm5
4896 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm6, %xmm1, %xmm11
4897 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm1, %xmm6
4898 ; AVX1-NEXT:    vblendvpd %xmm6, %xmm7, %xmm1, %xmm6
4899 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm7
4900 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm0, %xmm1, %xmm0
4901 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm1, %xmm7
4902 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm4, %xmm1, %xmm4
4903 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm1, %xmm7
4904 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm3, %xmm1, %xmm3
4905 ; AVX1-NEXT:    vpcmpgtq %xmm9, %xmm1, %xmm7
4906 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm9, %xmm1, %xmm7
4907 ; AVX1-NEXT:    vpcmpgtq %xmm8, %xmm1, %xmm2
4908 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm8, %xmm1, %xmm1
4909 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [18446744073709551488,18446744073709551488]
4910 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm5
4911 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm1, %xmm2, %xmm8
4912 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm7, %xmm5
4913 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm7, %xmm2, %xmm5
4914 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm7
4915 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm3, %xmm2, %xmm3
4916 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm7
4917 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm4, %xmm2, %xmm4
4918 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm7
4919 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm0, %xmm2, %xmm0
4920 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm6, %xmm7
4921 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm6, %xmm2, %xmm6
4922 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm11, %xmm7
4923 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm11, %xmm2, %xmm7
4924 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm10, %xmm1
4925 ; AVX1-NEXT:    vblendvpd %xmm1, %xmm10, %xmm2, %xmm1
4926 ; AVX1-NEXT:    vpackssdw %xmm8, %xmm5, %xmm2
4927 ; AVX1-NEXT:    vpackssdw %xmm3, %xmm4, %xmm3
4928 ; AVX1-NEXT:    vpackssdw %xmm2, %xmm3, %xmm2
4929 ; AVX1-NEXT:    vpackssdw %xmm0, %xmm6, %xmm0
4930 ; AVX1-NEXT:    vpackssdw %xmm7, %xmm1, %xmm1
4931 ; AVX1-NEXT:    vpackssdw %xmm0, %xmm1, %xmm0
4932 ; AVX1-NEXT:    vpacksswb %xmm2, %xmm0, %xmm0
4933 ; AVX1-NEXT:    retq
4935 ; AVX2-LABEL: trunc_ssat_v16i64_v16i8:
4936 ; AVX2:       # %bb.0:
4937 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
4938 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
4939 ; AVX2-NEXT:    vmovdqa 64(%rdi), %ymm2
4940 ; AVX2-NEXT:    vmovdqa 96(%rdi), %ymm3
4941 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [127,127,127,127]
4942 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm4, %ymm5
4943 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm2, %ymm4, %ymm2
4944 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm4, %ymm5
4945 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm3, %ymm4, %ymm3
4946 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm4, %ymm5
4947 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm4, %ymm0
4948 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm4, %ymm5
4949 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm1, %ymm4, %ymm1
4950 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
4951 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm1, %ymm5
4952 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm1, %ymm4, %ymm1
4953 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm0, %ymm5
4954 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm4, %ymm0
4955 ; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
4956 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm3, %ymm1
4957 ; AVX2-NEXT:    vblendvpd %ymm1, %ymm3, %ymm4, %ymm1
4958 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm2, %ymm3
4959 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm2, %ymm4, %ymm2
4960 ; AVX2-NEXT:    vpackssdw %ymm1, %ymm2, %ymm1
4961 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
4962 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4963 ; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
4964 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4965 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
4966 ; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
4967 ; AVX2-NEXT:    vzeroupper
4968 ; AVX2-NEXT:    retq
4970 ; AVX512F-LABEL: trunc_ssat_v16i64_v16i8:
4971 ; AVX512F:       # %bb.0:
4972 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} zmm0 = [127,127,127,127,127,127,127,127]
4973 ; AVX512F-NEXT:    vpminsq (%rdi), %zmm0, %zmm1
4974 ; AVX512F-NEXT:    vpminsq 64(%rdi), %zmm0, %zmm0
4975 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} zmm2 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
4976 ; AVX512F-NEXT:    vpmaxsq %zmm2, %zmm0, %zmm0
4977 ; AVX512F-NEXT:    vpmaxsq %zmm2, %zmm1, %zmm1
4978 ; AVX512F-NEXT:    vpmovqd %zmm1, %ymm1
4979 ; AVX512F-NEXT:    vpmovqd %zmm0, %ymm0
4980 ; AVX512F-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
4981 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
4982 ; AVX512F-NEXT:    vzeroupper
4983 ; AVX512F-NEXT:    retq
4985 ; AVX512VL-LABEL: trunc_ssat_v16i64_v16i8:
4986 ; AVX512VL:       # %bb.0:
4987 ; AVX512VL-NEXT:    vmovdqa64 (%rdi), %zmm0
4988 ; AVX512VL-NEXT:    vmovdqa64 64(%rdi), %zmm1
4989 ; AVX512VL-NEXT:    vpmovsqb %zmm1, %xmm1
4990 ; AVX512VL-NEXT:    vpmovsqb %zmm0, %xmm0
4991 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4992 ; AVX512VL-NEXT:    vzeroupper
4993 ; AVX512VL-NEXT:    retq
4995 ; AVX512BW-LABEL: trunc_ssat_v16i64_v16i8:
4996 ; AVX512BW:       # %bb.0:
4997 ; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} zmm0 = [127,127,127,127,127,127,127,127]
4998 ; AVX512BW-NEXT:    vpminsq (%rdi), %zmm0, %zmm1
4999 ; AVX512BW-NEXT:    vpminsq 64(%rdi), %zmm0, %zmm0
5000 ; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} zmm2 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
5001 ; AVX512BW-NEXT:    vpmaxsq %zmm2, %zmm0, %zmm0
5002 ; AVX512BW-NEXT:    vpmaxsq %zmm2, %zmm1, %zmm1
5003 ; AVX512BW-NEXT:    vpmovqd %zmm1, %ymm1
5004 ; AVX512BW-NEXT:    vpmovqd %zmm0, %ymm0
5005 ; AVX512BW-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
5006 ; AVX512BW-NEXT:    vpmovdb %zmm0, %xmm0
5007 ; AVX512BW-NEXT:    vzeroupper
5008 ; AVX512BW-NEXT:    retq
5010 ; AVX512BWVL-LABEL: trunc_ssat_v16i64_v16i8:
5011 ; AVX512BWVL:       # %bb.0:
5012 ; AVX512BWVL-NEXT:    vmovdqa64 (%rdi), %zmm0
5013 ; AVX512BWVL-NEXT:    vmovdqa64 64(%rdi), %zmm1
5014 ; AVX512BWVL-NEXT:    vpmovsqb %zmm1, %xmm1
5015 ; AVX512BWVL-NEXT:    vpmovsqb %zmm0, %xmm0
5016 ; AVX512BWVL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
5017 ; AVX512BWVL-NEXT:    vzeroupper
5018 ; AVX512BWVL-NEXT:    retq
5020 ; SKX-LABEL: trunc_ssat_v16i64_v16i8:
5021 ; SKX:       # %bb.0:
5022 ; SKX-NEXT:    vmovdqa (%rdi), %ymm0
5023 ; SKX-NEXT:    vmovdqa 32(%rdi), %ymm1
5024 ; SKX-NEXT:    vmovdqa 64(%rdi), %ymm2
5025 ; SKX-NEXT:    vmovdqa 96(%rdi), %ymm3
5026 ; SKX-NEXT:    vpmovsqb %ymm3, %xmm3
5027 ; SKX-NEXT:    vpmovsqb %ymm2, %xmm2
5028 ; SKX-NEXT:    vpunpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
5029 ; SKX-NEXT:    vpmovsqb %ymm1, %xmm1
5030 ; SKX-NEXT:    vpmovsqb %ymm0, %xmm0
5031 ; SKX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
5032 ; SKX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
5033 ; SKX-NEXT:    vzeroupper
5034 ; SKX-NEXT:    retq
5035   %a0 = load <16 x i64>, <16 x i64>* %p0
5036   %1 = icmp slt <16 x i64> %a0, <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>
5037   %2 = select <16 x i1> %1, <16 x i64> %a0, <16 x i64> <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>
5038   %3 = icmp sgt <16 x i64> %2, <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>
5039   %4 = select <16 x i1> %3, <16 x i64> %2, <16 x i64> <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>
5040   %5 = trunc <16 x i64> %4 to <16 x i8>
5041   ret <16 x i8> %5
5044 define <4 x i8> @trunc_ssat_v4i32_v4i8(<4 x i32> %a0) {
5045 ; SSE2-LABEL: trunc_ssat_v4i32_v4i8:
5046 ; SSE2:       # %bb.0:
5047 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [127,127,127,127]
5048 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
5049 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
5050 ; SSE2-NEXT:    pand %xmm2, %xmm0
5051 ; SSE2-NEXT:    pandn %xmm1, %xmm2
5052 ; SSE2-NEXT:    por %xmm0, %xmm2
5053 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [4294967168,4294967168,4294967168,4294967168]
5054 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
5055 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
5056 ; SSE2-NEXT:    pand %xmm0, %xmm2
5057 ; SSE2-NEXT:    pandn %xmm1, %xmm0
5058 ; SSE2-NEXT:    por %xmm2, %xmm0
5059 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
5060 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
5061 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
5062 ; SSE2-NEXT:    retq
5064 ; SSSE3-LABEL: trunc_ssat_v4i32_v4i8:
5065 ; SSSE3:       # %bb.0:
5066 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [127,127,127,127]
5067 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
5068 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
5069 ; SSSE3-NEXT:    pand %xmm2, %xmm0
5070 ; SSSE3-NEXT:    pandn %xmm1, %xmm2
5071 ; SSSE3-NEXT:    por %xmm0, %xmm2
5072 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [4294967168,4294967168,4294967168,4294967168]
5073 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
5074 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
5075 ; SSSE3-NEXT:    pand %xmm0, %xmm2
5076 ; SSSE3-NEXT:    pandn %xmm1, %xmm0
5077 ; SSSE3-NEXT:    por %xmm2, %xmm0
5078 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
5079 ; SSSE3-NEXT:    retq
5081 ; SSE41-LABEL: trunc_ssat_v4i32_v4i8:
5082 ; SSE41:       # %bb.0:
5083 ; SSE41-NEXT:    pminsd {{.*}}(%rip), %xmm0
5084 ; SSE41-NEXT:    pmaxsd {{.*}}(%rip), %xmm0
5085 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
5086 ; SSE41-NEXT:    retq
5088 ; AVX1-LABEL: trunc_ssat_v4i32_v4i8:
5089 ; AVX1:       # %bb.0:
5090 ; AVX1-NEXT:    vpminsd {{.*}}(%rip), %xmm0, %xmm0
5091 ; AVX1-NEXT:    vpmaxsd {{.*}}(%rip), %xmm0, %xmm0
5092 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
5093 ; AVX1-NEXT:    retq
5095 ; AVX2-LABEL: trunc_ssat_v4i32_v4i8:
5096 ; AVX2:       # %bb.0:
5097 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [127,127,127,127]
5098 ; AVX2-NEXT:    vpminsd %xmm1, %xmm0, %xmm0
5099 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [4294967168,4294967168,4294967168,4294967168]
5100 ; AVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
5101 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
5102 ; AVX2-NEXT:    retq
5104 ; AVX512F-LABEL: trunc_ssat_v4i32_v4i8:
5105 ; AVX512F:       # %bb.0:
5106 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
5107 ; AVX512F-NEXT:    vpmovsdb %zmm0, %xmm0
5108 ; AVX512F-NEXT:    vzeroupper
5109 ; AVX512F-NEXT:    retq
5111 ; AVX512VL-LABEL: trunc_ssat_v4i32_v4i8:
5112 ; AVX512VL:       # %bb.0:
5113 ; AVX512VL-NEXT:    vpmovsdb %xmm0, %xmm0
5114 ; AVX512VL-NEXT:    retq
5116 ; AVX512BW-LABEL: trunc_ssat_v4i32_v4i8:
5117 ; AVX512BW:       # %bb.0:
5118 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
5119 ; AVX512BW-NEXT:    vpmovsdb %zmm0, %xmm0
5120 ; AVX512BW-NEXT:    vzeroupper
5121 ; AVX512BW-NEXT:    retq
5123 ; AVX512BWVL-LABEL: trunc_ssat_v4i32_v4i8:
5124 ; AVX512BWVL:       # %bb.0:
5125 ; AVX512BWVL-NEXT:    vpmovsdb %xmm0, %xmm0
5126 ; AVX512BWVL-NEXT:    retq
5128 ; SKX-LABEL: trunc_ssat_v4i32_v4i8:
5129 ; SKX:       # %bb.0:
5130 ; SKX-NEXT:    vpmovsdb %xmm0, %xmm0
5131 ; SKX-NEXT:    retq
5132   %1 = icmp slt <4 x i32> %a0, <i32 127, i32 127, i32 127, i32 127>
5133   %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 127, i32 127, i32 127, i32 127>
5134   %3 = icmp sgt <4 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128>
5135   %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> <i32 -128, i32 -128, i32 -128, i32 -128>
5136   %5 = trunc <4 x i32> %4 to <4 x i8>
5137   ret <4 x i8> %5
5140 define void @trunc_ssat_v4i32_v4i8_store(<4 x i32> %a0, <4 x i8> *%p1) {
5141 ; SSE2-LABEL: trunc_ssat_v4i32_v4i8_store:
5142 ; SSE2:       # %bb.0:
5143 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [127,127,127,127]
5144 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
5145 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
5146 ; SSE2-NEXT:    pand %xmm2, %xmm0
5147 ; SSE2-NEXT:    pandn %xmm1, %xmm2
5148 ; SSE2-NEXT:    por %xmm0, %xmm2
5149 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [4294967168,4294967168,4294967168,4294967168]
5150 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
5151 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
5152 ; SSE2-NEXT:    pand %xmm1, %xmm2
5153 ; SSE2-NEXT:    pandn %xmm0, %xmm1
5154 ; SSE2-NEXT:    por %xmm2, %xmm1
5155 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
5156 ; SSE2-NEXT:    packuswb %xmm0, %xmm1
5157 ; SSE2-NEXT:    packuswb %xmm0, %xmm1
5158 ; SSE2-NEXT:    movd %xmm1, (%rdi)
5159 ; SSE2-NEXT:    retq
5161 ; SSSE3-LABEL: trunc_ssat_v4i32_v4i8_store:
5162 ; SSSE3:       # %bb.0:
5163 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [127,127,127,127]
5164 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
5165 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
5166 ; SSSE3-NEXT:    pand %xmm2, %xmm0
5167 ; SSSE3-NEXT:    pandn %xmm1, %xmm2
5168 ; SSSE3-NEXT:    por %xmm0, %xmm2
5169 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [4294967168,4294967168,4294967168,4294967168]
5170 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
5171 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
5172 ; SSSE3-NEXT:    pand %xmm1, %xmm2
5173 ; SSSE3-NEXT:    pandn %xmm0, %xmm1
5174 ; SSSE3-NEXT:    por %xmm2, %xmm1
5175 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
5176 ; SSSE3-NEXT:    movd %xmm1, (%rdi)
5177 ; SSSE3-NEXT:    retq
5179 ; SSE41-LABEL: trunc_ssat_v4i32_v4i8_store:
5180 ; SSE41:       # %bb.0:
5181 ; SSE41-NEXT:    pminsd {{.*}}(%rip), %xmm0
5182 ; SSE41-NEXT:    pmaxsd {{.*}}(%rip), %xmm0
5183 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
5184 ; SSE41-NEXT:    movd %xmm0, (%rdi)
5185 ; SSE41-NEXT:    retq
5187 ; AVX1-LABEL: trunc_ssat_v4i32_v4i8_store:
5188 ; AVX1:       # %bb.0:
5189 ; AVX1-NEXT:    vpminsd {{.*}}(%rip), %xmm0, %xmm0
5190 ; AVX1-NEXT:    vpmaxsd {{.*}}(%rip), %xmm0, %xmm0
5191 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
5192 ; AVX1-NEXT:    vmovd %xmm0, (%rdi)
5193 ; AVX1-NEXT:    retq
5195 ; AVX2-LABEL: trunc_ssat_v4i32_v4i8_store:
5196 ; AVX2:       # %bb.0:
5197 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [127,127,127,127]
5198 ; AVX2-NEXT:    vpminsd %xmm1, %xmm0, %xmm0
5199 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [4294967168,4294967168,4294967168,4294967168]
5200 ; AVX2-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
5201 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
5202 ; AVX2-NEXT:    vmovd %xmm0, (%rdi)
5203 ; AVX2-NEXT:    retq
5205 ; AVX512F-LABEL: trunc_ssat_v4i32_v4i8_store:
5206 ; AVX512F:       # %bb.0:
5207 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
5208 ; AVX512F-NEXT:    vpmovsdb %zmm0, %xmm0
5209 ; AVX512F-NEXT:    vmovd %xmm0, (%rdi)
5210 ; AVX512F-NEXT:    vzeroupper
5211 ; AVX512F-NEXT:    retq
5213 ; AVX512VL-LABEL: trunc_ssat_v4i32_v4i8_store:
5214 ; AVX512VL:       # %bb.0:
5215 ; AVX512VL-NEXT:    vpmovsdb %xmm0, (%rdi)
5216 ; AVX512VL-NEXT:    retq
5218 ; AVX512BW-LABEL: trunc_ssat_v4i32_v4i8_store:
5219 ; AVX512BW:       # %bb.0:
5220 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
5221 ; AVX512BW-NEXT:    vpmovsdb %zmm0, %xmm0
5222 ; AVX512BW-NEXT:    vmovd %xmm0, (%rdi)
5223 ; AVX512BW-NEXT:    vzeroupper
5224 ; AVX512BW-NEXT:    retq
5226 ; AVX512BWVL-LABEL: trunc_ssat_v4i32_v4i8_store:
5227 ; AVX512BWVL:       # %bb.0:
5228 ; AVX512BWVL-NEXT:    vpmovsdb %xmm0, (%rdi)
5229 ; AVX512BWVL-NEXT:    retq
5231 ; SKX-LABEL: trunc_ssat_v4i32_v4i8_store:
5232 ; SKX:       # %bb.0:
5233 ; SKX-NEXT:    vpmovsdb %xmm0, (%rdi)
5234 ; SKX-NEXT:    retq
5235   %1 = icmp slt <4 x i32> %a0, <i32 127, i32 127, i32 127, i32 127>
5236   %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 127, i32 127, i32 127, i32 127>
5237   %3 = icmp sgt <4 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128>
5238   %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> <i32 -128, i32 -128, i32 -128, i32 -128>
5239   %5 = trunc <4 x i32> %4 to <4 x i8>
5240   store <4 x i8> %5, <4 x i8> *%p1
5241   ret void
5244 define <8 x i8> @trunc_ssat_v8i32_v8i8(<8 x i32> %a0) {
5245 ; SSE-LABEL: trunc_ssat_v8i32_v8i8:
5246 ; SSE:       # %bb.0:
5247 ; SSE-NEXT:    packssdw %xmm1, %xmm0
5248 ; SSE-NEXT:    packsswb %xmm0, %xmm0
5249 ; SSE-NEXT:    retq
5251 ; AVX1-LABEL: trunc_ssat_v8i32_v8i8:
5252 ; AVX1:       # %bb.0:
5253 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
5254 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
5255 ; AVX1-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
5256 ; AVX1-NEXT:    vzeroupper
5257 ; AVX1-NEXT:    retq
5259 ; AVX2-LABEL: trunc_ssat_v8i32_v8i8:
5260 ; AVX2:       # %bb.0:
5261 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
5262 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
5263 ; AVX2-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
5264 ; AVX2-NEXT:    vzeroupper
5265 ; AVX2-NEXT:    retq
5267 ; AVX512F-LABEL: trunc_ssat_v8i32_v8i8:
5268 ; AVX512F:       # %bb.0:
5269 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
5270 ; AVX512F-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
5271 ; AVX512F-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
5272 ; AVX512F-NEXT:    vzeroupper
5273 ; AVX512F-NEXT:    retq
5275 ; AVX512VL-LABEL: trunc_ssat_v8i32_v8i8:
5276 ; AVX512VL:       # %bb.0:
5277 ; AVX512VL-NEXT:    vpmovsdb %ymm0, %xmm0
5278 ; AVX512VL-NEXT:    vzeroupper
5279 ; AVX512VL-NEXT:    retq
5281 ; AVX512BW-LABEL: trunc_ssat_v8i32_v8i8:
5282 ; AVX512BW:       # %bb.0:
5283 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
5284 ; AVX512BW-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
5285 ; AVX512BW-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
5286 ; AVX512BW-NEXT:    vzeroupper
5287 ; AVX512BW-NEXT:    retq
5289 ; AVX512BWVL-LABEL: trunc_ssat_v8i32_v8i8:
5290 ; AVX512BWVL:       # %bb.0:
5291 ; AVX512BWVL-NEXT:    vpmovsdb %ymm0, %xmm0
5292 ; AVX512BWVL-NEXT:    vzeroupper
5293 ; AVX512BWVL-NEXT:    retq
5295 ; SKX-LABEL: trunc_ssat_v8i32_v8i8:
5296 ; SKX:       # %bb.0:
5297 ; SKX-NEXT:    vpmovsdb %ymm0, %xmm0
5298 ; SKX-NEXT:    vzeroupper
5299 ; SKX-NEXT:    retq
5300   %1 = icmp slt <8 x i32> %a0, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
5301   %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
5302   %3 = icmp sgt <8 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
5303   %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
5304   %5 = trunc <8 x i32> %4 to <8 x i8>
5305   ret <8 x i8> %5
5308 define void @trunc_ssat_v8i32_v8i8_store(<8 x i32> %a0, <8 x i8> *%p1) {
5309 ; SSE-LABEL: trunc_ssat_v8i32_v8i8_store:
5310 ; SSE:       # %bb.0:
5311 ; SSE-NEXT:    packssdw %xmm1, %xmm0
5312 ; SSE-NEXT:    packsswb %xmm0, %xmm0
5313 ; SSE-NEXT:    movq %xmm0, (%rdi)
5314 ; SSE-NEXT:    retq
5316 ; AVX1-LABEL: trunc_ssat_v8i32_v8i8_store:
5317 ; AVX1:       # %bb.0:
5318 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
5319 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
5320 ; AVX1-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
5321 ; AVX1-NEXT:    vmovq %xmm0, (%rdi)
5322 ; AVX1-NEXT:    vzeroupper
5323 ; AVX1-NEXT:    retq
5325 ; AVX2-LABEL: trunc_ssat_v8i32_v8i8_store:
5326 ; AVX2:       # %bb.0:
5327 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
5328 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
5329 ; AVX2-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
5330 ; AVX2-NEXT:    vmovq %xmm0, (%rdi)
5331 ; AVX2-NEXT:    vzeroupper
5332 ; AVX2-NEXT:    retq
5334 ; AVX512F-LABEL: trunc_ssat_v8i32_v8i8_store:
5335 ; AVX512F:       # %bb.0:
5336 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
5337 ; AVX512F-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
5338 ; AVX512F-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
5339 ; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
5340 ; AVX512F-NEXT:    vzeroupper
5341 ; AVX512F-NEXT:    retq
5343 ; AVX512VL-LABEL: trunc_ssat_v8i32_v8i8_store:
5344 ; AVX512VL:       # %bb.0:
5345 ; AVX512VL-NEXT:    vpmovsdb %ymm0, (%rdi)
5346 ; AVX512VL-NEXT:    vzeroupper
5347 ; AVX512VL-NEXT:    retq
5349 ; AVX512BW-LABEL: trunc_ssat_v8i32_v8i8_store:
5350 ; AVX512BW:       # %bb.0:
5351 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
5352 ; AVX512BW-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
5353 ; AVX512BW-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
5354 ; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
5355 ; AVX512BW-NEXT:    vzeroupper
5356 ; AVX512BW-NEXT:    retq
5358 ; AVX512BWVL-LABEL: trunc_ssat_v8i32_v8i8_store:
5359 ; AVX512BWVL:       # %bb.0:
5360 ; AVX512BWVL-NEXT:    vpmovsdb %ymm0, (%rdi)
5361 ; AVX512BWVL-NEXT:    vzeroupper
5362 ; AVX512BWVL-NEXT:    retq
5364 ; SKX-LABEL: trunc_ssat_v8i32_v8i8_store:
5365 ; SKX:       # %bb.0:
5366 ; SKX-NEXT:    vpmovsdb %ymm0, (%rdi)
5367 ; SKX-NEXT:    vzeroupper
5368 ; SKX-NEXT:    retq
5369   %1 = icmp slt <8 x i32> %a0, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
5370   %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
5371   %3 = icmp sgt <8 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
5372   %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
5373   %5 = trunc <8 x i32> %4 to <8 x i8>
5374   store <8 x i8> %5, <8 x i8> *%p1
5375   ret void
5378 define <16 x i8> @trunc_ssat_v16i32_v16i8(<16 x i32>* %p0) "min-legal-vector-width"="256" {
5379 ; SSE-LABEL: trunc_ssat_v16i32_v16i8:
5380 ; SSE:       # %bb.0:
5381 ; SSE-NEXT:    movdqa (%rdi), %xmm0
5382 ; SSE-NEXT:    movdqa 32(%rdi), %xmm1
5383 ; SSE-NEXT:    packssdw 48(%rdi), %xmm1
5384 ; SSE-NEXT:    packssdw 16(%rdi), %xmm0
5385 ; SSE-NEXT:    packsswb %xmm1, %xmm0
5386 ; SSE-NEXT:    retq
5388 ; AVX1-LABEL: trunc_ssat_v16i32_v16i8:
5389 ; AVX1:       # %bb.0:
5390 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
5391 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm1
5392 ; AVX1-NEXT:    vpackssdw 48(%rdi), %xmm1, %xmm1
5393 ; AVX1-NEXT:    vpackssdw 16(%rdi), %xmm0, %xmm0
5394 ; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
5395 ; AVX1-NEXT:    retq
5397 ; AVX2-LABEL: trunc_ssat_v16i32_v16i8:
5398 ; AVX2:       # %bb.0:
5399 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
5400 ; AVX2-NEXT:    vpackssdw 32(%rdi), %ymm0, %ymm0
5401 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
5402 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
5403 ; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
5404 ; AVX2-NEXT:    vzeroupper
5405 ; AVX2-NEXT:    retq
5407 ; AVX512-LABEL: trunc_ssat_v16i32_v16i8:
5408 ; AVX512:       # %bb.0:
5409 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
5410 ; AVX512-NEXT:    vpmovsdb %zmm0, %xmm0
5411 ; AVX512-NEXT:    vzeroupper
5412 ; AVX512-NEXT:    retq
5414 ; SKX-LABEL: trunc_ssat_v16i32_v16i8:
5415 ; SKX:       # %bb.0:
5416 ; SKX-NEXT:    vmovdqa (%rdi), %ymm0
5417 ; SKX-NEXT:    vmovdqa 32(%rdi), %ymm1
5418 ; SKX-NEXT:    vpmovsdb %ymm1, %xmm1
5419 ; SKX-NEXT:    vpmovsdb %ymm0, %xmm0
5420 ; SKX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
5421 ; SKX-NEXT:    vzeroupper
5422 ; SKX-NEXT:    retq
5423   %a0 = load <16 x i32>, <16 x i32>* %p0
5424   %1 = icmp slt <16 x i32> %a0, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
5425   %2 = select <16 x i1> %1, <16 x i32> %a0, <16 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
5426   %3 = icmp sgt <16 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
5427   %4 = select <16 x i1> %3, <16 x i32> %2, <16 x i32> <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
5428   %5 = trunc <16 x i32> %4 to <16 x i8>
5429   ret <16 x i8> %5
5432 define void @trunc_ssat_v16i32_v16i8_store(<16 x i32>* %p0, <16 x i8>* %p1) "min-legal-vector-width"="256" {
5433 ; SSE-LABEL: trunc_ssat_v16i32_v16i8_store:
5434 ; SSE:       # %bb.0:
5435 ; SSE-NEXT:    movdqa (%rdi), %xmm0
5436 ; SSE-NEXT:    movdqa 32(%rdi), %xmm1
5437 ; SSE-NEXT:    packssdw 48(%rdi), %xmm1
5438 ; SSE-NEXT:    packssdw 16(%rdi), %xmm0
5439 ; SSE-NEXT:    packsswb %xmm1, %xmm0
5440 ; SSE-NEXT:    movdqa %xmm0, (%rsi)
5441 ; SSE-NEXT:    retq
5443 ; AVX1-LABEL: trunc_ssat_v16i32_v16i8_store:
5444 ; AVX1:       # %bb.0:
5445 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
5446 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm1
5447 ; AVX1-NEXT:    vpackssdw 48(%rdi), %xmm1, %xmm1
5448 ; AVX1-NEXT:    vpackssdw 16(%rdi), %xmm0, %xmm0
5449 ; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
5450 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsi)
5451 ; AVX1-NEXT:    retq
5453 ; AVX2-LABEL: trunc_ssat_v16i32_v16i8_store:
5454 ; AVX2:       # %bb.0:
5455 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
5456 ; AVX2-NEXT:    vpackssdw 32(%rdi), %ymm0, %ymm0
5457 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
5458 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
5459 ; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
5460 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsi)
5461 ; AVX2-NEXT:    vzeroupper
5462 ; AVX2-NEXT:    retq
5464 ; AVX512-LABEL: trunc_ssat_v16i32_v16i8_store:
5465 ; AVX512:       # %bb.0:
5466 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
5467 ; AVX512-NEXT:    vpmovsdb %zmm0, (%rsi)
5468 ; AVX512-NEXT:    vzeroupper
5469 ; AVX512-NEXT:    retq
5471 ; SKX-LABEL: trunc_ssat_v16i32_v16i8_store:
5472 ; SKX:       # %bb.0:
5473 ; SKX-NEXT:    vmovdqa (%rdi), %ymm0
5474 ; SKX-NEXT:    vmovdqa 32(%rdi), %ymm1
5475 ; SKX-NEXT:    vpmovsdb %ymm1, %xmm1
5476 ; SKX-NEXT:    vpmovsdb %ymm0, %xmm0
5477 ; SKX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
5478 ; SKX-NEXT:    vmovdqa %xmm0, (%rsi)
5479 ; SKX-NEXT:    vzeroupper
5480 ; SKX-NEXT:    retq
5481   %a0 = load <16 x i32>, <16 x i32>* %p0
5482   %1 = icmp slt <16 x i32> %a0, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
5483   %2 = select <16 x i1> %1, <16 x i32> %a0, <16 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
5484   %3 = icmp sgt <16 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
5485   %4 = select <16 x i1> %3, <16 x i32> %2, <16 x i32> <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
5486   %5 = trunc <16 x i32> %4 to <16 x i8>
5487   store <16 x i8> %5, <16 x i8>* %p1
5488   ret void
5491 define <8 x i8> @trunc_ssat_v8i16_v8i8(<8 x i16> %a0) {
5492 ; SSE-LABEL: trunc_ssat_v8i16_v8i8:
5493 ; SSE:       # %bb.0:
5494 ; SSE-NEXT:    packsswb %xmm0, %xmm0
5495 ; SSE-NEXT:    retq
5497 ; AVX-LABEL: trunc_ssat_v8i16_v8i8:
5498 ; AVX:       # %bb.0:
5499 ; AVX-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
5500 ; AVX-NEXT:    retq
5502 ; AVX512-LABEL: trunc_ssat_v8i16_v8i8:
5503 ; AVX512:       # %bb.0:
5504 ; AVX512-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
5505 ; AVX512-NEXT:    retq
5507 ; SKX-LABEL: trunc_ssat_v8i16_v8i8:
5508 ; SKX:       # %bb.0:
5509 ; SKX-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
5510 ; SKX-NEXT:    retq
5511   %1 = icmp slt <8 x i16> %a0, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
5512   %2 = select <8 x i1> %1, <8 x i16> %a0, <8 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
5513   %3 = icmp sgt <8 x i16> %2, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
5514   %4 = select <8 x i1> %3, <8 x i16> %2, <8 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
5515   %5 = trunc <8 x i16> %4 to <8 x i8>
5516   ret <8 x i8> %5
5519 define void @trunc_ssat_v8i16_v8i8_store(<8 x i16> %a0, <8 x i8> *%p1) {
5520 ; SSE-LABEL: trunc_ssat_v8i16_v8i8_store:
5521 ; SSE:       # %bb.0:
5522 ; SSE-NEXT:    packsswb %xmm0, %xmm0
5523 ; SSE-NEXT:    movq %xmm0, (%rdi)
5524 ; SSE-NEXT:    retq
5526 ; AVX-LABEL: trunc_ssat_v8i16_v8i8_store:
5527 ; AVX:       # %bb.0:
5528 ; AVX-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
5529 ; AVX-NEXT:    vmovq %xmm0, (%rdi)
5530 ; AVX-NEXT:    retq
5532 ; AVX512F-LABEL: trunc_ssat_v8i16_v8i8_store:
5533 ; AVX512F:       # %bb.0:
5534 ; AVX512F-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
5535 ; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
5536 ; AVX512F-NEXT:    retq
5538 ; AVX512VL-LABEL: trunc_ssat_v8i16_v8i8_store:
5539 ; AVX512VL:       # %bb.0:
5540 ; AVX512VL-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
5541 ; AVX512VL-NEXT:    vmovq %xmm0, (%rdi)
5542 ; AVX512VL-NEXT:    retq
5544 ; AVX512BW-LABEL: trunc_ssat_v8i16_v8i8_store:
5545 ; AVX512BW:       # %bb.0:
5546 ; AVX512BW-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
5547 ; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
5548 ; AVX512BW-NEXT:    retq
5550 ; AVX512BWVL-LABEL: trunc_ssat_v8i16_v8i8_store:
5551 ; AVX512BWVL:       # %bb.0:
5552 ; AVX512BWVL-NEXT:    vpmovswb %xmm0, (%rdi)
5553 ; AVX512BWVL-NEXT:    retq
5555 ; SKX-LABEL: trunc_ssat_v8i16_v8i8_store:
5556 ; SKX:       # %bb.0:
5557 ; SKX-NEXT:    vpmovswb %xmm0, (%rdi)
5558 ; SKX-NEXT:    retq
5559   %1 = icmp slt <8 x i16> %a0, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
5560   %2 = select <8 x i1> %1, <8 x i16> %a0, <8 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
5561   %3 = icmp sgt <8 x i16> %2, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
5562   %4 = select <8 x i1> %3, <8 x i16> %2, <8 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
5563   %5 = trunc <8 x i16> %4 to <8 x i8>
5564   store <8 x i8> %5, <8 x i8> *%p1
5565   ret void
5568 define <16 x i8> @trunc_ssat_v16i16_v16i8(<16 x i16> %a0) {
5569 ; SSE-LABEL: trunc_ssat_v16i16_v16i8:
5570 ; SSE:       # %bb.0:
5571 ; SSE-NEXT:    packsswb %xmm1, %xmm0
5572 ; SSE-NEXT:    retq
5574 ; AVX1-LABEL: trunc_ssat_v16i16_v16i8:
5575 ; AVX1:       # %bb.0:
5576 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
5577 ; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
5578 ; AVX1-NEXT:    vzeroupper
5579 ; AVX1-NEXT:    retq
5581 ; AVX2-LABEL: trunc_ssat_v16i16_v16i8:
5582 ; AVX2:       # %bb.0:
5583 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
5584 ; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
5585 ; AVX2-NEXT:    vzeroupper
5586 ; AVX2-NEXT:    retq
5588 ; AVX512F-LABEL: trunc_ssat_v16i16_v16i8:
5589 ; AVX512F:       # %bb.0:
5590 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
5591 ; AVX512F-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
5592 ; AVX512F-NEXT:    vzeroupper
5593 ; AVX512F-NEXT:    retq
5595 ; AVX512VL-LABEL: trunc_ssat_v16i16_v16i8:
5596 ; AVX512VL:       # %bb.0:
5597 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
5598 ; AVX512VL-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
5599 ; AVX512VL-NEXT:    vzeroupper
5600 ; AVX512VL-NEXT:    retq
5602 ; AVX512BW-LABEL: trunc_ssat_v16i16_v16i8:
5603 ; AVX512BW:       # %bb.0:
5604 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
5605 ; AVX512BW-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
5606 ; AVX512BW-NEXT:    vzeroupper
5607 ; AVX512BW-NEXT:    retq
5609 ; AVX512BWVL-LABEL: trunc_ssat_v16i16_v16i8:
5610 ; AVX512BWVL:       # %bb.0:
5611 ; AVX512BWVL-NEXT:    vpmovswb %ymm0, %xmm0
5612 ; AVX512BWVL-NEXT:    vzeroupper
5613 ; AVX512BWVL-NEXT:    retq
5615 ; SKX-LABEL: trunc_ssat_v16i16_v16i8:
5616 ; SKX:       # %bb.0:
5617 ; SKX-NEXT:    vpmovswb %ymm0, %xmm0
5618 ; SKX-NEXT:    vzeroupper
5619 ; SKX-NEXT:    retq
5620   %1 = icmp slt <16 x i16> %a0, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
5621   %2 = select <16 x i1> %1, <16 x i16> %a0, <16 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
5622   %3 = icmp sgt <16 x i16> %2, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
5623   %4 = select <16 x i1> %3, <16 x i16> %2, <16 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
5624   %5 = trunc <16 x i16> %4 to <16 x i8>
5625   ret <16 x i8> %5
5628 define <32 x i8> @trunc_ssat_v32i16_v32i8(<32 x i16>* %p0) "min-legal-vector-width"="256" {
5629 ; SSE-LABEL: trunc_ssat_v32i16_v32i8:
5630 ; SSE:       # %bb.0:
5631 ; SSE-NEXT:    movdqa (%rdi), %xmm0
5632 ; SSE-NEXT:    movdqa 32(%rdi), %xmm1
5633 ; SSE-NEXT:    packsswb 16(%rdi), %xmm0
5634 ; SSE-NEXT:    packsswb 48(%rdi), %xmm1
5635 ; SSE-NEXT:    retq
5637 ; AVX1-LABEL: trunc_ssat_v32i16_v32i8:
5638 ; AVX1:       # %bb.0:
5639 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
5640 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm1
5641 ; AVX1-NEXT:    vpacksswb 48(%rdi), %xmm1, %xmm1
5642 ; AVX1-NEXT:    vpacksswb 16(%rdi), %xmm0, %xmm0
5643 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
5644 ; AVX1-NEXT:    retq
5646 ; AVX2-LABEL: trunc_ssat_v32i16_v32i8:
5647 ; AVX2:       # %bb.0:
5648 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
5649 ; AVX2-NEXT:    vpacksswb 32(%rdi), %ymm0, %ymm0
5650 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
5651 ; AVX2-NEXT:    retq
5653 ; AVX512F-LABEL: trunc_ssat_v32i16_v32i8:
5654 ; AVX512F:       # %bb.0:
5655 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
5656 ; AVX512F-NEXT:    vpacksswb 32(%rdi), %ymm0, %ymm0
5657 ; AVX512F-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
5658 ; AVX512F-NEXT:    retq
5660 ; AVX512VL-LABEL: trunc_ssat_v32i16_v32i8:
5661 ; AVX512VL:       # %bb.0:
5662 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm0
5663 ; AVX512VL-NEXT:    vpacksswb 32(%rdi), %ymm0, %ymm0
5664 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
5665 ; AVX512VL-NEXT:    retq
5667 ; AVX512BW-LABEL: trunc_ssat_v32i16_v32i8:
5668 ; AVX512BW:       # %bb.0:
5669 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
5670 ; AVX512BW-NEXT:    vpmovswb %zmm0, %ymm0
5671 ; AVX512BW-NEXT:    retq
5673 ; AVX512BWVL-LABEL: trunc_ssat_v32i16_v32i8:
5674 ; AVX512BWVL:       # %bb.0:
5675 ; AVX512BWVL-NEXT:    vmovdqa64 (%rdi), %zmm0
5676 ; AVX512BWVL-NEXT:    vpmovswb %zmm0, %ymm0
5677 ; AVX512BWVL-NEXT:    retq
5679 ; SKX-LABEL: trunc_ssat_v32i16_v32i8:
5680 ; SKX:       # %bb.0:
5681 ; SKX-NEXT:    vmovdqa (%rdi), %ymm0
5682 ; SKX-NEXT:    vpacksswb 32(%rdi), %ymm0, %ymm0
5683 ; SKX-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
5684 ; SKX-NEXT:    retq
5685   %a0 = load <32 x i16>, <32 x i16>* %p0
5686   %1 = icmp slt <32 x i16> %a0, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
5687   %2 = select <32 x i1> %1, <32 x i16> %a0, <32 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
5688   %3 = icmp sgt <32 x i16> %2, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
5689   %4 = select <32 x i1> %3, <32 x i16> %2, <32 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
5690   %5 = trunc <32 x i16> %4 to <32 x i8>
5691   ret <32 x i8> %5
5694 define <32 x i8> @trunc_ssat_v32i32_v32i8(<32 x i32>* %p0) "min-legal-vector-width"="256" {
5695 ; SSE-LABEL: trunc_ssat_v32i32_v32i8:
5696 ; SSE:       # %bb.0:
5697 ; SSE-NEXT:    movdqa (%rdi), %xmm0
5698 ; SSE-NEXT:    movdqa 32(%rdi), %xmm2
5699 ; SSE-NEXT:    movdqa 64(%rdi), %xmm1
5700 ; SSE-NEXT:    movdqa 96(%rdi), %xmm3
5701 ; SSE-NEXT:    packssdw 48(%rdi), %xmm2
5702 ; SSE-NEXT:    packssdw 16(%rdi), %xmm0
5703 ; SSE-NEXT:    packsswb %xmm2, %xmm0
5704 ; SSE-NEXT:    packssdw 112(%rdi), %xmm3
5705 ; SSE-NEXT:    packssdw 80(%rdi), %xmm1
5706 ; SSE-NEXT:    packsswb %xmm3, %xmm1
5707 ; SSE-NEXT:    retq
5709 ; AVX1-LABEL: trunc_ssat_v32i32_v32i8:
5710 ; AVX1:       # %bb.0:
5711 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
5712 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm1
5713 ; AVX1-NEXT:    vmovdqa 64(%rdi), %xmm2
5714 ; AVX1-NEXT:    vmovdqa 96(%rdi), %xmm3
5715 ; AVX1-NEXT:    vpackssdw 112(%rdi), %xmm3, %xmm3
5716 ; AVX1-NEXT:    vpackssdw 80(%rdi), %xmm2, %xmm2
5717 ; AVX1-NEXT:    vpacksswb %xmm3, %xmm2, %xmm2
5718 ; AVX1-NEXT:    vpackssdw 48(%rdi), %xmm1, %xmm1
5719 ; AVX1-NEXT:    vpackssdw 16(%rdi), %xmm0, %xmm0
5720 ; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
5721 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
5722 ; AVX1-NEXT:    retq
5724 ; AVX2-LABEL: trunc_ssat_v32i32_v32i8:
5725 ; AVX2:       # %bb.0:
5726 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
5727 ; AVX2-NEXT:    vmovdqa 64(%rdi), %ymm1
5728 ; AVX2-NEXT:    vpackssdw 96(%rdi), %ymm1, %ymm1
5729 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
5730 ; AVX2-NEXT:    vpackssdw 32(%rdi), %ymm0, %ymm0
5731 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
5732 ; AVX2-NEXT:    vpacksswb %ymm1, %ymm0, %ymm0
5733 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
5734 ; AVX2-NEXT:    retq
5736 ; AVX512-LABEL: trunc_ssat_v32i32_v32i8:
5737 ; AVX512:       # %bb.0:
5738 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
5739 ; AVX512-NEXT:    vmovdqa64 64(%rdi), %zmm1
5740 ; AVX512-NEXT:    vpmovsdb %zmm0, %xmm0
5741 ; AVX512-NEXT:    vpmovsdb %zmm1, %xmm1
5742 ; AVX512-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
5743 ; AVX512-NEXT:    retq
5745 ; SKX-LABEL: trunc_ssat_v32i32_v32i8:
5746 ; SKX:       # %bb.0:
5747 ; SKX-NEXT:    vmovdqa (%rdi), %ymm0
5748 ; SKX-NEXT:    vmovdqa 64(%rdi), %ymm1
5749 ; SKX-NEXT:    vpackssdw 96(%rdi), %ymm1, %ymm1
5750 ; SKX-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
5751 ; SKX-NEXT:    vpackssdw 32(%rdi), %ymm0, %ymm0
5752 ; SKX-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
5753 ; SKX-NEXT:    vpacksswb %ymm1, %ymm0, %ymm0
5754 ; SKX-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
5755 ; SKX-NEXT:    retq
5756   %a0 = load <32 x i32>, <32 x i32>* %p0
5757   %1 = icmp slt <32 x i32> %a0, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
5758   %2 = select <32 x i1> %1, <32 x i32> %a0, <32 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
5759   %3 = icmp sgt <32 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
5760   %4 = select <32 x i1> %3, <32 x i32> %2, <32 x i32> <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
5761   %5 = trunc <32 x i32> %4 to <32 x i8>
5762   ret <32 x i8> %5