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-prefixes=SSE,SSE2-SSSE3,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE,SSE2-SSSE3,SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,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-prefixes=AVX512,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 ; PACKUS saturation truncation to vXi32
22 define <2 x i32> @trunc_packus_v2i64_v2i32(<2 x i64> %a0) {
23 ; SSE2-SSSE3-LABEL: trunc_packus_v2i64_v2i32:
24 ; SSE2-SSSE3: # %bb.0:
25 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
26 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm2
27 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm2
28 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
29 ; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm4
30 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm4
31 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483647,2147483647]
32 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
33 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
34 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2
35 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
36 ; SSE2-SSSE3-NEXT: por %xmm2, %xmm3
37 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm0
38 ; SSE2-SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
39 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm3
40 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm0
41 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm0
42 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm2
43 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
44 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0
45 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
46 ; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0
47 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
48 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm1
49 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm1
50 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
51 ; SSE2-SSSE3-NEXT: retq
53 ; SSE41-LABEL: trunc_packus_v2i64_v2i32:
55 ; SSE41-NEXT: movdqa %xmm0, %xmm1
56 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [4294967295,4294967295]
57 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
58 ; SSE41-NEXT: pxor %xmm3, %xmm0
59 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147483647,2147483647]
60 ; SSE41-NEXT: movdqa %xmm4, %xmm5
61 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
62 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
63 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
64 ; SSE41-NEXT: pand %xmm5, %xmm0
65 ; SSE41-NEXT: por %xmm4, %xmm0
66 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
67 ; SSE41-NEXT: xorpd %xmm1, %xmm1
68 ; SSE41-NEXT: movapd %xmm2, %xmm4
69 ; SSE41-NEXT: xorpd %xmm3, %xmm4
70 ; SSE41-NEXT: movapd %xmm4, %xmm5
71 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm5
72 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
73 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
74 ; SSE41-NEXT: pand %xmm5, %xmm0
75 ; SSE41-NEXT: por %xmm4, %xmm0
76 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
77 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
80 ; AVX1-LABEL: trunc_packus_v2i64_v2i32:
82 ; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [4294967295,4294967295]
83 ; AVX1-NEXT: # xmm1 = mem[0,0]
84 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
85 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
86 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
87 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1
88 ; AVX1-NEXT: vpand %xmm0, %xmm1, %xmm0
89 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
92 ; AVX2-LABEL: trunc_packus_v2i64_v2i32:
94 ; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm1 = [4294967295,4294967295]
95 ; AVX2-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
96 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
97 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
98 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1
99 ; AVX2-NEXT: vpand %xmm0, %xmm1, %xmm0
100 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
103 ; AVX512F-LABEL: trunc_packus_v2i64_v2i32:
105 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
106 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1
107 ; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
108 ; AVX512F-NEXT: vpmovusqd %zmm0, %ymm0
109 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
110 ; AVX512F-NEXT: vzeroupper
113 ; AVX512VL-LABEL: trunc_packus_v2i64_v2i32:
115 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
116 ; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
117 ; AVX512VL-NEXT: vpmovusqd %xmm0, %xmm0
118 ; AVX512VL-NEXT: retq
120 ; AVX512BW-LABEL: trunc_packus_v2i64_v2i32:
122 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
123 ; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1
124 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
125 ; AVX512BW-NEXT: vpmovusqd %zmm0, %ymm0
126 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
127 ; AVX512BW-NEXT: vzeroupper
128 ; AVX512BW-NEXT: retq
130 ; AVX512BWVL-LABEL: trunc_packus_v2i64_v2i32:
131 ; AVX512BWVL: # %bb.0:
132 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
133 ; AVX512BWVL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
134 ; AVX512BWVL-NEXT: vpmovusqd %xmm0, %xmm0
135 ; AVX512BWVL-NEXT: retq
137 ; SKX-LABEL: trunc_packus_v2i64_v2i32:
139 ; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1
140 ; SKX-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
141 ; SKX-NEXT: vpmovusqd %xmm0, %xmm0
143 %1 = icmp slt <2 x i64> %a0, <i64 4294967295, i64 4294967295>
144 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 4294967295, i64 4294967295>
145 %3 = icmp sgt <2 x i64> %2, zeroinitializer
146 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> zeroinitializer
147 %5 = trunc <2 x i64> %4 to <2 x i32>
151 define void @trunc_packus_v2i64_v2i32_store(<2 x i64> %a0, ptr %p1) {
152 ; SSE2-SSSE3-LABEL: trunc_packus_v2i64_v2i32_store:
153 ; SSE2-SSSE3: # %bb.0:
154 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
155 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm2
156 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm2
157 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
158 ; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm4
159 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm4
160 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483647,2147483647]
161 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
162 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
163 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2
164 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
165 ; SSE2-SSSE3-NEXT: por %xmm2, %xmm3
166 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm0
167 ; SSE2-SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
168 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm3
169 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm0
170 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm0
171 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm2
172 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
173 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0
174 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
175 ; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0
176 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
177 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm1
178 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm1
179 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
180 ; SSE2-SSSE3-NEXT: movq %xmm0, (%rdi)
181 ; SSE2-SSSE3-NEXT: retq
183 ; SSE41-LABEL: trunc_packus_v2i64_v2i32_store:
185 ; SSE41-NEXT: movdqa %xmm0, %xmm1
186 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [4294967295,4294967295]
187 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
188 ; SSE41-NEXT: pxor %xmm3, %xmm0
189 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147483647,2147483647]
190 ; SSE41-NEXT: movdqa %xmm4, %xmm5
191 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
192 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
193 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
194 ; SSE41-NEXT: pand %xmm5, %xmm0
195 ; SSE41-NEXT: por %xmm4, %xmm0
196 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
197 ; SSE41-NEXT: xorpd %xmm1, %xmm1
198 ; SSE41-NEXT: movapd %xmm2, %xmm4
199 ; SSE41-NEXT: xorpd %xmm3, %xmm4
200 ; SSE41-NEXT: movapd %xmm4, %xmm5
201 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm5
202 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
203 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
204 ; SSE41-NEXT: pand %xmm5, %xmm0
205 ; SSE41-NEXT: por %xmm4, %xmm0
206 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
207 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
208 ; SSE41-NEXT: movq %xmm0, (%rdi)
211 ; AVX1-LABEL: trunc_packus_v2i64_v2i32_store:
213 ; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [4294967295,4294967295]
214 ; AVX1-NEXT: # xmm1 = mem[0,0]
215 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
216 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
217 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
218 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1
219 ; AVX1-NEXT: vpand %xmm0, %xmm1, %xmm0
220 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
221 ; AVX1-NEXT: vmovq %xmm0, (%rdi)
224 ; AVX2-LABEL: trunc_packus_v2i64_v2i32_store:
226 ; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm1 = [4294967295,4294967295]
227 ; AVX2-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
228 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
229 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
230 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1
231 ; AVX2-NEXT: vpand %xmm0, %xmm1, %xmm0
232 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
233 ; AVX2-NEXT: vmovq %xmm0, (%rdi)
236 ; AVX512F-LABEL: trunc_packus_v2i64_v2i32_store:
238 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
239 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1
240 ; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
241 ; AVX512F-NEXT: vpmovusqd %zmm0, %ymm0
242 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
243 ; AVX512F-NEXT: vzeroupper
246 ; AVX512VL-LABEL: trunc_packus_v2i64_v2i32_store:
248 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
249 ; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
250 ; AVX512VL-NEXT: vpmovusqd %xmm0, (%rdi)
251 ; AVX512VL-NEXT: retq
253 ; AVX512BW-LABEL: trunc_packus_v2i64_v2i32_store:
255 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
256 ; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1
257 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
258 ; AVX512BW-NEXT: vpmovusqd %zmm0, %ymm0
259 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
260 ; AVX512BW-NEXT: vzeroupper
261 ; AVX512BW-NEXT: retq
263 ; AVX512BWVL-LABEL: trunc_packus_v2i64_v2i32_store:
264 ; AVX512BWVL: # %bb.0:
265 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
266 ; AVX512BWVL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
267 ; AVX512BWVL-NEXT: vpmovusqd %xmm0, (%rdi)
268 ; AVX512BWVL-NEXT: retq
270 ; SKX-LABEL: trunc_packus_v2i64_v2i32_store:
272 ; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1
273 ; SKX-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
274 ; SKX-NEXT: vpmovusqd %xmm0, (%rdi)
276 %1 = icmp slt <2 x i64> %a0, <i64 4294967295, i64 4294967295>
277 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 4294967295, i64 4294967295>
278 %3 = icmp sgt <2 x i64> %2, zeroinitializer
279 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> zeroinitializer
280 %5 = trunc <2 x i64> %4 to <2 x i32>
281 store <2 x i32> %5, ptr %p1
285 define <4 x i32> @trunc_packus_v4i64_v4i32(<4 x i64> %a0) {
286 ; SSE2-SSSE3-LABEL: trunc_packus_v4i64_v4i32:
287 ; SSE2-SSSE3: # %bb.0:
288 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [4294967295,4294967295]
289 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
290 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm4
291 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm4
292 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
293 ; SSE2-SSSE3-NEXT: pxor %xmm6, %xmm6
294 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm5
295 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [2147483647,2147483647]
296 ; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm8
297 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm8
298 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm8[0,0,2,2]
299 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm4
300 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]
301 ; SSE2-SSSE3-NEXT: por %xmm4, %xmm5
302 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm0
303 ; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm5
304 ; SSE2-SSSE3-NEXT: por %xmm5, %xmm0
305 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm4
306 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm4
307 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
308 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm5
309 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm7
310 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
311 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm4
312 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
313 ; SSE2-SSSE3-NEXT: por %xmm4, %xmm5
314 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1
315 ; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm5
316 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm5
317 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm1
318 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm1
319 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm3
320 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
321 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm1
322 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
323 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm1
324 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
325 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm3
326 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm3
327 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm1
328 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm1
329 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm4
330 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
331 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm1
332 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
333 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm1
334 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
335 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm2
336 ; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0
337 ; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
338 ; SSE2-SSSE3-NEXT: retq
340 ; SSE41-LABEL: trunc_packus_v4i64_v4i32:
342 ; SSE41-NEXT: movdqa %xmm0, %xmm2
343 ; SSE41-NEXT: movapd {{.*#+}} xmm4 = [4294967295,4294967295]
344 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
345 ; SSE41-NEXT: pxor %xmm3, %xmm0
346 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [2147483647,2147483647]
347 ; SSE41-NEXT: movdqa %xmm6, %xmm5
348 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
349 ; SSE41-NEXT: movdqa %xmm6, %xmm7
350 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
351 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
352 ; SSE41-NEXT: pand %xmm5, %xmm0
353 ; SSE41-NEXT: por %xmm7, %xmm0
354 ; SSE41-NEXT: movapd %xmm4, %xmm5
355 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5
356 ; SSE41-NEXT: movdqa %xmm1, %xmm0
357 ; SSE41-NEXT: pxor %xmm3, %xmm0
358 ; SSE41-NEXT: movdqa %xmm6, %xmm2
359 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
360 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
361 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
362 ; SSE41-NEXT: pand %xmm2, %xmm0
363 ; SSE41-NEXT: por %xmm6, %xmm0
364 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4
365 ; SSE41-NEXT: xorpd %xmm1, %xmm1
366 ; SSE41-NEXT: movapd %xmm4, %xmm2
367 ; SSE41-NEXT: xorpd %xmm3, %xmm2
368 ; SSE41-NEXT: movapd %xmm2, %xmm6
369 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm6
370 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm2
371 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
372 ; SSE41-NEXT: pand %xmm6, %xmm0
373 ; SSE41-NEXT: por %xmm2, %xmm0
374 ; SSE41-NEXT: pxor %xmm2, %xmm2
375 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2
376 ; SSE41-NEXT: movapd %xmm5, %xmm4
377 ; SSE41-NEXT: xorpd %xmm3, %xmm4
378 ; SSE41-NEXT: movapd %xmm4, %xmm6
379 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm6
380 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
381 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
382 ; SSE41-NEXT: pand %xmm6, %xmm0
383 ; SSE41-NEXT: por %xmm4, %xmm0
384 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1
385 ; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
386 ; SSE41-NEXT: movaps %xmm1, %xmm0
389 ; AVX1-LABEL: trunc_packus_v4i64_v4i32:
391 ; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [4294967295,4294967295]
392 ; AVX1-NEXT: # xmm1 = mem[0,0]
393 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
394 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm2
395 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
396 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm3
397 ; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
398 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
399 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm3
400 ; AVX1-NEXT: vpand %xmm0, %xmm3, %xmm0
401 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm1
402 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
403 ; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm1[0,2],xmm0[0,2]
404 ; AVX1-NEXT: vzeroupper
407 ; AVX2-SLOW-LABEL: trunc_packus_v4i64_v4i32:
408 ; AVX2-SLOW: # %bb.0:
409 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
410 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
411 ; AVX2-SLOW-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
412 ; AVX2-SLOW-NEXT: vpxor %xmm1, %xmm1, %xmm1
413 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm1
414 ; AVX2-SLOW-NEXT: vpand %ymm0, %ymm1, %ymm0
415 ; AVX2-SLOW-NEXT: vextracti128 $1, %ymm0, %xmm1
416 ; AVX2-SLOW-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
417 ; AVX2-SLOW-NEXT: vzeroupper
418 ; AVX2-SLOW-NEXT: retq
420 ; AVX2-FAST-ALL-LABEL: trunc_packus_v4i64_v4i32:
421 ; AVX2-FAST-ALL: # %bb.0:
422 ; AVX2-FAST-ALL-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
423 ; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
424 ; AVX2-FAST-ALL-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
425 ; AVX2-FAST-ALL-NEXT: vpxor %xmm1, %xmm1, %xmm1
426 ; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm1
427 ; AVX2-FAST-ALL-NEXT: vpand %ymm0, %ymm1, %ymm0
428 ; AVX2-FAST-ALL-NEXT: vbroadcasti128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]
429 ; AVX2-FAST-ALL-NEXT: # ymm1 = mem[0,1,0,1]
430 ; AVX2-FAST-ALL-NEXT: vpermd %ymm0, %ymm1, %ymm0
431 ; AVX2-FAST-ALL-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
432 ; AVX2-FAST-ALL-NEXT: vzeroupper
433 ; AVX2-FAST-ALL-NEXT: retq
435 ; AVX2-FAST-PERLANE-LABEL: trunc_packus_v4i64_v4i32:
436 ; AVX2-FAST-PERLANE: # %bb.0:
437 ; AVX2-FAST-PERLANE-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,4294967295]
438 ; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
439 ; AVX2-FAST-PERLANE-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
440 ; AVX2-FAST-PERLANE-NEXT: vpxor %xmm1, %xmm1, %xmm1
441 ; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm1
442 ; AVX2-FAST-PERLANE-NEXT: vpand %ymm0, %ymm1, %ymm0
443 ; AVX2-FAST-PERLANE-NEXT: vextracti128 $1, %ymm0, %xmm1
444 ; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
445 ; AVX2-FAST-PERLANE-NEXT: vzeroupper
446 ; AVX2-FAST-PERLANE-NEXT: retq
448 ; AVX512F-LABEL: trunc_packus_v4i64_v4i32:
450 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
451 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1
452 ; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
453 ; AVX512F-NEXT: vpmovusqd %zmm0, %ymm0
454 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
455 ; AVX512F-NEXT: vzeroupper
458 ; AVX512VL-LABEL: trunc_packus_v4i64_v4i32:
460 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
461 ; AVX512VL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0
462 ; AVX512VL-NEXT: vpmovusqd %ymm0, %xmm0
463 ; AVX512VL-NEXT: vzeroupper
464 ; AVX512VL-NEXT: retq
466 ; AVX512BW-LABEL: trunc_packus_v4i64_v4i32:
468 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
469 ; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1
470 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
471 ; AVX512BW-NEXT: vpmovusqd %zmm0, %ymm0
472 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
473 ; AVX512BW-NEXT: vzeroupper
474 ; AVX512BW-NEXT: retq
476 ; AVX512BWVL-LABEL: trunc_packus_v4i64_v4i32:
477 ; AVX512BWVL: # %bb.0:
478 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
479 ; AVX512BWVL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0
480 ; AVX512BWVL-NEXT: vpmovusqd %ymm0, %xmm0
481 ; AVX512BWVL-NEXT: vzeroupper
482 ; AVX512BWVL-NEXT: retq
484 ; SKX-LABEL: trunc_packus_v4i64_v4i32:
486 ; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1
487 ; SKX-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0
488 ; SKX-NEXT: vpmovusqd %ymm0, %xmm0
489 ; SKX-NEXT: vzeroupper
491 %1 = icmp slt <4 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
492 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
493 %3 = icmp sgt <4 x i64> %2, zeroinitializer
494 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> zeroinitializer
495 %5 = trunc <4 x i64> %4 to <4 x i32>
500 define <8 x i32> @trunc_packus_v8i64_v8i32(ptr %p0) "min-legal-vector-width"="256" {
501 ; SSE2-SSSE3-LABEL: trunc_packus_v8i64_v8i32:
502 ; SSE2-SSSE3: # %bb.0:
503 ; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm3
504 ; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm8
505 ; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm6
506 ; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm1
507 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [4294967295,4294967295]
508 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
509 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm2
510 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm2
511 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm2[1,1,3,3]
512 ; SSE2-SSSE3-NEXT: pxor %xmm7, %xmm7
513 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm9
514 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483647,2147483647]
515 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm10
516 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm10
517 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
518 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm11
519 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]
520 ; SSE2-SSSE3-NEXT: por %xmm11, %xmm2
521 ; SSE2-SSSE3-NEXT: pand %xmm2, %xmm3
522 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm2
523 ; SSE2-SSSE3-NEXT: por %xmm3, %xmm2
524 ; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm3
525 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm3
526 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm3[1,1,3,3]
527 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm9
528 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm10
529 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm10
530 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
531 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm11
532 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm10[1,1,3,3]
533 ; SSE2-SSSE3-NEXT: por %xmm11, %xmm3
534 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm8
535 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm3
536 ; SSE2-SSSE3-NEXT: por %xmm8, %xmm3
537 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm8
538 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm8
539 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[1,1,3,3]
540 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm9
541 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm10
542 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm8, %xmm10
543 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
544 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm11
545 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm10[1,1,3,3]
546 ; SSE2-SSSE3-NEXT: por %xmm11, %xmm8
547 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm6
548 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm8
549 ; SSE2-SSSE3-NEXT: por %xmm6, %xmm8
550 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm6
551 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm6
552 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm6[1,1,3,3]
553 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm9
554 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm6, %xmm5
555 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
556 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm6
557 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
558 ; SSE2-SSSE3-NEXT: por %xmm6, %xmm5
559 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1
560 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm5
561 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm5
562 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm1
563 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm1
564 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm4
565 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
566 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm1
567 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
568 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm1
569 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
570 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm4
571 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm4
572 ; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm1
573 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm1
574 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm5
575 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm5
576 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm1
577 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
578 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm6
579 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]
580 ; SSE2-SSSE3-NEXT: por %xmm6, %xmm1
581 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm1
582 ; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm4[0,2]
583 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm4
584 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm4
585 ; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm5
586 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm5
587 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm4
588 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
589 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm4
590 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
591 ; SSE2-SSSE3-NEXT: por %xmm4, %xmm5
592 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm5
593 ; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm3
594 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm3
595 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm4
596 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
597 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm3
598 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
599 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm3
600 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
601 ; SSE2-SSSE3-NEXT: por %xmm3, %xmm0
602 ; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0
603 ; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm5[0,2]
604 ; SSE2-SSSE3-NEXT: retq
606 ; SSE41-LABEL: trunc_packus_v8i64_v8i32:
608 ; SSE41-NEXT: movdqa (%rdi), %xmm5
609 ; SSE41-NEXT: movdqa 16(%rdi), %xmm8
610 ; SSE41-NEXT: movdqa 32(%rdi), %xmm7
611 ; SSE41-NEXT: movdqa 48(%rdi), %xmm2
612 ; SSE41-NEXT: movapd {{.*#+}} xmm1 = [4294967295,4294967295]
613 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
614 ; SSE41-NEXT: movdqa %xmm5, %xmm0
615 ; SSE41-NEXT: pxor %xmm3, %xmm0
616 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [2147483647,2147483647]
617 ; SSE41-NEXT: movdqa %xmm6, %xmm4
618 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
619 ; SSE41-NEXT: movdqa %xmm6, %xmm9
620 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm9
621 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
622 ; SSE41-NEXT: pand %xmm4, %xmm0
623 ; SSE41-NEXT: por %xmm9, %xmm0
624 ; SSE41-NEXT: movapd %xmm1, %xmm4
625 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm4
626 ; SSE41-NEXT: movdqa %xmm8, %xmm0
627 ; SSE41-NEXT: pxor %xmm3, %xmm0
628 ; SSE41-NEXT: movdqa %xmm6, %xmm5
629 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
630 ; SSE41-NEXT: movdqa %xmm6, %xmm9
631 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm9
632 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
633 ; SSE41-NEXT: pand %xmm5, %xmm0
634 ; SSE41-NEXT: por %xmm9, %xmm0
635 ; SSE41-NEXT: movapd %xmm1, %xmm5
636 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm5
637 ; SSE41-NEXT: movdqa %xmm7, %xmm0
638 ; SSE41-NEXT: pxor %xmm3, %xmm0
639 ; SSE41-NEXT: movdqa %xmm6, %xmm8
640 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm8
641 ; SSE41-NEXT: movdqa %xmm6, %xmm9
642 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm9
643 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
644 ; SSE41-NEXT: pand %xmm8, %xmm0
645 ; SSE41-NEXT: por %xmm9, %xmm0
646 ; SSE41-NEXT: movapd %xmm1, %xmm8
647 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm8
648 ; SSE41-NEXT: movdqa %xmm2, %xmm0
649 ; SSE41-NEXT: pxor %xmm3, %xmm0
650 ; SSE41-NEXT: movdqa %xmm6, %xmm7
651 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm7
652 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
653 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
654 ; SSE41-NEXT: pand %xmm7, %xmm0
655 ; SSE41-NEXT: por %xmm6, %xmm0
656 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
657 ; SSE41-NEXT: xorpd %xmm2, %xmm2
658 ; SSE41-NEXT: movapd %xmm1, %xmm6
659 ; SSE41-NEXT: xorpd %xmm3, %xmm6
660 ; SSE41-NEXT: movapd %xmm6, %xmm7
661 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm7
662 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm6
663 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
664 ; SSE41-NEXT: pand %xmm7, %xmm0
665 ; SSE41-NEXT: por %xmm6, %xmm0
666 ; SSE41-NEXT: pxor %xmm6, %xmm6
667 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm6
668 ; SSE41-NEXT: movapd %xmm8, %xmm1
669 ; SSE41-NEXT: xorpd %xmm3, %xmm1
670 ; SSE41-NEXT: movapd %xmm1, %xmm7
671 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm7
672 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm1
673 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
674 ; SSE41-NEXT: pand %xmm7, %xmm0
675 ; SSE41-NEXT: por %xmm1, %xmm0
676 ; SSE41-NEXT: pxor %xmm1, %xmm1
677 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm1
678 ; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm6[0,2]
679 ; SSE41-NEXT: movapd %xmm5, %xmm6
680 ; SSE41-NEXT: xorpd %xmm3, %xmm6
681 ; SSE41-NEXT: movapd %xmm6, %xmm7
682 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm7
683 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm6
684 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
685 ; SSE41-NEXT: pand %xmm7, %xmm0
686 ; SSE41-NEXT: por %xmm6, %xmm0
687 ; SSE41-NEXT: pxor %xmm6, %xmm6
688 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm6
689 ; SSE41-NEXT: movapd %xmm4, %xmm5
690 ; SSE41-NEXT: xorpd %xmm3, %xmm5
691 ; SSE41-NEXT: movapd %xmm5, %xmm7
692 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm7
693 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm5
694 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
695 ; SSE41-NEXT: pand %xmm7, %xmm0
696 ; SSE41-NEXT: por %xmm5, %xmm0
697 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2
698 ; SSE41-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm6[0,2]
699 ; SSE41-NEXT: movaps %xmm2, %xmm0
702 ; AVX1-LABEL: trunc_packus_v8i64_v8i32:
704 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
705 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
706 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2
707 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3
708 ; AVX1-NEXT: vmovddup {{.*#+}} xmm4 = [4294967295,4294967295]
709 ; AVX1-NEXT: # xmm4 = mem[0,0]
710 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm5
711 ; AVX1-NEXT: vblendvpd %xmm5, %xmm1, %xmm4, %xmm1
712 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm5
713 ; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm4, %xmm3
714 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm5
715 ; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
716 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm5
717 ; AVX1-NEXT: vblendvpd %xmm5, %xmm2, %xmm4, %xmm2
718 ; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4
719 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm5
720 ; AVX1-NEXT: vpand %xmm2, %xmm5, %xmm2
721 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm5
722 ; AVX1-NEXT: vpand %xmm0, %xmm5, %xmm0
723 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm5
724 ; AVX1-NEXT: vpand %xmm3, %xmm5, %xmm3
725 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm4
726 ; AVX1-NEXT: vpand %xmm1, %xmm4, %xmm1
727 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
728 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
729 ; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm1[0,2],ymm0[4,6],ymm1[4,6]
732 ; AVX2-SLOW-LABEL: trunc_packus_v8i64_v8i32:
733 ; AVX2-SLOW: # %bb.0:
734 ; AVX2-SLOW-NEXT: vmovdqa (%rdi), %ymm0
735 ; AVX2-SLOW-NEXT: vmovdqa 32(%rdi), %ymm1
736 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
737 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3
738 ; AVX2-SLOW-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
739 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3
740 ; AVX2-SLOW-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
741 ; AVX2-SLOW-NEXT: vpxor %xmm2, %xmm2, %xmm2
742 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3
743 ; AVX2-SLOW-NEXT: vpand %ymm1, %ymm3, %ymm1
744 ; AVX2-SLOW-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm2
745 ; AVX2-SLOW-NEXT: vpand %ymm0, %ymm2, %ymm0
746 ; AVX2-SLOW-NEXT: vperm2i128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
747 ; AVX2-SLOW-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
748 ; AVX2-SLOW-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
749 ; AVX2-SLOW-NEXT: retq
751 ; AVX2-FAST-ALL-LABEL: trunc_packus_v8i64_v8i32:
752 ; AVX2-FAST-ALL: # %bb.0:
753 ; AVX2-FAST-ALL-NEXT: vmovdqa (%rdi), %ymm0
754 ; AVX2-FAST-ALL-NEXT: vmovdqa 32(%rdi), %ymm1
755 ; AVX2-FAST-ALL-NEXT: vpbroadcastq {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
756 ; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3
757 ; AVX2-FAST-ALL-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
758 ; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3
759 ; AVX2-FAST-ALL-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
760 ; AVX2-FAST-ALL-NEXT: vpxor %xmm2, %xmm2, %xmm2
761 ; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3
762 ; AVX2-FAST-ALL-NEXT: vpand %ymm1, %ymm3, %ymm1
763 ; AVX2-FAST-ALL-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm2
764 ; AVX2-FAST-ALL-NEXT: vpand %ymm0, %ymm2, %ymm0
765 ; AVX2-FAST-ALL-NEXT: vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
766 ; AVX2-FAST-ALL-NEXT: vpermd %ymm0, %ymm2, %ymm0
767 ; AVX2-FAST-ALL-NEXT: vpermd %ymm1, %ymm2, %ymm1
768 ; AVX2-FAST-ALL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
769 ; AVX2-FAST-ALL-NEXT: retq
771 ; AVX2-FAST-PERLANE-LABEL: trunc_packus_v8i64_v8i32:
772 ; AVX2-FAST-PERLANE: # %bb.0:
773 ; AVX2-FAST-PERLANE-NEXT: vmovdqa (%rdi), %ymm0
774 ; AVX2-FAST-PERLANE-NEXT: vmovdqa 32(%rdi), %ymm1
775 ; AVX2-FAST-PERLANE-NEXT: vpbroadcastq {{.*#+}} ymm2 = [4294967295,4294967295,4294967295,4294967295]
776 ; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3
777 ; AVX2-FAST-PERLANE-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
778 ; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3
779 ; AVX2-FAST-PERLANE-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
780 ; AVX2-FAST-PERLANE-NEXT: vpxor %xmm2, %xmm2, %xmm2
781 ; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3
782 ; AVX2-FAST-PERLANE-NEXT: vpand %ymm1, %ymm3, %ymm1
783 ; AVX2-FAST-PERLANE-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm2
784 ; AVX2-FAST-PERLANE-NEXT: vpand %ymm0, %ymm2, %ymm0
785 ; AVX2-FAST-PERLANE-NEXT: vperm2i128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
786 ; AVX2-FAST-PERLANE-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0
787 ; AVX2-FAST-PERLANE-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
788 ; AVX2-FAST-PERLANE-NEXT: retq
790 ; AVX512-LABEL: trunc_packus_v8i64_v8i32:
792 ; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0
793 ; AVX512-NEXT: vpmaxsq (%rdi), %zmm0, %zmm0
794 ; AVX512-NEXT: vpmovusqd %zmm0, %ymm0
797 ; SKX-LABEL: trunc_packus_v8i64_v8i32:
799 ; SKX-NEXT: vpxor %xmm0, %xmm0, %xmm0
800 ; SKX-NEXT: vpmaxsq (%rdi), %ymm0, %ymm1
801 ; SKX-NEXT: vpmovusqd %ymm1, %xmm1
802 ; SKX-NEXT: vpmaxsq 32(%rdi), %ymm0, %ymm0
803 ; SKX-NEXT: vpmovusqd %ymm0, %xmm0
804 ; SKX-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
806 %a0 = load <8 x i64>, ptr %p0
807 %1 = icmp slt <8 x i64> %a0, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
808 %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
809 %3 = icmp sgt <8 x i64> %2, zeroinitializer
810 %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> zeroinitializer
811 %5 = trunc <8 x i64> %4 to <8 x i32>
816 ; PACKUS saturation truncation to vXi16
819 define <2 x i16> @trunc_packus_v2i64_v2i16(<2 x i64> %a0) {
820 ; SSE2-SSSE3-LABEL: trunc_packus_v2i64_v2i16:
821 ; SSE2-SSSE3: # %bb.0:
822 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
823 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm2
824 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm2
825 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
826 ; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm4
827 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm4
828 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147549183,2147549183]
829 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
830 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
831 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2
832 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
833 ; SSE2-SSSE3-NEXT: por %xmm2, %xmm3
834 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm0
835 ; SSE2-SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
836 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm3
837 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm0
838 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm0
839 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm2
840 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
841 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
842 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0
843 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
844 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm0
845 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
846 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm1
847 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm1
848 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
849 ; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
850 ; SSE2-SSSE3-NEXT: retq
852 ; SSE41-LABEL: trunc_packus_v2i64_v2i16:
854 ; SSE41-NEXT: movdqa %xmm0, %xmm1
855 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [65535,65535]
856 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
857 ; SSE41-NEXT: pxor %xmm3, %xmm0
858 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147549183,2147549183]
859 ; SSE41-NEXT: movdqa %xmm4, %xmm5
860 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
861 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
862 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
863 ; SSE41-NEXT: pand %xmm5, %xmm0
864 ; SSE41-NEXT: por %xmm4, %xmm0
865 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
866 ; SSE41-NEXT: xorpd %xmm1, %xmm1
867 ; SSE41-NEXT: movapd %xmm2, %xmm4
868 ; SSE41-NEXT: xorpd %xmm3, %xmm4
869 ; SSE41-NEXT: movapd %xmm4, %xmm5
870 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm5
871 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
872 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
873 ; SSE41-NEXT: pand %xmm5, %xmm0
874 ; SSE41-NEXT: por %xmm4, %xmm0
875 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
876 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
877 ; SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
880 ; AVX1-LABEL: trunc_packus_v2i64_v2i16:
882 ; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [65535,65535]
883 ; AVX1-NEXT: # xmm1 = mem[0,0]
884 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
885 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
886 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
887 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1
888 ; AVX1-NEXT: vpand %xmm0, %xmm1, %xmm0
889 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
890 ; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
893 ; AVX2-SLOW-LABEL: trunc_packus_v2i64_v2i16:
894 ; AVX2-SLOW: # %bb.0:
895 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} xmm1 = [65535,65535]
896 ; AVX2-SLOW-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
897 ; AVX2-SLOW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
898 ; AVX2-SLOW-NEXT: vpxor %xmm1, %xmm1, %xmm1
899 ; AVX2-SLOW-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1
900 ; AVX2-SLOW-NEXT: vpand %xmm0, %xmm1, %xmm0
901 ; AVX2-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
902 ; AVX2-SLOW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
903 ; AVX2-SLOW-NEXT: retq
905 ; AVX2-FAST-LABEL: trunc_packus_v2i64_v2i16:
906 ; AVX2-FAST: # %bb.0:
907 ; AVX2-FAST-NEXT: vpbroadcastq {{.*#+}} xmm1 = [65535,65535]
908 ; AVX2-FAST-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
909 ; AVX2-FAST-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
910 ; AVX2-FAST-NEXT: vpxor %xmm1, %xmm1, %xmm1
911 ; AVX2-FAST-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1
912 ; AVX2-FAST-NEXT: vpand %xmm0, %xmm1, %xmm0
913 ; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
914 ; AVX2-FAST-NEXT: retq
916 ; AVX512F-LABEL: trunc_packus_v2i64_v2i16:
918 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
919 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1
920 ; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
921 ; AVX512F-NEXT: vpmovusqw %zmm0, %xmm0
922 ; AVX512F-NEXT: vzeroupper
925 ; AVX512VL-LABEL: trunc_packus_v2i64_v2i16:
927 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
928 ; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
929 ; AVX512VL-NEXT: vpmovusqw %xmm0, %xmm0
930 ; AVX512VL-NEXT: retq
932 ; AVX512BW-LABEL: trunc_packus_v2i64_v2i16:
934 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
935 ; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1
936 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
937 ; AVX512BW-NEXT: vpmovusqw %zmm0, %xmm0
938 ; AVX512BW-NEXT: vzeroupper
939 ; AVX512BW-NEXT: retq
941 ; AVX512BWVL-LABEL: trunc_packus_v2i64_v2i16:
942 ; AVX512BWVL: # %bb.0:
943 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
944 ; AVX512BWVL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
945 ; AVX512BWVL-NEXT: vpmovusqw %xmm0, %xmm0
946 ; AVX512BWVL-NEXT: retq
948 ; SKX-LABEL: trunc_packus_v2i64_v2i16:
950 ; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1
951 ; SKX-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
952 ; SKX-NEXT: vpmovusqw %xmm0, %xmm0
954 %1 = icmp slt <2 x i64> %a0, <i64 65535, i64 65535>
955 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 65535, i64 65535>
956 %3 = icmp sgt <2 x i64> %2, zeroinitializer
957 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> zeroinitializer
958 %5 = trunc <2 x i64> %4 to <2 x i16>
962 define void @trunc_packus_v2i64_v2i16_store(<2 x i64> %a0, ptr%p1) {
963 ; SSE2-SSSE3-LABEL: trunc_packus_v2i64_v2i16_store:
964 ; SSE2-SSSE3: # %bb.0:
965 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
966 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm2
967 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm2
968 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
969 ; SSE2-SSSE3-NEXT: pxor %xmm4, %xmm4
970 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm4
971 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147549183,2147549183]
972 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
973 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
974 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm2
975 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
976 ; SSE2-SSSE3-NEXT: por %xmm2, %xmm3
977 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm0
978 ; SSE2-SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
979 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm3
980 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm0
981 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm0
982 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm2
983 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
984 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
985 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0
986 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
987 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm0
988 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
989 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm1
990 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm1
991 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
992 ; SSE2-SSSE3-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
993 ; SSE2-SSSE3-NEXT: movd %xmm0, (%rdi)
994 ; SSE2-SSSE3-NEXT: retq
996 ; SSE41-LABEL: trunc_packus_v2i64_v2i16_store:
998 ; SSE41-NEXT: movdqa %xmm0, %xmm1
999 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [65535,65535]
1000 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
1001 ; SSE41-NEXT: pxor %xmm3, %xmm0
1002 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147549183,2147549183]
1003 ; SSE41-NEXT: movdqa %xmm4, %xmm5
1004 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
1005 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
1006 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
1007 ; SSE41-NEXT: pand %xmm5, %xmm0
1008 ; SSE41-NEXT: por %xmm4, %xmm0
1009 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
1010 ; SSE41-NEXT: xorpd %xmm1, %xmm1
1011 ; SSE41-NEXT: movapd %xmm2, %xmm4
1012 ; SSE41-NEXT: xorpd %xmm3, %xmm4
1013 ; SSE41-NEXT: movapd %xmm4, %xmm5
1014 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm5
1015 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
1016 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
1017 ; SSE41-NEXT: pand %xmm5, %xmm0
1018 ; SSE41-NEXT: por %xmm4, %xmm0
1019 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
1020 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1021 ; SSE41-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1022 ; SSE41-NEXT: movd %xmm0, (%rdi)
1025 ; AVX1-LABEL: trunc_packus_v2i64_v2i16_store:
1027 ; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [65535,65535]
1028 ; AVX1-NEXT: # xmm1 = mem[0,0]
1029 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
1030 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1031 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
1032 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1
1033 ; AVX1-NEXT: vpand %xmm0, %xmm1, %xmm0
1034 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1035 ; AVX1-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1036 ; AVX1-NEXT: vmovd %xmm0, (%rdi)
1039 ; AVX2-SLOW-LABEL: trunc_packus_v2i64_v2i16_store:
1040 ; AVX2-SLOW: # %bb.0:
1041 ; AVX2-SLOW-NEXT: vpbroadcastq {{.*#+}} xmm1 = [65535,65535]
1042 ; AVX2-SLOW-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
1043 ; AVX2-SLOW-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1044 ; AVX2-SLOW-NEXT: vpxor %xmm1, %xmm1, %xmm1
1045 ; AVX2-SLOW-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1
1046 ; AVX2-SLOW-NEXT: vpand %xmm0, %xmm1, %xmm0
1047 ; AVX2-SLOW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1048 ; AVX2-SLOW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1049 ; AVX2-SLOW-NEXT: vmovd %xmm0, (%rdi)
1050 ; AVX2-SLOW-NEXT: retq
1052 ; AVX2-FAST-LABEL: trunc_packus_v2i64_v2i16_store:
1053 ; AVX2-FAST: # %bb.0:
1054 ; AVX2-FAST-NEXT: vpbroadcastq {{.*#+}} xmm1 = [65535,65535]
1055 ; AVX2-FAST-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
1056 ; AVX2-FAST-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1057 ; AVX2-FAST-NEXT: vpxor %xmm1, %xmm1, %xmm1
1058 ; AVX2-FAST-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1
1059 ; AVX2-FAST-NEXT: vpand %xmm0, %xmm1, %xmm0
1060 ; AVX2-FAST-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,u,u,u,u,u,u,u,u,u,u,u,u]
1061 ; AVX2-FAST-NEXT: vmovd %xmm0, (%rdi)
1062 ; AVX2-FAST-NEXT: retq
1064 ; AVX512F-LABEL: trunc_packus_v2i64_v2i16_store:
1066 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1067 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1
1068 ; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
1069 ; AVX512F-NEXT: vpmovusqw %zmm0, %xmm0
1070 ; AVX512F-NEXT: vmovd %xmm0, (%rdi)
1071 ; AVX512F-NEXT: vzeroupper
1072 ; AVX512F-NEXT: retq
1074 ; AVX512VL-LABEL: trunc_packus_v2i64_v2i16_store:
1075 ; AVX512VL: # %bb.0:
1076 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
1077 ; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
1078 ; AVX512VL-NEXT: vpmovusqw %xmm0, (%rdi)
1079 ; AVX512VL-NEXT: retq
1081 ; AVX512BW-LABEL: trunc_packus_v2i64_v2i16_store:
1082 ; AVX512BW: # %bb.0:
1083 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
1084 ; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1
1085 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
1086 ; AVX512BW-NEXT: vpmovusqw %zmm0, %xmm0
1087 ; AVX512BW-NEXT: vmovd %xmm0, (%rdi)
1088 ; AVX512BW-NEXT: vzeroupper
1089 ; AVX512BW-NEXT: retq
1091 ; AVX512BWVL-LABEL: trunc_packus_v2i64_v2i16_store:
1092 ; AVX512BWVL: # %bb.0:
1093 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
1094 ; AVX512BWVL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
1095 ; AVX512BWVL-NEXT: vpmovusqw %xmm0, (%rdi)
1096 ; AVX512BWVL-NEXT: retq
1098 ; SKX-LABEL: trunc_packus_v2i64_v2i16_store:
1100 ; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1
1101 ; SKX-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
1102 ; SKX-NEXT: vpmovusqw %xmm0, (%rdi)
1104 %1 = icmp slt <2 x i64> %a0, <i64 65535, i64 65535>
1105 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 65535, i64 65535>
1106 %3 = icmp sgt <2 x i64> %2, zeroinitializer
1107 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> zeroinitializer
1108 %5 = trunc <2 x i64> %4 to <2 x i16>
1109 store <2 x i16> %5, ptr%p1
1113 define <4 x i16> @trunc_packus_v4i64_v4i16(<4 x i64> %a0) {
1114 ; SSE2-SSSE3-LABEL: trunc_packus_v4i64_v4i16:
1115 ; SSE2-SSSE3: # %bb.0:
1116 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [65535,65535]
1117 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
1118 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm5
1119 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm5
1120 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
1121 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm2
1122 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm6
1123 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [2147549183,2147549183]
1124 ; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm8
1125 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm8
1126 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm8[0,0,2,2]
1127 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm5
1128 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm8[1,1,3,3]
1129 ; SSE2-SSSE3-NEXT: por %xmm5, %xmm6
1130 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm0
1131 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm6
1132 ; SSE2-SSSE3-NEXT: por %xmm6, %xmm0
1133 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm5
1134 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm5
1135 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
1136 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm6
1137 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm7
1138 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]
1139 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm5
1140 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
1141 ; SSE2-SSSE3-NEXT: por %xmm5, %xmm6
1142 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm1
1143 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm6
1144 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm6
1145 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm1
1146 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm1
1147 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm4
1148 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm4
1149 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm1
1150 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1151 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm1
1152 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1153 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm4
1154 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm4
1155 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm1
1156 ; SSE2-SSSE3-NEXT: pxor %xmm3, %xmm1
1157 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm5
1158 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm5
1159 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm3, %xmm1
1160 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1161 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1
1162 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3]
1163 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm3
1164 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm0
1165 ; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm4[0,2]
1166 ; SSE2-SSSE3-NEXT: pslld $16, %xmm0
1167 ; SSE2-SSSE3-NEXT: psrad $16, %xmm0
1168 ; SSE2-SSSE3-NEXT: packssdw %xmm2, %xmm0
1169 ; SSE2-SSSE3-NEXT: retq
1171 ; SSE41-LABEL: trunc_packus_v4i64_v4i16:
1173 ; SSE41-NEXT: movdqa %xmm0, %xmm2
1174 ; SSE41-NEXT: movapd {{.*#+}} xmm4 = [65535,65535]
1175 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
1176 ; SSE41-NEXT: pxor %xmm3, %xmm0
1177 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [2147549183,2147549183]
1178 ; SSE41-NEXT: movdqa %xmm6, %xmm5
1179 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
1180 ; SSE41-NEXT: movdqa %xmm6, %xmm7
1181 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
1182 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1183 ; SSE41-NEXT: pand %xmm5, %xmm0
1184 ; SSE41-NEXT: por %xmm7, %xmm0
1185 ; SSE41-NEXT: movapd %xmm4, %xmm5
1186 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5
1187 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1188 ; SSE41-NEXT: pxor %xmm3, %xmm0
1189 ; SSE41-NEXT: movdqa %xmm6, %xmm2
1190 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
1191 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
1192 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1193 ; SSE41-NEXT: pand %xmm2, %xmm0
1194 ; SSE41-NEXT: por %xmm6, %xmm0
1195 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4
1196 ; SSE41-NEXT: xorpd %xmm1, %xmm1
1197 ; SSE41-NEXT: movapd %xmm4, %xmm2
1198 ; SSE41-NEXT: xorpd %xmm3, %xmm2
1199 ; SSE41-NEXT: movapd %xmm2, %xmm6
1200 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm6
1201 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm2
1202 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
1203 ; SSE41-NEXT: pand %xmm6, %xmm0
1204 ; SSE41-NEXT: por %xmm2, %xmm0
1205 ; SSE41-NEXT: pxor %xmm2, %xmm2
1206 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2
1207 ; SSE41-NEXT: movapd %xmm5, %xmm4
1208 ; SSE41-NEXT: xorpd %xmm3, %xmm4
1209 ; SSE41-NEXT: movapd %xmm4, %xmm6
1210 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm6
1211 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
1212 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
1213 ; SSE41-NEXT: pand %xmm6, %xmm0
1214 ; SSE41-NEXT: por %xmm4, %xmm0
1215 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1
1216 ; SSE41-NEXT: packusdw %xmm2, %xmm1
1217 ; SSE41-NEXT: packusdw %xmm1, %xmm1
1218 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1221 ; AVX1-LABEL: trunc_packus_v4i64_v4i16:
1223 ; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [65535,65535]
1224 ; AVX1-NEXT: # xmm1 = mem[0,0]
1225 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
1226 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm2
1227 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1228 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm3
1229 ; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
1230 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
1231 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm3
1232 ; AVX1-NEXT: vpand %xmm0, %xmm3, %xmm0
1233 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm1
1234 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
1235 ; AVX1-NEXT: vpackusdw %xmm0, %xmm1, %xmm0
1236 ; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1237 ; AVX1-NEXT: vzeroupper
1240 ; AVX2-LABEL: trunc_packus_v4i64_v4i16:
1242 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [65535,65535,65535,65535]
1243 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
1244 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1245 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
1246 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm1
1247 ; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm0
1248 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1249 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1250 ; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1251 ; AVX2-NEXT: vzeroupper
1254 ; AVX512F-LABEL: trunc_packus_v4i64_v4i16:
1256 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1257 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1
1258 ; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
1259 ; AVX512F-NEXT: vpmovusqw %zmm0, %xmm0
1260 ; AVX512F-NEXT: vzeroupper
1261 ; AVX512F-NEXT: retq
1263 ; AVX512VL-LABEL: trunc_packus_v4i64_v4i16:
1264 ; AVX512VL: # %bb.0:
1265 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
1266 ; AVX512VL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0
1267 ; AVX512VL-NEXT: vpmovusqw %ymm0, %xmm0
1268 ; AVX512VL-NEXT: vzeroupper
1269 ; AVX512VL-NEXT: retq
1271 ; AVX512BW-LABEL: trunc_packus_v4i64_v4i16:
1272 ; AVX512BW: # %bb.0:
1273 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1274 ; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1
1275 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
1276 ; AVX512BW-NEXT: vpmovusqw %zmm0, %xmm0
1277 ; AVX512BW-NEXT: vzeroupper
1278 ; AVX512BW-NEXT: retq
1280 ; AVX512BWVL-LABEL: trunc_packus_v4i64_v4i16:
1281 ; AVX512BWVL: # %bb.0:
1282 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
1283 ; AVX512BWVL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0
1284 ; AVX512BWVL-NEXT: vpmovusqw %ymm0, %xmm0
1285 ; AVX512BWVL-NEXT: vzeroupper
1286 ; AVX512BWVL-NEXT: retq
1288 ; SKX-LABEL: trunc_packus_v4i64_v4i16:
1290 ; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1
1291 ; SKX-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0
1292 ; SKX-NEXT: vpmovusqw %ymm0, %xmm0
1293 ; SKX-NEXT: vzeroupper
1295 %1 = icmp slt <4 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535>
1296 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 65535, i64 65535, i64 65535, i64 65535>
1297 %3 = icmp sgt <4 x i64> %2, zeroinitializer
1298 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> zeroinitializer
1299 %5 = trunc <4 x i64> %4 to <4 x i16>
1303 define void @trunc_packus_v4i64_v4i16_store(<4 x i64> %a0, ptr%p1) {
1304 ; SSE2-SSSE3-LABEL: trunc_packus_v4i64_v4i16_store:
1305 ; SSE2-SSSE3: # %bb.0:
1306 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [65535,65535]
1307 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1308 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm3
1309 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm3
1310 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]
1311 ; SSE2-SSSE3-NEXT: pxor %xmm6, %xmm6
1312 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm5
1313 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [2147549183,2147549183]
1314 ; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm8
1315 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm8
1316 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
1317 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm9
1318 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm8[1,1,3,3]
1319 ; SSE2-SSSE3-NEXT: por %xmm9, %xmm3
1320 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm0
1321 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm3
1322 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm3
1323 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm0
1324 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm0
1325 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
1326 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm5
1327 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm7
1328 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1329 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm0
1330 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1331 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm5
1332 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1
1333 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm5
1334 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm5
1335 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm0
1336 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm0
1337 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm1
1338 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm1
1339 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm0
1340 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1341 ; SSE2-SSSE3-NEXT: pand %xmm1, %xmm0
1342 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1343 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm1
1344 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1
1345 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm0
1346 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm0
1347 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm4
1348 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
1349 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm0
1350 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1351 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm0
1352 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
1353 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm2
1354 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm2
1355 ; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm1[0,2]
1356 ; SSE2-SSSE3-NEXT: pslld $16, %xmm2
1357 ; SSE2-SSSE3-NEXT: psrad $16, %xmm2
1358 ; SSE2-SSSE3-NEXT: packssdw %xmm2, %xmm2
1359 ; SSE2-SSSE3-NEXT: movq %xmm2, (%rdi)
1360 ; SSE2-SSSE3-NEXT: retq
1362 ; SSE41-LABEL: trunc_packus_v4i64_v4i16_store:
1364 ; SSE41-NEXT: movdqa %xmm0, %xmm2
1365 ; SSE41-NEXT: movapd {{.*#+}} xmm4 = [65535,65535]
1366 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
1367 ; SSE41-NEXT: pxor %xmm3, %xmm0
1368 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [2147549183,2147549183]
1369 ; SSE41-NEXT: movdqa %xmm6, %xmm5
1370 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
1371 ; SSE41-NEXT: movdqa %xmm6, %xmm7
1372 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
1373 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1374 ; SSE41-NEXT: pand %xmm5, %xmm0
1375 ; SSE41-NEXT: por %xmm7, %xmm0
1376 ; SSE41-NEXT: movapd %xmm4, %xmm5
1377 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5
1378 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1379 ; SSE41-NEXT: pxor %xmm3, %xmm0
1380 ; SSE41-NEXT: movdqa %xmm6, %xmm2
1381 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
1382 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
1383 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1384 ; SSE41-NEXT: pand %xmm2, %xmm0
1385 ; SSE41-NEXT: por %xmm6, %xmm0
1386 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4
1387 ; SSE41-NEXT: xorpd %xmm1, %xmm1
1388 ; SSE41-NEXT: movapd %xmm4, %xmm2
1389 ; SSE41-NEXT: xorpd %xmm3, %xmm2
1390 ; SSE41-NEXT: movapd %xmm2, %xmm6
1391 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm6
1392 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm2
1393 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
1394 ; SSE41-NEXT: pand %xmm6, %xmm0
1395 ; SSE41-NEXT: por %xmm2, %xmm0
1396 ; SSE41-NEXT: pxor %xmm2, %xmm2
1397 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2
1398 ; SSE41-NEXT: movapd %xmm5, %xmm4
1399 ; SSE41-NEXT: xorpd %xmm3, %xmm4
1400 ; SSE41-NEXT: movapd %xmm4, %xmm6
1401 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm6
1402 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
1403 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
1404 ; SSE41-NEXT: pand %xmm6, %xmm0
1405 ; SSE41-NEXT: por %xmm4, %xmm0
1406 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1
1407 ; SSE41-NEXT: packusdw %xmm2, %xmm1
1408 ; SSE41-NEXT: packusdw %xmm1, %xmm1
1409 ; SSE41-NEXT: movq %xmm1, (%rdi)
1412 ; AVX1-LABEL: trunc_packus_v4i64_v4i16_store:
1414 ; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [65535,65535]
1415 ; AVX1-NEXT: # xmm1 = mem[0,0]
1416 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
1417 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm2
1418 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
1419 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm3
1420 ; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
1421 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
1422 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm3
1423 ; AVX1-NEXT: vpand %xmm0, %xmm3, %xmm0
1424 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm1
1425 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
1426 ; AVX1-NEXT: vpackusdw %xmm0, %xmm1, %xmm0
1427 ; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1428 ; AVX1-NEXT: vmovq %xmm0, (%rdi)
1429 ; AVX1-NEXT: vzeroupper
1432 ; AVX2-LABEL: trunc_packus_v4i64_v4i16_store:
1434 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [65535,65535,65535,65535]
1435 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
1436 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1437 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
1438 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm1
1439 ; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm0
1440 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1441 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1442 ; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1443 ; AVX2-NEXT: vmovq %xmm0, (%rdi)
1444 ; AVX2-NEXT: vzeroupper
1447 ; AVX512F-LABEL: trunc_packus_v4i64_v4i16_store:
1449 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1450 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1
1451 ; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
1452 ; AVX512F-NEXT: vpmovusqw %zmm0, %xmm0
1453 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
1454 ; AVX512F-NEXT: vzeroupper
1455 ; AVX512F-NEXT: retq
1457 ; AVX512VL-LABEL: trunc_packus_v4i64_v4i16_store:
1458 ; AVX512VL: # %bb.0:
1459 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
1460 ; AVX512VL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0
1461 ; AVX512VL-NEXT: vpmovusqw %ymm0, (%rdi)
1462 ; AVX512VL-NEXT: vzeroupper
1463 ; AVX512VL-NEXT: retq
1465 ; AVX512BW-LABEL: trunc_packus_v4i64_v4i16_store:
1466 ; AVX512BW: # %bb.0:
1467 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1468 ; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1
1469 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
1470 ; AVX512BW-NEXT: vpmovusqw %zmm0, %xmm0
1471 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
1472 ; AVX512BW-NEXT: vzeroupper
1473 ; AVX512BW-NEXT: retq
1475 ; AVX512BWVL-LABEL: trunc_packus_v4i64_v4i16_store:
1476 ; AVX512BWVL: # %bb.0:
1477 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
1478 ; AVX512BWVL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0
1479 ; AVX512BWVL-NEXT: vpmovusqw %ymm0, (%rdi)
1480 ; AVX512BWVL-NEXT: vzeroupper
1481 ; AVX512BWVL-NEXT: retq
1483 ; SKX-LABEL: trunc_packus_v4i64_v4i16_store:
1485 ; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1
1486 ; SKX-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0
1487 ; SKX-NEXT: vpmovusqw %ymm0, (%rdi)
1488 ; SKX-NEXT: vzeroupper
1490 %1 = icmp slt <4 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535>
1491 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 65535, i64 65535, i64 65535, i64 65535>
1492 %3 = icmp sgt <4 x i64> %2, zeroinitializer
1493 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> zeroinitializer
1494 %5 = trunc <4 x i64> %4 to <4 x i16>
1495 store <4 x i16> %5, ptr%p1
1499 define <8 x i16> @trunc_packus_v8i64_v8i16(ptr %p0) "min-legal-vector-width"="256" {
1500 ; SSE2-SSSE3-LABEL: trunc_packus_v8i64_v8i16:
1501 ; SSE2-SSSE3: # %bb.0:
1502 ; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm5
1503 ; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm0
1504 ; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm3
1505 ; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm8
1506 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [65535,65535]
1507 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
1508 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm2
1509 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm2
1510 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm2[1,1,3,3]
1511 ; SSE2-SSSE3-NEXT: pxor %xmm7, %xmm7
1512 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm9
1513 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147549183,2147549183]
1514 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm10
1515 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm10
1516 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1517 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm11
1518 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]
1519 ; SSE2-SSSE3-NEXT: por %xmm11, %xmm2
1520 ; SSE2-SSSE3-NEXT: pand %xmm2, %xmm3
1521 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm2
1522 ; SSE2-SSSE3-NEXT: por %xmm3, %xmm2
1523 ; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm3
1524 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm3
1525 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm3[1,1,3,3]
1526 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm9
1527 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm10
1528 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm10
1529 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1530 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm11
1531 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm10[1,1,3,3]
1532 ; SSE2-SSSE3-NEXT: por %xmm11, %xmm3
1533 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm8
1534 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm3
1535 ; SSE2-SSSE3-NEXT: por %xmm8, %xmm3
1536 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm8
1537 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm8
1538 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[1,1,3,3]
1539 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm9
1540 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm10
1541 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm8, %xmm10
1542 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1543 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm11
1544 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm10[1,1,3,3]
1545 ; SSE2-SSSE3-NEXT: por %xmm11, %xmm8
1546 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm5
1547 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm8
1548 ; SSE2-SSSE3-NEXT: por %xmm5, %xmm8
1549 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm5
1550 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm5
1551 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm5[1,1,3,3]
1552 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm9
1553 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm6
1554 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm6[0,0,2,2]
1555 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm5
1556 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1557 ; SSE2-SSSE3-NEXT: por %xmm5, %xmm6
1558 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm0
1559 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm6
1560 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm6
1561 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm0
1562 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm0
1563 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm4
1564 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm4
1565 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0
1566 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1567 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm0
1568 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1569 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm4
1570 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm4
1571 ; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm0
1572 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm0
1573 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm5
1574 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm5
1575 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0
1576 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
1577 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm6
1578 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
1579 ; SSE2-SSSE3-NEXT: por %xmm6, %xmm0
1580 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm0
1581 ; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm4[0,2]
1582 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm4
1583 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm4
1584 ; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm5
1585 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm5
1586 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm4
1587 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1588 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm4
1589 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1590 ; SSE2-SSSE3-NEXT: por %xmm4, %xmm5
1591 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm5
1592 ; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm3
1593 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm3
1594 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm4
1595 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm4
1596 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm3
1597 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
1598 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm1
1599 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1600 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm3
1601 ; SSE2-SSSE3-NEXT: pand %xmm2, %xmm3
1602 ; SSE2-SSSE3-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,2],xmm5[0,2]
1603 ; SSE2-SSSE3-NEXT: pslld $16, %xmm3
1604 ; SSE2-SSSE3-NEXT: psrad $16, %xmm3
1605 ; SSE2-SSSE3-NEXT: pslld $16, %xmm0
1606 ; SSE2-SSSE3-NEXT: psrad $16, %xmm0
1607 ; SSE2-SSSE3-NEXT: packssdw %xmm3, %xmm0
1608 ; SSE2-SSSE3-NEXT: retq
1610 ; SSE41-LABEL: trunc_packus_v8i64_v8i16:
1612 ; SSE41-NEXT: movdqa (%rdi), %xmm7
1613 ; SSE41-NEXT: movdqa 16(%rdi), %xmm5
1614 ; SSE41-NEXT: movdqa 32(%rdi), %xmm4
1615 ; SSE41-NEXT: movdqa 48(%rdi), %xmm8
1616 ; SSE41-NEXT: movapd {{.*#+}} xmm1 = [65535,65535]
1617 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1618 ; SSE41-NEXT: movdqa %xmm4, %xmm0
1619 ; SSE41-NEXT: pxor %xmm2, %xmm0
1620 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [2147549183,2147549183]
1621 ; SSE41-NEXT: movdqa %xmm6, %xmm3
1622 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
1623 ; SSE41-NEXT: movdqa %xmm6, %xmm9
1624 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm9
1625 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
1626 ; SSE41-NEXT: pand %xmm3, %xmm0
1627 ; SSE41-NEXT: por %xmm9, %xmm0
1628 ; SSE41-NEXT: movapd %xmm1, %xmm3
1629 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm3
1630 ; SSE41-NEXT: movdqa %xmm8, %xmm0
1631 ; SSE41-NEXT: pxor %xmm2, %xmm0
1632 ; SSE41-NEXT: movdqa %xmm6, %xmm4
1633 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
1634 ; SSE41-NEXT: movdqa %xmm6, %xmm9
1635 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm9
1636 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
1637 ; SSE41-NEXT: pand %xmm4, %xmm0
1638 ; SSE41-NEXT: por %xmm9, %xmm0
1639 ; SSE41-NEXT: movapd %xmm1, %xmm4
1640 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm4
1641 ; SSE41-NEXT: movdqa %xmm7, %xmm0
1642 ; SSE41-NEXT: pxor %xmm2, %xmm0
1643 ; SSE41-NEXT: movdqa %xmm6, %xmm8
1644 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm8
1645 ; SSE41-NEXT: movdqa %xmm6, %xmm9
1646 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm9
1647 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
1648 ; SSE41-NEXT: pand %xmm8, %xmm0
1649 ; SSE41-NEXT: por %xmm9, %xmm0
1650 ; SSE41-NEXT: movapd %xmm1, %xmm8
1651 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm8
1652 ; SSE41-NEXT: movdqa %xmm5, %xmm0
1653 ; SSE41-NEXT: pxor %xmm2, %xmm0
1654 ; SSE41-NEXT: movdqa %xmm6, %xmm7
1655 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm7
1656 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
1657 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1658 ; SSE41-NEXT: pand %xmm7, %xmm0
1659 ; SSE41-NEXT: por %xmm6, %xmm0
1660 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1
1661 ; SSE41-NEXT: xorpd %xmm5, %xmm5
1662 ; SSE41-NEXT: movapd %xmm1, %xmm6
1663 ; SSE41-NEXT: xorpd %xmm2, %xmm6
1664 ; SSE41-NEXT: movapd %xmm6, %xmm7
1665 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm7
1666 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm6
1667 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1668 ; SSE41-NEXT: pand %xmm7, %xmm0
1669 ; SSE41-NEXT: por %xmm6, %xmm0
1670 ; SSE41-NEXT: pxor %xmm6, %xmm6
1671 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm6
1672 ; SSE41-NEXT: movapd %xmm8, %xmm1
1673 ; SSE41-NEXT: xorpd %xmm2, %xmm1
1674 ; SSE41-NEXT: movapd %xmm1, %xmm7
1675 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm7
1676 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm1
1677 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
1678 ; SSE41-NEXT: pand %xmm7, %xmm0
1679 ; SSE41-NEXT: por %xmm1, %xmm0
1680 ; SSE41-NEXT: pxor %xmm1, %xmm1
1681 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm1
1682 ; SSE41-NEXT: packusdw %xmm6, %xmm1
1683 ; SSE41-NEXT: movapd %xmm4, %xmm6
1684 ; SSE41-NEXT: xorpd %xmm2, %xmm6
1685 ; SSE41-NEXT: movapd %xmm6, %xmm7
1686 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm7
1687 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm6
1688 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1689 ; SSE41-NEXT: pand %xmm7, %xmm0
1690 ; SSE41-NEXT: por %xmm6, %xmm0
1691 ; SSE41-NEXT: pxor %xmm6, %xmm6
1692 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm6
1693 ; SSE41-NEXT: movapd %xmm3, %xmm4
1694 ; SSE41-NEXT: xorpd %xmm2, %xmm4
1695 ; SSE41-NEXT: movapd %xmm4, %xmm7
1696 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm7
1697 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm4
1698 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
1699 ; SSE41-NEXT: pand %xmm7, %xmm0
1700 ; SSE41-NEXT: por %xmm4, %xmm0
1701 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm5
1702 ; SSE41-NEXT: packusdw %xmm6, %xmm5
1703 ; SSE41-NEXT: packusdw %xmm5, %xmm1
1704 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1707 ; AVX1-LABEL: trunc_packus_v8i64_v8i16:
1709 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
1710 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
1711 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2
1712 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3
1713 ; AVX1-NEXT: vmovddup {{.*#+}} xmm4 = [65535,65535]
1714 ; AVX1-NEXT: # xmm4 = mem[0,0]
1715 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm5
1716 ; AVX1-NEXT: vblendvpd %xmm5, %xmm2, %xmm4, %xmm2
1717 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm5
1718 ; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm4, %xmm3
1719 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm5
1720 ; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
1721 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm5
1722 ; AVX1-NEXT: vblendvpd %xmm5, %xmm1, %xmm4, %xmm1
1723 ; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4
1724 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm5
1725 ; AVX1-NEXT: vpand %xmm1, %xmm5, %xmm1
1726 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm5
1727 ; AVX1-NEXT: vpand %xmm0, %xmm5, %xmm0
1728 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1729 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm1
1730 ; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1
1731 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm3
1732 ; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm2
1733 ; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm1
1734 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1737 ; AVX2-LABEL: trunc_packus_v8i64_v8i16:
1739 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
1740 ; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1
1741 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [65535,65535,65535,65535]
1742 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3
1743 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1744 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3
1745 ; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
1746 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
1747 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3
1748 ; AVX2-NEXT: vpand %ymm1, %ymm3, %ymm1
1749 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm2
1750 ; AVX2-NEXT: vpand %ymm0, %ymm2, %ymm0
1751 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
1752 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1753 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1754 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
1755 ; AVX2-NEXT: vzeroupper
1758 ; AVX512-LABEL: trunc_packus_v8i64_v8i16:
1760 ; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0
1761 ; AVX512-NEXT: vpmaxsq (%rdi), %zmm0, %zmm0
1762 ; AVX512-NEXT: vpmovusqw %zmm0, %xmm0
1763 ; AVX512-NEXT: vzeroupper
1766 ; SKX-LABEL: trunc_packus_v8i64_v8i16:
1768 ; SKX-NEXT: vpxor %xmm0, %xmm0, %xmm0
1769 ; SKX-NEXT: vpmaxsq 32(%rdi), %ymm0, %ymm1
1770 ; SKX-NEXT: vpmovusqw %ymm1, %xmm1
1771 ; SKX-NEXT: vpmaxsq (%rdi), %ymm0, %ymm0
1772 ; SKX-NEXT: vpmovusqw %ymm0, %xmm0
1773 ; SKX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1774 ; SKX-NEXT: vzeroupper
1776 %a0 = load <8 x i64>, ptr %p0
1777 %1 = icmp slt <8 x i64> %a0, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
1778 %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535>
1779 %3 = icmp sgt <8 x i64> %2, zeroinitializer
1780 %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> zeroinitializer
1781 %5 = trunc <8 x i64> %4 to <8 x i16>
1785 define <4 x i16> @trunc_packus_v4i32_v4i16(<4 x i32> %a0) {
1786 ; SSE2-LABEL: trunc_packus_v4i32_v4i16:
1788 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]
1789 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1790 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
1791 ; SSE2-NEXT: pand %xmm2, %xmm0
1792 ; SSE2-NEXT: pandn %xmm1, %xmm2
1793 ; SSE2-NEXT: por %xmm0, %xmm2
1794 ; SSE2-NEXT: pxor %xmm0, %xmm0
1795 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1796 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1
1797 ; SSE2-NEXT: pand %xmm2, %xmm1
1798 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm1[0,2,2,3,4,5,6,7]
1799 ; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
1800 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1803 ; SSSE3-LABEL: trunc_packus_v4i32_v4i16:
1805 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]
1806 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
1807 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
1808 ; SSSE3-NEXT: pand %xmm2, %xmm0
1809 ; SSSE3-NEXT: pandn %xmm1, %xmm2
1810 ; SSSE3-NEXT: por %xmm2, %xmm0
1811 ; SSSE3-NEXT: pxor %xmm1, %xmm1
1812 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
1813 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
1814 ; SSSE3-NEXT: pand %xmm2, %xmm0
1815 ; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1818 ; SSE41-LABEL: trunc_packus_v4i32_v4i16:
1820 ; SSE41-NEXT: packusdw %xmm0, %xmm0
1823 ; AVX-LABEL: trunc_packus_v4i32_v4i16:
1825 ; AVX-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1828 ; AVX512-LABEL: trunc_packus_v4i32_v4i16:
1830 ; AVX512-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1833 ; SKX-LABEL: trunc_packus_v4i32_v4i16:
1835 ; SKX-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1837 %1 = icmp slt <4 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535>
1838 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
1839 %3 = icmp sgt <4 x i32> %2, zeroinitializer
1840 %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> zeroinitializer
1841 %5 = trunc <4 x i32> %4 to <4 x i16>
1845 define void @trunc_packus_v4i32_v4i16_store(<4 x i32> %a0, ptr%p1) {
1846 ; SSE2-LABEL: trunc_packus_v4i32_v4i16_store:
1848 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]
1849 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1850 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
1851 ; SSE2-NEXT: pand %xmm2, %xmm0
1852 ; SSE2-NEXT: pandn %xmm1, %xmm2
1853 ; SSE2-NEXT: por %xmm0, %xmm2
1854 ; SSE2-NEXT: pxor %xmm0, %xmm0
1855 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1856 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1
1857 ; SSE2-NEXT: pand %xmm2, %xmm1
1858 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm1[0,2,2,3,4,5,6,7]
1859 ; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
1860 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1861 ; SSE2-NEXT: movq %xmm0, (%rdi)
1864 ; SSSE3-LABEL: trunc_packus_v4i32_v4i16_store:
1866 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [65535,65535,65535,65535]
1867 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
1868 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
1869 ; SSSE3-NEXT: pand %xmm2, %xmm0
1870 ; SSSE3-NEXT: pandn %xmm1, %xmm2
1871 ; SSSE3-NEXT: por %xmm0, %xmm2
1872 ; SSSE3-NEXT: pxor %xmm0, %xmm0
1873 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
1874 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm1
1875 ; SSSE3-NEXT: pand %xmm2, %xmm1
1876 ; SSSE3-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]
1877 ; SSSE3-NEXT: movq %xmm1, (%rdi)
1880 ; SSE41-LABEL: trunc_packus_v4i32_v4i16_store:
1882 ; SSE41-NEXT: packusdw %xmm0, %xmm0
1883 ; SSE41-NEXT: movq %xmm0, (%rdi)
1886 ; AVX-LABEL: trunc_packus_v4i32_v4i16_store:
1888 ; AVX-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1889 ; AVX-NEXT: vmovq %xmm0, (%rdi)
1892 ; AVX512F-LABEL: trunc_packus_v4i32_v4i16_store:
1894 ; AVX512F-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1895 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
1896 ; AVX512F-NEXT: retq
1898 ; AVX512VL-LABEL: trunc_packus_v4i32_v4i16_store:
1899 ; AVX512VL: # %bb.0:
1900 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
1901 ; AVX512VL-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
1902 ; AVX512VL-NEXT: vpmovusdw %xmm0, (%rdi)
1903 ; AVX512VL-NEXT: retq
1905 ; AVX512BW-LABEL: trunc_packus_v4i32_v4i16_store:
1906 ; AVX512BW: # %bb.0:
1907 ; AVX512BW-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1908 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
1909 ; AVX512BW-NEXT: retq
1911 ; AVX512BWVL-LABEL: trunc_packus_v4i32_v4i16_store:
1912 ; AVX512BWVL: # %bb.0:
1913 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
1914 ; AVX512BWVL-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
1915 ; AVX512BWVL-NEXT: vpmovusdw %xmm0, (%rdi)
1916 ; AVX512BWVL-NEXT: retq
1918 ; SKX-LABEL: trunc_packus_v4i32_v4i16_store:
1920 ; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1
1921 ; SKX-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
1922 ; SKX-NEXT: vpmovusdw %xmm0, (%rdi)
1924 %1 = icmp slt <4 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535>
1925 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
1926 %3 = icmp sgt <4 x i32> %2, zeroinitializer
1927 %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> zeroinitializer
1928 %5 = trunc <4 x i32> %4 to <4 x i16>
1929 store <4 x i16> %5, ptr%p1
1933 define <8 x i16> @trunc_packus_v8i32_v8i16(<8 x i32> %a0) {
1934 ; SSE2-LABEL: trunc_packus_v8i32_v8i16:
1936 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
1937 ; SSE2-NEXT: movdqa %xmm2, %xmm3
1938 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
1939 ; SSE2-NEXT: pand %xmm3, %xmm1
1940 ; SSE2-NEXT: pandn %xmm2, %xmm3
1941 ; SSE2-NEXT: por %xmm1, %xmm3
1942 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1943 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1
1944 ; SSE2-NEXT: pand %xmm1, %xmm0
1945 ; SSE2-NEXT: pandn %xmm2, %xmm1
1946 ; SSE2-NEXT: por %xmm1, %xmm0
1947 ; SSE2-NEXT: pxor %xmm1, %xmm1
1948 ; SSE2-NEXT: movdqa %xmm0, %xmm2
1949 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
1950 ; SSE2-NEXT: pand %xmm2, %xmm0
1951 ; SSE2-NEXT: movdqa %xmm3, %xmm2
1952 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
1953 ; SSE2-NEXT: pand %xmm3, %xmm2
1954 ; SSE2-NEXT: pslld $16, %xmm2
1955 ; SSE2-NEXT: psrad $16, %xmm2
1956 ; SSE2-NEXT: pslld $16, %xmm0
1957 ; SSE2-NEXT: psrad $16, %xmm0
1958 ; SSE2-NEXT: packssdw %xmm2, %xmm0
1961 ; SSSE3-LABEL: trunc_packus_v8i32_v8i16:
1963 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [65535,65535,65535,65535]
1964 ; SSSE3-NEXT: movdqa %xmm2, %xmm3
1965 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3
1966 ; SSSE3-NEXT: pand %xmm3, %xmm1
1967 ; SSSE3-NEXT: pandn %xmm2, %xmm3
1968 ; SSSE3-NEXT: por %xmm1, %xmm3
1969 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
1970 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm1
1971 ; SSSE3-NEXT: pand %xmm1, %xmm0
1972 ; SSSE3-NEXT: pandn %xmm2, %xmm1
1973 ; SSSE3-NEXT: por %xmm1, %xmm0
1974 ; SSSE3-NEXT: pxor %xmm1, %xmm1
1975 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
1976 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
1977 ; SSSE3-NEXT: pand %xmm2, %xmm0
1978 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
1979 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
1980 ; SSSE3-NEXT: pand %xmm3, %xmm2
1981 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1982 ; SSSE3-NEXT: pshufb %xmm1, %xmm2
1983 ; SSSE3-NEXT: pshufb %xmm1, %xmm0
1984 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
1987 ; SSE41-LABEL: trunc_packus_v8i32_v8i16:
1989 ; SSE41-NEXT: packusdw %xmm1, %xmm0
1992 ; AVX1-LABEL: trunc_packus_v8i32_v8i16:
1994 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
1995 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
1996 ; AVX1-NEXT: vzeroupper
1999 ; AVX2-LABEL: trunc_packus_v8i32_v8i16:
2001 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
2002 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
2003 ; AVX2-NEXT: vzeroupper
2006 ; AVX512F-LABEL: trunc_packus_v8i32_v8i16:
2008 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1
2009 ; AVX512F-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
2010 ; AVX512F-NEXT: vzeroupper
2011 ; AVX512F-NEXT: retq
2013 ; AVX512VL-LABEL: trunc_packus_v8i32_v8i16:
2014 ; AVX512VL: # %bb.0:
2015 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
2016 ; AVX512VL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0
2017 ; AVX512VL-NEXT: vpmovusdw %ymm0, %xmm0
2018 ; AVX512VL-NEXT: vzeroupper
2019 ; AVX512VL-NEXT: retq
2021 ; AVX512BW-LABEL: trunc_packus_v8i32_v8i16:
2022 ; AVX512BW: # %bb.0:
2023 ; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1
2024 ; AVX512BW-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
2025 ; AVX512BW-NEXT: vzeroupper
2026 ; AVX512BW-NEXT: retq
2028 ; AVX512BWVL-LABEL: trunc_packus_v8i32_v8i16:
2029 ; AVX512BWVL: # %bb.0:
2030 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
2031 ; AVX512BWVL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0
2032 ; AVX512BWVL-NEXT: vpmovusdw %ymm0, %xmm0
2033 ; AVX512BWVL-NEXT: vzeroupper
2034 ; AVX512BWVL-NEXT: retq
2036 ; SKX-LABEL: trunc_packus_v8i32_v8i16:
2038 ; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1
2039 ; SKX-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0
2040 ; SKX-NEXT: vpmovusdw %ymm0, %xmm0
2041 ; SKX-NEXT: vzeroupper
2043 %1 = icmp slt <8 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
2044 %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
2045 %3 = icmp sgt <8 x i32> %2, zeroinitializer
2046 %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> zeroinitializer
2047 %5 = trunc <8 x i32> %4 to <8 x i16>
2051 define <16 x i16> @trunc_packus_v16i32_v16i16(ptr %p0) "min-legal-vector-width"="256" {
2052 ; SSE2-LABEL: trunc_packus_v16i32_v16i16:
2054 ; SSE2-NEXT: movdqa (%rdi), %xmm1
2055 ; SSE2-NEXT: movdqa 16(%rdi), %xmm3
2056 ; SSE2-NEXT: movdqa 32(%rdi), %xmm0
2057 ; SSE2-NEXT: movdqa 48(%rdi), %xmm4
2058 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [65535,65535,65535,65535]
2059 ; SSE2-NEXT: movdqa %xmm5, %xmm2
2060 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm2
2061 ; SSE2-NEXT: pand %xmm2, %xmm3
2062 ; SSE2-NEXT: pandn %xmm5, %xmm2
2063 ; SSE2-NEXT: por %xmm3, %xmm2
2064 ; SSE2-NEXT: movdqa %xmm5, %xmm3
2065 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
2066 ; SSE2-NEXT: pand %xmm3, %xmm1
2067 ; SSE2-NEXT: pandn %xmm5, %xmm3
2068 ; SSE2-NEXT: por %xmm1, %xmm3
2069 ; SSE2-NEXT: movdqa %xmm5, %xmm6
2070 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm6
2071 ; SSE2-NEXT: pand %xmm6, %xmm4
2072 ; SSE2-NEXT: pandn %xmm5, %xmm6
2073 ; SSE2-NEXT: por %xmm4, %xmm6
2074 ; SSE2-NEXT: movdqa %xmm5, %xmm4
2075 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
2076 ; SSE2-NEXT: pand %xmm4, %xmm0
2077 ; SSE2-NEXT: pandn %xmm5, %xmm4
2078 ; SSE2-NEXT: por %xmm0, %xmm4
2079 ; SSE2-NEXT: pxor %xmm5, %xmm5
2080 ; SSE2-NEXT: movdqa %xmm4, %xmm1
2081 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm1
2082 ; SSE2-NEXT: pand %xmm4, %xmm1
2083 ; SSE2-NEXT: movdqa %xmm6, %xmm4
2084 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm4
2085 ; SSE2-NEXT: pand %xmm6, %xmm4
2086 ; SSE2-NEXT: movdqa %xmm3, %xmm0
2087 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm0
2088 ; SSE2-NEXT: pand %xmm3, %xmm0
2089 ; SSE2-NEXT: movdqa %xmm2, %xmm3
2090 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm3
2091 ; SSE2-NEXT: pand %xmm2, %xmm3
2092 ; SSE2-NEXT: pslld $16, %xmm3
2093 ; SSE2-NEXT: psrad $16, %xmm3
2094 ; SSE2-NEXT: pslld $16, %xmm0
2095 ; SSE2-NEXT: psrad $16, %xmm0
2096 ; SSE2-NEXT: packssdw %xmm3, %xmm0
2097 ; SSE2-NEXT: pslld $16, %xmm4
2098 ; SSE2-NEXT: psrad $16, %xmm4
2099 ; SSE2-NEXT: pslld $16, %xmm1
2100 ; SSE2-NEXT: psrad $16, %xmm1
2101 ; SSE2-NEXT: packssdw %xmm4, %xmm1
2104 ; SSSE3-LABEL: trunc_packus_v16i32_v16i16:
2106 ; SSSE3-NEXT: movdqa (%rdi), %xmm1
2107 ; SSSE3-NEXT: movdqa 16(%rdi), %xmm3
2108 ; SSSE3-NEXT: movdqa 32(%rdi), %xmm0
2109 ; SSSE3-NEXT: movdqa 48(%rdi), %xmm4
2110 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [65535,65535,65535,65535]
2111 ; SSSE3-NEXT: movdqa %xmm5, %xmm2
2112 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2
2113 ; SSSE3-NEXT: pand %xmm2, %xmm3
2114 ; SSSE3-NEXT: pandn %xmm5, %xmm2
2115 ; SSSE3-NEXT: por %xmm3, %xmm2
2116 ; SSSE3-NEXT: movdqa %xmm5, %xmm3
2117 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3
2118 ; SSSE3-NEXT: pand %xmm3, %xmm1
2119 ; SSSE3-NEXT: pandn %xmm5, %xmm3
2120 ; SSSE3-NEXT: por %xmm1, %xmm3
2121 ; SSSE3-NEXT: movdqa %xmm5, %xmm6
2122 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
2123 ; SSSE3-NEXT: pand %xmm6, %xmm4
2124 ; SSSE3-NEXT: pandn %xmm5, %xmm6
2125 ; SSSE3-NEXT: por %xmm4, %xmm6
2126 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
2127 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
2128 ; SSSE3-NEXT: pand %xmm4, %xmm0
2129 ; SSSE3-NEXT: pandn %xmm5, %xmm4
2130 ; SSSE3-NEXT: por %xmm0, %xmm4
2131 ; SSSE3-NEXT: pxor %xmm5, %xmm5
2132 ; SSSE3-NEXT: movdqa %xmm4, %xmm1
2133 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm1
2134 ; SSSE3-NEXT: pand %xmm4, %xmm1
2135 ; SSSE3-NEXT: movdqa %xmm6, %xmm4
2136 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm4
2137 ; SSSE3-NEXT: pand %xmm6, %xmm4
2138 ; SSSE3-NEXT: movdqa %xmm3, %xmm0
2139 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm0
2140 ; SSSE3-NEXT: pand %xmm3, %xmm0
2141 ; SSSE3-NEXT: movdqa %xmm2, %xmm3
2142 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm3
2143 ; SSSE3-NEXT: pand %xmm2, %xmm3
2144 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
2145 ; SSSE3-NEXT: pshufb %xmm2, %xmm3
2146 ; SSSE3-NEXT: pshufb %xmm2, %xmm0
2147 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]
2148 ; SSSE3-NEXT: pshufb %xmm2, %xmm4
2149 ; SSSE3-NEXT: pshufb %xmm2, %xmm1
2150 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm4[0]
2153 ; SSE41-LABEL: trunc_packus_v16i32_v16i16:
2155 ; SSE41-NEXT: movdqa (%rdi), %xmm0
2156 ; SSE41-NEXT: movdqa 32(%rdi), %xmm1
2157 ; SSE41-NEXT: packusdw 16(%rdi), %xmm0
2158 ; SSE41-NEXT: packusdw 48(%rdi), %xmm1
2161 ; AVX1-LABEL: trunc_packus_v16i32_v16i16:
2163 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
2164 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm1
2165 ; AVX1-NEXT: vpackusdw 48(%rdi), %xmm1, %xmm1
2166 ; AVX1-NEXT: vpackusdw 16(%rdi), %xmm0, %xmm0
2167 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
2170 ; AVX2-LABEL: trunc_packus_v16i32_v16i16:
2172 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
2173 ; AVX2-NEXT: vpackusdw 32(%rdi), %ymm0, %ymm0
2174 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2177 ; AVX512-LABEL: trunc_packus_v16i32_v16i16:
2179 ; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0
2180 ; AVX512-NEXT: vpmaxsd (%rdi), %zmm0, %zmm0
2181 ; AVX512-NEXT: vpmovusdw %zmm0, %ymm0
2184 ; SKX-LABEL: trunc_packus_v16i32_v16i16:
2186 ; SKX-NEXT: vmovdqa (%rdi), %ymm0
2187 ; SKX-NEXT: vpackusdw 32(%rdi), %ymm0, %ymm0
2188 ; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2190 %a0 = load <16 x i32>, ptr %p0
2191 %1 = icmp slt <16 x i32> %a0, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
2192 %2 = select <16 x i1> %1, <16 x i32> %a0, <16 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
2193 %3 = icmp sgt <16 x i32> %2, zeroinitializer
2194 %4 = select <16 x i1> %3, <16 x i32> %2, <16 x i32> zeroinitializer
2195 %5 = trunc <16 x i32> %4 to <16 x i16>
2200 ; PACKUS saturation truncation to vXi8
2203 define <2 x i8> @trunc_packus_v2i64_v2i8(<2 x i64> %a0) {
2204 ; SSE2-LABEL: trunc_packus_v2i64_v2i8:
2206 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
2207 ; SSE2-NEXT: movdqa %xmm0, %xmm2
2208 ; SSE2-NEXT: pxor %xmm1, %xmm2
2209 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
2210 ; SSE2-NEXT: pxor %xmm4, %xmm4
2211 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm4
2212 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483903,2147483903]
2213 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
2214 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
2215 ; SSE2-NEXT: pand %xmm4, %xmm2
2216 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2217 ; SSE2-NEXT: por %xmm2, %xmm3
2218 ; SSE2-NEXT: pand %xmm3, %xmm0
2219 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2220 ; SSE2-NEXT: por %xmm3, %xmm0
2221 ; SSE2-NEXT: movdqa %xmm0, %xmm2
2222 ; SSE2-NEXT: pxor %xmm1, %xmm2
2223 ; SSE2-NEXT: movdqa %xmm2, %xmm3
2224 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm3
2225 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2226 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2
2227 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
2228 ; SSE2-NEXT: pand %xmm4, %xmm1
2229 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
2230 ; SSE2-NEXT: por %xmm1, %xmm2
2231 ; SSE2-NEXT: pand %xmm2, %xmm0
2232 ; SSE2-NEXT: packuswb %xmm0, %xmm0
2233 ; SSE2-NEXT: packuswb %xmm0, %xmm0
2234 ; SSE2-NEXT: packuswb %xmm0, %xmm0
2237 ; SSSE3-LABEL: trunc_packus_v2i64_v2i8:
2239 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
2240 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
2241 ; SSSE3-NEXT: pxor %xmm1, %xmm2
2242 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
2243 ; SSSE3-NEXT: pxor %xmm4, %xmm4
2244 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm4
2245 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483903,2147483903]
2246 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
2247 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
2248 ; SSSE3-NEXT: pand %xmm4, %xmm2
2249 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2250 ; SSSE3-NEXT: por %xmm2, %xmm3
2251 ; SSSE3-NEXT: pand %xmm3, %xmm0
2252 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2253 ; SSSE3-NEXT: por %xmm3, %xmm0
2254 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
2255 ; SSSE3-NEXT: pxor %xmm1, %xmm2
2256 ; SSSE3-NEXT: movdqa %xmm2, %xmm3
2257 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm3
2258 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2259 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm2
2260 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
2261 ; SSSE3-NEXT: pand %xmm4, %xmm1
2262 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
2263 ; SSSE3-NEXT: por %xmm1, %xmm2
2264 ; SSSE3-NEXT: pand %xmm2, %xmm0
2265 ; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2268 ; SSE41-LABEL: trunc_packus_v2i64_v2i8:
2270 ; SSE41-NEXT: movdqa %xmm0, %xmm1
2271 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [255,255]
2272 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
2273 ; SSE41-NEXT: pxor %xmm3, %xmm0
2274 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147483903,2147483903]
2275 ; SSE41-NEXT: movdqa %xmm4, %xmm5
2276 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
2277 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
2278 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
2279 ; SSE41-NEXT: pand %xmm5, %xmm0
2280 ; SSE41-NEXT: por %xmm4, %xmm0
2281 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
2282 ; SSE41-NEXT: xorpd %xmm1, %xmm1
2283 ; SSE41-NEXT: movapd %xmm2, %xmm4
2284 ; SSE41-NEXT: xorpd %xmm3, %xmm4
2285 ; SSE41-NEXT: movapd %xmm4, %xmm5
2286 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm5
2287 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
2288 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
2289 ; SSE41-NEXT: pand %xmm5, %xmm0
2290 ; SSE41-NEXT: por %xmm4, %xmm0
2291 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
2292 ; SSE41-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2293 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2296 ; AVX1-LABEL: trunc_packus_v2i64_v2i8:
2298 ; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [255,255]
2299 ; AVX1-NEXT: # xmm1 = mem[0,0]
2300 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
2301 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2302 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
2303 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1
2304 ; AVX1-NEXT: vpand %xmm0, %xmm1, %xmm0
2305 ; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2308 ; AVX2-LABEL: trunc_packus_v2i64_v2i8:
2310 ; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm1 = [255,255]
2311 ; AVX2-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
2312 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2313 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
2314 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1
2315 ; AVX2-NEXT: vpand %xmm0, %xmm1, %xmm0
2316 ; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2319 ; AVX512F-LABEL: trunc_packus_v2i64_v2i8:
2321 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
2322 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1
2323 ; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
2324 ; AVX512F-NEXT: vpmovusqb %zmm0, %xmm0
2325 ; AVX512F-NEXT: vzeroupper
2326 ; AVX512F-NEXT: retq
2328 ; AVX512VL-LABEL: trunc_packus_v2i64_v2i8:
2329 ; AVX512VL: # %bb.0:
2330 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
2331 ; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
2332 ; AVX512VL-NEXT: vpmovusqb %xmm0, %xmm0
2333 ; AVX512VL-NEXT: retq
2335 ; AVX512BW-LABEL: trunc_packus_v2i64_v2i8:
2336 ; AVX512BW: # %bb.0:
2337 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
2338 ; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1
2339 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
2340 ; AVX512BW-NEXT: vpmovusqb %zmm0, %xmm0
2341 ; AVX512BW-NEXT: vzeroupper
2342 ; AVX512BW-NEXT: retq
2344 ; AVX512BWVL-LABEL: trunc_packus_v2i64_v2i8:
2345 ; AVX512BWVL: # %bb.0:
2346 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
2347 ; AVX512BWVL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
2348 ; AVX512BWVL-NEXT: vpmovusqb %xmm0, %xmm0
2349 ; AVX512BWVL-NEXT: retq
2351 ; SKX-LABEL: trunc_packus_v2i64_v2i8:
2353 ; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1
2354 ; SKX-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
2355 ; SKX-NEXT: vpmovusqb %xmm0, %xmm0
2357 %1 = icmp slt <2 x i64> %a0, <i64 255, i64 255>
2358 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 255, i64 255>
2359 %3 = icmp sgt <2 x i64> %2, zeroinitializer
2360 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> zeroinitializer
2361 %5 = trunc <2 x i64> %4 to <2 x i8>
2365 define void @trunc_packus_v2i64_v2i8_store(<2 x i64> %a0, ptr%p1) {
2366 ; SSE2-LABEL: trunc_packus_v2i64_v2i8_store:
2368 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
2369 ; SSE2-NEXT: movdqa %xmm0, %xmm2
2370 ; SSE2-NEXT: pxor %xmm1, %xmm2
2371 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
2372 ; SSE2-NEXT: pxor %xmm4, %xmm4
2373 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm4
2374 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483903,2147483903]
2375 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
2376 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
2377 ; SSE2-NEXT: pand %xmm4, %xmm2
2378 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2379 ; SSE2-NEXT: por %xmm2, %xmm3
2380 ; SSE2-NEXT: pand %xmm3, %xmm0
2381 ; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2382 ; SSE2-NEXT: por %xmm0, %xmm3
2383 ; SSE2-NEXT: movdqa %xmm3, %xmm0
2384 ; SSE2-NEXT: pxor %xmm1, %xmm0
2385 ; SSE2-NEXT: movdqa %xmm0, %xmm2
2386 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
2387 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2388 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
2389 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2390 ; SSE2-NEXT: pand %xmm4, %xmm0
2391 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
2392 ; SSE2-NEXT: por %xmm0, %xmm1
2393 ; SSE2-NEXT: pand %xmm3, %xmm1
2394 ; SSE2-NEXT: packuswb %xmm1, %xmm1
2395 ; SSE2-NEXT: packuswb %xmm1, %xmm1
2396 ; SSE2-NEXT: packuswb %xmm1, %xmm1
2397 ; SSE2-NEXT: movd %xmm1, %eax
2398 ; SSE2-NEXT: movw %ax, (%rdi)
2401 ; SSSE3-LABEL: trunc_packus_v2i64_v2i8_store:
2403 ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
2404 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
2405 ; SSSE3-NEXT: pxor %xmm1, %xmm2
2406 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
2407 ; SSSE3-NEXT: pxor %xmm4, %xmm4
2408 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm4
2409 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483903,2147483903]
2410 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
2411 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
2412 ; SSSE3-NEXT: pand %xmm4, %xmm2
2413 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2414 ; SSSE3-NEXT: por %xmm2, %xmm3
2415 ; SSSE3-NEXT: pand %xmm3, %xmm0
2416 ; SSSE3-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2417 ; SSSE3-NEXT: por %xmm0, %xmm3
2418 ; SSSE3-NEXT: movdqa %xmm3, %xmm0
2419 ; SSSE3-NEXT: pxor %xmm1, %xmm0
2420 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
2421 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
2422 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2423 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm0
2424 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2425 ; SSSE3-NEXT: pand %xmm4, %xmm0
2426 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
2427 ; SSSE3-NEXT: por %xmm0, %xmm1
2428 ; SSSE3-NEXT: pand %xmm3, %xmm1
2429 ; SSSE3-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2430 ; SSSE3-NEXT: movd %xmm1, %eax
2431 ; SSSE3-NEXT: movw %ax, (%rdi)
2434 ; SSE41-LABEL: trunc_packus_v2i64_v2i8_store:
2436 ; SSE41-NEXT: movdqa %xmm0, %xmm1
2437 ; SSE41-NEXT: movapd {{.*#+}} xmm2 = [255,255]
2438 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
2439 ; SSE41-NEXT: pxor %xmm3, %xmm0
2440 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147483903,2147483903]
2441 ; SSE41-NEXT: movdqa %xmm4, %xmm5
2442 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
2443 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
2444 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
2445 ; SSE41-NEXT: pand %xmm5, %xmm0
2446 ; SSE41-NEXT: por %xmm4, %xmm0
2447 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
2448 ; SSE41-NEXT: xorpd %xmm1, %xmm1
2449 ; SSE41-NEXT: movapd %xmm2, %xmm4
2450 ; SSE41-NEXT: xorpd %xmm3, %xmm4
2451 ; SSE41-NEXT: movapd %xmm4, %xmm5
2452 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm5
2453 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
2454 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
2455 ; SSE41-NEXT: pand %xmm5, %xmm0
2456 ; SSE41-NEXT: por %xmm4, %xmm0
2457 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
2458 ; SSE41-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2459 ; SSE41-NEXT: pextrw $0, %xmm1, (%rdi)
2462 ; AVX1-LABEL: trunc_packus_v2i64_v2i8_store:
2464 ; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [255,255]
2465 ; AVX1-NEXT: # xmm1 = mem[0,0]
2466 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
2467 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2468 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
2469 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1
2470 ; AVX1-NEXT: vpand %xmm0, %xmm1, %xmm0
2471 ; AVX1-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2472 ; AVX1-NEXT: vpextrw $0, %xmm0, (%rdi)
2475 ; AVX2-LABEL: trunc_packus_v2i64_v2i8_store:
2477 ; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm1 = [255,255]
2478 ; AVX2-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
2479 ; AVX2-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2480 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
2481 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm1
2482 ; AVX2-NEXT: vpand %xmm0, %xmm1, %xmm0
2483 ; AVX2-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2484 ; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi)
2487 ; AVX512F-LABEL: trunc_packus_v2i64_v2i8_store:
2489 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
2490 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1
2491 ; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
2492 ; AVX512F-NEXT: vpmovusqb %zmm0, %xmm0
2493 ; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi)
2494 ; AVX512F-NEXT: vzeroupper
2495 ; AVX512F-NEXT: retq
2497 ; AVX512VL-LABEL: trunc_packus_v2i64_v2i8_store:
2498 ; AVX512VL: # %bb.0:
2499 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
2500 ; AVX512VL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
2501 ; AVX512VL-NEXT: vpmovusqb %xmm0, (%rdi)
2502 ; AVX512VL-NEXT: retq
2504 ; AVX512BW-LABEL: trunc_packus_v2i64_v2i8_store:
2505 ; AVX512BW: # %bb.0:
2506 ; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
2507 ; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1
2508 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
2509 ; AVX512BW-NEXT: vpmovusqb %zmm0, %xmm0
2510 ; AVX512BW-NEXT: vpextrw $0, %xmm0, (%rdi)
2511 ; AVX512BW-NEXT: vzeroupper
2512 ; AVX512BW-NEXT: retq
2514 ; AVX512BWVL-LABEL: trunc_packus_v2i64_v2i8_store:
2515 ; AVX512BWVL: # %bb.0:
2516 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
2517 ; AVX512BWVL-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
2518 ; AVX512BWVL-NEXT: vpmovusqb %xmm0, (%rdi)
2519 ; AVX512BWVL-NEXT: retq
2521 ; SKX-LABEL: trunc_packus_v2i64_v2i8_store:
2523 ; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1
2524 ; SKX-NEXT: vpmaxsq %xmm1, %xmm0, %xmm0
2525 ; SKX-NEXT: vpmovusqb %xmm0, (%rdi)
2527 %1 = icmp slt <2 x i64> %a0, <i64 255, i64 255>
2528 %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 255, i64 255>
2529 %3 = icmp sgt <2 x i64> %2, zeroinitializer
2530 %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> zeroinitializer
2531 %5 = trunc <2 x i64> %4 to <2 x i8>
2532 store <2 x i8> %5, ptr%p1
2536 define <4 x i8> @trunc_packus_v4i64_v4i8(<4 x i64> %a0) {
2537 ; SSE2-SSSE3-LABEL: trunc_packus_v4i64_v4i8:
2538 ; SSE2-SSSE3: # %bb.0:
2539 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [255,255]
2540 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
2541 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm4
2542 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm4
2543 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
2544 ; SSE2-SSSE3-NEXT: pxor %xmm6, %xmm6
2545 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm5
2546 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [2147483903,2147483903]
2547 ; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm8
2548 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm8
2549 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm8[0,0,2,2]
2550 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm4
2551 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]
2552 ; SSE2-SSSE3-NEXT: por %xmm4, %xmm5
2553 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm0
2554 ; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm5
2555 ; SSE2-SSSE3-NEXT: por %xmm5, %xmm0
2556 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm4
2557 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm4
2558 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
2559 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm5
2560 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm7
2561 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
2562 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm4
2563 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
2564 ; SSE2-SSSE3-NEXT: por %xmm4, %xmm5
2565 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1
2566 ; SSE2-SSSE3-NEXT: pandn %xmm3, %xmm5
2567 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm5
2568 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm1
2569 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm1
2570 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm3
2571 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
2572 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2573 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm1
2574 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2575 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm1
2576 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2577 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm3
2578 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm3
2579 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm1
2580 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm1
2581 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm4
2582 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
2583 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2584 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm1
2585 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2586 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1
2587 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
2588 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm2
2589 ; SSE2-SSSE3-NEXT: pand %xmm2, %xmm0
2590 ; SSE2-SSSE3-NEXT: packuswb %xmm3, %xmm0
2591 ; SSE2-SSSE3-NEXT: packuswb %xmm0, %xmm0
2592 ; SSE2-SSSE3-NEXT: packuswb %xmm0, %xmm0
2593 ; SSE2-SSSE3-NEXT: retq
2595 ; SSE41-LABEL: trunc_packus_v4i64_v4i8:
2597 ; SSE41-NEXT: movdqa %xmm0, %xmm2
2598 ; SSE41-NEXT: movapd {{.*#+}} xmm4 = [255,255]
2599 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
2600 ; SSE41-NEXT: pxor %xmm3, %xmm0
2601 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [2147483903,2147483903]
2602 ; SSE41-NEXT: movdqa %xmm6, %xmm5
2603 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
2604 ; SSE41-NEXT: movdqa %xmm6, %xmm7
2605 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
2606 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
2607 ; SSE41-NEXT: pand %xmm5, %xmm0
2608 ; SSE41-NEXT: por %xmm7, %xmm0
2609 ; SSE41-NEXT: movapd %xmm4, %xmm5
2610 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5
2611 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2612 ; SSE41-NEXT: pxor %xmm3, %xmm0
2613 ; SSE41-NEXT: movdqa %xmm6, %xmm2
2614 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
2615 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
2616 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2617 ; SSE41-NEXT: pand %xmm2, %xmm0
2618 ; SSE41-NEXT: por %xmm6, %xmm0
2619 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4
2620 ; SSE41-NEXT: xorpd %xmm1, %xmm1
2621 ; SSE41-NEXT: movapd %xmm4, %xmm2
2622 ; SSE41-NEXT: xorpd %xmm3, %xmm2
2623 ; SSE41-NEXT: movapd %xmm2, %xmm6
2624 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm6
2625 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm2
2626 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
2627 ; SSE41-NEXT: pand %xmm6, %xmm0
2628 ; SSE41-NEXT: por %xmm2, %xmm0
2629 ; SSE41-NEXT: pxor %xmm2, %xmm2
2630 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2
2631 ; SSE41-NEXT: movapd %xmm5, %xmm4
2632 ; SSE41-NEXT: xorpd %xmm3, %xmm4
2633 ; SSE41-NEXT: movapd %xmm4, %xmm6
2634 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm6
2635 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
2636 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
2637 ; SSE41-NEXT: pand %xmm6, %xmm0
2638 ; SSE41-NEXT: por %xmm4, %xmm0
2639 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1
2640 ; SSE41-NEXT: packusdw %xmm2, %xmm1
2641 ; SSE41-NEXT: packusdw %xmm1, %xmm1
2642 ; SSE41-NEXT: packuswb %xmm1, %xmm1
2643 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2646 ; AVX1-LABEL: trunc_packus_v4i64_v4i8:
2648 ; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [255,255]
2649 ; AVX1-NEXT: # xmm1 = mem[0,0]
2650 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
2651 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm2
2652 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
2653 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm3
2654 ; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
2655 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
2656 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm3
2657 ; AVX1-NEXT: vpand %xmm0, %xmm3, %xmm0
2658 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm1
2659 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
2660 ; AVX1-NEXT: vpackusdw %xmm0, %xmm1, %xmm0
2661 ; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
2662 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2663 ; AVX1-NEXT: vzeroupper
2666 ; AVX2-LABEL: trunc_packus_v4i64_v4i8:
2668 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [255,255,255,255]
2669 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
2670 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
2671 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
2672 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm1
2673 ; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm0
2674 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
2675 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
2676 ; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
2677 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2678 ; AVX2-NEXT: vzeroupper
2681 ; AVX512F-LABEL: trunc_packus_v4i64_v4i8:
2683 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
2684 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1
2685 ; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
2686 ; AVX512F-NEXT: vpmovusqb %zmm0, %xmm0
2687 ; AVX512F-NEXT: vzeroupper
2688 ; AVX512F-NEXT: retq
2690 ; AVX512VL-LABEL: trunc_packus_v4i64_v4i8:
2691 ; AVX512VL: # %bb.0:
2692 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
2693 ; AVX512VL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0
2694 ; AVX512VL-NEXT: vpmovusqb %ymm0, %xmm0
2695 ; AVX512VL-NEXT: vzeroupper
2696 ; AVX512VL-NEXT: retq
2698 ; AVX512BW-LABEL: trunc_packus_v4i64_v4i8:
2699 ; AVX512BW: # %bb.0:
2700 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
2701 ; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1
2702 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
2703 ; AVX512BW-NEXT: vpmovusqb %zmm0, %xmm0
2704 ; AVX512BW-NEXT: vzeroupper
2705 ; AVX512BW-NEXT: retq
2707 ; AVX512BWVL-LABEL: trunc_packus_v4i64_v4i8:
2708 ; AVX512BWVL: # %bb.0:
2709 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
2710 ; AVX512BWVL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0
2711 ; AVX512BWVL-NEXT: vpmovusqb %ymm0, %xmm0
2712 ; AVX512BWVL-NEXT: vzeroupper
2713 ; AVX512BWVL-NEXT: retq
2715 ; SKX-LABEL: trunc_packus_v4i64_v4i8:
2717 ; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1
2718 ; SKX-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0
2719 ; SKX-NEXT: vpmovusqb %ymm0, %xmm0
2720 ; SKX-NEXT: vzeroupper
2722 %1 = icmp slt <4 x i64> %a0, <i64 255, i64 255, i64 255, i64 255>
2723 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 255, i64 255, i64 255, i64 255>
2724 %3 = icmp sgt <4 x i64> %2, zeroinitializer
2725 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> zeroinitializer
2726 %5 = trunc <4 x i64> %4 to <4 x i8>
2730 define void @trunc_packus_v4i64_v4i8_store(<4 x i64> %a0, ptr%p1) {
2731 ; SSE2-SSSE3-LABEL: trunc_packus_v4i64_v4i8_store:
2732 ; SSE2-SSSE3: # %bb.0:
2733 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [255,255]
2734 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
2735 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm3
2736 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm3
2737 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]
2738 ; SSE2-SSSE3-NEXT: pxor %xmm6, %xmm6
2739 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm5
2740 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [2147483903,2147483903]
2741 ; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm8
2742 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm8
2743 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
2744 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm9
2745 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm8[1,1,3,3]
2746 ; SSE2-SSSE3-NEXT: por %xmm9, %xmm3
2747 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm0
2748 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm3
2749 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm3
2750 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm0
2751 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm0
2752 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
2753 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm6, %xmm5
2754 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm7
2755 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
2756 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm0
2757 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
2758 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm5
2759 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1
2760 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm5
2761 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm5
2762 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm0
2763 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm0
2764 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm1
2765 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm1
2766 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
2767 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm0
2768 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2769 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm0
2770 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2771 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm1
2772 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm1
2773 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm0
2774 ; SSE2-SSSE3-NEXT: pxor %xmm2, %xmm0
2775 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm4
2776 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
2777 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2778 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm2, %xmm0
2779 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2780 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm0
2781 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
2782 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm2
2783 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm2
2784 ; SSE2-SSSE3-NEXT: packuswb %xmm1, %xmm2
2785 ; SSE2-SSSE3-NEXT: packuswb %xmm2, %xmm2
2786 ; SSE2-SSSE3-NEXT: packuswb %xmm2, %xmm2
2787 ; SSE2-SSSE3-NEXT: movd %xmm2, (%rdi)
2788 ; SSE2-SSSE3-NEXT: retq
2790 ; SSE41-LABEL: trunc_packus_v4i64_v4i8_store:
2792 ; SSE41-NEXT: movdqa %xmm0, %xmm2
2793 ; SSE41-NEXT: movapd {{.*#+}} xmm4 = [255,255]
2794 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
2795 ; SSE41-NEXT: pxor %xmm3, %xmm0
2796 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [2147483903,2147483903]
2797 ; SSE41-NEXT: movdqa %xmm6, %xmm5
2798 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
2799 ; SSE41-NEXT: movdqa %xmm6, %xmm7
2800 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm7
2801 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
2802 ; SSE41-NEXT: pand %xmm5, %xmm0
2803 ; SSE41-NEXT: por %xmm7, %xmm0
2804 ; SSE41-NEXT: movapd %xmm4, %xmm5
2805 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5
2806 ; SSE41-NEXT: movdqa %xmm1, %xmm0
2807 ; SSE41-NEXT: pxor %xmm3, %xmm0
2808 ; SSE41-NEXT: movdqa %xmm6, %xmm2
2809 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
2810 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
2811 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2812 ; SSE41-NEXT: pand %xmm2, %xmm0
2813 ; SSE41-NEXT: por %xmm6, %xmm0
2814 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm4
2815 ; SSE41-NEXT: xorpd %xmm1, %xmm1
2816 ; SSE41-NEXT: movapd %xmm4, %xmm2
2817 ; SSE41-NEXT: xorpd %xmm3, %xmm2
2818 ; SSE41-NEXT: movapd %xmm2, %xmm6
2819 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm6
2820 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm2
2821 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
2822 ; SSE41-NEXT: pand %xmm6, %xmm0
2823 ; SSE41-NEXT: por %xmm2, %xmm0
2824 ; SSE41-NEXT: pxor %xmm2, %xmm2
2825 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm2
2826 ; SSE41-NEXT: movapd %xmm5, %xmm4
2827 ; SSE41-NEXT: xorpd %xmm3, %xmm4
2828 ; SSE41-NEXT: movapd %xmm4, %xmm6
2829 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm6
2830 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm4
2831 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
2832 ; SSE41-NEXT: pand %xmm6, %xmm0
2833 ; SSE41-NEXT: por %xmm4, %xmm0
2834 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1
2835 ; SSE41-NEXT: packusdw %xmm2, %xmm1
2836 ; SSE41-NEXT: packusdw %xmm1, %xmm1
2837 ; SSE41-NEXT: packuswb %xmm1, %xmm1
2838 ; SSE41-NEXT: movd %xmm1, (%rdi)
2841 ; AVX1-LABEL: trunc_packus_v4i64_v4i8_store:
2843 ; AVX1-NEXT: vmovddup {{.*#+}} xmm1 = [255,255]
2844 ; AVX1-NEXT: # xmm1 = mem[0,0]
2845 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
2846 ; AVX1-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm2
2847 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
2848 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm3
2849 ; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
2850 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
2851 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm3
2852 ; AVX1-NEXT: vpand %xmm0, %xmm3, %xmm0
2853 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm1
2854 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
2855 ; AVX1-NEXT: vpackusdw %xmm0, %xmm1, %xmm0
2856 ; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
2857 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2858 ; AVX1-NEXT: vmovd %xmm0, (%rdi)
2859 ; AVX1-NEXT: vzeroupper
2862 ; AVX2-LABEL: trunc_packus_v4i64_v4i8_store:
2864 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [255,255,255,255]
2865 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm1, %ymm2
2866 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
2867 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
2868 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm1
2869 ; AVX2-NEXT: vpand %ymm0, %ymm1, %ymm0
2870 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
2871 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
2872 ; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
2873 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
2874 ; AVX2-NEXT: vmovd %xmm0, (%rdi)
2875 ; AVX2-NEXT: vzeroupper
2878 ; AVX512F-LABEL: trunc_packus_v4i64_v4i8_store:
2880 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
2881 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1
2882 ; AVX512F-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
2883 ; AVX512F-NEXT: vpmovusqb %zmm0, %xmm0
2884 ; AVX512F-NEXT: vmovd %xmm0, (%rdi)
2885 ; AVX512F-NEXT: vzeroupper
2886 ; AVX512F-NEXT: retq
2888 ; AVX512VL-LABEL: trunc_packus_v4i64_v4i8_store:
2889 ; AVX512VL: # %bb.0:
2890 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
2891 ; AVX512VL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0
2892 ; AVX512VL-NEXT: vpmovusqb %ymm0, (%rdi)
2893 ; AVX512VL-NEXT: vzeroupper
2894 ; AVX512VL-NEXT: retq
2896 ; AVX512BW-LABEL: trunc_packus_v4i64_v4i8_store:
2897 ; AVX512BW: # %bb.0:
2898 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
2899 ; AVX512BW-NEXT: vpxor %xmm1, %xmm1, %xmm1
2900 ; AVX512BW-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0
2901 ; AVX512BW-NEXT: vpmovusqb %zmm0, %xmm0
2902 ; AVX512BW-NEXT: vmovd %xmm0, (%rdi)
2903 ; AVX512BW-NEXT: vzeroupper
2904 ; AVX512BW-NEXT: retq
2906 ; AVX512BWVL-LABEL: trunc_packus_v4i64_v4i8_store:
2907 ; AVX512BWVL: # %bb.0:
2908 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
2909 ; AVX512BWVL-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0
2910 ; AVX512BWVL-NEXT: vpmovusqb %ymm0, (%rdi)
2911 ; AVX512BWVL-NEXT: vzeroupper
2912 ; AVX512BWVL-NEXT: retq
2914 ; SKX-LABEL: trunc_packus_v4i64_v4i8_store:
2916 ; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1
2917 ; SKX-NEXT: vpmaxsq %ymm1, %ymm0, %ymm0
2918 ; SKX-NEXT: vpmovusqb %ymm0, (%rdi)
2919 ; SKX-NEXT: vzeroupper
2921 %1 = icmp slt <4 x i64> %a0, <i64 255, i64 255, i64 255, i64 255>
2922 %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 255, i64 255, i64 255, i64 255>
2923 %3 = icmp sgt <4 x i64> %2, zeroinitializer
2924 %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> zeroinitializer
2925 %5 = trunc <4 x i64> %4 to <4 x i8>
2926 store <4 x i8> %5, ptr%p1
2930 define <8 x i8> @trunc_packus_v8i64_v8i8(ptr %p0) "min-legal-vector-width"="256" {
2931 ; SSE2-SSSE3-LABEL: trunc_packus_v8i64_v8i8:
2932 ; SSE2-SSSE3: # %bb.0:
2933 ; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm5
2934 ; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm0
2935 ; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm3
2936 ; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm8
2937 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [255,255]
2938 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
2939 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm2
2940 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm2
2941 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm2[1,1,3,3]
2942 ; SSE2-SSSE3-NEXT: pxor %xmm7, %xmm7
2943 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm9
2944 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483903,2147483903]
2945 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm10
2946 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm10
2947 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
2948 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm11
2949 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]
2950 ; SSE2-SSSE3-NEXT: por %xmm11, %xmm2
2951 ; SSE2-SSSE3-NEXT: pand %xmm2, %xmm3
2952 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm2
2953 ; SSE2-SSSE3-NEXT: por %xmm3, %xmm2
2954 ; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm3
2955 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm3
2956 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm3[1,1,3,3]
2957 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm9
2958 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm10
2959 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm10
2960 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
2961 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm11
2962 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm10[1,1,3,3]
2963 ; SSE2-SSSE3-NEXT: por %xmm11, %xmm3
2964 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm8
2965 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm3
2966 ; SSE2-SSSE3-NEXT: por %xmm8, %xmm3
2967 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm8
2968 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm8
2969 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[1,1,3,3]
2970 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm9
2971 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm10
2972 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm8, %xmm10
2973 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
2974 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm11
2975 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm10[1,1,3,3]
2976 ; SSE2-SSSE3-NEXT: por %xmm11, %xmm8
2977 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm5
2978 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm8
2979 ; SSE2-SSSE3-NEXT: por %xmm5, %xmm8
2980 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm5
2981 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm5
2982 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm5[1,1,3,3]
2983 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm9
2984 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm6
2985 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm6[0,0,2,2]
2986 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm5
2987 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2988 ; SSE2-SSSE3-NEXT: por %xmm5, %xmm6
2989 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm0
2990 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm6
2991 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm6
2992 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm0
2993 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm0
2994 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm4
2995 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm4
2996 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2997 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0
2998 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2999 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm0
3000 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3001 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm4
3002 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm4
3003 ; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm0
3004 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm0
3005 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm5
3006 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm5
3007 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
3008 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0
3009 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
3010 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm7
3011 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
3012 ; SSE2-SSSE3-NEXT: por %xmm7, %xmm0
3013 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm0
3014 ; SSE2-SSSE3-NEXT: packuswb %xmm4, %xmm0
3015 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm4
3016 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm4
3017 ; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm5
3018 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm5
3019 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
3020 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm4
3021 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3022 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm4
3023 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
3024 ; SSE2-SSSE3-NEXT: por %xmm4, %xmm5
3025 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm5
3026 ; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm3
3027 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm3
3028 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm4
3029 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm4
3030 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
3031 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm3
3032 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
3033 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm1
3034 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
3035 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm3
3036 ; SSE2-SSSE3-NEXT: pand %xmm2, %xmm3
3037 ; SSE2-SSSE3-NEXT: packuswb %xmm5, %xmm3
3038 ; SSE2-SSSE3-NEXT: packuswb %xmm3, %xmm0
3039 ; SSE2-SSSE3-NEXT: packuswb %xmm0, %xmm0
3040 ; SSE2-SSSE3-NEXT: retq
3042 ; SSE41-LABEL: trunc_packus_v8i64_v8i8:
3044 ; SSE41-NEXT: movdqa (%rdi), %xmm7
3045 ; SSE41-NEXT: movdqa 16(%rdi), %xmm5
3046 ; SSE41-NEXT: movdqa 32(%rdi), %xmm4
3047 ; SSE41-NEXT: movdqa 48(%rdi), %xmm8
3048 ; SSE41-NEXT: movapd {{.*#+}} xmm1 = [255,255]
3049 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
3050 ; SSE41-NEXT: movdqa %xmm4, %xmm0
3051 ; SSE41-NEXT: pxor %xmm2, %xmm0
3052 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [2147483903,2147483903]
3053 ; SSE41-NEXT: movdqa %xmm6, %xmm3
3054 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
3055 ; SSE41-NEXT: movdqa %xmm6, %xmm9
3056 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm9
3057 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
3058 ; SSE41-NEXT: pand %xmm3, %xmm0
3059 ; SSE41-NEXT: por %xmm9, %xmm0
3060 ; SSE41-NEXT: movapd %xmm1, %xmm3
3061 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm3
3062 ; SSE41-NEXT: movdqa %xmm8, %xmm0
3063 ; SSE41-NEXT: pxor %xmm2, %xmm0
3064 ; SSE41-NEXT: movdqa %xmm6, %xmm4
3065 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
3066 ; SSE41-NEXT: movdqa %xmm6, %xmm9
3067 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm9
3068 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
3069 ; SSE41-NEXT: pand %xmm4, %xmm0
3070 ; SSE41-NEXT: por %xmm9, %xmm0
3071 ; SSE41-NEXT: movapd %xmm1, %xmm4
3072 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm4
3073 ; SSE41-NEXT: movdqa %xmm7, %xmm0
3074 ; SSE41-NEXT: pxor %xmm2, %xmm0
3075 ; SSE41-NEXT: movdqa %xmm6, %xmm8
3076 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm8
3077 ; SSE41-NEXT: movdqa %xmm6, %xmm9
3078 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm9
3079 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
3080 ; SSE41-NEXT: pand %xmm8, %xmm0
3081 ; SSE41-NEXT: por %xmm9, %xmm0
3082 ; SSE41-NEXT: movapd %xmm1, %xmm8
3083 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm8
3084 ; SSE41-NEXT: movdqa %xmm5, %xmm0
3085 ; SSE41-NEXT: pxor %xmm2, %xmm0
3086 ; SSE41-NEXT: movdqa %xmm6, %xmm7
3087 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm7
3088 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
3089 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3090 ; SSE41-NEXT: pand %xmm7, %xmm0
3091 ; SSE41-NEXT: por %xmm6, %xmm0
3092 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1
3093 ; SSE41-NEXT: xorpd %xmm5, %xmm5
3094 ; SSE41-NEXT: movapd %xmm1, %xmm6
3095 ; SSE41-NEXT: xorpd %xmm2, %xmm6
3096 ; SSE41-NEXT: movapd %xmm6, %xmm7
3097 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm7
3098 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm6
3099 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3100 ; SSE41-NEXT: pand %xmm7, %xmm0
3101 ; SSE41-NEXT: por %xmm6, %xmm0
3102 ; SSE41-NEXT: pxor %xmm6, %xmm6
3103 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm6
3104 ; SSE41-NEXT: movapd %xmm8, %xmm1
3105 ; SSE41-NEXT: xorpd %xmm2, %xmm1
3106 ; SSE41-NEXT: movapd %xmm1, %xmm7
3107 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm7
3108 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm1
3109 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
3110 ; SSE41-NEXT: pand %xmm7, %xmm0
3111 ; SSE41-NEXT: por %xmm1, %xmm0
3112 ; SSE41-NEXT: pxor %xmm1, %xmm1
3113 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm1
3114 ; SSE41-NEXT: packusdw %xmm6, %xmm1
3115 ; SSE41-NEXT: movapd %xmm4, %xmm6
3116 ; SSE41-NEXT: xorpd %xmm2, %xmm6
3117 ; SSE41-NEXT: movapd %xmm6, %xmm7
3118 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm7
3119 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm6
3120 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3121 ; SSE41-NEXT: pand %xmm7, %xmm0
3122 ; SSE41-NEXT: por %xmm6, %xmm0
3123 ; SSE41-NEXT: pxor %xmm6, %xmm6
3124 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm6
3125 ; SSE41-NEXT: movapd %xmm3, %xmm4
3126 ; SSE41-NEXT: xorpd %xmm2, %xmm4
3127 ; SSE41-NEXT: movapd %xmm4, %xmm7
3128 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm7
3129 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm4
3130 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
3131 ; SSE41-NEXT: pand %xmm7, %xmm0
3132 ; SSE41-NEXT: por %xmm4, %xmm0
3133 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm5
3134 ; SSE41-NEXT: packusdw %xmm6, %xmm5
3135 ; SSE41-NEXT: packusdw %xmm5, %xmm1
3136 ; SSE41-NEXT: packuswb %xmm1, %xmm1
3137 ; SSE41-NEXT: movdqa %xmm1, %xmm0
3140 ; AVX1-LABEL: trunc_packus_v8i64_v8i8:
3142 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
3143 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
3144 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2
3145 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3
3146 ; AVX1-NEXT: vmovddup {{.*#+}} xmm4 = [255,255]
3147 ; AVX1-NEXT: # xmm4 = mem[0,0]
3148 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm5
3149 ; AVX1-NEXT: vblendvpd %xmm5, %xmm2, %xmm4, %xmm2
3150 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm5
3151 ; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm4, %xmm3
3152 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm5
3153 ; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
3154 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm5
3155 ; AVX1-NEXT: vblendvpd %xmm5, %xmm1, %xmm4, %xmm1
3156 ; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4
3157 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm5
3158 ; AVX1-NEXT: vpand %xmm1, %xmm5, %xmm1
3159 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm5
3160 ; AVX1-NEXT: vpand %xmm0, %xmm5, %xmm0
3161 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
3162 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm1
3163 ; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1
3164 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm3
3165 ; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm2
3166 ; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm1
3167 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
3168 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3171 ; AVX2-LABEL: trunc_packus_v8i64_v8i8:
3173 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
3174 ; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1
3175 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [255,255,255,255]
3176 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3
3177 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
3178 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3
3179 ; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
3180 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
3181 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3
3182 ; AVX2-NEXT: vpand %ymm1, %ymm3, %ymm1
3183 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm2
3184 ; AVX2-NEXT: vpand %ymm0, %ymm2, %ymm0
3185 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
3186 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
3187 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
3188 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
3189 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3190 ; AVX2-NEXT: vzeroupper
3193 ; AVX512-LABEL: trunc_packus_v8i64_v8i8:
3195 ; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0
3196 ; AVX512-NEXT: vpmaxsq (%rdi), %zmm0, %zmm0
3197 ; AVX512-NEXT: vpmovusqb %zmm0, %xmm0
3198 ; AVX512-NEXT: vzeroupper
3201 ; SKX-LABEL: trunc_packus_v8i64_v8i8:
3203 ; SKX-NEXT: vpxor %xmm0, %xmm0, %xmm0
3204 ; SKX-NEXT: vpmaxsq 32(%rdi), %ymm0, %ymm1
3205 ; SKX-NEXT: vpmovusqb %ymm1, %xmm1
3206 ; SKX-NEXT: vpmaxsq (%rdi), %ymm0, %ymm0
3207 ; SKX-NEXT: vpmovusqb %ymm0, %xmm0
3208 ; SKX-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3209 ; SKX-NEXT: vzeroupper
3211 %a0 = load <8 x i64>, ptr %p0
3212 %1 = icmp slt <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
3213 %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
3214 %3 = icmp sgt <8 x i64> %2, zeroinitializer
3215 %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> zeroinitializer
3216 %5 = trunc <8 x i64> %4 to <8 x i8>
3220 define void @trunc_packus_v8i64_v8i8_store(ptr %p0, ptr%p1) "min-legal-vector-width"="256" {
3221 ; SSE2-SSSE3-LABEL: trunc_packus_v8i64_v8i8_store:
3222 ; SSE2-SSSE3: # %bb.0:
3223 ; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm5
3224 ; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm3
3225 ; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm2
3226 ; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm8
3227 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [255,255]
3228 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
3229 ; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm1
3230 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm1
3231 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm1[1,1,3,3]
3232 ; SSE2-SSSE3-NEXT: pxor %xmm7, %xmm7
3233 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm9
3234 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483903,2147483903]
3235 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm10
3236 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm10
3237 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
3238 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm11
3239 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm10[1,1,3,3]
3240 ; SSE2-SSSE3-NEXT: por %xmm11, %xmm1
3241 ; SSE2-SSSE3-NEXT: pand %xmm1, %xmm2
3242 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm1
3243 ; SSE2-SSSE3-NEXT: por %xmm2, %xmm1
3244 ; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm2
3245 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm2
3246 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm2[1,1,3,3]
3247 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm9
3248 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm10
3249 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm10
3250 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
3251 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm11
3252 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]
3253 ; SSE2-SSSE3-NEXT: por %xmm11, %xmm2
3254 ; SSE2-SSSE3-NEXT: pand %xmm2, %xmm8
3255 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm2
3256 ; SSE2-SSSE3-NEXT: por %xmm8, %xmm2
3257 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm8
3258 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm8
3259 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[1,1,3,3]
3260 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm9
3261 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm10
3262 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm8, %xmm10
3263 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
3264 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm11
3265 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm10[1,1,3,3]
3266 ; SSE2-SSSE3-NEXT: por %xmm11, %xmm8
3267 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm5
3268 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm8
3269 ; SSE2-SSSE3-NEXT: por %xmm5, %xmm8
3270 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm5
3271 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm5
3272 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm5[1,1,3,3]
3273 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm7, %xmm9
3274 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm6
3275 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm6[0,0,2,2]
3276 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm5
3277 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
3278 ; SSE2-SSSE3-NEXT: por %xmm5, %xmm6
3279 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm3
3280 ; SSE2-SSSE3-NEXT: pandn %xmm4, %xmm6
3281 ; SSE2-SSSE3-NEXT: por %xmm3, %xmm6
3282 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm3
3283 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm3
3284 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm4
3285 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
3286 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
3287 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm3
3288 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3289 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm3
3290 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3291 ; SSE2-SSSE3-NEXT: por %xmm3, %xmm4
3292 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm4
3293 ; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm3
3294 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm3
3295 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm5
3296 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm5
3297 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
3298 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm3
3299 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
3300 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm7
3301 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3]
3302 ; SSE2-SSSE3-NEXT: por %xmm7, %xmm3
3303 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm3
3304 ; SSE2-SSSE3-NEXT: packuswb %xmm4, %xmm3
3305 ; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm4
3306 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm4
3307 ; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm5
3308 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm5
3309 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
3310 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm4
3311 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3312 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm4
3313 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
3314 ; SSE2-SSSE3-NEXT: por %xmm4, %xmm5
3315 ; SSE2-SSSE3-NEXT: pand %xmm2, %xmm5
3316 ; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm2
3317 ; SSE2-SSSE3-NEXT: pxor %xmm0, %xmm2
3318 ; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm4
3319 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
3320 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
3321 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm0, %xmm2
3322 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
3323 ; SSE2-SSSE3-NEXT: pand %xmm6, %xmm0
3324 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
3325 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm2
3326 ; SSE2-SSSE3-NEXT: pand %xmm1, %xmm2
3327 ; SSE2-SSSE3-NEXT: packuswb %xmm5, %xmm2
3328 ; SSE2-SSSE3-NEXT: packuswb %xmm2, %xmm3
3329 ; SSE2-SSSE3-NEXT: packuswb %xmm3, %xmm3
3330 ; SSE2-SSSE3-NEXT: movq %xmm3, (%rsi)
3331 ; SSE2-SSSE3-NEXT: retq
3333 ; SSE41-LABEL: trunc_packus_v8i64_v8i8_store:
3335 ; SSE41-NEXT: movdqa (%rdi), %xmm7
3336 ; SSE41-NEXT: movdqa 16(%rdi), %xmm5
3337 ; SSE41-NEXT: movdqa 32(%rdi), %xmm3
3338 ; SSE41-NEXT: movdqa 48(%rdi), %xmm8
3339 ; SSE41-NEXT: movapd {{.*#+}} xmm4 = [255,255]
3340 ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
3341 ; SSE41-NEXT: movdqa %xmm3, %xmm0
3342 ; SSE41-NEXT: pxor %xmm1, %xmm0
3343 ; SSE41-NEXT: movdqa {{.*#+}} xmm6 = [2147483903,2147483903]
3344 ; SSE41-NEXT: movdqa %xmm6, %xmm2
3345 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm2
3346 ; SSE41-NEXT: movdqa %xmm6, %xmm9
3347 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm9
3348 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
3349 ; SSE41-NEXT: pand %xmm2, %xmm0
3350 ; SSE41-NEXT: por %xmm9, %xmm0
3351 ; SSE41-NEXT: movapd %xmm4, %xmm2
3352 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm2
3353 ; SSE41-NEXT: movdqa %xmm8, %xmm0
3354 ; SSE41-NEXT: pxor %xmm1, %xmm0
3355 ; SSE41-NEXT: movdqa %xmm6, %xmm3
3356 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
3357 ; SSE41-NEXT: movdqa %xmm6, %xmm9
3358 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm9
3359 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
3360 ; SSE41-NEXT: pand %xmm3, %xmm0
3361 ; SSE41-NEXT: por %xmm9, %xmm0
3362 ; SSE41-NEXT: movapd %xmm4, %xmm3
3363 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm3
3364 ; SSE41-NEXT: movdqa %xmm7, %xmm0
3365 ; SSE41-NEXT: pxor %xmm1, %xmm0
3366 ; SSE41-NEXT: movdqa %xmm6, %xmm8
3367 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm8
3368 ; SSE41-NEXT: movdqa %xmm6, %xmm9
3369 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm9
3370 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
3371 ; SSE41-NEXT: pand %xmm8, %xmm0
3372 ; SSE41-NEXT: por %xmm9, %xmm0
3373 ; SSE41-NEXT: movapd %xmm4, %xmm8
3374 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm8
3375 ; SSE41-NEXT: movdqa %xmm5, %xmm0
3376 ; SSE41-NEXT: pxor %xmm1, %xmm0
3377 ; SSE41-NEXT: movdqa %xmm6, %xmm7
3378 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm7
3379 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
3380 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3381 ; SSE41-NEXT: pand %xmm7, %xmm0
3382 ; SSE41-NEXT: por %xmm6, %xmm0
3383 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm4
3384 ; SSE41-NEXT: xorpd %xmm5, %xmm5
3385 ; SSE41-NEXT: movapd %xmm4, %xmm6
3386 ; SSE41-NEXT: xorpd %xmm1, %xmm6
3387 ; SSE41-NEXT: movapd %xmm6, %xmm7
3388 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm7
3389 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm6
3390 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3391 ; SSE41-NEXT: pand %xmm7, %xmm0
3392 ; SSE41-NEXT: por %xmm6, %xmm0
3393 ; SSE41-NEXT: pxor %xmm6, %xmm6
3394 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm6
3395 ; SSE41-NEXT: movapd %xmm8, %xmm4
3396 ; SSE41-NEXT: xorpd %xmm1, %xmm4
3397 ; SSE41-NEXT: movapd %xmm4, %xmm7
3398 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm7
3399 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm4
3400 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
3401 ; SSE41-NEXT: pand %xmm7, %xmm0
3402 ; SSE41-NEXT: por %xmm4, %xmm0
3403 ; SSE41-NEXT: pxor %xmm4, %xmm4
3404 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm4
3405 ; SSE41-NEXT: packusdw %xmm6, %xmm4
3406 ; SSE41-NEXT: movapd %xmm3, %xmm6
3407 ; SSE41-NEXT: xorpd %xmm1, %xmm6
3408 ; SSE41-NEXT: movapd %xmm6, %xmm7
3409 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm7
3410 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm6
3411 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3412 ; SSE41-NEXT: pand %xmm7, %xmm0
3413 ; SSE41-NEXT: por %xmm6, %xmm0
3414 ; SSE41-NEXT: pxor %xmm6, %xmm6
3415 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm6
3416 ; SSE41-NEXT: movapd %xmm2, %xmm3
3417 ; SSE41-NEXT: xorpd %xmm1, %xmm3
3418 ; SSE41-NEXT: movapd %xmm3, %xmm7
3419 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm7
3420 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm3
3421 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
3422 ; SSE41-NEXT: pand %xmm7, %xmm0
3423 ; SSE41-NEXT: por %xmm3, %xmm0
3424 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm5
3425 ; SSE41-NEXT: packusdw %xmm6, %xmm5
3426 ; SSE41-NEXT: packusdw %xmm5, %xmm4
3427 ; SSE41-NEXT: packuswb %xmm4, %xmm4
3428 ; SSE41-NEXT: movq %xmm4, (%rsi)
3431 ; AVX1-LABEL: trunc_packus_v8i64_v8i8_store:
3433 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
3434 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
3435 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm2
3436 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm3
3437 ; AVX1-NEXT: vmovddup {{.*#+}} xmm4 = [255,255]
3438 ; AVX1-NEXT: # xmm4 = mem[0,0]
3439 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm4, %xmm5
3440 ; AVX1-NEXT: vblendvpd %xmm5, %xmm2, %xmm4, %xmm2
3441 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm5
3442 ; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm4, %xmm3
3443 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm5
3444 ; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
3445 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm5
3446 ; AVX1-NEXT: vblendvpd %xmm5, %xmm1, %xmm4, %xmm1
3447 ; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4
3448 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm5
3449 ; AVX1-NEXT: vpand %xmm1, %xmm5, %xmm1
3450 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm5
3451 ; AVX1-NEXT: vpand %xmm0, %xmm5, %xmm0
3452 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
3453 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm1
3454 ; AVX1-NEXT: vpand %xmm3, %xmm1, %xmm1
3455 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm3
3456 ; AVX1-NEXT: vpand %xmm2, %xmm3, %xmm2
3457 ; AVX1-NEXT: vpackusdw %xmm1, %xmm2, %xmm1
3458 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
3459 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3460 ; AVX1-NEXT: vmovq %xmm0, (%rsi)
3463 ; AVX2-LABEL: trunc_packus_v8i64_v8i8_store:
3465 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
3466 ; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1
3467 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [255,255,255,255]
3468 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3
3469 ; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
3470 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm2, %ymm3
3471 ; AVX2-NEXT: vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
3472 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
3473 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm3
3474 ; AVX2-NEXT: vpand %ymm1, %ymm3, %ymm1
3475 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm2
3476 ; AVX2-NEXT: vpand %ymm0, %ymm2, %ymm0
3477 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
3478 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
3479 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
3480 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
3481 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
3482 ; AVX2-NEXT: vmovq %xmm0, (%rsi)
3483 ; AVX2-NEXT: vzeroupper
3486 ; AVX512-LABEL: trunc_packus_v8i64_v8i8_store:
3488 ; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0
3489 ; AVX512-NEXT: vpmaxsq (%rdi), %zmm0, %zmm0
3490 ; AVX512-NEXT: vpmovusqb %zmm0, (%rsi)
3491 ; AVX512-NEXT: vzeroupper
3494 ; SKX-LABEL: trunc_packus_v8i64_v8i8_store:
3496 ; SKX-NEXT: vpxor %xmm0, %xmm0, %xmm0
3497 ; SKX-NEXT: vpmaxsq 32(%rdi), %ymm0, %ymm1
3498 ; SKX-NEXT: vpmovusqb %ymm1, %xmm1
3499 ; SKX-NEXT: vpmaxsq (%rdi), %ymm0, %ymm0
3500 ; SKX-NEXT: vpmovusqb %ymm0, %xmm0
3501 ; SKX-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3502 ; SKX-NEXT: vmovq %xmm0, (%rsi)
3503 ; SKX-NEXT: vzeroupper
3505 %a0 = load <8 x i64>, ptr %p0
3506 %1 = icmp slt <8 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
3507 %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
3508 %3 = icmp sgt <8 x i64> %2, zeroinitializer
3509 %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> zeroinitializer
3510 %5 = trunc <8 x i64> %4 to <8 x i8>
3511 store <8 x i8> %5, ptr%p1
3515 define <16 x i8> @trunc_packus_v16i64_v16i8(ptr %p0) "min-legal-vector-width"="256" {
3516 ; SSE2-SSSE3-LABEL: trunc_packus_v16i64_v16i8:
3517 ; SSE2-SSSE3: # %bb.0:
3518 ; SSE2-SSSE3-NEXT: movdqa (%rdi), %xmm7
3519 ; SSE2-SSSE3-NEXT: movdqa 16(%rdi), %xmm0
3520 ; SSE2-SSSE3-NEXT: movdqa 32(%rdi), %xmm12
3521 ; SSE2-SSSE3-NEXT: movdqa 48(%rdi), %xmm11
3522 ; SSE2-SSSE3-NEXT: movdqa 80(%rdi), %xmm10
3523 ; SSE2-SSSE3-NEXT: movdqa 64(%rdi), %xmm5
3524 ; SSE2-SSSE3-NEXT: movdqa 112(%rdi), %xmm4
3525 ; SSE2-SSSE3-NEXT: movdqa 96(%rdi), %xmm3
3526 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [255,255]
3527 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
3528 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm2
3529 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm2
3530 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm2[1,1,3,3]
3531 ; SSE2-SSSE3-NEXT: pxor %xmm9, %xmm9
3532 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm9, %xmm13
3533 ; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [2147483903,2147483903]
3534 ; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm14
3535 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm2, %xmm14
3536 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
3537 ; SSE2-SSSE3-NEXT: pand %xmm13, %xmm15
3538 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm14[1,1,3,3]
3539 ; SSE2-SSSE3-NEXT: por %xmm15, %xmm2
3540 ; SSE2-SSSE3-NEXT: pand %xmm2, %xmm3
3541 ; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm2
3542 ; SSE2-SSSE3-NEXT: por %xmm3, %xmm2
3543 ; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm3
3544 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm3
3545 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm3[1,1,3,3]
3546 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm9, %xmm13
3547 ; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm14
3548 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm3, %xmm14
3549 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
3550 ; SSE2-SSSE3-NEXT: pand %xmm13, %xmm15
3551 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm14[1,1,3,3]
3552 ; SSE2-SSSE3-NEXT: por %xmm15, %xmm3
3553 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm4
3554 ; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm3
3555 ; SSE2-SSSE3-NEXT: por %xmm4, %xmm3
3556 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm4
3557 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm4
3558 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm4[1,1,3,3]
3559 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm9, %xmm13
3560 ; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm14
3561 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm4, %xmm14
3562 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
3563 ; SSE2-SSSE3-NEXT: pand %xmm13, %xmm15
3564 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm14[1,1,3,3]
3565 ; SSE2-SSSE3-NEXT: por %xmm15, %xmm4
3566 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm5
3567 ; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm4
3568 ; SSE2-SSSE3-NEXT: por %xmm5, %xmm4
3569 ; SSE2-SSSE3-NEXT: movdqa %xmm10, %xmm5
3570 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm5
3571 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm5[1,1,3,3]
3572 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm9, %xmm13
3573 ; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm14
3574 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm5, %xmm14
3575 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
3576 ; SSE2-SSSE3-NEXT: pand %xmm13, %xmm15
3577 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm14[1,1,3,3]
3578 ; SSE2-SSSE3-NEXT: por %xmm15, %xmm5
3579 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm10
3580 ; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm5
3581 ; SSE2-SSSE3-NEXT: por %xmm10, %xmm5
3582 ; SSE2-SSSE3-NEXT: movdqa %xmm12, %xmm10
3583 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm10
3584 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm10[1,1,3,3]
3585 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm9, %xmm13
3586 ; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm14
3587 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm10, %xmm14
3588 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
3589 ; SSE2-SSSE3-NEXT: pand %xmm13, %xmm15
3590 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm14[1,1,3,3]
3591 ; SSE2-SSSE3-NEXT: por %xmm15, %xmm10
3592 ; SSE2-SSSE3-NEXT: pand %xmm10, %xmm12
3593 ; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm10
3594 ; SSE2-SSSE3-NEXT: por %xmm12, %xmm10
3595 ; SSE2-SSSE3-NEXT: movdqa %xmm11, %xmm12
3596 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm12
3597 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm12[1,1,3,3]
3598 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm9, %xmm13
3599 ; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm14
3600 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm12, %xmm14
3601 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
3602 ; SSE2-SSSE3-NEXT: pand %xmm13, %xmm15
3603 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm14[1,1,3,3]
3604 ; SSE2-SSSE3-NEXT: por %xmm15, %xmm12
3605 ; SSE2-SSSE3-NEXT: pand %xmm12, %xmm11
3606 ; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm12
3607 ; SSE2-SSSE3-NEXT: por %xmm11, %xmm12
3608 ; SSE2-SSSE3-NEXT: movdqa %xmm7, %xmm11
3609 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm11
3610 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm11[1,1,3,3]
3611 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm9, %xmm13
3612 ; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm14
3613 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm11, %xmm14
3614 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
3615 ; SSE2-SSSE3-NEXT: pand %xmm13, %xmm15
3616 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm14[1,1,3,3]
3617 ; SSE2-SSSE3-NEXT: por %xmm15, %xmm11
3618 ; SSE2-SSSE3-NEXT: pand %xmm11, %xmm7
3619 ; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm11
3620 ; SSE2-SSSE3-NEXT: por %xmm7, %xmm11
3621 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm7
3622 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm7
3623 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm7[1,1,3,3]
3624 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm9, %xmm13
3625 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm7, %xmm8
3626 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm8[0,0,2,2]
3627 ; SSE2-SSSE3-NEXT: pand %xmm13, %xmm7
3628 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
3629 ; SSE2-SSSE3-NEXT: por %xmm7, %xmm8
3630 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm0
3631 ; SSE2-SSSE3-NEXT: pandn %xmm6, %xmm8
3632 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm8
3633 ; SSE2-SSSE3-NEXT: movdqa %xmm8, %xmm0
3634 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm0
3635 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm6
3636 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm6
3637 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
3638 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0
3639 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3640 ; SSE2-SSSE3-NEXT: pand %xmm7, %xmm0
3641 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
3642 ; SSE2-SSSE3-NEXT: por %xmm0, %xmm6
3643 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm6
3644 ; SSE2-SSSE3-NEXT: movdqa %xmm11, %xmm0
3645 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm0
3646 ; SSE2-SSSE3-NEXT: movdqa %xmm0, %xmm7
3647 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm7
3648 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
3649 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0
3650 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm0[1,1,3,3]
3651 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm9
3652 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
3653 ; SSE2-SSSE3-NEXT: por %xmm9, %xmm0
3654 ; SSE2-SSSE3-NEXT: pand %xmm11, %xmm0
3655 ; SSE2-SSSE3-NEXT: packuswb %xmm6, %xmm0
3656 ; SSE2-SSSE3-NEXT: movdqa %xmm12, %xmm6
3657 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm6
3658 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm7
3659 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm7
3660 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
3661 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm6
3662 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
3663 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm6
3664 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
3665 ; SSE2-SSSE3-NEXT: por %xmm6, %xmm7
3666 ; SSE2-SSSE3-NEXT: pand %xmm12, %xmm7
3667 ; SSE2-SSSE3-NEXT: movdqa %xmm10, %xmm6
3668 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm6
3669 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm8
3670 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm8
3671 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
3672 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm6
3673 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
3674 ; SSE2-SSSE3-NEXT: pand %xmm9, %xmm6
3675 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
3676 ; SSE2-SSSE3-NEXT: por %xmm6, %xmm8
3677 ; SSE2-SSSE3-NEXT: pand %xmm10, %xmm8
3678 ; SSE2-SSSE3-NEXT: packuswb %xmm7, %xmm8
3679 ; SSE2-SSSE3-NEXT: packuswb %xmm8, %xmm0
3680 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm6
3681 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm6
3682 ; SSE2-SSSE3-NEXT: movdqa %xmm6, %xmm7
3683 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm7
3684 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
3685 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm6
3686 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
3687 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm6
3688 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
3689 ; SSE2-SSSE3-NEXT: por %xmm6, %xmm7
3690 ; SSE2-SSSE3-NEXT: pand %xmm5, %xmm7
3691 ; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm5
3692 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm5
3693 ; SSE2-SSSE3-NEXT: movdqa %xmm5, %xmm6
3694 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm6
3695 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
3696 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm5
3697 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm5[1,1,3,3]
3698 ; SSE2-SSSE3-NEXT: pand %xmm8, %xmm9
3699 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
3700 ; SSE2-SSSE3-NEXT: por %xmm9, %xmm5
3701 ; SSE2-SSSE3-NEXT: pand %xmm4, %xmm5
3702 ; SSE2-SSSE3-NEXT: packuswb %xmm7, %xmm5
3703 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm4
3704 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm4
3705 ; SSE2-SSSE3-NEXT: movdqa %xmm4, %xmm6
3706 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm6
3707 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
3708 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm4
3709 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3710 ; SSE2-SSSE3-NEXT: pand %xmm7, %xmm4
3711 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
3712 ; SSE2-SSSE3-NEXT: por %xmm4, %xmm6
3713 ; SSE2-SSSE3-NEXT: pand %xmm3, %xmm6
3714 ; SSE2-SSSE3-NEXT: movdqa %xmm2, %xmm3
3715 ; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm3
3716 ; SSE2-SSSE3-NEXT: movdqa %xmm3, %xmm4
3717 ; SSE2-SSSE3-NEXT: pcmpgtd %xmm1, %xmm4
3718 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
3719 ; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm3
3720 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
3721 ; SSE2-SSSE3-NEXT: pand %xmm7, %xmm1
3722 ; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
3723 ; SSE2-SSSE3-NEXT: por %xmm1, %xmm3
3724 ; SSE2-SSSE3-NEXT: pand %xmm2, %xmm3
3725 ; SSE2-SSSE3-NEXT: packuswb %xmm6, %xmm3
3726 ; SSE2-SSSE3-NEXT: packuswb %xmm3, %xmm5
3727 ; SSE2-SSSE3-NEXT: packuswb %xmm5, %xmm0
3728 ; SSE2-SSSE3-NEXT: retq
3730 ; SSE41-LABEL: trunc_packus_v16i64_v16i8:
3732 ; SSE41-NEXT: movdqa (%rdi), %xmm8
3733 ; SSE41-NEXT: movdqa 16(%rdi), %xmm7
3734 ; SSE41-NEXT: movdqa 32(%rdi), %xmm12
3735 ; SSE41-NEXT: movdqa 48(%rdi), %xmm11
3736 ; SSE41-NEXT: movdqa 80(%rdi), %xmm10
3737 ; SSE41-NEXT: movdqa 64(%rdi), %xmm6
3738 ; SSE41-NEXT: movdqa 112(%rdi), %xmm5
3739 ; SSE41-NEXT: movdqa 96(%rdi), %xmm4
3740 ; SSE41-NEXT: movapd {{.*#+}} xmm1 = [255,255]
3741 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
3742 ; SSE41-NEXT: movdqa %xmm4, %xmm0
3743 ; SSE41-NEXT: pxor %xmm2, %xmm0
3744 ; SSE41-NEXT: movdqa {{.*#+}} xmm9 = [2147483903,2147483903]
3745 ; SSE41-NEXT: movdqa %xmm9, %xmm3
3746 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
3747 ; SSE41-NEXT: movdqa %xmm9, %xmm13
3748 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm13
3749 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]
3750 ; SSE41-NEXT: pand %xmm3, %xmm0
3751 ; SSE41-NEXT: por %xmm13, %xmm0
3752 ; SSE41-NEXT: movapd %xmm1, %xmm3
3753 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm3
3754 ; SSE41-NEXT: movdqa %xmm5, %xmm0
3755 ; SSE41-NEXT: pxor %xmm2, %xmm0
3756 ; SSE41-NEXT: movdqa %xmm9, %xmm4
3757 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
3758 ; SSE41-NEXT: movdqa %xmm9, %xmm13
3759 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm13
3760 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]
3761 ; SSE41-NEXT: pand %xmm4, %xmm0
3762 ; SSE41-NEXT: por %xmm13, %xmm0
3763 ; SSE41-NEXT: movapd %xmm1, %xmm4
3764 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm4
3765 ; SSE41-NEXT: movdqa %xmm6, %xmm0
3766 ; SSE41-NEXT: pxor %xmm2, %xmm0
3767 ; SSE41-NEXT: movdqa %xmm9, %xmm5
3768 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
3769 ; SSE41-NEXT: movdqa %xmm9, %xmm13
3770 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm13
3771 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]
3772 ; SSE41-NEXT: pand %xmm5, %xmm0
3773 ; SSE41-NEXT: por %xmm13, %xmm0
3774 ; SSE41-NEXT: movapd %xmm1, %xmm5
3775 ; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm5
3776 ; SSE41-NEXT: movdqa %xmm10, %xmm0
3777 ; SSE41-NEXT: pxor %xmm2, %xmm0
3778 ; SSE41-NEXT: movdqa %xmm9, %xmm6
3779 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm6
3780 ; SSE41-NEXT: movdqa %xmm9, %xmm13
3781 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm13
3782 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]
3783 ; SSE41-NEXT: pand %xmm6, %xmm0
3784 ; SSE41-NEXT: por %xmm13, %xmm0
3785 ; SSE41-NEXT: movapd %xmm1, %xmm6
3786 ; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm6
3787 ; SSE41-NEXT: movdqa %xmm12, %xmm0
3788 ; SSE41-NEXT: pxor %xmm2, %xmm0
3789 ; SSE41-NEXT: movdqa %xmm9, %xmm10
3790 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm10
3791 ; SSE41-NEXT: movdqa %xmm9, %xmm13
3792 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm13
3793 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]
3794 ; SSE41-NEXT: pand %xmm10, %xmm0
3795 ; SSE41-NEXT: por %xmm13, %xmm0
3796 ; SSE41-NEXT: movapd %xmm1, %xmm10
3797 ; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm10
3798 ; SSE41-NEXT: movdqa %xmm11, %xmm0
3799 ; SSE41-NEXT: pxor %xmm2, %xmm0
3800 ; SSE41-NEXT: movdqa %xmm9, %xmm12
3801 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm12
3802 ; SSE41-NEXT: movdqa %xmm9, %xmm13
3803 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm13
3804 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]
3805 ; SSE41-NEXT: pand %xmm12, %xmm0
3806 ; SSE41-NEXT: por %xmm13, %xmm0
3807 ; SSE41-NEXT: movapd %xmm1, %xmm12
3808 ; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm12
3809 ; SSE41-NEXT: movdqa %xmm8, %xmm0
3810 ; SSE41-NEXT: pxor %xmm2, %xmm0
3811 ; SSE41-NEXT: movdqa %xmm9, %xmm11
3812 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm11
3813 ; SSE41-NEXT: movdqa %xmm9, %xmm13
3814 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm13
3815 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]
3816 ; SSE41-NEXT: pand %xmm11, %xmm0
3817 ; SSE41-NEXT: por %xmm13, %xmm0
3818 ; SSE41-NEXT: movapd %xmm1, %xmm11
3819 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm11
3820 ; SSE41-NEXT: movdqa %xmm7, %xmm0
3821 ; SSE41-NEXT: pxor %xmm2, %xmm0
3822 ; SSE41-NEXT: movdqa %xmm9, %xmm8
3823 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm8
3824 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm9
3825 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
3826 ; SSE41-NEXT: pand %xmm8, %xmm0
3827 ; SSE41-NEXT: por %xmm9, %xmm0
3828 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm1
3829 ; SSE41-NEXT: xorpd %xmm7, %xmm7
3830 ; SSE41-NEXT: movapd %xmm1, %xmm8
3831 ; SSE41-NEXT: xorpd %xmm2, %xmm8
3832 ; SSE41-NEXT: movapd %xmm8, %xmm9
3833 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm9
3834 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm8
3835 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm8[0,0,2,2]
3836 ; SSE41-NEXT: pand %xmm9, %xmm0
3837 ; SSE41-NEXT: por %xmm8, %xmm0
3838 ; SSE41-NEXT: pxor %xmm8, %xmm8
3839 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm8
3840 ; SSE41-NEXT: movapd %xmm11, %xmm1
3841 ; SSE41-NEXT: xorpd %xmm2, %xmm1
3842 ; SSE41-NEXT: movapd %xmm1, %xmm9
3843 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm9
3844 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm1
3845 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
3846 ; SSE41-NEXT: pand %xmm9, %xmm0
3847 ; SSE41-NEXT: por %xmm1, %xmm0
3848 ; SSE41-NEXT: pxor %xmm1, %xmm1
3849 ; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm1
3850 ; SSE41-NEXT: packusdw %xmm8, %xmm1
3851 ; SSE41-NEXT: movapd %xmm12, %xmm8
3852 ; SSE41-NEXT: xorpd %xmm2, %xmm8
3853 ; SSE41-NEXT: movapd %xmm8, %xmm9
3854 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm9
3855 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm8
3856 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm8[0,0,2,2]
3857 ; SSE41-NEXT: pand %xmm9, %xmm0
3858 ; SSE41-NEXT: por %xmm8, %xmm0
3859 ; SSE41-NEXT: pxor %xmm8, %xmm8
3860 ; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm8
3861 ; SSE41-NEXT: movapd %xmm10, %xmm9
3862 ; SSE41-NEXT: xorpd %xmm2, %xmm9
3863 ; SSE41-NEXT: movapd %xmm9, %xmm11
3864 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm11
3865 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm9
3866 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
3867 ; SSE41-NEXT: pand %xmm11, %xmm0
3868 ; SSE41-NEXT: por %xmm9, %xmm0
3869 ; SSE41-NEXT: pxor %xmm9, %xmm9
3870 ; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm9
3871 ; SSE41-NEXT: packusdw %xmm8, %xmm9
3872 ; SSE41-NEXT: packusdw %xmm9, %xmm1
3873 ; SSE41-NEXT: movapd %xmm6, %xmm8
3874 ; SSE41-NEXT: xorpd %xmm2, %xmm8
3875 ; SSE41-NEXT: movapd %xmm8, %xmm9
3876 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm9
3877 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm8
3878 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm8[0,0,2,2]
3879 ; SSE41-NEXT: pand %xmm9, %xmm0
3880 ; SSE41-NEXT: por %xmm8, %xmm0
3881 ; SSE41-NEXT: pxor %xmm8, %xmm8
3882 ; SSE41-NEXT: blendvpd %xmm0, %xmm6, %xmm8
3883 ; SSE41-NEXT: movapd %xmm5, %xmm6
3884 ; SSE41-NEXT: xorpd %xmm2, %xmm6
3885 ; SSE41-NEXT: movapd %xmm6, %xmm9
3886 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm9
3887 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm6
3888 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3889 ; SSE41-NEXT: pand %xmm9, %xmm0
3890 ; SSE41-NEXT: por %xmm6, %xmm0
3891 ; SSE41-NEXT: pxor %xmm6, %xmm6
3892 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm6
3893 ; SSE41-NEXT: packusdw %xmm8, %xmm6
3894 ; SSE41-NEXT: movapd %xmm4, %xmm5
3895 ; SSE41-NEXT: xorpd %xmm2, %xmm5
3896 ; SSE41-NEXT: movapd %xmm5, %xmm8
3897 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm8
3898 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm5
3899 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
3900 ; SSE41-NEXT: pand %xmm8, %xmm0
3901 ; SSE41-NEXT: por %xmm5, %xmm0
3902 ; SSE41-NEXT: pxor %xmm5, %xmm5
3903 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm5
3904 ; SSE41-NEXT: movapd %xmm3, %xmm4
3905 ; SSE41-NEXT: xorpd %xmm2, %xmm4
3906 ; SSE41-NEXT: movapd %xmm4, %xmm8
3907 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm8
3908 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm4
3909 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
3910 ; SSE41-NEXT: pand %xmm8, %xmm0
3911 ; SSE41-NEXT: por %xmm4, %xmm0
3912 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm7
3913 ; SSE41-NEXT: packusdw %xmm5, %xmm7
3914 ; SSE41-NEXT: packusdw %xmm7, %xmm6
3915 ; SSE41-NEXT: packuswb %xmm6, %xmm1
3916 ; SSE41-NEXT: movdqa %xmm1, %xmm0
3919 ; AVX1-LABEL: trunc_packus_v16i64_v16i8:
3921 ; AVX1-NEXT: vmovdqa 96(%rdi), %xmm0
3922 ; AVX1-NEXT: vmovddup {{.*#+}} xmm2 = [255,255]
3923 ; AVX1-NEXT: # xmm2 = mem[0,0]
3924 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm1
3925 ; AVX1-NEXT: vblendvpd %xmm1, %xmm0, %xmm2, %xmm0
3926 ; AVX1-NEXT: vmovdqa 112(%rdi), %xmm1
3927 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm3
3928 ; AVX1-NEXT: vblendvpd %xmm3, %xmm1, %xmm2, %xmm1
3929 ; AVX1-NEXT: vmovdqa 64(%rdi), %xmm3
3930 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm2, %xmm4
3931 ; AVX1-NEXT: vblendvpd %xmm4, %xmm3, %xmm2, %xmm3
3932 ; AVX1-NEXT: vmovdqa 80(%rdi), %xmm4
3933 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm5
3934 ; AVX1-NEXT: vblendvpd %xmm5, %xmm4, %xmm2, %xmm4
3935 ; AVX1-NEXT: vmovdqa (%rdi), %xmm5
3936 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm6
3937 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm7
3938 ; AVX1-NEXT: vmovdqa 48(%rdi), %xmm8
3939 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm2, %xmm9
3940 ; AVX1-NEXT: vblendvpd %xmm9, %xmm7, %xmm2, %xmm7
3941 ; AVX1-NEXT: vpcmpgtq %xmm8, %xmm2, %xmm9
3942 ; AVX1-NEXT: vblendvpd %xmm9, %xmm8, %xmm2, %xmm8
3943 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm2, %xmm9
3944 ; AVX1-NEXT: vblendvpd %xmm9, %xmm5, %xmm2, %xmm5
3945 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm2, %xmm9
3946 ; AVX1-NEXT: vblendvpd %xmm9, %xmm6, %xmm2, %xmm2
3947 ; AVX1-NEXT: vpxor %xmm6, %xmm6, %xmm6
3948 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm2, %xmm9
3949 ; AVX1-NEXT: vpand %xmm2, %xmm9, %xmm2
3950 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm5, %xmm9
3951 ; AVX1-NEXT: vpand %xmm5, %xmm9, %xmm5
3952 ; AVX1-NEXT: vpackusdw %xmm2, %xmm5, %xmm2
3953 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm8, %xmm5
3954 ; AVX1-NEXT: vpand %xmm5, %xmm8, %xmm5
3955 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm7, %xmm8
3956 ; AVX1-NEXT: vpand %xmm7, %xmm8, %xmm7
3957 ; AVX1-NEXT: vpackusdw %xmm5, %xmm7, %xmm5
3958 ; AVX1-NEXT: vpackusdw %xmm5, %xmm2, %xmm2
3959 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm4, %xmm5
3960 ; AVX1-NEXT: vpand %xmm4, %xmm5, %xmm4
3961 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm3, %xmm5
3962 ; AVX1-NEXT: vpand %xmm3, %xmm5, %xmm3
3963 ; AVX1-NEXT: vpackusdw %xmm4, %xmm3, %xmm3
3964 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm1, %xmm4
3965 ; AVX1-NEXT: vpand %xmm1, %xmm4, %xmm1
3966 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm0, %xmm4
3967 ; AVX1-NEXT: vpand %xmm0, %xmm4, %xmm0
3968 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
3969 ; AVX1-NEXT: vpackusdw %xmm0, %xmm3, %xmm0
3970 ; AVX1-NEXT: vpackuswb %xmm0, %xmm2, %xmm0
3973 ; AVX2-LABEL: trunc_packus_v16i64_v16i8:
3975 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
3976 ; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1
3977 ; AVX2-NEXT: vmovdqa 64(%rdi), %ymm2
3978 ; AVX2-NEXT: vmovdqa 96(%rdi), %ymm3
3979 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [255,255,255,255]
3980 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm4, %ymm5
3981 ; AVX2-NEXT: vblendvpd %ymm5, %ymm2, %ymm4, %ymm2
3982 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm4, %ymm5
3983 ; AVX2-NEXT: vblendvpd %ymm5, %ymm3, %ymm4, %ymm3
3984 ; AVX2-NEXT: vpcmpgtq %ymm0, %ymm4, %ymm5
3985 ; AVX2-NEXT: vblendvpd %ymm5, %ymm0, %ymm4, %ymm0
3986 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm4, %ymm5
3987 ; AVX2-NEXT: vblendvpd %ymm5, %ymm1, %ymm4, %ymm1
3988 ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4
3989 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm1, %ymm5
3990 ; AVX2-NEXT: vpand %ymm1, %ymm5, %ymm1
3991 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm0, %ymm5
3992 ; AVX2-NEXT: vpand %ymm0, %ymm5, %ymm0
3993 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
3994 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm3, %ymm1
3995 ; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
3996 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm2, %ymm3
3997 ; AVX2-NEXT: vpand %ymm2, %ymm3, %ymm2
3998 ; AVX2-NEXT: vpackusdw %ymm1, %ymm2, %ymm1
3999 ; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
4000 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4001 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
4002 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
4003 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
4004 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
4005 ; AVX2-NEXT: vzeroupper
4008 ; AVX512-LABEL: trunc_packus_v16i64_v16i8:
4010 ; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0
4011 ; AVX512-NEXT: vpmaxsq 64(%rdi), %zmm0, %zmm1
4012 ; AVX512-NEXT: vpmovusqb %zmm1, %xmm1
4013 ; AVX512-NEXT: vpmaxsq (%rdi), %zmm0, %zmm0
4014 ; AVX512-NEXT: vpmovusqb %zmm0, %xmm0
4015 ; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4016 ; AVX512-NEXT: vzeroupper
4019 ; SKX-LABEL: trunc_packus_v16i64_v16i8:
4021 ; SKX-NEXT: vpxor %xmm0, %xmm0, %xmm0
4022 ; SKX-NEXT: vpmaxsq 96(%rdi), %ymm0, %ymm1
4023 ; SKX-NEXT: vpmovusqb %ymm1, %xmm1
4024 ; SKX-NEXT: vpmaxsq 64(%rdi), %ymm0, %ymm2
4025 ; SKX-NEXT: vpmovusqb %ymm2, %xmm2
4026 ; SKX-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
4027 ; SKX-NEXT: vpmaxsq 32(%rdi), %ymm0, %ymm2
4028 ; SKX-NEXT: vpmovusqb %ymm2, %xmm2
4029 ; SKX-NEXT: vpmaxsq (%rdi), %ymm0, %ymm0
4030 ; SKX-NEXT: vpmovusqb %ymm0, %xmm0
4031 ; SKX-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
4032 ; SKX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4033 ; SKX-NEXT: vzeroupper
4035 %a0 = load <16 x i64>, ptr %p0
4036 %1 = icmp slt <16 x i64> %a0, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
4037 %2 = select <16 x i1> %1, <16 x i64> %a0, <16 x i64> <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255>
4038 %3 = icmp sgt <16 x i64> %2, zeroinitializer
4039 %4 = select <16 x i1> %3, <16 x i64> %2, <16 x i64> zeroinitializer
4040 %5 = trunc <16 x i64> %4 to <16 x i8>
4044 define <4 x i8> @trunc_packus_v4i32_v4i8(<4 x i32> %a0) "min-legal-vector-width"="256" {
4045 ; SSE-LABEL: trunc_packus_v4i32_v4i8:
4047 ; SSE-NEXT: packssdw %xmm0, %xmm0
4048 ; SSE-NEXT: packuswb %xmm0, %xmm0
4051 ; AVX-LABEL: trunc_packus_v4i32_v4i8:
4053 ; AVX-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
4054 ; AVX-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4057 ; AVX512-LABEL: trunc_packus_v4i32_v4i8:
4059 ; AVX512-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
4060 ; AVX512-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4063 ; SKX-LABEL: trunc_packus_v4i32_v4i8:
4065 ; SKX-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
4066 ; SKX-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4068 %1 = icmp slt <4 x i32> %a0, <i32 255, i32 255, i32 255, i32 255>
4069 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 255, i32 255, i32 255, i32 255>
4070 %3 = icmp sgt <4 x i32> %2, zeroinitializer
4071 %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> zeroinitializer
4072 %5 = trunc <4 x i32> %4 to <4 x i8>
4076 define void @trunc_packus_v4i32_v4i8_store(<4 x i32> %a0, ptr%p1) {
4077 ; SSE-LABEL: trunc_packus_v4i32_v4i8_store:
4079 ; SSE-NEXT: packssdw %xmm0, %xmm0
4080 ; SSE-NEXT: packuswb %xmm0, %xmm0
4081 ; SSE-NEXT: movd %xmm0, (%rdi)
4084 ; AVX-LABEL: trunc_packus_v4i32_v4i8_store:
4086 ; AVX-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
4087 ; AVX-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4088 ; AVX-NEXT: vmovd %xmm0, (%rdi)
4091 ; AVX512F-LABEL: trunc_packus_v4i32_v4i8_store:
4093 ; AVX512F-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
4094 ; AVX512F-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4095 ; AVX512F-NEXT: vmovd %xmm0, (%rdi)
4096 ; AVX512F-NEXT: retq
4098 ; AVX512VL-LABEL: trunc_packus_v4i32_v4i8_store:
4099 ; AVX512VL: # %bb.0:
4100 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
4101 ; AVX512VL-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
4102 ; AVX512VL-NEXT: vpmovusdb %xmm0, (%rdi)
4103 ; AVX512VL-NEXT: retq
4105 ; AVX512BW-LABEL: trunc_packus_v4i32_v4i8_store:
4106 ; AVX512BW: # %bb.0:
4107 ; AVX512BW-NEXT: vpackssdw %xmm0, %xmm0, %xmm0
4108 ; AVX512BW-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4109 ; AVX512BW-NEXT: vmovd %xmm0, (%rdi)
4110 ; AVX512BW-NEXT: retq
4112 ; AVX512BWVL-LABEL: trunc_packus_v4i32_v4i8_store:
4113 ; AVX512BWVL: # %bb.0:
4114 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
4115 ; AVX512BWVL-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
4116 ; AVX512BWVL-NEXT: vpmovusdb %xmm0, (%rdi)
4117 ; AVX512BWVL-NEXT: retq
4119 ; SKX-LABEL: trunc_packus_v4i32_v4i8_store:
4121 ; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1
4122 ; SKX-NEXT: vpmaxsd %xmm1, %xmm0, %xmm0
4123 ; SKX-NEXT: vpmovusdb %xmm0, (%rdi)
4125 %1 = icmp slt <4 x i32> %a0, <i32 255, i32 255, i32 255, i32 255>
4126 %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 255, i32 255, i32 255, i32 255>
4127 %3 = icmp sgt <4 x i32> %2, zeroinitializer
4128 %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> zeroinitializer
4129 %5 = trunc <4 x i32> %4 to <4 x i8>
4130 store <4 x i8> %5, ptr%p1
4134 define <8 x i8> @trunc_packus_v8i32_v8i8(<8 x i32> %a0) {
4135 ; SSE-LABEL: trunc_packus_v8i32_v8i8:
4137 ; SSE-NEXT: packssdw %xmm1, %xmm0
4138 ; SSE-NEXT: packuswb %xmm0, %xmm0
4141 ; AVX1-LABEL: trunc_packus_v8i32_v8i8:
4143 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
4144 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
4145 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4146 ; AVX1-NEXT: vzeroupper
4149 ; AVX2-LABEL: trunc_packus_v8i32_v8i8:
4151 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
4152 ; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
4153 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4154 ; AVX2-NEXT: vzeroupper
4157 ; AVX512F-LABEL: trunc_packus_v8i32_v8i8:
4159 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1
4160 ; AVX512F-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
4161 ; AVX512F-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4162 ; AVX512F-NEXT: vzeroupper
4163 ; AVX512F-NEXT: retq
4165 ; AVX512VL-LABEL: trunc_packus_v8i32_v8i8:
4166 ; AVX512VL: # %bb.0:
4167 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
4168 ; AVX512VL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0
4169 ; AVX512VL-NEXT: vpmovusdb %ymm0, %xmm0
4170 ; AVX512VL-NEXT: vzeroupper
4171 ; AVX512VL-NEXT: retq
4173 ; AVX512BW-LABEL: trunc_packus_v8i32_v8i8:
4174 ; AVX512BW: # %bb.0:
4175 ; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1
4176 ; AVX512BW-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
4177 ; AVX512BW-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4178 ; AVX512BW-NEXT: vzeroupper
4179 ; AVX512BW-NEXT: retq
4181 ; AVX512BWVL-LABEL: trunc_packus_v8i32_v8i8:
4182 ; AVX512BWVL: # %bb.0:
4183 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
4184 ; AVX512BWVL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0
4185 ; AVX512BWVL-NEXT: vpmovusdb %ymm0, %xmm0
4186 ; AVX512BWVL-NEXT: vzeroupper
4187 ; AVX512BWVL-NEXT: retq
4189 ; SKX-LABEL: trunc_packus_v8i32_v8i8:
4191 ; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1
4192 ; SKX-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0
4193 ; SKX-NEXT: vpmovusdb %ymm0, %xmm0
4194 ; SKX-NEXT: vzeroupper
4196 %1 = icmp slt <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
4197 %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
4198 %3 = icmp sgt <8 x i32> %2, zeroinitializer
4199 %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> zeroinitializer
4200 %5 = trunc <8 x i32> %4 to <8 x i8>
4204 define void @trunc_packus_v8i32_v8i8_store(<8 x i32> %a0, ptr%p1) {
4205 ; SSE-LABEL: trunc_packus_v8i32_v8i8_store:
4207 ; SSE-NEXT: packssdw %xmm1, %xmm0
4208 ; SSE-NEXT: packuswb %xmm0, %xmm0
4209 ; SSE-NEXT: movq %xmm0, (%rdi)
4212 ; AVX1-LABEL: trunc_packus_v8i32_v8i8_store:
4214 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
4215 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
4216 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4217 ; AVX1-NEXT: vmovq %xmm0, (%rdi)
4218 ; AVX1-NEXT: vzeroupper
4221 ; AVX2-LABEL: trunc_packus_v8i32_v8i8_store:
4223 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
4224 ; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
4225 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4226 ; AVX2-NEXT: vmovq %xmm0, (%rdi)
4227 ; AVX2-NEXT: vzeroupper
4230 ; AVX512F-LABEL: trunc_packus_v8i32_v8i8_store:
4232 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1
4233 ; AVX512F-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
4234 ; AVX512F-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4235 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
4236 ; AVX512F-NEXT: vzeroupper
4237 ; AVX512F-NEXT: retq
4239 ; AVX512VL-LABEL: trunc_packus_v8i32_v8i8_store:
4240 ; AVX512VL: # %bb.0:
4241 ; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
4242 ; AVX512VL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0
4243 ; AVX512VL-NEXT: vpmovusdb %ymm0, (%rdi)
4244 ; AVX512VL-NEXT: vzeroupper
4245 ; AVX512VL-NEXT: retq
4247 ; AVX512BW-LABEL: trunc_packus_v8i32_v8i8_store:
4248 ; AVX512BW: # %bb.0:
4249 ; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1
4250 ; AVX512BW-NEXT: vpackssdw %xmm1, %xmm0, %xmm0
4251 ; AVX512BW-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4252 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
4253 ; AVX512BW-NEXT: vzeroupper
4254 ; AVX512BW-NEXT: retq
4256 ; AVX512BWVL-LABEL: trunc_packus_v8i32_v8i8_store:
4257 ; AVX512BWVL: # %bb.0:
4258 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
4259 ; AVX512BWVL-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0
4260 ; AVX512BWVL-NEXT: vpmovusdb %ymm0, (%rdi)
4261 ; AVX512BWVL-NEXT: vzeroupper
4262 ; AVX512BWVL-NEXT: retq
4264 ; SKX-LABEL: trunc_packus_v8i32_v8i8_store:
4266 ; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1
4267 ; SKX-NEXT: vpmaxsd %ymm1, %ymm0, %ymm0
4268 ; SKX-NEXT: vpmovusdb %ymm0, (%rdi)
4269 ; SKX-NEXT: vzeroupper
4271 %1 = icmp slt <8 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
4272 %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
4273 %3 = icmp sgt <8 x i32> %2, zeroinitializer
4274 %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> zeroinitializer
4275 %5 = trunc <8 x i32> %4 to <8 x i8>
4276 store <8 x i8> %5, ptr%p1
4280 define <16 x i8> @trunc_packus_v16i32_v16i8(ptr %p0) "min-legal-vector-width"="256" {
4281 ; SSE-LABEL: trunc_packus_v16i32_v16i8:
4283 ; SSE-NEXT: movdqa (%rdi), %xmm0
4284 ; SSE-NEXT: movdqa 32(%rdi), %xmm1
4285 ; SSE-NEXT: packssdw 48(%rdi), %xmm1
4286 ; SSE-NEXT: packssdw 16(%rdi), %xmm0
4287 ; SSE-NEXT: packuswb %xmm1, %xmm0
4290 ; AVX1-LABEL: trunc_packus_v16i32_v16i8:
4292 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
4293 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm1
4294 ; AVX1-NEXT: vpackssdw 48(%rdi), %xmm1, %xmm1
4295 ; AVX1-NEXT: vpackssdw 16(%rdi), %xmm0, %xmm0
4296 ; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
4299 ; AVX2-LABEL: trunc_packus_v16i32_v16i8:
4301 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
4302 ; AVX2-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm0
4303 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
4304 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
4305 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
4306 ; AVX2-NEXT: vzeroupper
4309 ; AVX512-LABEL: trunc_packus_v16i32_v16i8:
4311 ; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0
4312 ; AVX512-NEXT: vpmaxsd (%rdi), %zmm0, %zmm0
4313 ; AVX512-NEXT: vpmovusdb %zmm0, %xmm0
4314 ; AVX512-NEXT: vzeroupper
4317 ; SKX-LABEL: trunc_packus_v16i32_v16i8:
4319 ; SKX-NEXT: vmovdqa (%rdi), %ymm0
4320 ; SKX-NEXT: vpackusdw 32(%rdi), %ymm0, %ymm0
4321 ; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4322 ; SKX-NEXT: vpmovuswb %ymm0, %xmm0
4323 ; SKX-NEXT: vzeroupper
4325 %a0 = load <16 x i32>, ptr %p0
4326 %1 = icmp slt <16 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
4327 %2 = select <16 x i1> %1, <16 x i32> %a0, <16 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
4328 %3 = icmp sgt <16 x i32> %2, zeroinitializer
4329 %4 = select <16 x i1> %3, <16 x i32> %2, <16 x i32> zeroinitializer
4330 %5 = trunc <16 x i32> %4 to <16 x i8>
4334 define void @trunc_packus_v16i32_v16i8_store(ptr %p0, ptr %p1) "min-legal-vector-width"="256" {
4335 ; SSE-LABEL: trunc_packus_v16i32_v16i8_store:
4337 ; SSE-NEXT: movdqa (%rdi), %xmm0
4338 ; SSE-NEXT: movdqa 32(%rdi), %xmm1
4339 ; SSE-NEXT: packssdw 48(%rdi), %xmm1
4340 ; SSE-NEXT: packssdw 16(%rdi), %xmm0
4341 ; SSE-NEXT: packuswb %xmm1, %xmm0
4342 ; SSE-NEXT: movdqa %xmm0, (%rsi)
4345 ; AVX1-LABEL: trunc_packus_v16i32_v16i8_store:
4347 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
4348 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm1
4349 ; AVX1-NEXT: vpackssdw 48(%rdi), %xmm1, %xmm1
4350 ; AVX1-NEXT: vpackssdw 16(%rdi), %xmm0, %xmm0
4351 ; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
4352 ; AVX1-NEXT: vmovdqa %xmm0, (%rsi)
4355 ; AVX2-LABEL: trunc_packus_v16i32_v16i8_store:
4357 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
4358 ; AVX2-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm0
4359 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
4360 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
4361 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
4362 ; AVX2-NEXT: vmovdqa %xmm0, (%rsi)
4363 ; AVX2-NEXT: vzeroupper
4366 ; AVX512-LABEL: trunc_packus_v16i32_v16i8_store:
4368 ; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0
4369 ; AVX512-NEXT: vpmaxsd (%rdi), %zmm0, %zmm0
4370 ; AVX512-NEXT: vpmovusdb %zmm0, (%rsi)
4371 ; AVX512-NEXT: vzeroupper
4374 ; SKX-LABEL: trunc_packus_v16i32_v16i8_store:
4376 ; SKX-NEXT: vmovdqa (%rdi), %ymm0
4377 ; SKX-NEXT: vpackusdw 32(%rdi), %ymm0, %ymm0
4378 ; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4379 ; SKX-NEXT: vpmovuswb %ymm0, (%rsi)
4380 ; SKX-NEXT: vzeroupper
4382 %a = load <16 x i32>, ptr %p0
4383 %b = icmp slt <16 x i32> %a, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
4384 %c = select <16 x i1> %b, <16 x i32> %a, <16 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
4385 %d = icmp sgt <16 x i32> %c, zeroinitializer
4386 %e = select <16 x i1> %d, <16 x i32> %c, <16 x i32> zeroinitializer
4387 %f = trunc <16 x i32> %e to <16 x i8>
4388 store <16 x i8> %f, ptr %p1
4392 define <8 x i8> @trunc_packus_v8i16_v8i8(<8 x i16> %a0) {
4393 ; SSE-LABEL: trunc_packus_v8i16_v8i8:
4395 ; SSE-NEXT: packuswb %xmm0, %xmm0
4398 ; AVX-LABEL: trunc_packus_v8i16_v8i8:
4400 ; AVX-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4403 ; AVX512-LABEL: trunc_packus_v8i16_v8i8:
4405 ; AVX512-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4408 ; SKX-LABEL: trunc_packus_v8i16_v8i8:
4410 ; SKX-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4412 %1 = icmp slt <8 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
4413 %2 = select <8 x i1> %1, <8 x i16> %a0, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
4414 %3 = icmp sgt <8 x i16> %2, zeroinitializer
4415 %4 = select <8 x i1> %3, <8 x i16> %2, <8 x i16> zeroinitializer
4416 %5 = trunc <8 x i16> %4 to <8 x i8>
4420 define void @trunc_packus_v8i16_v8i8_store(<8 x i16> %a0, ptr%p1) {
4421 ; SSE-LABEL: trunc_packus_v8i16_v8i8_store:
4423 ; SSE-NEXT: packuswb %xmm0, %xmm0
4424 ; SSE-NEXT: movq %xmm0, (%rdi)
4427 ; AVX-LABEL: trunc_packus_v8i16_v8i8_store:
4429 ; AVX-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4430 ; AVX-NEXT: vmovq %xmm0, (%rdi)
4433 ; AVX512F-LABEL: trunc_packus_v8i16_v8i8_store:
4435 ; AVX512F-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4436 ; AVX512F-NEXT: vmovq %xmm0, (%rdi)
4437 ; AVX512F-NEXT: retq
4439 ; AVX512VL-LABEL: trunc_packus_v8i16_v8i8_store:
4440 ; AVX512VL: # %bb.0:
4441 ; AVX512VL-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4442 ; AVX512VL-NEXT: vmovq %xmm0, (%rdi)
4443 ; AVX512VL-NEXT: retq
4445 ; AVX512BW-LABEL: trunc_packus_v8i16_v8i8_store:
4446 ; AVX512BW: # %bb.0:
4447 ; AVX512BW-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
4448 ; AVX512BW-NEXT: vmovq %xmm0, (%rdi)
4449 ; AVX512BW-NEXT: retq
4451 ; AVX512BWVL-LABEL: trunc_packus_v8i16_v8i8_store:
4452 ; AVX512BWVL: # %bb.0:
4453 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
4454 ; AVX512BWVL-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
4455 ; AVX512BWVL-NEXT: vpmovuswb %xmm0, (%rdi)
4456 ; AVX512BWVL-NEXT: retq
4458 ; SKX-LABEL: trunc_packus_v8i16_v8i8_store:
4460 ; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1
4461 ; SKX-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0
4462 ; SKX-NEXT: vpmovuswb %xmm0, (%rdi)
4464 %1 = icmp slt <8 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
4465 %2 = select <8 x i1> %1, <8 x i16> %a0, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
4466 %3 = icmp sgt <8 x i16> %2, zeroinitializer
4467 %4 = select <8 x i1> %3, <8 x i16> %2, <8 x i16> zeroinitializer
4468 %5 = trunc <8 x i16> %4 to <8 x i8>
4469 store <8 x i8> %5, ptr%p1
4473 define <16 x i8> @trunc_packus_v16i16_v16i8(<16 x i16> %a0) {
4474 ; SSE-LABEL: trunc_packus_v16i16_v16i8:
4476 ; SSE-NEXT: packuswb %xmm1, %xmm0
4479 ; AVX1-LABEL: trunc_packus_v16i16_v16i8:
4481 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
4482 ; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
4483 ; AVX1-NEXT: vzeroupper
4486 ; AVX2-LABEL: trunc_packus_v16i16_v16i8:
4488 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
4489 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
4490 ; AVX2-NEXT: vzeroupper
4493 ; AVX512F-LABEL: trunc_packus_v16i16_v16i8:
4495 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1
4496 ; AVX512F-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
4497 ; AVX512F-NEXT: vzeroupper
4498 ; AVX512F-NEXT: retq
4500 ; AVX512VL-LABEL: trunc_packus_v16i16_v16i8:
4501 ; AVX512VL: # %bb.0:
4502 ; AVX512VL-NEXT: vextracti128 $1, %ymm0, %xmm1
4503 ; AVX512VL-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
4504 ; AVX512VL-NEXT: vzeroupper
4505 ; AVX512VL-NEXT: retq
4507 ; AVX512BW-LABEL: trunc_packus_v16i16_v16i8:
4508 ; AVX512BW: # %bb.0:
4509 ; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1
4510 ; AVX512BW-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
4511 ; AVX512BW-NEXT: vzeroupper
4512 ; AVX512BW-NEXT: retq
4514 ; AVX512BWVL-LABEL: trunc_packus_v16i16_v16i8:
4515 ; AVX512BWVL: # %bb.0:
4516 ; AVX512BWVL-NEXT: vpxor %xmm1, %xmm1, %xmm1
4517 ; AVX512BWVL-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0
4518 ; AVX512BWVL-NEXT: vpmovuswb %ymm0, %xmm0
4519 ; AVX512BWVL-NEXT: vzeroupper
4520 ; AVX512BWVL-NEXT: retq
4522 ; SKX-LABEL: trunc_packus_v16i16_v16i8:
4524 ; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1
4525 ; SKX-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0
4526 ; SKX-NEXT: vpmovuswb %ymm0, %xmm0
4527 ; SKX-NEXT: vzeroupper
4529 %1 = icmp slt <16 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
4530 %2 = select <16 x i1> %1, <16 x i16> %a0, <16 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
4531 %3 = icmp sgt <16 x i16> %2, zeroinitializer
4532 %4 = select <16 x i1> %3, <16 x i16> %2, <16 x i16> zeroinitializer
4533 %5 = trunc <16 x i16> %4 to <16 x i8>
4537 define <32 x i8> @trunc_packus_v32i16_v32i8(ptr %p0) "min-legal-vector-width"="256" {
4538 ; SSE-LABEL: trunc_packus_v32i16_v32i8:
4540 ; SSE-NEXT: movdqa (%rdi), %xmm0
4541 ; SSE-NEXT: movdqa 32(%rdi), %xmm1
4542 ; SSE-NEXT: packuswb 16(%rdi), %xmm0
4543 ; SSE-NEXT: packuswb 48(%rdi), %xmm1
4546 ; AVX1-LABEL: trunc_packus_v32i16_v32i8:
4548 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
4549 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm1
4550 ; AVX1-NEXT: vpackuswb 48(%rdi), %xmm1, %xmm1
4551 ; AVX1-NEXT: vpackuswb 16(%rdi), %xmm0, %xmm0
4552 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
4555 ; AVX2-LABEL: trunc_packus_v32i16_v32i8:
4557 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
4558 ; AVX2-NEXT: vpackuswb 32(%rdi), %ymm0, %ymm0
4559 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4562 ; AVX512F-LABEL: trunc_packus_v32i16_v32i8:
4564 ; AVX512F-NEXT: vmovdqa (%rdi), %ymm0
4565 ; AVX512F-NEXT: vpackuswb 32(%rdi), %ymm0, %ymm0
4566 ; AVX512F-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4567 ; AVX512F-NEXT: retq
4569 ; AVX512VL-LABEL: trunc_packus_v32i16_v32i8:
4570 ; AVX512VL: # %bb.0:
4571 ; AVX512VL-NEXT: vmovdqa (%rdi), %ymm0
4572 ; AVX512VL-NEXT: vpackuswb 32(%rdi), %ymm0, %ymm0
4573 ; AVX512VL-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4574 ; AVX512VL-NEXT: retq
4576 ; AVX512BW-LABEL: trunc_packus_v32i16_v32i8:
4577 ; AVX512BW: # %bb.0:
4578 ; AVX512BW-NEXT: vpxor %xmm0, %xmm0, %xmm0
4579 ; AVX512BW-NEXT: vpmaxsw (%rdi), %zmm0, %zmm0
4580 ; AVX512BW-NEXT: vpmovuswb %zmm0, %ymm0
4581 ; AVX512BW-NEXT: retq
4583 ; AVX512BWVL-LABEL: trunc_packus_v32i16_v32i8:
4584 ; AVX512BWVL: # %bb.0:
4585 ; AVX512BWVL-NEXT: vpxor %xmm0, %xmm0, %xmm0
4586 ; AVX512BWVL-NEXT: vpmaxsw (%rdi), %zmm0, %zmm0
4587 ; AVX512BWVL-NEXT: vpmovuswb %zmm0, %ymm0
4588 ; AVX512BWVL-NEXT: retq
4590 ; SKX-LABEL: trunc_packus_v32i16_v32i8:
4592 ; SKX-NEXT: vmovdqa (%rdi), %ymm0
4593 ; SKX-NEXT: vpackuswb 32(%rdi), %ymm0, %ymm0
4594 ; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4596 %a0 = load <32 x i16>, ptr %p0
4597 %1 = icmp slt <32 x i16> %a0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
4598 %2 = select <32 x i1> %1, <32 x i16> %a0, <32 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
4599 %3 = icmp sgt <32 x i16> %2, zeroinitializer
4600 %4 = select <32 x i1> %3, <32 x i16> %2, <32 x i16> zeroinitializer
4601 %5 = trunc <32 x i16> %4 to <32 x i8>
4605 define <32 x i8> @trunc_packus_v32i32_v32i8(ptr %p0) "min-legal-vector-width"="256" {
4606 ; SSE-LABEL: trunc_packus_v32i32_v32i8:
4608 ; SSE-NEXT: movdqa (%rdi), %xmm0
4609 ; SSE-NEXT: movdqa 32(%rdi), %xmm2
4610 ; SSE-NEXT: movdqa 64(%rdi), %xmm1
4611 ; SSE-NEXT: movdqa 96(%rdi), %xmm3
4612 ; SSE-NEXT: packssdw 48(%rdi), %xmm2
4613 ; SSE-NEXT: packssdw 16(%rdi), %xmm0
4614 ; SSE-NEXT: packuswb %xmm2, %xmm0
4615 ; SSE-NEXT: packssdw 112(%rdi), %xmm3
4616 ; SSE-NEXT: packssdw 80(%rdi), %xmm1
4617 ; SSE-NEXT: packuswb %xmm3, %xmm1
4620 ; AVX1-LABEL: trunc_packus_v32i32_v32i8:
4622 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
4623 ; AVX1-NEXT: vmovdqa 32(%rdi), %xmm1
4624 ; AVX1-NEXT: vmovdqa 64(%rdi), %xmm2
4625 ; AVX1-NEXT: vmovdqa 96(%rdi), %xmm3
4626 ; AVX1-NEXT: vpackssdw 112(%rdi), %xmm3, %xmm3
4627 ; AVX1-NEXT: vpackssdw 80(%rdi), %xmm2, %xmm2
4628 ; AVX1-NEXT: vpackuswb %xmm3, %xmm2, %xmm2
4629 ; AVX1-NEXT: vpackssdw 48(%rdi), %xmm1, %xmm1
4630 ; AVX1-NEXT: vpackssdw 16(%rdi), %xmm0, %xmm0
4631 ; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
4632 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
4635 ; AVX2-LABEL: trunc_packus_v32i32_v32i8:
4637 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
4638 ; AVX2-NEXT: vmovdqa 64(%rdi), %ymm1
4639 ; AVX2-NEXT: vpackssdw 96(%rdi), %ymm1, %ymm1
4640 ; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
4641 ; AVX2-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm0
4642 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4643 ; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0
4644 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4647 ; AVX512-LABEL: trunc_packus_v32i32_v32i8:
4649 ; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0
4650 ; AVX512-NEXT: vpmaxsd (%rdi), %zmm0, %zmm1
4651 ; AVX512-NEXT: vpmovusdb %zmm1, %xmm1
4652 ; AVX512-NEXT: vpmaxsd 64(%rdi), %zmm0, %zmm0
4653 ; AVX512-NEXT: vpmovusdb %zmm0, %xmm0
4654 ; AVX512-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0
4657 ; SKX-LABEL: trunc_packus_v32i32_v32i8:
4659 ; SKX-NEXT: vmovdqa (%rdi), %ymm0
4660 ; SKX-NEXT: vmovdqa 64(%rdi), %ymm1
4661 ; SKX-NEXT: vpackssdw 96(%rdi), %ymm1, %ymm1
4662 ; SKX-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
4663 ; SKX-NEXT: vpackssdw 32(%rdi), %ymm0, %ymm0
4664 ; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4665 ; SKX-NEXT: vpackuswb %ymm1, %ymm0, %ymm0
4666 ; SKX-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4668 %a0 = load <32 x i32>, ptr %p0
4669 %1 = icmp slt <32 x i32> %a0, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
4670 %2 = select <32 x i1> %1, <32 x i32> %a0, <32 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
4671 %3 = icmp sgt <32 x i32> %2, zeroinitializer
4672 %4 = select <32 x i1> %3, <32 x i32> %2, <32 x i32> zeroinitializer
4673 %5 = trunc <32 x i32> %4 to <32 x i8>