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-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST,AVX2-FAST-ALL
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST,AVX2-FAST-PERLANE
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL
11 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL
12 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BW
13 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BW
14 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL
15 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL
16 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=skx | FileCheck %s --check-prefixes=SKX
19 ; Signed saturation truncation to vXi32
22 define <2 x i32> @trunc_ssat_v2i64_v2i32(<2 x i64> %a0) {
23 ; SSE2-LABEL: trunc_ssat_v2i64_v2i32:
25 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
26 ; SSE2-NEXT: movdqa %xmm0, %xmm2
27 ; SSE2-NEXT: pxor %xmm1, %xmm2
28 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [4294967295,4294967295]
29 ; SSE2-NEXT: movdqa %xmm3, %xmm4
30 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
31 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
32 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
33 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
34 ; SSE2-NEXT: pand %xmm5, %xmm2
35 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
36 ; SSE2-NEXT: por %xmm2, %xmm3
37 ; SSE2-NEXT: pand %xmm3, %xmm0
38 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
39 ; SSE2-NEXT: por %xmm0, %xmm3
40 ; SSE2-NEXT: pxor %xmm3, %xmm1
41 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [18446744069414584320,18446744069414584320]
42 ; SSE2-NEXT: movdqa %xmm1, %xmm2
43 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
44 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
45 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
46 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
47 ; SSE2-NEXT: pand %xmm4, %xmm0
48 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
49 ; SSE2-NEXT: por %xmm0, %xmm1
50 ; SSE2-NEXT: pand %xmm1, %xmm3
51 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
52 ; SSE2-NEXT: por %xmm3, %xmm1
53 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
56 ; SSSE3-LABEL: trunc_ssat_v2i64_v2i32:
58 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
59 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
60 ; SSSE3-NEXT: pxor %xmm1, %xmm2
61 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [4294967295,4294967295]
62 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
63 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
64 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
65 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm2
66 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
67 ; SSSE3-NEXT: pand %xmm5, %xmm2
68 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
69 ; SSSE3-NEXT: por %xmm2, %xmm3
70 ; SSSE3-NEXT: pand %xmm3, %xmm0
71 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
72 ; SSSE3-NEXT: por %xmm0, %xmm3
73 ; SSSE3-NEXT: pxor %xmm3, %xmm1
74 ; SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [18446744069414584320,18446744069414584320]
75 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
76 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
77 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
78 ; SSSE3-NEXT: pcmpeqd %xmm0, %xmm1
79 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
80 ; SSSE3-NEXT: pand %xmm4, %xmm0
81 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
82 ; SSSE3-NEXT: por %xmm0, %xmm1
83 ; SSSE3-NEXT: pand %xmm1, %xmm3
84 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
85 ; SSSE3-NEXT: por %xmm3, %xmm1
86 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
89 ; SSE41-LABEL: trunc_ssat_v2i64_v2i32:
91 ; SSE41-NEXT: movdqa %xmm0, %xmm1
92 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [2147483647,2147483647]
93 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
94 ; SSE41-NEXT: pxor %xmm3, %xmm0
95 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [4294967295,4294967295]
96 ; SSE41-NEXT: movdqa %xmm4, %xmm5
97 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
98 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
99 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
100 ; SSE41-NEXT: pand %xmm5, %xmm0
101 ; SSE41-NEXT: por %xmm4, %xmm0
102 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
103 ; SSE41-NEXT: movapd {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
104 ; SSE41-NEXT: pxor %xmm2, %xmm3
105 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [18446744069414584320,18446744069414584320]
106 ; SSE41-NEXT: movdqa %xmm3, %xmm4
107 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
108 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
109 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
110 ; SSE41-NEXT: pand %xmm4, %xmm0
111 ; SSE41-NEXT: por %xmm3, %xmm0
112 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
113 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
116 ; AVX-LABEL: trunc_ssat_v2i64_v2i32:
118 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [2147483647,2147483647]
119 ; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
120 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
121 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
122 ; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
123 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
124 ; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
127 ; AVX512F-LABEL: trunc_ssat_v2i64_v2i32:
129 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
130 ; AVX512F-NEXT: vpmovsqd %zmm0, %ymm0
131 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
132 ; AVX512F-NEXT: vzeroupper
135 ; AVX512VL-LABEL: trunc_ssat_v2i64_v2i32:
137 ; AVX512VL-NEXT: vpmovsqd %xmm0, %xmm0
138 ; AVX512VL-NEXT: retq
140 ; AVX512BW-LABEL: trunc_ssat_v2i64_v2i32:
142 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
143 ; AVX512BW-NEXT: vpmovsqd %zmm0, %ymm0
144 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
145 ; AVX512BW-NEXT: vzeroupper
146 ; AVX512BW-NEXT: retq
148 ; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i32:
149 ; AVX512BWVL: # %bb.0:
150 ; AVX512BWVL-NEXT: vpmovsqd %xmm0, %xmm0
151 ; AVX512BWVL-NEXT: retq
153 ; SKX-LABEL: trunc_ssat_v2i64_v2i32:
155 ; SKX-NEXT: vpmovsqd %xmm0, %xmm0
157 %1 = icmp slt <2 x i64> %a0, <i64 2147483647, i64 2147483647>
158 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 2147483647, i64 2147483647>
159 %3 = icmp sgt <2 x i64> %2, <i64 -2147483648, i64 -2147483648>
160 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -2147483648, i64 -2147483648>
161 %5 = trunc <2 x i64> %4 to <2 x i32>
165 define void @trunc_ssat_v2i64_v2i32_store(<2 x i64> %a0, <2 x i32>* %p1) {
166 ; SSE2-LABEL: trunc_ssat_v2i64_v2i32_store:
168 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
169 ; SSE2-NEXT: movdqa %xmm0, %xmm2
170 ; SSE2-NEXT: pxor %xmm1, %xmm2
171 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [4294967295,4294967295]
172 ; SSE2-NEXT: movdqa %xmm3, %xmm4
173 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
174 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
175 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
176 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
177 ; SSE2-NEXT: pand %xmm5, %xmm2
178 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
179 ; SSE2-NEXT: por %xmm2, %xmm3
180 ; SSE2-NEXT: pand %xmm3, %xmm0
181 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
182 ; SSE2-NEXT: por %xmm0, %xmm3
183 ; SSE2-NEXT: pxor %xmm3, %xmm1
184 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [18446744069414584320,18446744069414584320]
185 ; SSE2-NEXT: movdqa %xmm1, %xmm2
186 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
187 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
188 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
189 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
190 ; SSE2-NEXT: pand %xmm4, %xmm0
191 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
192 ; SSE2-NEXT: por %xmm0, %xmm1
193 ; SSE2-NEXT: pand %xmm1, %xmm3
194 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
195 ; SSE2-NEXT: por %xmm3, %xmm1
196 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
197 ; SSE2-NEXT: movq %xmm0, (%rdi)
200 ; SSSE3-LABEL: trunc_ssat_v2i64_v2i32_store:
202 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
203 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
204 ; SSSE3-NEXT: pxor %xmm1, %xmm2
205 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [4294967295,4294967295]
206 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
207 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
208 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
209 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm2
210 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
211 ; SSSE3-NEXT: pand %xmm5, %xmm2
212 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
213 ; SSSE3-NEXT: por %xmm2, %xmm3
214 ; SSSE3-NEXT: pand %xmm3, %xmm0
215 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
216 ; SSSE3-NEXT: por %xmm0, %xmm3
217 ; SSSE3-NEXT: pxor %xmm3, %xmm1
218 ; SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [18446744069414584320,18446744069414584320]
219 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
220 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
221 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
222 ; SSSE3-NEXT: pcmpeqd %xmm0, %xmm1
223 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
224 ; SSSE3-NEXT: pand %xmm4, %xmm0
225 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
226 ; SSSE3-NEXT: por %xmm0, %xmm1
227 ; SSSE3-NEXT: pand %xmm1, %xmm3
228 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
229 ; SSSE3-NEXT: por %xmm3, %xmm1
230 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
231 ; SSSE3-NEXT: movq %xmm0, (%rdi)
234 ; SSE41-LABEL: trunc_ssat_v2i64_v2i32_store:
236 ; SSE41-NEXT: movdqa %xmm0, %xmm1
237 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [2147483647,2147483647]
238 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
239 ; SSE41-NEXT: pxor %xmm3, %xmm0
240 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [4294967295,4294967295]
241 ; SSE41-NEXT: movdqa %xmm4, %xmm5
242 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
243 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
244 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
245 ; SSE41-NEXT: pand %xmm5, %xmm0
246 ; SSE41-NEXT: por %xmm4, %xmm0
247 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
248 ; SSE41-NEXT: movapd {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
249 ; SSE41-NEXT: pxor %xmm2, %xmm3
250 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [18446744069414584320,18446744069414584320]
251 ; SSE41-NEXT: movdqa %xmm3, %xmm4
252 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
253 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
254 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
255 ; SSE41-NEXT: pand %xmm4, %xmm0
256 ; SSE41-NEXT: por %xmm3, %xmm0
257 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
258 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
259 ; SSE41-NEXT: movq %xmm0, (%rdi)
262 ; AVX-LABEL: trunc_ssat_v2i64_v2i32_store:
264 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [2147483647,2147483647]
265 ; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
266 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
267 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
268 ; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
269 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
270 ; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
271 ; AVX-NEXT: vmovlpd %xmm0, (%rdi)
274 ; AVX512F-LABEL: trunc_ssat_v2i64_v2i32_store:
276 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
277 ; AVX512F-NEXT: vpmovsqd %zmm0, %ymm0
278 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
279 ; AVX512F-NEXT: vzeroupper
282 ; AVX512VL-LABEL: trunc_ssat_v2i64_v2i32_store:
284 ; AVX512VL-NEXT: vpmovsqd %xmm0, (%rdi)
285 ; AVX512VL-NEXT: retq
287 ; AVX512BW-LABEL: trunc_ssat_v2i64_v2i32_store:
289 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
290 ; AVX512BW-NEXT: vpmovsqd %zmm0, %ymm0
291 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
292 ; AVX512BW-NEXT: vzeroupper
293 ; AVX512BW-NEXT: retq
295 ; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i32_store:
296 ; AVX512BWVL: # %bb.0:
297 ; AVX512BWVL-NEXT: vpmovsqd %xmm0, (%rdi)
298 ; AVX512BWVL-NEXT: retq
300 ; SKX-LABEL: trunc_ssat_v2i64_v2i32_store:
302 ; SKX-NEXT: vpmovsqd %xmm0, (%rdi)
304 %1 = icmp slt <2 x i64> %a0, <i64 2147483647, i64 2147483647>
305 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 2147483647, i64 2147483647>
306 %3 = icmp sgt <2 x i64> %2, <i64 -2147483648, i64 -2147483648>
307 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -2147483648, i64 -2147483648>
308 %5 = trunc <2 x i64> %4 to <2 x i32>
309 store <2 x i32> %5, <2 x i32>* %p1
313 define <4 x i32> @trunc_ssat_v4i64_v4i32(<4 x i64> %a0) {
314 ; SSE2-LABEL: trunc_ssat_v4i64_v4i32:
316 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483647,2147483647]
317 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
318 ; SSE2-NEXT: movdqa %xmm0, %xmm3
319 ; SSE2-NEXT: pxor %xmm2, %xmm3
320 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [4294967295,4294967295]
321 ; SSE2-NEXT: movdqa %xmm5, %xmm6
322 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm6
323 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
324 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm3
325 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
326 ; SSE2-NEXT: pand %xmm7, %xmm4
327 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
328 ; SSE2-NEXT: por %xmm4, %xmm3
329 ; SSE2-NEXT: pand %xmm3, %xmm0
330 ; SSE2-NEXT: pandn %xmm8, %xmm3
331 ; SSE2-NEXT: por %xmm0, %xmm3
332 ; SSE2-NEXT: movdqa %xmm1, %xmm0
333 ; SSE2-NEXT: pxor %xmm2, %xmm0
334 ; SSE2-NEXT: movdqa %xmm5, %xmm4
335 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
336 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
337 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm0
338 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
339 ; SSE2-NEXT: pand %xmm6, %xmm0
340 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
341 ; SSE2-NEXT: por %xmm0, %xmm4
342 ; SSE2-NEXT: pand %xmm4, %xmm1
343 ; SSE2-NEXT: pandn %xmm8, %xmm4
344 ; SSE2-NEXT: por %xmm1, %xmm4
345 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
346 ; SSE2-NEXT: movdqa %xmm4, %xmm0
347 ; SSE2-NEXT: pxor %xmm2, %xmm0
348 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [18446744069414584320,18446744069414584320]
349 ; SSE2-NEXT: movdqa %xmm0, %xmm6
350 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm6
351 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
352 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm0
353 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
354 ; SSE2-NEXT: pand %xmm7, %xmm0
355 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
356 ; SSE2-NEXT: por %xmm0, %xmm6
357 ; SSE2-NEXT: pand %xmm6, %xmm4
358 ; SSE2-NEXT: pandn %xmm1, %xmm6
359 ; SSE2-NEXT: por %xmm4, %xmm6
360 ; SSE2-NEXT: pxor %xmm3, %xmm2
361 ; SSE2-NEXT: movdqa %xmm2, %xmm0
362 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm0
363 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
364 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm2
365 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
366 ; SSE2-NEXT: pand %xmm4, %xmm2
367 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
368 ; SSE2-NEXT: por %xmm2, %xmm0
369 ; SSE2-NEXT: pand %xmm0, %xmm3
370 ; SSE2-NEXT: pandn %xmm1, %xmm0
371 ; SSE2-NEXT: por %xmm3, %xmm0
372 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm6[0,2]
375 ; SSSE3-LABEL: trunc_ssat_v4i64_v4i32:
377 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [2147483647,2147483647]
378 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
379 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
380 ; SSSE3-NEXT: pxor %xmm2, %xmm3
381 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [4294967295,4294967295]
382 ; SSSE3-NEXT: movdqa %xmm5, %xmm6
383 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm6
384 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
385 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm3
386 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
387 ; SSSE3-NEXT: pand %xmm7, %xmm4
388 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
389 ; SSSE3-NEXT: por %xmm4, %xmm3
390 ; SSSE3-NEXT: pand %xmm3, %xmm0
391 ; SSSE3-NEXT: pandn %xmm8, %xmm3
392 ; SSSE3-NEXT: por %xmm0, %xmm3
393 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
394 ; SSSE3-NEXT: pxor %xmm2, %xmm0
395 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
396 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
397 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
398 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm0
399 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
400 ; SSSE3-NEXT: pand %xmm6, %xmm0
401 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
402 ; SSSE3-NEXT: por %xmm0, %xmm4
403 ; SSSE3-NEXT: pand %xmm4, %xmm1
404 ; SSSE3-NEXT: pandn %xmm8, %xmm4
405 ; SSSE3-NEXT: por %xmm1, %xmm4
406 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
407 ; SSSE3-NEXT: movdqa %xmm4, %xmm0
408 ; SSSE3-NEXT: pxor %xmm2, %xmm0
409 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [18446744069414584320,18446744069414584320]
410 ; SSSE3-NEXT: movdqa %xmm0, %xmm6
411 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm6
412 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
413 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm0
414 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
415 ; SSSE3-NEXT: pand %xmm7, %xmm0
416 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
417 ; SSSE3-NEXT: por %xmm0, %xmm6
418 ; SSSE3-NEXT: pand %xmm6, %xmm4
419 ; SSSE3-NEXT: pandn %xmm1, %xmm6
420 ; SSSE3-NEXT: por %xmm4, %xmm6
421 ; SSSE3-NEXT: pxor %xmm3, %xmm2
422 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
423 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm0
424 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
425 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm2
426 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
427 ; SSSE3-NEXT: pand %xmm4, %xmm2
428 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
429 ; SSSE3-NEXT: por %xmm2, %xmm0
430 ; SSSE3-NEXT: pand %xmm0, %xmm3
431 ; SSSE3-NEXT: pandn %xmm1, %xmm0
432 ; SSSE3-NEXT: por %xmm3, %xmm0
433 ; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm6[0,2]
436 ; SSE41-LABEL: trunc_ssat_v4i64_v4i32:
438 ; SSE41-NEXT: movdqa %xmm0, %xmm2
439 ; SSE41-NEXT: movapd {{.*#+}} xmm4 = [2147483647,2147483647]
440 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
441 ; SSE41-NEXT: pxor %xmm3, %xmm0
442 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [4294967295,4294967295]
443 ; SSE41-NEXT: movdqa %xmm6, %xmm5
444 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
445 ; SSE41-NEXT: movdqa %xmm6, %xmm7
446 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
447 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
448 ; SSE41-NEXT: pand %xmm5, %xmm0
449 ; SSE41-NEXT: por %xmm7, %xmm0
450 ; SSE41-NEXT: movapd %xmm4, %xmm5
451 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5
452 ; SSE41-NEXT: movdqa %xmm1, %xmm0
453 ; SSE41-NEXT: pxor %xmm3, %xmm0
454 ; SSE41-NEXT: movdqa %xmm6, %xmm2
455 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
456 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
457 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
458 ; SSE41-NEXT: pand %xmm2, %xmm0
459 ; SSE41-NEXT: por %xmm6, %xmm0
460 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4
461 ; SSE41-NEXT: movapd {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
462 ; SSE41-NEXT: movapd %xmm4, %xmm2
463 ; SSE41-NEXT: xorpd %xmm3, %xmm2
464 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [18446744069414584320,18446744069414584320]
465 ; SSE41-NEXT: movapd %xmm2, %xmm7
466 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm7
467 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm2
468 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
469 ; SSE41-NEXT: pand %xmm7, %xmm0
470 ; SSE41-NEXT: por %xmm2, %xmm0
471 ; SSE41-NEXT: movapd %xmm1, %xmm2
472 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2
473 ; SSE41-NEXT: xorpd %xmm5, %xmm3
474 ; SSE41-NEXT: movapd %xmm3, %xmm4
475 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm4
476 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm3
477 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
478 ; SSE41-NEXT: pand %xmm4, %xmm0
479 ; SSE41-NEXT: por %xmm3, %xmm0
480 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1
481 ; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
482 ; SSE41-NEXT: movaps %xmm1, %xmm0
485 ; AVX1-LABEL: trunc_ssat_v4i64_v4i32:
487 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
488 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [2147483647,2147483647]
489 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm3
490 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm4
491 ; AVX1-NEXT: vblendvpd %xmm4, %xmm0, %xmm2, %xmm0
492 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [18446744071562067968,18446744071562067968]
493 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm5
494 ; AVX1-NEXT: vblendvpd %xmm3, %xmm1, %xmm2, %xmm1
495 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm2
496 ; AVX1-NEXT: vblendvpd %xmm2, %xmm1, %xmm4, %xmm1
497 ; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
498 ; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
499 ; AVX1-NEXT: vzeroupper
502 ; AVX2-SLOW-LABEL: trunc_ssat_v4i64_v4i32:
503 ; AVX2-SLOW: # %bb.0:
504 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [2147483647,2147483647,2147483647,2147483647]
505 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
506 ; AVX2-SLOW-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
507 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
508 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2
509 ; AVX2-SLOW-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
510 ; AVX2-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm1
511 ; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
512 ; AVX2-SLOW-NEXT: vzeroupper
513 ; AVX2-SLOW-NEXT: retq
515 ; AVX2-FAST-ALL-LABEL: trunc_ssat_v4i64_v4i32:
516 ; AVX2-FAST-ALL: # %bb.0:
517 ; AVX2-FAST-ALL-NEXT: vpbroadcastq {{.*#+}} ymm1 = [2147483647,2147483647,2147483647,2147483647]
518 ; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
519 ; AVX2-FAST-ALL-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
520 ; AVX2-FAST-ALL-NEXT: vpbroadcastq {{.*#+}} ymm1 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
521 ; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2
522 ; AVX2-FAST-ALL-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
523 ; AVX2-FAST-ALL-NEXT: vmovapd {{.*#+}} ymm1 = <0,2,4,6,u,u,u,u>
524 ; AVX2-FAST-ALL-NEXT: vpermps %ymm0, %ymm1, %ymm0
525 ; AVX2-FAST-ALL-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
526 ; AVX2-FAST-ALL-NEXT: vzeroupper
527 ; AVX2-FAST-ALL-NEXT: retq
529 ; AVX2-FAST-PERLANE-LABEL: trunc_ssat_v4i64_v4i32:
530 ; AVX2-FAST-PERLANE: # %bb.0:
531 ; AVX2-FAST-PERLANE-NEXT: vpbroadcastq {{.*#+}} ymm1 = [2147483647,2147483647,2147483647,2147483647]
532 ; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
533 ; AVX2-FAST-PERLANE-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
534 ; AVX2-FAST-PERLANE-NEXT: vpbroadcastq {{.*#+}} ymm1 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
535 ; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2
536 ; AVX2-FAST-PERLANE-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
537 ; AVX2-FAST-PERLANE-NEXT: vextractf128 $1, %ymm0, %xmm1
538 ; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
539 ; AVX2-FAST-PERLANE-NEXT: vzeroupper
540 ; AVX2-FAST-PERLANE-NEXT: retq
542 ; AVX512F-LABEL: trunc_ssat_v4i64_v4i32:
544 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
545 ; AVX512F-NEXT: vpmovsqd %zmm0, %ymm0
546 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
547 ; AVX512F-NEXT: vzeroupper
550 ; AVX512VL-LABEL: trunc_ssat_v4i64_v4i32:
552 ; AVX512VL-NEXT: vpmovsqd %ymm0, %xmm0
553 ; AVX512VL-NEXT: vzeroupper
554 ; AVX512VL-NEXT: retq
556 ; AVX512BW-LABEL: trunc_ssat_v4i64_v4i32:
558 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
559 ; AVX512BW-NEXT: vpmovsqd %zmm0, %ymm0
560 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
561 ; AVX512BW-NEXT: vzeroupper
562 ; AVX512BW-NEXT: retq
564 ; AVX512BWVL-LABEL: trunc_ssat_v4i64_v4i32:
565 ; AVX512BWVL: # %bb.0:
566 ; AVX512BWVL-NEXT: vpmovsqd %ymm0, %xmm0
567 ; AVX512BWVL-NEXT: vzeroupper
568 ; AVX512BWVL-NEXT: retq
570 ; SKX-LABEL: trunc_ssat_v4i64_v4i32:
572 ; SKX-NEXT: vpmovsqd %ymm0, %xmm0
573 ; SKX-NEXT: vzeroupper
575 %1 = icmp slt <4 x i64> %a0, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
576 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
577 %3 = icmp sgt <4 x i64> %2, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
578 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
579 %5 = trunc <4 x i64> %4 to <4 x i32>
584 define <8 x i32> @trunc_ssat_v8i64_v8i32(<8 x i64>* %p0) "min-legal-vector-width"="256" {
585 ; SSE2-LABEL: trunc_ssat_v8i64_v8i32:
587 ; SSE2-NEXT: movdqa (%rdi), %xmm3
588 ; SSE2-NEXT: movdqa 16(%rdi), %xmm5
589 ; SSE2-NEXT: movdqa 32(%rdi), %xmm7
590 ; SSE2-NEXT: movdqa 48(%rdi), %xmm9
591 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483647,2147483647]
592 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
593 ; SSE2-NEXT: movdqa %xmm3, %xmm2
594 ; SSE2-NEXT: pxor %xmm0, %xmm2
595 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [4294967295,4294967295]
596 ; SSE2-NEXT: movdqa %xmm10, %xmm6
597 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm6
598 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm6[0,0,2,2]
599 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm2
600 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
601 ; SSE2-NEXT: pand %xmm1, %xmm4
602 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
603 ; SSE2-NEXT: por %xmm4, %xmm2
604 ; SSE2-NEXT: pand %xmm2, %xmm3
605 ; SSE2-NEXT: pandn %xmm8, %xmm2
606 ; SSE2-NEXT: por %xmm3, %xmm2
607 ; SSE2-NEXT: movdqa %xmm5, %xmm1
608 ; SSE2-NEXT: pxor %xmm0, %xmm1
609 ; SSE2-NEXT: movdqa %xmm10, %xmm3
610 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
611 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
612 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm1
613 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
614 ; SSE2-NEXT: pand %xmm4, %xmm1
615 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
616 ; SSE2-NEXT: por %xmm1, %xmm3
617 ; SSE2-NEXT: pand %xmm3, %xmm5
618 ; SSE2-NEXT: pandn %xmm8, %xmm3
619 ; SSE2-NEXT: por %xmm5, %xmm3
620 ; SSE2-NEXT: movdqa %xmm7, %xmm1
621 ; SSE2-NEXT: pxor %xmm0, %xmm1
622 ; SSE2-NEXT: movdqa %xmm10, %xmm4
623 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4
624 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
625 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm1
626 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
627 ; SSE2-NEXT: pand %xmm5, %xmm1
628 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
629 ; SSE2-NEXT: por %xmm1, %xmm5
630 ; SSE2-NEXT: pand %xmm5, %xmm7
631 ; SSE2-NEXT: pandn %xmm8, %xmm5
632 ; SSE2-NEXT: por %xmm7, %xmm5
633 ; SSE2-NEXT: movdqa %xmm9, %xmm1
634 ; SSE2-NEXT: pxor %xmm0, %xmm1
635 ; SSE2-NEXT: movdqa %xmm10, %xmm4
636 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4
637 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
638 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm1
639 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
640 ; SSE2-NEXT: pand %xmm6, %xmm1
641 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
642 ; SSE2-NEXT: por %xmm1, %xmm7
643 ; SSE2-NEXT: pand %xmm7, %xmm9
644 ; SSE2-NEXT: pandn %xmm8, %xmm7
645 ; SSE2-NEXT: por %xmm9, %xmm7
646 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [18446744071562067968,18446744071562067968]
647 ; SSE2-NEXT: movdqa %xmm7, %xmm1
648 ; SSE2-NEXT: pxor %xmm0, %xmm1
649 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [18446744069414584320,18446744069414584320]
650 ; SSE2-NEXT: movdqa %xmm1, %xmm4
651 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm4
652 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
653 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm1
654 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
655 ; SSE2-NEXT: pand %xmm6, %xmm1
656 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
657 ; SSE2-NEXT: por %xmm1, %xmm4
658 ; SSE2-NEXT: pand %xmm4, %xmm7
659 ; SSE2-NEXT: pandn %xmm8, %xmm4
660 ; SSE2-NEXT: por %xmm7, %xmm4
661 ; SSE2-NEXT: movdqa %xmm5, %xmm1
662 ; SSE2-NEXT: pxor %xmm0, %xmm1
663 ; SSE2-NEXT: movdqa %xmm1, %xmm6
664 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm6
665 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
666 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm1
667 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
668 ; SSE2-NEXT: pand %xmm10, %xmm7
669 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
670 ; SSE2-NEXT: por %xmm7, %xmm1
671 ; SSE2-NEXT: pand %xmm1, %xmm5
672 ; SSE2-NEXT: pandn %xmm8, %xmm1
673 ; SSE2-NEXT: por %xmm5, %xmm1
674 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm4[0,2]
675 ; SSE2-NEXT: movdqa %xmm3, %xmm4
676 ; SSE2-NEXT: pxor %xmm0, %xmm4
677 ; SSE2-NEXT: movdqa %xmm4, %xmm5
678 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm5
679 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
680 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm4
681 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
682 ; SSE2-NEXT: pand %xmm6, %xmm4
683 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
684 ; SSE2-NEXT: por %xmm4, %xmm5
685 ; SSE2-NEXT: pand %xmm5, %xmm3
686 ; SSE2-NEXT: pandn %xmm8, %xmm5
687 ; SSE2-NEXT: por %xmm3, %xmm5
688 ; SSE2-NEXT: pxor %xmm2, %xmm0
689 ; SSE2-NEXT: movdqa %xmm0, %xmm3
690 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm3
691 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
692 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm0
693 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
694 ; SSE2-NEXT: pand %xmm4, %xmm6
695 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
696 ; SSE2-NEXT: por %xmm6, %xmm0
697 ; SSE2-NEXT: pand %xmm0, %xmm2
698 ; SSE2-NEXT: pandn %xmm8, %xmm0
699 ; SSE2-NEXT: por %xmm2, %xmm0
700 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm5[0,2]
703 ; SSSE3-LABEL: trunc_ssat_v8i64_v8i32:
705 ; SSSE3-NEXT: movdqa (%rdi), %xmm3
706 ; SSSE3-NEXT: movdqa 16(%rdi), %xmm5
707 ; SSSE3-NEXT: movdqa 32(%rdi), %xmm7
708 ; SSSE3-NEXT: movdqa 48(%rdi), %xmm9
709 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [2147483647,2147483647]
710 ; SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
711 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
712 ; SSSE3-NEXT: pxor %xmm0, %xmm2
713 ; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [4294967295,4294967295]
714 ; SSSE3-NEXT: movdqa %xmm10, %xmm6
715 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm6
716 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm6[0,0,2,2]
717 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm2
718 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
719 ; SSSE3-NEXT: pand %xmm1, %xmm4
720 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
721 ; SSSE3-NEXT: por %xmm4, %xmm2
722 ; SSSE3-NEXT: pand %xmm2, %xmm3
723 ; SSSE3-NEXT: pandn %xmm8, %xmm2
724 ; SSSE3-NEXT: por %xmm3, %xmm2
725 ; SSSE3-NEXT: movdqa %xmm5, %xmm1
726 ; SSSE3-NEXT: pxor %xmm0, %xmm1
727 ; SSSE3-NEXT: movdqa %xmm10, %xmm3
728 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3
729 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
730 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1
731 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
732 ; SSSE3-NEXT: pand %xmm4, %xmm1
733 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
734 ; SSSE3-NEXT: por %xmm1, %xmm3
735 ; SSSE3-NEXT: pand %xmm3, %xmm5
736 ; SSSE3-NEXT: pandn %xmm8, %xmm3
737 ; SSSE3-NEXT: por %xmm5, %xmm3
738 ; SSSE3-NEXT: movdqa %xmm7, %xmm1
739 ; SSSE3-NEXT: pxor %xmm0, %xmm1
740 ; SSSE3-NEXT: movdqa %xmm10, %xmm4
741 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4
742 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
743 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1
744 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
745 ; SSSE3-NEXT: pand %xmm5, %xmm1
746 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
747 ; SSSE3-NEXT: por %xmm1, %xmm5
748 ; SSSE3-NEXT: pand %xmm5, %xmm7
749 ; SSSE3-NEXT: pandn %xmm8, %xmm5
750 ; SSSE3-NEXT: por %xmm7, %xmm5
751 ; SSSE3-NEXT: movdqa %xmm9, %xmm1
752 ; SSSE3-NEXT: pxor %xmm0, %xmm1
753 ; SSSE3-NEXT: movdqa %xmm10, %xmm4
754 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4
755 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
756 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1
757 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
758 ; SSSE3-NEXT: pand %xmm6, %xmm1
759 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
760 ; SSSE3-NEXT: por %xmm1, %xmm7
761 ; SSSE3-NEXT: pand %xmm7, %xmm9
762 ; SSSE3-NEXT: pandn %xmm8, %xmm7
763 ; SSSE3-NEXT: por %xmm9, %xmm7
764 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [18446744071562067968,18446744071562067968]
765 ; SSSE3-NEXT: movdqa %xmm7, %xmm1
766 ; SSSE3-NEXT: pxor %xmm0, %xmm1
767 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [18446744069414584320,18446744069414584320]
768 ; SSSE3-NEXT: movdqa %xmm1, %xmm4
769 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm4
770 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
771 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm1
772 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
773 ; SSSE3-NEXT: pand %xmm6, %xmm1
774 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
775 ; SSSE3-NEXT: por %xmm1, %xmm4
776 ; SSSE3-NEXT: pand %xmm4, %xmm7
777 ; SSSE3-NEXT: pandn %xmm8, %xmm4
778 ; SSSE3-NEXT: por %xmm7, %xmm4
779 ; SSSE3-NEXT: movdqa %xmm5, %xmm1
780 ; SSSE3-NEXT: pxor %xmm0, %xmm1
781 ; SSSE3-NEXT: movdqa %xmm1, %xmm6
782 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm6
783 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
784 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm1
785 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
786 ; SSSE3-NEXT: pand %xmm10, %xmm7
787 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
788 ; SSSE3-NEXT: por %xmm7, %xmm1
789 ; SSSE3-NEXT: pand %xmm1, %xmm5
790 ; SSSE3-NEXT: pandn %xmm8, %xmm1
791 ; SSSE3-NEXT: por %xmm5, %xmm1
792 ; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm4[0,2]
793 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
794 ; SSSE3-NEXT: pxor %xmm0, %xmm4
795 ; SSSE3-NEXT: movdqa %xmm4, %xmm5
796 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm5
797 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
798 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm4
799 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
800 ; SSSE3-NEXT: pand %xmm6, %xmm4
801 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
802 ; SSSE3-NEXT: por %xmm4, %xmm5
803 ; SSSE3-NEXT: pand %xmm5, %xmm3
804 ; SSSE3-NEXT: pandn %xmm8, %xmm5
805 ; SSSE3-NEXT: por %xmm3, %xmm5
806 ; SSSE3-NEXT: pxor %xmm2, %xmm0
807 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
808 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm3
809 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
810 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm0
811 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
812 ; SSSE3-NEXT: pand %xmm4, %xmm6
813 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
814 ; SSSE3-NEXT: por %xmm6, %xmm0
815 ; SSSE3-NEXT: pand %xmm0, %xmm2
816 ; SSSE3-NEXT: pandn %xmm8, %xmm0
817 ; SSSE3-NEXT: por %xmm2, %xmm0
818 ; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm5[0,2]
821 ; SSE41-LABEL: trunc_ssat_v8i64_v8i32:
823 ; SSE41-NEXT: movdqa (%rdi), %xmm5
824 ; SSE41-NEXT: movdqa 16(%rdi), %xmm4
825 ; SSE41-NEXT: movdqa 32(%rdi), %xmm10
826 ; SSE41-NEXT: movdqa 48(%rdi), %xmm9
827 ; SSE41-NEXT: movapd {{.*#+}} xmm1 = [2147483647,2147483647]
828 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
829 ; SSE41-NEXT: movdqa %xmm5, %xmm0
830 ; SSE41-NEXT: pxor %xmm3, %xmm0
831 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [4294967295,4294967295]
832 ; SSE41-NEXT: movdqa %xmm2, %xmm7
833 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm7
834 ; SSE41-NEXT: movdqa %xmm2, %xmm6
835 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
836 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
837 ; SSE41-NEXT: pand %xmm7, %xmm0
838 ; SSE41-NEXT: por %xmm6, %xmm0
839 ; SSE41-NEXT: movapd %xmm1, %xmm8
840 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm8
841 ; SSE41-NEXT: movdqa %xmm4, %xmm0
842 ; SSE41-NEXT: pxor %xmm3, %xmm0
843 ; SSE41-NEXT: movdqa %xmm2, %xmm5
844 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
845 ; SSE41-NEXT: movdqa %xmm2, %xmm6
846 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
847 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
848 ; SSE41-NEXT: pand %xmm5, %xmm0
849 ; SSE41-NEXT: por %xmm6, %xmm0
850 ; SSE41-NEXT: movapd %xmm1, %xmm11
851 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm11
852 ; SSE41-NEXT: movdqa %xmm10, %xmm0
853 ; SSE41-NEXT: pxor %xmm3, %xmm0
854 ; SSE41-NEXT: movdqa %xmm2, %xmm4
855 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
856 ; SSE41-NEXT: movdqa %xmm2, %xmm6
857 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
858 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
859 ; SSE41-NEXT: pand %xmm4, %xmm0
860 ; SSE41-NEXT: por %xmm6, %xmm0
861 ; SSE41-NEXT: movapd %xmm1, %xmm4
862 ; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm4
863 ; SSE41-NEXT: movdqa %xmm9, %xmm0
864 ; SSE41-NEXT: pxor %xmm3, %xmm0
865 ; SSE41-NEXT: movdqa %xmm2, %xmm6
866 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm6
867 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
868 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
869 ; SSE41-NEXT: pand %xmm6, %xmm0
870 ; SSE41-NEXT: por %xmm2, %xmm0
871 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm1
872 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [18446744071562067968,18446744071562067968]
873 ; SSE41-NEXT: movapd %xmm1, %xmm7
874 ; SSE41-NEXT: xorpd %xmm3, %xmm7
875 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [18446744069414584320,18446744069414584320]
876 ; SSE41-NEXT: movapd %xmm7, %xmm5
877 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm5
878 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm7
879 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
880 ; SSE41-NEXT: pand %xmm5, %xmm0
881 ; SSE41-NEXT: por %xmm7, %xmm0
882 ; SSE41-NEXT: movapd %xmm2, %xmm5
883 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm5
884 ; SSE41-NEXT: movapd %xmm4, %xmm1
885 ; SSE41-NEXT: xorpd %xmm3, %xmm1
886 ; SSE41-NEXT: movapd %xmm1, %xmm7
887 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm7
888 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm1
889 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
890 ; SSE41-NEXT: pand %xmm7, %xmm0
891 ; SSE41-NEXT: por %xmm1, %xmm0
892 ; SSE41-NEXT: movapd %xmm2, %xmm1
893 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm1
894 ; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm5[0,2]
895 ; SSE41-NEXT: movapd %xmm11, %xmm4
896 ; SSE41-NEXT: xorpd %xmm3, %xmm4
897 ; SSE41-NEXT: movapd %xmm4, %xmm5
898 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm5
899 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm4
900 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
901 ; SSE41-NEXT: pand %xmm5, %xmm0
902 ; SSE41-NEXT: por %xmm4, %xmm0
903 ; SSE41-NEXT: movapd %xmm2, %xmm4
904 ; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm4
905 ; SSE41-NEXT: xorpd %xmm8, %xmm3
906 ; SSE41-NEXT: movapd %xmm3, %xmm5
907 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm5
908 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm3
909 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
910 ; SSE41-NEXT: pand %xmm5, %xmm0
911 ; SSE41-NEXT: por %xmm3, %xmm0
912 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm2
913 ; SSE41-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm4[0,2]
914 ; SSE41-NEXT: movaps %xmm2, %xmm0
917 ; AVX1-LABEL: trunc_ssat_v8i64_v8i32:
919 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
920 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
921 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2
922 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3
923 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [2147483647,2147483647]
924 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm8
925 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm6
926 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm7
927 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm5
928 ; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
929 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [18446744071562067968,18446744071562067968]
930 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm0, %xmm9
931 ; AVX1-NEXT: vblendvpd %xmm7, %xmm2, %xmm4, %xmm2
932 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm2, %xmm7
933 ; AVX1-NEXT: vblendvpd %xmm6, %xmm1, %xmm4, %xmm1
934 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm1, %xmm6
935 ; AVX1-NEXT: vblendvpd %xmm8, %xmm3, %xmm4, %xmm3
936 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm3, %xmm4
937 ; AVX1-NEXT: vblendvpd %xmm4, %xmm3, %xmm5, %xmm3
938 ; AVX1-NEXT: vblendvpd %xmm6, %xmm1, %xmm5, %xmm1
939 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
940 ; AVX1-NEXT: vblendvpd %xmm7, %xmm2, %xmm5, %xmm2
941 ; AVX1-NEXT: vblendvpd %xmm9, %xmm0, %xmm5, %xmm0
942 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
943 ; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm1[0,2],ymm0[4,6],ymm1[4,6]
946 ; AVX2-SLOW-LABEL: trunc_ssat_v8i64_v8i32:
947 ; AVX2-SLOW: # %bb.0:
948 ; AVX2-SLOW-NEXT: vmovdqa (%rdi), %ymm0
949 ; AVX2-SLOW-NEXT: vmovdqa 32(%rdi), %ymm1
950 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm2 = [2147483647,2147483647,2147483647,2147483647]
951 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3
952 ; AVX2-SLOW-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
953 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3
954 ; AVX2-SLOW-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
955 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm2 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
956 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3
957 ; AVX2-SLOW-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
958 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm3
959 ; AVX2-SLOW-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
960 ; AVX2-SLOW-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
961 ; AVX2-SLOW-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
962 ; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
963 ; AVX2-SLOW-NEXT: retq
965 ; AVX2-FAST-ALL-LABEL: trunc_ssat_v8i64_v8i32:
966 ; AVX2-FAST-ALL: # %bb.0:
967 ; AVX2-FAST-ALL-NEXT: vmovdqa (%rdi), %ymm0
968 ; AVX2-FAST-ALL-NEXT: vmovdqa 32(%rdi), %ymm1
969 ; AVX2-FAST-ALL-NEXT: vpbroadcastq {{.*#+}} ymm2 = [2147483647,2147483647,2147483647,2147483647]
970 ; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3
971 ; AVX2-FAST-ALL-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
972 ; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3
973 ; AVX2-FAST-ALL-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
974 ; AVX2-FAST-ALL-NEXT: vpbroadcastq {{.*#+}} ymm2 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
975 ; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3
976 ; AVX2-FAST-ALL-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
977 ; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm3
978 ; AVX2-FAST-ALL-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
979 ; AVX2-FAST-ALL-NEXT: vmovapd {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
980 ; AVX2-FAST-ALL-NEXT: vpermps %ymm0, %ymm2, %ymm0
981 ; AVX2-FAST-ALL-NEXT: vpermps %ymm1, %ymm2, %ymm1
982 ; AVX2-FAST-ALL-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
983 ; AVX2-FAST-ALL-NEXT: retq
985 ; AVX2-FAST-PERLANE-LABEL: trunc_ssat_v8i64_v8i32:
986 ; AVX2-FAST-PERLANE: # %bb.0:
987 ; AVX2-FAST-PERLANE-NEXT: vmovdqa (%rdi), %ymm0
988 ; AVX2-FAST-PERLANE-NEXT: vmovdqa 32(%rdi), %ymm1
989 ; AVX2-FAST-PERLANE-NEXT: vpbroadcastq {{.*#+}} ymm2 = [2147483647,2147483647,2147483647,2147483647]
990 ; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3
991 ; AVX2-FAST-PERLANE-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
992 ; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3
993 ; AVX2-FAST-PERLANE-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
994 ; AVX2-FAST-PERLANE-NEXT: vpbroadcastq {{.*#+}} ymm2 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
995 ; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3
996 ; AVX2-FAST-PERLANE-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
997 ; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm3
998 ; AVX2-FAST-PERLANE-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
999 ; AVX2-FAST-PERLANE-NEXT: vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
1000 ; AVX2-FAST-PERLANE-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
1001 ; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
1002 ; AVX2-FAST-PERLANE-NEXT: retq
1004 ; AVX512-LABEL: trunc_ssat_v8i64_v8i32:
1006 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
1007 ; AVX512-NEXT: vpmovsqd %zmm0, %ymm0
1010 ; SKX-LABEL: trunc_ssat_v8i64_v8i32:
1012 ; SKX-NEXT: vmovdqa (%rdi), %ymm0
1013 ; SKX-NEXT: vmovdqa 32(%rdi), %ymm1
1014 ; SKX-NEXT: vpmovsqd %ymm0, %xmm0
1015 ; SKX-NEXT: vpmovsqd %ymm1, %xmm1
1016 ; SKX-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
1018 %a0 = load <8 x i64>, <8 x i64>* %p0
1019 %1 = icmp slt <8 x i64> %a0, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
1020 %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>
1021 %3 = icmp sgt <8 x i64> %2, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
1022 %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>
1023 %5 = trunc <8 x i64> %4 to <8 x i32>
1028 ; Signed saturation truncation to vXi16
1031 define <2 x i16> @trunc_ssat_v2i64_v2i16(<2 x i64> %a0) {
1032 ; SSE2-LABEL: trunc_ssat_v2i64_v2i16:
1034 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
1035 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1036 ; SSE2-NEXT: pxor %xmm1, %xmm2
1037 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147516415,2147516415]
1038 ; SSE2-NEXT: movdqa %xmm3, %xmm4
1039 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
1040 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1041 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
1042 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1043 ; SSE2-NEXT: pand %xmm5, %xmm2
1044 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1045 ; SSE2-NEXT: por %xmm2, %xmm3
1046 ; SSE2-NEXT: pand %xmm3, %xmm0
1047 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
1048 ; SSE2-NEXT: por %xmm0, %xmm3
1049 ; SSE2-NEXT: pxor %xmm3, %xmm1
1050 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562035200,18446744071562035200]
1051 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1052 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
1053 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1054 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
1055 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1056 ; SSE2-NEXT: pand %xmm4, %xmm0
1057 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1058 ; SSE2-NEXT: por %xmm0, %xmm1
1059 ; SSE2-NEXT: pand %xmm1, %xmm3
1060 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1061 ; SSE2-NEXT: por %xmm3, %xmm1
1062 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1063 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1066 ; SSSE3-LABEL: trunc_ssat_v2i64_v2i16:
1068 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
1069 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
1070 ; SSSE3-NEXT: pxor %xmm1, %xmm2
1071 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147516415,2147516415]
1072 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
1073 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
1074 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1075 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm2
1076 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1077 ; SSSE3-NEXT: pand %xmm5, %xmm2
1078 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1079 ; SSSE3-NEXT: por %xmm2, %xmm3
1080 ; SSSE3-NEXT: pand %xmm3, %xmm0
1081 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
1082 ; SSSE3-NEXT: por %xmm0, %xmm3
1083 ; SSSE3-NEXT: pxor %xmm3, %xmm1
1084 ; SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562035200,18446744071562035200]
1085 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
1086 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
1087 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1088 ; SSSE3-NEXT: pcmpeqd %xmm0, %xmm1
1089 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1090 ; SSSE3-NEXT: pand %xmm4, %xmm0
1091 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1092 ; SSSE3-NEXT: por %xmm0, %xmm1
1093 ; SSSE3-NEXT: pand %xmm1, %xmm3
1094 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1095 ; SSSE3-NEXT: por %xmm3, %xmm1
1096 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1097 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1100 ; SSE41-LABEL: trunc_ssat_v2i64_v2i16:
1102 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1103 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [32767,32767]
1104 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
1105 ; SSE41-NEXT: pxor %xmm3, %xmm0
1106 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147516415,2147516415]
1107 ; SSE41-NEXT: movdqa %xmm4, %xmm5
1108 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
1109 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
1110 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
1111 ; SSE41-NEXT: pand %xmm5, %xmm0
1112 ; SSE41-NEXT: por %xmm4, %xmm0
1113 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
1114 ; SSE41-NEXT: movapd {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1115 ; SSE41-NEXT: pxor %xmm2, %xmm3
1116 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562035200,18446744071562035200]
1117 ; SSE41-NEXT: movdqa %xmm3, %xmm4
1118 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
1119 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
1120 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1121 ; SSE41-NEXT: pand %xmm4, %xmm0
1122 ; SSE41-NEXT: por %xmm3, %xmm0
1123 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
1124 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1125 ; SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1128 ; AVX1-LABEL: trunc_ssat_v2i64_v2i16:
1130 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [32767,32767]
1131 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
1132 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1133 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1134 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
1135 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1136 ; AVX1-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1137 ; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1140 ; AVX2-SLOW-LABEL: trunc_ssat_v2i64_v2i16:
1141 ; AVX2-SLOW: # %bb.0:
1142 ; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} xmm1 = [32767,32767]
1143 ; AVX2-SLOW-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
1144 ; AVX2-SLOW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1145 ; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1146 ; AVX2-SLOW-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
1147 ; AVX2-SLOW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1148 ; AVX2-SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1149 ; AVX2-SLOW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1150 ; AVX2-SLOW-NEXT: retq
1152 ; AVX2-FAST-LABEL: trunc_ssat_v2i64_v2i16:
1153 ; AVX2-FAST: # %bb.0:
1154 ; AVX2-FAST-NEXT: vmovdqa {{.*#+}} xmm1 = [32767,32767]
1155 ; AVX2-FAST-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
1156 ; AVX2-FAST-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1157 ; AVX2-FAST-NEXT: vmovdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1158 ; AVX2-FAST-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
1159 ; AVX2-FAST-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1160 ; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
1161 ; AVX2-FAST-NEXT: retq
1163 ; AVX512F-LABEL: trunc_ssat_v2i64_v2i16:
1165 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1166 ; AVX512F-NEXT: vpmovsqw %zmm0, %xmm0
1167 ; AVX512F-NEXT: vzeroupper
1168 ; AVX512F-NEXT: retq
1170 ; AVX512VL-LABEL: trunc_ssat_v2i64_v2i16:
1171 ; AVX512VL: # %bb.0:
1172 ; AVX512VL-NEXT: vpmovsqw %xmm0, %xmm0
1173 ; AVX512VL-NEXT: retq
1175 ; AVX512BW-LABEL: trunc_ssat_v2i64_v2i16:
1176 ; AVX512BW: # %bb.0:
1177 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1178 ; AVX512BW-NEXT: vpmovsqw %zmm0, %xmm0
1179 ; AVX512BW-NEXT: vzeroupper
1180 ; AVX512BW-NEXT: retq
1182 ; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i16:
1183 ; AVX512BWVL: # %bb.0:
1184 ; AVX512BWVL-NEXT: vpmovsqw %xmm0, %xmm0
1185 ; AVX512BWVL-NEXT: retq
1187 ; SKX-LABEL: trunc_ssat_v2i64_v2i16:
1189 ; SKX-NEXT: vpmovsqw %xmm0, %xmm0
1191 %1 = icmp slt <2 x i64> %a0, <i64 32767, i64 32767>
1192 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 32767, i64 32767>
1193 %3 = icmp sgt <2 x i64> %2, <i64 -32768, i64 -32768>
1194 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -32768, i64 -32768>
1195 %5 = trunc <2 x i64> %4 to <2 x i16>
1199 define void @trunc_ssat_v2i64_v2i16_store(<2 x i64> %a0, <2 x i16> *%p1) {
1200 ; SSE2-LABEL: trunc_ssat_v2i64_v2i16_store:
1202 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
1203 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1204 ; SSE2-NEXT: pxor %xmm1, %xmm2
1205 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147516415,2147516415]
1206 ; SSE2-NEXT: movdqa %xmm3, %xmm4
1207 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
1208 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1209 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
1210 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1211 ; SSE2-NEXT: pand %xmm5, %xmm2
1212 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1213 ; SSE2-NEXT: por %xmm2, %xmm3
1214 ; SSE2-NEXT: pand %xmm3, %xmm0
1215 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
1216 ; SSE2-NEXT: por %xmm0, %xmm3
1217 ; SSE2-NEXT: pxor %xmm3, %xmm1
1218 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562035200,18446744071562035200]
1219 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1220 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
1221 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1222 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
1223 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1224 ; SSE2-NEXT: pand %xmm4, %xmm0
1225 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1226 ; SSE2-NEXT: por %xmm0, %xmm1
1227 ; SSE2-NEXT: pand %xmm1, %xmm3
1228 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1229 ; SSE2-NEXT: por %xmm3, %xmm1
1230 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1231 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1232 ; SSE2-NEXT: movd %xmm0, (%rdi)
1235 ; SSSE3-LABEL: trunc_ssat_v2i64_v2i16_store:
1237 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
1238 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
1239 ; SSSE3-NEXT: pxor %xmm1, %xmm2
1240 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147516415,2147516415]
1241 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
1242 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
1243 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1244 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm2
1245 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1246 ; SSSE3-NEXT: pand %xmm5, %xmm2
1247 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1248 ; SSSE3-NEXT: por %xmm2, %xmm3
1249 ; SSSE3-NEXT: pand %xmm3, %xmm0
1250 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
1251 ; SSSE3-NEXT: por %xmm0, %xmm3
1252 ; SSSE3-NEXT: pxor %xmm3, %xmm1
1253 ; SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562035200,18446744071562035200]
1254 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
1255 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
1256 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1257 ; SSSE3-NEXT: pcmpeqd %xmm0, %xmm1
1258 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1259 ; SSSE3-NEXT: pand %xmm4, %xmm0
1260 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1261 ; SSSE3-NEXT: por %xmm0, %xmm1
1262 ; SSSE3-NEXT: pand %xmm1, %xmm3
1263 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1264 ; SSSE3-NEXT: por %xmm3, %xmm1
1265 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1266 ; SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1267 ; SSSE3-NEXT: movd %xmm0, (%rdi)
1270 ; SSE41-LABEL: trunc_ssat_v2i64_v2i16_store:
1272 ; SSE41-NEXT: movdqa %xmm0, %xmm1
1273 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [32767,32767]
1274 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
1275 ; SSE41-NEXT: pxor %xmm3, %xmm0
1276 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147516415,2147516415]
1277 ; SSE41-NEXT: movdqa %xmm4, %xmm5
1278 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
1279 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
1280 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
1281 ; SSE41-NEXT: pand %xmm5, %xmm0
1282 ; SSE41-NEXT: por %xmm4, %xmm0
1283 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
1284 ; SSE41-NEXT: movapd {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1285 ; SSE41-NEXT: pxor %xmm2, %xmm3
1286 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562035200,18446744071562035200]
1287 ; SSE41-NEXT: movdqa %xmm3, %xmm4
1288 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
1289 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
1290 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1291 ; SSE41-NEXT: pand %xmm4, %xmm0
1292 ; SSE41-NEXT: por %xmm3, %xmm0
1293 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
1294 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1295 ; SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1296 ; SSE41-NEXT: movd %xmm0, (%rdi)
1299 ; AVX1-LABEL: trunc_ssat_v2i64_v2i16_store:
1301 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [32767,32767]
1302 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
1303 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1304 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1305 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
1306 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1307 ; AVX1-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1308 ; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1309 ; AVX1-NEXT: vmovd %xmm0, (%rdi)
1312 ; AVX2-SLOW-LABEL: trunc_ssat_v2i64_v2i16_store:
1313 ; AVX2-SLOW: # %bb.0:
1314 ; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} xmm1 = [32767,32767]
1315 ; AVX2-SLOW-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
1316 ; AVX2-SLOW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1317 ; AVX2-SLOW-NEXT: vmovdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1318 ; AVX2-SLOW-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
1319 ; AVX2-SLOW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1320 ; AVX2-SLOW-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1321 ; AVX2-SLOW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1322 ; AVX2-SLOW-NEXT: vmovd %xmm0, (%rdi)
1323 ; AVX2-SLOW-NEXT: retq
1325 ; AVX2-FAST-LABEL: trunc_ssat_v2i64_v2i16_store:
1326 ; AVX2-FAST: # %bb.0:
1327 ; AVX2-FAST-NEXT: vmovdqa {{.*#+}} xmm1 = [32767,32767]
1328 ; AVX2-FAST-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
1329 ; AVX2-FAST-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1330 ; AVX2-FAST-NEXT: vmovdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1331 ; AVX2-FAST-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
1332 ; AVX2-FAST-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1333 ; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,u,u,u,u,u,u,u,u,u,u,u,u]
1334 ; AVX2-FAST-NEXT: vmovd %xmm0, (%rdi)
1335 ; AVX2-FAST-NEXT: retq
1337 ; AVX512F-LABEL: trunc_ssat_v2i64_v2i16_store:
1339 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1340 ; AVX512F-NEXT: vpmovsqw %zmm0, %xmm0
1341 ; AVX512F-NEXT: vmovd %xmm0, (%rdi)
1342 ; AVX512F-NEXT: vzeroupper
1343 ; AVX512F-NEXT: retq
1345 ; AVX512VL-LABEL: trunc_ssat_v2i64_v2i16_store:
1346 ; AVX512VL: # %bb.0:
1347 ; AVX512VL-NEXT: vpmovsqw %xmm0, (%rdi)
1348 ; AVX512VL-NEXT: retq
1350 ; AVX512BW-LABEL: trunc_ssat_v2i64_v2i16_store:
1351 ; AVX512BW: # %bb.0:
1352 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1353 ; AVX512BW-NEXT: vpmovsqw %zmm0, %xmm0
1354 ; AVX512BW-NEXT: vmovd %xmm0, (%rdi)
1355 ; AVX512BW-NEXT: vzeroupper
1356 ; AVX512BW-NEXT: retq
1358 ; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i16_store:
1359 ; AVX512BWVL: # %bb.0:
1360 ; AVX512BWVL-NEXT: vpmovsqw %xmm0, (%rdi)
1361 ; AVX512BWVL-NEXT: retq
1363 ; SKX-LABEL: trunc_ssat_v2i64_v2i16_store:
1365 ; SKX-NEXT: vpmovsqw %xmm0, (%rdi)
1367 %1 = icmp slt <2 x i64> %a0, <i64 32767, i64 32767>
1368 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 32767, i64 32767>
1369 %3 = icmp sgt <2 x i64> %2, <i64 -32768, i64 -32768>
1370 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -32768, i64 -32768>
1371 %5 = trunc <2 x i64> %4 to <2 x i16>
1372 store <2 x i16> %5, <2 x i16> *%p1
1376 define <4 x i16> @trunc_ssat_v4i64_v4i16(<4 x i64> %a0) {
1377 ; SSE2-LABEL: trunc_ssat_v4i64_v4i16:
1379 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [32767,32767]
1380 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1381 ; SSE2-NEXT: movdqa %xmm0, %xmm3
1382 ; SSE2-NEXT: pxor %xmm2, %xmm3
1383 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147516415,2147516415]
1384 ; SSE2-NEXT: movdqa %xmm5, %xmm6
1385 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm6
1386 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1387 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm3
1388 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
1389 ; SSE2-NEXT: pand %xmm7, %xmm4
1390 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
1391 ; SSE2-NEXT: por %xmm4, %xmm3
1392 ; SSE2-NEXT: pand %xmm3, %xmm0
1393 ; SSE2-NEXT: pandn %xmm8, %xmm3
1394 ; SSE2-NEXT: por %xmm0, %xmm3
1395 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1396 ; SSE2-NEXT: pxor %xmm2, %xmm0
1397 ; SSE2-NEXT: movdqa %xmm5, %xmm4
1398 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
1399 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1400 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm0
1401 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1402 ; SSE2-NEXT: pand %xmm6, %xmm0
1403 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1404 ; SSE2-NEXT: por %xmm0, %xmm4
1405 ; SSE2-NEXT: pand %xmm4, %xmm1
1406 ; SSE2-NEXT: pandn %xmm8, %xmm4
1407 ; SSE2-NEXT: por %xmm1, %xmm4
1408 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1409 ; SSE2-NEXT: movdqa %xmm4, %xmm0
1410 ; SSE2-NEXT: pxor %xmm2, %xmm0
1411 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [18446744071562035200,18446744071562035200]
1412 ; SSE2-NEXT: movdqa %xmm0, %xmm6
1413 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm6
1414 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1415 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm0
1416 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1417 ; SSE2-NEXT: pand %xmm7, %xmm0
1418 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1419 ; SSE2-NEXT: por %xmm0, %xmm6
1420 ; SSE2-NEXT: pand %xmm6, %xmm4
1421 ; SSE2-NEXT: pandn %xmm1, %xmm6
1422 ; SSE2-NEXT: por %xmm4, %xmm6
1423 ; SSE2-NEXT: pxor %xmm3, %xmm2
1424 ; SSE2-NEXT: movdqa %xmm2, %xmm0
1425 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm0
1426 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1427 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm2
1428 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1429 ; SSE2-NEXT: pand %xmm4, %xmm2
1430 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1431 ; SSE2-NEXT: por %xmm2, %xmm0
1432 ; SSE2-NEXT: pand %xmm0, %xmm3
1433 ; SSE2-NEXT: pandn %xmm1, %xmm0
1434 ; SSE2-NEXT: por %xmm3, %xmm0
1435 ; SSE2-NEXT: packssdw %xmm6, %xmm0
1436 ; SSE2-NEXT: packssdw %xmm0, %xmm0
1439 ; SSSE3-LABEL: trunc_ssat_v4i64_v4i16:
1441 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [32767,32767]
1442 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1443 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
1444 ; SSSE3-NEXT: pxor %xmm2, %xmm3
1445 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147516415,2147516415]
1446 ; SSSE3-NEXT: movdqa %xmm5, %xmm6
1447 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm6
1448 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1449 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm3
1450 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
1451 ; SSSE3-NEXT: pand %xmm7, %xmm4
1452 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
1453 ; SSSE3-NEXT: por %xmm4, %xmm3
1454 ; SSSE3-NEXT: pand %xmm3, %xmm0
1455 ; SSSE3-NEXT: pandn %xmm8, %xmm3
1456 ; SSSE3-NEXT: por %xmm0, %xmm3
1457 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
1458 ; SSSE3-NEXT: pxor %xmm2, %xmm0
1459 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
1460 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
1461 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1462 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm0
1463 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1464 ; SSSE3-NEXT: pand %xmm6, %xmm0
1465 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1466 ; SSSE3-NEXT: por %xmm0, %xmm4
1467 ; SSSE3-NEXT: pand %xmm4, %xmm1
1468 ; SSSE3-NEXT: pandn %xmm8, %xmm4
1469 ; SSSE3-NEXT: por %xmm1, %xmm4
1470 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1471 ; SSSE3-NEXT: movdqa %xmm4, %xmm0
1472 ; SSSE3-NEXT: pxor %xmm2, %xmm0
1473 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [18446744071562035200,18446744071562035200]
1474 ; SSSE3-NEXT: movdqa %xmm0, %xmm6
1475 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm6
1476 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1477 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm0
1478 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1479 ; SSSE3-NEXT: pand %xmm7, %xmm0
1480 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1481 ; SSSE3-NEXT: por %xmm0, %xmm6
1482 ; SSSE3-NEXT: pand %xmm6, %xmm4
1483 ; SSSE3-NEXT: pandn %xmm1, %xmm6
1484 ; SSSE3-NEXT: por %xmm4, %xmm6
1485 ; SSSE3-NEXT: pxor %xmm3, %xmm2
1486 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
1487 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm0
1488 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1489 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm2
1490 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1491 ; SSSE3-NEXT: pand %xmm4, %xmm2
1492 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1493 ; SSSE3-NEXT: por %xmm2, %xmm0
1494 ; SSSE3-NEXT: pand %xmm0, %xmm3
1495 ; SSSE3-NEXT: pandn %xmm1, %xmm0
1496 ; SSSE3-NEXT: por %xmm3, %xmm0
1497 ; SSSE3-NEXT: packssdw %xmm6, %xmm0
1498 ; SSSE3-NEXT: packssdw %xmm0, %xmm0
1501 ; SSE41-LABEL: trunc_ssat_v4i64_v4i16:
1503 ; SSE41-NEXT: movdqa %xmm0, %xmm2
1504 ; SSE41-NEXT: movapd {{.*#+}} xmm4 = [32767,32767]
1505 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
1506 ; SSE41-NEXT: pxor %xmm3, %xmm0
1507 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [2147516415,2147516415]
1508 ; SSE41-NEXT: movdqa %xmm6, %xmm5
1509 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
1510 ; SSE41-NEXT: movdqa %xmm6, %xmm7
1511 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
1512 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1513 ; SSE41-NEXT: pand %xmm5, %xmm0
1514 ; SSE41-NEXT: por %xmm7, %xmm0
1515 ; SSE41-NEXT: movapd %xmm4, %xmm5
1516 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5
1517 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1518 ; SSE41-NEXT: pxor %xmm3, %xmm0
1519 ; SSE41-NEXT: movdqa %xmm6, %xmm2
1520 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
1521 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
1522 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1523 ; SSE41-NEXT: pand %xmm2, %xmm0
1524 ; SSE41-NEXT: por %xmm6, %xmm0
1525 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4
1526 ; SSE41-NEXT: movapd {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1527 ; SSE41-NEXT: movapd %xmm4, %xmm2
1528 ; SSE41-NEXT: xorpd %xmm3, %xmm2
1529 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [18446744071562035200,18446744071562035200]
1530 ; SSE41-NEXT: movapd %xmm2, %xmm7
1531 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm7
1532 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm2
1533 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
1534 ; SSE41-NEXT: pand %xmm7, %xmm0
1535 ; SSE41-NEXT: por %xmm2, %xmm0
1536 ; SSE41-NEXT: movapd %xmm1, %xmm2
1537 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2
1538 ; SSE41-NEXT: xorpd %xmm5, %xmm3
1539 ; SSE41-NEXT: movapd %xmm3, %xmm4
1540 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm4
1541 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm3
1542 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1543 ; SSE41-NEXT: pand %xmm4, %xmm0
1544 ; SSE41-NEXT: por %xmm3, %xmm0
1545 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1
1546 ; SSE41-NEXT: packssdw %xmm2, %xmm1
1547 ; SSE41-NEXT: packssdw %xmm1, %xmm1
1548 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1551 ; AVX1-LABEL: trunc_ssat_v4i64_v4i16:
1553 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1554 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [32767,32767]
1555 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm3
1556 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm4
1557 ; AVX1-NEXT: vblendvpd %xmm4, %xmm0, %xmm2, %xmm0
1558 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [18446744073709518848,18446744073709518848]
1559 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm5
1560 ; AVX1-NEXT: vblendvpd %xmm3, %xmm1, %xmm2, %xmm1
1561 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm2
1562 ; AVX1-NEXT: vblendvpd %xmm2, %xmm1, %xmm4, %xmm1
1563 ; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
1564 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
1565 ; AVX1-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
1566 ; AVX1-NEXT: vzeroupper
1569 ; AVX2-LABEL: trunc_ssat_v4i64_v4i16:
1571 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [32767,32767,32767,32767]
1572 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
1573 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1574 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848]
1575 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2
1576 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1577 ; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
1578 ; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
1579 ; AVX2-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
1580 ; AVX2-NEXT: vzeroupper
1583 ; AVX512F-LABEL: trunc_ssat_v4i64_v4i16:
1585 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1586 ; AVX512F-NEXT: vpmovsqw %zmm0, %xmm0
1587 ; AVX512F-NEXT: vzeroupper
1588 ; AVX512F-NEXT: retq
1590 ; AVX512VL-LABEL: trunc_ssat_v4i64_v4i16:
1591 ; AVX512VL: # %bb.0:
1592 ; AVX512VL-NEXT: vpmovsqw %ymm0, %xmm0
1593 ; AVX512VL-NEXT: vzeroupper
1594 ; AVX512VL-NEXT: retq
1596 ; AVX512BW-LABEL: trunc_ssat_v4i64_v4i16:
1597 ; AVX512BW: # %bb.0:
1598 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1599 ; AVX512BW-NEXT: vpmovsqw %zmm0, %xmm0
1600 ; AVX512BW-NEXT: vzeroupper
1601 ; AVX512BW-NEXT: retq
1603 ; AVX512BWVL-LABEL: trunc_ssat_v4i64_v4i16:
1604 ; AVX512BWVL: # %bb.0:
1605 ; AVX512BWVL-NEXT: vpmovsqw %ymm0, %xmm0
1606 ; AVX512BWVL-NEXT: vzeroupper
1607 ; AVX512BWVL-NEXT: retq
1609 ; SKX-LABEL: trunc_ssat_v4i64_v4i16:
1611 ; SKX-NEXT: vpmovsqw %ymm0, %xmm0
1612 ; SKX-NEXT: vzeroupper
1614 %1 = icmp slt <4 x i64> %a0, <i64 32767, i64 32767, i64 32767, i64 32767>
1615 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 32767, i64 32767, i64 32767, i64 32767>
1616 %3 = icmp sgt <4 x i64> %2, <i64 -32768, i64 -32768, i64 -32768, i64 -32768>
1617 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> <i64 -32768, i64 -32768, i64 -32768, i64 -32768>
1618 %5 = trunc <4 x i64> %4 to <4 x i16>
1622 define void @trunc_ssat_v4i64_v4i16_store(<4 x i64> %a0, <4 x i16> *%p1) {
1623 ; SSE2-LABEL: trunc_ssat_v4i64_v4i16_store:
1625 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [32767,32767]
1626 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1627 ; SSE2-NEXT: movdqa %xmm0, %xmm3
1628 ; SSE2-NEXT: pxor %xmm2, %xmm3
1629 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147516415,2147516415]
1630 ; SSE2-NEXT: movdqa %xmm5, %xmm6
1631 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm6
1632 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1633 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm3
1634 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
1635 ; SSE2-NEXT: pand %xmm7, %xmm4
1636 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
1637 ; SSE2-NEXT: por %xmm4, %xmm3
1638 ; SSE2-NEXT: pand %xmm3, %xmm0
1639 ; SSE2-NEXT: pandn %xmm8, %xmm3
1640 ; SSE2-NEXT: por %xmm0, %xmm3
1641 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1642 ; SSE2-NEXT: pxor %xmm2, %xmm0
1643 ; SSE2-NEXT: movdqa %xmm5, %xmm4
1644 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
1645 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1646 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm0
1647 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1648 ; SSE2-NEXT: pand %xmm6, %xmm0
1649 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1650 ; SSE2-NEXT: por %xmm0, %xmm4
1651 ; SSE2-NEXT: pand %xmm4, %xmm1
1652 ; SSE2-NEXT: pandn %xmm8, %xmm4
1653 ; SSE2-NEXT: por %xmm1, %xmm4
1654 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [18446744073709518848,18446744073709518848]
1655 ; SSE2-NEXT: movdqa %xmm4, %xmm1
1656 ; SSE2-NEXT: pxor %xmm2, %xmm1
1657 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [18446744071562035200,18446744071562035200]
1658 ; SSE2-NEXT: movdqa %xmm1, %xmm6
1659 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm6
1660 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1661 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm1
1662 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1663 ; SSE2-NEXT: pand %xmm7, %xmm1
1664 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1665 ; SSE2-NEXT: por %xmm1, %xmm6
1666 ; SSE2-NEXT: pand %xmm6, %xmm4
1667 ; SSE2-NEXT: pandn %xmm0, %xmm6
1668 ; SSE2-NEXT: por %xmm4, %xmm6
1669 ; SSE2-NEXT: pxor %xmm3, %xmm2
1670 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1671 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm1
1672 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
1673 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm2
1674 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1675 ; SSE2-NEXT: pand %xmm4, %xmm2
1676 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1677 ; SSE2-NEXT: por %xmm2, %xmm1
1678 ; SSE2-NEXT: pand %xmm1, %xmm3
1679 ; SSE2-NEXT: pandn %xmm0, %xmm1
1680 ; SSE2-NEXT: por %xmm3, %xmm1
1681 ; SSE2-NEXT: packssdw %xmm6, %xmm1
1682 ; SSE2-NEXT: packssdw %xmm1, %xmm1
1683 ; SSE2-NEXT: movq %xmm1, (%rdi)
1686 ; SSSE3-LABEL: trunc_ssat_v4i64_v4i16_store:
1688 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [32767,32767]
1689 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1690 ; SSSE3-NEXT: movdqa %xmm0, %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, %xmm0
1702 ; SSSE3-NEXT: pandn %xmm8, %xmm3
1703 ; SSSE3-NEXT: por %xmm0, %xmm3
1704 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
1705 ; SSSE3-NEXT: pxor %xmm2, %xmm0
1706 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
1707 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
1708 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1709 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm0
1710 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1711 ; SSSE3-NEXT: pand %xmm6, %xmm0
1712 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1713 ; SSSE3-NEXT: por %xmm0, %xmm4
1714 ; SSSE3-NEXT: pand %xmm4, %xmm1
1715 ; SSSE3-NEXT: pandn %xmm8, %xmm4
1716 ; SSSE3-NEXT: por %xmm1, %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: packssdw %xmm6, %xmm1
1745 ; SSSE3-NEXT: packssdw %xmm1, %xmm1
1746 ; SSSE3-NEXT: movq %xmm1, (%rdi)
1749 ; SSE41-LABEL: trunc_ssat_v4i64_v4i16_store:
1751 ; SSE41-NEXT: movdqa %xmm0, %xmm2
1752 ; SSE41-NEXT: movapd {{.*#+}} xmm4 = [32767,32767]
1753 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
1754 ; SSE41-NEXT: pxor %xmm3, %xmm0
1755 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [2147516415,2147516415]
1756 ; SSE41-NEXT: movdqa %xmm6, %xmm5
1757 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
1758 ; SSE41-NEXT: movdqa %xmm6, %xmm7
1759 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
1760 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1761 ; SSE41-NEXT: pand %xmm5, %xmm0
1762 ; SSE41-NEXT: por %xmm7, %xmm0
1763 ; SSE41-NEXT: movapd %xmm4, %xmm5
1764 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5
1765 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1766 ; SSE41-NEXT: pxor %xmm3, %xmm0
1767 ; SSE41-NEXT: movdqa %xmm6, %xmm2
1768 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
1769 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
1770 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1771 ; SSE41-NEXT: pand %xmm2, %xmm0
1772 ; SSE41-NEXT: por %xmm6, %xmm0
1773 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4
1774 ; SSE41-NEXT: movapd {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1775 ; SSE41-NEXT: movapd %xmm4, %xmm2
1776 ; SSE41-NEXT: xorpd %xmm3, %xmm2
1777 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [18446744071562035200,18446744071562035200]
1778 ; SSE41-NEXT: movapd %xmm2, %xmm7
1779 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm7
1780 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm2
1781 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
1782 ; SSE41-NEXT: pand %xmm7, %xmm0
1783 ; SSE41-NEXT: por %xmm2, %xmm0
1784 ; SSE41-NEXT: movapd %xmm1, %xmm2
1785 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2
1786 ; SSE41-NEXT: xorpd %xmm5, %xmm3
1787 ; SSE41-NEXT: movapd %xmm3, %xmm4
1788 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm4
1789 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm3
1790 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1791 ; SSE41-NEXT: pand %xmm4, %xmm0
1792 ; SSE41-NEXT: por %xmm3, %xmm0
1793 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1
1794 ; SSE41-NEXT: packssdw %xmm2, %xmm1
1795 ; SSE41-NEXT: packssdw %xmm1, %xmm1
1796 ; SSE41-NEXT: movq %xmm1, (%rdi)
1799 ; AVX1-LABEL: trunc_ssat_v4i64_v4i16_store:
1801 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1802 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [32767,32767]
1803 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm3
1804 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm4
1805 ; AVX1-NEXT: vblendvpd %xmm4, %xmm0, %xmm2, %xmm0
1806 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [18446744073709518848,18446744073709518848]
1807 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm5
1808 ; AVX1-NEXT: vblendvpd %xmm3, %xmm1, %xmm2, %xmm1
1809 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm2
1810 ; AVX1-NEXT: vblendvpd %xmm2, %xmm1, %xmm4, %xmm1
1811 ; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
1812 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
1813 ; AVX1-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
1814 ; AVX1-NEXT: vmovq %xmm0, (%rdi)
1815 ; AVX1-NEXT: vzeroupper
1818 ; AVX2-LABEL: trunc_ssat_v4i64_v4i16_store:
1820 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [32767,32767,32767,32767]
1821 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
1822 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1823 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848]
1824 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2
1825 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1826 ; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
1827 ; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
1828 ; AVX2-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
1829 ; AVX2-NEXT: vmovq %xmm0, (%rdi)
1830 ; AVX2-NEXT: vzeroupper
1833 ; AVX512F-LABEL: trunc_ssat_v4i64_v4i16_store:
1835 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1836 ; AVX512F-NEXT: vpmovsqw %zmm0, %xmm0
1837 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
1838 ; AVX512F-NEXT: vzeroupper
1839 ; AVX512F-NEXT: retq
1841 ; AVX512VL-LABEL: trunc_ssat_v4i64_v4i16_store:
1842 ; AVX512VL: # %bb.0:
1843 ; AVX512VL-NEXT: vpmovsqw %ymm0, (%rdi)
1844 ; AVX512VL-NEXT: vzeroupper
1845 ; AVX512VL-NEXT: retq
1847 ; AVX512BW-LABEL: trunc_ssat_v4i64_v4i16_store:
1848 ; AVX512BW: # %bb.0:
1849 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1850 ; AVX512BW-NEXT: vpmovsqw %zmm0, %xmm0
1851 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
1852 ; AVX512BW-NEXT: vzeroupper
1853 ; AVX512BW-NEXT: retq
1855 ; AVX512BWVL-LABEL: trunc_ssat_v4i64_v4i16_store:
1856 ; AVX512BWVL: # %bb.0:
1857 ; AVX512BWVL-NEXT: vpmovsqw %ymm0, (%rdi)
1858 ; AVX512BWVL-NEXT: vzeroupper
1859 ; AVX512BWVL-NEXT: retq
1861 ; SKX-LABEL: trunc_ssat_v4i64_v4i16_store:
1863 ; SKX-NEXT: vpmovsqw %ymm0, (%rdi)
1864 ; SKX-NEXT: vzeroupper
1866 %1 = icmp slt <4 x i64> %a0, <i64 32767, i64 32767, i64 32767, i64 32767>
1867 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 32767, i64 32767, i64 32767, i64 32767>
1868 %3 = icmp sgt <4 x i64> %2, <i64 -32768, i64 -32768, i64 -32768, i64 -32768>
1869 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> <i64 -32768, i64 -32768, i64 -32768, i64 -32768>
1870 %5 = trunc <4 x i64> %4 to <4 x i16>
1871 store <4 x i16> %5, <4 x i16> *%p1
1875 define <8 x i16> @trunc_ssat_v8i64_v8i16(<8 x i64>* %p0) "min-legal-vector-width"="256" {
1876 ; SSE2-LABEL: trunc_ssat_v8i64_v8i16:
1878 ; SSE2-NEXT: movdqa (%rdi), %xmm6
1879 ; SSE2-NEXT: movdqa 16(%rdi), %xmm9
1880 ; SSE2-NEXT: movdqa 32(%rdi), %xmm3
1881 ; SSE2-NEXT: movdqa 48(%rdi), %xmm5
1882 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [32767,32767]
1883 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
1884 ; SSE2-NEXT: movdqa %xmm3, %xmm2
1885 ; SSE2-NEXT: pxor %xmm1, %xmm2
1886 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147516415,2147516415]
1887 ; SSE2-NEXT: movdqa %xmm10, %xmm7
1888 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm7
1889 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1890 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm2
1891 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
1892 ; SSE2-NEXT: pand %xmm0, %xmm4
1893 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]
1894 ; SSE2-NEXT: por %xmm4, %xmm2
1895 ; SSE2-NEXT: pand %xmm2, %xmm3
1896 ; SSE2-NEXT: pandn %xmm8, %xmm2
1897 ; SSE2-NEXT: por %xmm3, %xmm2
1898 ; SSE2-NEXT: movdqa %xmm5, %xmm0
1899 ; SSE2-NEXT: pxor %xmm1, %xmm0
1900 ; SSE2-NEXT: movdqa %xmm10, %xmm3
1901 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm3
1902 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1903 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm0
1904 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1905 ; SSE2-NEXT: pand %xmm4, %xmm0
1906 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1907 ; SSE2-NEXT: por %xmm0, %xmm3
1908 ; SSE2-NEXT: pand %xmm3, %xmm5
1909 ; SSE2-NEXT: pandn %xmm8, %xmm3
1910 ; SSE2-NEXT: por %xmm5, %xmm3
1911 ; SSE2-NEXT: movdqa %xmm6, %xmm0
1912 ; SSE2-NEXT: pxor %xmm1, %xmm0
1913 ; SSE2-NEXT: movdqa %xmm10, %xmm4
1914 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
1915 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1916 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm0
1917 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1918 ; SSE2-NEXT: pand %xmm5, %xmm0
1919 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
1920 ; SSE2-NEXT: por %xmm0, %xmm5
1921 ; SSE2-NEXT: pand %xmm5, %xmm6
1922 ; SSE2-NEXT: pandn %xmm8, %xmm5
1923 ; SSE2-NEXT: por %xmm6, %xmm5
1924 ; SSE2-NEXT: movdqa %xmm9, %xmm0
1925 ; SSE2-NEXT: pxor %xmm1, %xmm0
1926 ; SSE2-NEXT: movdqa %xmm10, %xmm4
1927 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
1928 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1929 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm0
1930 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1931 ; SSE2-NEXT: pand %xmm6, %xmm0
1932 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
1933 ; SSE2-NEXT: por %xmm0, %xmm7
1934 ; SSE2-NEXT: pand %xmm7, %xmm9
1935 ; SSE2-NEXT: pandn %xmm8, %xmm7
1936 ; SSE2-NEXT: por %xmm9, %xmm7
1937 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [18446744073709518848,18446744073709518848]
1938 ; SSE2-NEXT: movdqa %xmm7, %xmm0
1939 ; SSE2-NEXT: pxor %xmm1, %xmm0
1940 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [18446744071562035200,18446744071562035200]
1941 ; SSE2-NEXT: movdqa %xmm0, %xmm4
1942 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm4
1943 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
1944 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm0
1945 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1946 ; SSE2-NEXT: pand %xmm6, %xmm0
1947 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1948 ; SSE2-NEXT: por %xmm0, %xmm4
1949 ; SSE2-NEXT: pand %xmm4, %xmm7
1950 ; SSE2-NEXT: pandn %xmm8, %xmm4
1951 ; SSE2-NEXT: por %xmm7, %xmm4
1952 ; SSE2-NEXT: movdqa %xmm5, %xmm0
1953 ; SSE2-NEXT: pxor %xmm1, %xmm0
1954 ; SSE2-NEXT: movdqa %xmm0, %xmm6
1955 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm6
1956 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
1957 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm0
1958 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
1959 ; SSE2-NEXT: pand %xmm10, %xmm7
1960 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
1961 ; SSE2-NEXT: por %xmm7, %xmm0
1962 ; SSE2-NEXT: pand %xmm0, %xmm5
1963 ; SSE2-NEXT: pandn %xmm8, %xmm0
1964 ; SSE2-NEXT: por %xmm5, %xmm0
1965 ; SSE2-NEXT: packssdw %xmm4, %xmm0
1966 ; SSE2-NEXT: movdqa %xmm3, %xmm4
1967 ; SSE2-NEXT: pxor %xmm1, %xmm4
1968 ; SSE2-NEXT: movdqa %xmm4, %xmm5
1969 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm5
1970 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1971 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm4
1972 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1973 ; SSE2-NEXT: pand %xmm6, %xmm4
1974 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1975 ; SSE2-NEXT: por %xmm4, %xmm5
1976 ; SSE2-NEXT: pand %xmm5, %xmm3
1977 ; SSE2-NEXT: pandn %xmm8, %xmm5
1978 ; SSE2-NEXT: por %xmm3, %xmm5
1979 ; SSE2-NEXT: pxor %xmm2, %xmm1
1980 ; SSE2-NEXT: movdqa %xmm1, %xmm3
1981 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm3
1982 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1983 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm1
1984 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1985 ; SSE2-NEXT: pand %xmm4, %xmm1
1986 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1987 ; SSE2-NEXT: por %xmm1, %xmm3
1988 ; SSE2-NEXT: pand %xmm3, %xmm2
1989 ; SSE2-NEXT: pandn %xmm8, %xmm3
1990 ; SSE2-NEXT: por %xmm2, %xmm3
1991 ; SSE2-NEXT: packssdw %xmm5, %xmm3
1992 ; SSE2-NEXT: packssdw %xmm3, %xmm0
1995 ; SSSE3-LABEL: trunc_ssat_v8i64_v8i16:
1997 ; SSSE3-NEXT: movdqa (%rdi), %xmm6
1998 ; SSSE3-NEXT: movdqa 16(%rdi), %xmm9
1999 ; SSSE3-NEXT: movdqa 32(%rdi), %xmm3
2000 ; SSSE3-NEXT: movdqa 48(%rdi), %xmm5
2001 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [32767,32767]
2002 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
2003 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
2004 ; SSSE3-NEXT: pxor %xmm1, %xmm2
2005 ; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [2147516415,2147516415]
2006 ; SSSE3-NEXT: movdqa %xmm10, %xmm7
2007 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm7
2008 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
2009 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm2
2010 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
2011 ; SSSE3-NEXT: pand %xmm0, %xmm4
2012 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]
2013 ; SSSE3-NEXT: por %xmm4, %xmm2
2014 ; SSSE3-NEXT: pand %xmm2, %xmm3
2015 ; SSSE3-NEXT: pandn %xmm8, %xmm2
2016 ; SSSE3-NEXT: por %xmm3, %xmm2
2017 ; SSSE3-NEXT: movdqa %xmm5, %xmm0
2018 ; SSSE3-NEXT: pxor %xmm1, %xmm0
2019 ; SSSE3-NEXT: movdqa %xmm10, %xmm3
2020 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm3
2021 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2022 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm0
2023 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2024 ; SSSE3-NEXT: pand %xmm4, %xmm0
2025 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2026 ; SSSE3-NEXT: por %xmm0, %xmm3
2027 ; SSSE3-NEXT: pand %xmm3, %xmm5
2028 ; SSSE3-NEXT: pandn %xmm8, %xmm3
2029 ; SSSE3-NEXT: por %xmm5, %xmm3
2030 ; SSSE3-NEXT: movdqa %xmm6, %xmm0
2031 ; SSSE3-NEXT: pxor %xmm1, %xmm0
2032 ; SSSE3-NEXT: movdqa %xmm10, %xmm4
2033 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
2034 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2035 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm0
2036 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2037 ; SSSE3-NEXT: pand %xmm5, %xmm0
2038 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
2039 ; SSSE3-NEXT: por %xmm0, %xmm5
2040 ; SSSE3-NEXT: pand %xmm5, %xmm6
2041 ; SSSE3-NEXT: pandn %xmm8, %xmm5
2042 ; SSSE3-NEXT: por %xmm6, %xmm5
2043 ; SSSE3-NEXT: movdqa %xmm9, %xmm0
2044 ; SSSE3-NEXT: pxor %xmm1, %xmm0
2045 ; SSSE3-NEXT: movdqa %xmm10, %xmm4
2046 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
2047 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2048 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm0
2049 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2050 ; SSSE3-NEXT: pand %xmm6, %xmm0
2051 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
2052 ; SSSE3-NEXT: por %xmm0, %xmm7
2053 ; SSSE3-NEXT: pand %xmm7, %xmm9
2054 ; SSSE3-NEXT: pandn %xmm8, %xmm7
2055 ; SSSE3-NEXT: por %xmm9, %xmm7
2056 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [18446744073709518848,18446744073709518848]
2057 ; SSSE3-NEXT: movdqa %xmm7, %xmm0
2058 ; SSSE3-NEXT: pxor %xmm1, %xmm0
2059 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [18446744071562035200,18446744071562035200]
2060 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
2061 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm4
2062 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2063 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm0
2064 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2065 ; SSSE3-NEXT: pand %xmm6, %xmm0
2066 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2067 ; SSSE3-NEXT: por %xmm0, %xmm4
2068 ; SSSE3-NEXT: pand %xmm4, %xmm7
2069 ; SSSE3-NEXT: pandn %xmm8, %xmm4
2070 ; SSSE3-NEXT: por %xmm7, %xmm4
2071 ; SSSE3-NEXT: movdqa %xmm5, %xmm0
2072 ; SSSE3-NEXT: pxor %xmm1, %xmm0
2073 ; SSSE3-NEXT: movdqa %xmm0, %xmm6
2074 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm6
2075 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
2076 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm0
2077 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
2078 ; SSSE3-NEXT: pand %xmm10, %xmm7
2079 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
2080 ; SSSE3-NEXT: por %xmm7, %xmm0
2081 ; SSSE3-NEXT: pand %xmm0, %xmm5
2082 ; SSSE3-NEXT: pandn %xmm8, %xmm0
2083 ; SSSE3-NEXT: por %xmm5, %xmm0
2084 ; SSSE3-NEXT: packssdw %xmm4, %xmm0
2085 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
2086 ; SSSE3-NEXT: pxor %xmm1, %xmm4
2087 ; SSSE3-NEXT: movdqa %xmm4, %xmm5
2088 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm5
2089 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
2090 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm4
2091 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2092 ; SSSE3-NEXT: pand %xmm6, %xmm4
2093 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2094 ; SSSE3-NEXT: por %xmm4, %xmm5
2095 ; SSSE3-NEXT: pand %xmm5, %xmm3
2096 ; SSSE3-NEXT: pandn %xmm8, %xmm5
2097 ; SSSE3-NEXT: por %xmm3, %xmm5
2098 ; SSSE3-NEXT: pxor %xmm2, %xmm1
2099 ; SSSE3-NEXT: movdqa %xmm1, %xmm3
2100 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm3
2101 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2102 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm1
2103 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2104 ; SSSE3-NEXT: pand %xmm4, %xmm1
2105 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2106 ; SSSE3-NEXT: por %xmm1, %xmm3
2107 ; SSSE3-NEXT: pand %xmm3, %xmm2
2108 ; SSSE3-NEXT: pandn %xmm8, %xmm3
2109 ; SSSE3-NEXT: por %xmm2, %xmm3
2110 ; SSSE3-NEXT: packssdw %xmm5, %xmm3
2111 ; SSSE3-NEXT: packssdw %xmm3, %xmm0
2114 ; SSE41-LABEL: trunc_ssat_v8i64_v8i16:
2116 ; SSE41-NEXT: movdqa (%rdi), %xmm10
2117 ; SSE41-NEXT: movdqa 16(%rdi), %xmm9
2118 ; SSE41-NEXT: movdqa 32(%rdi), %xmm3
2119 ; SSE41-NEXT: movdqa 48(%rdi), %xmm5
2120 ; SSE41-NEXT: movapd {{.*#+}} xmm1 = [32767,32767]
2121 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
2122 ; SSE41-NEXT: movdqa %xmm3, %xmm0
2123 ; SSE41-NEXT: pxor %xmm2, %xmm0
2124 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147516415,2147516415]
2125 ; SSE41-NEXT: movdqa %xmm4, %xmm7
2126 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm7
2127 ; SSE41-NEXT: movdqa %xmm4, %xmm6
2128 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
2129 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2130 ; SSE41-NEXT: pand %xmm7, %xmm0
2131 ; SSE41-NEXT: por %xmm6, %xmm0
2132 ; SSE41-NEXT: movapd %xmm1, %xmm8
2133 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm8
2134 ; SSE41-NEXT: movdqa %xmm5, %xmm0
2135 ; SSE41-NEXT: pxor %xmm2, %xmm0
2136 ; SSE41-NEXT: movdqa %xmm4, %xmm3
2137 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
2138 ; SSE41-NEXT: movdqa %xmm4, %xmm6
2139 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
2140 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2141 ; SSE41-NEXT: pand %xmm3, %xmm0
2142 ; SSE41-NEXT: por %xmm6, %xmm0
2143 ; SSE41-NEXT: movapd %xmm1, %xmm11
2144 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm11
2145 ; SSE41-NEXT: movdqa %xmm10, %xmm0
2146 ; SSE41-NEXT: pxor %xmm2, %xmm0
2147 ; SSE41-NEXT: movdqa %xmm4, %xmm3
2148 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
2149 ; SSE41-NEXT: movdqa %xmm4, %xmm5
2150 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
2151 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
2152 ; SSE41-NEXT: pand %xmm3, %xmm0
2153 ; SSE41-NEXT: por %xmm5, %xmm0
2154 ; SSE41-NEXT: movapd %xmm1, %xmm3
2155 ; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm3
2156 ; SSE41-NEXT: movdqa %xmm9, %xmm0
2157 ; SSE41-NEXT: pxor %xmm2, %xmm0
2158 ; SSE41-NEXT: movdqa %xmm4, %xmm5
2159 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
2160 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
2161 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
2162 ; SSE41-NEXT: pand %xmm5, %xmm0
2163 ; SSE41-NEXT: por %xmm4, %xmm0
2164 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm1
2165 ; SSE41-NEXT: movapd {{.*#+}} xmm5 = [18446744073709518848,18446744073709518848]
2166 ; SSE41-NEXT: movapd %xmm1, %xmm4
2167 ; SSE41-NEXT: xorpd %xmm2, %xmm4
2168 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [18446744071562035200,18446744071562035200]
2169 ; SSE41-NEXT: movapd %xmm4, %xmm7
2170 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm7
2171 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm4
2172 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
2173 ; SSE41-NEXT: pand %xmm7, %xmm0
2174 ; SSE41-NEXT: por %xmm4, %xmm0
2175 ; SSE41-NEXT: movapd %xmm5, %xmm4
2176 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4
2177 ; SSE41-NEXT: movapd %xmm3, %xmm1
2178 ; SSE41-NEXT: xorpd %xmm2, %xmm1
2179 ; SSE41-NEXT: movapd %xmm1, %xmm7
2180 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm7
2181 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm1
2182 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
2183 ; SSE41-NEXT: pand %xmm7, %xmm0
2184 ; SSE41-NEXT: por %xmm1, %xmm0
2185 ; SSE41-NEXT: movapd %xmm5, %xmm1
2186 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm1
2187 ; SSE41-NEXT: packssdw %xmm4, %xmm1
2188 ; SSE41-NEXT: movapd %xmm11, %xmm3
2189 ; SSE41-NEXT: xorpd %xmm2, %xmm3
2190 ; SSE41-NEXT: movapd %xmm3, %xmm4
2191 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm4
2192 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm3
2193 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2194 ; SSE41-NEXT: pand %xmm4, %xmm0
2195 ; SSE41-NEXT: por %xmm3, %xmm0
2196 ; SSE41-NEXT: movapd %xmm5, %xmm3
2197 ; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm3
2198 ; SSE41-NEXT: xorpd %xmm8, %xmm2
2199 ; SSE41-NEXT: movapd %xmm2, %xmm4
2200 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm4
2201 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm2
2202 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
2203 ; SSE41-NEXT: pand %xmm4, %xmm0
2204 ; SSE41-NEXT: por %xmm2, %xmm0
2205 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm5
2206 ; SSE41-NEXT: packssdw %xmm3, %xmm5
2207 ; SSE41-NEXT: packssdw %xmm5, %xmm1
2208 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2211 ; AVX1-LABEL: trunc_ssat_v8i64_v8i16:
2213 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
2214 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
2215 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2
2216 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3
2217 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [32767,32767]
2218 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm8
2219 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm6
2220 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm7
2221 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm5
2222 ; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
2223 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [18446744073709518848,18446744073709518848]
2224 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm0, %xmm9
2225 ; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm4, %xmm1
2226 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm1, %xmm7
2227 ; AVX1-NEXT: vblendvpd %xmm6, %xmm2, %xmm4, %xmm2
2228 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm2, %xmm6
2229 ; AVX1-NEXT: vblendvpd %xmm8, %xmm3, %xmm4, %xmm3
2230 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm3, %xmm4
2231 ; AVX1-NEXT: vblendvpd %xmm4, %xmm3, %xmm5, %xmm3
2232 ; AVX1-NEXT: vblendvpd %xmm6, %xmm2, %xmm5, %xmm2
2233 ; AVX1-NEXT: vpackssdw %xmm3, %xmm2, %xmm2
2234 ; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm5, %xmm1
2235 ; AVX1-NEXT: vblendvpd %xmm9, %xmm0, %xmm5, %xmm0
2236 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
2237 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0
2240 ; AVX2-LABEL: trunc_ssat_v8i64_v8i16:
2242 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
2243 ; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1
2244 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [32767,32767,32767,32767]
2245 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3
2246 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
2247 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3
2248 ; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
2249 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848]
2250 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3
2251 ; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
2252 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm3
2253 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
2254 ; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0
2255 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
2256 ; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
2257 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
2258 ; AVX2-NEXT: vzeroupper
2261 ; AVX512-LABEL: trunc_ssat_v8i64_v8i16:
2263 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
2264 ; AVX512-NEXT: vpmovsqw %zmm0, %xmm0
2265 ; AVX512-NEXT: vzeroupper
2268 ; SKX-LABEL: trunc_ssat_v8i64_v8i16:
2270 ; SKX-NEXT: vmovdqa (%rdi), %ymm0
2271 ; SKX-NEXT: vmovdqa 32(%rdi), %ymm1
2272 ; SKX-NEXT: vpmovsqw %ymm1, %xmm1
2273 ; SKX-NEXT: vpmovsqw %ymm0, %xmm0
2274 ; SKX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2275 ; SKX-NEXT: vzeroupper
2277 %a0 = load <8 x i64>, <8 x i64>* %p0
2278 %1 = icmp slt <8 x i64> %a0, <i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767>
2279 %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>
2280 %3 = icmp sgt <8 x i64> %2, <i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768>
2281 %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>
2282 %5 = trunc <8 x i64> %4 to <8 x i16>
2286 define <4 x i16> @trunc_ssat_v4i32_v4i16(<4 x i32> %a0) {
2287 ; SSE-LABEL: trunc_ssat_v4i32_v4i16:
2289 ; SSE-NEXT: packssdw %xmm0, %xmm0
2292 ; AVX-LABEL: trunc_ssat_v4i32_v4i16:
2294 ; AVX-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
2297 ; AVX512-LABEL: trunc_ssat_v4i32_v4i16:
2299 ; AVX512-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
2302 ; SKX-LABEL: trunc_ssat_v4i32_v4i16:
2304 ; SKX-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
2306 %1 = icmp slt <4 x i32> %a0, <i32 32767, i32 32767, i32 32767, i32 32767>
2307 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767>
2308 %3 = icmp sgt <4 x i32> %2, <i32 -32768, i32 -32768, i32 -32768, i32 -32768>
2309 %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768>
2310 %5 = trunc <4 x i32> %4 to <4 x i16>
2314 define void @trunc_ssat_v4i32_v4i16_store(<4 x i32> %a0, <4 x i16> *%p1) {
2315 ; SSE-LABEL: trunc_ssat_v4i32_v4i16_store:
2317 ; SSE-NEXT: packssdw %xmm0, %xmm0
2318 ; SSE-NEXT: movq %xmm0, (%rdi)
2321 ; AVX-LABEL: trunc_ssat_v4i32_v4i16_store:
2323 ; AVX-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
2324 ; AVX-NEXT: vmovq %xmm0, (%rdi)
2327 ; AVX512F-LABEL: trunc_ssat_v4i32_v4i16_store:
2329 ; AVX512F-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
2330 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
2331 ; AVX512F-NEXT: retq
2333 ; AVX512VL-LABEL: trunc_ssat_v4i32_v4i16_store:
2334 ; AVX512VL: # %bb.0:
2335 ; AVX512VL-NEXT: vpmovsdw %xmm0, (%rdi)
2336 ; AVX512VL-NEXT: retq
2338 ; AVX512BW-LABEL: trunc_ssat_v4i32_v4i16_store:
2339 ; AVX512BW: # %bb.0:
2340 ; AVX512BW-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
2341 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
2342 ; AVX512BW-NEXT: retq
2344 ; AVX512BWVL-LABEL: trunc_ssat_v4i32_v4i16_store:
2345 ; AVX512BWVL: # %bb.0:
2346 ; AVX512BWVL-NEXT: vpmovsdw %xmm0, (%rdi)
2347 ; AVX512BWVL-NEXT: retq
2349 ; SKX-LABEL: trunc_ssat_v4i32_v4i16_store:
2351 ; SKX-NEXT: vpmovsdw %xmm0, (%rdi)
2353 %1 = icmp slt <4 x i32> %a0, <i32 32767, i32 32767, i32 32767, i32 32767>
2354 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767>
2355 %3 = icmp sgt <4 x i32> %2, <i32 -32768, i32 -32768, i32 -32768, i32 -32768>
2356 %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768>
2357 %5 = trunc <4 x i32> %4 to <4 x i16>
2358 store <4 x i16> %5, <4 x i16> *%p1
2362 define <8 x i16> @trunc_ssat_v8i32_v8i16(<8 x i32> %a0) {
2363 ; SSE-LABEL: trunc_ssat_v8i32_v8i16:
2365 ; SSE-NEXT: packssdw %xmm1, %xmm0
2368 ; AVX1-LABEL: trunc_ssat_v8i32_v8i16:
2370 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
2371 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
2372 ; AVX1-NEXT: vzeroupper
2375 ; AVX2-LABEL: trunc_ssat_v8i32_v8i16:
2377 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
2378 ; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
2379 ; AVX2-NEXT: vzeroupper
2382 ; AVX512F-LABEL: trunc_ssat_v8i32_v8i16:
2384 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1
2385 ; AVX512F-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
2386 ; AVX512F-NEXT: vzeroupper
2387 ; AVX512F-NEXT: retq
2389 ; AVX512VL-LABEL: trunc_ssat_v8i32_v8i16:
2390 ; AVX512VL: # %bb.0:
2391 ; AVX512VL-NEXT: vpmovsdw %ymm0, %xmm0
2392 ; AVX512VL-NEXT: vzeroupper
2393 ; AVX512VL-NEXT: retq
2395 ; AVX512BW-LABEL: trunc_ssat_v8i32_v8i16:
2396 ; AVX512BW: # %bb.0:
2397 ; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1
2398 ; AVX512BW-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
2399 ; AVX512BW-NEXT: vzeroupper
2400 ; AVX512BW-NEXT: retq
2402 ; AVX512BWVL-LABEL: trunc_ssat_v8i32_v8i16:
2403 ; AVX512BWVL: # %bb.0:
2404 ; AVX512BWVL-NEXT: vpmovsdw %ymm0, %xmm0
2405 ; AVX512BWVL-NEXT: vzeroupper
2406 ; AVX512BWVL-NEXT: retq
2408 ; SKX-LABEL: trunc_ssat_v8i32_v8i16:
2410 ; SKX-NEXT: vpmovsdw %ymm0, %xmm0
2411 ; SKX-NEXT: vzeroupper
2413 %1 = icmp slt <8 x i32> %a0, <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>
2414 %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>
2415 %3 = icmp sgt <8 x i32> %2, <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>
2416 %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>
2417 %5 = trunc <8 x i32> %4 to <8 x i16>
2421 define <16 x i16> @trunc_ssat_v16i32_v16i16(<16 x i32>* %p0) "min-legal-vector-width"="256" {
2422 ; SSE-LABEL: trunc_ssat_v16i32_v16i16:
2424 ; SSE-NEXT: movdqa (%rdi), %xmm0
2425 ; SSE-NEXT: movdqa 32(%rdi), %xmm1
2426 ; SSE-NEXT: packssdw 16(%rdi), %xmm0
2427 ; SSE-NEXT: packssdw 48(%rdi), %xmm1
2430 ; AVX1-LABEL: trunc_ssat_v16i32_v16i16:
2432 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
2433 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm1
2434 ; AVX1-NEXT: vpackssdw 48(%rdi), %xmm1, %xmm1
2435 ; AVX1-NEXT: vpackssdw 16(%rdi), %xmm0, %xmm0
2436 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
2439 ; AVX2-LABEL: trunc_ssat_v16i32_v16i16:
2441 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
2442 ; AVX2-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm0
2443 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2446 ; AVX512-LABEL: trunc_ssat_v16i32_v16i16:
2448 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
2449 ; AVX512-NEXT: vpmovsdw %zmm0, %ymm0
2452 ; SKX-LABEL: trunc_ssat_v16i32_v16i16:
2454 ; SKX-NEXT: vmovdqa (%rdi), %ymm0
2455 ; SKX-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm0
2456 ; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2458 %a0 = load <16 x i32>, <16 x i32>* %p0
2459 %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>
2460 %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>
2461 %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>
2462 %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>
2463 %5 = trunc <16 x i32> %4 to <16 x i16>
2468 ; Signed saturation truncation to vXi8
2471 define <2 x i8> @trunc_ssat_v2i64_v2i8(<2 x i64> %a0) {
2472 ; SSE2-LABEL: trunc_ssat_v2i64_v2i8:
2474 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
2475 ; SSE2-NEXT: movdqa %xmm0, %xmm2
2476 ; SSE2-NEXT: pxor %xmm1, %xmm2
2477 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483775,2147483775]
2478 ; SSE2-NEXT: movdqa %xmm3, %xmm4
2479 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
2480 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2481 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
2482 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2483 ; SSE2-NEXT: pand %xmm5, %xmm2
2484 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
2485 ; SSE2-NEXT: por %xmm2, %xmm3
2486 ; SSE2-NEXT: pand %xmm3, %xmm0
2487 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2488 ; SSE2-NEXT: por %xmm0, %xmm3
2489 ; SSE2-NEXT: pxor %xmm3, %xmm1
2490 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562067840,18446744071562067840]
2491 ; SSE2-NEXT: movdqa %xmm1, %xmm2
2492 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
2493 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2494 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
2495 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2496 ; SSE2-NEXT: pand %xmm4, %xmm1
2497 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
2498 ; SSE2-NEXT: por %xmm1, %xmm0
2499 ; SSE2-NEXT: pand %xmm0, %xmm3
2500 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2501 ; SSE2-NEXT: por %xmm3, %xmm0
2502 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2503 ; SSE2-NEXT: packuswb %xmm0, %xmm0
2504 ; SSE2-NEXT: packuswb %xmm0, %xmm0
2505 ; SSE2-NEXT: packuswb %xmm0, %xmm0
2508 ; SSSE3-LABEL: trunc_ssat_v2i64_v2i8:
2510 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
2511 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
2512 ; SSSE3-NEXT: pxor %xmm1, %xmm2
2513 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483775,2147483775]
2514 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
2515 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
2516 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2517 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm2
2518 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2519 ; SSSE3-NEXT: pand %xmm5, %xmm2
2520 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
2521 ; SSSE3-NEXT: por %xmm2, %xmm3
2522 ; SSSE3-NEXT: pand %xmm3, %xmm0
2523 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2524 ; SSSE3-NEXT: por %xmm0, %xmm3
2525 ; SSSE3-NEXT: pxor %xmm3, %xmm1
2526 ; SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562067840,18446744071562067840]
2527 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
2528 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
2529 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2530 ; SSSE3-NEXT: pcmpeqd %xmm0, %xmm1
2531 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2532 ; SSSE3-NEXT: pand %xmm4, %xmm1
2533 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
2534 ; SSSE3-NEXT: por %xmm1, %xmm0
2535 ; SSSE3-NEXT: pand %xmm0, %xmm3
2536 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2537 ; SSSE3-NEXT: por %xmm3, %xmm0
2538 ; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2541 ; SSE41-LABEL: trunc_ssat_v2i64_v2i8:
2543 ; SSE41-NEXT: movdqa %xmm0, %xmm1
2544 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [127,127]
2545 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
2546 ; SSE41-NEXT: pxor %xmm3, %xmm0
2547 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147483775,2147483775]
2548 ; SSE41-NEXT: movdqa %xmm4, %xmm5
2549 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
2550 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
2551 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
2552 ; SSE41-NEXT: pand %xmm5, %xmm0
2553 ; SSE41-NEXT: por %xmm4, %xmm0
2554 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
2555 ; SSE41-NEXT: movapd {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
2556 ; SSE41-NEXT: pxor %xmm2, %xmm3
2557 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562067840,18446744071562067840]
2558 ; SSE41-NEXT: movdqa %xmm3, %xmm4
2559 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
2560 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
2561 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2562 ; SSE41-NEXT: pand %xmm4, %xmm0
2563 ; SSE41-NEXT: por %xmm3, %xmm0
2564 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
2565 ; SSE41-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2566 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2569 ; AVX-LABEL: trunc_ssat_v2i64_v2i8:
2571 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [127,127]
2572 ; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
2573 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2574 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
2575 ; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
2576 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2577 ; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2580 ; AVX512F-LABEL: trunc_ssat_v2i64_v2i8:
2582 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
2583 ; AVX512F-NEXT: vpmovsqb %zmm0, %xmm0
2584 ; AVX512F-NEXT: vzeroupper
2585 ; AVX512F-NEXT: retq
2587 ; AVX512VL-LABEL: trunc_ssat_v2i64_v2i8:
2588 ; AVX512VL: # %bb.0:
2589 ; AVX512VL-NEXT: vpmovsqb %xmm0, %xmm0
2590 ; AVX512VL-NEXT: retq
2592 ; AVX512BW-LABEL: trunc_ssat_v2i64_v2i8:
2593 ; AVX512BW: # %bb.0:
2594 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
2595 ; AVX512BW-NEXT: vpmovsqb %zmm0, %xmm0
2596 ; AVX512BW-NEXT: vzeroupper
2597 ; AVX512BW-NEXT: retq
2599 ; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i8:
2600 ; AVX512BWVL: # %bb.0:
2601 ; AVX512BWVL-NEXT: vpmovsqb %xmm0, %xmm0
2602 ; AVX512BWVL-NEXT: retq
2604 ; SKX-LABEL: trunc_ssat_v2i64_v2i8:
2606 ; SKX-NEXT: vpmovsqb %xmm0, %xmm0
2608 %1 = icmp slt <2 x i64> %a0, <i64 127, i64 127>
2609 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 127, i64 127>
2610 %3 = icmp sgt <2 x i64> %2, <i64 -128, i64 -128>
2611 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -128, i64 -128>
2612 %5 = trunc <2 x i64> %4 to <2 x i8>
2616 define void @trunc_ssat_v2i64_v2i8_store(<2 x i64> %a0, <2 x i8> *%p1) {
2617 ; SSE2-LABEL: trunc_ssat_v2i64_v2i8_store:
2619 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
2620 ; SSE2-NEXT: movdqa %xmm0, %xmm2
2621 ; SSE2-NEXT: pxor %xmm1, %xmm2
2622 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483775,2147483775]
2623 ; SSE2-NEXT: movdqa %xmm3, %xmm4
2624 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
2625 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2626 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
2627 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2628 ; SSE2-NEXT: pand %xmm5, %xmm2
2629 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
2630 ; SSE2-NEXT: por %xmm2, %xmm3
2631 ; SSE2-NEXT: pand %xmm3, %xmm0
2632 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2633 ; SSE2-NEXT: por %xmm0, %xmm3
2634 ; SSE2-NEXT: pxor %xmm3, %xmm1
2635 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562067840,18446744071562067840]
2636 ; SSE2-NEXT: movdqa %xmm1, %xmm2
2637 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
2638 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2639 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
2640 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
2641 ; SSE2-NEXT: pand %xmm4, %xmm0
2642 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
2643 ; SSE2-NEXT: por %xmm0, %xmm1
2644 ; SSE2-NEXT: pand %xmm1, %xmm3
2645 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2646 ; SSE2-NEXT: por %xmm3, %xmm1
2647 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2648 ; SSE2-NEXT: packuswb %xmm1, %xmm1
2649 ; SSE2-NEXT: packuswb %xmm1, %xmm1
2650 ; SSE2-NEXT: packuswb %xmm1, %xmm1
2651 ; SSE2-NEXT: movd %xmm1, %eax
2652 ; SSE2-NEXT: movw %ax, (%rdi)
2655 ; SSSE3-LABEL: trunc_ssat_v2i64_v2i8_store:
2657 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
2658 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
2659 ; SSSE3-NEXT: pxor %xmm1, %xmm2
2660 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483775,2147483775]
2661 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
2662 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
2663 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2664 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm2
2665 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2666 ; SSSE3-NEXT: pand %xmm5, %xmm2
2667 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
2668 ; SSSE3-NEXT: por %xmm2, %xmm3
2669 ; SSSE3-NEXT: pand %xmm3, %xmm0
2670 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2671 ; SSSE3-NEXT: por %xmm0, %xmm3
2672 ; SSSE3-NEXT: pxor %xmm3, %xmm1
2673 ; SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562067840,18446744071562067840]
2674 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
2675 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
2676 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2677 ; SSSE3-NEXT: pcmpeqd %xmm0, %xmm1
2678 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
2679 ; SSSE3-NEXT: pand %xmm4, %xmm0
2680 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
2681 ; SSSE3-NEXT: por %xmm0, %xmm1
2682 ; SSSE3-NEXT: pand %xmm1, %xmm3
2683 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2684 ; SSSE3-NEXT: por %xmm3, %xmm1
2685 ; SSSE3-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2686 ; SSSE3-NEXT: movd %xmm1, %eax
2687 ; SSSE3-NEXT: movw %ax, (%rdi)
2690 ; SSE41-LABEL: trunc_ssat_v2i64_v2i8_store:
2692 ; SSE41-NEXT: movdqa %xmm0, %xmm1
2693 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [127,127]
2694 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
2695 ; SSE41-NEXT: pxor %xmm3, %xmm0
2696 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147483775,2147483775]
2697 ; SSE41-NEXT: movdqa %xmm4, %xmm5
2698 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
2699 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
2700 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
2701 ; SSE41-NEXT: pand %xmm5, %xmm0
2702 ; SSE41-NEXT: por %xmm4, %xmm0
2703 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
2704 ; SSE41-NEXT: movapd {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
2705 ; SSE41-NEXT: pxor %xmm2, %xmm3
2706 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562067840,18446744071562067840]
2707 ; SSE41-NEXT: movdqa %xmm3, %xmm4
2708 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
2709 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
2710 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2711 ; SSE41-NEXT: pand %xmm4, %xmm0
2712 ; SSE41-NEXT: por %xmm3, %xmm0
2713 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
2714 ; SSE41-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2715 ; SSE41-NEXT: pextrw $0, %xmm1, (%rdi)
2718 ; AVX-LABEL: trunc_ssat_v2i64_v2i8_store:
2720 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [127,127]
2721 ; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
2722 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2723 ; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
2724 ; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
2725 ; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2726 ; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2727 ; AVX-NEXT: vpextrw $0, %xmm0, (%rdi)
2730 ; AVX512F-LABEL: trunc_ssat_v2i64_v2i8_store:
2732 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
2733 ; AVX512F-NEXT: vpmovsqb %zmm0, %xmm0
2734 ; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi)
2735 ; AVX512F-NEXT: vzeroupper
2736 ; AVX512F-NEXT: retq
2738 ; AVX512VL-LABEL: trunc_ssat_v2i64_v2i8_store:
2739 ; AVX512VL: # %bb.0:
2740 ; AVX512VL-NEXT: vpmovsqb %xmm0, (%rdi)
2741 ; AVX512VL-NEXT: retq
2743 ; AVX512BW-LABEL: trunc_ssat_v2i64_v2i8_store:
2744 ; AVX512BW: # %bb.0:
2745 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
2746 ; AVX512BW-NEXT: vpmovsqb %zmm0, %xmm0
2747 ; AVX512BW-NEXT: vpextrw $0, %xmm0, (%rdi)
2748 ; AVX512BW-NEXT: vzeroupper
2749 ; AVX512BW-NEXT: retq
2751 ; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i8_store:
2752 ; AVX512BWVL: # %bb.0:
2753 ; AVX512BWVL-NEXT: vpmovsqb %xmm0, (%rdi)
2754 ; AVX512BWVL-NEXT: retq
2756 ; SKX-LABEL: trunc_ssat_v2i64_v2i8_store:
2758 ; SKX-NEXT: vpmovsqb %xmm0, (%rdi)
2760 %1 = icmp slt <2 x i64> %a0, <i64 127, i64 127>
2761 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 127, i64 127>
2762 %3 = icmp sgt <2 x i64> %2, <i64 -128, i64 -128>
2763 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -128, i64 -128>
2764 %5 = trunc <2 x i64> %4 to <2 x i8>
2765 store <2 x i8> %5, <2 x i8> *%p1
2769 define <4 x i8> @trunc_ssat_v4i64_v4i8(<4 x i64> %a0) {
2770 ; SSE2-LABEL: trunc_ssat_v4i64_v4i8:
2772 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [127,127]
2773 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
2774 ; SSE2-NEXT: movdqa %xmm1, %xmm3
2775 ; SSE2-NEXT: pxor %xmm2, %xmm3
2776 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483775,2147483775]
2777 ; SSE2-NEXT: movdqa %xmm5, %xmm6
2778 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm6
2779 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2780 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm3
2781 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
2782 ; SSE2-NEXT: pand %xmm7, %xmm4
2783 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
2784 ; SSE2-NEXT: por %xmm4, %xmm3
2785 ; SSE2-NEXT: pand %xmm3, %xmm1
2786 ; SSE2-NEXT: pandn %xmm8, %xmm3
2787 ; SSE2-NEXT: por %xmm1, %xmm3
2788 ; SSE2-NEXT: movdqa %xmm0, %xmm1
2789 ; SSE2-NEXT: pxor %xmm2, %xmm1
2790 ; SSE2-NEXT: movdqa %xmm5, %xmm4
2791 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4
2792 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2793 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm1
2794 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2795 ; SSE2-NEXT: pand %xmm6, %xmm1
2796 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2797 ; SSE2-NEXT: por %xmm1, %xmm4
2798 ; SSE2-NEXT: pand %xmm4, %xmm0
2799 ; SSE2-NEXT: pandn %xmm8, %xmm4
2800 ; SSE2-NEXT: por %xmm0, %xmm4
2801 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
2802 ; SSE2-NEXT: movdqa %xmm4, %xmm0
2803 ; SSE2-NEXT: pxor %xmm2, %xmm0
2804 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [18446744071562067840,18446744071562067840]
2805 ; SSE2-NEXT: movdqa %xmm0, %xmm6
2806 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm6
2807 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2808 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm0
2809 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
2810 ; SSE2-NEXT: pand %xmm7, %xmm1
2811 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
2812 ; SSE2-NEXT: por %xmm1, %xmm0
2813 ; SSE2-NEXT: pand %xmm0, %xmm4
2814 ; SSE2-NEXT: pandn %xmm8, %xmm0
2815 ; SSE2-NEXT: por %xmm4, %xmm0
2816 ; SSE2-NEXT: pxor %xmm3, %xmm2
2817 ; SSE2-NEXT: movdqa %xmm2, %xmm1
2818 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm1
2819 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
2820 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm2
2821 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2822 ; SSE2-NEXT: pand %xmm4, %xmm2
2823 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2824 ; SSE2-NEXT: por %xmm2, %xmm1
2825 ; SSE2-NEXT: pand %xmm1, %xmm3
2826 ; SSE2-NEXT: pandn %xmm8, %xmm1
2827 ; SSE2-NEXT: por %xmm3, %xmm1
2828 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,0,0,0,255,0,0,0]
2829 ; SSE2-NEXT: pand %xmm2, %xmm1
2830 ; SSE2-NEXT: pand %xmm2, %xmm0
2831 ; SSE2-NEXT: packuswb %xmm1, %xmm0
2832 ; SSE2-NEXT: packuswb %xmm0, %xmm0
2833 ; SSE2-NEXT: packuswb %xmm0, %xmm0
2836 ; SSSE3-LABEL: trunc_ssat_v4i64_v4i8:
2838 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [127,127]
2839 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
2840 ; SSSE3-NEXT: movdqa %xmm1, %xmm3
2841 ; SSSE3-NEXT: pxor %xmm2, %xmm3
2842 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483775,2147483775]
2843 ; SSSE3-NEXT: movdqa %xmm5, %xmm6
2844 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm6
2845 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2846 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm3
2847 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
2848 ; SSSE3-NEXT: pand %xmm7, %xmm4
2849 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
2850 ; SSSE3-NEXT: por %xmm4, %xmm3
2851 ; SSSE3-NEXT: pand %xmm3, %xmm1
2852 ; SSSE3-NEXT: pandn %xmm8, %xmm3
2853 ; SSSE3-NEXT: por %xmm1, %xmm3
2854 ; SSSE3-NEXT: movdqa %xmm0, %xmm1
2855 ; SSSE3-NEXT: pxor %xmm2, %xmm1
2856 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
2857 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4
2858 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2859 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm1
2860 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2861 ; SSSE3-NEXT: pand %xmm6, %xmm1
2862 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2863 ; SSSE3-NEXT: por %xmm1, %xmm4
2864 ; SSSE3-NEXT: pand %xmm4, %xmm0
2865 ; SSSE3-NEXT: pandn %xmm8, %xmm4
2866 ; SSSE3-NEXT: por %xmm0, %xmm4
2867 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
2868 ; SSSE3-NEXT: movdqa %xmm4, %xmm0
2869 ; SSSE3-NEXT: pxor %xmm2, %xmm0
2870 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [18446744071562067840,18446744071562067840]
2871 ; SSSE3-NEXT: movdqa %xmm0, %xmm6
2872 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm6
2873 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2874 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm0
2875 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
2876 ; SSSE3-NEXT: pand %xmm7, %xmm1
2877 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
2878 ; SSSE3-NEXT: por %xmm1, %xmm0
2879 ; SSSE3-NEXT: pand %xmm0, %xmm4
2880 ; SSSE3-NEXT: pandn %xmm8, %xmm0
2881 ; SSSE3-NEXT: por %xmm4, %xmm0
2882 ; SSSE3-NEXT: pxor %xmm3, %xmm2
2883 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
2884 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm1
2885 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
2886 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm2
2887 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2888 ; SSSE3-NEXT: pand %xmm4, %xmm2
2889 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2890 ; SSSE3-NEXT: por %xmm2, %xmm1
2891 ; SSSE3-NEXT: pand %xmm1, %xmm3
2892 ; SSSE3-NEXT: pandn %xmm8, %xmm1
2893 ; SSSE3-NEXT: por %xmm3, %xmm1
2894 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2895 ; SSSE3-NEXT: pshufb %xmm2, %xmm1
2896 ; SSSE3-NEXT: pshufb %xmm2, %xmm0
2897 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2900 ; SSE41-LABEL: trunc_ssat_v4i64_v4i8:
2902 ; SSE41-NEXT: movdqa %xmm0, %xmm2
2903 ; SSE41-NEXT: movapd {{.*#+}} xmm4 = [127,127]
2904 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
2905 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2906 ; SSE41-NEXT: pxor %xmm3, %xmm0
2907 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [2147483775,2147483775]
2908 ; SSE41-NEXT: movdqa %xmm6, %xmm5
2909 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
2910 ; SSE41-NEXT: movdqa %xmm6, %xmm7
2911 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
2912 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
2913 ; SSE41-NEXT: pand %xmm5, %xmm0
2914 ; SSE41-NEXT: por %xmm7, %xmm0
2915 ; SSE41-NEXT: movapd %xmm4, %xmm5
2916 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm5
2917 ; SSE41-NEXT: movdqa %xmm2, %xmm0
2918 ; SSE41-NEXT: pxor %xmm3, %xmm0
2919 ; SSE41-NEXT: movdqa %xmm6, %xmm1
2920 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
2921 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
2922 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2923 ; SSE41-NEXT: pand %xmm1, %xmm0
2924 ; SSE41-NEXT: por %xmm6, %xmm0
2925 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4
2926 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [18446744073709551488,18446744073709551488]
2927 ; SSE41-NEXT: movapd %xmm4, %xmm1
2928 ; SSE41-NEXT: xorpd %xmm3, %xmm1
2929 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [18446744071562067840,18446744071562067840]
2930 ; SSE41-NEXT: movapd %xmm1, %xmm7
2931 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm7
2932 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm1
2933 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
2934 ; SSE41-NEXT: pand %xmm7, %xmm0
2935 ; SSE41-NEXT: por %xmm1, %xmm0
2936 ; SSE41-NEXT: movapd %xmm2, %xmm1
2937 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm1
2938 ; SSE41-NEXT: xorpd %xmm5, %xmm3
2939 ; SSE41-NEXT: movapd %xmm3, %xmm4
2940 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm4
2941 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm3
2942 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2943 ; SSE41-NEXT: pand %xmm4, %xmm0
2944 ; SSE41-NEXT: por %xmm3, %xmm0
2945 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm2
2946 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2947 ; SSE41-NEXT: pshufb %xmm0, %xmm2
2948 ; SSE41-NEXT: pshufb %xmm0, %xmm1
2949 ; SSE41-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
2950 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2953 ; AVX1-LABEL: trunc_ssat_v4i64_v4i8:
2955 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
2956 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [127,127]
2957 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm3
2958 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm4
2959 ; AVX1-NEXT: vblendvpd %xmm4, %xmm0, %xmm2, %xmm0
2960 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [18446744073709551488,18446744073709551488]
2961 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm5
2962 ; AVX1-NEXT: vblendvpd %xmm3, %xmm1, %xmm2, %xmm1
2963 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm2
2964 ; AVX1-NEXT: vblendvpd %xmm2, %xmm1, %xmm4, %xmm1
2965 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2966 ; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
2967 ; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
2968 ; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0
2969 ; AVX1-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2970 ; AVX1-NEXT: vzeroupper
2973 ; AVX2-LABEL: trunc_ssat_v4i64_v4i8:
2975 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [127,127,127,127]
2976 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
2977 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
2978 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
2979 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2
2980 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
2981 ; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
2982 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2983 ; AVX2-NEXT: vpshufb %xmm2, %xmm1, %xmm1
2984 ; AVX2-NEXT: vpshufb %xmm2, %xmm0, %xmm0
2985 ; AVX2-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2986 ; AVX2-NEXT: vzeroupper
2989 ; AVX512F-LABEL: trunc_ssat_v4i64_v4i8:
2991 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
2992 ; AVX512F-NEXT: vpmovsqb %zmm0, %xmm0
2993 ; AVX512F-NEXT: vzeroupper
2994 ; AVX512F-NEXT: retq
2996 ; AVX512VL-LABEL: trunc_ssat_v4i64_v4i8:
2997 ; AVX512VL: # %bb.0:
2998 ; AVX512VL-NEXT: vpmovsqb %ymm0, %xmm0
2999 ; AVX512VL-NEXT: vzeroupper
3000 ; AVX512VL-NEXT: retq
3002 ; AVX512BW-LABEL: trunc_ssat_v4i64_v4i8:
3003 ; AVX512BW: # %bb.0:
3004 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
3005 ; AVX512BW-NEXT: vpmovsqb %zmm0, %xmm0
3006 ; AVX512BW-NEXT: vzeroupper
3007 ; AVX512BW-NEXT: retq
3009 ; AVX512BWVL-LABEL: trunc_ssat_v4i64_v4i8:
3010 ; AVX512BWVL: # %bb.0:
3011 ; AVX512BWVL-NEXT: vpmovsqb %ymm0, %xmm0
3012 ; AVX512BWVL-NEXT: vzeroupper
3013 ; AVX512BWVL-NEXT: retq
3015 ; SKX-LABEL: trunc_ssat_v4i64_v4i8:
3017 ; SKX-NEXT: vpmovsqb %ymm0, %xmm0
3018 ; SKX-NEXT: vzeroupper
3020 %1 = icmp slt <4 x i64> %a0, <i64 127, i64 127, i64 127, i64 127>
3021 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 127, i64 127, i64 127, i64 127>
3022 %3 = icmp sgt <4 x i64> %2, <i64 -128, i64 -128, i64 -128, i64 -128>
3023 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> <i64 -128, i64 -128, i64 -128, i64 -128>
3024 %5 = trunc <4 x i64> %4 to <4 x i8>
3028 define void @trunc_ssat_v4i64_v4i8_store(<4 x i64> %a0, <4 x i8> *%p1) {
3029 ; SSE2-LABEL: trunc_ssat_v4i64_v4i8_store:
3031 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [127,127]
3032 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
3033 ; SSE2-NEXT: movdqa %xmm1, %xmm3
3034 ; SSE2-NEXT: pxor %xmm2, %xmm3
3035 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483775,2147483775]
3036 ; SSE2-NEXT: movdqa %xmm5, %xmm6
3037 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm6
3038 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
3039 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm3
3040 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
3041 ; SSE2-NEXT: pand %xmm7, %xmm4
3042 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
3043 ; SSE2-NEXT: por %xmm4, %xmm3
3044 ; SSE2-NEXT: pand %xmm3, %xmm1
3045 ; SSE2-NEXT: pandn %xmm8, %xmm3
3046 ; SSE2-NEXT: por %xmm1, %xmm3
3047 ; SSE2-NEXT: movdqa %xmm0, %xmm1
3048 ; SSE2-NEXT: pxor %xmm2, %xmm1
3049 ; SSE2-NEXT: movdqa %xmm5, %xmm4
3050 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm4
3051 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
3052 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm1
3053 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3054 ; SSE2-NEXT: pand %xmm6, %xmm1
3055 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3056 ; SSE2-NEXT: por %xmm1, %xmm4
3057 ; SSE2-NEXT: pand %xmm4, %xmm0
3058 ; SSE2-NEXT: pandn %xmm8, %xmm4
3059 ; SSE2-NEXT: por %xmm0, %xmm4
3060 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
3061 ; SSE2-NEXT: movdqa %xmm4, %xmm0
3062 ; SSE2-NEXT: pxor %xmm2, %xmm0
3063 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [18446744071562067840,18446744071562067840]
3064 ; SSE2-NEXT: movdqa %xmm0, %xmm6
3065 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm6
3066 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
3067 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm0
3068 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
3069 ; SSE2-NEXT: pand %xmm7, %xmm1
3070 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
3071 ; SSE2-NEXT: por %xmm1, %xmm0
3072 ; SSE2-NEXT: pand %xmm0, %xmm4
3073 ; SSE2-NEXT: pandn %xmm8, %xmm0
3074 ; SSE2-NEXT: por %xmm4, %xmm0
3075 ; SSE2-NEXT: pxor %xmm3, %xmm2
3076 ; SSE2-NEXT: movdqa %xmm2, %xmm1
3077 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm1
3078 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
3079 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm2
3080 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3081 ; SSE2-NEXT: pand %xmm4, %xmm2
3082 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3083 ; SSE2-NEXT: por %xmm2, %xmm1
3084 ; SSE2-NEXT: pand %xmm1, %xmm3
3085 ; SSE2-NEXT: pandn %xmm8, %xmm1
3086 ; SSE2-NEXT: por %xmm3, %xmm1
3087 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,0,0,0,255,0,0,0]
3088 ; SSE2-NEXT: pand %xmm2, %xmm1
3089 ; SSE2-NEXT: pand %xmm2, %xmm0
3090 ; SSE2-NEXT: packuswb %xmm1, %xmm0
3091 ; SSE2-NEXT: packuswb %xmm0, %xmm0
3092 ; SSE2-NEXT: packuswb %xmm0, %xmm0
3093 ; SSE2-NEXT: movd %xmm0, (%rdi)
3096 ; SSSE3-LABEL: trunc_ssat_v4i64_v4i8_store:
3098 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [127,127]
3099 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
3100 ; SSSE3-NEXT: movdqa %xmm1, %xmm3
3101 ; SSSE3-NEXT: pxor %xmm2, %xmm3
3102 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483775,2147483775]
3103 ; SSSE3-NEXT: movdqa %xmm5, %xmm6
3104 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm6
3105 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
3106 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm3
3107 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
3108 ; SSSE3-NEXT: pand %xmm7, %xmm4
3109 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
3110 ; SSSE3-NEXT: por %xmm4, %xmm3
3111 ; SSSE3-NEXT: pand %xmm3, %xmm1
3112 ; SSSE3-NEXT: pandn %xmm8, %xmm3
3113 ; SSSE3-NEXT: por %xmm1, %xmm3
3114 ; SSSE3-NEXT: movdqa %xmm0, %xmm1
3115 ; SSSE3-NEXT: pxor %xmm2, %xmm1
3116 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
3117 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm4
3118 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
3119 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm1
3120 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3121 ; SSSE3-NEXT: pand %xmm6, %xmm1
3122 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3123 ; SSSE3-NEXT: por %xmm1, %xmm4
3124 ; SSSE3-NEXT: pand %xmm4, %xmm0
3125 ; SSSE3-NEXT: pandn %xmm8, %xmm4
3126 ; SSSE3-NEXT: por %xmm0, %xmm4
3127 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
3128 ; SSSE3-NEXT: movdqa %xmm4, %xmm1
3129 ; SSSE3-NEXT: pxor %xmm2, %xmm1
3130 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [18446744071562067840,18446744071562067840]
3131 ; SSSE3-NEXT: movdqa %xmm1, %xmm6
3132 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm6
3133 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
3134 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm1
3135 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
3136 ; SSSE3-NEXT: pand %xmm7, %xmm0
3137 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
3138 ; SSSE3-NEXT: por %xmm0, %xmm1
3139 ; SSSE3-NEXT: pand %xmm1, %xmm4
3140 ; SSSE3-NEXT: pandn %xmm8, %xmm1
3141 ; SSSE3-NEXT: por %xmm4, %xmm1
3142 ; SSSE3-NEXT: pxor %xmm3, %xmm2
3143 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
3144 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm0
3145 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
3146 ; SSSE3-NEXT: pcmpeqd %xmm5, %xmm2
3147 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3148 ; SSSE3-NEXT: pand %xmm4, %xmm2
3149 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3150 ; SSSE3-NEXT: por %xmm2, %xmm0
3151 ; SSSE3-NEXT: pand %xmm0, %xmm3
3152 ; SSSE3-NEXT: pandn %xmm8, %xmm0
3153 ; SSSE3-NEXT: por %xmm3, %xmm0
3154 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
3155 ; SSSE3-NEXT: pshufb %xmm2, %xmm0
3156 ; SSSE3-NEXT: pshufb %xmm2, %xmm1
3157 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
3158 ; SSSE3-NEXT: movd %xmm1, (%rdi)
3161 ; SSE41-LABEL: trunc_ssat_v4i64_v4i8_store:
3163 ; SSE41-NEXT: movdqa %xmm0, %xmm2
3164 ; SSE41-NEXT: movapd {{.*#+}} xmm4 = [127,127]
3165 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
3166 ; SSE41-NEXT: movdqa %xmm1, %xmm0
3167 ; SSE41-NEXT: pxor %xmm3, %xmm0
3168 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [2147483775,2147483775]
3169 ; SSE41-NEXT: movdqa %xmm6, %xmm5
3170 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
3171 ; SSE41-NEXT: movdqa %xmm6, %xmm7
3172 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
3173 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
3174 ; SSE41-NEXT: pand %xmm5, %xmm0
3175 ; SSE41-NEXT: por %xmm7, %xmm0
3176 ; SSE41-NEXT: movapd %xmm4, %xmm5
3177 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm5
3178 ; SSE41-NEXT: movdqa %xmm2, %xmm0
3179 ; SSE41-NEXT: pxor %xmm3, %xmm0
3180 ; SSE41-NEXT: movdqa %xmm6, %xmm1
3181 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
3182 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
3183 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3184 ; SSE41-NEXT: pand %xmm1, %xmm0
3185 ; SSE41-NEXT: por %xmm6, %xmm0
3186 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4
3187 ; SSE41-NEXT: movapd {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
3188 ; SSE41-NEXT: movapd %xmm4, %xmm2
3189 ; SSE41-NEXT: xorpd %xmm3, %xmm2
3190 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [18446744071562067840,18446744071562067840]
3191 ; SSE41-NEXT: movapd %xmm2, %xmm7
3192 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm7
3193 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm2
3194 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
3195 ; SSE41-NEXT: pand %xmm7, %xmm0
3196 ; SSE41-NEXT: por %xmm2, %xmm0
3197 ; SSE41-NEXT: movapd %xmm1, %xmm2
3198 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2
3199 ; SSE41-NEXT: xorpd %xmm5, %xmm3
3200 ; SSE41-NEXT: movapd %xmm3, %xmm4
3201 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm4
3202 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm3
3203 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
3204 ; SSE41-NEXT: pand %xmm4, %xmm0
3205 ; SSE41-NEXT: por %xmm3, %xmm0
3206 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1
3207 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
3208 ; SSE41-NEXT: pshufb %xmm0, %xmm1
3209 ; SSE41-NEXT: pshufb %xmm0, %xmm2
3210 ; SSE41-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
3211 ; SSE41-NEXT: movd %xmm2, (%rdi)
3214 ; AVX1-LABEL: trunc_ssat_v4i64_v4i8_store:
3216 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
3217 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [127,127]
3218 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm3
3219 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm4
3220 ; AVX1-NEXT: vblendvpd %xmm4, %xmm0, %xmm2, %xmm0
3221 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [18446744073709551488,18446744073709551488]
3222 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm5
3223 ; AVX1-NEXT: vblendvpd %xmm3, %xmm1, %xmm2, %xmm1
3224 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm2
3225 ; AVX1-NEXT: vblendvpd %xmm2, %xmm1, %xmm4, %xmm1
3226 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
3227 ; AVX1-NEXT: vpshufb %xmm2, %xmm1, %xmm1
3228 ; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
3229 ; AVX1-NEXT: vpshufb %xmm2, %xmm0, %xmm0
3230 ; AVX1-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3231 ; AVX1-NEXT: vmovd %xmm0, (%rdi)
3232 ; AVX1-NEXT: vzeroupper
3235 ; AVX2-LABEL: trunc_ssat_v4i64_v4i8_store:
3237 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [127,127,127,127]
3238 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
3239 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
3240 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
3241 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm2
3242 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
3243 ; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm1
3244 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
3245 ; AVX2-NEXT: vpshufb %xmm2, %xmm1, %xmm1
3246 ; AVX2-NEXT: vpshufb %xmm2, %xmm0, %xmm0
3247 ; AVX2-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
3248 ; AVX2-NEXT: vmovd %xmm0, (%rdi)
3249 ; AVX2-NEXT: vzeroupper
3252 ; AVX512F-LABEL: trunc_ssat_v4i64_v4i8_store:
3254 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
3255 ; AVX512F-NEXT: vpmovsqb %zmm0, %xmm0
3256 ; AVX512F-NEXT: vmovd %xmm0, (%rdi)
3257 ; AVX512F-NEXT: vzeroupper
3258 ; AVX512F-NEXT: retq
3260 ; AVX512VL-LABEL: trunc_ssat_v4i64_v4i8_store:
3261 ; AVX512VL: # %bb.0:
3262 ; AVX512VL-NEXT: vpmovsqb %ymm0, (%rdi)
3263 ; AVX512VL-NEXT: vzeroupper
3264 ; AVX512VL-NEXT: retq
3266 ; AVX512BW-LABEL: trunc_ssat_v4i64_v4i8_store:
3267 ; AVX512BW: # %bb.0:
3268 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
3269 ; AVX512BW-NEXT: vpmovsqb %zmm0, %xmm0
3270 ; AVX512BW-NEXT: vmovd %xmm0, (%rdi)
3271 ; AVX512BW-NEXT: vzeroupper
3272 ; AVX512BW-NEXT: retq
3274 ; AVX512BWVL-LABEL: trunc_ssat_v4i64_v4i8_store:
3275 ; AVX512BWVL: # %bb.0:
3276 ; AVX512BWVL-NEXT: vpmovsqb %ymm0, (%rdi)
3277 ; AVX512BWVL-NEXT: vzeroupper
3278 ; AVX512BWVL-NEXT: retq
3280 ; SKX-LABEL: trunc_ssat_v4i64_v4i8_store:
3282 ; SKX-NEXT: vpmovsqb %ymm0, (%rdi)
3283 ; SKX-NEXT: vzeroupper
3285 %1 = icmp slt <4 x i64> %a0, <i64 127, i64 127, i64 127, i64 127>
3286 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 127, i64 127, i64 127, i64 127>
3287 %3 = icmp sgt <4 x i64> %2, <i64 -128, i64 -128, i64 -128, i64 -128>
3288 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> <i64 -128, i64 -128, i64 -128, i64 -128>
3289 %5 = trunc <4 x i64> %4 to <4 x i8>
3290 store <4 x i8> %5, <4 x i8> *%p1
3294 define <8 x i8> @trunc_ssat_v8i64_v8i8(<8 x i64>* %p0) "min-legal-vector-width"="256" {
3295 ; SSE2-LABEL: trunc_ssat_v8i64_v8i8:
3297 ; SSE2-NEXT: movdqa (%rdi), %xmm6
3298 ; SSE2-NEXT: movdqa 16(%rdi), %xmm9
3299 ; SSE2-NEXT: movdqa 32(%rdi), %xmm3
3300 ; SSE2-NEXT: movdqa 48(%rdi), %xmm5
3301 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [127,127]
3302 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
3303 ; SSE2-NEXT: movdqa %xmm3, %xmm2
3304 ; SSE2-NEXT: pxor %xmm1, %xmm2
3305 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147483775,2147483775]
3306 ; SSE2-NEXT: movdqa %xmm10, %xmm7
3307 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm7
3308 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
3309 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm2
3310 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
3311 ; SSE2-NEXT: pand %xmm0, %xmm4
3312 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]
3313 ; SSE2-NEXT: por %xmm4, %xmm2
3314 ; SSE2-NEXT: pand %xmm2, %xmm3
3315 ; SSE2-NEXT: pandn %xmm8, %xmm2
3316 ; SSE2-NEXT: por %xmm3, %xmm2
3317 ; SSE2-NEXT: movdqa %xmm5, %xmm0
3318 ; SSE2-NEXT: pxor %xmm1, %xmm0
3319 ; SSE2-NEXT: movdqa %xmm10, %xmm3
3320 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm3
3321 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
3322 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm0
3323 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3324 ; SSE2-NEXT: pand %xmm4, %xmm0
3325 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3326 ; SSE2-NEXT: por %xmm0, %xmm3
3327 ; SSE2-NEXT: pand %xmm3, %xmm5
3328 ; SSE2-NEXT: pandn %xmm8, %xmm3
3329 ; SSE2-NEXT: por %xmm5, %xmm3
3330 ; SSE2-NEXT: movdqa %xmm6, %xmm0
3331 ; SSE2-NEXT: pxor %xmm1, %xmm0
3332 ; SSE2-NEXT: movdqa %xmm10, %xmm4
3333 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
3334 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
3335 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm0
3336 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3337 ; SSE2-NEXT: pand %xmm5, %xmm0
3338 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
3339 ; SSE2-NEXT: por %xmm0, %xmm5
3340 ; SSE2-NEXT: pand %xmm5, %xmm6
3341 ; SSE2-NEXT: pandn %xmm8, %xmm5
3342 ; SSE2-NEXT: por %xmm6, %xmm5
3343 ; SSE2-NEXT: movdqa %xmm9, %xmm0
3344 ; SSE2-NEXT: pxor %xmm1, %xmm0
3345 ; SSE2-NEXT: movdqa %xmm10, %xmm4
3346 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
3347 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
3348 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm0
3349 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3350 ; SSE2-NEXT: pand %xmm6, %xmm0
3351 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
3352 ; SSE2-NEXT: por %xmm0, %xmm7
3353 ; SSE2-NEXT: pand %xmm7, %xmm9
3354 ; SSE2-NEXT: pandn %xmm8, %xmm7
3355 ; SSE2-NEXT: por %xmm9, %xmm7
3356 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
3357 ; SSE2-NEXT: movdqa %xmm7, %xmm0
3358 ; SSE2-NEXT: pxor %xmm1, %xmm0
3359 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [18446744071562067840,18446744071562067840]
3360 ; SSE2-NEXT: movdqa %xmm0, %xmm4
3361 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm4
3362 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
3363 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm0
3364 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3365 ; SSE2-NEXT: pand %xmm6, %xmm0
3366 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3367 ; SSE2-NEXT: por %xmm0, %xmm4
3368 ; SSE2-NEXT: pand %xmm4, %xmm7
3369 ; SSE2-NEXT: pandn %xmm8, %xmm4
3370 ; SSE2-NEXT: por %xmm7, %xmm4
3371 ; SSE2-NEXT: movdqa %xmm5, %xmm0
3372 ; SSE2-NEXT: pxor %xmm1, %xmm0
3373 ; SSE2-NEXT: movdqa %xmm0, %xmm6
3374 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm6
3375 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
3376 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm0
3377 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
3378 ; SSE2-NEXT: pand %xmm10, %xmm7
3379 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
3380 ; SSE2-NEXT: por %xmm7, %xmm0
3381 ; SSE2-NEXT: pand %xmm0, %xmm5
3382 ; SSE2-NEXT: pandn %xmm8, %xmm0
3383 ; SSE2-NEXT: por %xmm5, %xmm0
3384 ; SSE2-NEXT: packssdw %xmm4, %xmm0
3385 ; SSE2-NEXT: movdqa %xmm3, %xmm4
3386 ; SSE2-NEXT: pxor %xmm1, %xmm4
3387 ; SSE2-NEXT: movdqa %xmm4, %xmm5
3388 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm5
3389 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
3390 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm4
3391 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3392 ; SSE2-NEXT: pand %xmm6, %xmm4
3393 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
3394 ; SSE2-NEXT: por %xmm4, %xmm5
3395 ; SSE2-NEXT: pand %xmm5, %xmm3
3396 ; SSE2-NEXT: pandn %xmm8, %xmm5
3397 ; SSE2-NEXT: por %xmm3, %xmm5
3398 ; SSE2-NEXT: pxor %xmm2, %xmm1
3399 ; SSE2-NEXT: movdqa %xmm1, %xmm3
3400 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm3
3401 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
3402 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm1
3403 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3404 ; SSE2-NEXT: pand %xmm4, %xmm1
3405 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3406 ; SSE2-NEXT: por %xmm1, %xmm3
3407 ; SSE2-NEXT: pand %xmm3, %xmm2
3408 ; SSE2-NEXT: pandn %xmm8, %xmm3
3409 ; SSE2-NEXT: por %xmm2, %xmm3
3410 ; SSE2-NEXT: packssdw %xmm5, %xmm3
3411 ; SSE2-NEXT: packssdw %xmm3, %xmm0
3412 ; SSE2-NEXT: packsswb %xmm0, %xmm0
3415 ; SSSE3-LABEL: trunc_ssat_v8i64_v8i8:
3417 ; SSSE3-NEXT: movdqa (%rdi), %xmm6
3418 ; SSSE3-NEXT: movdqa 16(%rdi), %xmm9
3419 ; SSSE3-NEXT: movdqa 32(%rdi), %xmm3
3420 ; SSSE3-NEXT: movdqa 48(%rdi), %xmm5
3421 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [127,127]
3422 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
3423 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
3424 ; SSSE3-NEXT: pxor %xmm1, %xmm2
3425 ; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [2147483775,2147483775]
3426 ; SSSE3-NEXT: movdqa %xmm10, %xmm7
3427 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm7
3428 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
3429 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm2
3430 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
3431 ; SSSE3-NEXT: pand %xmm0, %xmm4
3432 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]
3433 ; SSSE3-NEXT: por %xmm4, %xmm2
3434 ; SSSE3-NEXT: pand %xmm2, %xmm3
3435 ; SSSE3-NEXT: pandn %xmm8, %xmm2
3436 ; SSSE3-NEXT: por %xmm3, %xmm2
3437 ; SSSE3-NEXT: movdqa %xmm5, %xmm0
3438 ; SSSE3-NEXT: pxor %xmm1, %xmm0
3439 ; SSSE3-NEXT: movdqa %xmm10, %xmm3
3440 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm3
3441 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
3442 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm0
3443 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3444 ; SSSE3-NEXT: pand %xmm4, %xmm0
3445 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3446 ; SSSE3-NEXT: por %xmm0, %xmm3
3447 ; SSSE3-NEXT: pand %xmm3, %xmm5
3448 ; SSSE3-NEXT: pandn %xmm8, %xmm3
3449 ; SSSE3-NEXT: por %xmm5, %xmm3
3450 ; SSSE3-NEXT: movdqa %xmm6, %xmm0
3451 ; SSSE3-NEXT: pxor %xmm1, %xmm0
3452 ; SSSE3-NEXT: movdqa %xmm10, %xmm4
3453 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
3454 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
3455 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm0
3456 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3457 ; SSSE3-NEXT: pand %xmm5, %xmm0
3458 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
3459 ; SSSE3-NEXT: por %xmm0, %xmm5
3460 ; SSSE3-NEXT: pand %xmm5, %xmm6
3461 ; SSSE3-NEXT: pandn %xmm8, %xmm5
3462 ; SSSE3-NEXT: por %xmm6, %xmm5
3463 ; SSSE3-NEXT: movdqa %xmm9, %xmm0
3464 ; SSSE3-NEXT: pxor %xmm1, %xmm0
3465 ; SSSE3-NEXT: movdqa %xmm10, %xmm4
3466 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
3467 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
3468 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm0
3469 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3470 ; SSSE3-NEXT: pand %xmm6, %xmm0
3471 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
3472 ; SSSE3-NEXT: por %xmm0, %xmm7
3473 ; SSSE3-NEXT: pand %xmm7, %xmm9
3474 ; SSSE3-NEXT: pandn %xmm8, %xmm7
3475 ; SSSE3-NEXT: por %xmm9, %xmm7
3476 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
3477 ; SSSE3-NEXT: movdqa %xmm7, %xmm0
3478 ; SSSE3-NEXT: pxor %xmm1, %xmm0
3479 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [18446744071562067840,18446744071562067840]
3480 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
3481 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm4
3482 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
3483 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm0
3484 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3485 ; SSSE3-NEXT: pand %xmm6, %xmm0
3486 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3487 ; SSSE3-NEXT: por %xmm0, %xmm4
3488 ; SSSE3-NEXT: pand %xmm4, %xmm7
3489 ; SSSE3-NEXT: pandn %xmm8, %xmm4
3490 ; SSSE3-NEXT: por %xmm7, %xmm4
3491 ; SSSE3-NEXT: movdqa %xmm5, %xmm0
3492 ; SSSE3-NEXT: pxor %xmm1, %xmm0
3493 ; SSSE3-NEXT: movdqa %xmm0, %xmm6
3494 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm6
3495 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
3496 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm0
3497 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
3498 ; SSSE3-NEXT: pand %xmm10, %xmm7
3499 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
3500 ; SSSE3-NEXT: por %xmm7, %xmm0
3501 ; SSSE3-NEXT: pand %xmm0, %xmm5
3502 ; SSSE3-NEXT: pandn %xmm8, %xmm0
3503 ; SSSE3-NEXT: por %xmm5, %xmm0
3504 ; SSSE3-NEXT: packssdw %xmm4, %xmm0
3505 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
3506 ; SSSE3-NEXT: pxor %xmm1, %xmm4
3507 ; SSSE3-NEXT: movdqa %xmm4, %xmm5
3508 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm5
3509 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
3510 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm4
3511 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3512 ; SSSE3-NEXT: pand %xmm6, %xmm4
3513 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
3514 ; SSSE3-NEXT: por %xmm4, %xmm5
3515 ; SSSE3-NEXT: pand %xmm5, %xmm3
3516 ; SSSE3-NEXT: pandn %xmm8, %xmm5
3517 ; SSSE3-NEXT: por %xmm3, %xmm5
3518 ; SSSE3-NEXT: pxor %xmm2, %xmm1
3519 ; SSSE3-NEXT: movdqa %xmm1, %xmm3
3520 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm3
3521 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
3522 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm1
3523 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3524 ; SSSE3-NEXT: pand %xmm4, %xmm1
3525 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3526 ; SSSE3-NEXT: por %xmm1, %xmm3
3527 ; SSSE3-NEXT: pand %xmm3, %xmm2
3528 ; SSSE3-NEXT: pandn %xmm8, %xmm3
3529 ; SSSE3-NEXT: por %xmm2, %xmm3
3530 ; SSSE3-NEXT: packssdw %xmm5, %xmm3
3531 ; SSSE3-NEXT: packssdw %xmm3, %xmm0
3532 ; SSSE3-NEXT: packsswb %xmm0, %xmm0
3535 ; SSE41-LABEL: trunc_ssat_v8i64_v8i8:
3537 ; SSE41-NEXT: movdqa (%rdi), %xmm10
3538 ; SSE41-NEXT: movdqa 16(%rdi), %xmm9
3539 ; SSE41-NEXT: movdqa 32(%rdi), %xmm3
3540 ; SSE41-NEXT: movdqa 48(%rdi), %xmm5
3541 ; SSE41-NEXT: movapd {{.*#+}} xmm1 = [127,127]
3542 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
3543 ; SSE41-NEXT: movdqa %xmm3, %xmm0
3544 ; SSE41-NEXT: pxor %xmm2, %xmm0
3545 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147483775,2147483775]
3546 ; SSE41-NEXT: movdqa %xmm4, %xmm7
3547 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm7
3548 ; SSE41-NEXT: movdqa %xmm4, %xmm6
3549 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
3550 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3551 ; SSE41-NEXT: pand %xmm7, %xmm0
3552 ; SSE41-NEXT: por %xmm6, %xmm0
3553 ; SSE41-NEXT: movapd %xmm1, %xmm8
3554 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm8
3555 ; SSE41-NEXT: movdqa %xmm5, %xmm0
3556 ; SSE41-NEXT: pxor %xmm2, %xmm0
3557 ; SSE41-NEXT: movdqa %xmm4, %xmm3
3558 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
3559 ; SSE41-NEXT: movdqa %xmm4, %xmm6
3560 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
3561 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3562 ; SSE41-NEXT: pand %xmm3, %xmm0
3563 ; SSE41-NEXT: por %xmm6, %xmm0
3564 ; SSE41-NEXT: movapd %xmm1, %xmm11
3565 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm11
3566 ; SSE41-NEXT: movdqa %xmm10, %xmm0
3567 ; SSE41-NEXT: pxor %xmm2, %xmm0
3568 ; SSE41-NEXT: movdqa %xmm4, %xmm3
3569 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
3570 ; SSE41-NEXT: movdqa %xmm4, %xmm5
3571 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
3572 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
3573 ; SSE41-NEXT: pand %xmm3, %xmm0
3574 ; SSE41-NEXT: por %xmm5, %xmm0
3575 ; SSE41-NEXT: movapd %xmm1, %xmm3
3576 ; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm3
3577 ; SSE41-NEXT: movdqa %xmm9, %xmm0
3578 ; SSE41-NEXT: pxor %xmm2, %xmm0
3579 ; SSE41-NEXT: movdqa %xmm4, %xmm5
3580 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
3581 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
3582 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
3583 ; SSE41-NEXT: pand %xmm5, %xmm0
3584 ; SSE41-NEXT: por %xmm4, %xmm0
3585 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm1
3586 ; SSE41-NEXT: movapd {{.*#+}} xmm5 = [18446744073709551488,18446744073709551488]
3587 ; SSE41-NEXT: movapd %xmm1, %xmm4
3588 ; SSE41-NEXT: xorpd %xmm2, %xmm4
3589 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [18446744071562067840,18446744071562067840]
3590 ; SSE41-NEXT: movapd %xmm4, %xmm7
3591 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm7
3592 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm4
3593 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
3594 ; SSE41-NEXT: pand %xmm7, %xmm0
3595 ; SSE41-NEXT: por %xmm4, %xmm0
3596 ; SSE41-NEXT: movapd %xmm5, %xmm4
3597 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4
3598 ; SSE41-NEXT: movapd %xmm3, %xmm1
3599 ; SSE41-NEXT: xorpd %xmm2, %xmm1
3600 ; SSE41-NEXT: movapd %xmm1, %xmm7
3601 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm7
3602 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm1
3603 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
3604 ; SSE41-NEXT: pand %xmm7, %xmm0
3605 ; SSE41-NEXT: por %xmm1, %xmm0
3606 ; SSE41-NEXT: movapd %xmm5, %xmm1
3607 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm1
3608 ; SSE41-NEXT: packssdw %xmm4, %xmm1
3609 ; SSE41-NEXT: movapd %xmm11, %xmm3
3610 ; SSE41-NEXT: xorpd %xmm2, %xmm3
3611 ; SSE41-NEXT: movapd %xmm3, %xmm4
3612 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm4
3613 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm3
3614 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
3615 ; SSE41-NEXT: pand %xmm4, %xmm0
3616 ; SSE41-NEXT: por %xmm3, %xmm0
3617 ; SSE41-NEXT: movapd %xmm5, %xmm3
3618 ; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm3
3619 ; SSE41-NEXT: xorpd %xmm8, %xmm2
3620 ; SSE41-NEXT: movapd %xmm2, %xmm4
3621 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm4
3622 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm2
3623 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
3624 ; SSE41-NEXT: pand %xmm4, %xmm0
3625 ; SSE41-NEXT: por %xmm2, %xmm0
3626 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm5
3627 ; SSE41-NEXT: packssdw %xmm3, %xmm5
3628 ; SSE41-NEXT: packssdw %xmm5, %xmm1
3629 ; SSE41-NEXT: packsswb %xmm1, %xmm1
3630 ; SSE41-NEXT: movdqa %xmm1, %xmm0
3633 ; AVX1-LABEL: trunc_ssat_v8i64_v8i8:
3635 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
3636 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
3637 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2
3638 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3
3639 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [127,127]
3640 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm8
3641 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm6
3642 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm7
3643 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm5
3644 ; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
3645 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [18446744073709551488,18446744073709551488]
3646 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm0, %xmm9
3647 ; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm4, %xmm1
3648 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm1, %xmm7
3649 ; AVX1-NEXT: vblendvpd %xmm6, %xmm2, %xmm4, %xmm2
3650 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm2, %xmm6
3651 ; AVX1-NEXT: vblendvpd %xmm8, %xmm3, %xmm4, %xmm3
3652 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm3, %xmm4
3653 ; AVX1-NEXT: vblendvpd %xmm4, %xmm3, %xmm5, %xmm3
3654 ; AVX1-NEXT: vblendvpd %xmm6, %xmm2, %xmm5, %xmm2
3655 ; AVX1-NEXT: vpackssdw %xmm3, %xmm2, %xmm2
3656 ; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm5, %xmm1
3657 ; AVX1-NEXT: vblendvpd %xmm9, %xmm0, %xmm5, %xmm0
3658 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
3659 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0
3660 ; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
3663 ; AVX2-LABEL: trunc_ssat_v8i64_v8i8:
3665 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
3666 ; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1
3667 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [127,127,127,127]
3668 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3
3669 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
3670 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3
3671 ; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
3672 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
3673 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3
3674 ; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
3675 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm3
3676 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
3677 ; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0
3678 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
3679 ; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
3680 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
3681 ; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
3682 ; AVX2-NEXT: vzeroupper
3685 ; AVX512-LABEL: trunc_ssat_v8i64_v8i8:
3687 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
3688 ; AVX512-NEXT: vpmovsqb %zmm0, %xmm0
3689 ; AVX512-NEXT: vzeroupper
3692 ; SKX-LABEL: trunc_ssat_v8i64_v8i8:
3694 ; SKX-NEXT: vmovdqa (%rdi), %ymm0
3695 ; SKX-NEXT: vmovdqa 32(%rdi), %ymm1
3696 ; SKX-NEXT: vpmovsqb %ymm1, %xmm1
3697 ; SKX-NEXT: vpmovsqb %ymm0, %xmm0
3698 ; SKX-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3699 ; SKX-NEXT: vzeroupper
3701 %a0 = load <8 x i64>, <8 x i64>* %p0
3702 %1 = icmp slt <8 x i64> %a0, <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>
3703 %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>
3704 %3 = icmp sgt <8 x i64> %2, <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>
3705 %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>
3706 %5 = trunc <8 x i64> %4 to <8 x i8>
3710 ; TODO: The AVX1 codegen shows a missed opportunity to narrow blendv+logic to 128-bit.
3712 define void @trunc_ssat_v8i64_v8i8_store(<8 x i64>* %p0, <8 x i8> *%p1) "min-legal-vector-width"="256" {
3713 ; SSE2-LABEL: trunc_ssat_v8i64_v8i8_store:
3715 ; SSE2-NEXT: movdqa (%rdi), %xmm6
3716 ; SSE2-NEXT: movdqa 16(%rdi), %xmm9
3717 ; SSE2-NEXT: movdqa 32(%rdi), %xmm2
3718 ; SSE2-NEXT: movdqa 48(%rdi), %xmm5
3719 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [127,127]
3720 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
3721 ; SSE2-NEXT: movdqa %xmm2, %xmm1
3722 ; SSE2-NEXT: pxor %xmm0, %xmm1
3723 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147483775,2147483775]
3724 ; SSE2-NEXT: movdqa %xmm10, %xmm7
3725 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm7
3726 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2]
3727 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm1
3728 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
3729 ; SSE2-NEXT: pand %xmm3, %xmm4
3730 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3]
3731 ; SSE2-NEXT: por %xmm4, %xmm1
3732 ; SSE2-NEXT: pand %xmm1, %xmm2
3733 ; SSE2-NEXT: pandn %xmm8, %xmm1
3734 ; SSE2-NEXT: por %xmm2, %xmm1
3735 ; SSE2-NEXT: movdqa %xmm5, %xmm2
3736 ; SSE2-NEXT: pxor %xmm0, %xmm2
3737 ; SSE2-NEXT: movdqa %xmm10, %xmm3
3738 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
3739 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
3740 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm2
3741 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
3742 ; SSE2-NEXT: pand %xmm4, %xmm7
3743 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
3744 ; SSE2-NEXT: por %xmm7, %xmm2
3745 ; SSE2-NEXT: pand %xmm2, %xmm5
3746 ; SSE2-NEXT: pandn %xmm8, %xmm2
3747 ; SSE2-NEXT: por %xmm5, %xmm2
3748 ; SSE2-NEXT: movdqa %xmm6, %xmm3
3749 ; SSE2-NEXT: pxor %xmm0, %xmm3
3750 ; SSE2-NEXT: movdqa %xmm10, %xmm4
3751 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
3752 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
3753 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm3
3754 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3755 ; SSE2-NEXT: pand %xmm5, %xmm3
3756 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
3757 ; SSE2-NEXT: por %xmm3, %xmm5
3758 ; SSE2-NEXT: pand %xmm5, %xmm6
3759 ; SSE2-NEXT: pandn %xmm8, %xmm5
3760 ; SSE2-NEXT: por %xmm6, %xmm5
3761 ; SSE2-NEXT: movdqa %xmm9, %xmm3
3762 ; SSE2-NEXT: pxor %xmm0, %xmm3
3763 ; SSE2-NEXT: movdqa %xmm10, %xmm4
3764 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
3765 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
3766 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm3
3767 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3768 ; SSE2-NEXT: pand %xmm6, %xmm3
3769 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3]
3770 ; SSE2-NEXT: por %xmm3, %xmm6
3771 ; SSE2-NEXT: pand %xmm6, %xmm9
3772 ; SSE2-NEXT: pandn %xmm8, %xmm6
3773 ; SSE2-NEXT: por %xmm9, %xmm6
3774 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
3775 ; SSE2-NEXT: movdqa %xmm6, %xmm7
3776 ; SSE2-NEXT: pxor %xmm0, %xmm7
3777 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [18446744071562067840,18446744071562067840]
3778 ; SSE2-NEXT: movdqa %xmm7, %xmm3
3779 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm3
3780 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
3781 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm7
3782 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
3783 ; SSE2-NEXT: pand %xmm4, %xmm7
3784 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3785 ; SSE2-NEXT: por %xmm7, %xmm3
3786 ; SSE2-NEXT: pand %xmm3, %xmm6
3787 ; SSE2-NEXT: pandn %xmm8, %xmm3
3788 ; SSE2-NEXT: por %xmm6, %xmm3
3789 ; SSE2-NEXT: movdqa %xmm5, %xmm4
3790 ; SSE2-NEXT: pxor %xmm0, %xmm4
3791 ; SSE2-NEXT: movdqa %xmm4, %xmm6
3792 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm6
3793 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
3794 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm4
3795 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3796 ; SSE2-NEXT: pand %xmm7, %xmm4
3797 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
3798 ; SSE2-NEXT: por %xmm4, %xmm6
3799 ; SSE2-NEXT: pand %xmm6, %xmm5
3800 ; SSE2-NEXT: pandn %xmm8, %xmm6
3801 ; SSE2-NEXT: por %xmm5, %xmm6
3802 ; SSE2-NEXT: packssdw %xmm3, %xmm6
3803 ; SSE2-NEXT: movdqa %xmm2, %xmm3
3804 ; SSE2-NEXT: pxor %xmm0, %xmm3
3805 ; SSE2-NEXT: movdqa %xmm3, %xmm4
3806 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm4
3807 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
3808 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm3
3809 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3810 ; SSE2-NEXT: pand %xmm5, %xmm3
3811 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3812 ; SSE2-NEXT: por %xmm3, %xmm4
3813 ; SSE2-NEXT: pand %xmm4, %xmm2
3814 ; SSE2-NEXT: pandn %xmm8, %xmm4
3815 ; SSE2-NEXT: por %xmm2, %xmm4
3816 ; SSE2-NEXT: pxor %xmm1, %xmm0
3817 ; SSE2-NEXT: movdqa %xmm0, %xmm2
3818 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm2
3819 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
3820 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm0
3821 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3822 ; SSE2-NEXT: pand %xmm3, %xmm0
3823 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3824 ; SSE2-NEXT: por %xmm0, %xmm2
3825 ; SSE2-NEXT: pand %xmm2, %xmm1
3826 ; SSE2-NEXT: pandn %xmm8, %xmm2
3827 ; SSE2-NEXT: por %xmm1, %xmm2
3828 ; SSE2-NEXT: packssdw %xmm4, %xmm2
3829 ; SSE2-NEXT: packssdw %xmm2, %xmm6
3830 ; SSE2-NEXT: packsswb %xmm6, %xmm6
3831 ; SSE2-NEXT: movq %xmm6, (%rsi)
3834 ; SSSE3-LABEL: trunc_ssat_v8i64_v8i8_store:
3836 ; SSSE3-NEXT: movdqa (%rdi), %xmm6
3837 ; SSSE3-NEXT: movdqa 16(%rdi), %xmm9
3838 ; SSSE3-NEXT: movdqa 32(%rdi), %xmm2
3839 ; SSSE3-NEXT: movdqa 48(%rdi), %xmm5
3840 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [127,127]
3841 ; SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
3842 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
3843 ; SSSE3-NEXT: pxor %xmm0, %xmm1
3844 ; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [2147483775,2147483775]
3845 ; SSSE3-NEXT: movdqa %xmm10, %xmm7
3846 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm7
3847 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2]
3848 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm1
3849 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
3850 ; SSSE3-NEXT: pand %xmm3, %xmm4
3851 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3]
3852 ; SSSE3-NEXT: por %xmm4, %xmm1
3853 ; SSSE3-NEXT: pand %xmm1, %xmm2
3854 ; SSSE3-NEXT: pandn %xmm8, %xmm1
3855 ; SSSE3-NEXT: por %xmm2, %xmm1
3856 ; SSSE3-NEXT: movdqa %xmm5, %xmm2
3857 ; SSSE3-NEXT: pxor %xmm0, %xmm2
3858 ; SSSE3-NEXT: movdqa %xmm10, %xmm3
3859 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
3860 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
3861 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm2
3862 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
3863 ; SSSE3-NEXT: pand %xmm4, %xmm7
3864 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
3865 ; SSSE3-NEXT: por %xmm7, %xmm2
3866 ; SSSE3-NEXT: pand %xmm2, %xmm5
3867 ; SSSE3-NEXT: pandn %xmm8, %xmm2
3868 ; SSSE3-NEXT: por %xmm5, %xmm2
3869 ; SSSE3-NEXT: movdqa %xmm6, %xmm3
3870 ; SSSE3-NEXT: pxor %xmm0, %xmm3
3871 ; SSSE3-NEXT: movdqa %xmm10, %xmm4
3872 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4
3873 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
3874 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm3
3875 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3876 ; SSSE3-NEXT: pand %xmm5, %xmm3
3877 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
3878 ; SSSE3-NEXT: por %xmm3, %xmm5
3879 ; SSSE3-NEXT: pand %xmm5, %xmm6
3880 ; SSSE3-NEXT: pandn %xmm8, %xmm5
3881 ; SSSE3-NEXT: por %xmm6, %xmm5
3882 ; SSSE3-NEXT: movdqa %xmm9, %xmm3
3883 ; SSSE3-NEXT: pxor %xmm0, %xmm3
3884 ; SSSE3-NEXT: movdqa %xmm10, %xmm4
3885 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4
3886 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
3887 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm3
3888 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3889 ; SSSE3-NEXT: pand %xmm6, %xmm3
3890 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3]
3891 ; SSSE3-NEXT: por %xmm3, %xmm6
3892 ; SSSE3-NEXT: pand %xmm6, %xmm9
3893 ; SSSE3-NEXT: pandn %xmm8, %xmm6
3894 ; SSSE3-NEXT: por %xmm9, %xmm6
3895 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
3896 ; SSSE3-NEXT: movdqa %xmm6, %xmm7
3897 ; SSSE3-NEXT: pxor %xmm0, %xmm7
3898 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [18446744071562067840,18446744071562067840]
3899 ; SSSE3-NEXT: movdqa %xmm7, %xmm3
3900 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm3
3901 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
3902 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm7
3903 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
3904 ; SSSE3-NEXT: pand %xmm4, %xmm7
3905 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3906 ; SSSE3-NEXT: por %xmm7, %xmm3
3907 ; SSSE3-NEXT: pand %xmm3, %xmm6
3908 ; SSSE3-NEXT: pandn %xmm8, %xmm3
3909 ; SSSE3-NEXT: por %xmm6, %xmm3
3910 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
3911 ; SSSE3-NEXT: pxor %xmm0, %xmm4
3912 ; SSSE3-NEXT: movdqa %xmm4, %xmm6
3913 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm6
3914 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
3915 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm4
3916 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3917 ; SSSE3-NEXT: pand %xmm7, %xmm4
3918 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
3919 ; SSSE3-NEXT: por %xmm4, %xmm6
3920 ; SSSE3-NEXT: pand %xmm6, %xmm5
3921 ; SSSE3-NEXT: pandn %xmm8, %xmm6
3922 ; SSSE3-NEXT: por %xmm5, %xmm6
3923 ; SSSE3-NEXT: packssdw %xmm3, %xmm6
3924 ; SSSE3-NEXT: movdqa %xmm2, %xmm3
3925 ; SSSE3-NEXT: pxor %xmm0, %xmm3
3926 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
3927 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm4
3928 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
3929 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm3
3930 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3931 ; SSSE3-NEXT: pand %xmm5, %xmm3
3932 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3933 ; SSSE3-NEXT: por %xmm3, %xmm4
3934 ; SSSE3-NEXT: pand %xmm4, %xmm2
3935 ; SSSE3-NEXT: pandn %xmm8, %xmm4
3936 ; SSSE3-NEXT: por %xmm2, %xmm4
3937 ; SSSE3-NEXT: pxor %xmm1, %xmm0
3938 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
3939 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm2
3940 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
3941 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm0
3942 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3943 ; SSSE3-NEXT: pand %xmm3, %xmm0
3944 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3945 ; SSSE3-NEXT: por %xmm0, %xmm2
3946 ; SSSE3-NEXT: pand %xmm2, %xmm1
3947 ; SSSE3-NEXT: pandn %xmm8, %xmm2
3948 ; SSSE3-NEXT: por %xmm1, %xmm2
3949 ; SSSE3-NEXT: packssdw %xmm4, %xmm2
3950 ; SSSE3-NEXT: packssdw %xmm2, %xmm6
3951 ; SSSE3-NEXT: packsswb %xmm6, %xmm6
3952 ; SSSE3-NEXT: movq %xmm6, (%rsi)
3955 ; SSE41-LABEL: trunc_ssat_v8i64_v8i8_store:
3957 ; SSE41-NEXT: movdqa (%rdi), %xmm10
3958 ; SSE41-NEXT: movdqa 16(%rdi), %xmm9
3959 ; SSE41-NEXT: movdqa 32(%rdi), %xmm2
3960 ; SSE41-NEXT: movdqa 48(%rdi), %xmm5
3961 ; SSE41-NEXT: movapd {{.*#+}} xmm4 = [127,127]
3962 ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
3963 ; SSE41-NEXT: movdqa %xmm2, %xmm0
3964 ; SSE41-NEXT: pxor %xmm1, %xmm0
3965 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483775,2147483775]
3966 ; SSE41-NEXT: movdqa %xmm3, %xmm7
3967 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm7
3968 ; SSE41-NEXT: movdqa %xmm3, %xmm6
3969 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
3970 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3971 ; SSE41-NEXT: pand %xmm7, %xmm0
3972 ; SSE41-NEXT: por %xmm6, %xmm0
3973 ; SSE41-NEXT: movapd %xmm4, %xmm8
3974 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm8
3975 ; SSE41-NEXT: movdqa %xmm5, %xmm0
3976 ; SSE41-NEXT: pxor %xmm1, %xmm0
3977 ; SSE41-NEXT: movdqa %xmm3, %xmm2
3978 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
3979 ; SSE41-NEXT: movdqa %xmm3, %xmm6
3980 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
3981 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3982 ; SSE41-NEXT: pand %xmm2, %xmm0
3983 ; SSE41-NEXT: por %xmm6, %xmm0
3984 ; SSE41-NEXT: movapd %xmm4, %xmm11
3985 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm11
3986 ; SSE41-NEXT: movdqa %xmm10, %xmm0
3987 ; SSE41-NEXT: pxor %xmm1, %xmm0
3988 ; SSE41-NEXT: movdqa %xmm3, %xmm2
3989 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
3990 ; SSE41-NEXT: movdqa %xmm3, %xmm5
3991 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
3992 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
3993 ; SSE41-NEXT: pand %xmm2, %xmm0
3994 ; SSE41-NEXT: por %xmm5, %xmm0
3995 ; SSE41-NEXT: movapd %xmm4, %xmm2
3996 ; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm2
3997 ; SSE41-NEXT: movdqa %xmm9, %xmm0
3998 ; SSE41-NEXT: pxor %xmm1, %xmm0
3999 ; SSE41-NEXT: movdqa %xmm3, %xmm5
4000 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
4001 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm3
4002 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
4003 ; SSE41-NEXT: pand %xmm5, %xmm0
4004 ; SSE41-NEXT: por %xmm3, %xmm0
4005 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm4
4006 ; SSE41-NEXT: movapd {{.*#+}} xmm5 = [18446744073709551488,18446744073709551488]
4007 ; SSE41-NEXT: movapd %xmm4, %xmm3
4008 ; SSE41-NEXT: xorpd %xmm1, %xmm3
4009 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [18446744071562067840,18446744071562067840]
4010 ; SSE41-NEXT: movapd %xmm3, %xmm7
4011 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm7
4012 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm3
4013 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
4014 ; SSE41-NEXT: pand %xmm7, %xmm0
4015 ; SSE41-NEXT: por %xmm3, %xmm0
4016 ; SSE41-NEXT: movapd %xmm5, %xmm3
4017 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm3
4018 ; SSE41-NEXT: movapd %xmm2, %xmm4
4019 ; SSE41-NEXT: xorpd %xmm1, %xmm4
4020 ; SSE41-NEXT: movapd %xmm4, %xmm7
4021 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm7
4022 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm4
4023 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
4024 ; SSE41-NEXT: pand %xmm7, %xmm0
4025 ; SSE41-NEXT: por %xmm4, %xmm0
4026 ; SSE41-NEXT: movapd %xmm5, %xmm4
4027 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4
4028 ; SSE41-NEXT: packssdw %xmm3, %xmm4
4029 ; SSE41-NEXT: movapd %xmm11, %xmm2
4030 ; SSE41-NEXT: xorpd %xmm1, %xmm2
4031 ; SSE41-NEXT: movapd %xmm2, %xmm3
4032 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm3
4033 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm2
4034 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
4035 ; SSE41-NEXT: pand %xmm3, %xmm0
4036 ; SSE41-NEXT: por %xmm2, %xmm0
4037 ; SSE41-NEXT: movapd %xmm5, %xmm2
4038 ; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm2
4039 ; SSE41-NEXT: xorpd %xmm8, %xmm1
4040 ; SSE41-NEXT: movapd %xmm1, %xmm3
4041 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm3
4042 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm1
4043 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
4044 ; SSE41-NEXT: pand %xmm3, %xmm0
4045 ; SSE41-NEXT: por %xmm1, %xmm0
4046 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm5
4047 ; SSE41-NEXT: packssdw %xmm2, %xmm5
4048 ; SSE41-NEXT: packssdw %xmm5, %xmm4
4049 ; SSE41-NEXT: packsswb %xmm4, %xmm4
4050 ; SSE41-NEXT: movq %xmm4, (%rsi)
4053 ; AVX1-LABEL: trunc_ssat_v8i64_v8i8_store:
4055 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
4056 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
4057 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2
4058 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3
4059 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [127,127]
4060 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm8
4061 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm6
4062 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm7
4063 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm5
4064 ; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
4065 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [18446744073709551488,18446744073709551488]
4066 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm0, %xmm9
4067 ; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm4, %xmm1
4068 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm1, %xmm7
4069 ; AVX1-NEXT: vblendvpd %xmm6, %xmm2, %xmm4, %xmm2
4070 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm2, %xmm6
4071 ; AVX1-NEXT: vblendvpd %xmm8, %xmm3, %xmm4, %xmm3
4072 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm3, %xmm4
4073 ; AVX1-NEXT: vblendvpd %xmm4, %xmm3, %xmm5, %xmm3
4074 ; AVX1-NEXT: vblendvpd %xmm6, %xmm2, %xmm5, %xmm2
4075 ; AVX1-NEXT: vpackssdw %xmm3, %xmm2, %xmm2
4076 ; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm5, %xmm1
4077 ; AVX1-NEXT: vblendvpd %xmm9, %xmm0, %xmm5, %xmm0
4078 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
4079 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0
4080 ; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
4081 ; AVX1-NEXT: vmovq %xmm0, (%rsi)
4084 ; AVX2-LABEL: trunc_ssat_v8i64_v8i8_store:
4086 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
4087 ; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1
4088 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [127,127,127,127]
4089 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3
4090 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
4091 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3
4092 ; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
4093 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
4094 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3
4095 ; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
4096 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm3
4097 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
4098 ; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0
4099 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
4100 ; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
4101 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
4102 ; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
4103 ; AVX2-NEXT: vmovq %xmm0, (%rsi)
4104 ; AVX2-NEXT: vzeroupper
4107 ; AVX512-LABEL: trunc_ssat_v8i64_v8i8_store:
4109 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
4110 ; AVX512-NEXT: vpmovsqb %zmm0, (%rsi)
4111 ; AVX512-NEXT: vzeroupper
4114 ; SKX-LABEL: trunc_ssat_v8i64_v8i8_store:
4116 ; SKX-NEXT: vmovdqa (%rdi), %ymm0
4117 ; SKX-NEXT: vmovdqa 32(%rdi), %ymm1
4118 ; SKX-NEXT: vpmovsqb %ymm1, %xmm1
4119 ; SKX-NEXT: vpmovsqb %ymm0, %xmm0
4120 ; SKX-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
4121 ; SKX-NEXT: vmovq %xmm0, (%rsi)
4122 ; SKX-NEXT: vzeroupper
4124 %a0 = load <8 x i64>, <8 x i64>* %p0
4125 %1 = icmp slt <8 x i64> %a0, <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>
4126 %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>
4127 %3 = icmp sgt <8 x i64> %2, <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>
4128 %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>
4129 %5 = trunc <8 x i64> %4 to <8 x i8>
4130 store <8 x i8> %5, <8 x i8> *%p1
4134 define <16 x i8> @trunc_ssat_v16i64_v16i8(<16 x i64>* %p0) "min-legal-vector-width"="256" {
4135 ; SSE2-LABEL: trunc_ssat_v16i64_v16i8:
4137 ; SSE2-NEXT: movdqa (%rdi), %xmm10
4138 ; SSE2-NEXT: movdqa 16(%rdi), %xmm9
4139 ; SSE2-NEXT: movdqa 32(%rdi), %xmm15
4140 ; SSE2-NEXT: movdqa 48(%rdi), %xmm13
4141 ; SSE2-NEXT: movdqa 80(%rdi), %xmm6
4142 ; SSE2-NEXT: movdqa 64(%rdi), %xmm3
4143 ; SSE2-NEXT: movdqa 112(%rdi), %xmm4
4144 ; SSE2-NEXT: movdqa 96(%rdi), %xmm7
4145 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [127,127]
4146 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
4147 ; SSE2-NEXT: movdqa %xmm7, %xmm5
4148 ; SSE2-NEXT: pxor %xmm1, %xmm5
4149 ; SSE2-NEXT: movdqa {{.*#+}} xmm14 = [2147483775,2147483775]
4150 ; SSE2-NEXT: movdqa %xmm14, %xmm0
4151 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm0
4152 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
4153 ; SSE2-NEXT: pcmpeqd %xmm14, %xmm5
4154 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
4155 ; SSE2-NEXT: pand %xmm2, %xmm5
4156 ; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm0[1,1,3,3]
4157 ; SSE2-NEXT: por %xmm5, %xmm11
4158 ; SSE2-NEXT: pand %xmm11, %xmm7
4159 ; SSE2-NEXT: pandn %xmm8, %xmm11
4160 ; SSE2-NEXT: por %xmm7, %xmm11
4161 ; SSE2-NEXT: movdqa %xmm4, %xmm0
4162 ; SSE2-NEXT: pxor %xmm1, %xmm0
4163 ; SSE2-NEXT: movdqa %xmm14, %xmm2
4164 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
4165 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
4166 ; SSE2-NEXT: pcmpeqd %xmm14, %xmm0
4167 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4168 ; SSE2-NEXT: pand %xmm5, %xmm0
4169 ; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm2[1,1,3,3]
4170 ; SSE2-NEXT: por %xmm0, %xmm12
4171 ; SSE2-NEXT: pand %xmm12, %xmm4
4172 ; SSE2-NEXT: pandn %xmm8, %xmm12
4173 ; SSE2-NEXT: por %xmm4, %xmm12
4174 ; SSE2-NEXT: movdqa %xmm3, %xmm0
4175 ; SSE2-NEXT: pxor %xmm1, %xmm0
4176 ; SSE2-NEXT: movdqa %xmm14, %xmm2
4177 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
4178 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
4179 ; SSE2-NEXT: pcmpeqd %xmm14, %xmm0
4180 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4181 ; SSE2-NEXT: pand %xmm4, %xmm0
4182 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
4183 ; SSE2-NEXT: por %xmm0, %xmm4
4184 ; SSE2-NEXT: pand %xmm4, %xmm3
4185 ; SSE2-NEXT: pandn %xmm8, %xmm4
4186 ; SSE2-NEXT: por %xmm3, %xmm4
4187 ; SSE2-NEXT: movdqa %xmm6, %xmm0
4188 ; SSE2-NEXT: pxor %xmm1, %xmm0
4189 ; SSE2-NEXT: movdqa %xmm14, %xmm2
4190 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
4191 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
4192 ; SSE2-NEXT: pcmpeqd %xmm14, %xmm0
4193 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4194 ; SSE2-NEXT: pand %xmm3, %xmm0
4195 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]
4196 ; SSE2-NEXT: por %xmm0, %xmm5
4197 ; SSE2-NEXT: pand %xmm5, %xmm6
4198 ; SSE2-NEXT: pandn %xmm8, %xmm5
4199 ; SSE2-NEXT: por %xmm6, %xmm5
4200 ; SSE2-NEXT: movdqa %xmm15, %xmm0
4201 ; SSE2-NEXT: pxor %xmm1, %xmm0
4202 ; SSE2-NEXT: movdqa %xmm14, %xmm2
4203 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
4204 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
4205 ; SSE2-NEXT: pcmpeqd %xmm14, %xmm0
4206 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4207 ; SSE2-NEXT: pand %xmm3, %xmm0
4208 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm2[1,1,3,3]
4209 ; SSE2-NEXT: por %xmm0, %xmm6
4210 ; SSE2-NEXT: pand %xmm6, %xmm15
4211 ; SSE2-NEXT: pandn %xmm8, %xmm6
4212 ; SSE2-NEXT: por %xmm15, %xmm6
4213 ; SSE2-NEXT: movdqa %xmm13, %xmm0
4214 ; SSE2-NEXT: pxor %xmm1, %xmm0
4215 ; SSE2-NEXT: movdqa %xmm14, %xmm2
4216 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
4217 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
4218 ; SSE2-NEXT: pcmpeqd %xmm14, %xmm0
4219 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4220 ; SSE2-NEXT: pand %xmm3, %xmm0
4221 ; SSE2-NEXT: pshufd {{.*#+}} xmm15 = xmm2[1,1,3,3]
4222 ; SSE2-NEXT: por %xmm0, %xmm15
4223 ; SSE2-NEXT: pand %xmm15, %xmm13
4224 ; SSE2-NEXT: pandn %xmm8, %xmm15
4225 ; SSE2-NEXT: por %xmm13, %xmm15
4226 ; SSE2-NEXT: movdqa %xmm10, %xmm0
4227 ; SSE2-NEXT: pxor %xmm1, %xmm0
4228 ; SSE2-NEXT: movdqa %xmm14, %xmm3
4229 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm3
4230 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm3[0,0,2,2]
4231 ; SSE2-NEXT: pcmpeqd %xmm14, %xmm0
4232 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4233 ; SSE2-NEXT: pand %xmm7, %xmm0
4234 ; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm3[1,1,3,3]
4235 ; SSE2-NEXT: por %xmm0, %xmm13
4236 ; SSE2-NEXT: pand %xmm13, %xmm10
4237 ; SSE2-NEXT: pandn %xmm8, %xmm13
4238 ; SSE2-NEXT: por %xmm10, %xmm13
4239 ; SSE2-NEXT: movdqa %xmm9, %xmm0
4240 ; SSE2-NEXT: pxor %xmm1, %xmm0
4241 ; SSE2-NEXT: movdqa %xmm14, %xmm7
4242 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm7
4243 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
4244 ; SSE2-NEXT: pcmpeqd %xmm14, %xmm0
4245 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4246 ; SSE2-NEXT: pand %xmm10, %xmm0
4247 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
4248 ; SSE2-NEXT: por %xmm0, %xmm7
4249 ; SSE2-NEXT: pand %xmm7, %xmm9
4250 ; SSE2-NEXT: pandn %xmm8, %xmm7
4251 ; SSE2-NEXT: por %xmm9, %xmm7
4252 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
4253 ; SSE2-NEXT: movdqa %xmm7, %xmm0
4254 ; SSE2-NEXT: pxor %xmm1, %xmm0
4255 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [18446744071562067840,18446744071562067840]
4256 ; SSE2-NEXT: movdqa %xmm0, %xmm2
4257 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm2
4258 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm2[0,0,2,2]
4259 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm0
4260 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4261 ; SSE2-NEXT: pand %xmm10, %xmm0
4262 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
4263 ; SSE2-NEXT: por %xmm0, %xmm2
4264 ; SSE2-NEXT: pand %xmm2, %xmm7
4265 ; SSE2-NEXT: pandn %xmm8, %xmm2
4266 ; SSE2-NEXT: por %xmm7, %xmm2
4267 ; SSE2-NEXT: movdqa %xmm13, %xmm0
4268 ; SSE2-NEXT: pxor %xmm1, %xmm0
4269 ; SSE2-NEXT: movdqa %xmm0, %xmm7
4270 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm7
4271 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
4272 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm0
4273 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
4274 ; SSE2-NEXT: pand %xmm10, %xmm3
4275 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
4276 ; SSE2-NEXT: por %xmm3, %xmm0
4277 ; SSE2-NEXT: pand %xmm0, %xmm13
4278 ; SSE2-NEXT: pandn %xmm8, %xmm0
4279 ; SSE2-NEXT: por %xmm13, %xmm0
4280 ; SSE2-NEXT: packssdw %xmm2, %xmm0
4281 ; SSE2-NEXT: movdqa %xmm15, %xmm2
4282 ; SSE2-NEXT: pxor %xmm1, %xmm2
4283 ; SSE2-NEXT: movdqa %xmm2, %xmm3
4284 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm3
4285 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm3[0,0,2,2]
4286 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm2
4287 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
4288 ; SSE2-NEXT: pand %xmm7, %xmm2
4289 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
4290 ; SSE2-NEXT: por %xmm2, %xmm3
4291 ; SSE2-NEXT: pand %xmm3, %xmm15
4292 ; SSE2-NEXT: pandn %xmm8, %xmm3
4293 ; SSE2-NEXT: por %xmm15, %xmm3
4294 ; SSE2-NEXT: movdqa %xmm6, %xmm2
4295 ; SSE2-NEXT: pxor %xmm1, %xmm2
4296 ; SSE2-NEXT: movdqa %xmm2, %xmm7
4297 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm7
4298 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
4299 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm2
4300 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
4301 ; SSE2-NEXT: pand %xmm10, %xmm2
4302 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
4303 ; SSE2-NEXT: por %xmm2, %xmm7
4304 ; SSE2-NEXT: pand %xmm7, %xmm6
4305 ; SSE2-NEXT: pandn %xmm8, %xmm7
4306 ; SSE2-NEXT: por %xmm6, %xmm7
4307 ; SSE2-NEXT: packssdw %xmm3, %xmm7
4308 ; SSE2-NEXT: packssdw %xmm7, %xmm0
4309 ; SSE2-NEXT: movdqa %xmm5, %xmm2
4310 ; SSE2-NEXT: pxor %xmm1, %xmm2
4311 ; SSE2-NEXT: movdqa %xmm2, %xmm3
4312 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm3
4313 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
4314 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm2
4315 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
4316 ; SSE2-NEXT: pand %xmm6, %xmm2
4317 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
4318 ; SSE2-NEXT: por %xmm2, %xmm3
4319 ; SSE2-NEXT: pand %xmm3, %xmm5
4320 ; SSE2-NEXT: pandn %xmm8, %xmm3
4321 ; SSE2-NEXT: por %xmm5, %xmm3
4322 ; SSE2-NEXT: movdqa %xmm4, %xmm2
4323 ; SSE2-NEXT: pxor %xmm1, %xmm2
4324 ; SSE2-NEXT: movdqa %xmm2, %xmm5
4325 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm5
4326 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
4327 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm2
4328 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
4329 ; SSE2-NEXT: pand %xmm6, %xmm7
4330 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
4331 ; SSE2-NEXT: por %xmm7, %xmm2
4332 ; SSE2-NEXT: pand %xmm2, %xmm4
4333 ; SSE2-NEXT: pandn %xmm8, %xmm2
4334 ; SSE2-NEXT: por %xmm4, %xmm2
4335 ; SSE2-NEXT: packssdw %xmm3, %xmm2
4336 ; SSE2-NEXT: movdqa %xmm12, %xmm3
4337 ; SSE2-NEXT: pxor %xmm1, %xmm3
4338 ; SSE2-NEXT: movdqa %xmm3, %xmm4
4339 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm4
4340 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
4341 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm3
4342 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
4343 ; SSE2-NEXT: pand %xmm5, %xmm3
4344 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
4345 ; SSE2-NEXT: por %xmm3, %xmm4
4346 ; SSE2-NEXT: pand %xmm4, %xmm12
4347 ; SSE2-NEXT: pandn %xmm8, %xmm4
4348 ; SSE2-NEXT: por %xmm12, %xmm4
4349 ; SSE2-NEXT: pxor %xmm11, %xmm1
4350 ; SSE2-NEXT: movdqa %xmm1, %xmm3
4351 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm3
4352 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
4353 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm1
4354 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
4355 ; SSE2-NEXT: pand %xmm5, %xmm1
4356 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
4357 ; SSE2-NEXT: por %xmm1, %xmm3
4358 ; SSE2-NEXT: pand %xmm3, %xmm11
4359 ; SSE2-NEXT: pandn %xmm8, %xmm3
4360 ; SSE2-NEXT: por %xmm11, %xmm3
4361 ; SSE2-NEXT: packssdw %xmm4, %xmm3
4362 ; SSE2-NEXT: packssdw %xmm3, %xmm2
4363 ; SSE2-NEXT: packsswb %xmm2, %xmm0
4366 ; SSSE3-LABEL: trunc_ssat_v16i64_v16i8:
4368 ; SSSE3-NEXT: movdqa (%rdi), %xmm10
4369 ; SSSE3-NEXT: movdqa 16(%rdi), %xmm9
4370 ; SSSE3-NEXT: movdqa 32(%rdi), %xmm15
4371 ; SSSE3-NEXT: movdqa 48(%rdi), %xmm13
4372 ; SSSE3-NEXT: movdqa 80(%rdi), %xmm6
4373 ; SSSE3-NEXT: movdqa 64(%rdi), %xmm3
4374 ; SSSE3-NEXT: movdqa 112(%rdi), %xmm4
4375 ; SSSE3-NEXT: movdqa 96(%rdi), %xmm7
4376 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [127,127]
4377 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
4378 ; SSSE3-NEXT: movdqa %xmm7, %xmm5
4379 ; SSSE3-NEXT: pxor %xmm1, %xmm5
4380 ; SSSE3-NEXT: movdqa {{.*#+}} xmm14 = [2147483775,2147483775]
4381 ; SSSE3-NEXT: movdqa %xmm14, %xmm0
4382 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm0
4383 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
4384 ; SSSE3-NEXT: pcmpeqd %xmm14, %xmm5
4385 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
4386 ; SSSE3-NEXT: pand %xmm2, %xmm5
4387 ; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm0[1,1,3,3]
4388 ; SSSE3-NEXT: por %xmm5, %xmm11
4389 ; SSSE3-NEXT: pand %xmm11, %xmm7
4390 ; SSSE3-NEXT: pandn %xmm8, %xmm11
4391 ; SSSE3-NEXT: por %xmm7, %xmm11
4392 ; SSSE3-NEXT: movdqa %xmm4, %xmm0
4393 ; SSSE3-NEXT: pxor %xmm1, %xmm0
4394 ; SSSE3-NEXT: movdqa %xmm14, %xmm2
4395 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
4396 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
4397 ; SSSE3-NEXT: pcmpeqd %xmm14, %xmm0
4398 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4399 ; SSSE3-NEXT: pand %xmm5, %xmm0
4400 ; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm2[1,1,3,3]
4401 ; SSSE3-NEXT: por %xmm0, %xmm12
4402 ; SSSE3-NEXT: pand %xmm12, %xmm4
4403 ; SSSE3-NEXT: pandn %xmm8, %xmm12
4404 ; SSSE3-NEXT: por %xmm4, %xmm12
4405 ; SSSE3-NEXT: movdqa %xmm3, %xmm0
4406 ; SSSE3-NEXT: pxor %xmm1, %xmm0
4407 ; SSSE3-NEXT: movdqa %xmm14, %xmm2
4408 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
4409 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
4410 ; SSSE3-NEXT: pcmpeqd %xmm14, %xmm0
4411 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4412 ; SSSE3-NEXT: pand %xmm4, %xmm0
4413 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
4414 ; SSSE3-NEXT: por %xmm0, %xmm4
4415 ; SSSE3-NEXT: pand %xmm4, %xmm3
4416 ; SSSE3-NEXT: pandn %xmm8, %xmm4
4417 ; SSSE3-NEXT: por %xmm3, %xmm4
4418 ; SSSE3-NEXT: movdqa %xmm6, %xmm0
4419 ; SSSE3-NEXT: pxor %xmm1, %xmm0
4420 ; SSSE3-NEXT: movdqa %xmm14, %xmm2
4421 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
4422 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
4423 ; SSSE3-NEXT: pcmpeqd %xmm14, %xmm0
4424 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4425 ; SSSE3-NEXT: pand %xmm3, %xmm0
4426 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]
4427 ; SSSE3-NEXT: por %xmm0, %xmm5
4428 ; SSSE3-NEXT: pand %xmm5, %xmm6
4429 ; SSSE3-NEXT: pandn %xmm8, %xmm5
4430 ; SSSE3-NEXT: por %xmm6, %xmm5
4431 ; SSSE3-NEXT: movdqa %xmm15, %xmm0
4432 ; SSSE3-NEXT: pxor %xmm1, %xmm0
4433 ; SSSE3-NEXT: movdqa %xmm14, %xmm2
4434 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
4435 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
4436 ; SSSE3-NEXT: pcmpeqd %xmm14, %xmm0
4437 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4438 ; SSSE3-NEXT: pand %xmm3, %xmm0
4439 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm2[1,1,3,3]
4440 ; SSSE3-NEXT: por %xmm0, %xmm6
4441 ; SSSE3-NEXT: pand %xmm6, %xmm15
4442 ; SSSE3-NEXT: pandn %xmm8, %xmm6
4443 ; SSSE3-NEXT: por %xmm15, %xmm6
4444 ; SSSE3-NEXT: movdqa %xmm13, %xmm0
4445 ; SSSE3-NEXT: pxor %xmm1, %xmm0
4446 ; SSSE3-NEXT: movdqa %xmm14, %xmm2
4447 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
4448 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
4449 ; SSSE3-NEXT: pcmpeqd %xmm14, %xmm0
4450 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4451 ; SSSE3-NEXT: pand %xmm3, %xmm0
4452 ; SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm2[1,1,3,3]
4453 ; SSSE3-NEXT: por %xmm0, %xmm15
4454 ; SSSE3-NEXT: pand %xmm15, %xmm13
4455 ; SSSE3-NEXT: pandn %xmm8, %xmm15
4456 ; SSSE3-NEXT: por %xmm13, %xmm15
4457 ; SSSE3-NEXT: movdqa %xmm10, %xmm0
4458 ; SSSE3-NEXT: pxor %xmm1, %xmm0
4459 ; SSSE3-NEXT: movdqa %xmm14, %xmm3
4460 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm3
4461 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm3[0,0,2,2]
4462 ; SSSE3-NEXT: pcmpeqd %xmm14, %xmm0
4463 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4464 ; SSSE3-NEXT: pand %xmm7, %xmm0
4465 ; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm3[1,1,3,3]
4466 ; SSSE3-NEXT: por %xmm0, %xmm13
4467 ; SSSE3-NEXT: pand %xmm13, %xmm10
4468 ; SSSE3-NEXT: pandn %xmm8, %xmm13
4469 ; SSSE3-NEXT: por %xmm10, %xmm13
4470 ; SSSE3-NEXT: movdqa %xmm9, %xmm0
4471 ; SSSE3-NEXT: pxor %xmm1, %xmm0
4472 ; SSSE3-NEXT: movdqa %xmm14, %xmm7
4473 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm7
4474 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
4475 ; SSSE3-NEXT: pcmpeqd %xmm14, %xmm0
4476 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4477 ; SSSE3-NEXT: pand %xmm10, %xmm0
4478 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
4479 ; SSSE3-NEXT: por %xmm0, %xmm7
4480 ; SSSE3-NEXT: pand %xmm7, %xmm9
4481 ; SSSE3-NEXT: pandn %xmm8, %xmm7
4482 ; SSSE3-NEXT: por %xmm9, %xmm7
4483 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
4484 ; SSSE3-NEXT: movdqa %xmm7, %xmm0
4485 ; SSSE3-NEXT: pxor %xmm1, %xmm0
4486 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [18446744071562067840,18446744071562067840]
4487 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
4488 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm2
4489 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm2[0,0,2,2]
4490 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm0
4491 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
4492 ; SSSE3-NEXT: pand %xmm10, %xmm0
4493 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
4494 ; SSSE3-NEXT: por %xmm0, %xmm2
4495 ; SSSE3-NEXT: pand %xmm2, %xmm7
4496 ; SSSE3-NEXT: pandn %xmm8, %xmm2
4497 ; SSSE3-NEXT: por %xmm7, %xmm2
4498 ; SSSE3-NEXT: movdqa %xmm13, %xmm0
4499 ; SSSE3-NEXT: pxor %xmm1, %xmm0
4500 ; SSSE3-NEXT: movdqa %xmm0, %xmm7
4501 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm7
4502 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
4503 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm0
4504 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
4505 ; SSSE3-NEXT: pand %xmm10, %xmm3
4506 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
4507 ; SSSE3-NEXT: por %xmm3, %xmm0
4508 ; SSSE3-NEXT: pand %xmm0, %xmm13
4509 ; SSSE3-NEXT: pandn %xmm8, %xmm0
4510 ; SSSE3-NEXT: por %xmm13, %xmm0
4511 ; SSSE3-NEXT: packssdw %xmm2, %xmm0
4512 ; SSSE3-NEXT: movdqa %xmm15, %xmm2
4513 ; SSSE3-NEXT: pxor %xmm1, %xmm2
4514 ; SSSE3-NEXT: movdqa %xmm2, %xmm3
4515 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm3
4516 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm3[0,0,2,2]
4517 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm2
4518 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
4519 ; SSSE3-NEXT: pand %xmm7, %xmm2
4520 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
4521 ; SSSE3-NEXT: por %xmm2, %xmm3
4522 ; SSSE3-NEXT: pand %xmm3, %xmm15
4523 ; SSSE3-NEXT: pandn %xmm8, %xmm3
4524 ; SSSE3-NEXT: por %xmm15, %xmm3
4525 ; SSSE3-NEXT: movdqa %xmm6, %xmm2
4526 ; SSSE3-NEXT: pxor %xmm1, %xmm2
4527 ; SSSE3-NEXT: movdqa %xmm2, %xmm7
4528 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm7
4529 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
4530 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm2
4531 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
4532 ; SSSE3-NEXT: pand %xmm10, %xmm2
4533 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
4534 ; SSSE3-NEXT: por %xmm2, %xmm7
4535 ; SSSE3-NEXT: pand %xmm7, %xmm6
4536 ; SSSE3-NEXT: pandn %xmm8, %xmm7
4537 ; SSSE3-NEXT: por %xmm6, %xmm7
4538 ; SSSE3-NEXT: packssdw %xmm3, %xmm7
4539 ; SSSE3-NEXT: packssdw %xmm7, %xmm0
4540 ; SSSE3-NEXT: movdqa %xmm5, %xmm2
4541 ; SSSE3-NEXT: pxor %xmm1, %xmm2
4542 ; SSSE3-NEXT: movdqa %xmm2, %xmm3
4543 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm3
4544 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
4545 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm2
4546 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
4547 ; SSSE3-NEXT: pand %xmm6, %xmm2
4548 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
4549 ; SSSE3-NEXT: por %xmm2, %xmm3
4550 ; SSSE3-NEXT: pand %xmm3, %xmm5
4551 ; SSSE3-NEXT: pandn %xmm8, %xmm3
4552 ; SSSE3-NEXT: por %xmm5, %xmm3
4553 ; SSSE3-NEXT: movdqa %xmm4, %xmm2
4554 ; SSSE3-NEXT: pxor %xmm1, %xmm2
4555 ; SSSE3-NEXT: movdqa %xmm2, %xmm5
4556 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm5
4557 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
4558 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm2
4559 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
4560 ; SSSE3-NEXT: pand %xmm6, %xmm7
4561 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
4562 ; SSSE3-NEXT: por %xmm7, %xmm2
4563 ; SSSE3-NEXT: pand %xmm2, %xmm4
4564 ; SSSE3-NEXT: pandn %xmm8, %xmm2
4565 ; SSSE3-NEXT: por %xmm4, %xmm2
4566 ; SSSE3-NEXT: packssdw %xmm3, %xmm2
4567 ; SSSE3-NEXT: movdqa %xmm12, %xmm3
4568 ; SSSE3-NEXT: pxor %xmm1, %xmm3
4569 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
4570 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm4
4571 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
4572 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm3
4573 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
4574 ; SSSE3-NEXT: pand %xmm5, %xmm3
4575 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
4576 ; SSSE3-NEXT: por %xmm3, %xmm4
4577 ; SSSE3-NEXT: pand %xmm4, %xmm12
4578 ; SSSE3-NEXT: pandn %xmm8, %xmm4
4579 ; SSSE3-NEXT: por %xmm12, %xmm4
4580 ; SSSE3-NEXT: pxor %xmm11, %xmm1
4581 ; SSSE3-NEXT: movdqa %xmm1, %xmm3
4582 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm3
4583 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
4584 ; SSSE3-NEXT: pcmpeqd %xmm9, %xmm1
4585 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
4586 ; SSSE3-NEXT: pand %xmm5, %xmm1
4587 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
4588 ; SSSE3-NEXT: por %xmm1, %xmm3
4589 ; SSSE3-NEXT: pand %xmm3, %xmm11
4590 ; SSSE3-NEXT: pandn %xmm8, %xmm3
4591 ; SSSE3-NEXT: por %xmm11, %xmm3
4592 ; SSSE3-NEXT: packssdw %xmm4, %xmm3
4593 ; SSSE3-NEXT: packssdw %xmm3, %xmm2
4594 ; SSSE3-NEXT: packsswb %xmm2, %xmm0
4597 ; SSE41-LABEL: trunc_ssat_v16i64_v16i8:
4599 ; SSE41-NEXT: movdqa (%rdi), %xmm11
4600 ; SSE41-NEXT: movdqa 16(%rdi), %xmm9
4601 ; SSE41-NEXT: movdqa 32(%rdi), %xmm15
4602 ; SSE41-NEXT: movdqa 48(%rdi), %xmm12
4603 ; SSE41-NEXT: movdqa 80(%rdi), %xmm4
4604 ; SSE41-NEXT: movdqa 64(%rdi), %xmm14
4605 ; SSE41-NEXT: movdqa 112(%rdi), %xmm13
4606 ; SSE41-NEXT: movdqa 96(%rdi), %xmm3
4607 ; SSE41-NEXT: movapd {{.*#+}} xmm1 = [127,127]
4608 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
4609 ; SSE41-NEXT: movdqa %xmm3, %xmm0
4610 ; SSE41-NEXT: pxor %xmm2, %xmm0
4611 ; SSE41-NEXT: movdqa {{.*#+}} xmm7 = [2147483775,2147483775]
4612 ; SSE41-NEXT: movdqa %xmm7, %xmm5
4613 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
4614 ; SSE41-NEXT: movdqa %xmm7, %xmm6
4615 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
4616 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
4617 ; SSE41-NEXT: pand %xmm5, %xmm0
4618 ; SSE41-NEXT: por %xmm6, %xmm0
4619 ; SSE41-NEXT: movapd %xmm1, %xmm8
4620 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm8
4621 ; SSE41-NEXT: movdqa %xmm13, %xmm0
4622 ; SSE41-NEXT: pxor %xmm2, %xmm0
4623 ; SSE41-NEXT: movdqa %xmm7, %xmm3
4624 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
4625 ; SSE41-NEXT: movdqa %xmm7, %xmm5
4626 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
4627 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
4628 ; SSE41-NEXT: pand %xmm3, %xmm0
4629 ; SSE41-NEXT: por %xmm5, %xmm0
4630 ; SSE41-NEXT: movapd %xmm1, %xmm10
4631 ; SSE41-NEXT: blendvpd %xmm0, %xmm13, %xmm10
4632 ; SSE41-NEXT: movdqa %xmm14, %xmm0
4633 ; SSE41-NEXT: pxor %xmm2, %xmm0
4634 ; SSE41-NEXT: movdqa %xmm7, %xmm3
4635 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
4636 ; SSE41-NEXT: movdqa %xmm7, %xmm5
4637 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
4638 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
4639 ; SSE41-NEXT: pand %xmm3, %xmm0
4640 ; SSE41-NEXT: por %xmm5, %xmm0
4641 ; SSE41-NEXT: movapd %xmm1, %xmm13
4642 ; SSE41-NEXT: blendvpd %xmm0, %xmm14, %xmm13
4643 ; SSE41-NEXT: movdqa %xmm4, %xmm0
4644 ; SSE41-NEXT: pxor %xmm2, %xmm0
4645 ; SSE41-NEXT: movdqa %xmm7, %xmm3
4646 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
4647 ; SSE41-NEXT: movdqa %xmm7, %xmm5
4648 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
4649 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
4650 ; SSE41-NEXT: pand %xmm3, %xmm0
4651 ; SSE41-NEXT: por %xmm5, %xmm0
4652 ; SSE41-NEXT: movapd %xmm1, %xmm14
4653 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm14
4654 ; SSE41-NEXT: movdqa %xmm15, %xmm0
4655 ; SSE41-NEXT: pxor %xmm2, %xmm0
4656 ; SSE41-NEXT: movdqa %xmm7, %xmm3
4657 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
4658 ; SSE41-NEXT: movdqa %xmm7, %xmm4
4659 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
4660 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
4661 ; SSE41-NEXT: pand %xmm3, %xmm0
4662 ; SSE41-NEXT: por %xmm4, %xmm0
4663 ; SSE41-NEXT: movapd %xmm1, %xmm4
4664 ; SSE41-NEXT: blendvpd %xmm0, %xmm15, %xmm4
4665 ; SSE41-NEXT: movdqa %xmm12, %xmm0
4666 ; SSE41-NEXT: pxor %xmm2, %xmm0
4667 ; SSE41-NEXT: movdqa %xmm7, %xmm3
4668 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
4669 ; SSE41-NEXT: movdqa %xmm7, %xmm5
4670 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
4671 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
4672 ; SSE41-NEXT: pand %xmm3, %xmm0
4673 ; SSE41-NEXT: por %xmm5, %xmm0
4674 ; SSE41-NEXT: movapd %xmm1, %xmm15
4675 ; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm15
4676 ; SSE41-NEXT: movdqa %xmm11, %xmm0
4677 ; SSE41-NEXT: pxor %xmm2, %xmm0
4678 ; SSE41-NEXT: movdqa %xmm7, %xmm3
4679 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
4680 ; SSE41-NEXT: movdqa %xmm7, %xmm6
4681 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
4682 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
4683 ; SSE41-NEXT: pand %xmm3, %xmm0
4684 ; SSE41-NEXT: por %xmm6, %xmm0
4685 ; SSE41-NEXT: movapd %xmm1, %xmm6
4686 ; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm6
4687 ; SSE41-NEXT: movdqa %xmm9, %xmm0
4688 ; SSE41-NEXT: pxor %xmm2, %xmm0
4689 ; SSE41-NEXT: movdqa %xmm7, %xmm3
4690 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
4691 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
4692 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
4693 ; SSE41-NEXT: pand %xmm3, %xmm0
4694 ; SSE41-NEXT: por %xmm7, %xmm0
4695 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm1
4696 ; SSE41-NEXT: movapd {{.*#+}} xmm7 = [18446744073709551488,18446744073709551488]
4697 ; SSE41-NEXT: movapd %xmm1, %xmm5
4698 ; SSE41-NEXT: xorpd %xmm2, %xmm5
4699 ; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [18446744071562067840,18446744071562067840]
4700 ; SSE41-NEXT: movapd %xmm5, %xmm3
4701 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm3
4702 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm5
4703 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
4704 ; SSE41-NEXT: pand %xmm3, %xmm0
4705 ; SSE41-NEXT: por %xmm5, %xmm0
4706 ; SSE41-NEXT: movapd %xmm7, %xmm3
4707 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm3
4708 ; SSE41-NEXT: movapd %xmm6, %xmm1
4709 ; SSE41-NEXT: xorpd %xmm2, %xmm1
4710 ; SSE41-NEXT: movapd %xmm1, %xmm5
4711 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm5
4712 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm1
4713 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
4714 ; SSE41-NEXT: pand %xmm5, %xmm0
4715 ; SSE41-NEXT: por %xmm1, %xmm0
4716 ; SSE41-NEXT: movapd %xmm7, %xmm1
4717 ; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm1
4718 ; SSE41-NEXT: packssdw %xmm3, %xmm1
4719 ; SSE41-NEXT: movapd %xmm15, %xmm3
4720 ; SSE41-NEXT: xorpd %xmm2, %xmm3
4721 ; SSE41-NEXT: movapd %xmm3, %xmm5
4722 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm5
4723 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm3
4724 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
4725 ; SSE41-NEXT: pand %xmm5, %xmm0
4726 ; SSE41-NEXT: por %xmm3, %xmm0
4727 ; SSE41-NEXT: movapd %xmm7, %xmm3
4728 ; SSE41-NEXT: blendvpd %xmm0, %xmm15, %xmm3
4729 ; SSE41-NEXT: movapd %xmm4, %xmm5
4730 ; SSE41-NEXT: xorpd %xmm2, %xmm5
4731 ; SSE41-NEXT: movapd %xmm5, %xmm6
4732 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm6
4733 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm5
4734 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
4735 ; SSE41-NEXT: pand %xmm6, %xmm0
4736 ; SSE41-NEXT: por %xmm5, %xmm0
4737 ; SSE41-NEXT: movapd %xmm7, %xmm5
4738 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm5
4739 ; SSE41-NEXT: packssdw %xmm3, %xmm5
4740 ; SSE41-NEXT: packssdw %xmm5, %xmm1
4741 ; SSE41-NEXT: movapd %xmm14, %xmm3
4742 ; SSE41-NEXT: xorpd %xmm2, %xmm3
4743 ; SSE41-NEXT: movapd %xmm3, %xmm4
4744 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm4
4745 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm3
4746 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
4747 ; SSE41-NEXT: pand %xmm4, %xmm0
4748 ; SSE41-NEXT: por %xmm3, %xmm0
4749 ; SSE41-NEXT: movapd %xmm7, %xmm3
4750 ; SSE41-NEXT: blendvpd %xmm0, %xmm14, %xmm3
4751 ; SSE41-NEXT: movapd %xmm13, %xmm4
4752 ; SSE41-NEXT: xorpd %xmm2, %xmm4
4753 ; SSE41-NEXT: movapd %xmm4, %xmm5
4754 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm5
4755 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm4
4756 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
4757 ; SSE41-NEXT: pand %xmm5, %xmm0
4758 ; SSE41-NEXT: por %xmm4, %xmm0
4759 ; SSE41-NEXT: movapd %xmm7, %xmm4
4760 ; SSE41-NEXT: blendvpd %xmm0, %xmm13, %xmm4
4761 ; SSE41-NEXT: packssdw %xmm3, %xmm4
4762 ; SSE41-NEXT: movapd %xmm10, %xmm3
4763 ; SSE41-NEXT: xorpd %xmm2, %xmm3
4764 ; SSE41-NEXT: movapd %xmm3, %xmm5
4765 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm5
4766 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm3
4767 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
4768 ; SSE41-NEXT: pand %xmm5, %xmm0
4769 ; SSE41-NEXT: por %xmm3, %xmm0
4770 ; SSE41-NEXT: movapd %xmm7, %xmm3
4771 ; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm3
4772 ; SSE41-NEXT: xorpd %xmm8, %xmm2
4773 ; SSE41-NEXT: movapd %xmm2, %xmm5
4774 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm5
4775 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm2
4776 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
4777 ; SSE41-NEXT: pand %xmm5, %xmm0
4778 ; SSE41-NEXT: por %xmm2, %xmm0
4779 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm7
4780 ; SSE41-NEXT: packssdw %xmm3, %xmm7
4781 ; SSE41-NEXT: packssdw %xmm7, %xmm4
4782 ; SSE41-NEXT: packsswb %xmm4, %xmm1
4783 ; SSE41-NEXT: movdqa %xmm1, %xmm0
4786 ; AVX1-LABEL: trunc_ssat_v16i64_v16i8:
4788 ; AVX1-NEXT: vmovdqa 112(%rdi), %xmm8
4789 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [127,127]
4790 ; AVX1-NEXT: vmovdqa 96(%rdi), %xmm9
4791 ; AVX1-NEXT: vmovdqa 80(%rdi), %xmm3
4792 ; AVX1-NEXT: vmovdqa 64(%rdi), %xmm4
4793 ; AVX1-NEXT: vmovdqa (%rdi), %xmm5
4794 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm6
4795 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm7
4796 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm0
4797 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm1, %xmm2
4798 ; AVX1-NEXT: vblendvpd %xmm2, %xmm5, %xmm1, %xmm10
4799 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm1, %xmm5
4800 ; AVX1-NEXT: vblendvpd %xmm5, %xmm6, %xmm1, %xmm11
4801 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm1, %xmm6
4802 ; AVX1-NEXT: vblendvpd %xmm6, %xmm7, %xmm1, %xmm6
4803 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm7
4804 ; AVX1-NEXT: vblendvpd %xmm7, %xmm0, %xmm1, %xmm0
4805 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm7
4806 ; AVX1-NEXT: vblendvpd %xmm7, %xmm4, %xmm1, %xmm4
4807 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm1, %xmm7
4808 ; AVX1-NEXT: vblendvpd %xmm7, %xmm3, %xmm1, %xmm3
4809 ; AVX1-NEXT: vpcmpgtq %xmm9, %xmm1, %xmm7
4810 ; AVX1-NEXT: vblendvpd %xmm7, %xmm9, %xmm1, %xmm7
4811 ; AVX1-NEXT: vpcmpgtq %xmm8, %xmm1, %xmm2
4812 ; AVX1-NEXT: vblendvpd %xmm2, %xmm8, %xmm1, %xmm1
4813 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [18446744073709551488,18446744073709551488]
4814 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm5
4815 ; AVX1-NEXT: vblendvpd %xmm5, %xmm1, %xmm2, %xmm8
4816 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm7, %xmm5
4817 ; AVX1-NEXT: vblendvpd %xmm5, %xmm7, %xmm2, %xmm5
4818 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm7
4819 ; AVX1-NEXT: vblendvpd %xmm7, %xmm3, %xmm2, %xmm3
4820 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm7
4821 ; AVX1-NEXT: vblendvpd %xmm7, %xmm4, %xmm2, %xmm4
4822 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm7
4823 ; AVX1-NEXT: vblendvpd %xmm7, %xmm0, %xmm2, %xmm0
4824 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm6, %xmm7
4825 ; AVX1-NEXT: vblendvpd %xmm7, %xmm6, %xmm2, %xmm6
4826 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm11, %xmm7
4827 ; AVX1-NEXT: vblendvpd %xmm7, %xmm11, %xmm2, %xmm7
4828 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm10, %xmm1
4829 ; AVX1-NEXT: vblendvpd %xmm1, %xmm10, %xmm2, %xmm1
4830 ; AVX1-NEXT: vpackssdw %xmm8, %xmm5, %xmm2
4831 ; AVX1-NEXT: vpackssdw %xmm3, %xmm4, %xmm3
4832 ; AVX1-NEXT: vpackssdw %xmm2, %xmm3, %xmm2
4833 ; AVX1-NEXT: vpackssdw %xmm0, %xmm6, %xmm0
4834 ; AVX1-NEXT: vpackssdw %xmm7, %xmm1, %xmm1
4835 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm0
4836 ; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm0
4839 ; AVX2-LABEL: trunc_ssat_v16i64_v16i8:
4841 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
4842 ; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1
4843 ; AVX2-NEXT: vmovdqa 64(%rdi), %ymm2
4844 ; AVX2-NEXT: vmovdqa 96(%rdi), %ymm3
4845 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [127,127,127,127]
4846 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm4, %ymm5
4847 ; AVX2-NEXT: vblendvpd %ymm5, %ymm2, %ymm4, %ymm2
4848 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm4, %ymm5
4849 ; AVX2-NEXT: vblendvpd %ymm5, %ymm3, %ymm4, %ymm3
4850 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm4, %ymm5
4851 ; AVX2-NEXT: vblendvpd %ymm5, %ymm0, %ymm4, %ymm0
4852 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm4, %ymm5
4853 ; AVX2-NEXT: vblendvpd %ymm5, %ymm1, %ymm4, %ymm1
4854 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
4855 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm1, %ymm5
4856 ; AVX2-NEXT: vblendvpd %ymm5, %ymm1, %ymm4, %ymm1
4857 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm0, %ymm5
4858 ; AVX2-NEXT: vblendvpd %ymm5, %ymm0, %ymm4, %ymm0
4859 ; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0
4860 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm3, %ymm1
4861 ; AVX2-NEXT: vblendvpd %ymm1, %ymm3, %ymm4, %ymm1
4862 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm2, %ymm3
4863 ; AVX2-NEXT: vblendvpd %ymm3, %ymm2, %ymm4, %ymm2
4864 ; AVX2-NEXT: vpackssdw %ymm1, %ymm2, %ymm1
4865 ; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
4866 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4867 ; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0
4868 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
4869 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
4870 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
4871 ; AVX2-NEXT: vzeroupper
4874 ; AVX512-LABEL: trunc_ssat_v16i64_v16i8:
4876 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
4877 ; AVX512-NEXT: vmovdqa64 64(%rdi), %zmm1
4878 ; AVX512-NEXT: vpmovsqb %zmm1, %xmm1
4879 ; AVX512-NEXT: vpmovsqb %zmm0, %xmm0
4880 ; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4881 ; AVX512-NEXT: vzeroupper
4884 ; SKX-LABEL: trunc_ssat_v16i64_v16i8:
4886 ; SKX-NEXT: vmovdqa (%rdi), %ymm0
4887 ; SKX-NEXT: vmovdqa 32(%rdi), %ymm1
4888 ; SKX-NEXT: vmovdqa 64(%rdi), %ymm2
4889 ; SKX-NEXT: vmovdqa 96(%rdi), %ymm3
4890 ; SKX-NEXT: vpmovsqb %ymm3, %xmm3
4891 ; SKX-NEXT: vpmovsqb %ymm2, %xmm2
4892 ; SKX-NEXT: vpunpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
4893 ; SKX-NEXT: vpmovsqb %ymm1, %xmm1
4894 ; SKX-NEXT: vpmovsqb %ymm0, %xmm0
4895 ; SKX-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
4896 ; SKX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
4897 ; SKX-NEXT: vzeroupper
4899 %a0 = load <16 x i64>, <16 x i64>* %p0
4900 %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>
4901 %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>
4902 %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>
4903 %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>
4904 %5 = trunc <16 x i64> %4 to <16 x i8>
4908 define <4 x i8> @trunc_ssat_v4i32_v4i8(<4 x i32> %a0) {
4909 ; SSE2-LABEL: trunc_ssat_v4i32_v4i8:
4911 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [127,127,127,127]
4912 ; SSE2-NEXT: movdqa %xmm1, %xmm2
4913 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
4914 ; SSE2-NEXT: pand %xmm2, %xmm0
4915 ; SSE2-NEXT: pandn %xmm1, %xmm2
4916 ; SSE2-NEXT: por %xmm0, %xmm2
4917 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [4294967168,4294967168,4294967168,4294967168]
4918 ; SSE2-NEXT: movdqa %xmm2, %xmm0
4919 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm0
4920 ; SSE2-NEXT: pand %xmm0, %xmm2
4921 ; SSE2-NEXT: pandn %xmm1, %xmm0
4922 ; SSE2-NEXT: por %xmm2, %xmm0
4923 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
4924 ; SSE2-NEXT: packuswb %xmm0, %xmm0
4925 ; SSE2-NEXT: packuswb %xmm0, %xmm0
4928 ; SSSE3-LABEL: trunc_ssat_v4i32_v4i8:
4930 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [127,127,127,127]
4931 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
4932 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
4933 ; SSSE3-NEXT: pand %xmm2, %xmm0
4934 ; SSSE3-NEXT: pandn %xmm1, %xmm2
4935 ; SSSE3-NEXT: por %xmm0, %xmm2
4936 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [4294967168,4294967168,4294967168,4294967168]
4937 ; SSSE3-NEXT: movdqa %xmm2, %xmm0
4938 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm0
4939 ; SSSE3-NEXT: pand %xmm0, %xmm2
4940 ; SSSE3-NEXT: pandn %xmm1, %xmm0
4941 ; SSSE3-NEXT: por %xmm2, %xmm0
4942 ; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
4945 ; SSE41-LABEL: trunc_ssat_v4i32_v4i8:
4947 ; SSE41-NEXT: pminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
4948 ; SSE41-NEXT: pmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
4949 ; SSE41-NEXT: packssdw %xmm0, %xmm0
4950 ; SSE41-NEXT: packsswb %xmm0, %xmm0
4953 ; AVX1-LABEL: trunc_ssat_v4i32_v4i8:
4955 ; AVX1-NEXT: vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
4956 ; AVX1-NEXT: vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
4957 ; AVX1-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
4958 ; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
4961 ; AVX2-LABEL: trunc_ssat_v4i32_v4i8:
4963 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [127,127,127,127]
4964 ; AVX2-NEXT: vpminsd %xmm1, %xmm0, %xmm0
4965 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [4294967168,4294967168,4294967168,4294967168]
4966 ; AVX2-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
4967 ; AVX2-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
4968 ; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
4971 ; AVX512F-LABEL: trunc_ssat_v4i32_v4i8:
4973 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
4974 ; AVX512F-NEXT: vpmovsdb %zmm0, %xmm0
4975 ; AVX512F-NEXT: vzeroupper
4976 ; AVX512F-NEXT: retq
4978 ; AVX512VL-LABEL: trunc_ssat_v4i32_v4i8:
4979 ; AVX512VL: # %bb.0:
4980 ; AVX512VL-NEXT: vpmovsdb %xmm0, %xmm0
4981 ; AVX512VL-NEXT: retq
4983 ; AVX512BW-LABEL: trunc_ssat_v4i32_v4i8:
4984 ; AVX512BW: # %bb.0:
4985 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
4986 ; AVX512BW-NEXT: vpmovsdb %zmm0, %xmm0
4987 ; AVX512BW-NEXT: vzeroupper
4988 ; AVX512BW-NEXT: retq
4990 ; AVX512BWVL-LABEL: trunc_ssat_v4i32_v4i8:
4991 ; AVX512BWVL: # %bb.0:
4992 ; AVX512BWVL-NEXT: vpmovsdb %xmm0, %xmm0
4993 ; AVX512BWVL-NEXT: retq
4995 ; SKX-LABEL: trunc_ssat_v4i32_v4i8:
4997 ; SKX-NEXT: vpmovsdb %xmm0, %xmm0
4999 %1 = icmp slt <4 x i32> %a0, <i32 127, i32 127, i32 127, i32 127>
5000 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 127, i32 127, i32 127, i32 127>
5001 %3 = icmp sgt <4 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128>
5002 %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> <i32 -128, i32 -128, i32 -128, i32 -128>
5003 %5 = trunc <4 x i32> %4 to <4 x i8>
5007 define void @trunc_ssat_v4i32_v4i8_store(<4 x i32> %a0, <4 x i8> *%p1) {
5008 ; SSE2-LABEL: trunc_ssat_v4i32_v4i8_store:
5010 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [127,127,127,127]
5011 ; SSE2-NEXT: movdqa %xmm1, %xmm2
5012 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
5013 ; SSE2-NEXT: pand %xmm2, %xmm0
5014 ; SSE2-NEXT: pandn %xmm1, %xmm2
5015 ; SSE2-NEXT: por %xmm0, %xmm2
5016 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [4294967168,4294967168,4294967168,4294967168]
5017 ; SSE2-NEXT: movdqa %xmm2, %xmm1
5018 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1
5019 ; SSE2-NEXT: pand %xmm1, %xmm2
5020 ; SSE2-NEXT: pandn %xmm0, %xmm1
5021 ; SSE2-NEXT: por %xmm2, %xmm1
5022 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
5023 ; SSE2-NEXT: packuswb %xmm1, %xmm1
5024 ; SSE2-NEXT: packuswb %xmm1, %xmm1
5025 ; SSE2-NEXT: movd %xmm1, (%rdi)
5028 ; SSSE3-LABEL: trunc_ssat_v4i32_v4i8_store:
5030 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [127,127,127,127]
5031 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
5032 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
5033 ; SSSE3-NEXT: pand %xmm2, %xmm0
5034 ; SSSE3-NEXT: pandn %xmm1, %xmm2
5035 ; SSSE3-NEXT: por %xmm0, %xmm2
5036 ; SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [4294967168,4294967168,4294967168,4294967168]
5037 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
5038 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm1
5039 ; SSSE3-NEXT: pand %xmm1, %xmm2
5040 ; SSSE3-NEXT: pandn %xmm0, %xmm1
5041 ; SSSE3-NEXT: por %xmm2, %xmm1
5042 ; SSSE3-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
5043 ; SSSE3-NEXT: movd %xmm1, (%rdi)
5046 ; SSE41-LABEL: trunc_ssat_v4i32_v4i8_store:
5048 ; SSE41-NEXT: pminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
5049 ; SSE41-NEXT: pmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
5050 ; SSE41-NEXT: packssdw %xmm0, %xmm0
5051 ; SSE41-NEXT: packsswb %xmm0, %xmm0
5052 ; SSE41-NEXT: movd %xmm0, (%rdi)
5055 ; AVX1-LABEL: trunc_ssat_v4i32_v4i8_store:
5057 ; AVX1-NEXT: vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
5058 ; AVX1-NEXT: vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
5059 ; AVX1-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
5060 ; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
5061 ; AVX1-NEXT: vmovd %xmm0, (%rdi)
5064 ; AVX2-LABEL: trunc_ssat_v4i32_v4i8_store:
5066 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [127,127,127,127]
5067 ; AVX2-NEXT: vpminsd %xmm1, %xmm0, %xmm0
5068 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [4294967168,4294967168,4294967168,4294967168]
5069 ; AVX2-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
5070 ; AVX2-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
5071 ; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
5072 ; AVX2-NEXT: vmovd %xmm0, (%rdi)
5075 ; AVX512F-LABEL: trunc_ssat_v4i32_v4i8_store:
5077 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
5078 ; AVX512F-NEXT: vpmovsdb %zmm0, %xmm0
5079 ; AVX512F-NEXT: vmovd %xmm0, (%rdi)
5080 ; AVX512F-NEXT: vzeroupper
5081 ; AVX512F-NEXT: retq
5083 ; AVX512VL-LABEL: trunc_ssat_v4i32_v4i8_store:
5084 ; AVX512VL: # %bb.0:
5085 ; AVX512VL-NEXT: vpmovsdb %xmm0, (%rdi)
5086 ; AVX512VL-NEXT: retq
5088 ; AVX512BW-LABEL: trunc_ssat_v4i32_v4i8_store:
5089 ; AVX512BW: # %bb.0:
5090 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
5091 ; AVX512BW-NEXT: vpmovsdb %zmm0, %xmm0
5092 ; AVX512BW-NEXT: vmovd %xmm0, (%rdi)
5093 ; AVX512BW-NEXT: vzeroupper
5094 ; AVX512BW-NEXT: retq
5096 ; AVX512BWVL-LABEL: trunc_ssat_v4i32_v4i8_store:
5097 ; AVX512BWVL: # %bb.0:
5098 ; AVX512BWVL-NEXT: vpmovsdb %xmm0, (%rdi)
5099 ; AVX512BWVL-NEXT: retq
5101 ; SKX-LABEL: trunc_ssat_v4i32_v4i8_store:
5103 ; SKX-NEXT: vpmovsdb %xmm0, (%rdi)
5105 %1 = icmp slt <4 x i32> %a0, <i32 127, i32 127, i32 127, i32 127>
5106 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 127, i32 127, i32 127, i32 127>
5107 %3 = icmp sgt <4 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128>
5108 %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> <i32 -128, i32 -128, i32 -128, i32 -128>
5109 %5 = trunc <4 x i32> %4 to <4 x i8>
5110 store <4 x i8> %5, <4 x i8> *%p1
5114 define <8 x i8> @trunc_ssat_v8i32_v8i8(<8 x i32> %a0) {
5115 ; SSE-LABEL: trunc_ssat_v8i32_v8i8:
5117 ; SSE-NEXT: packssdw %xmm1, %xmm0
5118 ; SSE-NEXT: packsswb %xmm0, %xmm0
5121 ; AVX1-LABEL: trunc_ssat_v8i32_v8i8:
5123 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
5124 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
5125 ; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
5126 ; AVX1-NEXT: vzeroupper
5129 ; AVX2-LABEL: trunc_ssat_v8i32_v8i8:
5131 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
5132 ; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
5133 ; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
5134 ; AVX2-NEXT: vzeroupper
5137 ; AVX512F-LABEL: trunc_ssat_v8i32_v8i8:
5139 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1
5140 ; AVX512F-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
5141 ; AVX512F-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
5142 ; AVX512F-NEXT: vzeroupper
5143 ; AVX512F-NEXT: retq
5145 ; AVX512VL-LABEL: trunc_ssat_v8i32_v8i8:
5146 ; AVX512VL: # %bb.0:
5147 ; AVX512VL-NEXT: vpmovsdb %ymm0, %xmm0
5148 ; AVX512VL-NEXT: vzeroupper
5149 ; AVX512VL-NEXT: retq
5151 ; AVX512BW-LABEL: trunc_ssat_v8i32_v8i8:
5152 ; AVX512BW: # %bb.0:
5153 ; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1
5154 ; AVX512BW-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
5155 ; AVX512BW-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
5156 ; AVX512BW-NEXT: vzeroupper
5157 ; AVX512BW-NEXT: retq
5159 ; AVX512BWVL-LABEL: trunc_ssat_v8i32_v8i8:
5160 ; AVX512BWVL: # %bb.0:
5161 ; AVX512BWVL-NEXT: vpmovsdb %ymm0, %xmm0
5162 ; AVX512BWVL-NEXT: vzeroupper
5163 ; AVX512BWVL-NEXT: retq
5165 ; SKX-LABEL: trunc_ssat_v8i32_v8i8:
5167 ; SKX-NEXT: vpmovsdb %ymm0, %xmm0
5168 ; SKX-NEXT: vzeroupper
5170 %1 = icmp slt <8 x i32> %a0, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
5171 %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>
5172 %3 = icmp sgt <8 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
5173 %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>
5174 %5 = trunc <8 x i32> %4 to <8 x i8>
5178 define void @trunc_ssat_v8i32_v8i8_store(<8 x i32> %a0, <8 x i8> *%p1) {
5179 ; SSE-LABEL: trunc_ssat_v8i32_v8i8_store:
5181 ; SSE-NEXT: packssdw %xmm1, %xmm0
5182 ; SSE-NEXT: packsswb %xmm0, %xmm0
5183 ; SSE-NEXT: movq %xmm0, (%rdi)
5186 ; AVX1-LABEL: trunc_ssat_v8i32_v8i8_store:
5188 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
5189 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
5190 ; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
5191 ; AVX1-NEXT: vmovq %xmm0, (%rdi)
5192 ; AVX1-NEXT: vzeroupper
5195 ; AVX2-LABEL: trunc_ssat_v8i32_v8i8_store:
5197 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
5198 ; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
5199 ; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
5200 ; AVX2-NEXT: vmovq %xmm0, (%rdi)
5201 ; AVX2-NEXT: vzeroupper
5204 ; AVX512F-LABEL: trunc_ssat_v8i32_v8i8_store:
5206 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1
5207 ; AVX512F-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
5208 ; AVX512F-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
5209 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
5210 ; AVX512F-NEXT: vzeroupper
5211 ; AVX512F-NEXT: retq
5213 ; AVX512VL-LABEL: trunc_ssat_v8i32_v8i8_store:
5214 ; AVX512VL: # %bb.0:
5215 ; AVX512VL-NEXT: vpmovsdb %ymm0, (%rdi)
5216 ; AVX512VL-NEXT: vzeroupper
5217 ; AVX512VL-NEXT: retq
5219 ; AVX512BW-LABEL: trunc_ssat_v8i32_v8i8_store:
5220 ; AVX512BW: # %bb.0:
5221 ; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1
5222 ; AVX512BW-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
5223 ; AVX512BW-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
5224 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
5225 ; AVX512BW-NEXT: vzeroupper
5226 ; AVX512BW-NEXT: retq
5228 ; AVX512BWVL-LABEL: trunc_ssat_v8i32_v8i8_store:
5229 ; AVX512BWVL: # %bb.0:
5230 ; AVX512BWVL-NEXT: vpmovsdb %ymm0, (%rdi)
5231 ; AVX512BWVL-NEXT: vzeroupper
5232 ; AVX512BWVL-NEXT: retq
5234 ; SKX-LABEL: trunc_ssat_v8i32_v8i8_store:
5236 ; SKX-NEXT: vpmovsdb %ymm0, (%rdi)
5237 ; SKX-NEXT: vzeroupper
5239 %1 = icmp slt <8 x i32> %a0, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
5240 %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>
5241 %3 = icmp sgt <8 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
5242 %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>
5243 %5 = trunc <8 x i32> %4 to <8 x i8>
5244 store <8 x i8> %5, <8 x i8> *%p1
5248 define <16 x i8> @trunc_ssat_v16i32_v16i8(<16 x i32>* %p0) "min-legal-vector-width"="256" {
5249 ; SSE-LABEL: trunc_ssat_v16i32_v16i8:
5251 ; SSE-NEXT: movdqa (%rdi), %xmm0
5252 ; SSE-NEXT: movdqa 32(%rdi), %xmm1
5253 ; SSE-NEXT: packssdw 48(%rdi), %xmm1
5254 ; SSE-NEXT: packssdw 16(%rdi), %xmm0
5255 ; SSE-NEXT: packsswb %xmm1, %xmm0
5258 ; AVX1-LABEL: trunc_ssat_v16i32_v16i8:
5260 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
5261 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm1
5262 ; AVX1-NEXT: vpackssdw 48(%rdi), %xmm1, %xmm1
5263 ; AVX1-NEXT: vpackssdw 16(%rdi), %xmm0, %xmm0
5264 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
5267 ; AVX2-LABEL: trunc_ssat_v16i32_v16i8:
5269 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
5270 ; AVX2-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm0
5271 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
5272 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
5273 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
5274 ; AVX2-NEXT: vzeroupper
5277 ; AVX512-LABEL: trunc_ssat_v16i32_v16i8:
5279 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
5280 ; AVX512-NEXT: vpmovsdb %zmm0, %xmm0
5281 ; AVX512-NEXT: vzeroupper
5284 ; SKX-LABEL: trunc_ssat_v16i32_v16i8:
5286 ; SKX-NEXT: vmovdqa (%rdi), %ymm0
5287 ; SKX-NEXT: vmovdqa 32(%rdi), %ymm1
5288 ; SKX-NEXT: vpmovsdb %ymm1, %xmm1
5289 ; SKX-NEXT: vpmovsdb %ymm0, %xmm0
5290 ; SKX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
5291 ; SKX-NEXT: vzeroupper
5293 %a0 = load <16 x i32>, <16 x i32>* %p0
5294 %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>
5295 %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>
5296 %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>
5297 %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>
5298 %5 = trunc <16 x i32> %4 to <16 x i8>
5302 define void @trunc_ssat_v16i32_v16i8_store(<16 x i32>* %p0, <16 x i8>* %p1) "min-legal-vector-width"="256" {
5303 ; SSE-LABEL: trunc_ssat_v16i32_v16i8_store:
5305 ; SSE-NEXT: movdqa (%rdi), %xmm0
5306 ; SSE-NEXT: movdqa 32(%rdi), %xmm1
5307 ; SSE-NEXT: packssdw 48(%rdi), %xmm1
5308 ; SSE-NEXT: packssdw 16(%rdi), %xmm0
5309 ; SSE-NEXT: packsswb %xmm1, %xmm0
5310 ; SSE-NEXT: movdqa %xmm0, (%rsi)
5313 ; AVX1-LABEL: trunc_ssat_v16i32_v16i8_store:
5315 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
5316 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm1
5317 ; AVX1-NEXT: vpackssdw 48(%rdi), %xmm1, %xmm1
5318 ; AVX1-NEXT: vpackssdw 16(%rdi), %xmm0, %xmm0
5319 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
5320 ; AVX1-NEXT: vmovdqa %xmm0, (%rsi)
5323 ; AVX2-LABEL: trunc_ssat_v16i32_v16i8_store:
5325 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
5326 ; AVX2-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm0
5327 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
5328 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
5329 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
5330 ; AVX2-NEXT: vmovdqa %xmm0, (%rsi)
5331 ; AVX2-NEXT: vzeroupper
5334 ; AVX512-LABEL: trunc_ssat_v16i32_v16i8_store:
5336 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
5337 ; AVX512-NEXT: vpmovsdb %zmm0, (%rsi)
5338 ; AVX512-NEXT: vzeroupper
5341 ; SKX-LABEL: trunc_ssat_v16i32_v16i8_store:
5343 ; SKX-NEXT: vmovdqa (%rdi), %ymm0
5344 ; SKX-NEXT: vmovdqa 32(%rdi), %ymm1
5345 ; SKX-NEXT: vpmovsdb %ymm1, %xmm1
5346 ; SKX-NEXT: vpmovsdb %ymm0, %xmm0
5347 ; SKX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
5348 ; SKX-NEXT: vmovdqa %xmm0, (%rsi)
5349 ; SKX-NEXT: vzeroupper
5351 %a0 = load <16 x i32>, <16 x i32>* %p0
5352 %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>
5353 %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>
5354 %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>
5355 %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>
5356 %5 = trunc <16 x i32> %4 to <16 x i8>
5357 store <16 x i8> %5, <16 x i8>* %p1
5361 define <8 x i8> @trunc_ssat_v8i16_v8i8(<8 x i16> %a0) {
5362 ; SSE-LABEL: trunc_ssat_v8i16_v8i8:
5364 ; SSE-NEXT: packsswb %xmm0, %xmm0
5367 ; AVX-LABEL: trunc_ssat_v8i16_v8i8:
5369 ; AVX-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
5372 ; AVX512-LABEL: trunc_ssat_v8i16_v8i8:
5374 ; AVX512-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
5377 ; SKX-LABEL: trunc_ssat_v8i16_v8i8:
5379 ; SKX-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
5381 %1 = icmp slt <8 x i16> %a0, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
5382 %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>
5383 %3 = icmp sgt <8 x i16> %2, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
5384 %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>
5385 %5 = trunc <8 x i16> %4 to <8 x i8>
5389 define void @trunc_ssat_v8i16_v8i8_store(<8 x i16> %a0, <8 x i8> *%p1) {
5390 ; SSE-LABEL: trunc_ssat_v8i16_v8i8_store:
5392 ; SSE-NEXT: packsswb %xmm0, %xmm0
5393 ; SSE-NEXT: movq %xmm0, (%rdi)
5396 ; AVX-LABEL: trunc_ssat_v8i16_v8i8_store:
5398 ; AVX-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
5399 ; AVX-NEXT: vmovq %xmm0, (%rdi)
5402 ; AVX512F-LABEL: trunc_ssat_v8i16_v8i8_store:
5404 ; AVX512F-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
5405 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
5406 ; AVX512F-NEXT: retq
5408 ; AVX512VL-LABEL: trunc_ssat_v8i16_v8i8_store:
5409 ; AVX512VL: # %bb.0:
5410 ; AVX512VL-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
5411 ; AVX512VL-NEXT: vmovq %xmm0, (%rdi)
5412 ; AVX512VL-NEXT: retq
5414 ; AVX512BW-LABEL: trunc_ssat_v8i16_v8i8_store:
5415 ; AVX512BW: # %bb.0:
5416 ; AVX512BW-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
5417 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
5418 ; AVX512BW-NEXT: retq
5420 ; AVX512BWVL-LABEL: trunc_ssat_v8i16_v8i8_store:
5421 ; AVX512BWVL: # %bb.0:
5422 ; AVX512BWVL-NEXT: vpmovswb %xmm0, (%rdi)
5423 ; AVX512BWVL-NEXT: retq
5425 ; SKX-LABEL: trunc_ssat_v8i16_v8i8_store:
5427 ; SKX-NEXT: vpmovswb %xmm0, (%rdi)
5429 %1 = icmp slt <8 x i16> %a0, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
5430 %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>
5431 %3 = icmp sgt <8 x i16> %2, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
5432 %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>
5433 %5 = trunc <8 x i16> %4 to <8 x i8>
5434 store <8 x i8> %5, <8 x i8> *%p1
5438 define <16 x i8> @trunc_ssat_v16i16_v16i8(<16 x i16> %a0) {
5439 ; SSE-LABEL: trunc_ssat_v16i16_v16i8:
5441 ; SSE-NEXT: packsswb %xmm1, %xmm0
5444 ; AVX1-LABEL: trunc_ssat_v16i16_v16i8:
5446 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
5447 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
5448 ; AVX1-NEXT: vzeroupper
5451 ; AVX2-LABEL: trunc_ssat_v16i16_v16i8:
5453 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
5454 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
5455 ; AVX2-NEXT: vzeroupper
5458 ; AVX512F-LABEL: trunc_ssat_v16i16_v16i8:
5460 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1
5461 ; AVX512F-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
5462 ; AVX512F-NEXT: vzeroupper
5463 ; AVX512F-NEXT: retq
5465 ; AVX512VL-LABEL: trunc_ssat_v16i16_v16i8:
5466 ; AVX512VL: # %bb.0:
5467 ; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1
5468 ; AVX512VL-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
5469 ; AVX512VL-NEXT: vzeroupper
5470 ; AVX512VL-NEXT: retq
5472 ; AVX512BW-LABEL: trunc_ssat_v16i16_v16i8:
5473 ; AVX512BW: # %bb.0:
5474 ; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1
5475 ; AVX512BW-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
5476 ; AVX512BW-NEXT: vzeroupper
5477 ; AVX512BW-NEXT: retq
5479 ; AVX512BWVL-LABEL: trunc_ssat_v16i16_v16i8:
5480 ; AVX512BWVL: # %bb.0:
5481 ; AVX512BWVL-NEXT: vpmovswb %ymm0, %xmm0
5482 ; AVX512BWVL-NEXT: vzeroupper
5483 ; AVX512BWVL-NEXT: retq
5485 ; SKX-LABEL: trunc_ssat_v16i16_v16i8:
5487 ; SKX-NEXT: vpmovswb %ymm0, %xmm0
5488 ; SKX-NEXT: vzeroupper
5490 %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>
5491 %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>
5492 %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>
5493 %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>
5494 %5 = trunc <16 x i16> %4 to <16 x i8>
5498 define <32 x i8> @trunc_ssat_v32i16_v32i8(<32 x i16>* %p0) "min-legal-vector-width"="256" {
5499 ; SSE-LABEL: trunc_ssat_v32i16_v32i8:
5501 ; SSE-NEXT: movdqa (%rdi), %xmm0
5502 ; SSE-NEXT: movdqa 32(%rdi), %xmm1
5503 ; SSE-NEXT: packsswb 16(%rdi), %xmm0
5504 ; SSE-NEXT: packsswb 48(%rdi), %xmm1
5507 ; AVX1-LABEL: trunc_ssat_v32i16_v32i8:
5509 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
5510 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm1
5511 ; AVX1-NEXT: vpacksswb 48(%rdi), %xmm1, %xmm1
5512 ; AVX1-NEXT: vpacksswb 16(%rdi), %xmm0, %xmm0
5513 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
5516 ; AVX2-LABEL: trunc_ssat_v32i16_v32i8:
5518 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
5519 ; AVX2-NEXT: vpacksswb 32(%rdi), %ymm0, %ymm0
5520 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
5523 ; AVX512F-LABEL: trunc_ssat_v32i16_v32i8:
5525 ; AVX512F-NEXT: vmovdqa (%rdi), %ymm0
5526 ; AVX512F-NEXT: vpacksswb 32(%rdi), %ymm0, %ymm0
5527 ; AVX512F-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
5528 ; AVX512F-NEXT: retq
5530 ; AVX512VL-LABEL: trunc_ssat_v32i16_v32i8:
5531 ; AVX512VL: # %bb.0:
5532 ; AVX512VL-NEXT: vmovdqa (%rdi), %ymm0
5533 ; AVX512VL-NEXT: vpacksswb 32(%rdi), %ymm0, %ymm0
5534 ; AVX512VL-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
5535 ; AVX512VL-NEXT: retq
5537 ; AVX512BW-LABEL: trunc_ssat_v32i16_v32i8:
5538 ; AVX512BW: # %bb.0:
5539 ; AVX512BW-NEXT: vmovdqa64 (%rdi), %zmm0
5540 ; AVX512BW-NEXT: vpmovswb %zmm0, %ymm0
5541 ; AVX512BW-NEXT: retq
5543 ; AVX512BWVL-LABEL: trunc_ssat_v32i16_v32i8:
5544 ; AVX512BWVL: # %bb.0:
5545 ; AVX512BWVL-NEXT: vmovdqa64 (%rdi), %zmm0
5546 ; AVX512BWVL-NEXT: vpmovswb %zmm0, %ymm0
5547 ; AVX512BWVL-NEXT: retq
5549 ; SKX-LABEL: trunc_ssat_v32i16_v32i8:
5551 ; SKX-NEXT: vmovdqa (%rdi), %ymm0
5552 ; SKX-NEXT: vpacksswb 32(%rdi), %ymm0, %ymm0
5553 ; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
5555 %a0 = load <32 x i16>, <32 x i16>* %p0
5556 %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>
5557 %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>
5558 %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>
5559 %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>
5560 %5 = trunc <32 x i16> %4 to <32 x i8>
5564 define <32 x i8> @trunc_ssat_v32i32_v32i8(<32 x i32>* %p0) "min-legal-vector-width"="256" {
5565 ; SSE-LABEL: trunc_ssat_v32i32_v32i8:
5567 ; SSE-NEXT: movdqa (%rdi), %xmm0
5568 ; SSE-NEXT: movdqa 32(%rdi), %xmm2
5569 ; SSE-NEXT: movdqa 64(%rdi), %xmm1
5570 ; SSE-NEXT: movdqa 96(%rdi), %xmm3
5571 ; SSE-NEXT: packssdw 48(%rdi), %xmm2
5572 ; SSE-NEXT: packssdw 16(%rdi), %xmm0
5573 ; SSE-NEXT: packsswb %xmm2, %xmm0
5574 ; SSE-NEXT: packssdw 112(%rdi), %xmm3
5575 ; SSE-NEXT: packssdw 80(%rdi), %xmm1
5576 ; SSE-NEXT: packsswb %xmm3, %xmm1
5579 ; AVX1-LABEL: trunc_ssat_v32i32_v32i8:
5581 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
5582 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm1
5583 ; AVX1-NEXT: vmovdqa 64(%rdi), %xmm2
5584 ; AVX1-NEXT: vmovdqa 96(%rdi), %xmm3
5585 ; AVX1-NEXT: vpackssdw 112(%rdi), %xmm3, %xmm3
5586 ; AVX1-NEXT: vpackssdw 80(%rdi), %xmm2, %xmm2
5587 ; AVX1-NEXT: vpacksswb %xmm3, %xmm2, %xmm2
5588 ; AVX1-NEXT: vpackssdw 48(%rdi), %xmm1, %xmm1
5589 ; AVX1-NEXT: vpackssdw 16(%rdi), %xmm0, %xmm0
5590 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
5591 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
5594 ; AVX2-LABEL: trunc_ssat_v32i32_v32i8:
5596 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
5597 ; AVX2-NEXT: vmovdqa 64(%rdi), %ymm1
5598 ; AVX2-NEXT: vpackssdw 96(%rdi), %ymm1, %ymm1
5599 ; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
5600 ; AVX2-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm0
5601 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
5602 ; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm0
5603 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
5606 ; AVX512-LABEL: trunc_ssat_v32i32_v32i8:
5608 ; AVX512-NEXT: vmovdqa64 (%rdi), %zmm0
5609 ; AVX512-NEXT: vmovdqa64 64(%rdi), %zmm1
5610 ; AVX512-NEXT: vpmovsdb %zmm0, %xmm0
5611 ; AVX512-NEXT: vpmovsdb %zmm1, %xmm1
5612 ; AVX512-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
5615 ; SKX-LABEL: trunc_ssat_v32i32_v32i8:
5617 ; SKX-NEXT: vmovdqa (%rdi), %ymm0
5618 ; SKX-NEXT: vmovdqa 64(%rdi), %ymm1
5619 ; SKX-NEXT: vpackssdw 96(%rdi), %ymm1, %ymm1
5620 ; SKX-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
5621 ; SKX-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm0
5622 ; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
5623 ; SKX-NEXT: vpacksswb %ymm1, %ymm0, %ymm0
5624 ; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
5626 %a0 = load <32 x i32>, <32 x i32>* %p0
5627 %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>
5628 %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>
5629 %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>
5630 %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>
5631 %5 = trunc <32 x i32> %4 to <32 x i8>
5635 ; This used to crash with avx512 due because we were missing a check for
5636 ; unsupported element types like i24.
5637 define void @trunc_ssat_v16i32_v16i24(<16 x i32> %x, <16 x i24>* %y) nounwind {
5638 ; SSE2-LABEL: trunc_ssat_v16i32_v16i24:
5640 ; SSE2-NEXT: pushq %rbp
5641 ; SSE2-NEXT: pushq %r15
5642 ; SSE2-NEXT: pushq %r14
5643 ; SSE2-NEXT: pushq %r12
5644 ; SSE2-NEXT: pushq %rbx
5645 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [8388607,8388607,8388607,8388607]
5646 ; SSE2-NEXT: movdqa %xmm5, %xmm4
5647 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
5648 ; SSE2-NEXT: pand %xmm4, %xmm3
5649 ; SSE2-NEXT: pandn %xmm5, %xmm4
5650 ; SSE2-NEXT: por %xmm3, %xmm4
5651 ; SSE2-NEXT: movdqa %xmm5, %xmm3
5652 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
5653 ; SSE2-NEXT: pand %xmm3, %xmm2
5654 ; SSE2-NEXT: pandn %xmm5, %xmm3
5655 ; SSE2-NEXT: por %xmm2, %xmm3
5656 ; SSE2-NEXT: movdqa %xmm5, %xmm2
5657 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
5658 ; SSE2-NEXT: pand %xmm2, %xmm1
5659 ; SSE2-NEXT: pandn %xmm5, %xmm2
5660 ; SSE2-NEXT: por %xmm1, %xmm2
5661 ; SSE2-NEXT: movdqa %xmm5, %xmm1
5662 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1
5663 ; SSE2-NEXT: pand %xmm1, %xmm0
5664 ; SSE2-NEXT: pandn %xmm5, %xmm1
5665 ; SSE2-NEXT: por %xmm0, %xmm1
5666 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [4286578688,4286578688,4286578688,4286578688]
5667 ; SSE2-NEXT: movdqa %xmm1, %xmm0
5668 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm0
5669 ; SSE2-NEXT: pand %xmm0, %xmm1
5670 ; SSE2-NEXT: pandn %xmm5, %xmm0
5671 ; SSE2-NEXT: por %xmm1, %xmm0
5672 ; SSE2-NEXT: movdqa %xmm2, %xmm1
5673 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm1
5674 ; SSE2-NEXT: pand %xmm1, %xmm2
5675 ; SSE2-NEXT: pandn %xmm5, %xmm1
5676 ; SSE2-NEXT: por %xmm2, %xmm1
5677 ; SSE2-NEXT: movdqa %xmm3, %xmm2
5678 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm2
5679 ; SSE2-NEXT: pand %xmm2, %xmm3
5680 ; SSE2-NEXT: pandn %xmm5, %xmm2
5681 ; SSE2-NEXT: por %xmm3, %xmm2
5682 ; SSE2-NEXT: movdqa %xmm4, %xmm3
5683 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm3
5684 ; SSE2-NEXT: pand %xmm3, %xmm4
5685 ; SSE2-NEXT: pandn %xmm5, %xmm3
5686 ; SSE2-NEXT: por %xmm4, %xmm3
5687 ; SSE2-NEXT: movd %xmm3, %edx
5688 ; SSE2-NEXT: movw %dx, 36(%rdi)
5689 ; SSE2-NEXT: movd %xmm2, %ecx
5690 ; SSE2-NEXT: movw %cx, 24(%rdi)
5691 ; SSE2-NEXT: movd %xmm1, %eax
5692 ; SSE2-NEXT: movw %ax, 12(%rdi)
5693 ; SSE2-NEXT: movd %xmm0, %r8d
5694 ; SSE2-NEXT: movw %r8w, (%rdi)
5695 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[3,3,3,3]
5696 ; SSE2-NEXT: movd %xmm4, %r9d
5697 ; SSE2-NEXT: movw %r9w, 45(%rdi)
5698 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[2,3,2,3]
5699 ; SSE2-NEXT: movd %xmm4, %r10d
5700 ; SSE2-NEXT: movw %r10w, 42(%rdi)
5701 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,1,1]
5702 ; SSE2-NEXT: movd %xmm3, %r11d
5703 ; SSE2-NEXT: movw %r11w, 39(%rdi)
5704 ; SSE2-NEXT: shrl $16, %edx
5705 ; SSE2-NEXT: movb %dl, 38(%rdi)
5706 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[3,3,3,3]
5707 ; SSE2-NEXT: movd %xmm3, %r14d
5708 ; SSE2-NEXT: movw %r14w, 33(%rdi)
5709 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[2,3,2,3]
5710 ; SSE2-NEXT: movd %xmm3, %r15d
5711 ; SSE2-NEXT: movw %r15w, 30(%rdi)
5712 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,1,1]
5713 ; SSE2-NEXT: movd %xmm2, %r12d
5714 ; SSE2-NEXT: movw %r12w, 27(%rdi)
5715 ; SSE2-NEXT: shrl $16, %ecx
5716 ; SSE2-NEXT: movb %cl, 26(%rdi)
5717 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]
5718 ; SSE2-NEXT: movd %xmm2, %esi
5719 ; SSE2-NEXT: movw %si, 21(%rdi)
5720 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
5721 ; SSE2-NEXT: movd %xmm2, %ebx
5722 ; SSE2-NEXT: movw %bx, 18(%rdi)
5723 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]
5724 ; SSE2-NEXT: movd %xmm1, %ebp
5725 ; SSE2-NEXT: movw %bp, 15(%rdi)
5726 ; SSE2-NEXT: shrl $16, %eax
5727 ; SSE2-NEXT: movb %al, 14(%rdi)
5728 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]
5729 ; SSE2-NEXT: movd %xmm1, %eax
5730 ; SSE2-NEXT: movw %ax, 9(%rdi)
5731 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
5732 ; SSE2-NEXT: movd %xmm1, %ecx
5733 ; SSE2-NEXT: movw %cx, 6(%rdi)
5734 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
5735 ; SSE2-NEXT: movd %xmm0, %edx
5736 ; SSE2-NEXT: movw %dx, 3(%rdi)
5737 ; SSE2-NEXT: shrl $16, %r8d
5738 ; SSE2-NEXT: movb %r8b, 2(%rdi)
5739 ; SSE2-NEXT: shrl $16, %r9d
5740 ; SSE2-NEXT: movb %r9b, 47(%rdi)
5741 ; SSE2-NEXT: shrl $16, %r10d
5742 ; SSE2-NEXT: movb %r10b, 44(%rdi)
5743 ; SSE2-NEXT: shrl $16, %r11d
5744 ; SSE2-NEXT: movb %r11b, 41(%rdi)
5745 ; SSE2-NEXT: shrl $16, %r14d
5746 ; SSE2-NEXT: movb %r14b, 35(%rdi)
5747 ; SSE2-NEXT: shrl $16, %r15d
5748 ; SSE2-NEXT: movb %r15b, 32(%rdi)
5749 ; SSE2-NEXT: shrl $16, %r12d
5750 ; SSE2-NEXT: movb %r12b, 29(%rdi)
5751 ; SSE2-NEXT: shrl $16, %esi
5752 ; SSE2-NEXT: movb %sil, 23(%rdi)
5753 ; SSE2-NEXT: shrl $16, %ebx
5754 ; SSE2-NEXT: movb %bl, 20(%rdi)
5755 ; SSE2-NEXT: shrl $16, %ebp
5756 ; SSE2-NEXT: movb %bpl, 17(%rdi)
5757 ; SSE2-NEXT: shrl $16, %eax
5758 ; SSE2-NEXT: movb %al, 11(%rdi)
5759 ; SSE2-NEXT: shrl $16, %ecx
5760 ; SSE2-NEXT: movb %cl, 8(%rdi)
5761 ; SSE2-NEXT: shrl $16, %edx
5762 ; SSE2-NEXT: movb %dl, 5(%rdi)
5763 ; SSE2-NEXT: popq %rbx
5764 ; SSE2-NEXT: popq %r12
5765 ; SSE2-NEXT: popq %r14
5766 ; SSE2-NEXT: popq %r15
5767 ; SSE2-NEXT: popq %rbp
5770 ; SSSE3-LABEL: trunc_ssat_v16i32_v16i24:
5772 ; SSSE3-NEXT: pushq %rbp
5773 ; SSSE3-NEXT: pushq %r15
5774 ; SSSE3-NEXT: pushq %r14
5775 ; SSSE3-NEXT: pushq %r12
5776 ; SSSE3-NEXT: pushq %rbx
5777 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [8388607,8388607,8388607,8388607]
5778 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
5779 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4
5780 ; SSSE3-NEXT: pand %xmm4, %xmm3
5781 ; SSSE3-NEXT: pandn %xmm5, %xmm4
5782 ; SSSE3-NEXT: por %xmm3, %xmm4
5783 ; SSSE3-NEXT: movdqa %xmm5, %xmm3
5784 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
5785 ; SSSE3-NEXT: pand %xmm3, %xmm2
5786 ; SSSE3-NEXT: pandn %xmm5, %xmm3
5787 ; SSSE3-NEXT: por %xmm2, %xmm3
5788 ; SSSE3-NEXT: movdqa %xmm5, %xmm2
5789 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
5790 ; SSSE3-NEXT: pand %xmm2, %xmm1
5791 ; SSSE3-NEXT: pandn %xmm5, %xmm2
5792 ; SSSE3-NEXT: por %xmm1, %xmm2
5793 ; SSSE3-NEXT: movdqa %xmm5, %xmm1
5794 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm1
5795 ; SSSE3-NEXT: pand %xmm1, %xmm0
5796 ; SSSE3-NEXT: pandn %xmm5, %xmm1
5797 ; SSSE3-NEXT: por %xmm0, %xmm1
5798 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [4286578688,4286578688,4286578688,4286578688]
5799 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
5800 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm0
5801 ; SSSE3-NEXT: pand %xmm0, %xmm1
5802 ; SSSE3-NEXT: pandn %xmm5, %xmm0
5803 ; SSSE3-NEXT: por %xmm1, %xmm0
5804 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
5805 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm1
5806 ; SSSE3-NEXT: pand %xmm1, %xmm2
5807 ; SSSE3-NEXT: pandn %xmm5, %xmm1
5808 ; SSSE3-NEXT: por %xmm2, %xmm1
5809 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
5810 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm2
5811 ; SSSE3-NEXT: pand %xmm2, %xmm3
5812 ; SSSE3-NEXT: pandn %xmm5, %xmm2
5813 ; SSSE3-NEXT: por %xmm3, %xmm2
5814 ; SSSE3-NEXT: movdqa %xmm4, %xmm3
5815 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm3
5816 ; SSSE3-NEXT: pand %xmm3, %xmm4
5817 ; SSSE3-NEXT: pandn %xmm5, %xmm3
5818 ; SSSE3-NEXT: por %xmm4, %xmm3
5819 ; SSSE3-NEXT: movd %xmm3, %edx
5820 ; SSSE3-NEXT: movw %dx, 36(%rdi)
5821 ; SSSE3-NEXT: movd %xmm2, %ecx
5822 ; SSSE3-NEXT: movw %cx, 24(%rdi)
5823 ; SSSE3-NEXT: movd %xmm1, %eax
5824 ; SSSE3-NEXT: movw %ax, 12(%rdi)
5825 ; SSSE3-NEXT: movd %xmm0, %r8d
5826 ; SSSE3-NEXT: movw %r8w, (%rdi)
5827 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[3,3,3,3]
5828 ; SSSE3-NEXT: movd %xmm4, %r9d
5829 ; SSSE3-NEXT: movw %r9w, 45(%rdi)
5830 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[2,3,2,3]
5831 ; SSSE3-NEXT: movd %xmm4, %r10d
5832 ; SSSE3-NEXT: movw %r10w, 42(%rdi)
5833 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,1,1]
5834 ; SSSE3-NEXT: movd %xmm3, %r11d
5835 ; SSSE3-NEXT: movw %r11w, 39(%rdi)
5836 ; SSSE3-NEXT: shrl $16, %edx
5837 ; SSSE3-NEXT: movb %dl, 38(%rdi)
5838 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[3,3,3,3]
5839 ; SSSE3-NEXT: movd %xmm3, %r14d
5840 ; SSSE3-NEXT: movw %r14w, 33(%rdi)
5841 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[2,3,2,3]
5842 ; SSSE3-NEXT: movd %xmm3, %r15d
5843 ; SSSE3-NEXT: movw %r15w, 30(%rdi)
5844 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,1,1]
5845 ; SSSE3-NEXT: movd %xmm2, %r12d
5846 ; SSSE3-NEXT: movw %r12w, 27(%rdi)
5847 ; SSSE3-NEXT: shrl $16, %ecx
5848 ; SSSE3-NEXT: movb %cl, 26(%rdi)
5849 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]
5850 ; SSSE3-NEXT: movd %xmm2, %esi
5851 ; SSSE3-NEXT: movw %si, 21(%rdi)
5852 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
5853 ; SSSE3-NEXT: movd %xmm2, %ebx
5854 ; SSSE3-NEXT: movw %bx, 18(%rdi)
5855 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]
5856 ; SSSE3-NEXT: movd %xmm1, %ebp
5857 ; SSSE3-NEXT: movw %bp, 15(%rdi)
5858 ; SSSE3-NEXT: shrl $16, %eax
5859 ; SSSE3-NEXT: movb %al, 14(%rdi)
5860 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]
5861 ; SSSE3-NEXT: movd %xmm1, %eax
5862 ; SSSE3-NEXT: movw %ax, 9(%rdi)
5863 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
5864 ; SSSE3-NEXT: movd %xmm1, %ecx
5865 ; SSSE3-NEXT: movw %cx, 6(%rdi)
5866 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
5867 ; SSSE3-NEXT: movd %xmm0, %edx
5868 ; SSSE3-NEXT: movw %dx, 3(%rdi)
5869 ; SSSE3-NEXT: shrl $16, %r8d
5870 ; SSSE3-NEXT: movb %r8b, 2(%rdi)
5871 ; SSSE3-NEXT: shrl $16, %r9d
5872 ; SSSE3-NEXT: movb %r9b, 47(%rdi)
5873 ; SSSE3-NEXT: shrl $16, %r10d
5874 ; SSSE3-NEXT: movb %r10b, 44(%rdi)
5875 ; SSSE3-NEXT: shrl $16, %r11d
5876 ; SSSE3-NEXT: movb %r11b, 41(%rdi)
5877 ; SSSE3-NEXT: shrl $16, %r14d
5878 ; SSSE3-NEXT: movb %r14b, 35(%rdi)
5879 ; SSSE3-NEXT: shrl $16, %r15d
5880 ; SSSE3-NEXT: movb %r15b, 32(%rdi)
5881 ; SSSE3-NEXT: shrl $16, %r12d
5882 ; SSSE3-NEXT: movb %r12b, 29(%rdi)
5883 ; SSSE3-NEXT: shrl $16, %esi
5884 ; SSSE3-NEXT: movb %sil, 23(%rdi)
5885 ; SSSE3-NEXT: shrl $16, %ebx
5886 ; SSSE3-NEXT: movb %bl, 20(%rdi)
5887 ; SSSE3-NEXT: shrl $16, %ebp
5888 ; SSSE3-NEXT: movb %bpl, 17(%rdi)
5889 ; SSSE3-NEXT: shrl $16, %eax
5890 ; SSSE3-NEXT: movb %al, 11(%rdi)
5891 ; SSSE3-NEXT: shrl $16, %ecx
5892 ; SSSE3-NEXT: movb %cl, 8(%rdi)
5893 ; SSSE3-NEXT: shrl $16, %edx
5894 ; SSSE3-NEXT: movb %dl, 5(%rdi)
5895 ; SSSE3-NEXT: popq %rbx
5896 ; SSSE3-NEXT: popq %r12
5897 ; SSSE3-NEXT: popq %r14
5898 ; SSSE3-NEXT: popq %r15
5899 ; SSSE3-NEXT: popq %rbp
5902 ; SSE41-LABEL: trunc_ssat_v16i32_v16i24:
5904 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [8388607,8388607,8388607,8388607]
5905 ; SSE41-NEXT: pminsd %xmm4, %xmm3
5906 ; SSE41-NEXT: pminsd %xmm4, %xmm2
5907 ; SSE41-NEXT: pminsd %xmm4, %xmm1
5908 ; SSE41-NEXT: pminsd %xmm4, %xmm0
5909 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [4286578688,4286578688,4286578688,4286578688]
5910 ; SSE41-NEXT: pmaxsd %xmm4, %xmm0
5911 ; SSE41-NEXT: pmaxsd %xmm4, %xmm1
5912 ; SSE41-NEXT: pmaxsd %xmm4, %xmm2
5913 ; SSE41-NEXT: pmaxsd %xmm4, %xmm3
5914 ; SSE41-NEXT: pextrd $3, %xmm3, %eax
5915 ; SSE41-NEXT: movw %ax, 45(%rdi)
5916 ; SSE41-NEXT: shrl $16, %eax
5917 ; SSE41-NEXT: movb %al, 47(%rdi)
5918 ; SSE41-NEXT: pextrd $2, %xmm3, %eax
5919 ; SSE41-NEXT: movw %ax, 42(%rdi)
5920 ; SSE41-NEXT: shrl $16, %eax
5921 ; SSE41-NEXT: movb %al, 44(%rdi)
5922 ; SSE41-NEXT: pextrd $1, %xmm3, %eax
5923 ; SSE41-NEXT: movw %ax, 39(%rdi)
5924 ; SSE41-NEXT: shrl $16, %eax
5925 ; SSE41-NEXT: movb %al, 41(%rdi)
5926 ; SSE41-NEXT: movd %xmm3, %eax
5927 ; SSE41-NEXT: movw %ax, 36(%rdi)
5928 ; SSE41-NEXT: shrl $16, %eax
5929 ; SSE41-NEXT: movb %al, 38(%rdi)
5930 ; SSE41-NEXT: pextrd $3, %xmm2, %eax
5931 ; SSE41-NEXT: movw %ax, 33(%rdi)
5932 ; SSE41-NEXT: shrl $16, %eax
5933 ; SSE41-NEXT: movb %al, 35(%rdi)
5934 ; SSE41-NEXT: pextrd $2, %xmm2, %eax
5935 ; SSE41-NEXT: movw %ax, 30(%rdi)
5936 ; SSE41-NEXT: shrl $16, %eax
5937 ; SSE41-NEXT: movb %al, 32(%rdi)
5938 ; SSE41-NEXT: pextrd $1, %xmm2, %eax
5939 ; SSE41-NEXT: movw %ax, 27(%rdi)
5940 ; SSE41-NEXT: shrl $16, %eax
5941 ; SSE41-NEXT: movb %al, 29(%rdi)
5942 ; SSE41-NEXT: movd %xmm2, %eax
5943 ; SSE41-NEXT: movw %ax, 24(%rdi)
5944 ; SSE41-NEXT: shrl $16, %eax
5945 ; SSE41-NEXT: movb %al, 26(%rdi)
5946 ; SSE41-NEXT: pextrd $3, %xmm1, %eax
5947 ; SSE41-NEXT: movw %ax, 21(%rdi)
5948 ; SSE41-NEXT: shrl $16, %eax
5949 ; SSE41-NEXT: movb %al, 23(%rdi)
5950 ; SSE41-NEXT: pextrd $2, %xmm1, %eax
5951 ; SSE41-NEXT: movw %ax, 18(%rdi)
5952 ; SSE41-NEXT: shrl $16, %eax
5953 ; SSE41-NEXT: movb %al, 20(%rdi)
5954 ; SSE41-NEXT: pextrd $1, %xmm1, %eax
5955 ; SSE41-NEXT: movw %ax, 15(%rdi)
5956 ; SSE41-NEXT: shrl $16, %eax
5957 ; SSE41-NEXT: movb %al, 17(%rdi)
5958 ; SSE41-NEXT: movd %xmm1, %eax
5959 ; SSE41-NEXT: movw %ax, 12(%rdi)
5960 ; SSE41-NEXT: shrl $16, %eax
5961 ; SSE41-NEXT: movb %al, 14(%rdi)
5962 ; SSE41-NEXT: pextrd $3, %xmm0, %eax
5963 ; SSE41-NEXT: movw %ax, 9(%rdi)
5964 ; SSE41-NEXT: shrl $16, %eax
5965 ; SSE41-NEXT: movb %al, 11(%rdi)
5966 ; SSE41-NEXT: pextrd $2, %xmm0, %eax
5967 ; SSE41-NEXT: movw %ax, 6(%rdi)
5968 ; SSE41-NEXT: shrl $16, %eax
5969 ; SSE41-NEXT: movb %al, 8(%rdi)
5970 ; SSE41-NEXT: pextrd $1, %xmm0, %eax
5971 ; SSE41-NEXT: movw %ax, 3(%rdi)
5972 ; SSE41-NEXT: shrl $16, %eax
5973 ; SSE41-NEXT: movb %al, 5(%rdi)
5974 ; SSE41-NEXT: movd %xmm0, %eax
5975 ; SSE41-NEXT: movw %ax, (%rdi)
5976 ; SSE41-NEXT: shrl $16, %eax
5977 ; SSE41-NEXT: movb %al, 2(%rdi)
5980 ; AVX1-LABEL: trunc_ssat_v16i32_v16i24:
5982 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
5983 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [8388607,8388607,8388607,8388607]
5984 ; AVX1-NEXT: vpminsd %xmm3, %xmm2, %xmm4
5985 ; AVX1-NEXT: vpminsd %xmm3, %xmm1, %xmm2
5986 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
5987 ; AVX1-NEXT: vpminsd %xmm3, %xmm1, %xmm1
5988 ; AVX1-NEXT: vpminsd %xmm3, %xmm0, %xmm0
5989 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [4286578688,4286578688,4286578688,4286578688]
5990 ; AVX1-NEXT: vpmaxsd %xmm3, %xmm0, %xmm0
5991 ; AVX1-NEXT: vpmaxsd %xmm3, %xmm1, %xmm1
5992 ; AVX1-NEXT: vpmaxsd %xmm3, %xmm2, %xmm2
5993 ; AVX1-NEXT: vpmaxsd %xmm3, %xmm4, %xmm3
5994 ; AVX1-NEXT: vpextrd $3, %xmm3, %eax
5995 ; AVX1-NEXT: movw %ax, 45(%rdi)
5996 ; AVX1-NEXT: shrl $16, %eax
5997 ; AVX1-NEXT: movb %al, 47(%rdi)
5998 ; AVX1-NEXT: vpextrd $2, %xmm3, %eax
5999 ; AVX1-NEXT: movw %ax, 42(%rdi)
6000 ; AVX1-NEXT: shrl $16, %eax
6001 ; AVX1-NEXT: movb %al, 44(%rdi)
6002 ; AVX1-NEXT: vpextrd $1, %xmm3, %eax
6003 ; AVX1-NEXT: movw %ax, 39(%rdi)
6004 ; AVX1-NEXT: shrl $16, %eax
6005 ; AVX1-NEXT: movb %al, 41(%rdi)
6006 ; AVX1-NEXT: vmovd %xmm3, %eax
6007 ; AVX1-NEXT: movw %ax, 36(%rdi)
6008 ; AVX1-NEXT: shrl $16, %eax
6009 ; AVX1-NEXT: movb %al, 38(%rdi)
6010 ; AVX1-NEXT: vpextrd $3, %xmm2, %eax
6011 ; AVX1-NEXT: movw %ax, 33(%rdi)
6012 ; AVX1-NEXT: shrl $16, %eax
6013 ; AVX1-NEXT: movb %al, 35(%rdi)
6014 ; AVX1-NEXT: vpextrd $2, %xmm2, %eax
6015 ; AVX1-NEXT: movw %ax, 30(%rdi)
6016 ; AVX1-NEXT: shrl $16, %eax
6017 ; AVX1-NEXT: movb %al, 32(%rdi)
6018 ; AVX1-NEXT: vpextrd $1, %xmm2, %eax
6019 ; AVX1-NEXT: movw %ax, 27(%rdi)
6020 ; AVX1-NEXT: shrl $16, %eax
6021 ; AVX1-NEXT: movb %al, 29(%rdi)
6022 ; AVX1-NEXT: vmovd %xmm2, %eax
6023 ; AVX1-NEXT: movw %ax, 24(%rdi)
6024 ; AVX1-NEXT: shrl $16, %eax
6025 ; AVX1-NEXT: movb %al, 26(%rdi)
6026 ; AVX1-NEXT: vpextrd $3, %xmm1, %eax
6027 ; AVX1-NEXT: movw %ax, 21(%rdi)
6028 ; AVX1-NEXT: shrl $16, %eax
6029 ; AVX1-NEXT: movb %al, 23(%rdi)
6030 ; AVX1-NEXT: vpextrd $2, %xmm1, %eax
6031 ; AVX1-NEXT: movw %ax, 18(%rdi)
6032 ; AVX1-NEXT: shrl $16, %eax
6033 ; AVX1-NEXT: movb %al, 20(%rdi)
6034 ; AVX1-NEXT: vpextrd $1, %xmm1, %eax
6035 ; AVX1-NEXT: movw %ax, 15(%rdi)
6036 ; AVX1-NEXT: shrl $16, %eax
6037 ; AVX1-NEXT: movb %al, 17(%rdi)
6038 ; AVX1-NEXT: vmovd %xmm1, %eax
6039 ; AVX1-NEXT: movw %ax, 12(%rdi)
6040 ; AVX1-NEXT: shrl $16, %eax
6041 ; AVX1-NEXT: movb %al, 14(%rdi)
6042 ; AVX1-NEXT: vpextrd $3, %xmm0, %eax
6043 ; AVX1-NEXT: movw %ax, 9(%rdi)
6044 ; AVX1-NEXT: shrl $16, %eax
6045 ; AVX1-NEXT: movb %al, 11(%rdi)
6046 ; AVX1-NEXT: vpextrd $2, %xmm0, %eax
6047 ; AVX1-NEXT: movw %ax, 6(%rdi)
6048 ; AVX1-NEXT: shrl $16, %eax
6049 ; AVX1-NEXT: movb %al, 8(%rdi)
6050 ; AVX1-NEXT: vpextrd $1, %xmm0, %eax
6051 ; AVX1-NEXT: movw %ax, 3(%rdi)
6052 ; AVX1-NEXT: shrl $16, %eax
6053 ; AVX1-NEXT: movb %al, 5(%rdi)
6054 ; AVX1-NEXT: vmovd %xmm0, %eax
6055 ; AVX1-NEXT: movw %ax, (%rdi)
6056 ; AVX1-NEXT: shrl $16, %eax
6057 ; AVX1-NEXT: movb %al, 2(%rdi)
6058 ; AVX1-NEXT: vzeroupper
6061 ; AVX2-LABEL: trunc_ssat_v16i32_v16i24:
6063 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [8388607,8388607,8388607,8388607,8388607,8388607,8388607,8388607]
6064 ; AVX2-NEXT: vpminsd %ymm2, %ymm1, %ymm1
6065 ; AVX2-NEXT: vpminsd %ymm2, %ymm0, %ymm0
6066 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [4286578688,4286578688,4286578688,4286578688,4286578688,4286578688,4286578688,4286578688]
6067 ; AVX2-NEXT: vpmaxsd %ymm2, %ymm0, %ymm0
6068 ; AVX2-NEXT: vpmaxsd %ymm2, %ymm1, %ymm1
6069 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
6070 ; AVX2-NEXT: vpextrd $3, %xmm2, %eax
6071 ; AVX2-NEXT: movw %ax, 45(%rdi)
6072 ; AVX2-NEXT: shrl $16, %eax
6073 ; AVX2-NEXT: movb %al, 47(%rdi)
6074 ; AVX2-NEXT: vpextrd $2, %xmm2, %eax
6075 ; AVX2-NEXT: movw %ax, 42(%rdi)
6076 ; AVX2-NEXT: shrl $16, %eax
6077 ; AVX2-NEXT: movb %al, 44(%rdi)
6078 ; AVX2-NEXT: vpextrd $1, %xmm2, %eax
6079 ; AVX2-NEXT: movw %ax, 39(%rdi)
6080 ; AVX2-NEXT: shrl $16, %eax
6081 ; AVX2-NEXT: movb %al, 41(%rdi)
6082 ; AVX2-NEXT: vmovd %xmm2, %eax
6083 ; AVX2-NEXT: movw %ax, 36(%rdi)
6084 ; AVX2-NEXT: shrl $16, %eax
6085 ; AVX2-NEXT: movb %al, 38(%rdi)
6086 ; AVX2-NEXT: vpextrd $3, %xmm1, %eax
6087 ; AVX2-NEXT: movw %ax, 33(%rdi)
6088 ; AVX2-NEXT: shrl $16, %eax
6089 ; AVX2-NEXT: movb %al, 35(%rdi)
6090 ; AVX2-NEXT: vpextrd $2, %xmm1, %eax
6091 ; AVX2-NEXT: movw %ax, 30(%rdi)
6092 ; AVX2-NEXT: shrl $16, %eax
6093 ; AVX2-NEXT: movb %al, 32(%rdi)
6094 ; AVX2-NEXT: vpextrd $1, %xmm1, %eax
6095 ; AVX2-NEXT: movw %ax, 27(%rdi)
6096 ; AVX2-NEXT: shrl $16, %eax
6097 ; AVX2-NEXT: movb %al, 29(%rdi)
6098 ; AVX2-NEXT: vmovd %xmm1, %eax
6099 ; AVX2-NEXT: movw %ax, 24(%rdi)
6100 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
6101 ; AVX2-NEXT: shrl $16, %eax
6102 ; AVX2-NEXT: movb %al, 26(%rdi)
6103 ; AVX2-NEXT: vpextrd $3, %xmm1, %eax
6104 ; AVX2-NEXT: movw %ax, 21(%rdi)
6105 ; AVX2-NEXT: shrl $16, %eax
6106 ; AVX2-NEXT: movb %al, 23(%rdi)
6107 ; AVX2-NEXT: vpextrd $2, %xmm1, %eax
6108 ; AVX2-NEXT: movw %ax, 18(%rdi)
6109 ; AVX2-NEXT: shrl $16, %eax
6110 ; AVX2-NEXT: movb %al, 20(%rdi)
6111 ; AVX2-NEXT: vpextrd $1, %xmm1, %eax
6112 ; AVX2-NEXT: movw %ax, 15(%rdi)
6113 ; AVX2-NEXT: shrl $16, %eax
6114 ; AVX2-NEXT: movb %al, 17(%rdi)
6115 ; AVX2-NEXT: vmovd %xmm1, %eax
6116 ; AVX2-NEXT: movw %ax, 12(%rdi)
6117 ; AVX2-NEXT: shrl $16, %eax
6118 ; AVX2-NEXT: movb %al, 14(%rdi)
6119 ; AVX2-NEXT: vpextrd $3, %xmm0, %eax
6120 ; AVX2-NEXT: movw %ax, 9(%rdi)
6121 ; AVX2-NEXT: shrl $16, %eax
6122 ; AVX2-NEXT: movb %al, 11(%rdi)
6123 ; AVX2-NEXT: vpextrd $2, %xmm0, %eax
6124 ; AVX2-NEXT: movw %ax, 6(%rdi)
6125 ; AVX2-NEXT: shrl $16, %eax
6126 ; AVX2-NEXT: movb %al, 8(%rdi)
6127 ; AVX2-NEXT: vpextrd $1, %xmm0, %eax
6128 ; AVX2-NEXT: movw %ax, 3(%rdi)
6129 ; AVX2-NEXT: shrl $16, %eax
6130 ; AVX2-NEXT: movb %al, 5(%rdi)
6131 ; AVX2-NEXT: vmovd %xmm0, %eax
6132 ; AVX2-NEXT: movw %ax, (%rdi)
6133 ; AVX2-NEXT: shrl $16, %eax
6134 ; AVX2-NEXT: movb %al, 2(%rdi)
6135 ; AVX2-NEXT: vzeroupper
6138 ; AVX512-LABEL: trunc_ssat_v16i32_v16i24:
6140 ; AVX512-NEXT: pushq %rbp
6141 ; AVX512-NEXT: pushq %r15
6142 ; AVX512-NEXT: pushq %r14
6143 ; AVX512-NEXT: pushq %rbx
6144 ; AVX512-NEXT: vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
6145 ; AVX512-NEXT: vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
6146 ; AVX512-NEXT: vextracti32x4 $3, %zmm0, %xmm1
6147 ; AVX512-NEXT: vpextrd $3, %xmm1, %ecx
6148 ; AVX512-NEXT: movw %cx, 45(%rdi)
6149 ; AVX512-NEXT: vpextrd $2, %xmm1, %eax
6150 ; AVX512-NEXT: movw %ax, 42(%rdi)
6151 ; AVX512-NEXT: vpextrd $1, %xmm1, %ebp
6152 ; AVX512-NEXT: movw %bp, 39(%rdi)
6153 ; AVX512-NEXT: vmovd %xmm1, %esi
6154 ; AVX512-NEXT: movw %si, 36(%rdi)
6155 ; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm1
6156 ; AVX512-NEXT: vpextrd $3, %xmm1, %ebx
6157 ; AVX512-NEXT: movw %bx, 33(%rdi)
6158 ; AVX512-NEXT: vpextrd $2, %xmm1, %edx
6159 ; AVX512-NEXT: movw %dx, 30(%rdi)
6160 ; AVX512-NEXT: vpextrd $1, %xmm1, %r15d
6161 ; AVX512-NEXT: movw %r15w, 27(%rdi)
6162 ; AVX512-NEXT: vmovd %xmm1, %r14d
6163 ; AVX512-NEXT: movw %r14w, 24(%rdi)
6164 ; AVX512-NEXT: vpextrd $3, %xmm0, %r11d
6165 ; AVX512-NEXT: movw %r11w, 9(%rdi)
6166 ; AVX512-NEXT: vpextrd $2, %xmm0, %r10d
6167 ; AVX512-NEXT: movw %r10w, 6(%rdi)
6168 ; AVX512-NEXT: vpextrd $1, %xmm0, %r9d
6169 ; AVX512-NEXT: movw %r9w, 3(%rdi)
6170 ; AVX512-NEXT: vmovd %xmm0, %r8d
6171 ; AVX512-NEXT: movw %r8w, (%rdi)
6172 ; AVX512-NEXT: shrl $16, %ecx
6173 ; AVX512-NEXT: movb %cl, 47(%rdi)
6174 ; AVX512-NEXT: shrl $16, %eax
6175 ; AVX512-NEXT: movb %al, 44(%rdi)
6176 ; AVX512-NEXT: shrl $16, %ebp
6177 ; AVX512-NEXT: movb %bpl, 41(%rdi)
6178 ; AVX512-NEXT: shrl $16, %esi
6179 ; AVX512-NEXT: movb %sil, 38(%rdi)
6180 ; AVX512-NEXT: shrl $16, %ebx
6181 ; AVX512-NEXT: movb %bl, 35(%rdi)
6182 ; AVX512-NEXT: shrl $16, %edx
6183 ; AVX512-NEXT: movb %dl, 32(%rdi)
6184 ; AVX512-NEXT: shrl $16, %r15d
6185 ; AVX512-NEXT: movb %r15b, 29(%rdi)
6186 ; AVX512-NEXT: shrl $16, %r14d
6187 ; AVX512-NEXT: movb %r14b, 26(%rdi)
6188 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm0
6189 ; AVX512-NEXT: vpextrd $3, %xmm0, %edx
6190 ; AVX512-NEXT: movw %dx, 21(%rdi)
6191 ; AVX512-NEXT: vpextrd $2, %xmm0, %esi
6192 ; AVX512-NEXT: movw %si, 18(%rdi)
6193 ; AVX512-NEXT: vpextrd $1, %xmm0, %ecx
6194 ; AVX512-NEXT: movw %cx, 15(%rdi)
6195 ; AVX512-NEXT: vmovd %xmm0, %eax
6196 ; AVX512-NEXT: movw %ax, 12(%rdi)
6197 ; AVX512-NEXT: shrl $16, %r11d
6198 ; AVX512-NEXT: movb %r11b, 11(%rdi)
6199 ; AVX512-NEXT: shrl $16, %r10d
6200 ; AVX512-NEXT: movb %r10b, 8(%rdi)
6201 ; AVX512-NEXT: shrl $16, %r9d
6202 ; AVX512-NEXT: movb %r9b, 5(%rdi)
6203 ; AVX512-NEXT: shrl $16, %r8d
6204 ; AVX512-NEXT: movb %r8b, 2(%rdi)
6205 ; AVX512-NEXT: shrl $16, %edx
6206 ; AVX512-NEXT: movb %dl, 23(%rdi)
6207 ; AVX512-NEXT: shrl $16, %esi
6208 ; AVX512-NEXT: movb %sil, 20(%rdi)
6209 ; AVX512-NEXT: shrl $16, %ecx
6210 ; AVX512-NEXT: movb %cl, 17(%rdi)
6211 ; AVX512-NEXT: shrl $16, %eax
6212 ; AVX512-NEXT: movb %al, 14(%rdi)
6213 ; AVX512-NEXT: popq %rbx
6214 ; AVX512-NEXT: popq %r14
6215 ; AVX512-NEXT: popq %r15
6216 ; AVX512-NEXT: popq %rbp
6217 ; AVX512-NEXT: vzeroupper
6220 ; SKX-LABEL: trunc_ssat_v16i32_v16i24:
6222 ; SKX-NEXT: pushq %rbp
6223 ; SKX-NEXT: pushq %r15
6224 ; SKX-NEXT: pushq %r14
6225 ; SKX-NEXT: pushq %rbx
6226 ; SKX-NEXT: vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
6227 ; SKX-NEXT: vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
6228 ; SKX-NEXT: vextracti32x4 $3, %zmm0, %xmm1
6229 ; SKX-NEXT: vpextrd $3, %xmm1, %ecx
6230 ; SKX-NEXT: movw %cx, 45(%rdi)
6231 ; SKX-NEXT: vpextrd $2, %xmm1, %eax
6232 ; SKX-NEXT: movw %ax, 42(%rdi)
6233 ; SKX-NEXT: vpextrd $1, %xmm1, %ebp
6234 ; SKX-NEXT: movw %bp, 39(%rdi)
6235 ; SKX-NEXT: vmovd %xmm1, %esi
6236 ; SKX-NEXT: movw %si, 36(%rdi)
6237 ; SKX-NEXT: vextracti32x4 $2, %zmm0, %xmm1
6238 ; SKX-NEXT: vpextrd $3, %xmm1, %ebx
6239 ; SKX-NEXT: movw %bx, 33(%rdi)
6240 ; SKX-NEXT: vpextrd $2, %xmm1, %edx
6241 ; SKX-NEXT: movw %dx, 30(%rdi)
6242 ; SKX-NEXT: vpextrd $1, %xmm1, %r15d
6243 ; SKX-NEXT: movw %r15w, 27(%rdi)
6244 ; SKX-NEXT: vmovd %xmm1, %r14d
6245 ; SKX-NEXT: vpextrd $3, %xmm0, %r11d
6246 ; SKX-NEXT: movw %r14w, 24(%rdi)
6247 ; SKX-NEXT: movw %r11w, 9(%rdi)
6248 ; SKX-NEXT: vpextrd $2, %xmm0, %r10d
6249 ; SKX-NEXT: vpextrd $1, %xmm0, %r9d
6250 ; SKX-NEXT: movw %r10w, 6(%rdi)
6251 ; SKX-NEXT: movw %r9w, 3(%rdi)
6252 ; SKX-NEXT: vmovd %xmm0, %r8d
6253 ; SKX-NEXT: movw %r8w, (%rdi)
6254 ; SKX-NEXT: shrl $16, %ecx
6255 ; SKX-NEXT: movb %cl, 47(%rdi)
6256 ; SKX-NEXT: shrl $16, %eax
6257 ; SKX-NEXT: movb %al, 44(%rdi)
6258 ; SKX-NEXT: shrl $16, %ebp
6259 ; SKX-NEXT: movb %bpl, 41(%rdi)
6260 ; SKX-NEXT: shrl $16, %esi
6261 ; SKX-NEXT: movb %sil, 38(%rdi)
6262 ; SKX-NEXT: shrl $16, %ebx
6263 ; SKX-NEXT: movb %bl, 35(%rdi)
6264 ; SKX-NEXT: shrl $16, %edx
6265 ; SKX-NEXT: movb %dl, 32(%rdi)
6266 ; SKX-NEXT: shrl $16, %r15d
6267 ; SKX-NEXT: movb %r15b, 29(%rdi)
6268 ; SKX-NEXT: shrl $16, %r14d
6269 ; SKX-NEXT: movb %r14b, 26(%rdi)
6270 ; SKX-NEXT: vextracti128 $1, %ymm0, %xmm0
6271 ; SKX-NEXT: vpextrd $3, %xmm0, %edx
6272 ; SKX-NEXT: movw %dx, 21(%rdi)
6273 ; SKX-NEXT: vpextrd $2, %xmm0, %esi
6274 ; SKX-NEXT: movw %si, 18(%rdi)
6275 ; SKX-NEXT: vpextrd $1, %xmm0, %ecx
6276 ; SKX-NEXT: movw %cx, 15(%rdi)
6277 ; SKX-NEXT: vmovd %xmm0, %eax
6278 ; SKX-NEXT: movw %ax, 12(%rdi)
6279 ; SKX-NEXT: shrl $16, %r11d
6280 ; SKX-NEXT: movb %r11b, 11(%rdi)
6281 ; SKX-NEXT: shrl $16, %r10d
6282 ; SKX-NEXT: movb %r10b, 8(%rdi)
6283 ; SKX-NEXT: shrl $16, %r9d
6284 ; SKX-NEXT: movb %r9b, 5(%rdi)
6285 ; SKX-NEXT: shrl $16, %r8d
6286 ; SKX-NEXT: movb %r8b, 2(%rdi)
6287 ; SKX-NEXT: shrl $16, %edx
6288 ; SKX-NEXT: movb %dl, 23(%rdi)
6289 ; SKX-NEXT: shrl $16, %esi
6290 ; SKX-NEXT: movb %sil, 20(%rdi)
6291 ; SKX-NEXT: shrl $16, %ecx
6292 ; SKX-NEXT: movb %cl, 17(%rdi)
6293 ; SKX-NEXT: shrl $16, %eax
6294 ; SKX-NEXT: movb %al, 14(%rdi)
6295 ; SKX-NEXT: popq %rbx
6296 ; SKX-NEXT: popq %r14
6297 ; SKX-NEXT: popq %r15
6298 ; SKX-NEXT: popq %rbp
6299 ; SKX-NEXT: vzeroupper
6301 %a = call <16 x i32> @llvm.smin.v16i32(<16 x i32> %x, <16 x i32> <i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607>)
6302 %b = call <16 x i32> @llvm.smax.v16i32(<16 x i32> %a, <16 x i32> <i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608>)
6303 %c = trunc <16 x i32> %b to <16 x i24>
6304 store <16 x i24> %c, <16 x i24>* %y
6307 declare <16 x i32> @llvm.smax.v16i32(<16 x i32>, <16 x i32>)
6308 declare <16 x i32> @llvm.smin.v16i32(<16 x i32>, <16 x i32>)