Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / X86 / vector-trunc-ssat.ll
blob14f724fc3b8c79db21f4a04f678d993e07cc42a2
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 ; Signed saturation truncation to vXi32
22 define <2 x i32> @trunc_ssat_v2i64_v2i32(<2 x i64> %a0) {
23 ; SSE2-SSSE3-LABEL: trunc_ssat_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 = [4294967295,4294967295]
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:    pxor %xmm3, %xmm1
41 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
42 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm2, %xmm2
43 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm0, %xmm2
44 ; SSE2-SSSE3-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
45 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
46 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm0
47 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
48 ; SSE2-SSSE3-NEXT:    por %xmm0, %xmm1
49 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm3
50 ; SSE2-SSSE3-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
51 ; SSE2-SSSE3-NEXT:    por %xmm3, %xmm1
52 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
53 ; SSE2-SSSE3-NEXT:    retq
55 ; SSE41-LABEL: trunc_ssat_v2i64_v2i32:
56 ; SSE41:       # %bb.0:
57 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
58 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [2147483647,2147483647]
59 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
60 ; SSE41-NEXT:    pxor %xmm3, %xmm0
61 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [4294967295,4294967295]
62 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
63 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
64 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
65 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
66 ; SSE41-NEXT:    pand %xmm5, %xmm0
67 ; SSE41-NEXT:    por %xmm4, %xmm0
68 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
69 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
70 ; SSE41-NEXT:    pxor %xmm2, %xmm3
71 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [18446744069414584320,18446744069414584320]
72 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
73 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
74 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
75 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
76 ; SSE41-NEXT:    pand %xmm4, %xmm0
77 ; SSE41-NEXT:    por %xmm3, %xmm0
78 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
79 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
80 ; SSE41-NEXT:    retq
82 ; AVX1-LABEL: trunc_ssat_v2i64_v2i32:
83 ; AVX1:       # %bb.0:
84 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [2147483647,2147483647]
85 ; AVX1-NEXT:    # xmm1 = mem[0,0]
86 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
87 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
88 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
89 ; AVX1-NEXT:    # xmm1 = mem[0,0]
90 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
91 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
92 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
93 ; AVX1-NEXT:    retq
95 ; AVX2-LABEL: trunc_ssat_v2i64_v2i32:
96 ; AVX2:       # %bb.0:
97 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [2147483647,2147483647]
98 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
99 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
100 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
101 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
102 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
103 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
104 ; AVX2-NEXT:    retq
106 ; AVX512F-LABEL: trunc_ssat_v2i64_v2i32:
107 ; AVX512F:       # %bb.0:
108 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
109 ; AVX512F-NEXT:    vpmovsqd %zmm0, %ymm0
110 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
111 ; AVX512F-NEXT:    vzeroupper
112 ; AVX512F-NEXT:    retq
114 ; AVX512VL-LABEL: trunc_ssat_v2i64_v2i32:
115 ; AVX512VL:       # %bb.0:
116 ; AVX512VL-NEXT:    vpmovsqd %xmm0, %xmm0
117 ; AVX512VL-NEXT:    retq
119 ; AVX512BW-LABEL: trunc_ssat_v2i64_v2i32:
120 ; AVX512BW:       # %bb.0:
121 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
122 ; AVX512BW-NEXT:    vpmovsqd %zmm0, %ymm0
123 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
124 ; AVX512BW-NEXT:    vzeroupper
125 ; AVX512BW-NEXT:    retq
127 ; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i32:
128 ; AVX512BWVL:       # %bb.0:
129 ; AVX512BWVL-NEXT:    vpmovsqd %xmm0, %xmm0
130 ; AVX512BWVL-NEXT:    retq
132 ; SKX-LABEL: trunc_ssat_v2i64_v2i32:
133 ; SKX:       # %bb.0:
134 ; SKX-NEXT:    vpmovsqd %xmm0, %xmm0
135 ; SKX-NEXT:    retq
136   %1 = icmp slt <2 x i64> %a0, <i64 2147483647, i64 2147483647>
137   %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 2147483647, i64 2147483647>
138   %3 = icmp sgt <2 x i64> %2, <i64 -2147483648, i64 -2147483648>
139   %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -2147483648, i64 -2147483648>
140   %5 = trunc <2 x i64> %4 to <2 x i32>
141   ret <2 x i32> %5
144 define void @trunc_ssat_v2i64_v2i32_store(<2 x i64> %a0, ptr %p1) {
145 ; SSE2-SSSE3-LABEL: trunc_ssat_v2i64_v2i32_store:
146 ; SSE2-SSSE3:       # %bb.0:
147 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
148 ; SSE2-SSSE3-NEXT:    movdqa %xmm0, %xmm2
149 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm2
150 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
151 ; SSE2-SSSE3-NEXT:    pxor %xmm4, %xmm4
152 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm3, %xmm4
153 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [4294967295,4294967295]
154 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
155 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
156 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm2
157 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
158 ; SSE2-SSSE3-NEXT:    por %xmm2, %xmm3
159 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm0
160 ; SSE2-SSSE3-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
161 ; SSE2-SSSE3-NEXT:    por %xmm0, %xmm3
162 ; SSE2-SSSE3-NEXT:    pxor %xmm3, %xmm1
163 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
164 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm2, %xmm2
165 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm0, %xmm2
166 ; SSE2-SSSE3-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
167 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
168 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm0
169 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
170 ; SSE2-SSSE3-NEXT:    por %xmm0, %xmm1
171 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm3
172 ; SSE2-SSSE3-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
173 ; SSE2-SSSE3-NEXT:    por %xmm3, %xmm1
174 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
175 ; SSE2-SSSE3-NEXT:    movq %xmm0, (%rdi)
176 ; SSE2-SSSE3-NEXT:    retq
178 ; SSE41-LABEL: trunc_ssat_v2i64_v2i32_store:
179 ; SSE41:       # %bb.0:
180 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
181 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [2147483647,2147483647]
182 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
183 ; SSE41-NEXT:    pxor %xmm3, %xmm0
184 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [4294967295,4294967295]
185 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
186 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
187 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
188 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
189 ; SSE41-NEXT:    pand %xmm5, %xmm0
190 ; SSE41-NEXT:    por %xmm4, %xmm0
191 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
192 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
193 ; SSE41-NEXT:    pxor %xmm2, %xmm3
194 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [18446744069414584320,18446744069414584320]
195 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
196 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
197 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
198 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
199 ; SSE41-NEXT:    pand %xmm4, %xmm0
200 ; SSE41-NEXT:    por %xmm3, %xmm0
201 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
202 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
203 ; SSE41-NEXT:    movq %xmm0, (%rdi)
204 ; SSE41-NEXT:    retq
206 ; AVX1-LABEL: trunc_ssat_v2i64_v2i32_store:
207 ; AVX1:       # %bb.0:
208 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [2147483647,2147483647]
209 ; AVX1-NEXT:    # xmm1 = mem[0,0]
210 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
211 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
212 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
213 ; AVX1-NEXT:    # xmm1 = mem[0,0]
214 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
215 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
216 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
217 ; AVX1-NEXT:    vmovlpd %xmm0, (%rdi)
218 ; AVX1-NEXT:    retq
220 ; AVX2-LABEL: trunc_ssat_v2i64_v2i32_store:
221 ; AVX2:       # %bb.0:
222 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [2147483647,2147483647]
223 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
224 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
225 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
226 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
227 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
228 ; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
229 ; AVX2-NEXT:    vmovlpd %xmm0, (%rdi)
230 ; AVX2-NEXT:    retq
232 ; AVX512F-LABEL: trunc_ssat_v2i64_v2i32_store:
233 ; AVX512F:       # %bb.0:
234 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
235 ; AVX512F-NEXT:    vpmovsqd %zmm0, %ymm0
236 ; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
237 ; AVX512F-NEXT:    vzeroupper
238 ; AVX512F-NEXT:    retq
240 ; AVX512VL-LABEL: trunc_ssat_v2i64_v2i32_store:
241 ; AVX512VL:       # %bb.0:
242 ; AVX512VL-NEXT:    vpmovsqd %xmm0, (%rdi)
243 ; AVX512VL-NEXT:    retq
245 ; AVX512BW-LABEL: trunc_ssat_v2i64_v2i32_store:
246 ; AVX512BW:       # %bb.0:
247 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
248 ; AVX512BW-NEXT:    vpmovsqd %zmm0, %ymm0
249 ; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
250 ; AVX512BW-NEXT:    vzeroupper
251 ; AVX512BW-NEXT:    retq
253 ; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i32_store:
254 ; AVX512BWVL:       # %bb.0:
255 ; AVX512BWVL-NEXT:    vpmovsqd %xmm0, (%rdi)
256 ; AVX512BWVL-NEXT:    retq
258 ; SKX-LABEL: trunc_ssat_v2i64_v2i32_store:
259 ; SKX:       # %bb.0:
260 ; SKX-NEXT:    vpmovsqd %xmm0, (%rdi)
261 ; SKX-NEXT:    retq
262   %1 = icmp slt <2 x i64> %a0, <i64 2147483647, i64 2147483647>
263   %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 2147483647, i64 2147483647>
264   %3 = icmp sgt <2 x i64> %2, <i64 -2147483648, i64 -2147483648>
265   %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -2147483648, i64 -2147483648>
266   %5 = trunc <2 x i64> %4 to <2 x i32>
267   store <2 x i32> %5, ptr %p1
268   ret void
271 define <4 x i32> @trunc_ssat_v4i64_v4i32(<4 x i64> %a0) {
272 ; SSE2-SSSE3-LABEL: trunc_ssat_v4i64_v4i32:
273 ; SSE2-SSSE3:       # %bb.0:
274 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483647,2147483647]
275 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
276 ; SSE2-SSSE3-NEXT:    movdqa %xmm0, %xmm4
277 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm4
278 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
279 ; SSE2-SSSE3-NEXT:    pxor %xmm6, %xmm6
280 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm5
281 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [4294967295,4294967295]
282 ; SSE2-SSSE3-NEXT:    movdqa %xmm7, %xmm8
283 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm4, %xmm8
284 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm8[0,0,2,2]
285 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm4
286 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]
287 ; SSE2-SSSE3-NEXT:    por %xmm4, %xmm5
288 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm0
289 ; SSE2-SSSE3-NEXT:    pandn %xmm3, %xmm5
290 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm0
291 ; SSE2-SSSE3-NEXT:    movdqa %xmm1, %xmm4
292 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm4
293 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
294 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm5
295 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm4, %xmm7
296 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
297 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm4
298 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
299 ; SSE2-SSSE3-NEXT:    por %xmm4, %xmm5
300 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm1
301 ; SSE2-SSSE3-NEXT:    pandn %xmm3, %xmm5
302 ; SSE2-SSSE3-NEXT:    por %xmm1, %xmm5
303 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
304 ; SSE2-SSSE3-NEXT:    movdqa %xmm5, %xmm3
305 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm3
306 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
307 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm6
308 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm4
309 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [18446744069414584320,18446744069414584320]
310 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm3
311 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm3[0,0,2,2]
312 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm8
313 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
314 ; SSE2-SSSE3-NEXT:    por %xmm8, %xmm3
315 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm5
316 ; SSE2-SSSE3-NEXT:    pandn %xmm1, %xmm3
317 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm3
318 ; SSE2-SSSE3-NEXT:    pxor %xmm0, %xmm2
319 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
320 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm4
321 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm2
322 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
323 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm5
324 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
325 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm2
326 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm0
327 ; SSE2-SSSE3-NEXT:    pandn %xmm1, %xmm2
328 ; SSE2-SSSE3-NEXT:    por %xmm2, %xmm0
329 ; SSE2-SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
330 ; SSE2-SSSE3-NEXT:    retq
332 ; SSE41-LABEL: trunc_ssat_v4i64_v4i32:
333 ; SSE41:       # %bb.0:
334 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
335 ; SSE41-NEXT:    movapd {{.*#+}} xmm4 = [2147483647,2147483647]
336 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
337 ; SSE41-NEXT:    pxor %xmm3, %xmm0
338 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [4294967295,4294967295]
339 ; SSE41-NEXT:    movdqa %xmm6, %xmm5
340 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
341 ; SSE41-NEXT:    movdqa %xmm6, %xmm7
342 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
343 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
344 ; SSE41-NEXT:    pand %xmm5, %xmm0
345 ; SSE41-NEXT:    por %xmm7, %xmm0
346 ; SSE41-NEXT:    movapd %xmm4, %xmm5
347 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
348 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
349 ; SSE41-NEXT:    pxor %xmm3, %xmm0
350 ; SSE41-NEXT:    movdqa %xmm6, %xmm2
351 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
352 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
353 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
354 ; SSE41-NEXT:    pand %xmm2, %xmm0
355 ; SSE41-NEXT:    por %xmm6, %xmm0
356 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
357 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
358 ; SSE41-NEXT:    movapd %xmm4, %xmm2
359 ; SSE41-NEXT:    xorpd %xmm3, %xmm2
360 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [18446744069414584320,18446744069414584320]
361 ; SSE41-NEXT:    movapd %xmm2, %xmm7
362 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm7
363 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm2
364 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
365 ; SSE41-NEXT:    pand %xmm7, %xmm0
366 ; SSE41-NEXT:    por %xmm2, %xmm0
367 ; SSE41-NEXT:    movapd %xmm1, %xmm2
368 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
369 ; SSE41-NEXT:    xorpd %xmm5, %xmm3
370 ; SSE41-NEXT:    movapd %xmm3, %xmm4
371 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm4
372 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm3
373 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
374 ; SSE41-NEXT:    pand %xmm4, %xmm0
375 ; SSE41-NEXT:    por %xmm3, %xmm0
376 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
377 ; SSE41-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
378 ; SSE41-NEXT:    movaps %xmm1, %xmm0
379 ; SSE41-NEXT:    retq
381 ; AVX1-LABEL: trunc_ssat_v4i64_v4i32:
382 ; AVX1:       # %bb.0:
383 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [2147483647,2147483647]
384 ; AVX1-NEXT:    # xmm1 = mem[0,0]
385 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
386 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm2
387 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
388 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm3
389 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
390 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
391 ; AVX1-NEXT:    # xmm1 = mem[0,0]
392 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm3
393 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
394 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
395 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm2, %xmm1, %xmm1
396 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm1[0,2],xmm0[0,2]
397 ; AVX1-NEXT:    vzeroupper
398 ; AVX1-NEXT:    retq
400 ; AVX2-SLOW-LABEL: trunc_ssat_v4i64_v4i32:
401 ; AVX2-SLOW:       # %bb.0:
402 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [2147483647,2147483647,2147483647,2147483647]
403 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
404 ; AVX2-SLOW-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
405 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
406 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
407 ; AVX2-SLOW-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
408 ; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1
409 ; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
410 ; AVX2-SLOW-NEXT:    vzeroupper
411 ; AVX2-SLOW-NEXT:    retq
413 ; AVX2-FAST-ALL-LABEL: trunc_ssat_v4i64_v4i32:
414 ; AVX2-FAST-ALL:       # %bb.0:
415 ; AVX2-FAST-ALL-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [2147483647,2147483647,2147483647,2147483647]
416 ; AVX2-FAST-ALL-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
417 ; AVX2-FAST-ALL-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
418 ; AVX2-FAST-ALL-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
419 ; AVX2-FAST-ALL-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
420 ; AVX2-FAST-ALL-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
421 ; AVX2-FAST-ALL-NEXT:    vbroadcastf128 {{.*#+}} ymm1 = [0,2,4,6,0,2,4,6]
422 ; AVX2-FAST-ALL-NEXT:    # ymm1 = mem[0,1,0,1]
423 ; AVX2-FAST-ALL-NEXT:    vpermps %ymm0, %ymm1, %ymm0
424 ; AVX2-FAST-ALL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
425 ; AVX2-FAST-ALL-NEXT:    vzeroupper
426 ; AVX2-FAST-ALL-NEXT:    retq
428 ; AVX2-FAST-PERLANE-LABEL: trunc_ssat_v4i64_v4i32:
429 ; AVX2-FAST-PERLANE:       # %bb.0:
430 ; AVX2-FAST-PERLANE-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [2147483647,2147483647,2147483647,2147483647]
431 ; AVX2-FAST-PERLANE-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
432 ; AVX2-FAST-PERLANE-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
433 ; AVX2-FAST-PERLANE-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
434 ; AVX2-FAST-PERLANE-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
435 ; AVX2-FAST-PERLANE-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
436 ; AVX2-FAST-PERLANE-NEXT:    vextractf128 $1, %ymm0, %xmm1
437 ; AVX2-FAST-PERLANE-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
438 ; AVX2-FAST-PERLANE-NEXT:    vzeroupper
439 ; AVX2-FAST-PERLANE-NEXT:    retq
441 ; AVX512F-LABEL: trunc_ssat_v4i64_v4i32:
442 ; AVX512F:       # %bb.0:
443 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
444 ; AVX512F-NEXT:    vpmovsqd %zmm0, %ymm0
445 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
446 ; AVX512F-NEXT:    vzeroupper
447 ; AVX512F-NEXT:    retq
449 ; AVX512VL-LABEL: trunc_ssat_v4i64_v4i32:
450 ; AVX512VL:       # %bb.0:
451 ; AVX512VL-NEXT:    vpmovsqd %ymm0, %xmm0
452 ; AVX512VL-NEXT:    vzeroupper
453 ; AVX512VL-NEXT:    retq
455 ; AVX512BW-LABEL: trunc_ssat_v4i64_v4i32:
456 ; AVX512BW:       # %bb.0:
457 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
458 ; AVX512BW-NEXT:    vpmovsqd %zmm0, %ymm0
459 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
460 ; AVX512BW-NEXT:    vzeroupper
461 ; AVX512BW-NEXT:    retq
463 ; AVX512BWVL-LABEL: trunc_ssat_v4i64_v4i32:
464 ; AVX512BWVL:       # %bb.0:
465 ; AVX512BWVL-NEXT:    vpmovsqd %ymm0, %xmm0
466 ; AVX512BWVL-NEXT:    vzeroupper
467 ; AVX512BWVL-NEXT:    retq
469 ; SKX-LABEL: trunc_ssat_v4i64_v4i32:
470 ; SKX:       # %bb.0:
471 ; SKX-NEXT:    vpmovsqd %ymm0, %xmm0
472 ; SKX-NEXT:    vzeroupper
473 ; SKX-NEXT:    retq
474   %1 = icmp slt <4 x i64> %a0, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
475   %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
476   %3 = icmp sgt <4 x i64> %2, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
477   %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
478   %5 = trunc <4 x i64> %4 to <4 x i32>
479   ret <4 x i32> %5
483 define <8 x i32> @trunc_ssat_v8i64_v8i32(ptr %p0) "min-legal-vector-width"="256" {
484 ; SSE2-SSSE3-LABEL: trunc_ssat_v8i64_v8i32:
485 ; SSE2-SSSE3:       # %bb.0:
486 ; SSE2-SSSE3-NEXT:    movdqa (%rdi), %xmm3
487 ; SSE2-SSSE3-NEXT:    movdqa 16(%rdi), %xmm5
488 ; SSE2-SSSE3-NEXT:    movdqa 32(%rdi), %xmm7
489 ; SSE2-SSSE3-NEXT:    movdqa 48(%rdi), %xmm1
490 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483647,2147483647]
491 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
492 ; SSE2-SSSE3-NEXT:    movdqa %xmm3, %xmm2
493 ; SSE2-SSSE3-NEXT:    pxor %xmm0, %xmm2
494 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm2[1,1,3,3]
495 ; SSE2-SSSE3-NEXT:    pxor %xmm8, %xmm8
496 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm9
497 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [4294967295,4294967295]
498 ; SSE2-SSSE3-NEXT:    movdqa %xmm6, %xmm10
499 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm2, %xmm10
500 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
501 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm11
502 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]
503 ; SSE2-SSSE3-NEXT:    por %xmm11, %xmm2
504 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm3
505 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm2
506 ; SSE2-SSSE3-NEXT:    por %xmm3, %xmm2
507 ; SSE2-SSSE3-NEXT:    movdqa %xmm5, %xmm3
508 ; SSE2-SSSE3-NEXT:    pxor %xmm0, %xmm3
509 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm3[1,1,3,3]
510 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm9
511 ; SSE2-SSSE3-NEXT:    movdqa %xmm6, %xmm10
512 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm3, %xmm10
513 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
514 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm11
515 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm10[1,1,3,3]
516 ; SSE2-SSSE3-NEXT:    por %xmm11, %xmm3
517 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm5
518 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm3
519 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm3
520 ; SSE2-SSSE3-NEXT:    movdqa %xmm7, %xmm5
521 ; SSE2-SSSE3-NEXT:    pxor %xmm0, %xmm5
522 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[1,1,3,3]
523 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm9
524 ; SSE2-SSSE3-NEXT:    movdqa %xmm6, %xmm10
525 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm5, %xmm10
526 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
527 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm11
528 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm10[1,1,3,3]
529 ; SSE2-SSSE3-NEXT:    por %xmm11, %xmm5
530 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm7
531 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm5
532 ; SSE2-SSSE3-NEXT:    por %xmm7, %xmm5
533 ; SSE2-SSSE3-NEXT:    movdqa %xmm1, %xmm7
534 ; SSE2-SSSE3-NEXT:    pxor %xmm0, %xmm7
535 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm7[1,1,3,3]
536 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm9
537 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm6
538 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
539 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm7
540 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[1,1,3,3]
541 ; SSE2-SSSE3-NEXT:    por %xmm7, %xmm8
542 ; SSE2-SSSE3-NEXT:    pand %xmm8, %xmm1
543 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm8
544 ; SSE2-SSSE3-NEXT:    por %xmm1, %xmm8
545 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [18446744071562067968,18446744071562067968]
546 ; SSE2-SSSE3-NEXT:    movdqa %xmm8, %xmm1
547 ; SSE2-SSSE3-NEXT:    pxor %xmm0, %xmm1
548 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm1[1,1,3,3]
549 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm6
550 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm9
551 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [18446744069414584320,18446744069414584320]
552 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm1
553 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm1[0,0,2,2]
554 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm10
555 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm1[1,1,3,3]
556 ; SSE2-SSSE3-NEXT:    por %xmm10, %xmm9
557 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm8
558 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm9
559 ; SSE2-SSSE3-NEXT:    por %xmm8, %xmm9
560 ; SSE2-SSSE3-NEXT:    movdqa %xmm5, %xmm1
561 ; SSE2-SSSE3-NEXT:    pxor %xmm0, %xmm1
562 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm1[1,1,3,3]
563 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm8
564 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm1
565 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm1[0,0,2,2]
566 ; SSE2-SSSE3-NEXT:    pand %xmm8, %xmm10
567 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
568 ; SSE2-SSSE3-NEXT:    por %xmm10, %xmm1
569 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm5
570 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm1
571 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm1
572 ; SSE2-SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm9[0,2]
573 ; SSE2-SSSE3-NEXT:    movdqa %xmm3, %xmm5
574 ; SSE2-SSSE3-NEXT:    pxor %xmm0, %xmm5
575 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm5[1,1,3,3]
576 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm8
577 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm5
578 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
579 ; SSE2-SSSE3-NEXT:    pand %xmm8, %xmm9
580 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
581 ; SSE2-SSSE3-NEXT:    por %xmm9, %xmm5
582 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm3
583 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm5
584 ; SSE2-SSSE3-NEXT:    por %xmm3, %xmm5
585 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm0
586 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
587 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm3
588 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm0
589 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[0,0,2,2]
590 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm6
591 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
592 ; SSE2-SSSE3-NEXT:    por %xmm6, %xmm0
593 ; SSE2-SSSE3-NEXT:    pand %xmm0, %xmm2
594 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm0
595 ; SSE2-SSSE3-NEXT:    por %xmm2, %xmm0
596 ; SSE2-SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm5[0,2]
597 ; SSE2-SSSE3-NEXT:    retq
599 ; SSE41-LABEL: trunc_ssat_v8i64_v8i32:
600 ; SSE41:       # %bb.0:
601 ; SSE41-NEXT:    movdqa (%rdi), %xmm5
602 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm8
603 ; SSE41-NEXT:    movdqa 32(%rdi), %xmm7
604 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm2
605 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [2147483647,2147483647]
606 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
607 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
608 ; SSE41-NEXT:    pxor %xmm3, %xmm0
609 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [4294967295,4294967295]
610 ; SSE41-NEXT:    movdqa %xmm6, %xmm4
611 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
612 ; SSE41-NEXT:    movdqa %xmm6, %xmm9
613 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm9
614 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
615 ; SSE41-NEXT:    pand %xmm4, %xmm0
616 ; SSE41-NEXT:    por %xmm9, %xmm0
617 ; SSE41-NEXT:    movapd %xmm1, %xmm4
618 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm4
619 ; SSE41-NEXT:    movdqa %xmm8, %xmm0
620 ; SSE41-NEXT:    pxor %xmm3, %xmm0
621 ; SSE41-NEXT:    movdqa %xmm6, %xmm5
622 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
623 ; SSE41-NEXT:    movdqa %xmm6, %xmm9
624 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm9
625 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
626 ; SSE41-NEXT:    pand %xmm5, %xmm0
627 ; SSE41-NEXT:    por %xmm9, %xmm0
628 ; SSE41-NEXT:    movapd %xmm1, %xmm5
629 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm5
630 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
631 ; SSE41-NEXT:    pxor %xmm3, %xmm0
632 ; SSE41-NEXT:    movdqa %xmm6, %xmm8
633 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm8
634 ; SSE41-NEXT:    movdqa %xmm6, %xmm9
635 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm9
636 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
637 ; SSE41-NEXT:    pand %xmm8, %xmm0
638 ; SSE41-NEXT:    por %xmm9, %xmm0
639 ; SSE41-NEXT:    movapd %xmm1, %xmm8
640 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm8
641 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
642 ; SSE41-NEXT:    pxor %xmm3, %xmm0
643 ; SSE41-NEXT:    movdqa %xmm6, %xmm7
644 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm7
645 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
646 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
647 ; SSE41-NEXT:    pand %xmm7, %xmm0
648 ; SSE41-NEXT:    por %xmm6, %xmm0
649 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
650 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [18446744071562067968,18446744071562067968]
651 ; SSE41-NEXT:    movapd %xmm1, %xmm7
652 ; SSE41-NEXT:    xorpd %xmm3, %xmm7
653 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [18446744069414584320,18446744069414584320]
654 ; SSE41-NEXT:    movapd %xmm7, %xmm9
655 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm9
656 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm7
657 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
658 ; SSE41-NEXT:    pand %xmm9, %xmm0
659 ; SSE41-NEXT:    por %xmm7, %xmm0
660 ; SSE41-NEXT:    movapd %xmm2, %xmm7
661 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm7
662 ; SSE41-NEXT:    movapd %xmm8, %xmm1
663 ; SSE41-NEXT:    xorpd %xmm3, %xmm1
664 ; SSE41-NEXT:    movapd %xmm1, %xmm9
665 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm9
666 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm1
667 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
668 ; SSE41-NEXT:    pand %xmm9, %xmm0
669 ; SSE41-NEXT:    por %xmm1, %xmm0
670 ; SSE41-NEXT:    movapd %xmm2, %xmm1
671 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm1
672 ; SSE41-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm7[0,2]
673 ; SSE41-NEXT:    movapd %xmm5, %xmm7
674 ; SSE41-NEXT:    xorpd %xmm3, %xmm7
675 ; SSE41-NEXT:    movapd %xmm7, %xmm8
676 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm8
677 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm7
678 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
679 ; SSE41-NEXT:    pand %xmm8, %xmm0
680 ; SSE41-NEXT:    por %xmm7, %xmm0
681 ; SSE41-NEXT:    movapd %xmm2, %xmm7
682 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm7
683 ; SSE41-NEXT:    xorpd %xmm4, %xmm3
684 ; SSE41-NEXT:    movapd %xmm3, %xmm5
685 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm5
686 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm3
687 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
688 ; SSE41-NEXT:    pand %xmm5, %xmm0
689 ; SSE41-NEXT:    por %xmm3, %xmm0
690 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
691 ; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm7[0,2]
692 ; SSE41-NEXT:    movaps %xmm2, %xmm0
693 ; SSE41-NEXT:    retq
695 ; AVX1-LABEL: trunc_ssat_v8i64_v8i32:
696 ; AVX1:       # %bb.0:
697 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
698 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
699 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm2
700 ; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm3
701 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm4 = [2147483647,2147483647]
702 ; AVX1-NEXT:    # xmm4 = mem[0,0]
703 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm5
704 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm1, %xmm4, %xmm1
705 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm5
706 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm3, %xmm4, %xmm3
707 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm4, %xmm5
708 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
709 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm5
710 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm2, %xmm4, %xmm2
711 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm4 = [18446744071562067968,18446744071562067968]
712 ; AVX1-NEXT:    # xmm4 = mem[0,0]
713 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm2, %xmm5
714 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm2, %xmm4, %xmm2
715 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm0, %xmm5
716 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
717 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm3, %xmm5
718 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm3, %xmm4, %xmm3
719 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm1, %xmm5
720 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm1, %xmm4, %xmm1
721 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
722 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
723 ; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm1[0,2],ymm0[4,6],ymm1[4,6]
724 ; AVX1-NEXT:    retq
726 ; AVX2-SLOW-LABEL: trunc_ssat_v8i64_v8i32:
727 ; AVX2-SLOW:       # %bb.0:
728 ; AVX2-SLOW-NEXT:    vmovdqa (%rdi), %ymm0
729 ; AVX2-SLOW-NEXT:    vmovdqa 32(%rdi), %ymm1
730 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [2147483647,2147483647,2147483647,2147483647]
731 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
732 ; AVX2-SLOW-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
733 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
734 ; AVX2-SLOW-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
735 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
736 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm3
737 ; AVX2-SLOW-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
738 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
739 ; AVX2-SLOW-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
740 ; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
741 ; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
742 ; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
743 ; AVX2-SLOW-NEXT:    retq
745 ; AVX2-FAST-ALL-LABEL: trunc_ssat_v8i64_v8i32:
746 ; AVX2-FAST-ALL:       # %bb.0:
747 ; AVX2-FAST-ALL-NEXT:    vmovdqa (%rdi), %ymm0
748 ; AVX2-FAST-ALL-NEXT:    vmovdqa 32(%rdi), %ymm1
749 ; AVX2-FAST-ALL-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [2147483647,2147483647,2147483647,2147483647]
750 ; AVX2-FAST-ALL-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
751 ; AVX2-FAST-ALL-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
752 ; AVX2-FAST-ALL-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
753 ; AVX2-FAST-ALL-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
754 ; AVX2-FAST-ALL-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
755 ; AVX2-FAST-ALL-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm3
756 ; AVX2-FAST-ALL-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
757 ; AVX2-FAST-ALL-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
758 ; AVX2-FAST-ALL-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
759 ; AVX2-FAST-ALL-NEXT:    vmovapd {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
760 ; AVX2-FAST-ALL-NEXT:    vpermps %ymm0, %ymm2, %ymm0
761 ; AVX2-FAST-ALL-NEXT:    vpermps %ymm1, %ymm2, %ymm1
762 ; AVX2-FAST-ALL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
763 ; AVX2-FAST-ALL-NEXT:    retq
765 ; AVX2-FAST-PERLANE-LABEL: trunc_ssat_v8i64_v8i32:
766 ; AVX2-FAST-PERLANE:       # %bb.0:
767 ; AVX2-FAST-PERLANE-NEXT:    vmovdqa (%rdi), %ymm0
768 ; AVX2-FAST-PERLANE-NEXT:    vmovdqa 32(%rdi), %ymm1
769 ; AVX2-FAST-PERLANE-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [2147483647,2147483647,2147483647,2147483647]
770 ; AVX2-FAST-PERLANE-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
771 ; AVX2-FAST-PERLANE-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
772 ; AVX2-FAST-PERLANE-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
773 ; AVX2-FAST-PERLANE-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
774 ; AVX2-FAST-PERLANE-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
775 ; AVX2-FAST-PERLANE-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm3
776 ; AVX2-FAST-PERLANE-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
777 ; AVX2-FAST-PERLANE-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
778 ; AVX2-FAST-PERLANE-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
779 ; AVX2-FAST-PERLANE-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
780 ; AVX2-FAST-PERLANE-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
781 ; AVX2-FAST-PERLANE-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
782 ; AVX2-FAST-PERLANE-NEXT:    retq
784 ; AVX512-LABEL: trunc_ssat_v8i64_v8i32:
785 ; AVX512:       # %bb.0:
786 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
787 ; AVX512-NEXT:    vpmovsqd %zmm0, %ymm0
788 ; AVX512-NEXT:    retq
790 ; SKX-LABEL: trunc_ssat_v8i64_v8i32:
791 ; SKX:       # %bb.0:
792 ; SKX-NEXT:    vmovdqa (%rdi), %ymm0
793 ; SKX-NEXT:    vmovdqa 32(%rdi), %ymm1
794 ; SKX-NEXT:    vpmovsqd %ymm0, %xmm0
795 ; SKX-NEXT:    vpmovsqd %ymm1, %xmm1
796 ; SKX-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
797 ; SKX-NEXT:    retq
798   %a0 = load <8 x i64>, ptr %p0
799   %1 = icmp slt <8 x i64> %a0, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
800   %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
801   %3 = icmp sgt <8 x i64> %2, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
802   %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
803   %5 = trunc <8 x i64> %4 to <8 x i32>
804   ret <8 x i32> %5
808 ; Signed saturation truncation to vXi16
811 define <2 x i16> @trunc_ssat_v2i64_v2i16(<2 x i64> %a0) {
812 ; SSE2-SSSE3-LABEL: trunc_ssat_v2i64_v2i16:
813 ; SSE2-SSSE3:       # %bb.0:
814 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
815 ; SSE2-SSSE3-NEXT:    movdqa %xmm0, %xmm2
816 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm2
817 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
818 ; SSE2-SSSE3-NEXT:    pxor %xmm4, %xmm4
819 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm3, %xmm4
820 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147516415,2147516415]
821 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
822 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
823 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm2
824 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
825 ; SSE2-SSSE3-NEXT:    por %xmm2, %xmm3
826 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm0
827 ; SSE2-SSSE3-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
828 ; SSE2-SSSE3-NEXT:    por %xmm0, %xmm3
829 ; SSE2-SSSE3-NEXT:    pxor %xmm3, %xmm1
830 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
831 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm2, %xmm2
832 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm0, %xmm2
833 ; SSE2-SSSE3-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
834 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
835 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm0
836 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
837 ; SSE2-SSSE3-NEXT:    por %xmm0, %xmm1
838 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm3
839 ; SSE2-SSSE3-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
840 ; SSE2-SSSE3-NEXT:    por %xmm3, %xmm1
841 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
842 ; SSE2-SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
843 ; SSE2-SSSE3-NEXT:    retq
845 ; SSE41-LABEL: trunc_ssat_v2i64_v2i16:
846 ; SSE41:       # %bb.0:
847 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
848 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [32767,32767]
849 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
850 ; SSE41-NEXT:    pxor %xmm3, %xmm0
851 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [2147516415,2147516415]
852 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
853 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
854 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
855 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
856 ; SSE41-NEXT:    pand %xmm5, %xmm0
857 ; SSE41-NEXT:    por %xmm4, %xmm0
858 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
859 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
860 ; SSE41-NEXT:    pxor %xmm2, %xmm3
861 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [18446744071562035200,18446744071562035200]
862 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
863 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
864 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
865 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
866 ; SSE41-NEXT:    pand %xmm4, %xmm0
867 ; SSE41-NEXT:    por %xmm3, %xmm0
868 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
869 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
870 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
871 ; SSE41-NEXT:    retq
873 ; AVX1-LABEL: trunc_ssat_v2i64_v2i16:
874 ; AVX1:       # %bb.0:
875 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [32767,32767]
876 ; AVX1-NEXT:    # xmm1 = mem[0,0]
877 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
878 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
879 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
880 ; AVX1-NEXT:    # xmm1 = mem[0,0]
881 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
882 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
883 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
884 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
885 ; AVX1-NEXT:    retq
887 ; AVX2-SLOW-LABEL: trunc_ssat_v2i64_v2i16:
888 ; AVX2-SLOW:       # %bb.0:
889 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [32767,32767]
890 ; AVX2-SLOW-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
891 ; AVX2-SLOW-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
892 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
893 ; AVX2-SLOW-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
894 ; AVX2-SLOW-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
895 ; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
896 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
897 ; AVX2-SLOW-NEXT:    retq
899 ; AVX2-FAST-LABEL: trunc_ssat_v2i64_v2i16:
900 ; AVX2-FAST:       # %bb.0:
901 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [32767,32767]
902 ; AVX2-FAST-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
903 ; AVX2-FAST-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
904 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
905 ; AVX2-FAST-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
906 ; AVX2-FAST-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
907 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
908 ; AVX2-FAST-NEXT:    retq
910 ; AVX512F-LABEL: trunc_ssat_v2i64_v2i16:
911 ; AVX512F:       # %bb.0:
912 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
913 ; AVX512F-NEXT:    vpmovsqw %zmm0, %xmm0
914 ; AVX512F-NEXT:    vzeroupper
915 ; AVX512F-NEXT:    retq
917 ; AVX512VL-LABEL: trunc_ssat_v2i64_v2i16:
918 ; AVX512VL:       # %bb.0:
919 ; AVX512VL-NEXT:    vpmovsqw %xmm0, %xmm0
920 ; AVX512VL-NEXT:    retq
922 ; AVX512BW-LABEL: trunc_ssat_v2i64_v2i16:
923 ; AVX512BW:       # %bb.0:
924 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
925 ; AVX512BW-NEXT:    vpmovsqw %zmm0, %xmm0
926 ; AVX512BW-NEXT:    vzeroupper
927 ; AVX512BW-NEXT:    retq
929 ; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i16:
930 ; AVX512BWVL:       # %bb.0:
931 ; AVX512BWVL-NEXT:    vpmovsqw %xmm0, %xmm0
932 ; AVX512BWVL-NEXT:    retq
934 ; SKX-LABEL: trunc_ssat_v2i64_v2i16:
935 ; SKX:       # %bb.0:
936 ; SKX-NEXT:    vpmovsqw %xmm0, %xmm0
937 ; SKX-NEXT:    retq
938   %1 = icmp slt <2 x i64> %a0, <i64 32767, i64 32767>
939   %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 32767, i64 32767>
940   %3 = icmp sgt <2 x i64> %2, <i64 -32768, i64 -32768>
941   %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -32768, i64 -32768>
942   %5 = trunc <2 x i64> %4 to <2 x i16>
943   ret <2 x i16> %5
946 define void @trunc_ssat_v2i64_v2i16_store(<2 x i64> %a0, ptr%p1) {
947 ; SSE2-SSSE3-LABEL: trunc_ssat_v2i64_v2i16_store:
948 ; SSE2-SSSE3:       # %bb.0:
949 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
950 ; SSE2-SSSE3-NEXT:    movdqa %xmm0, %xmm2
951 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm2
952 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
953 ; SSE2-SSSE3-NEXT:    pxor %xmm4, %xmm4
954 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm3, %xmm4
955 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147516415,2147516415]
956 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
957 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
958 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm2
959 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
960 ; SSE2-SSSE3-NEXT:    por %xmm2, %xmm3
961 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm0
962 ; SSE2-SSSE3-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
963 ; SSE2-SSSE3-NEXT:    por %xmm0, %xmm3
964 ; SSE2-SSSE3-NEXT:    pxor %xmm3, %xmm1
965 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
966 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm2, %xmm2
967 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm0, %xmm2
968 ; SSE2-SSSE3-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
969 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
970 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm0
971 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
972 ; SSE2-SSSE3-NEXT:    por %xmm0, %xmm1
973 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm3
974 ; SSE2-SSSE3-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
975 ; SSE2-SSSE3-NEXT:    por %xmm3, %xmm1
976 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
977 ; SSE2-SSSE3-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
978 ; SSE2-SSSE3-NEXT:    movd %xmm0, (%rdi)
979 ; SSE2-SSSE3-NEXT:    retq
981 ; SSE41-LABEL: trunc_ssat_v2i64_v2i16_store:
982 ; SSE41:       # %bb.0:
983 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
984 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [32767,32767]
985 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
986 ; SSE41-NEXT:    pxor %xmm3, %xmm0
987 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [2147516415,2147516415]
988 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
989 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
990 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
991 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
992 ; SSE41-NEXT:    pand %xmm5, %xmm0
993 ; SSE41-NEXT:    por %xmm4, %xmm0
994 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
995 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
996 ; SSE41-NEXT:    pxor %xmm2, %xmm3
997 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [18446744071562035200,18446744071562035200]
998 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
999 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
1000 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
1001 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1002 ; SSE41-NEXT:    pand %xmm4, %xmm0
1003 ; SSE41-NEXT:    por %xmm3, %xmm0
1004 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
1005 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1006 ; SSE41-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1007 ; SSE41-NEXT:    movd %xmm0, (%rdi)
1008 ; SSE41-NEXT:    retq
1010 ; AVX1-LABEL: trunc_ssat_v2i64_v2i16_store:
1011 ; AVX1:       # %bb.0:
1012 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [32767,32767]
1013 ; AVX1-NEXT:    # xmm1 = mem[0,0]
1014 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
1015 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1016 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1017 ; AVX1-NEXT:    # xmm1 = mem[0,0]
1018 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
1019 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1020 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1021 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1022 ; AVX1-NEXT:    vmovd %xmm0, (%rdi)
1023 ; AVX1-NEXT:    retq
1025 ; AVX2-SLOW-LABEL: trunc_ssat_v2i64_v2i16_store:
1026 ; AVX2-SLOW:       # %bb.0:
1027 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [32767,32767]
1028 ; AVX2-SLOW-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
1029 ; AVX2-SLOW-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1030 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1031 ; AVX2-SLOW-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
1032 ; AVX2-SLOW-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1033 ; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1034 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1035 ; AVX2-SLOW-NEXT:    vmovd %xmm0, (%rdi)
1036 ; AVX2-SLOW-NEXT:    retq
1038 ; AVX2-FAST-LABEL: trunc_ssat_v2i64_v2i16_store:
1039 ; AVX2-FAST:       # %bb.0:
1040 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [32767,32767]
1041 ; AVX2-FAST-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
1042 ; AVX2-FAST-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1043 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1044 ; AVX2-FAST-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
1045 ; AVX2-FAST-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
1046 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,u,u,u,u,u,u,u,u,u,u,u,u]
1047 ; AVX2-FAST-NEXT:    vmovd %xmm0, (%rdi)
1048 ; AVX2-FAST-NEXT:    retq
1050 ; AVX512F-LABEL: trunc_ssat_v2i64_v2i16_store:
1051 ; AVX512F:       # %bb.0:
1052 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1053 ; AVX512F-NEXT:    vpmovsqw %zmm0, %xmm0
1054 ; AVX512F-NEXT:    vmovd %xmm0, (%rdi)
1055 ; AVX512F-NEXT:    vzeroupper
1056 ; AVX512F-NEXT:    retq
1058 ; AVX512VL-LABEL: trunc_ssat_v2i64_v2i16_store:
1059 ; AVX512VL:       # %bb.0:
1060 ; AVX512VL-NEXT:    vpmovsqw %xmm0, (%rdi)
1061 ; AVX512VL-NEXT:    retq
1063 ; AVX512BW-LABEL: trunc_ssat_v2i64_v2i16_store:
1064 ; AVX512BW:       # %bb.0:
1065 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
1066 ; AVX512BW-NEXT:    vpmovsqw %zmm0, %xmm0
1067 ; AVX512BW-NEXT:    vmovd %xmm0, (%rdi)
1068 ; AVX512BW-NEXT:    vzeroupper
1069 ; AVX512BW-NEXT:    retq
1071 ; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i16_store:
1072 ; AVX512BWVL:       # %bb.0:
1073 ; AVX512BWVL-NEXT:    vpmovsqw %xmm0, (%rdi)
1074 ; AVX512BWVL-NEXT:    retq
1076 ; SKX-LABEL: trunc_ssat_v2i64_v2i16_store:
1077 ; SKX:       # %bb.0:
1078 ; SKX-NEXT:    vpmovsqw %xmm0, (%rdi)
1079 ; SKX-NEXT:    retq
1080   %1 = icmp slt <2 x i64> %a0, <i64 32767, i64 32767>
1081   %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 32767, i64 32767>
1082   %3 = icmp sgt <2 x i64> %2, <i64 -32768, i64 -32768>
1083   %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -32768, i64 -32768>
1084   %5 = trunc <2 x i64> %4 to <2 x i16>
1085   store <2 x i16> %5, ptr%p1
1086   ret void
1089 define <4 x i16> @trunc_ssat_v4i64_v4i16(<4 x i64> %a0) {
1090 ; SSE2-SSSE3-LABEL: trunc_ssat_v4i64_v4i16:
1091 ; SSE2-SSSE3:       # %bb.0:
1092 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [32767,32767]
1093 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1094 ; SSE2-SSSE3-NEXT:    movdqa %xmm0, %xmm4
1095 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm4
1096 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
1097 ; SSE2-SSSE3-NEXT:    pxor %xmm6, %xmm6
1098 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm5
1099 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [2147516415,2147516415]
1100 ; SSE2-SSSE3-NEXT:    movdqa %xmm7, %xmm8
1101 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm4, %xmm8
1102 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm8[0,0,2,2]
1103 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm4
1104 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]
1105 ; SSE2-SSSE3-NEXT:    por %xmm4, %xmm5
1106 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm0
1107 ; SSE2-SSSE3-NEXT:    pandn %xmm3, %xmm5
1108 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm0
1109 ; SSE2-SSSE3-NEXT:    movdqa %xmm1, %xmm4
1110 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm4
1111 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
1112 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm5
1113 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm4, %xmm7
1114 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
1115 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm4
1116 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1117 ; SSE2-SSSE3-NEXT:    por %xmm4, %xmm5
1118 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm1
1119 ; SSE2-SSSE3-NEXT:    pandn %xmm3, %xmm5
1120 ; SSE2-SSSE3-NEXT:    por %xmm1, %xmm5
1121 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1122 ; SSE2-SSSE3-NEXT:    movdqa %xmm5, %xmm3
1123 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm3
1124 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
1125 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm6
1126 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm4
1127 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [18446744071562035200,18446744071562035200]
1128 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm3
1129 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm3[0,0,2,2]
1130 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm8
1131 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1132 ; SSE2-SSSE3-NEXT:    por %xmm8, %xmm3
1133 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm5
1134 ; SSE2-SSSE3-NEXT:    pandn %xmm1, %xmm3
1135 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm3
1136 ; SSE2-SSSE3-NEXT:    pxor %xmm0, %xmm2
1137 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
1138 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm4
1139 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm2
1140 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
1141 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm5
1142 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1143 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm2
1144 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm0
1145 ; SSE2-SSSE3-NEXT:    pandn %xmm1, %xmm2
1146 ; SSE2-SSSE3-NEXT:    por %xmm2, %xmm0
1147 ; SSE2-SSSE3-NEXT:    packssdw %xmm3, %xmm0
1148 ; SSE2-SSSE3-NEXT:    packssdw %xmm0, %xmm0
1149 ; SSE2-SSSE3-NEXT:    retq
1151 ; SSE41-LABEL: trunc_ssat_v4i64_v4i16:
1152 ; SSE41:       # %bb.0:
1153 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1154 ; SSE41-NEXT:    movapd {{.*#+}} xmm4 = [32767,32767]
1155 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
1156 ; SSE41-NEXT:    pxor %xmm3, %xmm0
1157 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [2147516415,2147516415]
1158 ; SSE41-NEXT:    movdqa %xmm6, %xmm5
1159 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
1160 ; SSE41-NEXT:    movdqa %xmm6, %xmm7
1161 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
1162 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1163 ; SSE41-NEXT:    pand %xmm5, %xmm0
1164 ; SSE41-NEXT:    por %xmm7, %xmm0
1165 ; SSE41-NEXT:    movapd %xmm4, %xmm5
1166 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
1167 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1168 ; SSE41-NEXT:    pxor %xmm3, %xmm0
1169 ; SSE41-NEXT:    movdqa %xmm6, %xmm2
1170 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
1171 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
1172 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1173 ; SSE41-NEXT:    pand %xmm2, %xmm0
1174 ; SSE41-NEXT:    por %xmm6, %xmm0
1175 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
1176 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1177 ; SSE41-NEXT:    movapd %xmm4, %xmm2
1178 ; SSE41-NEXT:    xorpd %xmm3, %xmm2
1179 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [18446744071562035200,18446744071562035200]
1180 ; SSE41-NEXT:    movapd %xmm2, %xmm7
1181 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm7
1182 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm2
1183 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
1184 ; SSE41-NEXT:    pand %xmm7, %xmm0
1185 ; SSE41-NEXT:    por %xmm2, %xmm0
1186 ; SSE41-NEXT:    movapd %xmm1, %xmm2
1187 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
1188 ; SSE41-NEXT:    xorpd %xmm5, %xmm3
1189 ; SSE41-NEXT:    movapd %xmm3, %xmm4
1190 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm4
1191 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm3
1192 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1193 ; SSE41-NEXT:    pand %xmm4, %xmm0
1194 ; SSE41-NEXT:    por %xmm3, %xmm0
1195 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
1196 ; SSE41-NEXT:    packssdw %xmm2, %xmm1
1197 ; SSE41-NEXT:    packssdw %xmm1, %xmm1
1198 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1199 ; SSE41-NEXT:    retq
1201 ; AVX1-LABEL: trunc_ssat_v4i64_v4i16:
1202 ; AVX1:       # %bb.0:
1203 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [32767,32767]
1204 ; AVX1-NEXT:    # xmm1 = mem[0,0]
1205 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
1206 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm2
1207 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1208 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm3
1209 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
1210 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1211 ; AVX1-NEXT:    # xmm1 = mem[0,0]
1212 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm3
1213 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
1214 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
1215 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm2, %xmm1, %xmm1
1216 ; AVX1-NEXT:    vpackssdw %xmm0, %xmm1, %xmm0
1217 ; AVX1-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
1218 ; AVX1-NEXT:    vzeroupper
1219 ; AVX1-NEXT:    retq
1221 ; AVX2-LABEL: trunc_ssat_v4i64_v4i16:
1222 ; AVX2:       # %bb.0:
1223 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [32767,32767,32767,32767]
1224 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
1225 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1226 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848]
1227 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
1228 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1229 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
1230 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
1231 ; AVX2-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
1232 ; AVX2-NEXT:    vzeroupper
1233 ; AVX2-NEXT:    retq
1235 ; AVX512F-LABEL: trunc_ssat_v4i64_v4i16:
1236 ; AVX512F:       # %bb.0:
1237 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1238 ; AVX512F-NEXT:    vpmovsqw %zmm0, %xmm0
1239 ; AVX512F-NEXT:    vzeroupper
1240 ; AVX512F-NEXT:    retq
1242 ; AVX512VL-LABEL: trunc_ssat_v4i64_v4i16:
1243 ; AVX512VL:       # %bb.0:
1244 ; AVX512VL-NEXT:    vpmovsqw %ymm0, %xmm0
1245 ; AVX512VL-NEXT:    vzeroupper
1246 ; AVX512VL-NEXT:    retq
1248 ; AVX512BW-LABEL: trunc_ssat_v4i64_v4i16:
1249 ; AVX512BW:       # %bb.0:
1250 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1251 ; AVX512BW-NEXT:    vpmovsqw %zmm0, %xmm0
1252 ; AVX512BW-NEXT:    vzeroupper
1253 ; AVX512BW-NEXT:    retq
1255 ; AVX512BWVL-LABEL: trunc_ssat_v4i64_v4i16:
1256 ; AVX512BWVL:       # %bb.0:
1257 ; AVX512BWVL-NEXT:    vpmovsqw %ymm0, %xmm0
1258 ; AVX512BWVL-NEXT:    vzeroupper
1259 ; AVX512BWVL-NEXT:    retq
1261 ; SKX-LABEL: trunc_ssat_v4i64_v4i16:
1262 ; SKX:       # %bb.0:
1263 ; SKX-NEXT:    vpmovsqw %ymm0, %xmm0
1264 ; SKX-NEXT:    vzeroupper
1265 ; SKX-NEXT:    retq
1266   %1 = icmp slt <4 x i64> %a0, <i64 32767, i64 32767, i64 32767, i64 32767>
1267   %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 32767, i64 32767, i64 32767, i64 32767>
1268   %3 = icmp sgt <4 x i64> %2, <i64 -32768, i64 -32768, i64 -32768, i64 -32768>
1269   %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> <i64 -32768, i64 -32768, i64 -32768, i64 -32768>
1270   %5 = trunc <4 x i64> %4 to <4 x i16>
1271   ret <4 x i16> %5
1274 define void @trunc_ssat_v4i64_v4i16_store(<4 x i64> %a0, ptr%p1) {
1275 ; SSE2-SSSE3-LABEL: trunc_ssat_v4i64_v4i16_store:
1276 ; SSE2-SSSE3:       # %bb.0:
1277 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [32767,32767]
1278 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1279 ; SSE2-SSSE3-NEXT:    movdqa %xmm0, %xmm3
1280 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm3
1281 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]
1282 ; SSE2-SSSE3-NEXT:    pxor %xmm6, %xmm6
1283 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm5
1284 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [2147516415,2147516415]
1285 ; SSE2-SSSE3-NEXT:    movdqa %xmm7, %xmm8
1286 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm3, %xmm8
1287 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
1288 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm9
1289 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm8[1,1,3,3]
1290 ; SSE2-SSSE3-NEXT:    por %xmm9, %xmm3
1291 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm0
1292 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm3
1293 ; SSE2-SSSE3-NEXT:    por %xmm0, %xmm3
1294 ; SSE2-SSSE3-NEXT:    movdqa %xmm1, %xmm0
1295 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm0
1296 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
1297 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm5
1298 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm0, %xmm7
1299 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1300 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm0
1301 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1302 ; SSE2-SSSE3-NEXT:    por %xmm0, %xmm5
1303 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm1
1304 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm5
1305 ; SSE2-SSSE3-NEXT:    por %xmm1, %xmm5
1306 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [18446744073709518848,18446744073709518848]
1307 ; SSE2-SSSE3-NEXT:    movdqa %xmm5, %xmm1
1308 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm1
1309 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
1310 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm6
1311 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm4
1312 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [18446744071562035200,18446744071562035200]
1313 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm1
1314 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm1[0,0,2,2]
1315 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm8
1316 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1317 ; SSE2-SSSE3-NEXT:    por %xmm8, %xmm1
1318 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm5
1319 ; SSE2-SSSE3-NEXT:    pandn %xmm0, %xmm1
1320 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm1
1321 ; SSE2-SSSE3-NEXT:    pxor %xmm3, %xmm2
1322 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
1323 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm4
1324 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm2
1325 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
1326 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm5
1327 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1328 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm2
1329 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm3
1330 ; SSE2-SSSE3-NEXT:    pandn %xmm0, %xmm2
1331 ; SSE2-SSSE3-NEXT:    por %xmm3, %xmm2
1332 ; SSE2-SSSE3-NEXT:    packssdw %xmm1, %xmm2
1333 ; SSE2-SSSE3-NEXT:    packssdw %xmm2, %xmm2
1334 ; SSE2-SSSE3-NEXT:    movq %xmm2, (%rdi)
1335 ; SSE2-SSSE3-NEXT:    retq
1337 ; SSE41-LABEL: trunc_ssat_v4i64_v4i16_store:
1338 ; SSE41:       # %bb.0:
1339 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
1340 ; SSE41-NEXT:    movapd {{.*#+}} xmm4 = [32767,32767]
1341 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
1342 ; SSE41-NEXT:    pxor %xmm3, %xmm0
1343 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [2147516415,2147516415]
1344 ; SSE41-NEXT:    movdqa %xmm6, %xmm5
1345 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
1346 ; SSE41-NEXT:    movdqa %xmm6, %xmm7
1347 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
1348 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1349 ; SSE41-NEXT:    pand %xmm5, %xmm0
1350 ; SSE41-NEXT:    por %xmm7, %xmm0
1351 ; SSE41-NEXT:    movapd %xmm4, %xmm5
1352 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
1353 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1354 ; SSE41-NEXT:    pxor %xmm3, %xmm0
1355 ; SSE41-NEXT:    movdqa %xmm6, %xmm2
1356 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
1357 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
1358 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1359 ; SSE41-NEXT:    pand %xmm2, %xmm0
1360 ; SSE41-NEXT:    por %xmm6, %xmm0
1361 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
1362 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1363 ; SSE41-NEXT:    movapd %xmm4, %xmm2
1364 ; SSE41-NEXT:    xorpd %xmm3, %xmm2
1365 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [18446744071562035200,18446744071562035200]
1366 ; SSE41-NEXT:    movapd %xmm2, %xmm7
1367 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm7
1368 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm2
1369 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
1370 ; SSE41-NEXT:    pand %xmm7, %xmm0
1371 ; SSE41-NEXT:    por %xmm2, %xmm0
1372 ; SSE41-NEXT:    movapd %xmm1, %xmm2
1373 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
1374 ; SSE41-NEXT:    xorpd %xmm5, %xmm3
1375 ; SSE41-NEXT:    movapd %xmm3, %xmm4
1376 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm4
1377 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm3
1378 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
1379 ; SSE41-NEXT:    pand %xmm4, %xmm0
1380 ; SSE41-NEXT:    por %xmm3, %xmm0
1381 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
1382 ; SSE41-NEXT:    packssdw %xmm2, %xmm1
1383 ; SSE41-NEXT:    packssdw %xmm1, %xmm1
1384 ; SSE41-NEXT:    movq %xmm1, (%rdi)
1385 ; SSE41-NEXT:    retq
1387 ; AVX1-LABEL: trunc_ssat_v4i64_v4i16_store:
1388 ; AVX1:       # %bb.0:
1389 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [32767,32767]
1390 ; AVX1-NEXT:    # xmm1 = mem[0,0]
1391 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
1392 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm2
1393 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1394 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm3
1395 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
1396 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1397 ; AVX1-NEXT:    # xmm1 = mem[0,0]
1398 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm3
1399 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
1400 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
1401 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm2, %xmm1, %xmm1
1402 ; AVX1-NEXT:    vpackssdw %xmm0, %xmm1, %xmm0
1403 ; AVX1-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
1404 ; AVX1-NEXT:    vmovq %xmm0, (%rdi)
1405 ; AVX1-NEXT:    vzeroupper
1406 ; AVX1-NEXT:    retq
1408 ; AVX2-LABEL: trunc_ssat_v4i64_v4i16_store:
1409 ; AVX2:       # %bb.0:
1410 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [32767,32767,32767,32767]
1411 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
1412 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1413 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848]
1414 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
1415 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
1416 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
1417 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
1418 ; AVX2-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
1419 ; AVX2-NEXT:    vmovq %xmm0, (%rdi)
1420 ; AVX2-NEXT:    vzeroupper
1421 ; AVX2-NEXT:    retq
1423 ; AVX512F-LABEL: trunc_ssat_v4i64_v4i16_store:
1424 ; AVX512F:       # %bb.0:
1425 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1426 ; AVX512F-NEXT:    vpmovsqw %zmm0, %xmm0
1427 ; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
1428 ; AVX512F-NEXT:    vzeroupper
1429 ; AVX512F-NEXT:    retq
1431 ; AVX512VL-LABEL: trunc_ssat_v4i64_v4i16_store:
1432 ; AVX512VL:       # %bb.0:
1433 ; AVX512VL-NEXT:    vpmovsqw %ymm0, (%rdi)
1434 ; AVX512VL-NEXT:    vzeroupper
1435 ; AVX512VL-NEXT:    retq
1437 ; AVX512BW-LABEL: trunc_ssat_v4i64_v4i16_store:
1438 ; AVX512BW:       # %bb.0:
1439 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1440 ; AVX512BW-NEXT:    vpmovsqw %zmm0, %xmm0
1441 ; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
1442 ; AVX512BW-NEXT:    vzeroupper
1443 ; AVX512BW-NEXT:    retq
1445 ; AVX512BWVL-LABEL: trunc_ssat_v4i64_v4i16_store:
1446 ; AVX512BWVL:       # %bb.0:
1447 ; AVX512BWVL-NEXT:    vpmovsqw %ymm0, (%rdi)
1448 ; AVX512BWVL-NEXT:    vzeroupper
1449 ; AVX512BWVL-NEXT:    retq
1451 ; SKX-LABEL: trunc_ssat_v4i64_v4i16_store:
1452 ; SKX:       # %bb.0:
1453 ; SKX-NEXT:    vpmovsqw %ymm0, (%rdi)
1454 ; SKX-NEXT:    vzeroupper
1455 ; SKX-NEXT:    retq
1456   %1 = icmp slt <4 x i64> %a0, <i64 32767, i64 32767, i64 32767, i64 32767>
1457   %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 32767, i64 32767, i64 32767, i64 32767>
1458   %3 = icmp sgt <4 x i64> %2, <i64 -32768, i64 -32768, i64 -32768, i64 -32768>
1459   %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> <i64 -32768, i64 -32768, i64 -32768, i64 -32768>
1460   %5 = trunc <4 x i64> %4 to <4 x i16>
1461   store <4 x i16> %5, ptr%p1
1462   ret void
1465 define <8 x i16> @trunc_ssat_v8i64_v8i16(ptr %p0) "min-legal-vector-width"="256" {
1466 ; SSE2-SSSE3-LABEL: trunc_ssat_v8i64_v8i16:
1467 ; SSE2-SSSE3:       # %bb.0:
1468 ; SSE2-SSSE3-NEXT:    movdqa (%rdi), %xmm6
1469 ; SSE2-SSSE3-NEXT:    movdqa 16(%rdi), %xmm0
1470 ; SSE2-SSSE3-NEXT:    movdqa 32(%rdi), %xmm3
1471 ; SSE2-SSSE3-NEXT:    movdqa 48(%rdi), %xmm5
1472 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [32767,32767]
1473 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
1474 ; SSE2-SSSE3-NEXT:    movdqa %xmm3, %xmm2
1475 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm2
1476 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm2[1,1,3,3]
1477 ; SSE2-SSSE3-NEXT:    pxor %xmm8, %xmm8
1478 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm9
1479 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [2147516415,2147516415]
1480 ; SSE2-SSSE3-NEXT:    movdqa %xmm7, %xmm10
1481 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm2, %xmm10
1482 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1483 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm11
1484 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]
1485 ; SSE2-SSSE3-NEXT:    por %xmm11, %xmm2
1486 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm3
1487 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm2
1488 ; SSE2-SSSE3-NEXT:    por %xmm3, %xmm2
1489 ; SSE2-SSSE3-NEXT:    movdqa %xmm5, %xmm3
1490 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm3
1491 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm3[1,1,3,3]
1492 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm9
1493 ; SSE2-SSSE3-NEXT:    movdqa %xmm7, %xmm10
1494 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm3, %xmm10
1495 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1496 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm11
1497 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm10[1,1,3,3]
1498 ; SSE2-SSSE3-NEXT:    por %xmm11, %xmm3
1499 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm5
1500 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm3
1501 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm3
1502 ; SSE2-SSSE3-NEXT:    movdqa %xmm6, %xmm5
1503 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm5
1504 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[1,1,3,3]
1505 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm9
1506 ; SSE2-SSSE3-NEXT:    movdqa %xmm7, %xmm10
1507 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm5, %xmm10
1508 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1509 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm11
1510 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm10[1,1,3,3]
1511 ; SSE2-SSSE3-NEXT:    por %xmm11, %xmm5
1512 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm6
1513 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm5
1514 ; SSE2-SSSE3-NEXT:    por %xmm6, %xmm5
1515 ; SSE2-SSSE3-NEXT:    movdqa %xmm0, %xmm6
1516 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm6
1517 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm6[1,1,3,3]
1518 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm9
1519 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm6, %xmm7
1520 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[0,0,2,2]
1521 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm6
1522 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[1,1,3,3]
1523 ; SSE2-SSSE3-NEXT:    por %xmm6, %xmm8
1524 ; SSE2-SSSE3-NEXT:    pand %xmm8, %xmm0
1525 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm8
1526 ; SSE2-SSSE3-NEXT:    por %xmm0, %xmm8
1527 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [18446744073709518848,18446744073709518848]
1528 ; SSE2-SSSE3-NEXT:    movdqa %xmm8, %xmm0
1529 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm0
1530 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm0[1,1,3,3]
1531 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm6
1532 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm9
1533 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [18446744071562035200,18446744071562035200]
1534 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm0
1535 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]
1536 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm10
1537 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm0[1,1,3,3]
1538 ; SSE2-SSSE3-NEXT:    por %xmm10, %xmm9
1539 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm8
1540 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm9
1541 ; SSE2-SSSE3-NEXT:    por %xmm8, %xmm9
1542 ; SSE2-SSSE3-NEXT:    movdqa %xmm5, %xmm0
1543 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm0
1544 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm0[1,1,3,3]
1545 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm8
1546 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm0
1547 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]
1548 ; SSE2-SSSE3-NEXT:    pand %xmm8, %xmm10
1549 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1550 ; SSE2-SSSE3-NEXT:    por %xmm10, %xmm0
1551 ; SSE2-SSSE3-NEXT:    pand %xmm0, %xmm5
1552 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm0
1553 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm0
1554 ; SSE2-SSSE3-NEXT:    packssdw %xmm9, %xmm0
1555 ; SSE2-SSSE3-NEXT:    movdqa %xmm3, %xmm5
1556 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm5
1557 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm5[1,1,3,3]
1558 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm8
1559 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm5
1560 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
1561 ; SSE2-SSSE3-NEXT:    pand %xmm8, %xmm9
1562 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1563 ; SSE2-SSSE3-NEXT:    por %xmm9, %xmm5
1564 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm3
1565 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm5
1566 ; SSE2-SSSE3-NEXT:    por %xmm3, %xmm5
1567 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm1
1568 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
1569 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm3
1570 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm1
1571 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
1572 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm6
1573 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1574 ; SSE2-SSSE3-NEXT:    por %xmm6, %xmm1
1575 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm2
1576 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm1
1577 ; SSE2-SSSE3-NEXT:    por %xmm2, %xmm1
1578 ; SSE2-SSSE3-NEXT:    packssdw %xmm5, %xmm1
1579 ; SSE2-SSSE3-NEXT:    packssdw %xmm1, %xmm0
1580 ; SSE2-SSSE3-NEXT:    retq
1582 ; SSE41-LABEL: trunc_ssat_v8i64_v8i16:
1583 ; SSE41:       # %bb.0:
1584 ; SSE41-NEXT:    movdqa (%rdi), %xmm7
1585 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm5
1586 ; SSE41-NEXT:    movdqa 32(%rdi), %xmm4
1587 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm8
1588 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [32767,32767]
1589 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1590 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
1591 ; SSE41-NEXT:    pxor %xmm2, %xmm0
1592 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [2147516415,2147516415]
1593 ; SSE41-NEXT:    movdqa %xmm6, %xmm3
1594 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
1595 ; SSE41-NEXT:    movdqa %xmm6, %xmm9
1596 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm9
1597 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
1598 ; SSE41-NEXT:    pand %xmm3, %xmm0
1599 ; SSE41-NEXT:    por %xmm9, %xmm0
1600 ; SSE41-NEXT:    movapd %xmm1, %xmm3
1601 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm3
1602 ; SSE41-NEXT:    movdqa %xmm8, %xmm0
1603 ; SSE41-NEXT:    pxor %xmm2, %xmm0
1604 ; SSE41-NEXT:    movdqa %xmm6, %xmm4
1605 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
1606 ; SSE41-NEXT:    movdqa %xmm6, %xmm9
1607 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm9
1608 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
1609 ; SSE41-NEXT:    pand %xmm4, %xmm0
1610 ; SSE41-NEXT:    por %xmm9, %xmm0
1611 ; SSE41-NEXT:    movapd %xmm1, %xmm4
1612 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm4
1613 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
1614 ; SSE41-NEXT:    pxor %xmm2, %xmm0
1615 ; SSE41-NEXT:    movdqa %xmm6, %xmm8
1616 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm8
1617 ; SSE41-NEXT:    movdqa %xmm6, %xmm9
1618 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm9
1619 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
1620 ; SSE41-NEXT:    pand %xmm8, %xmm0
1621 ; SSE41-NEXT:    por %xmm9, %xmm0
1622 ; SSE41-NEXT:    movapd %xmm1, %xmm8
1623 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm8
1624 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
1625 ; SSE41-NEXT:    pxor %xmm2, %xmm0
1626 ; SSE41-NEXT:    movdqa %xmm6, %xmm7
1627 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm7
1628 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
1629 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
1630 ; SSE41-NEXT:    pand %xmm7, %xmm0
1631 ; SSE41-NEXT:    por %xmm6, %xmm0
1632 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
1633 ; SSE41-NEXT:    movapd {{.*#+}} xmm5 = [18446744073709518848,18446744073709518848]
1634 ; SSE41-NEXT:    movapd %xmm1, %xmm7
1635 ; SSE41-NEXT:    xorpd %xmm2, %xmm7
1636 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [18446744071562035200,18446744071562035200]
1637 ; SSE41-NEXT:    movapd %xmm7, %xmm9
1638 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm9
1639 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm7
1640 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1641 ; SSE41-NEXT:    pand %xmm9, %xmm0
1642 ; SSE41-NEXT:    por %xmm7, %xmm0
1643 ; SSE41-NEXT:    movapd %xmm5, %xmm7
1644 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm7
1645 ; SSE41-NEXT:    movapd %xmm8, %xmm1
1646 ; SSE41-NEXT:    xorpd %xmm2, %xmm1
1647 ; SSE41-NEXT:    movapd %xmm1, %xmm9
1648 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm9
1649 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm1
1650 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
1651 ; SSE41-NEXT:    pand %xmm9, %xmm0
1652 ; SSE41-NEXT:    por %xmm1, %xmm0
1653 ; SSE41-NEXT:    movapd %xmm5, %xmm1
1654 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm1
1655 ; SSE41-NEXT:    packssdw %xmm7, %xmm1
1656 ; SSE41-NEXT:    movapd %xmm4, %xmm7
1657 ; SSE41-NEXT:    xorpd %xmm2, %xmm7
1658 ; SSE41-NEXT:    movapd %xmm7, %xmm8
1659 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm8
1660 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm7
1661 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
1662 ; SSE41-NEXT:    pand %xmm8, %xmm0
1663 ; SSE41-NEXT:    por %xmm7, %xmm0
1664 ; SSE41-NEXT:    movapd %xmm5, %xmm7
1665 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm7
1666 ; SSE41-NEXT:    xorpd %xmm3, %xmm2
1667 ; SSE41-NEXT:    movapd %xmm2, %xmm4
1668 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm4
1669 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm2
1670 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
1671 ; SSE41-NEXT:    pand %xmm4, %xmm0
1672 ; SSE41-NEXT:    por %xmm2, %xmm0
1673 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm5
1674 ; SSE41-NEXT:    packssdw %xmm7, %xmm5
1675 ; SSE41-NEXT:    packssdw %xmm5, %xmm1
1676 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1677 ; SSE41-NEXT:    retq
1679 ; AVX1-LABEL: trunc_ssat_v8i64_v8i16:
1680 ; AVX1:       # %bb.0:
1681 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
1682 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
1683 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm2
1684 ; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm3
1685 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm4 = [32767,32767]
1686 ; AVX1-NEXT:    # xmm4 = mem[0,0]
1687 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm5
1688 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm2, %xmm4, %xmm2
1689 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm5
1690 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm3, %xmm4, %xmm3
1691 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm4, %xmm5
1692 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
1693 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm5
1694 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm1, %xmm4, %xmm1
1695 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm4 = [18446744073709518848,18446744073709518848]
1696 ; AVX1-NEXT:    # xmm4 = mem[0,0]
1697 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm1, %xmm5
1698 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm1, %xmm4, %xmm1
1699 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm0, %xmm5
1700 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
1701 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
1702 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm3, %xmm1
1703 ; AVX1-NEXT:    vblendvpd %xmm1, %xmm3, %xmm4, %xmm1
1704 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm2, %xmm3
1705 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm2, %xmm4, %xmm2
1706 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm2, %xmm1
1707 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
1708 ; AVX1-NEXT:    retq
1710 ; AVX2-LABEL: trunc_ssat_v8i64_v8i16:
1711 ; AVX2:       # %bb.0:
1712 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
1713 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
1714 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [32767,32767,32767,32767]
1715 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
1716 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1717 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
1718 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
1719 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848]
1720 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm3
1721 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
1722 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
1723 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1724 ; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
1725 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1726 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
1727 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
1728 ; AVX2-NEXT:    vzeroupper
1729 ; AVX2-NEXT:    retq
1731 ; AVX512-LABEL: trunc_ssat_v8i64_v8i16:
1732 ; AVX512:       # %bb.0:
1733 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
1734 ; AVX512-NEXT:    vpmovsqw %zmm0, %xmm0
1735 ; AVX512-NEXT:    vzeroupper
1736 ; AVX512-NEXT:    retq
1738 ; SKX-LABEL: trunc_ssat_v8i64_v8i16:
1739 ; SKX:       # %bb.0:
1740 ; SKX-NEXT:    vmovdqa (%rdi), %ymm0
1741 ; SKX-NEXT:    vmovdqa 32(%rdi), %ymm1
1742 ; SKX-NEXT:    vpmovsqw %ymm1, %xmm1
1743 ; SKX-NEXT:    vpmovsqw %ymm0, %xmm0
1744 ; SKX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1745 ; SKX-NEXT:    vzeroupper
1746 ; SKX-NEXT:    retq
1747   %a0 = load <8 x i64>, ptr %p0
1748   %1 = icmp slt <8 x i64> %a0, <i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767>
1749   %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767>
1750   %3 = icmp sgt <8 x i64> %2, <i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768>
1751   %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> <i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768>
1752   %5 = trunc <8 x i64> %4 to <8 x i16>
1753   ret <8 x i16> %5
1756 define <4 x i16> @trunc_ssat_v4i32_v4i16(<4 x i32> %a0) {
1757 ; SSE-LABEL: trunc_ssat_v4i32_v4i16:
1758 ; SSE:       # %bb.0:
1759 ; SSE-NEXT:    packssdw %xmm0, %xmm0
1760 ; SSE-NEXT:    retq
1762 ; AVX-LABEL: trunc_ssat_v4i32_v4i16:
1763 ; AVX:       # %bb.0:
1764 ; AVX-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
1765 ; AVX-NEXT:    retq
1767 ; AVX512-LABEL: trunc_ssat_v4i32_v4i16:
1768 ; AVX512:       # %bb.0:
1769 ; AVX512-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
1770 ; AVX512-NEXT:    retq
1772 ; SKX-LABEL: trunc_ssat_v4i32_v4i16:
1773 ; SKX:       # %bb.0:
1774 ; SKX-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
1775 ; SKX-NEXT:    retq
1776   %1 = icmp slt <4 x i32> %a0, <i32 32767, i32 32767, i32 32767, i32 32767>
1777   %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767>
1778   %3 = icmp sgt <4 x i32> %2, <i32 -32768, i32 -32768, i32 -32768, i32 -32768>
1779   %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768>
1780   %5 = trunc <4 x i32> %4 to <4 x i16>
1781   ret <4 x i16> %5
1784 define void @trunc_ssat_v4i32_v4i16_store(<4 x i32> %a0, ptr%p1) {
1785 ; SSE-LABEL: trunc_ssat_v4i32_v4i16_store:
1786 ; SSE:       # %bb.0:
1787 ; SSE-NEXT:    packssdw %xmm0, %xmm0
1788 ; SSE-NEXT:    movq %xmm0, (%rdi)
1789 ; SSE-NEXT:    retq
1791 ; AVX-LABEL: trunc_ssat_v4i32_v4i16_store:
1792 ; AVX:       # %bb.0:
1793 ; AVX-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
1794 ; AVX-NEXT:    vmovq %xmm0, (%rdi)
1795 ; AVX-NEXT:    retq
1797 ; AVX512F-LABEL: trunc_ssat_v4i32_v4i16_store:
1798 ; AVX512F:       # %bb.0:
1799 ; AVX512F-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
1800 ; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
1801 ; AVX512F-NEXT:    retq
1803 ; AVX512VL-LABEL: trunc_ssat_v4i32_v4i16_store:
1804 ; AVX512VL:       # %bb.0:
1805 ; AVX512VL-NEXT:    vpmovsdw %xmm0, (%rdi)
1806 ; AVX512VL-NEXT:    retq
1808 ; AVX512BW-LABEL: trunc_ssat_v4i32_v4i16_store:
1809 ; AVX512BW:       # %bb.0:
1810 ; AVX512BW-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
1811 ; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
1812 ; AVX512BW-NEXT:    retq
1814 ; AVX512BWVL-LABEL: trunc_ssat_v4i32_v4i16_store:
1815 ; AVX512BWVL:       # %bb.0:
1816 ; AVX512BWVL-NEXT:    vpmovsdw %xmm0, (%rdi)
1817 ; AVX512BWVL-NEXT:    retq
1819 ; SKX-LABEL: trunc_ssat_v4i32_v4i16_store:
1820 ; SKX:       # %bb.0:
1821 ; SKX-NEXT:    vpmovsdw %xmm0, (%rdi)
1822 ; SKX-NEXT:    retq
1823   %1 = icmp slt <4 x i32> %a0, <i32 32767, i32 32767, i32 32767, i32 32767>
1824   %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767>
1825   %3 = icmp sgt <4 x i32> %2, <i32 -32768, i32 -32768, i32 -32768, i32 -32768>
1826   %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768>
1827   %5 = trunc <4 x i32> %4 to <4 x i16>
1828   store <4 x i16> %5, ptr%p1
1829   ret void
1832 define <8 x i16> @trunc_ssat_v8i32_v8i16(<8 x i32> %a0) {
1833 ; SSE-LABEL: trunc_ssat_v8i32_v8i16:
1834 ; SSE:       # %bb.0:
1835 ; SSE-NEXT:    packssdw %xmm1, %xmm0
1836 ; SSE-NEXT:    retq
1838 ; AVX1-LABEL: trunc_ssat_v8i32_v8i16:
1839 ; AVX1:       # %bb.0:
1840 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1841 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
1842 ; AVX1-NEXT:    vzeroupper
1843 ; AVX1-NEXT:    retq
1845 ; AVX2-LABEL: trunc_ssat_v8i32_v8i16:
1846 ; AVX2:       # %bb.0:
1847 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1848 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
1849 ; AVX2-NEXT:    vzeroupper
1850 ; AVX2-NEXT:    retq
1852 ; AVX512F-LABEL: trunc_ssat_v8i32_v8i16:
1853 ; AVX512F:       # %bb.0:
1854 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
1855 ; AVX512F-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
1856 ; AVX512F-NEXT:    vzeroupper
1857 ; AVX512F-NEXT:    retq
1859 ; AVX512VL-LABEL: trunc_ssat_v8i32_v8i16:
1860 ; AVX512VL:       # %bb.0:
1861 ; AVX512VL-NEXT:    vpmovsdw %ymm0, %xmm0
1862 ; AVX512VL-NEXT:    vzeroupper
1863 ; AVX512VL-NEXT:    retq
1865 ; AVX512BW-LABEL: trunc_ssat_v8i32_v8i16:
1866 ; AVX512BW:       # %bb.0:
1867 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
1868 ; AVX512BW-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
1869 ; AVX512BW-NEXT:    vzeroupper
1870 ; AVX512BW-NEXT:    retq
1872 ; AVX512BWVL-LABEL: trunc_ssat_v8i32_v8i16:
1873 ; AVX512BWVL:       # %bb.0:
1874 ; AVX512BWVL-NEXT:    vpmovsdw %ymm0, %xmm0
1875 ; AVX512BWVL-NEXT:    vzeroupper
1876 ; AVX512BWVL-NEXT:    retq
1878 ; SKX-LABEL: trunc_ssat_v8i32_v8i16:
1879 ; SKX:       # %bb.0:
1880 ; SKX-NEXT:    vpmovsdw %ymm0, %xmm0
1881 ; SKX-NEXT:    vzeroupper
1882 ; SKX-NEXT:    retq
1883   %1 = icmp slt <8 x i32> %a0, <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>
1884   %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>
1885   %3 = icmp sgt <8 x i32> %2, <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>
1886   %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>
1887   %5 = trunc <8 x i32> %4 to <8 x i16>
1888   ret <8 x i16> %5
1891 define <16 x i16> @trunc_ssat_v16i32_v16i16(ptr %p0) "min-legal-vector-width"="256" {
1892 ; SSE-LABEL: trunc_ssat_v16i32_v16i16:
1893 ; SSE:       # %bb.0:
1894 ; SSE-NEXT:    movdqa (%rdi), %xmm0
1895 ; SSE-NEXT:    movdqa 32(%rdi), %xmm1
1896 ; SSE-NEXT:    packssdw 16(%rdi), %xmm0
1897 ; SSE-NEXT:    packssdw 48(%rdi), %xmm1
1898 ; SSE-NEXT:    retq
1900 ; AVX1-LABEL: trunc_ssat_v16i32_v16i16:
1901 ; AVX1:       # %bb.0:
1902 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
1903 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm1
1904 ; AVX1-NEXT:    vpackssdw 48(%rdi), %xmm1, %xmm1
1905 ; AVX1-NEXT:    vpackssdw 16(%rdi), %xmm0, %xmm0
1906 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1907 ; AVX1-NEXT:    retq
1909 ; AVX2-LABEL: trunc_ssat_v16i32_v16i16:
1910 ; AVX2:       # %bb.0:
1911 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
1912 ; AVX2-NEXT:    vpackssdw 32(%rdi), %ymm0, %ymm0
1913 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1914 ; AVX2-NEXT:    retq
1916 ; AVX512-LABEL: trunc_ssat_v16i32_v16i16:
1917 ; AVX512:       # %bb.0:
1918 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
1919 ; AVX512-NEXT:    vpmovsdw %zmm0, %ymm0
1920 ; AVX512-NEXT:    retq
1922 ; SKX-LABEL: trunc_ssat_v16i32_v16i16:
1923 ; SKX:       # %bb.0:
1924 ; SKX-NEXT:    vmovdqa (%rdi), %ymm0
1925 ; SKX-NEXT:    vpackssdw 32(%rdi), %ymm0, %ymm0
1926 ; SKX-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1927 ; SKX-NEXT:    retq
1928   %a0 = load <16 x i32>, ptr %p0
1929   %1 = icmp slt <16 x i32> %a0, <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>
1930   %2 = select <16 x i1> %1, <16 x i32> %a0, <16 x i32> <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>
1931   %3 = icmp sgt <16 x i32> %2, <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>
1932   %4 = select <16 x i1> %3, <16 x i32> %2, <16 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>
1933   %5 = trunc <16 x i32> %4 to <16 x i16>
1934   ret <16 x i16> %5
1938 ; Signed saturation truncation to vXi8
1941 define <2 x i8> @trunc_ssat_v2i64_v2i8(<2 x i64> %a0) {
1942 ; SSE2-LABEL: trunc_ssat_v2i64_v2i8:
1943 ; SSE2:       # %bb.0:
1944 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
1945 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1946 ; SSE2-NEXT:    pxor %xmm1, %xmm2
1947 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
1948 ; SSE2-NEXT:    pxor %xmm4, %xmm4
1949 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
1950 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483775,2147483775]
1951 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
1952 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
1953 ; SSE2-NEXT:    pand %xmm4, %xmm2
1954 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1955 ; SSE2-NEXT:    por %xmm2, %xmm3
1956 ; SSE2-NEXT:    pand %xmm3, %xmm0
1957 ; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
1958 ; SSE2-NEXT:    por %xmm3, %xmm0
1959 ; SSE2-NEXT:    pxor %xmm0, %xmm1
1960 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1961 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm3
1962 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
1963 ; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1964 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
1965 ; SSE2-NEXT:    pand %xmm3, %xmm2
1966 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1967 ; SSE2-NEXT:    por %xmm2, %xmm1
1968 ; SSE2-NEXT:    pand %xmm1, %xmm0
1969 ; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1970 ; SSE2-NEXT:    por %xmm1, %xmm0
1971 ; SSE2-NEXT:    packssdw %xmm0, %xmm0
1972 ; SSE2-NEXT:    packssdw %xmm0, %xmm0
1973 ; SSE2-NEXT:    packsswb %xmm0, %xmm0
1974 ; SSE2-NEXT:    retq
1976 ; SSSE3-LABEL: trunc_ssat_v2i64_v2i8:
1977 ; SSSE3:       # %bb.0:
1978 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
1979 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
1980 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
1981 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
1982 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
1983 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm4
1984 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483775,2147483775]
1985 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
1986 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
1987 ; SSSE3-NEXT:    pand %xmm4, %xmm2
1988 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1989 ; SSSE3-NEXT:    por %xmm2, %xmm3
1990 ; SSSE3-NEXT:    pand %xmm3, %xmm0
1991 ; SSSE3-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
1992 ; SSSE3-NEXT:    por %xmm3, %xmm0
1993 ; SSSE3-NEXT:    pxor %xmm0, %xmm1
1994 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1995 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm3
1996 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm3
1997 ; SSSE3-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1998 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
1999 ; SSSE3-NEXT:    pand %xmm3, %xmm2
2000 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2001 ; SSSE3-NEXT:    por %xmm2, %xmm1
2002 ; SSSE3-NEXT:    pand %xmm1, %xmm0
2003 ; SSSE3-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2004 ; SSSE3-NEXT:    por %xmm1, %xmm0
2005 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2006 ; SSSE3-NEXT:    retq
2008 ; SSE41-LABEL: trunc_ssat_v2i64_v2i8:
2009 ; SSE41:       # %bb.0:
2010 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
2011 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [127,127]
2012 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
2013 ; SSE41-NEXT:    pxor %xmm3, %xmm0
2014 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [2147483775,2147483775]
2015 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
2016 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
2017 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
2018 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
2019 ; SSE41-NEXT:    pand %xmm5, %xmm0
2020 ; SSE41-NEXT:    por %xmm4, %xmm0
2021 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
2022 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
2023 ; SSE41-NEXT:    pxor %xmm2, %xmm3
2024 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [18446744071562067840,18446744071562067840]
2025 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
2026 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
2027 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
2028 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2029 ; SSE41-NEXT:    pand %xmm4, %xmm0
2030 ; SSE41-NEXT:    por %xmm3, %xmm0
2031 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
2032 ; SSE41-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2033 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
2034 ; SSE41-NEXT:    retq
2036 ; AVX1-LABEL: trunc_ssat_v2i64_v2i8:
2037 ; AVX1:       # %bb.0:
2038 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [127,127]
2039 ; AVX1-NEXT:    # xmm1 = mem[0,0]
2040 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
2041 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2042 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
2043 ; AVX1-NEXT:    # xmm1 = mem[0,0]
2044 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
2045 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2046 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2047 ; AVX1-NEXT:    retq
2049 ; AVX2-LABEL: trunc_ssat_v2i64_v2i8:
2050 ; AVX2:       # %bb.0:
2051 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [127,127]
2052 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
2053 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2054 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
2055 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
2056 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2057 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2058 ; AVX2-NEXT:    retq
2060 ; AVX512F-LABEL: trunc_ssat_v2i64_v2i8:
2061 ; AVX512F:       # %bb.0:
2062 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2063 ; AVX512F-NEXT:    vpmovsqb %zmm0, %xmm0
2064 ; AVX512F-NEXT:    vzeroupper
2065 ; AVX512F-NEXT:    retq
2067 ; AVX512VL-LABEL: trunc_ssat_v2i64_v2i8:
2068 ; AVX512VL:       # %bb.0:
2069 ; AVX512VL-NEXT:    vpmovsqb %xmm0, %xmm0
2070 ; AVX512VL-NEXT:    retq
2072 ; AVX512BW-LABEL: trunc_ssat_v2i64_v2i8:
2073 ; AVX512BW:       # %bb.0:
2074 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2075 ; AVX512BW-NEXT:    vpmovsqb %zmm0, %xmm0
2076 ; AVX512BW-NEXT:    vzeroupper
2077 ; AVX512BW-NEXT:    retq
2079 ; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i8:
2080 ; AVX512BWVL:       # %bb.0:
2081 ; AVX512BWVL-NEXT:    vpmovsqb %xmm0, %xmm0
2082 ; AVX512BWVL-NEXT:    retq
2084 ; SKX-LABEL: trunc_ssat_v2i64_v2i8:
2085 ; SKX:       # %bb.0:
2086 ; SKX-NEXT:    vpmovsqb %xmm0, %xmm0
2087 ; SKX-NEXT:    retq
2088   %1 = icmp slt <2 x i64> %a0, <i64 127, i64 127>
2089   %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 127, i64 127>
2090   %3 = icmp sgt <2 x i64> %2, <i64 -128, i64 -128>
2091   %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -128, i64 -128>
2092   %5 = trunc <2 x i64> %4 to <2 x i8>
2093   ret <2 x i8> %5
2096 define void @trunc_ssat_v2i64_v2i8_store(<2 x i64> %a0, ptr%p1) {
2097 ; SSE2-LABEL: trunc_ssat_v2i64_v2i8_store:
2098 ; SSE2:       # %bb.0:
2099 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
2100 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
2101 ; SSE2-NEXT:    pxor %xmm1, %xmm2
2102 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
2103 ; SSE2-NEXT:    pxor %xmm4, %xmm4
2104 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
2105 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483775,2147483775]
2106 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
2107 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
2108 ; SSE2-NEXT:    pand %xmm4, %xmm2
2109 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2110 ; SSE2-NEXT:    por %xmm2, %xmm3
2111 ; SSE2-NEXT:    pand %xmm3, %xmm0
2112 ; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2113 ; SSE2-NEXT:    por %xmm0, %xmm3
2114 ; SSE2-NEXT:    pxor %xmm3, %xmm1
2115 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
2116 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
2117 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
2118 ; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2119 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
2120 ; SSE2-NEXT:    pand %xmm2, %xmm0
2121 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2122 ; SSE2-NEXT:    por %xmm0, %xmm1
2123 ; SSE2-NEXT:    pand %xmm1, %xmm3
2124 ; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2125 ; SSE2-NEXT:    por %xmm3, %xmm1
2126 ; SSE2-NEXT:    packssdw %xmm1, %xmm1
2127 ; SSE2-NEXT:    packssdw %xmm1, %xmm1
2128 ; SSE2-NEXT:    packsswb %xmm1, %xmm1
2129 ; SSE2-NEXT:    movd %xmm1, %eax
2130 ; SSE2-NEXT:    movw %ax, (%rdi)
2131 ; SSE2-NEXT:    retq
2133 ; SSSE3-LABEL: trunc_ssat_v2i64_v2i8_store:
2134 ; SSSE3:       # %bb.0:
2135 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
2136 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
2137 ; SSSE3-NEXT:    pxor %xmm1, %xmm2
2138 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
2139 ; SSSE3-NEXT:    pxor %xmm4, %xmm4
2140 ; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm4
2141 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [2147483775,2147483775]
2142 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
2143 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
2144 ; SSSE3-NEXT:    pand %xmm4, %xmm2
2145 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2146 ; SSSE3-NEXT:    por %xmm2, %xmm3
2147 ; SSSE3-NEXT:    pand %xmm3, %xmm0
2148 ; SSSE3-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2149 ; SSSE3-NEXT:    por %xmm0, %xmm3
2150 ; SSSE3-NEXT:    pxor %xmm3, %xmm1
2151 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
2152 ; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm2
2153 ; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm2
2154 ; SSSE3-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2155 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
2156 ; SSSE3-NEXT:    pand %xmm2, %xmm0
2157 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2158 ; SSSE3-NEXT:    por %xmm0, %xmm1
2159 ; SSSE3-NEXT:    pand %xmm1, %xmm3
2160 ; SSSE3-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
2161 ; SSSE3-NEXT:    por %xmm3, %xmm1
2162 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2163 ; SSSE3-NEXT:    movd %xmm1, %eax
2164 ; SSSE3-NEXT:    movw %ax, (%rdi)
2165 ; SSSE3-NEXT:    retq
2167 ; SSE41-LABEL: trunc_ssat_v2i64_v2i8_store:
2168 ; SSE41:       # %bb.0:
2169 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
2170 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [127,127]
2171 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
2172 ; SSE41-NEXT:    pxor %xmm3, %xmm0
2173 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [2147483775,2147483775]
2174 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
2175 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
2176 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
2177 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
2178 ; SSE41-NEXT:    pand %xmm5, %xmm0
2179 ; SSE41-NEXT:    por %xmm4, %xmm0
2180 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
2181 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
2182 ; SSE41-NEXT:    pxor %xmm2, %xmm3
2183 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [18446744071562067840,18446744071562067840]
2184 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
2185 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
2186 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
2187 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2188 ; SSE41-NEXT:    pand %xmm4, %xmm0
2189 ; SSE41-NEXT:    por %xmm3, %xmm0
2190 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
2191 ; SSE41-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2192 ; SSE41-NEXT:    pextrw $0, %xmm1, (%rdi)
2193 ; SSE41-NEXT:    retq
2195 ; AVX1-LABEL: trunc_ssat_v2i64_v2i8_store:
2196 ; AVX1:       # %bb.0:
2197 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [127,127]
2198 ; AVX1-NEXT:    # xmm1 = mem[0,0]
2199 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
2200 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2201 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
2202 ; AVX1-NEXT:    # xmm1 = mem[0,0]
2203 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
2204 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2205 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2206 ; AVX1-NEXT:    vpextrw $0, %xmm0, (%rdi)
2207 ; AVX1-NEXT:    retq
2209 ; AVX2-LABEL: trunc_ssat_v2i64_v2i8_store:
2210 ; AVX2:       # %bb.0:
2211 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [127,127]
2212 ; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
2213 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2214 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
2215 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
2216 ; AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
2217 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2218 ; AVX2-NEXT:    vpextrw $0, %xmm0, (%rdi)
2219 ; AVX2-NEXT:    retq
2221 ; AVX512F-LABEL: trunc_ssat_v2i64_v2i8_store:
2222 ; AVX512F:       # %bb.0:
2223 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2224 ; AVX512F-NEXT:    vpmovsqb %zmm0, %xmm0
2225 ; AVX512F-NEXT:    vpextrw $0, %xmm0, (%rdi)
2226 ; AVX512F-NEXT:    vzeroupper
2227 ; AVX512F-NEXT:    retq
2229 ; AVX512VL-LABEL: trunc_ssat_v2i64_v2i8_store:
2230 ; AVX512VL:       # %bb.0:
2231 ; AVX512VL-NEXT:    vpmovsqb %xmm0, (%rdi)
2232 ; AVX512VL-NEXT:    retq
2234 ; AVX512BW-LABEL: trunc_ssat_v2i64_v2i8_store:
2235 ; AVX512BW:       # %bb.0:
2236 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2237 ; AVX512BW-NEXT:    vpmovsqb %zmm0, %xmm0
2238 ; AVX512BW-NEXT:    vpextrw $0, %xmm0, (%rdi)
2239 ; AVX512BW-NEXT:    vzeroupper
2240 ; AVX512BW-NEXT:    retq
2242 ; AVX512BWVL-LABEL: trunc_ssat_v2i64_v2i8_store:
2243 ; AVX512BWVL:       # %bb.0:
2244 ; AVX512BWVL-NEXT:    vpmovsqb %xmm0, (%rdi)
2245 ; AVX512BWVL-NEXT:    retq
2247 ; SKX-LABEL: trunc_ssat_v2i64_v2i8_store:
2248 ; SKX:       # %bb.0:
2249 ; SKX-NEXT:    vpmovsqb %xmm0, (%rdi)
2250 ; SKX-NEXT:    retq
2251   %1 = icmp slt <2 x i64> %a0, <i64 127, i64 127>
2252   %2 = select <2 x i1> %1, <2 x i64> %a0, <2 x i64> <i64 127, i64 127>
2253   %3 = icmp sgt <2 x i64> %2, <i64 -128, i64 -128>
2254   %4 = select <2 x i1> %3, <2 x i64> %2, <2 x i64> <i64 -128, i64 -128>
2255   %5 = trunc <2 x i64> %4 to <2 x i8>
2256   store <2 x i8> %5, ptr%p1
2257   ret void
2260 define <4 x i8> @trunc_ssat_v4i64_v4i8(<4 x i64> %a0) {
2261 ; SSE2-SSSE3-LABEL: trunc_ssat_v4i64_v4i8:
2262 ; SSE2-SSSE3:       # %bb.0:
2263 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [127,127]
2264 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
2265 ; SSE2-SSSE3-NEXT:    movdqa %xmm0, %xmm4
2266 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm4
2267 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
2268 ; SSE2-SSSE3-NEXT:    pxor %xmm6, %xmm6
2269 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm5
2270 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [2147483775,2147483775]
2271 ; SSE2-SSSE3-NEXT:    movdqa %xmm7, %xmm8
2272 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm4, %xmm8
2273 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm8[0,0,2,2]
2274 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm4
2275 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]
2276 ; SSE2-SSSE3-NEXT:    por %xmm4, %xmm5
2277 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm0
2278 ; SSE2-SSSE3-NEXT:    pandn %xmm3, %xmm5
2279 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm0
2280 ; SSE2-SSSE3-NEXT:    movdqa %xmm1, %xmm4
2281 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm4
2282 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
2283 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm5
2284 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm4, %xmm7
2285 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
2286 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm4
2287 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
2288 ; SSE2-SSSE3-NEXT:    por %xmm4, %xmm5
2289 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm1
2290 ; SSE2-SSSE3-NEXT:    pandn %xmm3, %xmm5
2291 ; SSE2-SSSE3-NEXT:    por %xmm1, %xmm5
2292 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
2293 ; SSE2-SSSE3-NEXT:    movdqa %xmm5, %xmm3
2294 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm3
2295 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
2296 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm6
2297 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm4
2298 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [18446744071562067840,18446744071562067840]
2299 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm3
2300 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm3[0,0,2,2]
2301 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm8
2302 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2303 ; SSE2-SSSE3-NEXT:    por %xmm8, %xmm3
2304 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm5
2305 ; SSE2-SSSE3-NEXT:    pandn %xmm1, %xmm3
2306 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm3
2307 ; SSE2-SSSE3-NEXT:    pxor %xmm0, %xmm2
2308 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
2309 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm4
2310 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm2
2311 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
2312 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm5
2313 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2314 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm2
2315 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm0
2316 ; SSE2-SSSE3-NEXT:    pandn %xmm1, %xmm2
2317 ; SSE2-SSSE3-NEXT:    por %xmm2, %xmm0
2318 ; SSE2-SSSE3-NEXT:    packssdw %xmm3, %xmm0
2319 ; SSE2-SSSE3-NEXT:    packssdw %xmm0, %xmm0
2320 ; SSE2-SSSE3-NEXT:    packsswb %xmm0, %xmm0
2321 ; SSE2-SSSE3-NEXT:    retq
2323 ; SSE41-LABEL: trunc_ssat_v4i64_v4i8:
2324 ; SSE41:       # %bb.0:
2325 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
2326 ; SSE41-NEXT:    movapd {{.*#+}} xmm4 = [127,127]
2327 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
2328 ; SSE41-NEXT:    pxor %xmm3, %xmm0
2329 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [2147483775,2147483775]
2330 ; SSE41-NEXT:    movdqa %xmm6, %xmm5
2331 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
2332 ; SSE41-NEXT:    movdqa %xmm6, %xmm7
2333 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
2334 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
2335 ; SSE41-NEXT:    pand %xmm5, %xmm0
2336 ; SSE41-NEXT:    por %xmm7, %xmm0
2337 ; SSE41-NEXT:    movapd %xmm4, %xmm5
2338 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
2339 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
2340 ; SSE41-NEXT:    pxor %xmm3, %xmm0
2341 ; SSE41-NEXT:    movdqa %xmm6, %xmm2
2342 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
2343 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
2344 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2345 ; SSE41-NEXT:    pand %xmm2, %xmm0
2346 ; SSE41-NEXT:    por %xmm6, %xmm0
2347 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
2348 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
2349 ; SSE41-NEXT:    movapd %xmm4, %xmm2
2350 ; SSE41-NEXT:    xorpd %xmm3, %xmm2
2351 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [18446744071562067840,18446744071562067840]
2352 ; SSE41-NEXT:    movapd %xmm2, %xmm7
2353 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm7
2354 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm2
2355 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
2356 ; SSE41-NEXT:    pand %xmm7, %xmm0
2357 ; SSE41-NEXT:    por %xmm2, %xmm0
2358 ; SSE41-NEXT:    movapd %xmm1, %xmm2
2359 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
2360 ; SSE41-NEXT:    xorpd %xmm5, %xmm3
2361 ; SSE41-NEXT:    movapd %xmm3, %xmm4
2362 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm4
2363 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm3
2364 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2365 ; SSE41-NEXT:    pand %xmm4, %xmm0
2366 ; SSE41-NEXT:    por %xmm3, %xmm0
2367 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
2368 ; SSE41-NEXT:    packssdw %xmm2, %xmm1
2369 ; SSE41-NEXT:    packssdw %xmm1, %xmm1
2370 ; SSE41-NEXT:    packsswb %xmm1, %xmm1
2371 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
2372 ; SSE41-NEXT:    retq
2374 ; AVX1-LABEL: trunc_ssat_v4i64_v4i8:
2375 ; AVX1:       # %bb.0:
2376 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [127,127]
2377 ; AVX1-NEXT:    # xmm1 = mem[0,0]
2378 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
2379 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm2
2380 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2381 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm3
2382 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
2383 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
2384 ; AVX1-NEXT:    # xmm1 = mem[0,0]
2385 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm3
2386 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
2387 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
2388 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm2, %xmm1, %xmm1
2389 ; AVX1-NEXT:    vpackssdw %xmm0, %xmm1, %xmm0
2390 ; AVX1-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
2391 ; AVX1-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
2392 ; AVX1-NEXT:    vzeroupper
2393 ; AVX1-NEXT:    retq
2395 ; AVX2-LABEL: trunc_ssat_v4i64_v4i8:
2396 ; AVX2:       # %bb.0:
2397 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [127,127,127,127]
2398 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
2399 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
2400 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
2401 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
2402 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
2403 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
2404 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
2405 ; AVX2-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
2406 ; AVX2-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
2407 ; AVX2-NEXT:    vzeroupper
2408 ; AVX2-NEXT:    retq
2410 ; AVX512F-LABEL: trunc_ssat_v4i64_v4i8:
2411 ; AVX512F:       # %bb.0:
2412 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2413 ; AVX512F-NEXT:    vpmovsqb %zmm0, %xmm0
2414 ; AVX512F-NEXT:    vzeroupper
2415 ; AVX512F-NEXT:    retq
2417 ; AVX512VL-LABEL: trunc_ssat_v4i64_v4i8:
2418 ; AVX512VL:       # %bb.0:
2419 ; AVX512VL-NEXT:    vpmovsqb %ymm0, %xmm0
2420 ; AVX512VL-NEXT:    vzeroupper
2421 ; AVX512VL-NEXT:    retq
2423 ; AVX512BW-LABEL: trunc_ssat_v4i64_v4i8:
2424 ; AVX512BW:       # %bb.0:
2425 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2426 ; AVX512BW-NEXT:    vpmovsqb %zmm0, %xmm0
2427 ; AVX512BW-NEXT:    vzeroupper
2428 ; AVX512BW-NEXT:    retq
2430 ; AVX512BWVL-LABEL: trunc_ssat_v4i64_v4i8:
2431 ; AVX512BWVL:       # %bb.0:
2432 ; AVX512BWVL-NEXT:    vpmovsqb %ymm0, %xmm0
2433 ; AVX512BWVL-NEXT:    vzeroupper
2434 ; AVX512BWVL-NEXT:    retq
2436 ; SKX-LABEL: trunc_ssat_v4i64_v4i8:
2437 ; SKX:       # %bb.0:
2438 ; SKX-NEXT:    vpmovsqb %ymm0, %xmm0
2439 ; SKX-NEXT:    vzeroupper
2440 ; SKX-NEXT:    retq
2441   %1 = icmp slt <4 x i64> %a0, <i64 127, i64 127, i64 127, i64 127>
2442   %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 127, i64 127, i64 127, i64 127>
2443   %3 = icmp sgt <4 x i64> %2, <i64 -128, i64 -128, i64 -128, i64 -128>
2444   %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> <i64 -128, i64 -128, i64 -128, i64 -128>
2445   %5 = trunc <4 x i64> %4 to <4 x i8>
2446   ret <4 x i8> %5
2449 define void @trunc_ssat_v4i64_v4i8_store(<4 x i64> %a0, ptr%p1) {
2450 ; SSE2-SSSE3-LABEL: trunc_ssat_v4i64_v4i8_store:
2451 ; SSE2-SSSE3:       # %bb.0:
2452 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [127,127]
2453 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
2454 ; SSE2-SSSE3-NEXT:    movdqa %xmm0, %xmm3
2455 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm3
2456 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]
2457 ; SSE2-SSSE3-NEXT:    pxor %xmm6, %xmm6
2458 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm5
2459 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [2147483775,2147483775]
2460 ; SSE2-SSSE3-NEXT:    movdqa %xmm7, %xmm8
2461 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm3, %xmm8
2462 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
2463 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm9
2464 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm8[1,1,3,3]
2465 ; SSE2-SSSE3-NEXT:    por %xmm9, %xmm3
2466 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm0
2467 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm3
2468 ; SSE2-SSSE3-NEXT:    por %xmm0, %xmm3
2469 ; SSE2-SSSE3-NEXT:    movdqa %xmm1, %xmm0
2470 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm0
2471 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
2472 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm5
2473 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm0, %xmm7
2474 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
2475 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm0
2476 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
2477 ; SSE2-SSSE3-NEXT:    por %xmm0, %xmm5
2478 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm1
2479 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm5
2480 ; SSE2-SSSE3-NEXT:    por %xmm1, %xmm5
2481 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [18446744073709551488,18446744073709551488]
2482 ; SSE2-SSSE3-NEXT:    movdqa %xmm5, %xmm1
2483 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm1
2484 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
2485 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm6
2486 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm4
2487 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [18446744071562067840,18446744071562067840]
2488 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm1
2489 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm1[0,0,2,2]
2490 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm8
2491 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2492 ; SSE2-SSSE3-NEXT:    por %xmm8, %xmm1
2493 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm5
2494 ; SSE2-SSSE3-NEXT:    pandn %xmm0, %xmm1
2495 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm1
2496 ; SSE2-SSSE3-NEXT:    pxor %xmm3, %xmm2
2497 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
2498 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm4
2499 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm2
2500 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
2501 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm5
2502 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2503 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm2
2504 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm3
2505 ; SSE2-SSSE3-NEXT:    pandn %xmm0, %xmm2
2506 ; SSE2-SSSE3-NEXT:    por %xmm3, %xmm2
2507 ; SSE2-SSSE3-NEXT:    packssdw %xmm1, %xmm2
2508 ; SSE2-SSSE3-NEXT:    packssdw %xmm2, %xmm2
2509 ; SSE2-SSSE3-NEXT:    packsswb %xmm2, %xmm2
2510 ; SSE2-SSSE3-NEXT:    movd %xmm2, (%rdi)
2511 ; SSE2-SSSE3-NEXT:    retq
2513 ; SSE41-LABEL: trunc_ssat_v4i64_v4i8_store:
2514 ; SSE41:       # %bb.0:
2515 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
2516 ; SSE41-NEXT:    movapd {{.*#+}} xmm4 = [127,127]
2517 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
2518 ; SSE41-NEXT:    pxor %xmm3, %xmm0
2519 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [2147483775,2147483775]
2520 ; SSE41-NEXT:    movdqa %xmm6, %xmm5
2521 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
2522 ; SSE41-NEXT:    movdqa %xmm6, %xmm7
2523 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
2524 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
2525 ; SSE41-NEXT:    pand %xmm5, %xmm0
2526 ; SSE41-NEXT:    por %xmm7, %xmm0
2527 ; SSE41-NEXT:    movapd %xmm4, %xmm5
2528 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
2529 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
2530 ; SSE41-NEXT:    pxor %xmm3, %xmm0
2531 ; SSE41-NEXT:    movdqa %xmm6, %xmm2
2532 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
2533 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
2534 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2535 ; SSE41-NEXT:    pand %xmm2, %xmm0
2536 ; SSE41-NEXT:    por %xmm6, %xmm0
2537 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
2538 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
2539 ; SSE41-NEXT:    movapd %xmm4, %xmm2
2540 ; SSE41-NEXT:    xorpd %xmm3, %xmm2
2541 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [18446744071562067840,18446744071562067840]
2542 ; SSE41-NEXT:    movapd %xmm2, %xmm7
2543 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm7
2544 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm2
2545 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
2546 ; SSE41-NEXT:    pand %xmm7, %xmm0
2547 ; SSE41-NEXT:    por %xmm2, %xmm0
2548 ; SSE41-NEXT:    movapd %xmm1, %xmm2
2549 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
2550 ; SSE41-NEXT:    xorpd %xmm5, %xmm3
2551 ; SSE41-NEXT:    movapd %xmm3, %xmm4
2552 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm4
2553 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm3
2554 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
2555 ; SSE41-NEXT:    pand %xmm4, %xmm0
2556 ; SSE41-NEXT:    por %xmm3, %xmm0
2557 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
2558 ; SSE41-NEXT:    packssdw %xmm2, %xmm1
2559 ; SSE41-NEXT:    packssdw %xmm1, %xmm1
2560 ; SSE41-NEXT:    packsswb %xmm1, %xmm1
2561 ; SSE41-NEXT:    movd %xmm1, (%rdi)
2562 ; SSE41-NEXT:    retq
2564 ; AVX1-LABEL: trunc_ssat_v4i64_v4i8_store:
2565 ; AVX1:       # %bb.0:
2566 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [127,127]
2567 ; AVX1-NEXT:    # xmm1 = mem[0,0]
2568 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
2569 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm2
2570 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2571 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm3
2572 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
2573 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
2574 ; AVX1-NEXT:    # xmm1 = mem[0,0]
2575 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm3
2576 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
2577 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
2578 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm2, %xmm1, %xmm1
2579 ; AVX1-NEXT:    vpackssdw %xmm0, %xmm1, %xmm0
2580 ; AVX1-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
2581 ; AVX1-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
2582 ; AVX1-NEXT:    vmovd %xmm0, (%rdi)
2583 ; AVX1-NEXT:    vzeroupper
2584 ; AVX1-NEXT:    retq
2586 ; AVX2-LABEL: trunc_ssat_v4i64_v4i8_store:
2587 ; AVX2:       # %bb.0:
2588 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [127,127,127,127]
2589 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
2590 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
2591 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
2592 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
2593 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
2594 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
2595 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
2596 ; AVX2-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
2597 ; AVX2-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
2598 ; AVX2-NEXT:    vmovd %xmm0, (%rdi)
2599 ; AVX2-NEXT:    vzeroupper
2600 ; AVX2-NEXT:    retq
2602 ; AVX512F-LABEL: trunc_ssat_v4i64_v4i8_store:
2603 ; AVX512F:       # %bb.0:
2604 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2605 ; AVX512F-NEXT:    vpmovsqb %zmm0, %xmm0
2606 ; AVX512F-NEXT:    vmovd %xmm0, (%rdi)
2607 ; AVX512F-NEXT:    vzeroupper
2608 ; AVX512F-NEXT:    retq
2610 ; AVX512VL-LABEL: trunc_ssat_v4i64_v4i8_store:
2611 ; AVX512VL:       # %bb.0:
2612 ; AVX512VL-NEXT:    vpmovsqb %ymm0, (%rdi)
2613 ; AVX512VL-NEXT:    vzeroupper
2614 ; AVX512VL-NEXT:    retq
2616 ; AVX512BW-LABEL: trunc_ssat_v4i64_v4i8_store:
2617 ; AVX512BW:       # %bb.0:
2618 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2619 ; AVX512BW-NEXT:    vpmovsqb %zmm0, %xmm0
2620 ; AVX512BW-NEXT:    vmovd %xmm0, (%rdi)
2621 ; AVX512BW-NEXT:    vzeroupper
2622 ; AVX512BW-NEXT:    retq
2624 ; AVX512BWVL-LABEL: trunc_ssat_v4i64_v4i8_store:
2625 ; AVX512BWVL:       # %bb.0:
2626 ; AVX512BWVL-NEXT:    vpmovsqb %ymm0, (%rdi)
2627 ; AVX512BWVL-NEXT:    vzeroupper
2628 ; AVX512BWVL-NEXT:    retq
2630 ; SKX-LABEL: trunc_ssat_v4i64_v4i8_store:
2631 ; SKX:       # %bb.0:
2632 ; SKX-NEXT:    vpmovsqb %ymm0, (%rdi)
2633 ; SKX-NEXT:    vzeroupper
2634 ; SKX-NEXT:    retq
2635   %1 = icmp slt <4 x i64> %a0, <i64 127, i64 127, i64 127, i64 127>
2636   %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 127, i64 127, i64 127, i64 127>
2637   %3 = icmp sgt <4 x i64> %2, <i64 -128, i64 -128, i64 -128, i64 -128>
2638   %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> <i64 -128, i64 -128, i64 -128, i64 -128>
2639   %5 = trunc <4 x i64> %4 to <4 x i8>
2640   store <4 x i8> %5, ptr%p1
2641   ret void
2644 define <8 x i8> @trunc_ssat_v8i64_v8i8(ptr %p0) "min-legal-vector-width"="256" {
2645 ; SSE2-SSSE3-LABEL: trunc_ssat_v8i64_v8i8:
2646 ; SSE2-SSSE3:       # %bb.0:
2647 ; SSE2-SSSE3-NEXT:    movdqa (%rdi), %xmm6
2648 ; SSE2-SSSE3-NEXT:    movdqa 16(%rdi), %xmm0
2649 ; SSE2-SSSE3-NEXT:    movdqa 32(%rdi), %xmm3
2650 ; SSE2-SSSE3-NEXT:    movdqa 48(%rdi), %xmm5
2651 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [127,127]
2652 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
2653 ; SSE2-SSSE3-NEXT:    movdqa %xmm3, %xmm2
2654 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm2
2655 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm2[1,1,3,3]
2656 ; SSE2-SSSE3-NEXT:    pxor %xmm8, %xmm8
2657 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm9
2658 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [2147483775,2147483775]
2659 ; SSE2-SSSE3-NEXT:    movdqa %xmm7, %xmm10
2660 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm2, %xmm10
2661 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
2662 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm11
2663 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]
2664 ; SSE2-SSSE3-NEXT:    por %xmm11, %xmm2
2665 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm3
2666 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm2
2667 ; SSE2-SSSE3-NEXT:    por %xmm3, %xmm2
2668 ; SSE2-SSSE3-NEXT:    movdqa %xmm5, %xmm3
2669 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm3
2670 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm3[1,1,3,3]
2671 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm9
2672 ; SSE2-SSSE3-NEXT:    movdqa %xmm7, %xmm10
2673 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm3, %xmm10
2674 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
2675 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm11
2676 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm10[1,1,3,3]
2677 ; SSE2-SSSE3-NEXT:    por %xmm11, %xmm3
2678 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm5
2679 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm3
2680 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm3
2681 ; SSE2-SSSE3-NEXT:    movdqa %xmm6, %xmm5
2682 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm5
2683 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[1,1,3,3]
2684 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm9
2685 ; SSE2-SSSE3-NEXT:    movdqa %xmm7, %xmm10
2686 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm5, %xmm10
2687 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
2688 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm11
2689 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm10[1,1,3,3]
2690 ; SSE2-SSSE3-NEXT:    por %xmm11, %xmm5
2691 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm6
2692 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm5
2693 ; SSE2-SSSE3-NEXT:    por %xmm6, %xmm5
2694 ; SSE2-SSSE3-NEXT:    movdqa %xmm0, %xmm6
2695 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm6
2696 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm6[1,1,3,3]
2697 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm9
2698 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm6, %xmm7
2699 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[0,0,2,2]
2700 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm6
2701 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[1,1,3,3]
2702 ; SSE2-SSSE3-NEXT:    por %xmm6, %xmm8
2703 ; SSE2-SSSE3-NEXT:    pand %xmm8, %xmm0
2704 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm8
2705 ; SSE2-SSSE3-NEXT:    por %xmm0, %xmm8
2706 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [18446744073709551488,18446744073709551488]
2707 ; SSE2-SSSE3-NEXT:    movdqa %xmm8, %xmm0
2708 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm0
2709 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm0[1,1,3,3]
2710 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm6
2711 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm9
2712 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [18446744071562067840,18446744071562067840]
2713 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm0
2714 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]
2715 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm10
2716 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm0[1,1,3,3]
2717 ; SSE2-SSSE3-NEXT:    por %xmm10, %xmm9
2718 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm8
2719 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm9
2720 ; SSE2-SSSE3-NEXT:    por %xmm8, %xmm9
2721 ; SSE2-SSSE3-NEXT:    movdqa %xmm5, %xmm0
2722 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm0
2723 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm0[1,1,3,3]
2724 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm8
2725 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm0
2726 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm0[0,0,2,2]
2727 ; SSE2-SSSE3-NEXT:    pand %xmm8, %xmm10
2728 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2729 ; SSE2-SSSE3-NEXT:    por %xmm10, %xmm0
2730 ; SSE2-SSSE3-NEXT:    pand %xmm0, %xmm5
2731 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm0
2732 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm0
2733 ; SSE2-SSSE3-NEXT:    packssdw %xmm9, %xmm0
2734 ; SSE2-SSSE3-NEXT:    movdqa %xmm3, %xmm5
2735 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm5
2736 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm5[1,1,3,3]
2737 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm8
2738 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm5
2739 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
2740 ; SSE2-SSSE3-NEXT:    pand %xmm8, %xmm9
2741 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2742 ; SSE2-SSSE3-NEXT:    por %xmm9, %xmm5
2743 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm3
2744 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm5
2745 ; SSE2-SSSE3-NEXT:    por %xmm3, %xmm5
2746 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm1
2747 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
2748 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm6, %xmm3
2749 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm1
2750 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
2751 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm6
2752 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2753 ; SSE2-SSSE3-NEXT:    por %xmm6, %xmm1
2754 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm2
2755 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm1
2756 ; SSE2-SSSE3-NEXT:    por %xmm2, %xmm1
2757 ; SSE2-SSSE3-NEXT:    packssdw %xmm5, %xmm1
2758 ; SSE2-SSSE3-NEXT:    packssdw %xmm1, %xmm0
2759 ; SSE2-SSSE3-NEXT:    packsswb %xmm0, %xmm0
2760 ; SSE2-SSSE3-NEXT:    retq
2762 ; SSE41-LABEL: trunc_ssat_v8i64_v8i8:
2763 ; SSE41:       # %bb.0:
2764 ; SSE41-NEXT:    movdqa (%rdi), %xmm7
2765 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm5
2766 ; SSE41-NEXT:    movdqa 32(%rdi), %xmm4
2767 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm8
2768 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [127,127]
2769 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
2770 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
2771 ; SSE41-NEXT:    pxor %xmm2, %xmm0
2772 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [2147483775,2147483775]
2773 ; SSE41-NEXT:    movdqa %xmm6, %xmm3
2774 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
2775 ; SSE41-NEXT:    movdqa %xmm6, %xmm9
2776 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm9
2777 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
2778 ; SSE41-NEXT:    pand %xmm3, %xmm0
2779 ; SSE41-NEXT:    por %xmm9, %xmm0
2780 ; SSE41-NEXT:    movapd %xmm1, %xmm3
2781 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm3
2782 ; SSE41-NEXT:    movdqa %xmm8, %xmm0
2783 ; SSE41-NEXT:    pxor %xmm2, %xmm0
2784 ; SSE41-NEXT:    movdqa %xmm6, %xmm4
2785 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
2786 ; SSE41-NEXT:    movdqa %xmm6, %xmm9
2787 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm9
2788 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
2789 ; SSE41-NEXT:    pand %xmm4, %xmm0
2790 ; SSE41-NEXT:    por %xmm9, %xmm0
2791 ; SSE41-NEXT:    movapd %xmm1, %xmm4
2792 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm4
2793 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
2794 ; SSE41-NEXT:    pxor %xmm2, %xmm0
2795 ; SSE41-NEXT:    movdqa %xmm6, %xmm8
2796 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm8
2797 ; SSE41-NEXT:    movdqa %xmm6, %xmm9
2798 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm9
2799 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
2800 ; SSE41-NEXT:    pand %xmm8, %xmm0
2801 ; SSE41-NEXT:    por %xmm9, %xmm0
2802 ; SSE41-NEXT:    movapd %xmm1, %xmm8
2803 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm8
2804 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
2805 ; SSE41-NEXT:    pxor %xmm2, %xmm0
2806 ; SSE41-NEXT:    movdqa %xmm6, %xmm7
2807 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm7
2808 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
2809 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
2810 ; SSE41-NEXT:    pand %xmm7, %xmm0
2811 ; SSE41-NEXT:    por %xmm6, %xmm0
2812 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
2813 ; SSE41-NEXT:    movapd {{.*#+}} xmm5 = [18446744073709551488,18446744073709551488]
2814 ; SSE41-NEXT:    movapd %xmm1, %xmm7
2815 ; SSE41-NEXT:    xorpd %xmm2, %xmm7
2816 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [18446744071562067840,18446744071562067840]
2817 ; SSE41-NEXT:    movapd %xmm7, %xmm9
2818 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm9
2819 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm7
2820 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
2821 ; SSE41-NEXT:    pand %xmm9, %xmm0
2822 ; SSE41-NEXT:    por %xmm7, %xmm0
2823 ; SSE41-NEXT:    movapd %xmm5, %xmm7
2824 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm7
2825 ; SSE41-NEXT:    movapd %xmm8, %xmm1
2826 ; SSE41-NEXT:    xorpd %xmm2, %xmm1
2827 ; SSE41-NEXT:    movapd %xmm1, %xmm9
2828 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm9
2829 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm1
2830 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
2831 ; SSE41-NEXT:    pand %xmm9, %xmm0
2832 ; SSE41-NEXT:    por %xmm1, %xmm0
2833 ; SSE41-NEXT:    movapd %xmm5, %xmm1
2834 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm1
2835 ; SSE41-NEXT:    packssdw %xmm7, %xmm1
2836 ; SSE41-NEXT:    movapd %xmm4, %xmm7
2837 ; SSE41-NEXT:    xorpd %xmm2, %xmm7
2838 ; SSE41-NEXT:    movapd %xmm7, %xmm8
2839 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm8
2840 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm7
2841 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
2842 ; SSE41-NEXT:    pand %xmm8, %xmm0
2843 ; SSE41-NEXT:    por %xmm7, %xmm0
2844 ; SSE41-NEXT:    movapd %xmm5, %xmm7
2845 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm7
2846 ; SSE41-NEXT:    xorpd %xmm3, %xmm2
2847 ; SSE41-NEXT:    movapd %xmm2, %xmm4
2848 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm4
2849 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm2
2850 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
2851 ; SSE41-NEXT:    pand %xmm4, %xmm0
2852 ; SSE41-NEXT:    por %xmm2, %xmm0
2853 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm5
2854 ; SSE41-NEXT:    packssdw %xmm7, %xmm5
2855 ; SSE41-NEXT:    packssdw %xmm5, %xmm1
2856 ; SSE41-NEXT:    packsswb %xmm1, %xmm1
2857 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
2858 ; SSE41-NEXT:    retq
2860 ; AVX1-LABEL: trunc_ssat_v8i64_v8i8:
2861 ; AVX1:       # %bb.0:
2862 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
2863 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
2864 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm2
2865 ; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm3
2866 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm4 = [127,127]
2867 ; AVX1-NEXT:    # xmm4 = mem[0,0]
2868 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm5
2869 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm2, %xmm4, %xmm2
2870 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm5
2871 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm3, %xmm4, %xmm3
2872 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm4, %xmm5
2873 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
2874 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm5
2875 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm1, %xmm4, %xmm1
2876 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm4 = [18446744073709551488,18446744073709551488]
2877 ; AVX1-NEXT:    # xmm4 = mem[0,0]
2878 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm1, %xmm5
2879 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm1, %xmm4, %xmm1
2880 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm0, %xmm5
2881 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
2882 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
2883 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm3, %xmm1
2884 ; AVX1-NEXT:    vblendvpd %xmm1, %xmm3, %xmm4, %xmm1
2885 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm2, %xmm3
2886 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm2, %xmm4, %xmm2
2887 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm2, %xmm1
2888 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
2889 ; AVX1-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
2890 ; AVX1-NEXT:    retq
2892 ; AVX2-LABEL: trunc_ssat_v8i64_v8i8:
2893 ; AVX2:       # %bb.0:
2894 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
2895 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
2896 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [127,127,127,127]
2897 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
2898 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
2899 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
2900 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
2901 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
2902 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm3
2903 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
2904 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
2905 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
2906 ; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
2907 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2908 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
2909 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
2910 ; AVX2-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
2911 ; AVX2-NEXT:    vzeroupper
2912 ; AVX2-NEXT:    retq
2914 ; AVX512-LABEL: trunc_ssat_v8i64_v8i8:
2915 ; AVX512:       # %bb.0:
2916 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
2917 ; AVX512-NEXT:    vpmovsqb %zmm0, %xmm0
2918 ; AVX512-NEXT:    vzeroupper
2919 ; AVX512-NEXT:    retq
2921 ; SKX-LABEL: trunc_ssat_v8i64_v8i8:
2922 ; SKX:       # %bb.0:
2923 ; SKX-NEXT:    vmovdqa (%rdi), %ymm0
2924 ; SKX-NEXT:    vmovdqa 32(%rdi), %ymm1
2925 ; SKX-NEXT:    vpmovsqb %ymm1, %xmm1
2926 ; SKX-NEXT:    vpmovsqb %ymm0, %xmm0
2927 ; SKX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2928 ; SKX-NEXT:    vzeroupper
2929 ; SKX-NEXT:    retq
2930   %a0 = load <8 x i64>, ptr %p0
2931   %1 = icmp slt <8 x i64> %a0, <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>
2932   %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>
2933   %3 = icmp sgt <8 x i64> %2, <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>
2934   %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>
2935   %5 = trunc <8 x i64> %4 to <8 x i8>
2936   ret <8 x i8> %5
2939 ; TODO: The AVX1 codegen shows a missed opportunity to narrow blendv+logic to 128-bit.
2941 define void @trunc_ssat_v8i64_v8i8_store(ptr %p0, ptr%p1) "min-legal-vector-width"="256" {
2942 ; SSE2-SSSE3-LABEL: trunc_ssat_v8i64_v8i8_store:
2943 ; SSE2-SSSE3:       # %bb.0:
2944 ; SSE2-SSSE3-NEXT:    movdqa (%rdi), %xmm6
2945 ; SSE2-SSSE3-NEXT:    movdqa 16(%rdi), %xmm3
2946 ; SSE2-SSSE3-NEXT:    movdqa 32(%rdi), %xmm2
2947 ; SSE2-SSSE3-NEXT:    movdqa 48(%rdi), %xmm5
2948 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [127,127]
2949 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648]
2950 ; SSE2-SSSE3-NEXT:    movdqa %xmm2, %xmm1
2951 ; SSE2-SSSE3-NEXT:    pxor %xmm0, %xmm1
2952 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm1[1,1,3,3]
2953 ; SSE2-SSSE3-NEXT:    pxor %xmm8, %xmm8
2954 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm9
2955 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm7 = [2147483775,2147483775]
2956 ; SSE2-SSSE3-NEXT:    movdqa %xmm7, %xmm10
2957 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm1, %xmm10
2958 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
2959 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm11
2960 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm10[1,1,3,3]
2961 ; SSE2-SSSE3-NEXT:    por %xmm11, %xmm1
2962 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm2
2963 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm1
2964 ; SSE2-SSSE3-NEXT:    por %xmm2, %xmm1
2965 ; SSE2-SSSE3-NEXT:    movdqa %xmm5, %xmm2
2966 ; SSE2-SSSE3-NEXT:    pxor %xmm0, %xmm2
2967 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm2[1,1,3,3]
2968 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm9
2969 ; SSE2-SSSE3-NEXT:    movdqa %xmm7, %xmm10
2970 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm2, %xmm10
2971 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
2972 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm11
2973 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]
2974 ; SSE2-SSSE3-NEXT:    por %xmm11, %xmm2
2975 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm5
2976 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm2
2977 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm2
2978 ; SSE2-SSSE3-NEXT:    movdqa %xmm6, %xmm5
2979 ; SSE2-SSSE3-NEXT:    pxor %xmm0, %xmm5
2980 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[1,1,3,3]
2981 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm9
2982 ; SSE2-SSSE3-NEXT:    movdqa %xmm7, %xmm10
2983 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm5, %xmm10
2984 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
2985 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm11
2986 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm10[1,1,3,3]
2987 ; SSE2-SSSE3-NEXT:    por %xmm11, %xmm5
2988 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm6
2989 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm5
2990 ; SSE2-SSSE3-NEXT:    por %xmm6, %xmm5
2991 ; SSE2-SSSE3-NEXT:    movdqa %xmm3, %xmm6
2992 ; SSE2-SSSE3-NEXT:    pxor %xmm0, %xmm6
2993 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm6[1,1,3,3]
2994 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm9
2995 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm6, %xmm7
2996 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[0,0,2,2]
2997 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm6
2998 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
2999 ; SSE2-SSSE3-NEXT:    por %xmm6, %xmm7
3000 ; SSE2-SSSE3-NEXT:    pand %xmm7, %xmm3
3001 ; SSE2-SSSE3-NEXT:    pandn %xmm4, %xmm7
3002 ; SSE2-SSSE3-NEXT:    por %xmm3, %xmm7
3003 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [18446744073709551488,18446744073709551488]
3004 ; SSE2-SSSE3-NEXT:    movdqa %xmm7, %xmm8
3005 ; SSE2-SSSE3-NEXT:    pxor %xmm0, %xmm8
3006 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm8[1,1,3,3]
3007 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm4, %xmm4
3008 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm4, %xmm9
3009 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [18446744071562067840,18446744071562067840]
3010 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm6, %xmm8
3011 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm8[0,0,2,2]
3012 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm10
3013 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
3014 ; SSE2-SSSE3-NEXT:    por %xmm10, %xmm8
3015 ; SSE2-SSSE3-NEXT:    pand %xmm8, %xmm7
3016 ; SSE2-SSSE3-NEXT:    pandn %xmm3, %xmm8
3017 ; SSE2-SSSE3-NEXT:    por %xmm7, %xmm8
3018 ; SSE2-SSSE3-NEXT:    movdqa %xmm5, %xmm7
3019 ; SSE2-SSSE3-NEXT:    pxor %xmm0, %xmm7
3020 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm7[1,1,3,3]
3021 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm4, %xmm9
3022 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm6, %xmm7
3023 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
3024 ; SSE2-SSSE3-NEXT:    pand %xmm9, %xmm10
3025 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
3026 ; SSE2-SSSE3-NEXT:    por %xmm10, %xmm7
3027 ; SSE2-SSSE3-NEXT:    pand %xmm7, %xmm5
3028 ; SSE2-SSSE3-NEXT:    pandn %xmm3, %xmm7
3029 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm7
3030 ; SSE2-SSSE3-NEXT:    packssdw %xmm8, %xmm7
3031 ; SSE2-SSSE3-NEXT:    movdqa %xmm2, %xmm5
3032 ; SSE2-SSSE3-NEXT:    pxor %xmm0, %xmm5
3033 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm5[1,1,3,3]
3034 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm4, %xmm8
3035 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm6, %xmm5
3036 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
3037 ; SSE2-SSSE3-NEXT:    pand %xmm8, %xmm9
3038 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
3039 ; SSE2-SSSE3-NEXT:    por %xmm9, %xmm5
3040 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm2
3041 ; SSE2-SSSE3-NEXT:    pandn %xmm3, %xmm5
3042 ; SSE2-SSSE3-NEXT:    por %xmm2, %xmm5
3043 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm0
3044 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
3045 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm4, %xmm2
3046 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm6, %xmm0
3047 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
3048 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm4
3049 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3050 ; SSE2-SSSE3-NEXT:    por %xmm4, %xmm0
3051 ; SSE2-SSSE3-NEXT:    pand %xmm0, %xmm1
3052 ; SSE2-SSSE3-NEXT:    pandn %xmm3, %xmm0
3053 ; SSE2-SSSE3-NEXT:    por %xmm1, %xmm0
3054 ; SSE2-SSSE3-NEXT:    packssdw %xmm5, %xmm0
3055 ; SSE2-SSSE3-NEXT:    packssdw %xmm0, %xmm7
3056 ; SSE2-SSSE3-NEXT:    packsswb %xmm7, %xmm7
3057 ; SSE2-SSSE3-NEXT:    movq %xmm7, (%rsi)
3058 ; SSE2-SSSE3-NEXT:    retq
3060 ; SSE41-LABEL: trunc_ssat_v8i64_v8i8_store:
3061 ; SSE41:       # %bb.0:
3062 ; SSE41-NEXT:    movdqa (%rdi), %xmm7
3063 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm5
3064 ; SSE41-NEXT:    movdqa 32(%rdi), %xmm3
3065 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm8
3066 ; SSE41-NEXT:    movapd {{.*#+}} xmm4 = [127,127]
3067 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
3068 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
3069 ; SSE41-NEXT:    pxor %xmm1, %xmm0
3070 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [2147483775,2147483775]
3071 ; SSE41-NEXT:    movdqa %xmm6, %xmm2
3072 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
3073 ; SSE41-NEXT:    movdqa %xmm6, %xmm9
3074 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm9
3075 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
3076 ; SSE41-NEXT:    pand %xmm2, %xmm0
3077 ; SSE41-NEXT:    por %xmm9, %xmm0
3078 ; SSE41-NEXT:    movapd %xmm4, %xmm2
3079 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
3080 ; SSE41-NEXT:    movdqa %xmm8, %xmm0
3081 ; SSE41-NEXT:    pxor %xmm1, %xmm0
3082 ; SSE41-NEXT:    movdqa %xmm6, %xmm3
3083 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
3084 ; SSE41-NEXT:    movdqa %xmm6, %xmm9
3085 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm9
3086 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
3087 ; SSE41-NEXT:    pand %xmm3, %xmm0
3088 ; SSE41-NEXT:    por %xmm9, %xmm0
3089 ; SSE41-NEXT:    movapd %xmm4, %xmm3
3090 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm3
3091 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
3092 ; SSE41-NEXT:    pxor %xmm1, %xmm0
3093 ; SSE41-NEXT:    movdqa %xmm6, %xmm8
3094 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm8
3095 ; SSE41-NEXT:    movdqa %xmm6, %xmm9
3096 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm9
3097 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
3098 ; SSE41-NEXT:    pand %xmm8, %xmm0
3099 ; SSE41-NEXT:    por %xmm9, %xmm0
3100 ; SSE41-NEXT:    movapd %xmm4, %xmm8
3101 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm8
3102 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
3103 ; SSE41-NEXT:    pxor %xmm1, %xmm0
3104 ; SSE41-NEXT:    movdqa %xmm6, %xmm7
3105 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm7
3106 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
3107 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3108 ; SSE41-NEXT:    pand %xmm7, %xmm0
3109 ; SSE41-NEXT:    por %xmm6, %xmm0
3110 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm4
3111 ; SSE41-NEXT:    movapd {{.*#+}} xmm5 = [18446744073709551488,18446744073709551488]
3112 ; SSE41-NEXT:    movapd %xmm4, %xmm7
3113 ; SSE41-NEXT:    xorpd %xmm1, %xmm7
3114 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [18446744071562067840,18446744071562067840]
3115 ; SSE41-NEXT:    movapd %xmm7, %xmm9
3116 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm9
3117 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm7
3118 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
3119 ; SSE41-NEXT:    pand %xmm9, %xmm0
3120 ; SSE41-NEXT:    por %xmm7, %xmm0
3121 ; SSE41-NEXT:    movapd %xmm5, %xmm7
3122 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm7
3123 ; SSE41-NEXT:    movapd %xmm8, %xmm4
3124 ; SSE41-NEXT:    xorpd %xmm1, %xmm4
3125 ; SSE41-NEXT:    movapd %xmm4, %xmm9
3126 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm9
3127 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm4
3128 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
3129 ; SSE41-NEXT:    pand %xmm9, %xmm0
3130 ; SSE41-NEXT:    por %xmm4, %xmm0
3131 ; SSE41-NEXT:    movapd %xmm5, %xmm4
3132 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm4
3133 ; SSE41-NEXT:    packssdw %xmm7, %xmm4
3134 ; SSE41-NEXT:    movapd %xmm3, %xmm7
3135 ; SSE41-NEXT:    xorpd %xmm1, %xmm7
3136 ; SSE41-NEXT:    movapd %xmm7, %xmm8
3137 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm8
3138 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm7
3139 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
3140 ; SSE41-NEXT:    pand %xmm8, %xmm0
3141 ; SSE41-NEXT:    por %xmm7, %xmm0
3142 ; SSE41-NEXT:    movapd %xmm5, %xmm7
3143 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm7
3144 ; SSE41-NEXT:    xorpd %xmm2, %xmm1
3145 ; SSE41-NEXT:    movapd %xmm1, %xmm3
3146 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm3
3147 ; SSE41-NEXT:    pcmpgtd %xmm6, %xmm1
3148 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
3149 ; SSE41-NEXT:    pand %xmm3, %xmm0
3150 ; SSE41-NEXT:    por %xmm1, %xmm0
3151 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
3152 ; SSE41-NEXT:    packssdw %xmm7, %xmm5
3153 ; SSE41-NEXT:    packssdw %xmm5, %xmm4
3154 ; SSE41-NEXT:    packsswb %xmm4, %xmm4
3155 ; SSE41-NEXT:    movq %xmm4, (%rsi)
3156 ; SSE41-NEXT:    retq
3158 ; AVX1-LABEL: trunc_ssat_v8i64_v8i8_store:
3159 ; AVX1:       # %bb.0:
3160 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
3161 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
3162 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm2
3163 ; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm3
3164 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm4 = [127,127]
3165 ; AVX1-NEXT:    # xmm4 = mem[0,0]
3166 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm5
3167 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm2, %xmm4, %xmm2
3168 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm5
3169 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm3, %xmm4, %xmm3
3170 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm4, %xmm5
3171 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
3172 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm5
3173 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm1, %xmm4, %xmm1
3174 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm4 = [18446744073709551488,18446744073709551488]
3175 ; AVX1-NEXT:    # xmm4 = mem[0,0]
3176 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm1, %xmm5
3177 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm1, %xmm4, %xmm1
3178 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm0, %xmm5
3179 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
3180 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
3181 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm3, %xmm1
3182 ; AVX1-NEXT:    vblendvpd %xmm1, %xmm3, %xmm4, %xmm1
3183 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm2, %xmm3
3184 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm2, %xmm4, %xmm2
3185 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm2, %xmm1
3186 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
3187 ; AVX1-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
3188 ; AVX1-NEXT:    vmovq %xmm0, (%rsi)
3189 ; AVX1-NEXT:    retq
3191 ; AVX2-LABEL: trunc_ssat_v8i64_v8i8_store:
3192 ; AVX2:       # %bb.0:
3193 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
3194 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
3195 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [127,127,127,127]
3196 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
3197 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
3198 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
3199 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
3200 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
3201 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm3
3202 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
3203 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
3204 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
3205 ; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
3206 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
3207 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
3208 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
3209 ; AVX2-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
3210 ; AVX2-NEXT:    vmovq %xmm0, (%rsi)
3211 ; AVX2-NEXT:    vzeroupper
3212 ; AVX2-NEXT:    retq
3214 ; AVX512-LABEL: trunc_ssat_v8i64_v8i8_store:
3215 ; AVX512:       # %bb.0:
3216 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
3217 ; AVX512-NEXT:    vpmovsqb %zmm0, (%rsi)
3218 ; AVX512-NEXT:    vzeroupper
3219 ; AVX512-NEXT:    retq
3221 ; SKX-LABEL: trunc_ssat_v8i64_v8i8_store:
3222 ; SKX:       # %bb.0:
3223 ; SKX-NEXT:    vmovdqa (%rdi), %ymm0
3224 ; SKX-NEXT:    vmovdqa 32(%rdi), %ymm1
3225 ; SKX-NEXT:    vpmovsqb %ymm1, %xmm1
3226 ; SKX-NEXT:    vpmovsqb %ymm0, %xmm0
3227 ; SKX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3228 ; SKX-NEXT:    vmovq %xmm0, (%rsi)
3229 ; SKX-NEXT:    vzeroupper
3230 ; SKX-NEXT:    retq
3231   %a0 = load <8 x i64>, ptr %p0
3232   %1 = icmp slt <8 x i64> %a0, <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>
3233   %2 = select <8 x i1> %1, <8 x i64> %a0, <8 x i64> <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>
3234   %3 = icmp sgt <8 x i64> %2, <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>
3235   %4 = select <8 x i1> %3, <8 x i64> %2, <8 x i64> <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>
3236   %5 = trunc <8 x i64> %4 to <8 x i8>
3237   store <8 x i8> %5, ptr%p1
3238   ret void
3241 define <16 x i8> @trunc_ssat_v16i64_v16i8(ptr %p0) "min-legal-vector-width"="256" {
3242 ; SSE2-SSSE3-LABEL: trunc_ssat_v16i64_v16i8:
3243 ; SSE2-SSSE3:       # %bb.0:
3244 ; SSE2-SSSE3-NEXT:    movdqa (%rdi), %xmm8
3245 ; SSE2-SSSE3-NEXT:    movdqa 16(%rdi), %xmm0
3246 ; SSE2-SSSE3-NEXT:    movdqa 32(%rdi), %xmm12
3247 ; SSE2-SSSE3-NEXT:    movdqa 48(%rdi), %xmm11
3248 ; SSE2-SSSE3-NEXT:    movdqa 80(%rdi), %xmm7
3249 ; SSE2-SSSE3-NEXT:    movdqa 64(%rdi), %xmm5
3250 ; SSE2-SSSE3-NEXT:    movdqa 112(%rdi), %xmm4
3251 ; SSE2-SSSE3-NEXT:    movdqa 96(%rdi), %xmm3
3252 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [127,127]
3253 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
3254 ; SSE2-SSSE3-NEXT:    movdqa %xmm3, %xmm2
3255 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm2
3256 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm2[1,1,3,3]
3257 ; SSE2-SSSE3-NEXT:    pxor %xmm10, %xmm10
3258 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm10, %xmm13
3259 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [2147483775,2147483775]
3260 ; SSE2-SSSE3-NEXT:    movdqa %xmm9, %xmm14
3261 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm2, %xmm14
3262 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
3263 ; SSE2-SSSE3-NEXT:    pand %xmm13, %xmm15
3264 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm14[1,1,3,3]
3265 ; SSE2-SSSE3-NEXT:    por %xmm15, %xmm2
3266 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm3
3267 ; SSE2-SSSE3-NEXT:    pandn %xmm6, %xmm2
3268 ; SSE2-SSSE3-NEXT:    por %xmm3, %xmm2
3269 ; SSE2-SSSE3-NEXT:    movdqa %xmm4, %xmm3
3270 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm3
3271 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm3[1,1,3,3]
3272 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm10, %xmm13
3273 ; SSE2-SSSE3-NEXT:    movdqa %xmm9, %xmm14
3274 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm3, %xmm14
3275 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
3276 ; SSE2-SSSE3-NEXT:    pand %xmm13, %xmm15
3277 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm14[1,1,3,3]
3278 ; SSE2-SSSE3-NEXT:    por %xmm15, %xmm3
3279 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm4
3280 ; SSE2-SSSE3-NEXT:    pandn %xmm6, %xmm3
3281 ; SSE2-SSSE3-NEXT:    por %xmm4, %xmm3
3282 ; SSE2-SSSE3-NEXT:    movdqa %xmm5, %xmm4
3283 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm4
3284 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm4[1,1,3,3]
3285 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm10, %xmm13
3286 ; SSE2-SSSE3-NEXT:    movdqa %xmm9, %xmm14
3287 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm4, %xmm14
3288 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
3289 ; SSE2-SSSE3-NEXT:    pand %xmm13, %xmm15
3290 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm14[1,1,3,3]
3291 ; SSE2-SSSE3-NEXT:    por %xmm15, %xmm4
3292 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm5
3293 ; SSE2-SSSE3-NEXT:    pandn %xmm6, %xmm4
3294 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm4
3295 ; SSE2-SSSE3-NEXT:    movdqa %xmm7, %xmm5
3296 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm5
3297 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm5[1,1,3,3]
3298 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm10, %xmm13
3299 ; SSE2-SSSE3-NEXT:    movdqa %xmm9, %xmm14
3300 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm5, %xmm14
3301 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
3302 ; SSE2-SSSE3-NEXT:    pand %xmm13, %xmm15
3303 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm14[1,1,3,3]
3304 ; SSE2-SSSE3-NEXT:    por %xmm15, %xmm5
3305 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm7
3306 ; SSE2-SSSE3-NEXT:    pandn %xmm6, %xmm5
3307 ; SSE2-SSSE3-NEXT:    por %xmm7, %xmm5
3308 ; SSE2-SSSE3-NEXT:    movdqa %xmm12, %xmm7
3309 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm7
3310 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm7[1,1,3,3]
3311 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm10, %xmm13
3312 ; SSE2-SSSE3-NEXT:    movdqa %xmm9, %xmm14
3313 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm7, %xmm14
3314 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
3315 ; SSE2-SSSE3-NEXT:    pand %xmm13, %xmm15
3316 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm14[1,1,3,3]
3317 ; SSE2-SSSE3-NEXT:    por %xmm15, %xmm7
3318 ; SSE2-SSSE3-NEXT:    pand %xmm7, %xmm12
3319 ; SSE2-SSSE3-NEXT:    pandn %xmm6, %xmm7
3320 ; SSE2-SSSE3-NEXT:    por %xmm12, %xmm7
3321 ; SSE2-SSSE3-NEXT:    movdqa %xmm11, %xmm12
3322 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm12
3323 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[1,1,3,3]
3324 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm10, %xmm13
3325 ; SSE2-SSSE3-NEXT:    movdqa %xmm9, %xmm14
3326 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm12, %xmm14
3327 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
3328 ; SSE2-SSSE3-NEXT:    pand %xmm13, %xmm15
3329 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm14[1,1,3,3]
3330 ; SSE2-SSSE3-NEXT:    por %xmm15, %xmm12
3331 ; SSE2-SSSE3-NEXT:    pand %xmm12, %xmm11
3332 ; SSE2-SSSE3-NEXT:    pandn %xmm6, %xmm12
3333 ; SSE2-SSSE3-NEXT:    por %xmm11, %xmm12
3334 ; SSE2-SSSE3-NEXT:    movdqa %xmm8, %xmm11
3335 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm11
3336 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm11[1,1,3,3]
3337 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm10, %xmm13
3338 ; SSE2-SSSE3-NEXT:    movdqa %xmm9, %xmm14
3339 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm11, %xmm14
3340 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm15 = xmm14[0,0,2,2]
3341 ; SSE2-SSSE3-NEXT:    pand %xmm13, %xmm15
3342 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm14[1,1,3,3]
3343 ; SSE2-SSSE3-NEXT:    por %xmm15, %xmm11
3344 ; SSE2-SSSE3-NEXT:    pand %xmm11, %xmm8
3345 ; SSE2-SSSE3-NEXT:    pandn %xmm6, %xmm11
3346 ; SSE2-SSSE3-NEXT:    por %xmm8, %xmm11
3347 ; SSE2-SSSE3-NEXT:    movdqa %xmm0, %xmm8
3348 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm8
3349 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm8[1,1,3,3]
3350 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm10, %xmm13
3351 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm8, %xmm9
3352 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm8 = xmm9[0,0,2,2]
3353 ; SSE2-SSSE3-NEXT:    pand %xmm13, %xmm8
3354 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm9[1,1,3,3]
3355 ; SSE2-SSSE3-NEXT:    por %xmm8, %xmm10
3356 ; SSE2-SSSE3-NEXT:    pand %xmm10, %xmm0
3357 ; SSE2-SSSE3-NEXT:    pandn %xmm6, %xmm10
3358 ; SSE2-SSSE3-NEXT:    por %xmm0, %xmm10
3359 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm6 = [18446744073709551488,18446744073709551488]
3360 ; SSE2-SSSE3-NEXT:    movdqa %xmm10, %xmm0
3361 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm0
3362 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm0[1,1,3,3]
3363 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm8
3364 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm13
3365 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [18446744071562067840,18446744071562067840]
3366 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm9, %xmm0
3367 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm14 = xmm0[0,0,2,2]
3368 ; SSE2-SSSE3-NEXT:    pand %xmm13, %xmm14
3369 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm0[1,1,3,3]
3370 ; SSE2-SSSE3-NEXT:    por %xmm14, %xmm13
3371 ; SSE2-SSSE3-NEXT:    pand %xmm13, %xmm10
3372 ; SSE2-SSSE3-NEXT:    pandn %xmm6, %xmm13
3373 ; SSE2-SSSE3-NEXT:    por %xmm10, %xmm13
3374 ; SSE2-SSSE3-NEXT:    movdqa %xmm11, %xmm0
3375 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm0
3376 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm0[1,1,3,3]
3377 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm10
3378 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm9, %xmm0
3379 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm14 = xmm0[0,0,2,2]
3380 ; SSE2-SSSE3-NEXT:    pand %xmm10, %xmm14
3381 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
3382 ; SSE2-SSSE3-NEXT:    por %xmm14, %xmm0
3383 ; SSE2-SSSE3-NEXT:    pand %xmm0, %xmm11
3384 ; SSE2-SSSE3-NEXT:    pandn %xmm6, %xmm0
3385 ; SSE2-SSSE3-NEXT:    por %xmm11, %xmm0
3386 ; SSE2-SSSE3-NEXT:    packssdw %xmm13, %xmm0
3387 ; SSE2-SSSE3-NEXT:    movdqa %xmm12, %xmm10
3388 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm10
3389 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[1,1,3,3]
3390 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm11
3391 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm9, %xmm10
3392 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm10[0,0,2,2]
3393 ; SSE2-SSSE3-NEXT:    pand %xmm11, %xmm13
3394 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
3395 ; SSE2-SSSE3-NEXT:    por %xmm13, %xmm10
3396 ; SSE2-SSSE3-NEXT:    pand %xmm10, %xmm12
3397 ; SSE2-SSSE3-NEXT:    pandn %xmm6, %xmm10
3398 ; SSE2-SSSE3-NEXT:    por %xmm12, %xmm10
3399 ; SSE2-SSSE3-NEXT:    movdqa %xmm7, %xmm11
3400 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm11
3401 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[1,1,3,3]
3402 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm12
3403 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm9, %xmm11
3404 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm11[0,0,2,2]
3405 ; SSE2-SSSE3-NEXT:    pand %xmm12, %xmm13
3406 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]
3407 ; SSE2-SSSE3-NEXT:    por %xmm13, %xmm11
3408 ; SSE2-SSSE3-NEXT:    pand %xmm11, %xmm7
3409 ; SSE2-SSSE3-NEXT:    pandn %xmm6, %xmm11
3410 ; SSE2-SSSE3-NEXT:    por %xmm7, %xmm11
3411 ; SSE2-SSSE3-NEXT:    packssdw %xmm10, %xmm11
3412 ; SSE2-SSSE3-NEXT:    packssdw %xmm11, %xmm0
3413 ; SSE2-SSSE3-NEXT:    movdqa %xmm5, %xmm7
3414 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm7
3415 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[1,1,3,3]
3416 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm10
3417 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm9, %xmm7
3418 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm7[0,0,2,2]
3419 ; SSE2-SSSE3-NEXT:    pand %xmm10, %xmm11
3420 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
3421 ; SSE2-SSSE3-NEXT:    por %xmm11, %xmm7
3422 ; SSE2-SSSE3-NEXT:    pand %xmm7, %xmm5
3423 ; SSE2-SSSE3-NEXT:    pandn %xmm6, %xmm7
3424 ; SSE2-SSSE3-NEXT:    por %xmm5, %xmm7
3425 ; SSE2-SSSE3-NEXT:    movdqa %xmm4, %xmm5
3426 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm5
3427 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm5[1,1,3,3]
3428 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm10
3429 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm9, %xmm5
3430 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm5[0,0,2,2]
3431 ; SSE2-SSSE3-NEXT:    pand %xmm10, %xmm11
3432 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
3433 ; SSE2-SSSE3-NEXT:    por %xmm11, %xmm5
3434 ; SSE2-SSSE3-NEXT:    pand %xmm5, %xmm4
3435 ; SSE2-SSSE3-NEXT:    pandn %xmm6, %xmm5
3436 ; SSE2-SSSE3-NEXT:    por %xmm4, %xmm5
3437 ; SSE2-SSSE3-NEXT:    packssdw %xmm7, %xmm5
3438 ; SSE2-SSSE3-NEXT:    movdqa %xmm3, %xmm4
3439 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm4
3440 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[1,1,3,3]
3441 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm7
3442 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm9, %xmm4
3443 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[0,0,2,2]
3444 ; SSE2-SSSE3-NEXT:    pand %xmm7, %xmm10
3445 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
3446 ; SSE2-SSSE3-NEXT:    por %xmm10, %xmm4
3447 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm3
3448 ; SSE2-SSSE3-NEXT:    pandn %xmm6, %xmm4
3449 ; SSE2-SSSE3-NEXT:    por %xmm3, %xmm4
3450 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm1
3451 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
3452 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm8, %xmm3
3453 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm9, %xmm1
3454 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[0,0,2,2]
3455 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm7
3456 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
3457 ; SSE2-SSSE3-NEXT:    por %xmm7, %xmm1
3458 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm2
3459 ; SSE2-SSSE3-NEXT:    pandn %xmm6, %xmm1
3460 ; SSE2-SSSE3-NEXT:    por %xmm2, %xmm1
3461 ; SSE2-SSSE3-NEXT:    packssdw %xmm4, %xmm1
3462 ; SSE2-SSSE3-NEXT:    packssdw %xmm1, %xmm5
3463 ; SSE2-SSSE3-NEXT:    packsswb %xmm5, %xmm0
3464 ; SSE2-SSSE3-NEXT:    retq
3466 ; SSE41-LABEL: trunc_ssat_v16i64_v16i8:
3467 ; SSE41:       # %bb.0:
3468 ; SSE41-NEXT:    movdqa (%rdi), %xmm8
3469 ; SSE41-NEXT:    movdqa 16(%rdi), %xmm7
3470 ; SSE41-NEXT:    movdqa 32(%rdi), %xmm12
3471 ; SSE41-NEXT:    movdqa 48(%rdi), %xmm11
3472 ; SSE41-NEXT:    movdqa 80(%rdi), %xmm10
3473 ; SSE41-NEXT:    movdqa 64(%rdi), %xmm6
3474 ; SSE41-NEXT:    movdqa 112(%rdi), %xmm5
3475 ; SSE41-NEXT:    movdqa 96(%rdi), %xmm4
3476 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [127,127]
3477 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
3478 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
3479 ; SSE41-NEXT:    pxor %xmm2, %xmm0
3480 ; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [2147483775,2147483775]
3481 ; SSE41-NEXT:    movdqa %xmm9, %xmm3
3482 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
3483 ; SSE41-NEXT:    movdqa %xmm9, %xmm13
3484 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm13
3485 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]
3486 ; SSE41-NEXT:    pand %xmm3, %xmm0
3487 ; SSE41-NEXT:    por %xmm13, %xmm0
3488 ; SSE41-NEXT:    movapd %xmm1, %xmm3
3489 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm3
3490 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
3491 ; SSE41-NEXT:    pxor %xmm2, %xmm0
3492 ; SSE41-NEXT:    movdqa %xmm9, %xmm4
3493 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
3494 ; SSE41-NEXT:    movdqa %xmm9, %xmm13
3495 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm13
3496 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]
3497 ; SSE41-NEXT:    pand %xmm4, %xmm0
3498 ; SSE41-NEXT:    por %xmm13, %xmm0
3499 ; SSE41-NEXT:    movapd %xmm1, %xmm4
3500 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm4
3501 ; SSE41-NEXT:    movdqa %xmm6, %xmm0
3502 ; SSE41-NEXT:    pxor %xmm2, %xmm0
3503 ; SSE41-NEXT:    movdqa %xmm9, %xmm5
3504 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
3505 ; SSE41-NEXT:    movdqa %xmm9, %xmm13
3506 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm13
3507 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]
3508 ; SSE41-NEXT:    pand %xmm5, %xmm0
3509 ; SSE41-NEXT:    por %xmm13, %xmm0
3510 ; SSE41-NEXT:    movapd %xmm1, %xmm5
3511 ; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm5
3512 ; SSE41-NEXT:    movdqa %xmm10, %xmm0
3513 ; SSE41-NEXT:    pxor %xmm2, %xmm0
3514 ; SSE41-NEXT:    movdqa %xmm9, %xmm6
3515 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
3516 ; SSE41-NEXT:    movdqa %xmm9, %xmm13
3517 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm13
3518 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]
3519 ; SSE41-NEXT:    pand %xmm6, %xmm0
3520 ; SSE41-NEXT:    por %xmm13, %xmm0
3521 ; SSE41-NEXT:    movapd %xmm1, %xmm6
3522 ; SSE41-NEXT:    blendvpd %xmm0, %xmm10, %xmm6
3523 ; SSE41-NEXT:    movdqa %xmm12, %xmm0
3524 ; SSE41-NEXT:    pxor %xmm2, %xmm0
3525 ; SSE41-NEXT:    movdqa %xmm9, %xmm10
3526 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm10
3527 ; SSE41-NEXT:    movdqa %xmm9, %xmm13
3528 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm13
3529 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]
3530 ; SSE41-NEXT:    pand %xmm10, %xmm0
3531 ; SSE41-NEXT:    por %xmm13, %xmm0
3532 ; SSE41-NEXT:    movapd %xmm1, %xmm10
3533 ; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm10
3534 ; SSE41-NEXT:    movdqa %xmm11, %xmm0
3535 ; SSE41-NEXT:    pxor %xmm2, %xmm0
3536 ; SSE41-NEXT:    movdqa %xmm9, %xmm12
3537 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm12
3538 ; SSE41-NEXT:    movdqa %xmm9, %xmm13
3539 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm13
3540 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]
3541 ; SSE41-NEXT:    pand %xmm12, %xmm0
3542 ; SSE41-NEXT:    por %xmm13, %xmm0
3543 ; SSE41-NEXT:    movapd %xmm1, %xmm12
3544 ; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm12
3545 ; SSE41-NEXT:    movdqa %xmm8, %xmm0
3546 ; SSE41-NEXT:    pxor %xmm2, %xmm0
3547 ; SSE41-NEXT:    movdqa %xmm9, %xmm11
3548 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm11
3549 ; SSE41-NEXT:    movdqa %xmm9, %xmm13
3550 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm13
3551 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm13[0,0,2,2]
3552 ; SSE41-NEXT:    pand %xmm11, %xmm0
3553 ; SSE41-NEXT:    por %xmm13, %xmm0
3554 ; SSE41-NEXT:    movapd %xmm1, %xmm11
3555 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm11
3556 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
3557 ; SSE41-NEXT:    pxor %xmm2, %xmm0
3558 ; SSE41-NEXT:    movdqa %xmm9, %xmm8
3559 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm8
3560 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm9
3561 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
3562 ; SSE41-NEXT:    pand %xmm8, %xmm0
3563 ; SSE41-NEXT:    por %xmm9, %xmm0
3564 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
3565 ; SSE41-NEXT:    movapd {{.*#+}} xmm7 = [18446744073709551488,18446744073709551488]
3566 ; SSE41-NEXT:    movapd %xmm1, %xmm9
3567 ; SSE41-NEXT:    xorpd %xmm2, %xmm9
3568 ; SSE41-NEXT:    movdqa {{.*#+}} xmm8 = [18446744071562067840,18446744071562067840]
3569 ; SSE41-NEXT:    movapd %xmm9, %xmm13
3570 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm13
3571 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm9
3572 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
3573 ; SSE41-NEXT:    pand %xmm13, %xmm0
3574 ; SSE41-NEXT:    por %xmm9, %xmm0
3575 ; SSE41-NEXT:    movapd %xmm7, %xmm9
3576 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm9
3577 ; SSE41-NEXT:    movapd %xmm11, %xmm1
3578 ; SSE41-NEXT:    xorpd %xmm2, %xmm1
3579 ; SSE41-NEXT:    movapd %xmm1, %xmm13
3580 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm13
3581 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm1
3582 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
3583 ; SSE41-NEXT:    pand %xmm13, %xmm0
3584 ; SSE41-NEXT:    por %xmm1, %xmm0
3585 ; SSE41-NEXT:    movapd %xmm7, %xmm1
3586 ; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm1
3587 ; SSE41-NEXT:    packssdw %xmm9, %xmm1
3588 ; SSE41-NEXT:    movapd %xmm12, %xmm9
3589 ; SSE41-NEXT:    xorpd %xmm2, %xmm9
3590 ; SSE41-NEXT:    movapd %xmm9, %xmm11
3591 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm11
3592 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm9
3593 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
3594 ; SSE41-NEXT:    pand %xmm11, %xmm0
3595 ; SSE41-NEXT:    por %xmm9, %xmm0
3596 ; SSE41-NEXT:    movapd %xmm7, %xmm9
3597 ; SSE41-NEXT:    blendvpd %xmm0, %xmm12, %xmm9
3598 ; SSE41-NEXT:    movapd %xmm10, %xmm11
3599 ; SSE41-NEXT:    xorpd %xmm2, %xmm11
3600 ; SSE41-NEXT:    movapd %xmm11, %xmm12
3601 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm12
3602 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm11
3603 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm11[0,0,2,2]
3604 ; SSE41-NEXT:    pand %xmm12, %xmm0
3605 ; SSE41-NEXT:    por %xmm11, %xmm0
3606 ; SSE41-NEXT:    movapd %xmm7, %xmm11
3607 ; SSE41-NEXT:    blendvpd %xmm0, %xmm10, %xmm11
3608 ; SSE41-NEXT:    packssdw %xmm9, %xmm11
3609 ; SSE41-NEXT:    packssdw %xmm11, %xmm1
3610 ; SSE41-NEXT:    movapd %xmm6, %xmm9
3611 ; SSE41-NEXT:    xorpd %xmm2, %xmm9
3612 ; SSE41-NEXT:    movapd %xmm9, %xmm10
3613 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm10
3614 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm9
3615 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[0,0,2,2]
3616 ; SSE41-NEXT:    pand %xmm10, %xmm0
3617 ; SSE41-NEXT:    por %xmm9, %xmm0
3618 ; SSE41-NEXT:    movapd %xmm7, %xmm9
3619 ; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm9
3620 ; SSE41-NEXT:    movapd %xmm5, %xmm6
3621 ; SSE41-NEXT:    xorpd %xmm2, %xmm6
3622 ; SSE41-NEXT:    movapd %xmm6, %xmm10
3623 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm10
3624 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm6
3625 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
3626 ; SSE41-NEXT:    pand %xmm10, %xmm0
3627 ; SSE41-NEXT:    por %xmm6, %xmm0
3628 ; SSE41-NEXT:    movapd %xmm7, %xmm6
3629 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm6
3630 ; SSE41-NEXT:    packssdw %xmm9, %xmm6
3631 ; SSE41-NEXT:    movapd %xmm4, %xmm5
3632 ; SSE41-NEXT:    xorpd %xmm2, %xmm5
3633 ; SSE41-NEXT:    movapd %xmm5, %xmm9
3634 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm9
3635 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm5
3636 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
3637 ; SSE41-NEXT:    pand %xmm9, %xmm0
3638 ; SSE41-NEXT:    por %xmm5, %xmm0
3639 ; SSE41-NEXT:    movapd %xmm7, %xmm5
3640 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm5
3641 ; SSE41-NEXT:    xorpd %xmm3, %xmm2
3642 ; SSE41-NEXT:    movapd %xmm2, %xmm4
3643 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm4
3644 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm2
3645 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
3646 ; SSE41-NEXT:    pand %xmm4, %xmm0
3647 ; SSE41-NEXT:    por %xmm2, %xmm0
3648 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm7
3649 ; SSE41-NEXT:    packssdw %xmm5, %xmm7
3650 ; SSE41-NEXT:    packssdw %xmm7, %xmm6
3651 ; SSE41-NEXT:    packsswb %xmm6, %xmm1
3652 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
3653 ; SSE41-NEXT:    retq
3655 ; AVX1-LABEL: trunc_ssat_v16i64_v16i8:
3656 ; AVX1:       # %bb.0:
3657 ; AVX1-NEXT:    vmovdqa 96(%rdi), %xmm0
3658 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [127,127]
3659 ; AVX1-NEXT:    # xmm2 = mem[0,0]
3660 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm1
3661 ; AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm2, %xmm0
3662 ; AVX1-NEXT:    vmovdqa 112(%rdi), %xmm1
3663 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
3664 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm1, %xmm2, %xmm1
3665 ; AVX1-NEXT:    vmovdqa 64(%rdi), %xmm3
3666 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm4
3667 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm2, %xmm3
3668 ; AVX1-NEXT:    vmovdqa 80(%rdi), %xmm4
3669 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm2, %xmm5
3670 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm4, %xmm2, %xmm4
3671 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm5
3672 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm6
3673 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm7
3674 ; AVX1-NEXT:    vmovdqa 48(%rdi), %xmm8
3675 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm2, %xmm9
3676 ; AVX1-NEXT:    vblendvpd %xmm9, %xmm7, %xmm2, %xmm7
3677 ; AVX1-NEXT:    vpcmpgtq %xmm8, %xmm2, %xmm9
3678 ; AVX1-NEXT:    vblendvpd %xmm9, %xmm8, %xmm2, %xmm8
3679 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm2, %xmm9
3680 ; AVX1-NEXT:    vblendvpd %xmm9, %xmm5, %xmm2, %xmm5
3681 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm2, %xmm9
3682 ; AVX1-NEXT:    vblendvpd %xmm9, %xmm6, %xmm2, %xmm2
3683 ; AVX1-NEXT:    vmovddup {{.*#+}} xmm6 = [18446744073709551488,18446744073709551488]
3684 ; AVX1-NEXT:    # xmm6 = mem[0,0]
3685 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm2, %xmm9
3686 ; AVX1-NEXT:    vblendvpd %xmm9, %xmm2, %xmm6, %xmm2
3687 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm5, %xmm9
3688 ; AVX1-NEXT:    vblendvpd %xmm9, %xmm5, %xmm6, %xmm5
3689 ; AVX1-NEXT:    vpackssdw %xmm2, %xmm5, %xmm2
3690 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm8, %xmm5
3691 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm8, %xmm6, %xmm5
3692 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm8
3693 ; AVX1-NEXT:    vblendvpd %xmm8, %xmm7, %xmm6, %xmm7
3694 ; AVX1-NEXT:    vpackssdw %xmm5, %xmm7, %xmm5
3695 ; AVX1-NEXT:    vpackssdw %xmm5, %xmm2, %xmm2
3696 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm4, %xmm5
3697 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm4, %xmm6, %xmm4
3698 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm3, %xmm5
3699 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm3, %xmm6, %xmm3
3700 ; AVX1-NEXT:    vpackssdw %xmm4, %xmm3, %xmm3
3701 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm1, %xmm4
3702 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm1, %xmm6, %xmm1
3703 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm0, %xmm4
3704 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm0, %xmm6, %xmm0
3705 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
3706 ; AVX1-NEXT:    vpackssdw %xmm0, %xmm3, %xmm0
3707 ; AVX1-NEXT:    vpacksswb %xmm0, %xmm2, %xmm0
3708 ; AVX1-NEXT:    retq
3710 ; AVX2-LABEL: trunc_ssat_v16i64_v16i8:
3711 ; AVX2:       # %bb.0:
3712 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
3713 ; AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
3714 ; AVX2-NEXT:    vmovdqa 64(%rdi), %ymm2
3715 ; AVX2-NEXT:    vmovdqa 96(%rdi), %ymm3
3716 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [127,127,127,127]
3717 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm4, %ymm5
3718 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm2, %ymm4, %ymm2
3719 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm4, %ymm5
3720 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm3, %ymm4, %ymm3
3721 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm4, %ymm5
3722 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm4, %ymm0
3723 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm4, %ymm5
3724 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm1, %ymm4, %ymm1
3725 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
3726 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm1, %ymm5
3727 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm1, %ymm4, %ymm1
3728 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm0, %ymm5
3729 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm4, %ymm0
3730 ; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
3731 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm3, %ymm1
3732 ; AVX2-NEXT:    vblendvpd %ymm1, %ymm3, %ymm4, %ymm1
3733 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm2, %ymm3
3734 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm2, %ymm4, %ymm2
3735 ; AVX2-NEXT:    vpackssdw %ymm1, %ymm2, %ymm1
3736 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
3737 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
3738 ; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
3739 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
3740 ; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
3741 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
3742 ; AVX2-NEXT:    vzeroupper
3743 ; AVX2-NEXT:    retq
3745 ; AVX512-LABEL: trunc_ssat_v16i64_v16i8:
3746 ; AVX512:       # %bb.0:
3747 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
3748 ; AVX512-NEXT:    vmovdqa64 64(%rdi), %zmm1
3749 ; AVX512-NEXT:    vpmovsqb %zmm1, %xmm1
3750 ; AVX512-NEXT:    vpmovsqb %zmm0, %xmm0
3751 ; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3752 ; AVX512-NEXT:    vzeroupper
3753 ; AVX512-NEXT:    retq
3755 ; SKX-LABEL: trunc_ssat_v16i64_v16i8:
3756 ; SKX:       # %bb.0:
3757 ; SKX-NEXT:    vmovdqa (%rdi), %ymm0
3758 ; SKX-NEXT:    vmovdqa 32(%rdi), %ymm1
3759 ; SKX-NEXT:    vmovdqa 64(%rdi), %ymm2
3760 ; SKX-NEXT:    vmovdqa 96(%rdi), %ymm3
3761 ; SKX-NEXT:    vpmovsqb %ymm3, %xmm3
3762 ; SKX-NEXT:    vpmovsqb %ymm2, %xmm2
3763 ; SKX-NEXT:    vpunpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
3764 ; SKX-NEXT:    vpmovsqb %ymm1, %xmm1
3765 ; SKX-NEXT:    vpmovsqb %ymm0, %xmm0
3766 ; SKX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3767 ; SKX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
3768 ; SKX-NEXT:    vzeroupper
3769 ; SKX-NEXT:    retq
3770   %a0 = load <16 x i64>, ptr %p0
3771   %1 = icmp slt <16 x i64> %a0, <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>
3772   %2 = select <16 x i1> %1, <16 x i64> %a0, <16 x i64> <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>
3773   %3 = icmp sgt <16 x i64> %2, <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>
3774   %4 = select <16 x i1> %3, <16 x i64> %2, <16 x i64> <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>
3775   %5 = trunc <16 x i64> %4 to <16 x i8>
3776   ret <16 x i8> %5
3779 define <4 x i8> @trunc_ssat_v4i32_v4i8(<4 x i32> %a0) {
3780 ; SSE-LABEL: trunc_ssat_v4i32_v4i8:
3781 ; SSE:       # %bb.0:
3782 ; SSE-NEXT:    packssdw %xmm0, %xmm0
3783 ; SSE-NEXT:    packsswb %xmm0, %xmm0
3784 ; SSE-NEXT:    retq
3786 ; AVX-LABEL: trunc_ssat_v4i32_v4i8:
3787 ; AVX:       # %bb.0:
3788 ; AVX-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
3789 ; AVX-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
3790 ; AVX-NEXT:    retq
3792 ; AVX512-LABEL: trunc_ssat_v4i32_v4i8:
3793 ; AVX512:       # %bb.0:
3794 ; AVX512-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
3795 ; AVX512-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
3796 ; AVX512-NEXT:    retq
3798 ; SKX-LABEL: trunc_ssat_v4i32_v4i8:
3799 ; SKX:       # %bb.0:
3800 ; SKX-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
3801 ; SKX-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
3802 ; SKX-NEXT:    retq
3803   %1 = icmp slt <4 x i32> %a0, <i32 127, i32 127, i32 127, i32 127>
3804   %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 127, i32 127, i32 127, i32 127>
3805   %3 = icmp sgt <4 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128>
3806   %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> <i32 -128, i32 -128, i32 -128, i32 -128>
3807   %5 = trunc <4 x i32> %4 to <4 x i8>
3808   ret <4 x i8> %5
3811 define void @trunc_ssat_v4i32_v4i8_store(<4 x i32> %a0, ptr%p1) {
3812 ; SSE-LABEL: trunc_ssat_v4i32_v4i8_store:
3813 ; SSE:       # %bb.0:
3814 ; SSE-NEXT:    packssdw %xmm0, %xmm0
3815 ; SSE-NEXT:    packsswb %xmm0, %xmm0
3816 ; SSE-NEXT:    movd %xmm0, (%rdi)
3817 ; SSE-NEXT:    retq
3819 ; AVX-LABEL: trunc_ssat_v4i32_v4i8_store:
3820 ; AVX:       # %bb.0:
3821 ; AVX-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
3822 ; AVX-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
3823 ; AVX-NEXT:    vmovd %xmm0, (%rdi)
3824 ; AVX-NEXT:    retq
3826 ; AVX512F-LABEL: trunc_ssat_v4i32_v4i8_store:
3827 ; AVX512F:       # %bb.0:
3828 ; AVX512F-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
3829 ; AVX512F-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
3830 ; AVX512F-NEXT:    vmovd %xmm0, (%rdi)
3831 ; AVX512F-NEXT:    retq
3833 ; AVX512VL-LABEL: trunc_ssat_v4i32_v4i8_store:
3834 ; AVX512VL:       # %bb.0:
3835 ; AVX512VL-NEXT:    vpmovsdb %xmm0, (%rdi)
3836 ; AVX512VL-NEXT:    retq
3838 ; AVX512BW-LABEL: trunc_ssat_v4i32_v4i8_store:
3839 ; AVX512BW:       # %bb.0:
3840 ; AVX512BW-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
3841 ; AVX512BW-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
3842 ; AVX512BW-NEXT:    vmovd %xmm0, (%rdi)
3843 ; AVX512BW-NEXT:    retq
3845 ; AVX512BWVL-LABEL: trunc_ssat_v4i32_v4i8_store:
3846 ; AVX512BWVL:       # %bb.0:
3847 ; AVX512BWVL-NEXT:    vpmovsdb %xmm0, (%rdi)
3848 ; AVX512BWVL-NEXT:    retq
3850 ; SKX-LABEL: trunc_ssat_v4i32_v4i8_store:
3851 ; SKX:       # %bb.0:
3852 ; SKX-NEXT:    vpmovsdb %xmm0, (%rdi)
3853 ; SKX-NEXT:    retq
3854   %1 = icmp slt <4 x i32> %a0, <i32 127, i32 127, i32 127, i32 127>
3855   %2 = select <4 x i1> %1, <4 x i32> %a0, <4 x i32> <i32 127, i32 127, i32 127, i32 127>
3856   %3 = icmp sgt <4 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128>
3857   %4 = select <4 x i1> %3, <4 x i32> %2, <4 x i32> <i32 -128, i32 -128, i32 -128, i32 -128>
3858   %5 = trunc <4 x i32> %4 to <4 x i8>
3859   store <4 x i8> %5, ptr%p1
3860   ret void
3863 define <8 x i8> @trunc_ssat_v8i32_v8i8(<8 x i32> %a0) {
3864 ; SSE-LABEL: trunc_ssat_v8i32_v8i8:
3865 ; SSE:       # %bb.0:
3866 ; SSE-NEXT:    packssdw %xmm1, %xmm0
3867 ; SSE-NEXT:    packsswb %xmm0, %xmm0
3868 ; SSE-NEXT:    retq
3870 ; AVX1-LABEL: trunc_ssat_v8i32_v8i8:
3871 ; AVX1:       # %bb.0:
3872 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
3873 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
3874 ; AVX1-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
3875 ; AVX1-NEXT:    vzeroupper
3876 ; AVX1-NEXT:    retq
3878 ; AVX2-LABEL: trunc_ssat_v8i32_v8i8:
3879 ; AVX2:       # %bb.0:
3880 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
3881 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
3882 ; AVX2-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
3883 ; AVX2-NEXT:    vzeroupper
3884 ; AVX2-NEXT:    retq
3886 ; AVX512F-LABEL: trunc_ssat_v8i32_v8i8:
3887 ; AVX512F:       # %bb.0:
3888 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
3889 ; AVX512F-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
3890 ; AVX512F-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
3891 ; AVX512F-NEXT:    vzeroupper
3892 ; AVX512F-NEXT:    retq
3894 ; AVX512VL-LABEL: trunc_ssat_v8i32_v8i8:
3895 ; AVX512VL:       # %bb.0:
3896 ; AVX512VL-NEXT:    vpmovsdb %ymm0, %xmm0
3897 ; AVX512VL-NEXT:    vzeroupper
3898 ; AVX512VL-NEXT:    retq
3900 ; AVX512BW-LABEL: trunc_ssat_v8i32_v8i8:
3901 ; AVX512BW:       # %bb.0:
3902 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
3903 ; AVX512BW-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
3904 ; AVX512BW-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
3905 ; AVX512BW-NEXT:    vzeroupper
3906 ; AVX512BW-NEXT:    retq
3908 ; AVX512BWVL-LABEL: trunc_ssat_v8i32_v8i8:
3909 ; AVX512BWVL:       # %bb.0:
3910 ; AVX512BWVL-NEXT:    vpmovsdb %ymm0, %xmm0
3911 ; AVX512BWVL-NEXT:    vzeroupper
3912 ; AVX512BWVL-NEXT:    retq
3914 ; SKX-LABEL: trunc_ssat_v8i32_v8i8:
3915 ; SKX:       # %bb.0:
3916 ; SKX-NEXT:    vpmovsdb %ymm0, %xmm0
3917 ; SKX-NEXT:    vzeroupper
3918 ; SKX-NEXT:    retq
3919   %1 = icmp slt <8 x i32> %a0, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
3920   %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
3921   %3 = icmp sgt <8 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
3922   %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
3923   %5 = trunc <8 x i32> %4 to <8 x i8>
3924   ret <8 x i8> %5
3927 define void @trunc_ssat_v8i32_v8i8_store(<8 x i32> %a0, ptr%p1) {
3928 ; SSE-LABEL: trunc_ssat_v8i32_v8i8_store:
3929 ; SSE:       # %bb.0:
3930 ; SSE-NEXT:    packssdw %xmm1, %xmm0
3931 ; SSE-NEXT:    packsswb %xmm0, %xmm0
3932 ; SSE-NEXT:    movq %xmm0, (%rdi)
3933 ; SSE-NEXT:    retq
3935 ; AVX1-LABEL: trunc_ssat_v8i32_v8i8_store:
3936 ; AVX1:       # %bb.0:
3937 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
3938 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
3939 ; AVX1-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
3940 ; AVX1-NEXT:    vmovq %xmm0, (%rdi)
3941 ; AVX1-NEXT:    vzeroupper
3942 ; AVX1-NEXT:    retq
3944 ; AVX2-LABEL: trunc_ssat_v8i32_v8i8_store:
3945 ; AVX2:       # %bb.0:
3946 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
3947 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
3948 ; AVX2-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
3949 ; AVX2-NEXT:    vmovq %xmm0, (%rdi)
3950 ; AVX2-NEXT:    vzeroupper
3951 ; AVX2-NEXT:    retq
3953 ; AVX512F-LABEL: trunc_ssat_v8i32_v8i8_store:
3954 ; AVX512F:       # %bb.0:
3955 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
3956 ; AVX512F-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
3957 ; AVX512F-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
3958 ; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
3959 ; AVX512F-NEXT:    vzeroupper
3960 ; AVX512F-NEXT:    retq
3962 ; AVX512VL-LABEL: trunc_ssat_v8i32_v8i8_store:
3963 ; AVX512VL:       # %bb.0:
3964 ; AVX512VL-NEXT:    vpmovsdb %ymm0, (%rdi)
3965 ; AVX512VL-NEXT:    vzeroupper
3966 ; AVX512VL-NEXT:    retq
3968 ; AVX512BW-LABEL: trunc_ssat_v8i32_v8i8_store:
3969 ; AVX512BW:       # %bb.0:
3970 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
3971 ; AVX512BW-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
3972 ; AVX512BW-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
3973 ; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
3974 ; AVX512BW-NEXT:    vzeroupper
3975 ; AVX512BW-NEXT:    retq
3977 ; AVX512BWVL-LABEL: trunc_ssat_v8i32_v8i8_store:
3978 ; AVX512BWVL:       # %bb.0:
3979 ; AVX512BWVL-NEXT:    vpmovsdb %ymm0, (%rdi)
3980 ; AVX512BWVL-NEXT:    vzeroupper
3981 ; AVX512BWVL-NEXT:    retq
3983 ; SKX-LABEL: trunc_ssat_v8i32_v8i8_store:
3984 ; SKX:       # %bb.0:
3985 ; SKX-NEXT:    vpmovsdb %ymm0, (%rdi)
3986 ; SKX-NEXT:    vzeroupper
3987 ; SKX-NEXT:    retq
3988   %1 = icmp slt <8 x i32> %a0, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
3989   %2 = select <8 x i1> %1, <8 x i32> %a0, <8 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
3990   %3 = icmp sgt <8 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
3991   %4 = select <8 x i1> %3, <8 x i32> %2, <8 x i32> <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
3992   %5 = trunc <8 x i32> %4 to <8 x i8>
3993   store <8 x i8> %5, ptr%p1
3994   ret void
3997 define <16 x i8> @trunc_ssat_v16i32_v16i8(ptr %p0) "min-legal-vector-width"="256" {
3998 ; SSE-LABEL: trunc_ssat_v16i32_v16i8:
3999 ; SSE:       # %bb.0:
4000 ; SSE-NEXT:    movdqa (%rdi), %xmm0
4001 ; SSE-NEXT:    movdqa 32(%rdi), %xmm1
4002 ; SSE-NEXT:    packssdw 48(%rdi), %xmm1
4003 ; SSE-NEXT:    packssdw 16(%rdi), %xmm0
4004 ; SSE-NEXT:    packsswb %xmm1, %xmm0
4005 ; SSE-NEXT:    retq
4007 ; AVX1-LABEL: trunc_ssat_v16i32_v16i8:
4008 ; AVX1:       # %bb.0:
4009 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
4010 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm1
4011 ; AVX1-NEXT:    vpackssdw 48(%rdi), %xmm1, %xmm1
4012 ; AVX1-NEXT:    vpackssdw 16(%rdi), %xmm0, %xmm0
4013 ; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
4014 ; AVX1-NEXT:    retq
4016 ; AVX2-LABEL: trunc_ssat_v16i32_v16i8:
4017 ; AVX2:       # %bb.0:
4018 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
4019 ; AVX2-NEXT:    vpackssdw 32(%rdi), %ymm0, %ymm0
4020 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
4021 ; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
4022 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
4023 ; AVX2-NEXT:    vzeroupper
4024 ; AVX2-NEXT:    retq
4026 ; AVX512-LABEL: trunc_ssat_v16i32_v16i8:
4027 ; AVX512:       # %bb.0:
4028 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
4029 ; AVX512-NEXT:    vpmovsdb %zmm0, %xmm0
4030 ; AVX512-NEXT:    vzeroupper
4031 ; AVX512-NEXT:    retq
4033 ; SKX-LABEL: trunc_ssat_v16i32_v16i8:
4034 ; SKX:       # %bb.0:
4035 ; SKX-NEXT:    vmovdqa (%rdi), %ymm0
4036 ; SKX-NEXT:    vmovdqa 32(%rdi), %ymm1
4037 ; SKX-NEXT:    vpmovsdb %ymm1, %xmm1
4038 ; SKX-NEXT:    vpmovsdb %ymm0, %xmm0
4039 ; SKX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4040 ; SKX-NEXT:    vzeroupper
4041 ; SKX-NEXT:    retq
4042   %a0 = load <16 x i32>, ptr %p0
4043   %1 = icmp slt <16 x i32> %a0, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
4044   %2 = select <16 x i1> %1, <16 x i32> %a0, <16 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
4045   %3 = icmp sgt <16 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
4046   %4 = select <16 x i1> %3, <16 x i32> %2, <16 x i32> <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
4047   %5 = trunc <16 x i32> %4 to <16 x i8>
4048   ret <16 x i8> %5
4051 define void @trunc_ssat_v16i32_v16i8_store(ptr %p0, ptr %p1) "min-legal-vector-width"="256" {
4052 ; SSE-LABEL: trunc_ssat_v16i32_v16i8_store:
4053 ; SSE:       # %bb.0:
4054 ; SSE-NEXT:    movdqa (%rdi), %xmm0
4055 ; SSE-NEXT:    movdqa 32(%rdi), %xmm1
4056 ; SSE-NEXT:    packssdw 48(%rdi), %xmm1
4057 ; SSE-NEXT:    packssdw 16(%rdi), %xmm0
4058 ; SSE-NEXT:    packsswb %xmm1, %xmm0
4059 ; SSE-NEXT:    movdqa %xmm0, (%rsi)
4060 ; SSE-NEXT:    retq
4062 ; AVX1-LABEL: trunc_ssat_v16i32_v16i8_store:
4063 ; AVX1:       # %bb.0:
4064 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
4065 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm1
4066 ; AVX1-NEXT:    vpackssdw 48(%rdi), %xmm1, %xmm1
4067 ; AVX1-NEXT:    vpackssdw 16(%rdi), %xmm0, %xmm0
4068 ; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
4069 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsi)
4070 ; AVX1-NEXT:    retq
4072 ; AVX2-LABEL: trunc_ssat_v16i32_v16i8_store:
4073 ; AVX2:       # %bb.0:
4074 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
4075 ; AVX2-NEXT:    vpackssdw 32(%rdi), %ymm0, %ymm0
4076 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
4077 ; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
4078 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
4079 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsi)
4080 ; AVX2-NEXT:    vzeroupper
4081 ; AVX2-NEXT:    retq
4083 ; AVX512-LABEL: trunc_ssat_v16i32_v16i8_store:
4084 ; AVX512:       # %bb.0:
4085 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
4086 ; AVX512-NEXT:    vpmovsdb %zmm0, (%rsi)
4087 ; AVX512-NEXT:    vzeroupper
4088 ; AVX512-NEXT:    retq
4090 ; SKX-LABEL: trunc_ssat_v16i32_v16i8_store:
4091 ; SKX:       # %bb.0:
4092 ; SKX-NEXT:    vmovdqa (%rdi), %ymm0
4093 ; SKX-NEXT:    vmovdqa 32(%rdi), %ymm1
4094 ; SKX-NEXT:    vpmovsdb %ymm1, %xmm1
4095 ; SKX-NEXT:    vpmovsdb %ymm0, %xmm0
4096 ; SKX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4097 ; SKX-NEXT:    vmovdqa %xmm0, (%rsi)
4098 ; SKX-NEXT:    vzeroupper
4099 ; SKX-NEXT:    retq
4100   %a0 = load <16 x i32>, ptr %p0
4101   %1 = icmp slt <16 x i32> %a0, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
4102   %2 = select <16 x i1> %1, <16 x i32> %a0, <16 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
4103   %3 = icmp sgt <16 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
4104   %4 = select <16 x i1> %3, <16 x i32> %2, <16 x i32> <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
4105   %5 = trunc <16 x i32> %4 to <16 x i8>
4106   store <16 x i8> %5, ptr %p1
4107   ret void
4110 define <8 x i8> @trunc_ssat_v8i16_v8i8(<8 x i16> %a0) {
4111 ; SSE-LABEL: trunc_ssat_v8i16_v8i8:
4112 ; SSE:       # %bb.0:
4113 ; SSE-NEXT:    packsswb %xmm0, %xmm0
4114 ; SSE-NEXT:    retq
4116 ; AVX-LABEL: trunc_ssat_v8i16_v8i8:
4117 ; AVX:       # %bb.0:
4118 ; AVX-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
4119 ; AVX-NEXT:    retq
4121 ; AVX512-LABEL: trunc_ssat_v8i16_v8i8:
4122 ; AVX512:       # %bb.0:
4123 ; AVX512-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
4124 ; AVX512-NEXT:    retq
4126 ; SKX-LABEL: trunc_ssat_v8i16_v8i8:
4127 ; SKX:       # %bb.0:
4128 ; SKX-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
4129 ; SKX-NEXT:    retq
4130   %1 = icmp slt <8 x i16> %a0, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
4131   %2 = select <8 x i1> %1, <8 x i16> %a0, <8 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
4132   %3 = icmp sgt <8 x i16> %2, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
4133   %4 = select <8 x i1> %3, <8 x i16> %2, <8 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
4134   %5 = trunc <8 x i16> %4 to <8 x i8>
4135   ret <8 x i8> %5
4138 define void @trunc_ssat_v8i16_v8i8_store(<8 x i16> %a0, ptr%p1) {
4139 ; SSE-LABEL: trunc_ssat_v8i16_v8i8_store:
4140 ; SSE:       # %bb.0:
4141 ; SSE-NEXT:    packsswb %xmm0, %xmm0
4142 ; SSE-NEXT:    movq %xmm0, (%rdi)
4143 ; SSE-NEXT:    retq
4145 ; AVX-LABEL: trunc_ssat_v8i16_v8i8_store:
4146 ; AVX:       # %bb.0:
4147 ; AVX-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
4148 ; AVX-NEXT:    vmovq %xmm0, (%rdi)
4149 ; AVX-NEXT:    retq
4151 ; AVX512F-LABEL: trunc_ssat_v8i16_v8i8_store:
4152 ; AVX512F:       # %bb.0:
4153 ; AVX512F-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
4154 ; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
4155 ; AVX512F-NEXT:    retq
4157 ; AVX512VL-LABEL: trunc_ssat_v8i16_v8i8_store:
4158 ; AVX512VL:       # %bb.0:
4159 ; AVX512VL-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
4160 ; AVX512VL-NEXT:    vmovq %xmm0, (%rdi)
4161 ; AVX512VL-NEXT:    retq
4163 ; AVX512BW-LABEL: trunc_ssat_v8i16_v8i8_store:
4164 ; AVX512BW:       # %bb.0:
4165 ; AVX512BW-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
4166 ; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
4167 ; AVX512BW-NEXT:    retq
4169 ; AVX512BWVL-LABEL: trunc_ssat_v8i16_v8i8_store:
4170 ; AVX512BWVL:       # %bb.0:
4171 ; AVX512BWVL-NEXT:    vpmovswb %xmm0, (%rdi)
4172 ; AVX512BWVL-NEXT:    retq
4174 ; SKX-LABEL: trunc_ssat_v8i16_v8i8_store:
4175 ; SKX:       # %bb.0:
4176 ; SKX-NEXT:    vpmovswb %xmm0, (%rdi)
4177 ; SKX-NEXT:    retq
4178   %1 = icmp slt <8 x i16> %a0, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
4179   %2 = select <8 x i1> %1, <8 x i16> %a0, <8 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
4180   %3 = icmp sgt <8 x i16> %2, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
4181   %4 = select <8 x i1> %3, <8 x i16> %2, <8 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
4182   %5 = trunc <8 x i16> %4 to <8 x i8>
4183   store <8 x i8> %5, ptr%p1
4184   ret void
4187 define <16 x i8> @trunc_ssat_v16i16_v16i8(<16 x i16> %a0) {
4188 ; SSE-LABEL: trunc_ssat_v16i16_v16i8:
4189 ; SSE:       # %bb.0:
4190 ; SSE-NEXT:    packsswb %xmm1, %xmm0
4191 ; SSE-NEXT:    retq
4193 ; AVX1-LABEL: trunc_ssat_v16i16_v16i8:
4194 ; AVX1:       # %bb.0:
4195 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
4196 ; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
4197 ; AVX1-NEXT:    vzeroupper
4198 ; AVX1-NEXT:    retq
4200 ; AVX2-LABEL: trunc_ssat_v16i16_v16i8:
4201 ; AVX2:       # %bb.0:
4202 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
4203 ; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
4204 ; AVX2-NEXT:    vzeroupper
4205 ; AVX2-NEXT:    retq
4207 ; AVX512F-LABEL: trunc_ssat_v16i16_v16i8:
4208 ; AVX512F:       # %bb.0:
4209 ; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
4210 ; AVX512F-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
4211 ; AVX512F-NEXT:    vzeroupper
4212 ; AVX512F-NEXT:    retq
4214 ; AVX512VL-LABEL: trunc_ssat_v16i16_v16i8:
4215 ; AVX512VL:       # %bb.0:
4216 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
4217 ; AVX512VL-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
4218 ; AVX512VL-NEXT:    vzeroupper
4219 ; AVX512VL-NEXT:    retq
4221 ; AVX512BW-LABEL: trunc_ssat_v16i16_v16i8:
4222 ; AVX512BW:       # %bb.0:
4223 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
4224 ; AVX512BW-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
4225 ; AVX512BW-NEXT:    vzeroupper
4226 ; AVX512BW-NEXT:    retq
4228 ; AVX512BWVL-LABEL: trunc_ssat_v16i16_v16i8:
4229 ; AVX512BWVL:       # %bb.0:
4230 ; AVX512BWVL-NEXT:    vpmovswb %ymm0, %xmm0
4231 ; AVX512BWVL-NEXT:    vzeroupper
4232 ; AVX512BWVL-NEXT:    retq
4234 ; SKX-LABEL: trunc_ssat_v16i16_v16i8:
4235 ; SKX:       # %bb.0:
4236 ; SKX-NEXT:    vpmovswb %ymm0, %xmm0
4237 ; SKX-NEXT:    vzeroupper
4238 ; SKX-NEXT:    retq
4239   %1 = icmp slt <16 x i16> %a0, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
4240   %2 = select <16 x i1> %1, <16 x i16> %a0, <16 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
4241   %3 = icmp sgt <16 x i16> %2, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
4242   %4 = select <16 x i1> %3, <16 x i16> %2, <16 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
4243   %5 = trunc <16 x i16> %4 to <16 x i8>
4244   ret <16 x i8> %5
4247 define <32 x i8> @trunc_ssat_v32i16_v32i8(ptr %p0) "min-legal-vector-width"="256" {
4248 ; SSE-LABEL: trunc_ssat_v32i16_v32i8:
4249 ; SSE:       # %bb.0:
4250 ; SSE-NEXT:    movdqa (%rdi), %xmm0
4251 ; SSE-NEXT:    movdqa 32(%rdi), %xmm1
4252 ; SSE-NEXT:    packsswb 16(%rdi), %xmm0
4253 ; SSE-NEXT:    packsswb 48(%rdi), %xmm1
4254 ; SSE-NEXT:    retq
4256 ; AVX1-LABEL: trunc_ssat_v32i16_v32i8:
4257 ; AVX1:       # %bb.0:
4258 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
4259 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm1
4260 ; AVX1-NEXT:    vpacksswb 48(%rdi), %xmm1, %xmm1
4261 ; AVX1-NEXT:    vpacksswb 16(%rdi), %xmm0, %xmm0
4262 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
4263 ; AVX1-NEXT:    retq
4265 ; AVX2-LABEL: trunc_ssat_v32i16_v32i8:
4266 ; AVX2:       # %bb.0:
4267 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
4268 ; AVX2-NEXT:    vpacksswb 32(%rdi), %ymm0, %ymm0
4269 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4270 ; AVX2-NEXT:    retq
4272 ; AVX512F-LABEL: trunc_ssat_v32i16_v32i8:
4273 ; AVX512F:       # %bb.0:
4274 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
4275 ; AVX512F-NEXT:    vpacksswb 32(%rdi), %ymm0, %ymm0
4276 ; AVX512F-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4277 ; AVX512F-NEXT:    retq
4279 ; AVX512VL-LABEL: trunc_ssat_v32i16_v32i8:
4280 ; AVX512VL:       # %bb.0:
4281 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm0
4282 ; AVX512VL-NEXT:    vpacksswb 32(%rdi), %ymm0, %ymm0
4283 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4284 ; AVX512VL-NEXT:    retq
4286 ; AVX512BW-LABEL: trunc_ssat_v32i16_v32i8:
4287 ; AVX512BW:       # %bb.0:
4288 ; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
4289 ; AVX512BW-NEXT:    vpmovswb %zmm0, %ymm0
4290 ; AVX512BW-NEXT:    retq
4292 ; AVX512BWVL-LABEL: trunc_ssat_v32i16_v32i8:
4293 ; AVX512BWVL:       # %bb.0:
4294 ; AVX512BWVL-NEXT:    vmovdqa64 (%rdi), %zmm0
4295 ; AVX512BWVL-NEXT:    vpmovswb %zmm0, %ymm0
4296 ; AVX512BWVL-NEXT:    retq
4298 ; SKX-LABEL: trunc_ssat_v32i16_v32i8:
4299 ; SKX:       # %bb.0:
4300 ; SKX-NEXT:    vmovdqa (%rdi), %ymm0
4301 ; SKX-NEXT:    vpacksswb 32(%rdi), %ymm0, %ymm0
4302 ; SKX-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4303 ; SKX-NEXT:    retq
4304   %a0 = load <32 x i16>, ptr %p0
4305   %1 = icmp slt <32 x i16> %a0, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
4306   %2 = select <32 x i1> %1, <32 x i16> %a0, <32 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
4307   %3 = icmp sgt <32 x i16> %2, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
4308   %4 = select <32 x i1> %3, <32 x i16> %2, <32 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
4309   %5 = trunc <32 x i16> %4 to <32 x i8>
4310   ret <32 x i8> %5
4313 define <32 x i8> @trunc_ssat_v32i32_v32i8(ptr %p0) "min-legal-vector-width"="256" {
4314 ; SSE-LABEL: trunc_ssat_v32i32_v32i8:
4315 ; SSE:       # %bb.0:
4316 ; SSE-NEXT:    movdqa (%rdi), %xmm0
4317 ; SSE-NEXT:    movdqa 32(%rdi), %xmm2
4318 ; SSE-NEXT:    movdqa 64(%rdi), %xmm1
4319 ; SSE-NEXT:    movdqa 96(%rdi), %xmm3
4320 ; SSE-NEXT:    packssdw 48(%rdi), %xmm2
4321 ; SSE-NEXT:    packssdw 16(%rdi), %xmm0
4322 ; SSE-NEXT:    packsswb %xmm2, %xmm0
4323 ; SSE-NEXT:    packssdw 112(%rdi), %xmm3
4324 ; SSE-NEXT:    packssdw 80(%rdi), %xmm1
4325 ; SSE-NEXT:    packsswb %xmm3, %xmm1
4326 ; SSE-NEXT:    retq
4328 ; AVX1-LABEL: trunc_ssat_v32i32_v32i8:
4329 ; AVX1:       # %bb.0:
4330 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
4331 ; AVX1-NEXT:    vmovdqa 32(%rdi), %xmm1
4332 ; AVX1-NEXT:    vmovdqa 64(%rdi), %xmm2
4333 ; AVX1-NEXT:    vmovdqa 96(%rdi), %xmm3
4334 ; AVX1-NEXT:    vpackssdw 112(%rdi), %xmm3, %xmm3
4335 ; AVX1-NEXT:    vpackssdw 80(%rdi), %xmm2, %xmm2
4336 ; AVX1-NEXT:    vpacksswb %xmm3, %xmm2, %xmm2
4337 ; AVX1-NEXT:    vpackssdw 48(%rdi), %xmm1, %xmm1
4338 ; AVX1-NEXT:    vpackssdw 16(%rdi), %xmm0, %xmm0
4339 ; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
4340 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
4341 ; AVX1-NEXT:    retq
4343 ; AVX2-LABEL: trunc_ssat_v32i32_v32i8:
4344 ; AVX2:       # %bb.0:
4345 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
4346 ; AVX2-NEXT:    vmovdqa 64(%rdi), %ymm1
4347 ; AVX2-NEXT:    vpackssdw 96(%rdi), %ymm1, %ymm1
4348 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
4349 ; AVX2-NEXT:    vpackssdw 32(%rdi), %ymm0, %ymm0
4350 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4351 ; AVX2-NEXT:    vpacksswb %ymm1, %ymm0, %ymm0
4352 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4353 ; AVX2-NEXT:    retq
4355 ; AVX512-LABEL: trunc_ssat_v32i32_v32i8:
4356 ; AVX512:       # %bb.0:
4357 ; AVX512-NEXT:    vmovdqa64 (%rdi), %zmm0
4358 ; AVX512-NEXT:    vmovdqa64 64(%rdi), %zmm1
4359 ; AVX512-NEXT:    vpmovsdb %zmm0, %xmm0
4360 ; AVX512-NEXT:    vpmovsdb %zmm1, %xmm1
4361 ; AVX512-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
4362 ; AVX512-NEXT:    retq
4364 ; SKX-LABEL: trunc_ssat_v32i32_v32i8:
4365 ; SKX:       # %bb.0:
4366 ; SKX-NEXT:    vmovdqa (%rdi), %ymm0
4367 ; SKX-NEXT:    vmovdqa 64(%rdi), %ymm1
4368 ; SKX-NEXT:    vpackssdw 96(%rdi), %ymm1, %ymm1
4369 ; SKX-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
4370 ; SKX-NEXT:    vpackssdw 32(%rdi), %ymm0, %ymm0
4371 ; SKX-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4372 ; SKX-NEXT:    vpacksswb %ymm1, %ymm0, %ymm0
4373 ; SKX-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
4374 ; SKX-NEXT:    retq
4375   %a0 = load <32 x i32>, ptr %p0
4376   %1 = icmp slt <32 x i32> %a0, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
4377   %2 = select <32 x i1> %1, <32 x i32> %a0, <32 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
4378   %3 = icmp sgt <32 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
4379   %4 = select <32 x i1> %3, <32 x i32> %2, <32 x i32> <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
4380   %5 = trunc <32 x i32> %4 to <32 x i8>
4381   ret <32 x i8> %5
4384 ; This used to crash with avx512 due because we were missing a check for
4385 ; unsupported element types like i24.
4386 define void @trunc_ssat_v16i32_v16i24(<16 x i32> %x, ptr %y) nounwind {
4387 ; SSE2-SSSE3-LABEL: trunc_ssat_v16i32_v16i24:
4388 ; SSE2-SSSE3:       # %bb.0:
4389 ; SSE2-SSSE3-NEXT:    pushq %rbp
4390 ; SSE2-SSSE3-NEXT:    pushq %r15
4391 ; SSE2-SSSE3-NEXT:    pushq %r14
4392 ; SSE2-SSSE3-NEXT:    pushq %r12
4393 ; SSE2-SSSE3-NEXT:    pushq %rbx
4394 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [8388607,8388607,8388607,8388607]
4395 ; SSE2-SSSE3-NEXT:    movdqa %xmm5, %xmm4
4396 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm3, %xmm4
4397 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm3
4398 ; SSE2-SSSE3-NEXT:    pandn %xmm5, %xmm4
4399 ; SSE2-SSSE3-NEXT:    por %xmm3, %xmm4
4400 ; SSE2-SSSE3-NEXT:    movdqa %xmm5, %xmm3
4401 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
4402 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm2
4403 ; SSE2-SSSE3-NEXT:    pandn %xmm5, %xmm3
4404 ; SSE2-SSSE3-NEXT:    por %xmm2, %xmm3
4405 ; SSE2-SSSE3-NEXT:    movdqa %xmm5, %xmm2
4406 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
4407 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm1
4408 ; SSE2-SSSE3-NEXT:    pandn %xmm5, %xmm2
4409 ; SSE2-SSSE3-NEXT:    por %xmm1, %xmm2
4410 ; SSE2-SSSE3-NEXT:    movdqa %xmm5, %xmm1
4411 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm0, %xmm1
4412 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm0
4413 ; SSE2-SSSE3-NEXT:    pandn %xmm5, %xmm1
4414 ; SSE2-SSSE3-NEXT:    por %xmm0, %xmm1
4415 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [4286578688,4286578688,4286578688,4286578688]
4416 ; SSE2-SSSE3-NEXT:    movdqa %xmm1, %xmm0
4417 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm5, %xmm0
4418 ; SSE2-SSSE3-NEXT:    pand %xmm0, %xmm1
4419 ; SSE2-SSSE3-NEXT:    pandn %xmm5, %xmm0
4420 ; SSE2-SSSE3-NEXT:    por %xmm1, %xmm0
4421 ; SSE2-SSSE3-NEXT:    movdqa %xmm2, %xmm1
4422 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm5, %xmm1
4423 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm2
4424 ; SSE2-SSSE3-NEXT:    pandn %xmm5, %xmm1
4425 ; SSE2-SSSE3-NEXT:    por %xmm2, %xmm1
4426 ; SSE2-SSSE3-NEXT:    movdqa %xmm3, %xmm2
4427 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm5, %xmm2
4428 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm3
4429 ; SSE2-SSSE3-NEXT:    pandn %xmm5, %xmm2
4430 ; SSE2-SSSE3-NEXT:    por %xmm3, %xmm2
4431 ; SSE2-SSSE3-NEXT:    movdqa %xmm4, %xmm3
4432 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm5, %xmm3
4433 ; SSE2-SSSE3-NEXT:    pand %xmm3, %xmm4
4434 ; SSE2-SSSE3-NEXT:    pandn %xmm5, %xmm3
4435 ; SSE2-SSSE3-NEXT:    por %xmm4, %xmm3
4436 ; SSE2-SSSE3-NEXT:    movd %xmm3, %r8d
4437 ; SSE2-SSSE3-NEXT:    movw %r8w, 36(%rdi)
4438 ; SSE2-SSSE3-NEXT:    movd %xmm2, %r11d
4439 ; SSE2-SSSE3-NEXT:    movw %r11w, 24(%rdi)
4440 ; SSE2-SSSE3-NEXT:    movd %xmm1, %r14d
4441 ; SSE2-SSSE3-NEXT:    movw %r14w, 12(%rdi)
4442 ; SSE2-SSSE3-NEXT:    movd %xmm0, %eax
4443 ; SSE2-SSSE3-NEXT:    movw %ax, (%rdi)
4444 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[3,3,3,3]
4445 ; SSE2-SSSE3-NEXT:    movd %xmm4, %ecx
4446 ; SSE2-SSSE3-NEXT:    movw %cx, 45(%rdi)
4447 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[2,3,2,3]
4448 ; SSE2-SSSE3-NEXT:    movd %xmm4, %edx
4449 ; SSE2-SSSE3-NEXT:    movw %dx, 42(%rdi)
4450 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,1,1]
4451 ; SSE2-SSSE3-NEXT:    movd %xmm3, %esi
4452 ; SSE2-SSSE3-NEXT:    movw %si, 39(%rdi)
4453 ; SSE2-SSSE3-NEXT:    shrl $16, %r8d
4454 ; SSE2-SSSE3-NEXT:    movb %r8b, 38(%rdi)
4455 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[3,3,3,3]
4456 ; SSE2-SSSE3-NEXT:    movd %xmm3, %r8d
4457 ; SSE2-SSSE3-NEXT:    movw %r8w, 33(%rdi)
4458 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[2,3,2,3]
4459 ; SSE2-SSSE3-NEXT:    movd %xmm3, %r9d
4460 ; SSE2-SSSE3-NEXT:    movw %r9w, 30(%rdi)
4461 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,1,1]
4462 ; SSE2-SSSE3-NEXT:    movd %xmm2, %r10d
4463 ; SSE2-SSSE3-NEXT:    movw %r10w, 27(%rdi)
4464 ; SSE2-SSSE3-NEXT:    shrl $16, %r11d
4465 ; SSE2-SSSE3-NEXT:    movb %r11b, 26(%rdi)
4466 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]
4467 ; SSE2-SSSE3-NEXT:    movd %xmm2, %r11d
4468 ; SSE2-SSSE3-NEXT:    movw %r11w, 21(%rdi)
4469 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
4470 ; SSE2-SSSE3-NEXT:    movd %xmm2, %ebx
4471 ; SSE2-SSSE3-NEXT:    movw %bx, 18(%rdi)
4472 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]
4473 ; SSE2-SSSE3-NEXT:    movd %xmm1, %ebp
4474 ; SSE2-SSSE3-NEXT:    movw %bp, 15(%rdi)
4475 ; SSE2-SSSE3-NEXT:    shrl $16, %r14d
4476 ; SSE2-SSSE3-NEXT:    movb %r14b, 14(%rdi)
4477 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]
4478 ; SSE2-SSSE3-NEXT:    movd %xmm1, %r14d
4479 ; SSE2-SSSE3-NEXT:    movw %r14w, 9(%rdi)
4480 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
4481 ; SSE2-SSSE3-NEXT:    movd %xmm1, %r15d
4482 ; SSE2-SSSE3-NEXT:    movw %r15w, 6(%rdi)
4483 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
4484 ; SSE2-SSSE3-NEXT:    movd %xmm0, %r12d
4485 ; SSE2-SSSE3-NEXT:    movw %r12w, 3(%rdi)
4486 ; SSE2-SSSE3-NEXT:    shrl $16, %eax
4487 ; SSE2-SSSE3-NEXT:    movb %al, 2(%rdi)
4488 ; SSE2-SSSE3-NEXT:    shrl $16, %ecx
4489 ; SSE2-SSSE3-NEXT:    movb %cl, 47(%rdi)
4490 ; SSE2-SSSE3-NEXT:    shrl $16, %edx
4491 ; SSE2-SSSE3-NEXT:    movb %dl, 44(%rdi)
4492 ; SSE2-SSSE3-NEXT:    shrl $16, %esi
4493 ; SSE2-SSSE3-NEXT:    movb %sil, 41(%rdi)
4494 ; SSE2-SSSE3-NEXT:    shrl $16, %r8d
4495 ; SSE2-SSSE3-NEXT:    movb %r8b, 35(%rdi)
4496 ; SSE2-SSSE3-NEXT:    shrl $16, %r9d
4497 ; SSE2-SSSE3-NEXT:    movb %r9b, 32(%rdi)
4498 ; SSE2-SSSE3-NEXT:    shrl $16, %r10d
4499 ; SSE2-SSSE3-NEXT:    movb %r10b, 29(%rdi)
4500 ; SSE2-SSSE3-NEXT:    shrl $16, %r11d
4501 ; SSE2-SSSE3-NEXT:    movb %r11b, 23(%rdi)
4502 ; SSE2-SSSE3-NEXT:    shrl $16, %ebx
4503 ; SSE2-SSSE3-NEXT:    movb %bl, 20(%rdi)
4504 ; SSE2-SSSE3-NEXT:    shrl $16, %ebp
4505 ; SSE2-SSSE3-NEXT:    movb %bpl, 17(%rdi)
4506 ; SSE2-SSSE3-NEXT:    shrl $16, %r14d
4507 ; SSE2-SSSE3-NEXT:    movb %r14b, 11(%rdi)
4508 ; SSE2-SSSE3-NEXT:    shrl $16, %r15d
4509 ; SSE2-SSSE3-NEXT:    movb %r15b, 8(%rdi)
4510 ; SSE2-SSSE3-NEXT:    shrl $16, %r12d
4511 ; SSE2-SSSE3-NEXT:    movb %r12b, 5(%rdi)
4512 ; SSE2-SSSE3-NEXT:    popq %rbx
4513 ; SSE2-SSSE3-NEXT:    popq %r12
4514 ; SSE2-SSSE3-NEXT:    popq %r14
4515 ; SSE2-SSSE3-NEXT:    popq %r15
4516 ; SSE2-SSSE3-NEXT:    popq %rbp
4517 ; SSE2-SSSE3-NEXT:    retq
4519 ; SSE41-LABEL: trunc_ssat_v16i32_v16i24:
4520 ; SSE41:       # %bb.0:
4521 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [8388607,8388607,8388607,8388607]
4522 ; SSE41-NEXT:    pminsd %xmm4, %xmm3
4523 ; SSE41-NEXT:    pminsd %xmm4, %xmm2
4524 ; SSE41-NEXT:    pminsd %xmm4, %xmm1
4525 ; SSE41-NEXT:    pminsd %xmm4, %xmm0
4526 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [4286578688,4286578688,4286578688,4286578688]
4527 ; SSE41-NEXT:    pmaxsd %xmm4, %xmm0
4528 ; SSE41-NEXT:    pmaxsd %xmm4, %xmm1
4529 ; SSE41-NEXT:    pmaxsd %xmm4, %xmm2
4530 ; SSE41-NEXT:    pmaxsd %xmm4, %xmm3
4531 ; SSE41-NEXT:    pextrd $3, %xmm3, %eax
4532 ; SSE41-NEXT:    movw %ax, 45(%rdi)
4533 ; SSE41-NEXT:    shrl $16, %eax
4534 ; SSE41-NEXT:    movb %al, 47(%rdi)
4535 ; SSE41-NEXT:    pextrd $2, %xmm3, %eax
4536 ; SSE41-NEXT:    movw %ax, 42(%rdi)
4537 ; SSE41-NEXT:    shrl $16, %eax
4538 ; SSE41-NEXT:    movb %al, 44(%rdi)
4539 ; SSE41-NEXT:    pextrd $1, %xmm3, %eax
4540 ; SSE41-NEXT:    movw %ax, 39(%rdi)
4541 ; SSE41-NEXT:    shrl $16, %eax
4542 ; SSE41-NEXT:    movb %al, 41(%rdi)
4543 ; SSE41-NEXT:    movd %xmm3, %eax
4544 ; SSE41-NEXT:    movw %ax, 36(%rdi)
4545 ; SSE41-NEXT:    shrl $16, %eax
4546 ; SSE41-NEXT:    movb %al, 38(%rdi)
4547 ; SSE41-NEXT:    pextrd $3, %xmm2, %eax
4548 ; SSE41-NEXT:    movw %ax, 33(%rdi)
4549 ; SSE41-NEXT:    shrl $16, %eax
4550 ; SSE41-NEXT:    movb %al, 35(%rdi)
4551 ; SSE41-NEXT:    pextrd $2, %xmm2, %eax
4552 ; SSE41-NEXT:    movw %ax, 30(%rdi)
4553 ; SSE41-NEXT:    shrl $16, %eax
4554 ; SSE41-NEXT:    movb %al, 32(%rdi)
4555 ; SSE41-NEXT:    pextrd $1, %xmm2, %eax
4556 ; SSE41-NEXT:    movw %ax, 27(%rdi)
4557 ; SSE41-NEXT:    shrl $16, %eax
4558 ; SSE41-NEXT:    movb %al, 29(%rdi)
4559 ; SSE41-NEXT:    movd %xmm2, %eax
4560 ; SSE41-NEXT:    movw %ax, 24(%rdi)
4561 ; SSE41-NEXT:    shrl $16, %eax
4562 ; SSE41-NEXT:    movb %al, 26(%rdi)
4563 ; SSE41-NEXT:    pextrd $3, %xmm1, %eax
4564 ; SSE41-NEXT:    movw %ax, 21(%rdi)
4565 ; SSE41-NEXT:    shrl $16, %eax
4566 ; SSE41-NEXT:    movb %al, 23(%rdi)
4567 ; SSE41-NEXT:    pextrd $2, %xmm1, %eax
4568 ; SSE41-NEXT:    movw %ax, 18(%rdi)
4569 ; SSE41-NEXT:    shrl $16, %eax
4570 ; SSE41-NEXT:    movb %al, 20(%rdi)
4571 ; SSE41-NEXT:    pextrd $1, %xmm1, %eax
4572 ; SSE41-NEXT:    movw %ax, 15(%rdi)
4573 ; SSE41-NEXT:    shrl $16, %eax
4574 ; SSE41-NEXT:    movb %al, 17(%rdi)
4575 ; SSE41-NEXT:    movd %xmm1, %eax
4576 ; SSE41-NEXT:    movw %ax, 12(%rdi)
4577 ; SSE41-NEXT:    shrl $16, %eax
4578 ; SSE41-NEXT:    movb %al, 14(%rdi)
4579 ; SSE41-NEXT:    pextrd $3, %xmm0, %eax
4580 ; SSE41-NEXT:    movw %ax, 9(%rdi)
4581 ; SSE41-NEXT:    shrl $16, %eax
4582 ; SSE41-NEXT:    movb %al, 11(%rdi)
4583 ; SSE41-NEXT:    pextrd $2, %xmm0, %eax
4584 ; SSE41-NEXT:    movw %ax, 6(%rdi)
4585 ; SSE41-NEXT:    shrl $16, %eax
4586 ; SSE41-NEXT:    movb %al, 8(%rdi)
4587 ; SSE41-NEXT:    pextrd $1, %xmm0, %eax
4588 ; SSE41-NEXT:    movw %ax, 3(%rdi)
4589 ; SSE41-NEXT:    shrl $16, %eax
4590 ; SSE41-NEXT:    movb %al, 5(%rdi)
4591 ; SSE41-NEXT:    movd %xmm0, %eax
4592 ; SSE41-NEXT:    movw %ax, (%rdi)
4593 ; SSE41-NEXT:    shrl $16, %eax
4594 ; SSE41-NEXT:    movb %al, 2(%rdi)
4595 ; SSE41-NEXT:    retq
4597 ; AVX1-LABEL: trunc_ssat_v16i32_v16i24:
4598 ; AVX1:       # %bb.0:
4599 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
4600 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [8388607,8388607,8388607,8388607]
4601 ; AVX1-NEXT:    vpminsd %xmm3, %xmm2, %xmm4
4602 ; AVX1-NEXT:    vpminsd %xmm3, %xmm1, %xmm2
4603 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
4604 ; AVX1-NEXT:    vpminsd %xmm3, %xmm1, %xmm1
4605 ; AVX1-NEXT:    vpminsd %xmm3, %xmm0, %xmm0
4606 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm3 = [4286578688,4286578688,4286578688,4286578688]
4607 ; AVX1-NEXT:    vpmaxsd %xmm3, %xmm0, %xmm0
4608 ; AVX1-NEXT:    vpmaxsd %xmm3, %xmm1, %xmm1
4609 ; AVX1-NEXT:    vpmaxsd %xmm3, %xmm2, %xmm2
4610 ; AVX1-NEXT:    vpmaxsd %xmm3, %xmm4, %xmm3
4611 ; AVX1-NEXT:    vpextrd $3, %xmm3, %eax
4612 ; AVX1-NEXT:    movw %ax, 45(%rdi)
4613 ; AVX1-NEXT:    shrl $16, %eax
4614 ; AVX1-NEXT:    movb %al, 47(%rdi)
4615 ; AVX1-NEXT:    vpextrd $2, %xmm3, %eax
4616 ; AVX1-NEXT:    movw %ax, 42(%rdi)
4617 ; AVX1-NEXT:    shrl $16, %eax
4618 ; AVX1-NEXT:    movb %al, 44(%rdi)
4619 ; AVX1-NEXT:    vpextrd $1, %xmm3, %eax
4620 ; AVX1-NEXT:    movw %ax, 39(%rdi)
4621 ; AVX1-NEXT:    shrl $16, %eax
4622 ; AVX1-NEXT:    movb %al, 41(%rdi)
4623 ; AVX1-NEXT:    vmovd %xmm3, %eax
4624 ; AVX1-NEXT:    movw %ax, 36(%rdi)
4625 ; AVX1-NEXT:    shrl $16, %eax
4626 ; AVX1-NEXT:    movb %al, 38(%rdi)
4627 ; AVX1-NEXT:    vpextrd $3, %xmm2, %eax
4628 ; AVX1-NEXT:    movw %ax, 33(%rdi)
4629 ; AVX1-NEXT:    shrl $16, %eax
4630 ; AVX1-NEXT:    movb %al, 35(%rdi)
4631 ; AVX1-NEXT:    vpextrd $2, %xmm2, %eax
4632 ; AVX1-NEXT:    movw %ax, 30(%rdi)
4633 ; AVX1-NEXT:    shrl $16, %eax
4634 ; AVX1-NEXT:    movb %al, 32(%rdi)
4635 ; AVX1-NEXT:    vpextrd $1, %xmm2, %eax
4636 ; AVX1-NEXT:    movw %ax, 27(%rdi)
4637 ; AVX1-NEXT:    shrl $16, %eax
4638 ; AVX1-NEXT:    movb %al, 29(%rdi)
4639 ; AVX1-NEXT:    vmovd %xmm2, %eax
4640 ; AVX1-NEXT:    movw %ax, 24(%rdi)
4641 ; AVX1-NEXT:    shrl $16, %eax
4642 ; AVX1-NEXT:    movb %al, 26(%rdi)
4643 ; AVX1-NEXT:    vpextrd $3, %xmm1, %eax
4644 ; AVX1-NEXT:    movw %ax, 21(%rdi)
4645 ; AVX1-NEXT:    shrl $16, %eax
4646 ; AVX1-NEXT:    movb %al, 23(%rdi)
4647 ; AVX1-NEXT:    vpextrd $2, %xmm1, %eax
4648 ; AVX1-NEXT:    movw %ax, 18(%rdi)
4649 ; AVX1-NEXT:    shrl $16, %eax
4650 ; AVX1-NEXT:    movb %al, 20(%rdi)
4651 ; AVX1-NEXT:    vpextrd $1, %xmm1, %eax
4652 ; AVX1-NEXT:    movw %ax, 15(%rdi)
4653 ; AVX1-NEXT:    shrl $16, %eax
4654 ; AVX1-NEXT:    movb %al, 17(%rdi)
4655 ; AVX1-NEXT:    vmovd %xmm1, %eax
4656 ; AVX1-NEXT:    movw %ax, 12(%rdi)
4657 ; AVX1-NEXT:    shrl $16, %eax
4658 ; AVX1-NEXT:    movb %al, 14(%rdi)
4659 ; AVX1-NEXT:    vpextrd $3, %xmm0, %eax
4660 ; AVX1-NEXT:    movw %ax, 9(%rdi)
4661 ; AVX1-NEXT:    shrl $16, %eax
4662 ; AVX1-NEXT:    movb %al, 11(%rdi)
4663 ; AVX1-NEXT:    vpextrd $2, %xmm0, %eax
4664 ; AVX1-NEXT:    movw %ax, 6(%rdi)
4665 ; AVX1-NEXT:    shrl $16, %eax
4666 ; AVX1-NEXT:    movb %al, 8(%rdi)
4667 ; AVX1-NEXT:    vpextrd $1, %xmm0, %eax
4668 ; AVX1-NEXT:    movw %ax, 3(%rdi)
4669 ; AVX1-NEXT:    shrl $16, %eax
4670 ; AVX1-NEXT:    movb %al, 5(%rdi)
4671 ; AVX1-NEXT:    vmovd %xmm0, %eax
4672 ; AVX1-NEXT:    movw %ax, (%rdi)
4673 ; AVX1-NEXT:    shrl $16, %eax
4674 ; AVX1-NEXT:    movb %al, 2(%rdi)
4675 ; AVX1-NEXT:    vzeroupper
4676 ; AVX1-NEXT:    retq
4678 ; AVX2-LABEL: trunc_ssat_v16i32_v16i24:
4679 ; AVX2:       # %bb.0:
4680 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [8388607,8388607,8388607,8388607,8388607,8388607,8388607,8388607]
4681 ; AVX2-NEXT:    vpminsd %ymm2, %ymm1, %ymm1
4682 ; AVX2-NEXT:    vpminsd %ymm2, %ymm0, %ymm0
4683 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [4286578688,4286578688,4286578688,4286578688,4286578688,4286578688,4286578688,4286578688]
4684 ; AVX2-NEXT:    vpmaxsd %ymm2, %ymm0, %ymm0
4685 ; AVX2-NEXT:    vpmaxsd %ymm2, %ymm1, %ymm1
4686 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
4687 ; AVX2-NEXT:    vpextrd $3, %xmm2, %eax
4688 ; AVX2-NEXT:    movw %ax, 45(%rdi)
4689 ; AVX2-NEXT:    shrl $16, %eax
4690 ; AVX2-NEXT:    movb %al, 47(%rdi)
4691 ; AVX2-NEXT:    vpextrd $2, %xmm2, %eax
4692 ; AVX2-NEXT:    movw %ax, 42(%rdi)
4693 ; AVX2-NEXT:    shrl $16, %eax
4694 ; AVX2-NEXT:    movb %al, 44(%rdi)
4695 ; AVX2-NEXT:    vpextrd $1, %xmm2, %eax
4696 ; AVX2-NEXT:    movw %ax, 39(%rdi)
4697 ; AVX2-NEXT:    shrl $16, %eax
4698 ; AVX2-NEXT:    movb %al, 41(%rdi)
4699 ; AVX2-NEXT:    vmovd %xmm2, %eax
4700 ; AVX2-NEXT:    movw %ax, 36(%rdi)
4701 ; AVX2-NEXT:    shrl $16, %eax
4702 ; AVX2-NEXT:    movb %al, 38(%rdi)
4703 ; AVX2-NEXT:    vpextrd $3, %xmm1, %eax
4704 ; AVX2-NEXT:    movw %ax, 33(%rdi)
4705 ; AVX2-NEXT:    shrl $16, %eax
4706 ; AVX2-NEXT:    movb %al, 35(%rdi)
4707 ; AVX2-NEXT:    vpextrd $2, %xmm1, %eax
4708 ; AVX2-NEXT:    movw %ax, 30(%rdi)
4709 ; AVX2-NEXT:    shrl $16, %eax
4710 ; AVX2-NEXT:    movb %al, 32(%rdi)
4711 ; AVX2-NEXT:    vpextrd $1, %xmm1, %eax
4712 ; AVX2-NEXT:    movw %ax, 27(%rdi)
4713 ; AVX2-NEXT:    shrl $16, %eax
4714 ; AVX2-NEXT:    movb %al, 29(%rdi)
4715 ; AVX2-NEXT:    vmovd %xmm1, %eax
4716 ; AVX2-NEXT:    movw %ax, 24(%rdi)
4717 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
4718 ; AVX2-NEXT:    shrl $16, %eax
4719 ; AVX2-NEXT:    movb %al, 26(%rdi)
4720 ; AVX2-NEXT:    vpextrd $3, %xmm1, %eax
4721 ; AVX2-NEXT:    movw %ax, 21(%rdi)
4722 ; AVX2-NEXT:    shrl $16, %eax
4723 ; AVX2-NEXT:    movb %al, 23(%rdi)
4724 ; AVX2-NEXT:    vpextrd $2, %xmm1, %eax
4725 ; AVX2-NEXT:    movw %ax, 18(%rdi)
4726 ; AVX2-NEXT:    shrl $16, %eax
4727 ; AVX2-NEXT:    movb %al, 20(%rdi)
4728 ; AVX2-NEXT:    vpextrd $1, %xmm1, %eax
4729 ; AVX2-NEXT:    movw %ax, 15(%rdi)
4730 ; AVX2-NEXT:    shrl $16, %eax
4731 ; AVX2-NEXT:    movb %al, 17(%rdi)
4732 ; AVX2-NEXT:    vmovd %xmm1, %eax
4733 ; AVX2-NEXT:    movw %ax, 12(%rdi)
4734 ; AVX2-NEXT:    shrl $16, %eax
4735 ; AVX2-NEXT:    movb %al, 14(%rdi)
4736 ; AVX2-NEXT:    vpextrd $3, %xmm0, %eax
4737 ; AVX2-NEXT:    movw %ax, 9(%rdi)
4738 ; AVX2-NEXT:    shrl $16, %eax
4739 ; AVX2-NEXT:    movb %al, 11(%rdi)
4740 ; AVX2-NEXT:    vpextrd $2, %xmm0, %eax
4741 ; AVX2-NEXT:    movw %ax, 6(%rdi)
4742 ; AVX2-NEXT:    shrl $16, %eax
4743 ; AVX2-NEXT:    movb %al, 8(%rdi)
4744 ; AVX2-NEXT:    vpextrd $1, %xmm0, %eax
4745 ; AVX2-NEXT:    movw %ax, 3(%rdi)
4746 ; AVX2-NEXT:    shrl $16, %eax
4747 ; AVX2-NEXT:    movb %al, 5(%rdi)
4748 ; AVX2-NEXT:    vmovd %xmm0, %eax
4749 ; AVX2-NEXT:    movw %ax, (%rdi)
4750 ; AVX2-NEXT:    shrl $16, %eax
4751 ; AVX2-NEXT:    movb %al, 2(%rdi)
4752 ; AVX2-NEXT:    vzeroupper
4753 ; AVX2-NEXT:    retq
4755 ; AVX512-LABEL: trunc_ssat_v16i32_v16i24:
4756 ; AVX512:       # %bb.0:
4757 ; AVX512-NEXT:    pushq %rbp
4758 ; AVX512-NEXT:    pushq %r15
4759 ; AVX512-NEXT:    pushq %r14
4760 ; AVX512-NEXT:    pushq %rbx
4761 ; AVX512-NEXT:    vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
4762 ; AVX512-NEXT:    vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
4763 ; AVX512-NEXT:    vextracti32x4 $3, %zmm0, %xmm1
4764 ; AVX512-NEXT:    vpextrd $3, %xmm1, %r15d
4765 ; AVX512-NEXT:    movw %r15w, 45(%rdi)
4766 ; AVX512-NEXT:    vpextrd $2, %xmm1, %r14d
4767 ; AVX512-NEXT:    movw %r14w, 42(%rdi)
4768 ; AVX512-NEXT:    vpextrd $1, %xmm1, %ebp
4769 ; AVX512-NEXT:    movw %bp, 39(%rdi)
4770 ; AVX512-NEXT:    vmovd %xmm1, %r11d
4771 ; AVX512-NEXT:    movw %r11w, 36(%rdi)
4772 ; AVX512-NEXT:    vextracti32x4 $2, %zmm0, %xmm1
4773 ; AVX512-NEXT:    vpextrd $3, %xmm1, %ebx
4774 ; AVX512-NEXT:    movw %bx, 33(%rdi)
4775 ; AVX512-NEXT:    vpextrd $2, %xmm1, %r10d
4776 ; AVX512-NEXT:    movw %r10w, 30(%rdi)
4777 ; AVX512-NEXT:    vpextrd $1, %xmm1, %r9d
4778 ; AVX512-NEXT:    movw %r9w, 27(%rdi)
4779 ; AVX512-NEXT:    vmovd %xmm1, %r8d
4780 ; AVX512-NEXT:    movw %r8w, 24(%rdi)
4781 ; AVX512-NEXT:    vpextrd $3, %xmm0, %esi
4782 ; AVX512-NEXT:    movw %si, 9(%rdi)
4783 ; AVX512-NEXT:    vpextrd $2, %xmm0, %edx
4784 ; AVX512-NEXT:    movw %dx, 6(%rdi)
4785 ; AVX512-NEXT:    vpextrd $1, %xmm0, %ecx
4786 ; AVX512-NEXT:    movw %cx, 3(%rdi)
4787 ; AVX512-NEXT:    vmovd %xmm0, %eax
4788 ; AVX512-NEXT:    movw %ax, (%rdi)
4789 ; AVX512-NEXT:    shrl $16, %r15d
4790 ; AVX512-NEXT:    movb %r15b, 47(%rdi)
4791 ; AVX512-NEXT:    shrl $16, %r14d
4792 ; AVX512-NEXT:    movb %r14b, 44(%rdi)
4793 ; AVX512-NEXT:    shrl $16, %ebp
4794 ; AVX512-NEXT:    movb %bpl, 41(%rdi)
4795 ; AVX512-NEXT:    shrl $16, %r11d
4796 ; AVX512-NEXT:    movb %r11b, 38(%rdi)
4797 ; AVX512-NEXT:    shrl $16, %ebx
4798 ; AVX512-NEXT:    movb %bl, 35(%rdi)
4799 ; AVX512-NEXT:    shrl $16, %r10d
4800 ; AVX512-NEXT:    movb %r10b, 32(%rdi)
4801 ; AVX512-NEXT:    shrl $16, %r9d
4802 ; AVX512-NEXT:    movb %r9b, 29(%rdi)
4803 ; AVX512-NEXT:    shrl $16, %r8d
4804 ; AVX512-NEXT:    movb %r8b, 26(%rdi)
4805 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm0
4806 ; AVX512-NEXT:    vpextrd $3, %xmm0, %r11d
4807 ; AVX512-NEXT:    movw %r11w, 21(%rdi)
4808 ; AVX512-NEXT:    vpextrd $2, %xmm0, %r10d
4809 ; AVX512-NEXT:    movw %r10w, 18(%rdi)
4810 ; AVX512-NEXT:    vpextrd $1, %xmm0, %r9d
4811 ; AVX512-NEXT:    movw %r9w, 15(%rdi)
4812 ; AVX512-NEXT:    vmovd %xmm0, %r8d
4813 ; AVX512-NEXT:    movw %r8w, 12(%rdi)
4814 ; AVX512-NEXT:    shrl $16, %esi
4815 ; AVX512-NEXT:    movb %sil, 11(%rdi)
4816 ; AVX512-NEXT:    shrl $16, %edx
4817 ; AVX512-NEXT:    movb %dl, 8(%rdi)
4818 ; AVX512-NEXT:    shrl $16, %ecx
4819 ; AVX512-NEXT:    movb %cl, 5(%rdi)
4820 ; AVX512-NEXT:    shrl $16, %eax
4821 ; AVX512-NEXT:    movb %al, 2(%rdi)
4822 ; AVX512-NEXT:    shrl $16, %r11d
4823 ; AVX512-NEXT:    movb %r11b, 23(%rdi)
4824 ; AVX512-NEXT:    shrl $16, %r10d
4825 ; AVX512-NEXT:    movb %r10b, 20(%rdi)
4826 ; AVX512-NEXT:    shrl $16, %r9d
4827 ; AVX512-NEXT:    movb %r9b, 17(%rdi)
4828 ; AVX512-NEXT:    shrl $16, %r8d
4829 ; AVX512-NEXT:    movb %r8b, 14(%rdi)
4830 ; AVX512-NEXT:    popq %rbx
4831 ; AVX512-NEXT:    popq %r14
4832 ; AVX512-NEXT:    popq %r15
4833 ; AVX512-NEXT:    popq %rbp
4834 ; AVX512-NEXT:    vzeroupper
4835 ; AVX512-NEXT:    retq
4837 ; SKX-LABEL: trunc_ssat_v16i32_v16i24:
4838 ; SKX:       # %bb.0:
4839 ; SKX-NEXT:    pushq %rbp
4840 ; SKX-NEXT:    pushq %r15
4841 ; SKX-NEXT:    pushq %r14
4842 ; SKX-NEXT:    pushq %rbx
4843 ; SKX-NEXT:    vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
4844 ; SKX-NEXT:    vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
4845 ; SKX-NEXT:    vextracti32x4 $3, %zmm0, %xmm1
4846 ; SKX-NEXT:    vpextrd $3, %xmm1, %r15d
4847 ; SKX-NEXT:    movw %r15w, 45(%rdi)
4848 ; SKX-NEXT:    vpextrd $2, %xmm1, %r14d
4849 ; SKX-NEXT:    movw %r14w, 42(%rdi)
4850 ; SKX-NEXT:    vpextrd $1, %xmm1, %ebp
4851 ; SKX-NEXT:    movw %bp, 39(%rdi)
4852 ; SKX-NEXT:    vmovd %xmm1, %r11d
4853 ; SKX-NEXT:    movw %r11w, 36(%rdi)
4854 ; SKX-NEXT:    vextracti32x4 $2, %zmm0, %xmm1
4855 ; SKX-NEXT:    vpextrd $3, %xmm1, %ebx
4856 ; SKX-NEXT:    movw %bx, 33(%rdi)
4857 ; SKX-NEXT:    vpextrd $2, %xmm1, %r10d
4858 ; SKX-NEXT:    movw %r10w, 30(%rdi)
4859 ; SKX-NEXT:    vpextrd $1, %xmm1, %r9d
4860 ; SKX-NEXT:    movw %r9w, 27(%rdi)
4861 ; SKX-NEXT:    vmovd %xmm1, %r8d
4862 ; SKX-NEXT:    vpextrd $3, %xmm0, %edx
4863 ; SKX-NEXT:    movw %r8w, 24(%rdi)
4864 ; SKX-NEXT:    movw %dx, 9(%rdi)
4865 ; SKX-NEXT:    vpextrd $2, %xmm0, %esi
4866 ; SKX-NEXT:    vpextrd $1, %xmm0, %eax
4867 ; SKX-NEXT:    movw %si, 6(%rdi)
4868 ; SKX-NEXT:    movw %ax, 3(%rdi)
4869 ; SKX-NEXT:    vmovd %xmm0, %ecx
4870 ; SKX-NEXT:    movw %cx, (%rdi)
4871 ; SKX-NEXT:    shrl $16, %r15d
4872 ; SKX-NEXT:    movb %r15b, 47(%rdi)
4873 ; SKX-NEXT:    shrl $16, %r14d
4874 ; SKX-NEXT:    movb %r14b, 44(%rdi)
4875 ; SKX-NEXT:    shrl $16, %ebp
4876 ; SKX-NEXT:    movb %bpl, 41(%rdi)
4877 ; SKX-NEXT:    shrl $16, %r11d
4878 ; SKX-NEXT:    movb %r11b, 38(%rdi)
4879 ; SKX-NEXT:    shrl $16, %ebx
4880 ; SKX-NEXT:    movb %bl, 35(%rdi)
4881 ; SKX-NEXT:    shrl $16, %r10d
4882 ; SKX-NEXT:    movb %r10b, 32(%rdi)
4883 ; SKX-NEXT:    shrl $16, %r9d
4884 ; SKX-NEXT:    movb %r9b, 29(%rdi)
4885 ; SKX-NEXT:    shrl $16, %r8d
4886 ; SKX-NEXT:    movb %r8b, 26(%rdi)
4887 ; SKX-NEXT:    vextracti128 $1, %ymm0, %xmm0
4888 ; SKX-NEXT:    vpextrd $3, %xmm0, %r11d
4889 ; SKX-NEXT:    movw %r11w, 21(%rdi)
4890 ; SKX-NEXT:    vpextrd $2, %xmm0, %r10d
4891 ; SKX-NEXT:    movw %r10w, 18(%rdi)
4892 ; SKX-NEXT:    vpextrd $1, %xmm0, %r9d
4893 ; SKX-NEXT:    movw %r9w, 15(%rdi)
4894 ; SKX-NEXT:    vmovd %xmm0, %r8d
4895 ; SKX-NEXT:    movw %r8w, 12(%rdi)
4896 ; SKX-NEXT:    shrl $16, %edx
4897 ; SKX-NEXT:    movb %dl, 11(%rdi)
4898 ; SKX-NEXT:    shrl $16, %esi
4899 ; SKX-NEXT:    movb %sil, 8(%rdi)
4900 ; SKX-NEXT:    shrl $16, %eax
4901 ; SKX-NEXT:    movb %al, 5(%rdi)
4902 ; SKX-NEXT:    shrl $16, %ecx
4903 ; SKX-NEXT:    movb %cl, 2(%rdi)
4904 ; SKX-NEXT:    shrl $16, %r11d
4905 ; SKX-NEXT:    movb %r11b, 23(%rdi)
4906 ; SKX-NEXT:    shrl $16, %r10d
4907 ; SKX-NEXT:    movb %r10b, 20(%rdi)
4908 ; SKX-NEXT:    shrl $16, %r9d
4909 ; SKX-NEXT:    movb %r9b, 17(%rdi)
4910 ; SKX-NEXT:    shrl $16, %r8d
4911 ; SKX-NEXT:    movb %r8b, 14(%rdi)
4912 ; SKX-NEXT:    popq %rbx
4913 ; SKX-NEXT:    popq %r14
4914 ; SKX-NEXT:    popq %r15
4915 ; SKX-NEXT:    popq %rbp
4916 ; SKX-NEXT:    vzeroupper
4917 ; SKX-NEXT:    retq
4918   %a = call <16 x i32> @llvm.smin.v16i32(<16 x i32> %x, <16 x i32> <i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607, i32 8388607>)
4919   %b = call <16 x i32> @llvm.smax.v16i32(<16 x i32> %a, <16 x i32> <i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608, i32 -8388608>)
4920   %c = trunc <16 x i32> %b to <16 x i24>
4921   store <16 x i24> %c, ptr %y
4922   ret void
4924 declare <16 x i32> @llvm.smax.v16i32(<16 x i32>, <16 x i32>)
4925 declare <16 x i32> @llvm.smin.v16i32(<16 x i32>, <16 x i32>)