[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / X86 / vector-trunc-ssat-widen.ll
blob76c7b399d6a0f90b065b31c8f1bed9c338358628
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=SSE --check-prefix=SSSE3
4 ; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
5 ; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
6 ; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-SLOW
7 ; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST
8 ; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F
9 ; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL
10 ; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BW
11 ; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL
14 ; Signed saturation truncation to vXi32
17 define <4 x i32> @trunc_ssat_v4i64_v4i32(<4 x i64> %a0) {
18 ; SSE2-LABEL: trunc_ssat_v4i64_v4i32:
19 ; SSE2:       # %bb.0:
20 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483647,2147483647]
21 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
22 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
23 ; SSE2-NEXT:    pxor %xmm2, %xmm3
24 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [4294967295,4294967295]
25 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
26 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
27 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
28 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
29 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
30 ; SSE2-NEXT:    pand %xmm7, %xmm4
31 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
32 ; SSE2-NEXT:    por %xmm4, %xmm3
33 ; SSE2-NEXT:    pand %xmm3, %xmm0
34 ; SSE2-NEXT:    pandn %xmm8, %xmm3
35 ; SSE2-NEXT:    por %xmm0, %xmm3
36 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
37 ; SSE2-NEXT:    pxor %xmm2, %xmm0
38 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
39 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
40 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
41 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm0
42 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
43 ; SSE2-NEXT:    pand %xmm6, %xmm0
44 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
45 ; SSE2-NEXT:    por %xmm0, %xmm4
46 ; SSE2-NEXT:    pand %xmm4, %xmm1
47 ; SSE2-NEXT:    pandn %xmm8, %xmm4
48 ; SSE2-NEXT:    por %xmm1, %xmm4
49 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
50 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
51 ; SSE2-NEXT:    pxor %xmm2, %xmm0
52 ; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [18446744069414584320,18446744069414584320]
53 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
54 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
55 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
56 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm0
57 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
58 ; SSE2-NEXT:    pand %xmm7, %xmm0
59 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
60 ; SSE2-NEXT:    por %xmm0, %xmm6
61 ; SSE2-NEXT:    pand %xmm6, %xmm4
62 ; SSE2-NEXT:    pandn %xmm1, %xmm6
63 ; SSE2-NEXT:    por %xmm4, %xmm6
64 ; SSE2-NEXT:    pxor %xmm3, %xmm2
65 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
66 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm0
67 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
68 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm2
69 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
70 ; SSE2-NEXT:    pand %xmm4, %xmm2
71 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
72 ; SSE2-NEXT:    por %xmm2, %xmm0
73 ; SSE2-NEXT:    pand %xmm0, %xmm3
74 ; SSE2-NEXT:    pandn %xmm1, %xmm0
75 ; SSE2-NEXT:    por %xmm3, %xmm0
76 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm6[0,2]
77 ; SSE2-NEXT:    retq
79 ; SSSE3-LABEL: trunc_ssat_v4i64_v4i32:
80 ; SSSE3:       # %bb.0:
81 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [2147483647,2147483647]
82 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
83 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
84 ; SSSE3-NEXT:    pxor %xmm2, %xmm3
85 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [4294967295,4294967295]
86 ; SSSE3-NEXT:    movdqa %xmm5, %xmm6
87 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm6
88 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
89 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm3
90 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
91 ; SSSE3-NEXT:    pand %xmm7, %xmm4
92 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
93 ; SSSE3-NEXT:    por %xmm4, %xmm3
94 ; SSSE3-NEXT:    pand %xmm3, %xmm0
95 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
96 ; SSSE3-NEXT:    por %xmm0, %xmm3
97 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
98 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
99 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
100 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm4
101 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
102 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm0
103 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
104 ; SSSE3-NEXT:    pand %xmm6, %xmm0
105 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
106 ; SSSE3-NEXT:    por %xmm0, %xmm4
107 ; SSSE3-NEXT:    pand %xmm4, %xmm1
108 ; SSSE3-NEXT:    pandn %xmm8, %xmm4
109 ; SSSE3-NEXT:    por %xmm1, %xmm4
110 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
111 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
112 ; SSSE3-NEXT:    pxor %xmm2, %xmm0
113 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [18446744069414584320,18446744069414584320]
114 ; SSSE3-NEXT:    movdqa %xmm0, %xmm6
115 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm6
116 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
117 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm0
118 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
119 ; SSSE3-NEXT:    pand %xmm7, %xmm0
120 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
121 ; SSSE3-NEXT:    por %xmm0, %xmm6
122 ; SSSE3-NEXT:    pand %xmm6, %xmm4
123 ; SSSE3-NEXT:    pandn %xmm1, %xmm6
124 ; SSSE3-NEXT:    por %xmm4, %xmm6
125 ; SSSE3-NEXT:    pxor %xmm3, %xmm2
126 ; SSSE3-NEXT:    movdqa %xmm2, %xmm0
127 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm0
128 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
129 ; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm2
130 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
131 ; SSSE3-NEXT:    pand %xmm4, %xmm2
132 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
133 ; SSSE3-NEXT:    por %xmm2, %xmm0
134 ; SSSE3-NEXT:    pand %xmm0, %xmm3
135 ; SSSE3-NEXT:    pandn %xmm1, %xmm0
136 ; SSSE3-NEXT:    por %xmm3, %xmm0
137 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm6[0,2]
138 ; SSSE3-NEXT:    retq
140 ; SSE41-LABEL: trunc_ssat_v4i64_v4i32:
141 ; SSE41:       # %bb.0:
142 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
143 ; SSE41-NEXT:    movapd {{.*#+}} xmm4 = [2147483647,2147483647]
144 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
145 ; SSE41-NEXT:    pxor %xmm3, %xmm0
146 ; SSE41-NEXT:    movdqa {{.*#+}} xmm6 = [4294967295,4294967295]
147 ; SSE41-NEXT:    movdqa %xmm6, %xmm5
148 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
149 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
150 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm0
151 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
152 ; SSE41-NEXT:    pand %xmm7, %xmm0
153 ; SSE41-NEXT:    por %xmm5, %xmm0
154 ; SSE41-NEXT:    movapd %xmm4, %xmm5
155 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
156 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
157 ; SSE41-NEXT:    pxor %xmm3, %xmm0
158 ; SSE41-NEXT:    movdqa %xmm6, %xmm2
159 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
160 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[0,0,2,2]
161 ; SSE41-NEXT:    pcmpeqd %xmm6, %xmm0
162 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
163 ; SSE41-NEXT:    pand %xmm7, %xmm0
164 ; SSE41-NEXT:    por %xmm2, %xmm0
165 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
166 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
167 ; SSE41-NEXT:    movapd %xmm4, %xmm0
168 ; SSE41-NEXT:    xorpd %xmm3, %xmm0
169 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [18446744069414584320,18446744069414584320]
170 ; SSE41-NEXT:    movapd %xmm0, %xmm6
171 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm6
172 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
173 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm0
174 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
175 ; SSE41-NEXT:    pand %xmm7, %xmm0
176 ; SSE41-NEXT:    por %xmm6, %xmm0
177 ; SSE41-NEXT:    movapd %xmm1, %xmm6
178 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm6
179 ; SSE41-NEXT:    xorpd %xmm5, %xmm3
180 ; SSE41-NEXT:    movapd %xmm3, %xmm4
181 ; SSE41-NEXT:    pcmpgtd %xmm2, %xmm4
182 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
183 ; SSE41-NEXT:    pcmpeqd %xmm2, %xmm3
184 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
185 ; SSE41-NEXT:    pand %xmm7, %xmm0
186 ; SSE41-NEXT:    por %xmm4, %xmm0
187 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
188 ; SSE41-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm6[0,2]
189 ; SSE41-NEXT:    movaps %xmm1, %xmm0
190 ; SSE41-NEXT:    retq
192 ; AVX1-LABEL: trunc_ssat_v4i64_v4i32:
193 ; AVX1:       # %bb.0:
194 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
195 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [2147483647,2147483647]
196 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm3
197 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm4
198 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm0, %xmm2, %xmm0
199 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [18446744071562067968,18446744071562067968]
200 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm0, %xmm5
201 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm1, %xmm2, %xmm1
202 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm1, %xmm2
203 ; AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm4, %xmm1
204 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
205 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
206 ; AVX1-NEXT:    vzeroupper
207 ; AVX1-NEXT:    retq
209 ; AVX2-SLOW-LABEL: trunc_ssat_v4i64_v4i32:
210 ; AVX2-SLOW:       # %bb.0:
211 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [2147483647,2147483647,2147483647,2147483647]
212 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
213 ; AVX2-SLOW-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
214 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
215 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
216 ; AVX2-SLOW-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
217 ; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1
218 ; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
219 ; AVX2-SLOW-NEXT:    vzeroupper
220 ; AVX2-SLOW-NEXT:    retq
222 ; AVX2-FAST-LABEL: trunc_ssat_v4i64_v4i32:
223 ; AVX2-FAST:       # %bb.0:
224 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [2147483647,2147483647,2147483647,2147483647]
225 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
226 ; AVX2-FAST-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
227 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
228 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
229 ; AVX2-FAST-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
230 ; AVX2-FAST-NEXT:    vmovapd {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7]
231 ; AVX2-FAST-NEXT:    vpermps %ymm0, %ymm1, %ymm0
232 ; AVX2-FAST-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
233 ; AVX2-FAST-NEXT:    vzeroupper
234 ; AVX2-FAST-NEXT:    retq
236 ; AVX512F-LABEL: trunc_ssat_v4i64_v4i32:
237 ; AVX512F:       # %bb.0:
238 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
239 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [2147483647,2147483647,2147483647,2147483647]
240 ; AVX512F-NEXT:    vpminsq %zmm1, %zmm0, %zmm0
241 ; AVX512F-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
242 ; AVX512F-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
243 ; AVX512F-NEXT:    vpmovqd %zmm0, %ymm0
244 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
245 ; AVX512F-NEXT:    vzeroupper
246 ; AVX512F-NEXT:    retq
248 ; AVX512VL-LABEL: trunc_ssat_v4i64_v4i32:
249 ; AVX512VL:       # %bb.0:
250 ; AVX512VL-NEXT:    vpmovsqd %ymm0, %xmm0
251 ; AVX512VL-NEXT:    vzeroupper
252 ; AVX512VL-NEXT:    retq
254 ; AVX512BW-LABEL: trunc_ssat_v4i64_v4i32:
255 ; AVX512BW:       # %bb.0:
256 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
257 ; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [2147483647,2147483647,2147483647,2147483647]
258 ; AVX512BW-NEXT:    vpminsq %zmm1, %zmm0, %zmm0
259 ; AVX512BW-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
260 ; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
261 ; AVX512BW-NEXT:    vpmovqd %zmm0, %ymm0
262 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
263 ; AVX512BW-NEXT:    vzeroupper
264 ; AVX512BW-NEXT:    retq
266 ; AVX512BWVL-LABEL: trunc_ssat_v4i64_v4i32:
267 ; AVX512BWVL:       # %bb.0:
268 ; AVX512BWVL-NEXT:    vpmovsqd %ymm0, %xmm0
269 ; AVX512BWVL-NEXT:    vzeroupper
270 ; AVX512BWVL-NEXT:    retq
271   %1 = icmp slt <4 x i64> %a0, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
272   %2 = select <4 x i1> %1, <4 x i64> %a0, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
273   %3 = icmp sgt <4 x i64> %2, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
274   %4 = select <4 x i1> %3, <4 x i64> %2, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
275   %5 = trunc <4 x i64> %4 to <4 x i32>
276   ret <4 x i32> %5
280 define <8 x i32> @trunc_ssat_v8i64_v8i32(<8 x i64> %a0) {
281 ; SSE2-LABEL: trunc_ssat_v8i64_v8i32:
282 ; SSE2:       # %bb.0:
283 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483647,2147483647]
284 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
285 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
286 ; SSE2-NEXT:    pxor %xmm4, %xmm5
287 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [4294967295,4294967295]
288 ; SSE2-NEXT:    movdqa %xmm9, %xmm7
289 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
290 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
291 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm5
292 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
293 ; SSE2-NEXT:    pand %xmm10, %xmm6
294 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
295 ; SSE2-NEXT:    por %xmm6, %xmm5
296 ; SSE2-NEXT:    pand %xmm5, %xmm0
297 ; SSE2-NEXT:    pandn %xmm8, %xmm5
298 ; SSE2-NEXT:    por %xmm0, %xmm5
299 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
300 ; SSE2-NEXT:    pxor %xmm4, %xmm0
301 ; SSE2-NEXT:    movdqa %xmm9, %xmm6
302 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
303 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
304 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
305 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
306 ; SSE2-NEXT:    pand %xmm10, %xmm7
307 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
308 ; SSE2-NEXT:    por %xmm7, %xmm0
309 ; SSE2-NEXT:    pand %xmm0, %xmm1
310 ; SSE2-NEXT:    pandn %xmm8, %xmm0
311 ; SSE2-NEXT:    por %xmm1, %xmm0
312 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
313 ; SSE2-NEXT:    pxor %xmm4, %xmm1
314 ; SSE2-NEXT:    movdqa %xmm9, %xmm6
315 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm6
316 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
317 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
318 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
319 ; SSE2-NEXT:    pand %xmm7, %xmm1
320 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
321 ; SSE2-NEXT:    por %xmm1, %xmm7
322 ; SSE2-NEXT:    pand %xmm7, %xmm2
323 ; SSE2-NEXT:    pandn %xmm8, %xmm7
324 ; SSE2-NEXT:    por %xmm2, %xmm7
325 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
326 ; SSE2-NEXT:    pxor %xmm4, %xmm1
327 ; SSE2-NEXT:    movdqa %xmm9, %xmm2
328 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
329 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
330 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
331 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
332 ; SSE2-NEXT:    pand %xmm6, %xmm1
333 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[1,1,3,3]
334 ; SSE2-NEXT:    por %xmm1, %xmm6
335 ; SSE2-NEXT:    pand %xmm6, %xmm3
336 ; SSE2-NEXT:    pandn %xmm8, %xmm6
337 ; SSE2-NEXT:    por %xmm3, %xmm6
338 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [18446744071562067968,18446744071562067968]
339 ; SSE2-NEXT:    movdqa %xmm6, %xmm1
340 ; SSE2-NEXT:    pxor %xmm4, %xmm1
341 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [18446744069414584320,18446744069414584320]
342 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
343 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm2
344 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
345 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
346 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
347 ; SSE2-NEXT:    pand %xmm3, %xmm1
348 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
349 ; SSE2-NEXT:    por %xmm1, %xmm2
350 ; SSE2-NEXT:    pand %xmm2, %xmm6
351 ; SSE2-NEXT:    pandn %xmm8, %xmm2
352 ; SSE2-NEXT:    por %xmm6, %xmm2
353 ; SSE2-NEXT:    movdqa %xmm7, %xmm1
354 ; SSE2-NEXT:    pxor %xmm4, %xmm1
355 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
356 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm3
357 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm3[0,0,2,2]
358 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
359 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
360 ; SSE2-NEXT:    pand %xmm10, %xmm6
361 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
362 ; SSE2-NEXT:    por %xmm6, %xmm1
363 ; SSE2-NEXT:    pand %xmm1, %xmm7
364 ; SSE2-NEXT:    pandn %xmm8, %xmm1
365 ; SSE2-NEXT:    por %xmm7, %xmm1
366 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
367 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
368 ; SSE2-NEXT:    pxor %xmm4, %xmm2
369 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
370 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm3
371 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
372 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm2
373 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
374 ; SSE2-NEXT:    pand %xmm6, %xmm2
375 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
376 ; SSE2-NEXT:    por %xmm2, %xmm3
377 ; SSE2-NEXT:    pand %xmm3, %xmm0
378 ; SSE2-NEXT:    pandn %xmm8, %xmm3
379 ; SSE2-NEXT:    por %xmm0, %xmm3
380 ; SSE2-NEXT:    pxor %xmm5, %xmm4
381 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
382 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm0
383 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
384 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
385 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
386 ; SSE2-NEXT:    pand %xmm2, %xmm4
387 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
388 ; SSE2-NEXT:    por %xmm4, %xmm0
389 ; SSE2-NEXT:    pand %xmm0, %xmm5
390 ; SSE2-NEXT:    pandn %xmm8, %xmm0
391 ; SSE2-NEXT:    por %xmm5, %xmm0
392 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
393 ; SSE2-NEXT:    retq
395 ; SSSE3-LABEL: trunc_ssat_v8i64_v8i32:
396 ; SSSE3:       # %bb.0:
397 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [2147483647,2147483647]
398 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
399 ; SSSE3-NEXT:    movdqa %xmm0, %xmm5
400 ; SSSE3-NEXT:    pxor %xmm4, %xmm5
401 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [4294967295,4294967295]
402 ; SSSE3-NEXT:    movdqa %xmm9, %xmm7
403 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm7
404 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
405 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm5
406 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
407 ; SSSE3-NEXT:    pand %xmm10, %xmm6
408 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
409 ; SSSE3-NEXT:    por %xmm6, %xmm5
410 ; SSSE3-NEXT:    pand %xmm5, %xmm0
411 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
412 ; SSSE3-NEXT:    por %xmm0, %xmm5
413 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
414 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
415 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
416 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm6
417 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
418 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
419 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
420 ; SSSE3-NEXT:    pand %xmm10, %xmm7
421 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
422 ; SSSE3-NEXT:    por %xmm7, %xmm0
423 ; SSSE3-NEXT:    pand %xmm0, %xmm1
424 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
425 ; SSSE3-NEXT:    por %xmm1, %xmm0
426 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
427 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
428 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
429 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm6
430 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
431 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
432 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
433 ; SSSE3-NEXT:    pand %xmm7, %xmm1
434 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
435 ; SSSE3-NEXT:    por %xmm1, %xmm7
436 ; SSSE3-NEXT:    pand %xmm7, %xmm2
437 ; SSSE3-NEXT:    pandn %xmm8, %xmm7
438 ; SSSE3-NEXT:    por %xmm2, %xmm7
439 ; SSSE3-NEXT:    movdqa %xmm3, %xmm1
440 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
441 ; SSSE3-NEXT:    movdqa %xmm9, %xmm2
442 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
443 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
444 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
445 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
446 ; SSSE3-NEXT:    pand %xmm6, %xmm1
447 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[1,1,3,3]
448 ; SSSE3-NEXT:    por %xmm1, %xmm6
449 ; SSSE3-NEXT:    pand %xmm6, %xmm3
450 ; SSSE3-NEXT:    pandn %xmm8, %xmm6
451 ; SSSE3-NEXT:    por %xmm3, %xmm6
452 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [18446744071562067968,18446744071562067968]
453 ; SSSE3-NEXT:    movdqa %xmm6, %xmm1
454 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
455 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [18446744069414584320,18446744069414584320]
456 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
457 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm2
458 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
459 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
460 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
461 ; SSSE3-NEXT:    pand %xmm3, %xmm1
462 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
463 ; SSSE3-NEXT:    por %xmm1, %xmm2
464 ; SSSE3-NEXT:    pand %xmm2, %xmm6
465 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
466 ; SSSE3-NEXT:    por %xmm6, %xmm2
467 ; SSSE3-NEXT:    movdqa %xmm7, %xmm1
468 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
469 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
470 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm3
471 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm3[0,0,2,2]
472 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
473 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
474 ; SSSE3-NEXT:    pand %xmm10, %xmm6
475 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
476 ; SSSE3-NEXT:    por %xmm6, %xmm1
477 ; SSSE3-NEXT:    pand %xmm1, %xmm7
478 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
479 ; SSSE3-NEXT:    por %xmm7, %xmm1
480 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
481 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
482 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
483 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
484 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm3
485 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
486 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm2
487 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
488 ; SSSE3-NEXT:    pand %xmm6, %xmm2
489 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
490 ; SSSE3-NEXT:    por %xmm2, %xmm3
491 ; SSSE3-NEXT:    pand %xmm3, %xmm0
492 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
493 ; SSSE3-NEXT:    por %xmm0, %xmm3
494 ; SSSE3-NEXT:    pxor %xmm5, %xmm4
495 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
496 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm0
497 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
498 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
499 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
500 ; SSSE3-NEXT:    pand %xmm2, %xmm4
501 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
502 ; SSSE3-NEXT:    por %xmm4, %xmm0
503 ; SSSE3-NEXT:    pand %xmm0, %xmm5
504 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
505 ; SSSE3-NEXT:    por %xmm5, %xmm0
506 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2]
507 ; SSSE3-NEXT:    retq
509 ; SSE41-LABEL: trunc_ssat_v8i64_v8i32:
510 ; SSE41:       # %bb.0:
511 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
512 ; SSE41-NEXT:    movapd {{.*#+}} xmm7 = [2147483647,2147483647]
513 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648]
514 ; SSE41-NEXT:    pxor %xmm5, %xmm0
515 ; SSE41-NEXT:    movdqa {{.*#+}} xmm10 = [4294967295,4294967295]
516 ; SSE41-NEXT:    movdqa %xmm10, %xmm6
517 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
518 ; SSE41-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
519 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
520 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
521 ; SSE41-NEXT:    pand %xmm8, %xmm0
522 ; SSE41-NEXT:    por %xmm6, %xmm0
523 ; SSE41-NEXT:    movapd %xmm7, %xmm8
524 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm8
525 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
526 ; SSE41-NEXT:    pxor %xmm5, %xmm0
527 ; SSE41-NEXT:    movdqa %xmm10, %xmm4
528 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
529 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
530 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
531 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
532 ; SSE41-NEXT:    pand %xmm6, %xmm0
533 ; SSE41-NEXT:    por %xmm4, %xmm0
534 ; SSE41-NEXT:    movapd %xmm7, %xmm9
535 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm9
536 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
537 ; SSE41-NEXT:    pxor %xmm5, %xmm0
538 ; SSE41-NEXT:    movdqa %xmm10, %xmm1
539 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
540 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
541 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
542 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
543 ; SSE41-NEXT:    pand %xmm4, %xmm0
544 ; SSE41-NEXT:    por %xmm1, %xmm0
545 ; SSE41-NEXT:    movapd %xmm7, %xmm4
546 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
547 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
548 ; SSE41-NEXT:    pxor %xmm5, %xmm0
549 ; SSE41-NEXT:    movdqa %xmm10, %xmm1
550 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
551 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
552 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
553 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
554 ; SSE41-NEXT:    pand %xmm2, %xmm0
555 ; SSE41-NEXT:    por %xmm1, %xmm0
556 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm7
557 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [18446744071562067968,18446744071562067968]
558 ; SSE41-NEXT:    movapd %xmm7, %xmm0
559 ; SSE41-NEXT:    xorpd %xmm5, %xmm0
560 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [18446744069414584320,18446744069414584320]
561 ; SSE41-NEXT:    movapd %xmm0, %xmm1
562 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm1
563 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
564 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
565 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
566 ; SSE41-NEXT:    pand %xmm6, %xmm0
567 ; SSE41-NEXT:    por %xmm1, %xmm0
568 ; SSE41-NEXT:    movapd %xmm2, %xmm6
569 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm6
570 ; SSE41-NEXT:    movapd %xmm4, %xmm0
571 ; SSE41-NEXT:    xorpd %xmm5, %xmm0
572 ; SSE41-NEXT:    movapd %xmm0, %xmm1
573 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm1
574 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[0,0,2,2]
575 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
576 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
577 ; SSE41-NEXT:    pand %xmm7, %xmm0
578 ; SSE41-NEXT:    por %xmm1, %xmm0
579 ; SSE41-NEXT:    movapd %xmm2, %xmm1
580 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm1
581 ; SSE41-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm6[0,2]
582 ; SSE41-NEXT:    movapd %xmm9, %xmm0
583 ; SSE41-NEXT:    xorpd %xmm5, %xmm0
584 ; SSE41-NEXT:    movapd %xmm0, %xmm4
585 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
586 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
587 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
588 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
589 ; SSE41-NEXT:    pand %xmm6, %xmm0
590 ; SSE41-NEXT:    por %xmm4, %xmm0
591 ; SSE41-NEXT:    movapd %xmm2, %xmm4
592 ; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm4
593 ; SSE41-NEXT:    xorpd %xmm8, %xmm5
594 ; SSE41-NEXT:    movapd %xmm5, %xmm6
595 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm6
596 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
597 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm5
598 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
599 ; SSE41-NEXT:    pand %xmm7, %xmm0
600 ; SSE41-NEXT:    por %xmm6, %xmm0
601 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm2
602 ; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm4[0,2]
603 ; SSE41-NEXT:    movaps %xmm2, %xmm0
604 ; SSE41-NEXT:    retq
606 ; AVX1-LABEL: trunc_ssat_v8i64_v8i32:
607 ; AVX1:       # %bb.0:
608 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
609 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [2147483647,2147483647]
610 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm8
611 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm5
612 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
613 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm3, %xmm7
614 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm3, %xmm4
615 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm0, %xmm3, %xmm0
616 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [18446744071562067968,18446744071562067968]
617 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm0, %xmm9
618 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm6, %xmm3, %xmm6
619 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm7
620 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm1, %xmm3, %xmm1
621 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm1, %xmm5
622 ; AVX1-NEXT:    vblendvpd %xmm8, %xmm2, %xmm3, %xmm2
623 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm2, %xmm3
624 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm2, %xmm4, %xmm2
625 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm1, %xmm4, %xmm1
626 ; AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
627 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm6, %xmm4, %xmm2
628 ; AVX1-NEXT:    vblendvpd %xmm9, %xmm0, %xmm4, %xmm0
629 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
630 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
631 ; AVX1-NEXT:    retq
633 ; AVX2-SLOW-LABEL: trunc_ssat_v8i64_v8i32:
634 ; AVX2-SLOW:       # %bb.0:
635 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [2147483647,2147483647,2147483647,2147483647]
636 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
637 ; AVX2-SLOW-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
638 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
639 ; AVX2-SLOW-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
640 ; AVX2-SLOW-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
641 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
642 ; AVX2-SLOW-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
643 ; AVX2-SLOW-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm3
644 ; AVX2-SLOW-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
645 ; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm1, %xmm2
646 ; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
647 ; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm2
648 ; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
649 ; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
650 ; AVX2-SLOW-NEXT:    retq
652 ; AVX2-FAST-LABEL: trunc_ssat_v8i64_v8i32:
653 ; AVX2-FAST:       # %bb.0:
654 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [2147483647,2147483647,2147483647,2147483647]
655 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
656 ; AVX2-FAST-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
657 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
658 ; AVX2-FAST-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
659 ; AVX2-FAST-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
660 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm3
661 ; AVX2-FAST-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
662 ; AVX2-FAST-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
663 ; AVX2-FAST-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
664 ; AVX2-FAST-NEXT:    vmovapd {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
665 ; AVX2-FAST-NEXT:    vpermps %ymm0, %ymm2, %ymm0
666 ; AVX2-FAST-NEXT:    vpermps %ymm1, %ymm2, %ymm1
667 ; AVX2-FAST-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
668 ; AVX2-FAST-NEXT:    retq
670 ; AVX512-LABEL: trunc_ssat_v8i64_v8i32:
671 ; AVX512:       # %bb.0:
672 ; AVX512-NEXT:    vpmovsqd %zmm0, %ymm0
673 ; AVX512-NEXT:    retq
674   %1 = icmp slt <8 x i64> %a0, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
675   %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>
676   %3 = icmp sgt <8 x i64> %2, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
677   %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>
678   %5 = trunc <8 x i64> %4 to <8 x i32>
679   ret <8 x i32> %5
683 ; Signed saturation truncation to vXi16
686 define <8 x i16> @trunc_ssat_v8i64_v8i16(<8 x i64> %a0) {
687 ; SSE2-LABEL: trunc_ssat_v8i64_v8i16:
688 ; SSE2:       # %bb.0:
689 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [32767,32767]
690 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
691 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
692 ; SSE2-NEXT:    pxor %xmm4, %xmm5
693 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [2147516415,2147516415]
694 ; SSE2-NEXT:    movdqa %xmm9, %xmm7
695 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
696 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
697 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm5
698 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
699 ; SSE2-NEXT:    pand %xmm10, %xmm6
700 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
701 ; SSE2-NEXT:    por %xmm6, %xmm5
702 ; SSE2-NEXT:    pand %xmm5, %xmm2
703 ; SSE2-NEXT:    pandn %xmm8, %xmm5
704 ; SSE2-NEXT:    por %xmm2, %xmm5
705 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
706 ; SSE2-NEXT:    pxor %xmm4, %xmm2
707 ; SSE2-NEXT:    movdqa %xmm9, %xmm6
708 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
709 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
710 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm2
711 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
712 ; SSE2-NEXT:    pand %xmm10, %xmm7
713 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
714 ; SSE2-NEXT:    por %xmm7, %xmm2
715 ; SSE2-NEXT:    pand %xmm2, %xmm3
716 ; SSE2-NEXT:    pandn %xmm8, %xmm2
717 ; SSE2-NEXT:    por %xmm3, %xmm2
718 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
719 ; SSE2-NEXT:    pxor %xmm4, %xmm3
720 ; SSE2-NEXT:    movdqa %xmm9, %xmm6
721 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
722 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
723 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm3
724 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
725 ; SSE2-NEXT:    pand %xmm10, %xmm7
726 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
727 ; SSE2-NEXT:    por %xmm7, %xmm3
728 ; SSE2-NEXT:    pand %xmm3, %xmm0
729 ; SSE2-NEXT:    pandn %xmm8, %xmm3
730 ; SSE2-NEXT:    por %xmm0, %xmm3
731 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
732 ; SSE2-NEXT:    pxor %xmm4, %xmm0
733 ; SSE2-NEXT:    movdqa %xmm9, %xmm6
734 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
735 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
736 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
737 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
738 ; SSE2-NEXT:    pand %xmm7, %xmm0
739 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
740 ; SSE2-NEXT:    por %xmm0, %xmm7
741 ; SSE2-NEXT:    pand %xmm7, %xmm1
742 ; SSE2-NEXT:    pandn %xmm8, %xmm7
743 ; SSE2-NEXT:    por %xmm1, %xmm7
744 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [18446744073709518848,18446744073709518848]
745 ; SSE2-NEXT:    movdqa %xmm7, %xmm0
746 ; SSE2-NEXT:    pxor %xmm4, %xmm0
747 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [18446744071562035200,18446744071562035200]
748 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
749 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm1
750 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
751 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
752 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
753 ; SSE2-NEXT:    pand %xmm6, %xmm0
754 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
755 ; SSE2-NEXT:    por %xmm0, %xmm1
756 ; SSE2-NEXT:    pand %xmm1, %xmm7
757 ; SSE2-NEXT:    pandn %xmm8, %xmm1
758 ; SSE2-NEXT:    por %xmm7, %xmm1
759 ; SSE2-NEXT:    movdqa %xmm3, %xmm0
760 ; SSE2-NEXT:    pxor %xmm4, %xmm0
761 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
762 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm6
763 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
764 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
765 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
766 ; SSE2-NEXT:    pand %xmm10, %xmm7
767 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
768 ; SSE2-NEXT:    por %xmm7, %xmm0
769 ; SSE2-NEXT:    pand %xmm0, %xmm3
770 ; SSE2-NEXT:    pandn %xmm8, %xmm0
771 ; SSE2-NEXT:    por %xmm3, %xmm0
772 ; SSE2-NEXT:    packssdw %xmm1, %xmm0
773 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
774 ; SSE2-NEXT:    pxor %xmm4, %xmm1
775 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
776 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm3
777 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
778 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
779 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
780 ; SSE2-NEXT:    pand %xmm6, %xmm1
781 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
782 ; SSE2-NEXT:    por %xmm1, %xmm3
783 ; SSE2-NEXT:    pand %xmm3, %xmm2
784 ; SSE2-NEXT:    pandn %xmm8, %xmm3
785 ; SSE2-NEXT:    por %xmm2, %xmm3
786 ; SSE2-NEXT:    pxor %xmm5, %xmm4
787 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
788 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm1
789 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
790 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
791 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
792 ; SSE2-NEXT:    pand %xmm2, %xmm4
793 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
794 ; SSE2-NEXT:    por %xmm4, %xmm1
795 ; SSE2-NEXT:    pand %xmm1, %xmm5
796 ; SSE2-NEXT:    pandn %xmm8, %xmm1
797 ; SSE2-NEXT:    por %xmm5, %xmm1
798 ; SSE2-NEXT:    packssdw %xmm3, %xmm1
799 ; SSE2-NEXT:    packssdw %xmm1, %xmm0
800 ; SSE2-NEXT:    retq
802 ; SSSE3-LABEL: trunc_ssat_v8i64_v8i16:
803 ; SSSE3:       # %bb.0:
804 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [32767,32767]
805 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
806 ; SSSE3-NEXT:    movdqa %xmm2, %xmm5
807 ; SSSE3-NEXT:    pxor %xmm4, %xmm5
808 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [2147516415,2147516415]
809 ; SSSE3-NEXT:    movdqa %xmm9, %xmm7
810 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm7
811 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
812 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm5
813 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
814 ; SSSE3-NEXT:    pand %xmm10, %xmm6
815 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
816 ; SSSE3-NEXT:    por %xmm6, %xmm5
817 ; SSSE3-NEXT:    pand %xmm5, %xmm2
818 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
819 ; SSSE3-NEXT:    por %xmm2, %xmm5
820 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
821 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
822 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
823 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm6
824 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
825 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm2
826 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
827 ; SSSE3-NEXT:    pand %xmm10, %xmm7
828 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
829 ; SSSE3-NEXT:    por %xmm7, %xmm2
830 ; SSSE3-NEXT:    pand %xmm2, %xmm3
831 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
832 ; SSSE3-NEXT:    por %xmm3, %xmm2
833 ; SSSE3-NEXT:    movdqa %xmm0, %xmm3
834 ; SSSE3-NEXT:    pxor %xmm4, %xmm3
835 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
836 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm6
837 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
838 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm3
839 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
840 ; SSSE3-NEXT:    pand %xmm10, %xmm7
841 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
842 ; SSSE3-NEXT:    por %xmm7, %xmm3
843 ; SSSE3-NEXT:    pand %xmm3, %xmm0
844 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
845 ; SSSE3-NEXT:    por %xmm0, %xmm3
846 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
847 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
848 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
849 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm6
850 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
851 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
852 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
853 ; SSSE3-NEXT:    pand %xmm7, %xmm0
854 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
855 ; SSSE3-NEXT:    por %xmm0, %xmm7
856 ; SSSE3-NEXT:    pand %xmm7, %xmm1
857 ; SSSE3-NEXT:    pandn %xmm8, %xmm7
858 ; SSSE3-NEXT:    por %xmm1, %xmm7
859 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [18446744073709518848,18446744073709518848]
860 ; SSSE3-NEXT:    movdqa %xmm7, %xmm0
861 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
862 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [18446744071562035200,18446744071562035200]
863 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
864 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm1
865 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
866 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
867 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
868 ; SSSE3-NEXT:    pand %xmm6, %xmm0
869 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
870 ; SSSE3-NEXT:    por %xmm0, %xmm1
871 ; SSSE3-NEXT:    pand %xmm1, %xmm7
872 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
873 ; SSSE3-NEXT:    por %xmm7, %xmm1
874 ; SSSE3-NEXT:    movdqa %xmm3, %xmm0
875 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
876 ; SSSE3-NEXT:    movdqa %xmm0, %xmm6
877 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm6
878 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
879 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
880 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
881 ; SSSE3-NEXT:    pand %xmm10, %xmm7
882 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
883 ; SSSE3-NEXT:    por %xmm7, %xmm0
884 ; SSSE3-NEXT:    pand %xmm0, %xmm3
885 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
886 ; SSSE3-NEXT:    por %xmm3, %xmm0
887 ; SSSE3-NEXT:    packssdw %xmm1, %xmm0
888 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
889 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
890 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
891 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm3
892 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
893 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
894 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
895 ; SSSE3-NEXT:    pand %xmm6, %xmm1
896 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
897 ; SSSE3-NEXT:    por %xmm1, %xmm3
898 ; SSSE3-NEXT:    pand %xmm3, %xmm2
899 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
900 ; SSSE3-NEXT:    por %xmm2, %xmm3
901 ; SSSE3-NEXT:    pxor %xmm5, %xmm4
902 ; SSSE3-NEXT:    movdqa %xmm4, %xmm1
903 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm1
904 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
905 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
906 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
907 ; SSSE3-NEXT:    pand %xmm2, %xmm4
908 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
909 ; SSSE3-NEXT:    por %xmm4, %xmm1
910 ; SSSE3-NEXT:    pand %xmm1, %xmm5
911 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
912 ; SSSE3-NEXT:    por %xmm5, %xmm1
913 ; SSSE3-NEXT:    packssdw %xmm3, %xmm1
914 ; SSSE3-NEXT:    packssdw %xmm1, %xmm0
915 ; SSSE3-NEXT:    retq
917 ; SSE41-LABEL: trunc_ssat_v8i64_v8i16:
918 ; SSE41:       # %bb.0:
919 ; SSE41-NEXT:    movdqa %xmm0, %xmm10
920 ; SSE41-NEXT:    movapd {{.*#+}} xmm7 = [32767,32767]
921 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648]
922 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
923 ; SSE41-NEXT:    pxor %xmm5, %xmm0
924 ; SSE41-NEXT:    movdqa {{.*#+}} xmm11 = [2147516415,2147516415]
925 ; SSE41-NEXT:    movdqa %xmm11, %xmm6
926 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
927 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
928 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
929 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
930 ; SSE41-NEXT:    pand %xmm4, %xmm0
931 ; SSE41-NEXT:    por %xmm6, %xmm0
932 ; SSE41-NEXT:    movapd %xmm7, %xmm8
933 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm8
934 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
935 ; SSE41-NEXT:    pxor %xmm5, %xmm0
936 ; SSE41-NEXT:    movdqa %xmm11, %xmm2
937 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
938 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
939 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
940 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
941 ; SSE41-NEXT:    pand %xmm4, %xmm0
942 ; SSE41-NEXT:    por %xmm2, %xmm0
943 ; SSE41-NEXT:    movapd %xmm7, %xmm9
944 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm9
945 ; SSE41-NEXT:    movdqa %xmm10, %xmm0
946 ; SSE41-NEXT:    pxor %xmm5, %xmm0
947 ; SSE41-NEXT:    movdqa %xmm11, %xmm2
948 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
949 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
950 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
951 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
952 ; SSE41-NEXT:    pand %xmm3, %xmm0
953 ; SSE41-NEXT:    por %xmm2, %xmm0
954 ; SSE41-NEXT:    movapd %xmm7, %xmm2
955 ; SSE41-NEXT:    blendvpd %xmm0, %xmm10, %xmm2
956 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
957 ; SSE41-NEXT:    pxor %xmm5, %xmm0
958 ; SSE41-NEXT:    movdqa %xmm11, %xmm3
959 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
960 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
961 ; SSE41-NEXT:    pcmpeqd %xmm11, %xmm0
962 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
963 ; SSE41-NEXT:    pand %xmm4, %xmm0
964 ; SSE41-NEXT:    por %xmm3, %xmm0
965 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm7
966 ; SSE41-NEXT:    movapd {{.*#+}} xmm3 = [18446744073709518848,18446744073709518848]
967 ; SSE41-NEXT:    movapd %xmm7, %xmm0
968 ; SSE41-NEXT:    xorpd %xmm5, %xmm0
969 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [18446744071562035200,18446744071562035200]
970 ; SSE41-NEXT:    movapd %xmm0, %xmm1
971 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm1
972 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2]
973 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm0
974 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
975 ; SSE41-NEXT:    pand %xmm6, %xmm0
976 ; SSE41-NEXT:    por %xmm1, %xmm0
977 ; SSE41-NEXT:    movapd %xmm3, %xmm6
978 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm6
979 ; SSE41-NEXT:    movapd %xmm2, %xmm0
980 ; SSE41-NEXT:    xorpd %xmm5, %xmm0
981 ; SSE41-NEXT:    movapd %xmm0, %xmm1
982 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm1
983 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[0,0,2,2]
984 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm0
985 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
986 ; SSE41-NEXT:    pand %xmm7, %xmm0
987 ; SSE41-NEXT:    por %xmm1, %xmm0
988 ; SSE41-NEXT:    movapd %xmm3, %xmm1
989 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
990 ; SSE41-NEXT:    packssdw %xmm6, %xmm1
991 ; SSE41-NEXT:    movapd %xmm9, %xmm0
992 ; SSE41-NEXT:    xorpd %xmm5, %xmm0
993 ; SSE41-NEXT:    movapd %xmm0, %xmm2
994 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm2
995 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
996 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm0
997 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
998 ; SSE41-NEXT:    pand %xmm6, %xmm0
999 ; SSE41-NEXT:    por %xmm2, %xmm0
1000 ; SSE41-NEXT:    movapd %xmm3, %xmm2
1001 ; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm2
1002 ; SSE41-NEXT:    xorpd %xmm8, %xmm5
1003 ; SSE41-NEXT:    movapd %xmm5, %xmm6
1004 ; SSE41-NEXT:    pcmpgtd %xmm4, %xmm6
1005 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1006 ; SSE41-NEXT:    pcmpeqd %xmm4, %xmm5
1007 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
1008 ; SSE41-NEXT:    pand %xmm7, %xmm0
1009 ; SSE41-NEXT:    por %xmm6, %xmm0
1010 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm3
1011 ; SSE41-NEXT:    packssdw %xmm2, %xmm3
1012 ; SSE41-NEXT:    packssdw %xmm3, %xmm1
1013 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1014 ; SSE41-NEXT:    retq
1016 ; AVX1-LABEL: trunc_ssat_v8i64_v8i16:
1017 ; AVX1:       # %bb.0:
1018 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1019 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [32767,32767]
1020 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm8
1021 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm3, %xmm5
1022 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
1023 ; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm3, %xmm7
1024 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm3, %xmm4
1025 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm0, %xmm3, %xmm0
1026 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [18446744073709518848,18446744073709518848]
1027 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm0, %xmm9
1028 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm6, %xmm3, %xmm6
1029 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm7
1030 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm1, %xmm3, %xmm1
1031 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm1, %xmm5
1032 ; AVX1-NEXT:    vblendvpd %xmm8, %xmm2, %xmm3, %xmm2
1033 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm2, %xmm3
1034 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm2, %xmm4, %xmm2
1035 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm1, %xmm4, %xmm1
1036 ; AVX1-NEXT:    vpackssdw %xmm2, %xmm1, %xmm1
1037 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm6, %xmm4, %xmm2
1038 ; AVX1-NEXT:    vblendvpd %xmm9, %xmm0, %xmm4, %xmm0
1039 ; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0
1040 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
1041 ; AVX1-NEXT:    vzeroupper
1042 ; AVX1-NEXT:    retq
1044 ; AVX2-LABEL: trunc_ssat_v8i64_v8i16:
1045 ; AVX2:       # %bb.0:
1046 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [32767,32767,32767,32767]
1047 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
1048 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1049 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
1050 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
1051 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848]
1052 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm3
1053 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
1054 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
1055 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1056 ; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
1057 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1058 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1059 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
1060 ; AVX2-NEXT:    vzeroupper
1061 ; AVX2-NEXT:    retq
1063 ; AVX512-LABEL: trunc_ssat_v8i64_v8i16:
1064 ; AVX512:       # %bb.0:
1065 ; AVX512-NEXT:    vpmovsqw %zmm0, %xmm0
1066 ; AVX512-NEXT:    vzeroupper
1067 ; AVX512-NEXT:    retq
1068   %1 = icmp slt <8 x i64> %a0, <i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767>
1069   %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>
1070   %3 = icmp sgt <8 x i64> %2, <i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768>
1071   %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>
1072   %5 = trunc <8 x i64> %4 to <8 x i16>
1073   ret <8 x i16> %5
1076 define <8 x i16> @trunc_ssat_v8i32_v8i16(<8 x i32> %a0) {
1077 ; SSE-LABEL: trunc_ssat_v8i32_v8i16:
1078 ; SSE:       # %bb.0:
1079 ; SSE-NEXT:    packssdw %xmm1, %xmm0
1080 ; SSE-NEXT:    retq
1082 ; AVX1-LABEL: trunc_ssat_v8i32_v8i16:
1083 ; AVX1:       # %bb.0:
1084 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1085 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
1086 ; AVX1-NEXT:    vzeroupper
1087 ; AVX1-NEXT:    retq
1089 ; AVX2-LABEL: trunc_ssat_v8i32_v8i16:
1090 ; AVX2:       # %bb.0:
1091 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1092 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
1093 ; AVX2-NEXT:    vzeroupper
1094 ; AVX2-NEXT:    retq
1096 ; AVX512F-LABEL: trunc_ssat_v8i32_v8i16:
1097 ; AVX512F:       # %bb.0:
1098 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [32767,32767,32767,32767,32767,32767,32767,32767]
1099 ; AVX512F-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
1100 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [4294934528,4294934528,4294934528,4294934528,4294934528,4294934528,4294934528,4294934528]
1101 ; AVX512F-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
1102 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
1103 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1104 ; AVX512F-NEXT:    vzeroupper
1105 ; AVX512F-NEXT:    retq
1107 ; AVX512VL-LABEL: trunc_ssat_v8i32_v8i16:
1108 ; AVX512VL:       # %bb.0:
1109 ; AVX512VL-NEXT:    vpmovsdw %ymm0, %xmm0
1110 ; AVX512VL-NEXT:    vzeroupper
1111 ; AVX512VL-NEXT:    retq
1113 ; AVX512BW-LABEL: trunc_ssat_v8i32_v8i16:
1114 ; AVX512BW:       # %bb.0:
1115 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [32767,32767,32767,32767,32767,32767,32767,32767]
1116 ; AVX512BW-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
1117 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [4294934528,4294934528,4294934528,4294934528,4294934528,4294934528,4294934528,4294934528]
1118 ; AVX512BW-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
1119 ; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
1120 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1121 ; AVX512BW-NEXT:    vzeroupper
1122 ; AVX512BW-NEXT:    retq
1124 ; AVX512BWVL-LABEL: trunc_ssat_v8i32_v8i16:
1125 ; AVX512BWVL:       # %bb.0:
1126 ; AVX512BWVL-NEXT:    vpmovsdw %ymm0, %xmm0
1127 ; AVX512BWVL-NEXT:    vzeroupper
1128 ; AVX512BWVL-NEXT:    retq
1129   %1 = icmp slt <8 x i32> %a0, <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>
1130   %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>
1131   %3 = icmp sgt <8 x i32> %2, <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>
1132   %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>
1133   %5 = trunc <8 x i32> %4 to <8 x i16>
1134   ret <8 x i16> %5
1137 define <16 x i16> @trunc_ssat_v16i32_v16i16(<16 x i32> %a0) {
1138 ; SSE-LABEL: trunc_ssat_v16i32_v16i16:
1139 ; SSE:       # %bb.0:
1140 ; SSE-NEXT:    packssdw %xmm1, %xmm0
1141 ; SSE-NEXT:    packssdw %xmm3, %xmm2
1142 ; SSE-NEXT:    movdqa %xmm2, %xmm1
1143 ; SSE-NEXT:    retq
1145 ; AVX1-LABEL: trunc_ssat_v16i32_v16i16:
1146 ; AVX1:       # %bb.0:
1147 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1148 ; AVX1-NEXT:    vpackssdw %xmm2, %xmm1, %xmm1
1149 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1150 ; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0
1151 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1152 ; AVX1-NEXT:    retq
1154 ; AVX2-LABEL: trunc_ssat_v16i32_v16i16:
1155 ; AVX2:       # %bb.0:
1156 ; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
1157 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1158 ; AVX2-NEXT:    retq
1160 ; AVX512-LABEL: trunc_ssat_v16i32_v16i16:
1161 ; AVX512:       # %bb.0:
1162 ; AVX512-NEXT:    vpmovsdw %zmm0, %ymm0
1163 ; AVX512-NEXT:    retq
1164   %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>
1165   %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>
1166   %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>
1167   %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>
1168   %5 = trunc <16 x i32> %4 to <16 x i16>
1169   ret <16 x i16> %5
1173 ; Signed saturation truncation to v16i8
1176 define <8 x i8> @trunc_ssat_v8i64_v8i8(<8 x i64> %a0) {
1177 ; SSE2-LABEL: trunc_ssat_v8i64_v8i8:
1178 ; SSE2:       # %bb.0:
1179 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [127,127]
1180 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
1181 ; SSE2-NEXT:    movdqa %xmm3, %xmm5
1182 ; SSE2-NEXT:    pxor %xmm4, %xmm5
1183 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [2147483775,2147483775]
1184 ; SSE2-NEXT:    movdqa %xmm9, %xmm7
1185 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
1186 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
1187 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm5
1188 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
1189 ; SSE2-NEXT:    pand %xmm10, %xmm6
1190 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1191 ; SSE2-NEXT:    por %xmm6, %xmm5
1192 ; SSE2-NEXT:    pand %xmm5, %xmm3
1193 ; SSE2-NEXT:    pandn %xmm8, %xmm5
1194 ; SSE2-NEXT:    por %xmm3, %xmm5
1195 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
1196 ; SSE2-NEXT:    pxor %xmm4, %xmm3
1197 ; SSE2-NEXT:    movdqa %xmm9, %xmm6
1198 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
1199 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
1200 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm3
1201 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
1202 ; SSE2-NEXT:    pand %xmm10, %xmm7
1203 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
1204 ; SSE2-NEXT:    por %xmm7, %xmm3
1205 ; SSE2-NEXT:    pand %xmm3, %xmm2
1206 ; SSE2-NEXT:    pandn %xmm8, %xmm3
1207 ; SSE2-NEXT:    por %xmm2, %xmm3
1208 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1209 ; SSE2-NEXT:    pxor %xmm4, %xmm2
1210 ; SSE2-NEXT:    movdqa %xmm9, %xmm6
1211 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
1212 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
1213 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm2
1214 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
1215 ; SSE2-NEXT:    pand %xmm10, %xmm7
1216 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
1217 ; SSE2-NEXT:    por %xmm7, %xmm2
1218 ; SSE2-NEXT:    pand %xmm2, %xmm1
1219 ; SSE2-NEXT:    pandn %xmm8, %xmm2
1220 ; SSE2-NEXT:    por %xmm1, %xmm2
1221 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1222 ; SSE2-NEXT:    pxor %xmm4, %xmm1
1223 ; SSE2-NEXT:    movdqa %xmm9, %xmm6
1224 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm6
1225 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1226 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
1227 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1228 ; SSE2-NEXT:    pand %xmm7, %xmm1
1229 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
1230 ; SSE2-NEXT:    por %xmm1, %xmm7
1231 ; SSE2-NEXT:    pand %xmm7, %xmm0
1232 ; SSE2-NEXT:    pandn %xmm8, %xmm7
1233 ; SSE2-NEXT:    por %xmm0, %xmm7
1234 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
1235 ; SSE2-NEXT:    movdqa %xmm7, %xmm0
1236 ; SSE2-NEXT:    pxor %xmm4, %xmm0
1237 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [18446744071562067840,18446744071562067840]
1238 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1239 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm1
1240 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm1[0,0,2,2]
1241 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
1242 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
1243 ; SSE2-NEXT:    pand %xmm10, %xmm6
1244 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1245 ; SSE2-NEXT:    por %xmm6, %xmm0
1246 ; SSE2-NEXT:    pand %xmm0, %xmm7
1247 ; SSE2-NEXT:    pandn %xmm8, %xmm0
1248 ; SSE2-NEXT:    por %xmm7, %xmm0
1249 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1250 ; SSE2-NEXT:    pxor %xmm4, %xmm1
1251 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
1252 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm6
1253 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1254 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
1255 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1256 ; SSE2-NEXT:    pand %xmm7, %xmm1
1257 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
1258 ; SSE2-NEXT:    por %xmm1, %xmm7
1259 ; SSE2-NEXT:    pand %xmm7, %xmm2
1260 ; SSE2-NEXT:    pandn %xmm8, %xmm7
1261 ; SSE2-NEXT:    por %xmm2, %xmm7
1262 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
1263 ; SSE2-NEXT:    pxor %xmm4, %xmm1
1264 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1265 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm2
1266 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
1267 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
1268 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1269 ; SSE2-NEXT:    pand %xmm6, %xmm1
1270 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1271 ; SSE2-NEXT:    por %xmm1, %xmm2
1272 ; SSE2-NEXT:    pand %xmm2, %xmm3
1273 ; SSE2-NEXT:    pandn %xmm8, %xmm2
1274 ; SSE2-NEXT:    por %xmm3, %xmm2
1275 ; SSE2-NEXT:    pxor %xmm5, %xmm4
1276 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
1277 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm1
1278 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
1279 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
1280 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1281 ; SSE2-NEXT:    pand %xmm3, %xmm4
1282 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1283 ; SSE2-NEXT:    por %xmm4, %xmm1
1284 ; SSE2-NEXT:    pand %xmm1, %xmm5
1285 ; SSE2-NEXT:    pandn %xmm8, %xmm1
1286 ; SSE2-NEXT:    por %xmm5, %xmm1
1287 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
1288 ; SSE2-NEXT:    pand %xmm3, %xmm1
1289 ; SSE2-NEXT:    pand %xmm3, %xmm2
1290 ; SSE2-NEXT:    packuswb %xmm1, %xmm2
1291 ; SSE2-NEXT:    pand %xmm3, %xmm7
1292 ; SSE2-NEXT:    pand %xmm3, %xmm0
1293 ; SSE2-NEXT:    packuswb %xmm7, %xmm0
1294 ; SSE2-NEXT:    packuswb %xmm2, %xmm0
1295 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
1296 ; SSE2-NEXT:    retq
1298 ; SSSE3-LABEL: trunc_ssat_v8i64_v8i8:
1299 ; SSSE3:       # %bb.0:
1300 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [127,127]
1301 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
1302 ; SSSE3-NEXT:    movdqa %xmm3, %xmm5
1303 ; SSSE3-NEXT:    pxor %xmm4, %xmm5
1304 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [2147483775,2147483775]
1305 ; SSSE3-NEXT:    movdqa %xmm9, %xmm7
1306 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm7
1307 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
1308 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm5
1309 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
1310 ; SSSE3-NEXT:    pand %xmm10, %xmm6
1311 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1312 ; SSSE3-NEXT:    por %xmm6, %xmm5
1313 ; SSSE3-NEXT:    pand %xmm5, %xmm3
1314 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
1315 ; SSSE3-NEXT:    por %xmm3, %xmm5
1316 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
1317 ; SSSE3-NEXT:    pxor %xmm4, %xmm3
1318 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
1319 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm6
1320 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
1321 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm3
1322 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
1323 ; SSSE3-NEXT:    pand %xmm10, %xmm7
1324 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
1325 ; SSSE3-NEXT:    por %xmm7, %xmm3
1326 ; SSSE3-NEXT:    pand %xmm3, %xmm2
1327 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
1328 ; SSSE3-NEXT:    por %xmm2, %xmm3
1329 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1330 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
1331 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
1332 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm6
1333 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
1334 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm2
1335 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
1336 ; SSSE3-NEXT:    pand %xmm10, %xmm7
1337 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
1338 ; SSSE3-NEXT:    por %xmm7, %xmm2
1339 ; SSSE3-NEXT:    pand %xmm2, %xmm1
1340 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
1341 ; SSSE3-NEXT:    por %xmm1, %xmm2
1342 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
1343 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
1344 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
1345 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm6
1346 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1347 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
1348 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1349 ; SSSE3-NEXT:    pand %xmm7, %xmm1
1350 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
1351 ; SSSE3-NEXT:    por %xmm1, %xmm7
1352 ; SSSE3-NEXT:    pand %xmm7, %xmm0
1353 ; SSSE3-NEXT:    pandn %xmm8, %xmm7
1354 ; SSSE3-NEXT:    por %xmm0, %xmm7
1355 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
1356 ; SSSE3-NEXT:    movdqa %xmm7, %xmm0
1357 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
1358 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [18446744071562067840,18446744071562067840]
1359 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
1360 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm1
1361 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm1[0,0,2,2]
1362 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
1363 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
1364 ; SSSE3-NEXT:    pand %xmm10, %xmm6
1365 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1366 ; SSSE3-NEXT:    por %xmm6, %xmm0
1367 ; SSSE3-NEXT:    pand %xmm0, %xmm7
1368 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
1369 ; SSSE3-NEXT:    por %xmm7, %xmm0
1370 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1371 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
1372 ; SSSE3-NEXT:    movdqa %xmm1, %xmm6
1373 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm6
1374 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1375 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
1376 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1377 ; SSSE3-NEXT:    pand %xmm7, %xmm1
1378 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
1379 ; SSSE3-NEXT:    por %xmm1, %xmm7
1380 ; SSSE3-NEXT:    pand %xmm7, %xmm2
1381 ; SSSE3-NEXT:    pandn %xmm8, %xmm7
1382 ; SSSE3-NEXT:    por %xmm2, %xmm7
1383 ; SSSE3-NEXT:    movdqa %xmm3, %xmm1
1384 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
1385 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1386 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm2
1387 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
1388 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
1389 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1390 ; SSSE3-NEXT:    pand %xmm6, %xmm1
1391 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1392 ; SSSE3-NEXT:    por %xmm1, %xmm2
1393 ; SSSE3-NEXT:    pand %xmm2, %xmm3
1394 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
1395 ; SSSE3-NEXT:    por %xmm3, %xmm2
1396 ; SSSE3-NEXT:    pxor %xmm5, %xmm4
1397 ; SSSE3-NEXT:    movdqa %xmm4, %xmm1
1398 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm1
1399 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
1400 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
1401 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1402 ; SSSE3-NEXT:    pand %xmm3, %xmm4
1403 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1404 ; SSSE3-NEXT:    por %xmm4, %xmm1
1405 ; SSSE3-NEXT:    pand %xmm1, %xmm5
1406 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
1407 ; SSSE3-NEXT:    por %xmm5, %xmm1
1408 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
1409 ; SSSE3-NEXT:    pand %xmm3, %xmm1
1410 ; SSSE3-NEXT:    pand %xmm3, %xmm2
1411 ; SSSE3-NEXT:    packuswb %xmm1, %xmm2
1412 ; SSSE3-NEXT:    pand %xmm3, %xmm7
1413 ; SSSE3-NEXT:    pand %xmm3, %xmm0
1414 ; SSSE3-NEXT:    packuswb %xmm7, %xmm0
1415 ; SSSE3-NEXT:    packuswb %xmm2, %xmm0
1416 ; SSSE3-NEXT:    packuswb %xmm0, %xmm0
1417 ; SSSE3-NEXT:    retq
1419 ; SSE41-LABEL: trunc_ssat_v8i64_v8i8:
1420 ; SSE41:       # %bb.0:
1421 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
1422 ; SSE41-NEXT:    movapd {{.*#+}} xmm7 = [127,127]
1423 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648]
1424 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
1425 ; SSE41-NEXT:    pxor %xmm5, %xmm0
1426 ; SSE41-NEXT:    movdqa {{.*#+}} xmm10 = [2147483775,2147483775]
1427 ; SSE41-NEXT:    movdqa %xmm10, %xmm6
1428 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
1429 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
1430 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
1431 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1432 ; SSE41-NEXT:    pand %xmm4, %xmm0
1433 ; SSE41-NEXT:    por %xmm6, %xmm0
1434 ; SSE41-NEXT:    movapd %xmm7, %xmm9
1435 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm9
1436 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1437 ; SSE41-NEXT:    pxor %xmm5, %xmm0
1438 ; SSE41-NEXT:    movdqa %xmm10, %xmm3
1439 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
1440 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1441 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
1442 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1443 ; SSE41-NEXT:    pand %xmm4, %xmm0
1444 ; SSE41-NEXT:    por %xmm3, %xmm0
1445 ; SSE41-NEXT:    movapd %xmm7, %xmm11
1446 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm11
1447 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1448 ; SSE41-NEXT:    pxor %xmm5, %xmm0
1449 ; SSE41-NEXT:    movdqa %xmm10, %xmm2
1450 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
1451 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1452 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
1453 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1454 ; SSE41-NEXT:    pand %xmm4, %xmm0
1455 ; SSE41-NEXT:    por %xmm2, %xmm0
1456 ; SSE41-NEXT:    movapd %xmm7, %xmm6
1457 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm6
1458 ; SSE41-NEXT:    movdqa %xmm8, %xmm0
1459 ; SSE41-NEXT:    pxor %xmm5, %xmm0
1460 ; SSE41-NEXT:    movdqa %xmm10, %xmm1
1461 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
1462 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
1463 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
1464 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1465 ; SSE41-NEXT:    pand %xmm2, %xmm0
1466 ; SSE41-NEXT:    por %xmm1, %xmm0
1467 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm7
1468 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [18446744073709551488,18446744073709551488]
1469 ; SSE41-NEXT:    movapd %xmm7, %xmm0
1470 ; SSE41-NEXT:    xorpd %xmm5, %xmm0
1471 ; SSE41-NEXT:    movdqa {{.*#+}} xmm8 = [18446744071562067840,18446744071562067840]
1472 ; SSE41-NEXT:    movapd %xmm0, %xmm1
1473 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm1
1474 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
1475 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm0
1476 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1477 ; SSE41-NEXT:    pand %xmm3, %xmm0
1478 ; SSE41-NEXT:    por %xmm1, %xmm0
1479 ; SSE41-NEXT:    movapd %xmm2, %xmm1
1480 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
1481 ; SSE41-NEXT:    movapd %xmm6, %xmm0
1482 ; SSE41-NEXT:    xorpd %xmm5, %xmm0
1483 ; SSE41-NEXT:    movapd %xmm0, %xmm3
1484 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm3
1485 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[0,0,2,2]
1486 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm0
1487 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1488 ; SSE41-NEXT:    pand %xmm7, %xmm0
1489 ; SSE41-NEXT:    por %xmm3, %xmm0
1490 ; SSE41-NEXT:    movapd %xmm2, %xmm7
1491 ; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm7
1492 ; SSE41-NEXT:    movapd %xmm11, %xmm0
1493 ; SSE41-NEXT:    xorpd %xmm5, %xmm0
1494 ; SSE41-NEXT:    movapd %xmm0, %xmm3
1495 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm3
1496 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
1497 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm0
1498 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1499 ; SSE41-NEXT:    pand %xmm6, %xmm0
1500 ; SSE41-NEXT:    por %xmm3, %xmm0
1501 ; SSE41-NEXT:    movapd %xmm2, %xmm3
1502 ; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm3
1503 ; SSE41-NEXT:    xorpd %xmm9, %xmm5
1504 ; SSE41-NEXT:    movapd %xmm5, %xmm6
1505 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm6
1506 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
1507 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm5
1508 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
1509 ; SSE41-NEXT:    pand %xmm4, %xmm0
1510 ; SSE41-NEXT:    por %xmm6, %xmm0
1511 ; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm2
1512 ; SSE41-NEXT:    movapd {{.*#+}} xmm0 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
1513 ; SSE41-NEXT:    andpd %xmm0, %xmm2
1514 ; SSE41-NEXT:    andpd %xmm0, %xmm3
1515 ; SSE41-NEXT:    packusdw %xmm2, %xmm3
1516 ; SSE41-NEXT:    andpd %xmm0, %xmm7
1517 ; SSE41-NEXT:    andpd %xmm0, %xmm1
1518 ; SSE41-NEXT:    packusdw %xmm7, %xmm1
1519 ; SSE41-NEXT:    packusdw %xmm3, %xmm1
1520 ; SSE41-NEXT:    packuswb %xmm1, %xmm1
1521 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1522 ; SSE41-NEXT:    retq
1524 ; AVX1-LABEL: trunc_ssat_v8i64_v8i8:
1525 ; AVX1:       # %bb.0:
1526 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm8 = [127,127,127,127]
1527 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1528 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [127,127]
1529 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm5
1530 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm6
1531 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm6, %ymm7
1532 ; AVX1-NEXT:    vblendvpd %ymm7, %ymm1, %ymm8, %ymm9
1533 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1534 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm7
1535 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm4, %xmm10
1536 ; AVX1-NEXT:    vinsertf128 $1, %xmm7, %ymm10, %ymm11
1537 ; AVX1-NEXT:    vblendvpd %ymm11, %ymm0, %ymm8, %ymm8
1538 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm11 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
1539 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm2, %xmm4, %xmm2
1540 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [18446744073709551488,18446744073709551488]
1541 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm2, %xmm2
1542 ; AVX1-NEXT:    vblendvpd %xmm10, %xmm0, %xmm4, %xmm0
1543 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm0, %xmm0
1544 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1545 ; AVX1-NEXT:    vblendvpd %ymm0, %ymm8, %ymm11, %ymm0
1546 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm3, %xmm4, %xmm2
1547 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm2, %xmm2
1548 ; AVX1-NEXT:    vblendvpd %xmm6, %xmm1, %xmm4, %xmm1
1549 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm1, %xmm1
1550 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1551 ; AVX1-NEXT:    vblendvpd %ymm1, %ymm9, %ymm11, %ymm1
1552 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm2 = [255,255,255,255]
1553 ; AVX1-NEXT:    vandpd %ymm2, %ymm1, %ymm1
1554 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1555 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
1556 ; AVX1-NEXT:    vandpd %ymm2, %ymm0, %ymm0
1557 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1558 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
1559 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1560 ; AVX1-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
1561 ; AVX1-NEXT:    vzeroupper
1562 ; AVX1-NEXT:    retq
1564 ; AVX2-LABEL: trunc_ssat_v8i64_v8i8:
1565 ; AVX2:       # %bb.0:
1566 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [127,127,127,127]
1567 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
1568 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
1569 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
1570 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1571 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
1572 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
1573 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1574 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm3
1575 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
1576 ; AVX2-NEXT:    vextractf128 $1, %ymm1, %xmm2
1577 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = <u,u,0,8,u,u,u,u,u,u,u,u,u,u,u,u>
1578 ; AVX2-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
1579 ; AVX2-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
1580 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1581 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm2
1582 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
1583 ; AVX2-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
1584 ; AVX2-NEXT:    vpshufb %xmm3, %xmm0, %xmm0
1585 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
1586 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
1587 ; AVX2-NEXT:    vzeroupper
1588 ; AVX2-NEXT:    retq
1590 ; AVX512-LABEL: trunc_ssat_v8i64_v8i8:
1591 ; AVX512:       # %bb.0:
1592 ; AVX512-NEXT:    vpminsq {{.*}}(%rip){1to8}, %zmm0, %zmm0
1593 ; AVX512-NEXT:    vpmaxsq {{.*}}(%rip){1to8}, %zmm0, %zmm0
1594 ; AVX512-NEXT:    vpmovqb %zmm0, %xmm0
1595 ; AVX512-NEXT:    vzeroupper
1596 ; AVX512-NEXT:    retq
1597   %1 = icmp slt <8 x i64> %a0, <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>
1598   %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>
1599   %3 = icmp sgt <8 x i64> %2, <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>
1600   %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>
1601   %5 = trunc <8 x i64> %4 to <8 x i8>
1602   ret <8 x i8> %5
1605 ; TODO: The AVX1 codegen shows a missed opportunity to narrow blendv+logic to 128-bit.
1607 define void @trunc_ssat_v8i64_v8i8_store(<8 x i64> %a0, <8 x i8> *%p1) {
1608 ; SSE2-LABEL: trunc_ssat_v8i64_v8i8_store:
1609 ; SSE2:       # %bb.0:
1610 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [127,127]
1611 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
1612 ; SSE2-NEXT:    movdqa %xmm3, %xmm5
1613 ; SSE2-NEXT:    pxor %xmm4, %xmm5
1614 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [2147483775,2147483775]
1615 ; SSE2-NEXT:    movdqa %xmm9, %xmm7
1616 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
1617 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
1618 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm5
1619 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
1620 ; SSE2-NEXT:    pand %xmm10, %xmm6
1621 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1622 ; SSE2-NEXT:    por %xmm6, %xmm5
1623 ; SSE2-NEXT:    pand %xmm5, %xmm3
1624 ; SSE2-NEXT:    pandn %xmm8, %xmm5
1625 ; SSE2-NEXT:    por %xmm3, %xmm5
1626 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
1627 ; SSE2-NEXT:    pxor %xmm4, %xmm3
1628 ; SSE2-NEXT:    movdqa %xmm9, %xmm6
1629 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
1630 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
1631 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm3
1632 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
1633 ; SSE2-NEXT:    pand %xmm10, %xmm7
1634 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
1635 ; SSE2-NEXT:    por %xmm7, %xmm3
1636 ; SSE2-NEXT:    pand %xmm3, %xmm2
1637 ; SSE2-NEXT:    pandn %xmm8, %xmm3
1638 ; SSE2-NEXT:    por %xmm2, %xmm3
1639 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1640 ; SSE2-NEXT:    pxor %xmm4, %xmm2
1641 ; SSE2-NEXT:    movdqa %xmm9, %xmm6
1642 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
1643 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
1644 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm2
1645 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
1646 ; SSE2-NEXT:    pand %xmm10, %xmm7
1647 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
1648 ; SSE2-NEXT:    por %xmm7, %xmm2
1649 ; SSE2-NEXT:    pand %xmm2, %xmm1
1650 ; SSE2-NEXT:    pandn %xmm8, %xmm2
1651 ; SSE2-NEXT:    por %xmm1, %xmm2
1652 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1653 ; SSE2-NEXT:    pxor %xmm4, %xmm1
1654 ; SSE2-NEXT:    movdqa %xmm9, %xmm6
1655 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm6
1656 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1657 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
1658 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1659 ; SSE2-NEXT:    pand %xmm7, %xmm1
1660 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
1661 ; SSE2-NEXT:    por %xmm1, %xmm7
1662 ; SSE2-NEXT:    pand %xmm7, %xmm0
1663 ; SSE2-NEXT:    pandn %xmm8, %xmm7
1664 ; SSE2-NEXT:    por %xmm0, %xmm7
1665 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
1666 ; SSE2-NEXT:    movdqa %xmm7, %xmm0
1667 ; SSE2-NEXT:    pxor %xmm4, %xmm0
1668 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [18446744071562067840,18446744071562067840]
1669 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
1670 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm1
1671 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm1[0,0,2,2]
1672 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
1673 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
1674 ; SSE2-NEXT:    pand %xmm10, %xmm6
1675 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1676 ; SSE2-NEXT:    por %xmm6, %xmm0
1677 ; SSE2-NEXT:    pand %xmm0, %xmm7
1678 ; SSE2-NEXT:    pandn %xmm8, %xmm0
1679 ; SSE2-NEXT:    por %xmm7, %xmm0
1680 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
1681 ; SSE2-NEXT:    pxor %xmm4, %xmm1
1682 ; SSE2-NEXT:    movdqa %xmm1, %xmm6
1683 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm6
1684 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1685 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
1686 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1687 ; SSE2-NEXT:    pand %xmm7, %xmm1
1688 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
1689 ; SSE2-NEXT:    por %xmm1, %xmm7
1690 ; SSE2-NEXT:    pand %xmm7, %xmm2
1691 ; SSE2-NEXT:    pandn %xmm8, %xmm7
1692 ; SSE2-NEXT:    por %xmm2, %xmm7
1693 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
1694 ; SSE2-NEXT:    pxor %xmm4, %xmm1
1695 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
1696 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm2
1697 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
1698 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm1
1699 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1700 ; SSE2-NEXT:    pand %xmm6, %xmm1
1701 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1702 ; SSE2-NEXT:    por %xmm1, %xmm2
1703 ; SSE2-NEXT:    pand %xmm2, %xmm3
1704 ; SSE2-NEXT:    pandn %xmm8, %xmm2
1705 ; SSE2-NEXT:    por %xmm3, %xmm2
1706 ; SSE2-NEXT:    pxor %xmm5, %xmm4
1707 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
1708 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm1
1709 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
1710 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm4
1711 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1712 ; SSE2-NEXT:    pand %xmm3, %xmm4
1713 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1714 ; SSE2-NEXT:    por %xmm4, %xmm1
1715 ; SSE2-NEXT:    pand %xmm1, %xmm5
1716 ; SSE2-NEXT:    pandn %xmm8, %xmm1
1717 ; SSE2-NEXT:    por %xmm5, %xmm1
1718 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
1719 ; SSE2-NEXT:    pand %xmm3, %xmm1
1720 ; SSE2-NEXT:    pand %xmm3, %xmm2
1721 ; SSE2-NEXT:    packuswb %xmm1, %xmm2
1722 ; SSE2-NEXT:    pand %xmm3, %xmm7
1723 ; SSE2-NEXT:    pand %xmm3, %xmm0
1724 ; SSE2-NEXT:    packuswb %xmm7, %xmm0
1725 ; SSE2-NEXT:    packuswb %xmm2, %xmm0
1726 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
1727 ; SSE2-NEXT:    movq %xmm0, (%rdi)
1728 ; SSE2-NEXT:    retq
1730 ; SSSE3-LABEL: trunc_ssat_v8i64_v8i8_store:
1731 ; SSSE3:       # %bb.0:
1732 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [127,127]
1733 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
1734 ; SSSE3-NEXT:    movdqa %xmm3, %xmm5
1735 ; SSSE3-NEXT:    pxor %xmm4, %xmm5
1736 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [2147483775,2147483775]
1737 ; SSSE3-NEXT:    movdqa %xmm9, %xmm7
1738 ; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm7
1739 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
1740 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm5
1741 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
1742 ; SSSE3-NEXT:    pand %xmm10, %xmm6
1743 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1744 ; SSSE3-NEXT:    por %xmm6, %xmm5
1745 ; SSSE3-NEXT:    pand %xmm5, %xmm3
1746 ; SSSE3-NEXT:    pandn %xmm8, %xmm5
1747 ; SSSE3-NEXT:    por %xmm3, %xmm5
1748 ; SSSE3-NEXT:    movdqa %xmm2, %xmm3
1749 ; SSSE3-NEXT:    pxor %xmm4, %xmm3
1750 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
1751 ; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm6
1752 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
1753 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm3
1754 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
1755 ; SSSE3-NEXT:    pand %xmm10, %xmm7
1756 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
1757 ; SSSE3-NEXT:    por %xmm7, %xmm3
1758 ; SSSE3-NEXT:    pand %xmm3, %xmm2
1759 ; SSSE3-NEXT:    pandn %xmm8, %xmm3
1760 ; SSSE3-NEXT:    por %xmm2, %xmm3
1761 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1762 ; SSSE3-NEXT:    pxor %xmm4, %xmm2
1763 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
1764 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm6
1765 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
1766 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm2
1767 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
1768 ; SSSE3-NEXT:    pand %xmm10, %xmm7
1769 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
1770 ; SSSE3-NEXT:    por %xmm7, %xmm2
1771 ; SSSE3-NEXT:    pand %xmm2, %xmm1
1772 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
1773 ; SSSE3-NEXT:    por %xmm1, %xmm2
1774 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
1775 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
1776 ; SSSE3-NEXT:    movdqa %xmm9, %xmm6
1777 ; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm6
1778 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1779 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
1780 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1781 ; SSSE3-NEXT:    pand %xmm7, %xmm1
1782 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
1783 ; SSSE3-NEXT:    por %xmm1, %xmm7
1784 ; SSSE3-NEXT:    pand %xmm7, %xmm0
1785 ; SSSE3-NEXT:    pandn %xmm8, %xmm7
1786 ; SSSE3-NEXT:    por %xmm0, %xmm7
1787 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
1788 ; SSSE3-NEXT:    movdqa %xmm7, %xmm0
1789 ; SSSE3-NEXT:    pxor %xmm4, %xmm0
1790 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [18446744071562067840,18446744071562067840]
1791 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
1792 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm1
1793 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm1[0,0,2,2]
1794 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
1795 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
1796 ; SSSE3-NEXT:    pand %xmm10, %xmm6
1797 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1798 ; SSSE3-NEXT:    por %xmm6, %xmm0
1799 ; SSSE3-NEXT:    pand %xmm0, %xmm7
1800 ; SSSE3-NEXT:    pandn %xmm8, %xmm0
1801 ; SSSE3-NEXT:    por %xmm7, %xmm0
1802 ; SSSE3-NEXT:    movdqa %xmm2, %xmm1
1803 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
1804 ; SSSE3-NEXT:    movdqa %xmm1, %xmm6
1805 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm6
1806 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1807 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
1808 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1809 ; SSSE3-NEXT:    pand %xmm7, %xmm1
1810 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
1811 ; SSSE3-NEXT:    por %xmm1, %xmm7
1812 ; SSSE3-NEXT:    pand %xmm7, %xmm2
1813 ; SSSE3-NEXT:    pandn %xmm8, %xmm7
1814 ; SSSE3-NEXT:    por %xmm2, %xmm7
1815 ; SSSE3-NEXT:    movdqa %xmm3, %xmm1
1816 ; SSSE3-NEXT:    pxor %xmm4, %xmm1
1817 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
1818 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm2
1819 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
1820 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm1
1821 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1822 ; SSSE3-NEXT:    pand %xmm6, %xmm1
1823 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1824 ; SSSE3-NEXT:    por %xmm1, %xmm2
1825 ; SSSE3-NEXT:    pand %xmm2, %xmm3
1826 ; SSSE3-NEXT:    pandn %xmm8, %xmm2
1827 ; SSSE3-NEXT:    por %xmm3, %xmm2
1828 ; SSSE3-NEXT:    pxor %xmm5, %xmm4
1829 ; SSSE3-NEXT:    movdqa %xmm4, %xmm1
1830 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm1
1831 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
1832 ; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm4
1833 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1834 ; SSSE3-NEXT:    pand %xmm3, %xmm4
1835 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1836 ; SSSE3-NEXT:    por %xmm4, %xmm1
1837 ; SSSE3-NEXT:    pand %xmm1, %xmm5
1838 ; SSSE3-NEXT:    pandn %xmm8, %xmm1
1839 ; SSSE3-NEXT:    por %xmm5, %xmm1
1840 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm3 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
1841 ; SSSE3-NEXT:    pand %xmm3, %xmm1
1842 ; SSSE3-NEXT:    pand %xmm3, %xmm2
1843 ; SSSE3-NEXT:    packuswb %xmm1, %xmm2
1844 ; SSSE3-NEXT:    pand %xmm3, %xmm7
1845 ; SSSE3-NEXT:    pand %xmm3, %xmm0
1846 ; SSSE3-NEXT:    packuswb %xmm7, %xmm0
1847 ; SSSE3-NEXT:    packuswb %xmm2, %xmm0
1848 ; SSSE3-NEXT:    packuswb %xmm0, %xmm0
1849 ; SSSE3-NEXT:    movq %xmm0, (%rdi)
1850 ; SSSE3-NEXT:    retq
1852 ; SSE41-LABEL: trunc_ssat_v8i64_v8i8_store:
1853 ; SSE41:       # %bb.0:
1854 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
1855 ; SSE41-NEXT:    movapd {{.*#+}} xmm7 = [127,127]
1856 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648]
1857 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
1858 ; SSE41-NEXT:    pxor %xmm5, %xmm0
1859 ; SSE41-NEXT:    movdqa {{.*#+}} xmm10 = [2147483775,2147483775]
1860 ; SSE41-NEXT:    movdqa %xmm10, %xmm6
1861 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
1862 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
1863 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
1864 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1865 ; SSE41-NEXT:    pand %xmm4, %xmm0
1866 ; SSE41-NEXT:    por %xmm6, %xmm0
1867 ; SSE41-NEXT:    movapd %xmm7, %xmm9
1868 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm9
1869 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
1870 ; SSE41-NEXT:    pxor %xmm5, %xmm0
1871 ; SSE41-NEXT:    movdqa %xmm10, %xmm3
1872 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
1873 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1874 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
1875 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1876 ; SSE41-NEXT:    pand %xmm4, %xmm0
1877 ; SSE41-NEXT:    por %xmm3, %xmm0
1878 ; SSE41-NEXT:    movapd %xmm7, %xmm11
1879 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm11
1880 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1881 ; SSE41-NEXT:    pxor %xmm5, %xmm0
1882 ; SSE41-NEXT:    movdqa %xmm10, %xmm2
1883 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
1884 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1885 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
1886 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1887 ; SSE41-NEXT:    pand %xmm4, %xmm0
1888 ; SSE41-NEXT:    por %xmm2, %xmm0
1889 ; SSE41-NEXT:    movapd %xmm7, %xmm6
1890 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm6
1891 ; SSE41-NEXT:    movdqa %xmm8, %xmm0
1892 ; SSE41-NEXT:    pxor %xmm5, %xmm0
1893 ; SSE41-NEXT:    movdqa %xmm10, %xmm1
1894 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm1
1895 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
1896 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
1897 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1898 ; SSE41-NEXT:    pand %xmm2, %xmm0
1899 ; SSE41-NEXT:    por %xmm1, %xmm0
1900 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm7
1901 ; SSE41-NEXT:    movapd {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
1902 ; SSE41-NEXT:    movapd %xmm7, %xmm0
1903 ; SSE41-NEXT:    xorpd %xmm5, %xmm0
1904 ; SSE41-NEXT:    movdqa {{.*#+}} xmm8 = [18446744071562067840,18446744071562067840]
1905 ; SSE41-NEXT:    movapd %xmm0, %xmm2
1906 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm2
1907 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
1908 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm0
1909 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1910 ; SSE41-NEXT:    pand %xmm3, %xmm0
1911 ; SSE41-NEXT:    por %xmm2, %xmm0
1912 ; SSE41-NEXT:    movapd %xmm1, %xmm2
1913 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm2
1914 ; SSE41-NEXT:    movapd %xmm6, %xmm0
1915 ; SSE41-NEXT:    xorpd %xmm5, %xmm0
1916 ; SSE41-NEXT:    movapd %xmm0, %xmm3
1917 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm3
1918 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[0,0,2,2]
1919 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm0
1920 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1921 ; SSE41-NEXT:    pand %xmm7, %xmm0
1922 ; SSE41-NEXT:    por %xmm3, %xmm0
1923 ; SSE41-NEXT:    movapd %xmm1, %xmm7
1924 ; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm7
1925 ; SSE41-NEXT:    movapd %xmm11, %xmm0
1926 ; SSE41-NEXT:    xorpd %xmm5, %xmm0
1927 ; SSE41-NEXT:    movapd %xmm0, %xmm3
1928 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm3
1929 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
1930 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm0
1931 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1932 ; SSE41-NEXT:    pand %xmm6, %xmm0
1933 ; SSE41-NEXT:    por %xmm3, %xmm0
1934 ; SSE41-NEXT:    movapd %xmm1, %xmm3
1935 ; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm3
1936 ; SSE41-NEXT:    xorpd %xmm9, %xmm5
1937 ; SSE41-NEXT:    movapd %xmm5, %xmm6
1938 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm6
1939 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
1940 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm5
1941 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
1942 ; SSE41-NEXT:    pand %xmm4, %xmm0
1943 ; SSE41-NEXT:    por %xmm6, %xmm0
1944 ; SSE41-NEXT:    blendvpd %xmm0, %xmm9, %xmm1
1945 ; SSE41-NEXT:    movapd {{.*#+}} xmm0 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
1946 ; SSE41-NEXT:    andpd %xmm0, %xmm1
1947 ; SSE41-NEXT:    andpd %xmm0, %xmm3
1948 ; SSE41-NEXT:    packusdw %xmm1, %xmm3
1949 ; SSE41-NEXT:    andpd %xmm0, %xmm7
1950 ; SSE41-NEXT:    andpd %xmm0, %xmm2
1951 ; SSE41-NEXT:    packusdw %xmm7, %xmm2
1952 ; SSE41-NEXT:    packusdw %xmm3, %xmm2
1953 ; SSE41-NEXT:    packuswb %xmm2, %xmm2
1954 ; SSE41-NEXT:    movq %xmm2, (%rdi)
1955 ; SSE41-NEXT:    retq
1957 ; AVX1-LABEL: trunc_ssat_v8i64_v8i8_store:
1958 ; AVX1:       # %bb.0:
1959 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm8 = [127,127,127,127]
1960 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1961 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [127,127]
1962 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm5
1963 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm6
1964 ; AVX1-NEXT:    vinsertf128 $1, %xmm5, %ymm6, %ymm7
1965 ; AVX1-NEXT:    vblendvpd %ymm7, %ymm1, %ymm8, %ymm9
1966 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1967 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm7
1968 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm4, %xmm10
1969 ; AVX1-NEXT:    vinsertf128 $1, %xmm7, %ymm10, %ymm11
1970 ; AVX1-NEXT:    vblendvpd %ymm11, %ymm0, %ymm8, %ymm8
1971 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm11 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
1972 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm2, %xmm4, %xmm2
1973 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [18446744073709551488,18446744073709551488]
1974 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm2, %xmm2
1975 ; AVX1-NEXT:    vblendvpd %xmm10, %xmm0, %xmm4, %xmm0
1976 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm0, %xmm0
1977 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1978 ; AVX1-NEXT:    vblendvpd %ymm0, %ymm8, %ymm11, %ymm0
1979 ; AVX1-NEXT:    vblendvpd %xmm5, %xmm3, %xmm4, %xmm2
1980 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm2, %xmm2
1981 ; AVX1-NEXT:    vblendvpd %xmm6, %xmm1, %xmm4, %xmm1
1982 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm1, %xmm1
1983 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
1984 ; AVX1-NEXT:    vblendvpd %ymm1, %ymm9, %ymm11, %ymm1
1985 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm2 = [255,255,255,255]
1986 ; AVX1-NEXT:    vandpd %ymm2, %ymm1, %ymm1
1987 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1988 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
1989 ; AVX1-NEXT:    vandpd %ymm2, %ymm0, %ymm0
1990 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1991 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
1992 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1993 ; AVX1-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
1994 ; AVX1-NEXT:    vmovq %xmm0, (%rdi)
1995 ; AVX1-NEXT:    vzeroupper
1996 ; AVX1-NEXT:    retq
1998 ; AVX2-LABEL: trunc_ssat_v8i64_v8i8_store:
1999 ; AVX2:       # %bb.0:
2000 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [127,127,127,127]
2001 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm2, %ymm3
2002 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
2003 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
2004 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
2005 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
2006 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
2007 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
2008 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm1, %ymm3
2009 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm1, %ymm2, %ymm1
2010 ; AVX2-NEXT:    vextractf128 $1, %ymm1, %xmm2
2011 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = <u,u,0,8,u,u,u,u,u,u,u,u,u,u,u,u>
2012 ; AVX2-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
2013 ; AVX2-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
2014 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
2015 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm2
2016 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2017 ; AVX2-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
2018 ; AVX2-NEXT:    vpshufb %xmm3, %xmm0, %xmm0
2019 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
2020 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
2021 ; AVX2-NEXT:    vmovq %xmm0, (%rdi)
2022 ; AVX2-NEXT:    vzeroupper
2023 ; AVX2-NEXT:    retq
2025 ; AVX512-LABEL: trunc_ssat_v8i64_v8i8_store:
2026 ; AVX512:       # %bb.0:
2027 ; AVX512-NEXT:    vpmovsqb %zmm0, (%rdi)
2028 ; AVX512-NEXT:    vzeroupper
2029 ; AVX512-NEXT:    retq
2030   %1 = icmp slt <8 x i64> %a0, <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>
2031   %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>
2032   %3 = icmp sgt <8 x i64> %2, <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>
2033   %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>
2034   %5 = trunc <8 x i64> %4 to <8 x i8>
2035   store <8 x i8> %5, <8 x i8> *%p1
2036   ret void
2039 define <16 x i8> @trunc_ssat_v16i64_v16i8(<16 x i64> %a0) {
2040 ; SSE2-LABEL: trunc_ssat_v16i64_v16i8:
2041 ; SSE2:       # %bb.0:
2042 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [127,127]
2043 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648]
2044 ; SSE2-NEXT:    movdqa %xmm6, %xmm9
2045 ; SSE2-NEXT:    pxor %xmm8, %xmm9
2046 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [2147483775,2147483775]
2047 ; SSE2-NEXT:    movdqa %xmm11, %xmm12
2048 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm12
2049 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
2050 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm9
2051 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm9[1,1,3,3]
2052 ; SSE2-NEXT:    pand %xmm13, %xmm14
2053 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm12[1,1,3,3]
2054 ; SSE2-NEXT:    por %xmm14, %xmm9
2055 ; SSE2-NEXT:    pand %xmm9, %xmm6
2056 ; SSE2-NEXT:    pandn %xmm10, %xmm9
2057 ; SSE2-NEXT:    por %xmm6, %xmm9
2058 ; SSE2-NEXT:    movdqa %xmm7, %xmm6
2059 ; SSE2-NEXT:    pxor %xmm8, %xmm6
2060 ; SSE2-NEXT:    movdqa %xmm11, %xmm12
2061 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm12
2062 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
2063 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm6
2064 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2065 ; SSE2-NEXT:    pand %xmm13, %xmm6
2066 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
2067 ; SSE2-NEXT:    por %xmm6, %xmm12
2068 ; SSE2-NEXT:    pand %xmm12, %xmm7
2069 ; SSE2-NEXT:    pandn %xmm10, %xmm12
2070 ; SSE2-NEXT:    por %xmm7, %xmm12
2071 ; SSE2-NEXT:    movdqa %xmm4, %xmm6
2072 ; SSE2-NEXT:    pxor %xmm8, %xmm6
2073 ; SSE2-NEXT:    movdqa %xmm11, %xmm7
2074 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
2075 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm7[0,0,2,2]
2076 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm6
2077 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2078 ; SSE2-NEXT:    pand %xmm13, %xmm6
2079 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm7[1,1,3,3]
2080 ; SSE2-NEXT:    por %xmm6, %xmm13
2081 ; SSE2-NEXT:    pand %xmm13, %xmm4
2082 ; SSE2-NEXT:    pandn %xmm10, %xmm13
2083 ; SSE2-NEXT:    por %xmm4, %xmm13
2084 ; SSE2-NEXT:    movdqa %xmm5, %xmm4
2085 ; SSE2-NEXT:    pxor %xmm8, %xmm4
2086 ; SSE2-NEXT:    movdqa %xmm11, %xmm6
2087 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
2088 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2089 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm4
2090 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2091 ; SSE2-NEXT:    pand %xmm7, %xmm4
2092 ; SSE2-NEXT:    pshufd {{.*#+}} xmm14 = xmm6[1,1,3,3]
2093 ; SSE2-NEXT:    por %xmm4, %xmm14
2094 ; SSE2-NEXT:    pand %xmm14, %xmm5
2095 ; SSE2-NEXT:    pandn %xmm10, %xmm14
2096 ; SSE2-NEXT:    por %xmm5, %xmm14
2097 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
2098 ; SSE2-NEXT:    pxor %xmm8, %xmm4
2099 ; SSE2-NEXT:    movdqa %xmm11, %xmm5
2100 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm5
2101 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
2102 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm4
2103 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2104 ; SSE2-NEXT:    pand %xmm6, %xmm4
2105 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2106 ; SSE2-NEXT:    por %xmm4, %xmm5
2107 ; SSE2-NEXT:    pand %xmm5, %xmm2
2108 ; SSE2-NEXT:    pandn %xmm10, %xmm5
2109 ; SSE2-NEXT:    por %xmm2, %xmm5
2110 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
2111 ; SSE2-NEXT:    pxor %xmm8, %xmm2
2112 ; SSE2-NEXT:    movdqa %xmm11, %xmm4
2113 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
2114 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2115 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm2
2116 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2117 ; SSE2-NEXT:    pand %xmm6, %xmm2
2118 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3]
2119 ; SSE2-NEXT:    por %xmm2, %xmm6
2120 ; SSE2-NEXT:    pand %xmm6, %xmm3
2121 ; SSE2-NEXT:    pandn %xmm10, %xmm6
2122 ; SSE2-NEXT:    por %xmm3, %xmm6
2123 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
2124 ; SSE2-NEXT:    pxor %xmm8, %xmm2
2125 ; SSE2-NEXT:    movdqa %xmm11, %xmm3
2126 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
2127 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2128 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm2
2129 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2130 ; SSE2-NEXT:    pand %xmm4, %xmm2
2131 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2132 ; SSE2-NEXT:    por %xmm2, %xmm3
2133 ; SSE2-NEXT:    pand %xmm3, %xmm0
2134 ; SSE2-NEXT:    pandn %xmm10, %xmm3
2135 ; SSE2-NEXT:    por %xmm0, %xmm3
2136 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
2137 ; SSE2-NEXT:    pxor %xmm8, %xmm0
2138 ; SSE2-NEXT:    movdqa %xmm11, %xmm2
2139 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
2140 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2141 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm0
2142 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2143 ; SSE2-NEXT:    pand %xmm4, %xmm0
2144 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
2145 ; SSE2-NEXT:    por %xmm0, %xmm4
2146 ; SSE2-NEXT:    pand %xmm4, %xmm1
2147 ; SSE2-NEXT:    pandn %xmm10, %xmm4
2148 ; SSE2-NEXT:    por %xmm1, %xmm4
2149 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [18446744073709551488,18446744073709551488]
2150 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
2151 ; SSE2-NEXT:    pxor %xmm8, %xmm0
2152 ; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [18446744071562067840,18446744071562067840]
2153 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
2154 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm1
2155 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
2156 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm0
2157 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2158 ; SSE2-NEXT:    pand %xmm2, %xmm0
2159 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2160 ; SSE2-NEXT:    por %xmm0, %xmm1
2161 ; SSE2-NEXT:    pand %xmm1, %xmm4
2162 ; SSE2-NEXT:    pandn %xmm10, %xmm1
2163 ; SSE2-NEXT:    por %xmm4, %xmm1
2164 ; SSE2-NEXT:    movdqa %xmm3, %xmm0
2165 ; SSE2-NEXT:    pxor %xmm8, %xmm0
2166 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
2167 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm2
2168 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2169 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm0
2170 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
2171 ; SSE2-NEXT:    pand %xmm4, %xmm7
2172 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
2173 ; SSE2-NEXT:    por %xmm7, %xmm0
2174 ; SSE2-NEXT:    pand %xmm0, %xmm3
2175 ; SSE2-NEXT:    pandn %xmm10, %xmm0
2176 ; SSE2-NEXT:    por %xmm3, %xmm0
2177 ; SSE2-NEXT:    packssdw %xmm1, %xmm0
2178 ; SSE2-NEXT:    movdqa %xmm6, %xmm1
2179 ; SSE2-NEXT:    pxor %xmm8, %xmm1
2180 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
2181 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm2
2182 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
2183 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm1
2184 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2185 ; SSE2-NEXT:    pand %xmm3, %xmm1
2186 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2187 ; SSE2-NEXT:    por %xmm1, %xmm2
2188 ; SSE2-NEXT:    pand %xmm2, %xmm6
2189 ; SSE2-NEXT:    pandn %xmm10, %xmm2
2190 ; SSE2-NEXT:    por %xmm6, %xmm2
2191 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
2192 ; SSE2-NEXT:    pxor %xmm8, %xmm1
2193 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
2194 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm3
2195 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2196 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm1
2197 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2198 ; SSE2-NEXT:    pand %xmm4, %xmm1
2199 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2200 ; SSE2-NEXT:    por %xmm1, %xmm3
2201 ; SSE2-NEXT:    pand %xmm3, %xmm5
2202 ; SSE2-NEXT:    pandn %xmm10, %xmm3
2203 ; SSE2-NEXT:    por %xmm5, %xmm3
2204 ; SSE2-NEXT:    packssdw %xmm2, %xmm3
2205 ; SSE2-NEXT:    packssdw %xmm3, %xmm0
2206 ; SSE2-NEXT:    movdqa %xmm14, %xmm1
2207 ; SSE2-NEXT:    pxor %xmm8, %xmm1
2208 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
2209 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm2
2210 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
2211 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm1
2212 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2213 ; SSE2-NEXT:    pand %xmm3, %xmm1
2214 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2215 ; SSE2-NEXT:    por %xmm1, %xmm2
2216 ; SSE2-NEXT:    pand %xmm2, %xmm14
2217 ; SSE2-NEXT:    pandn %xmm10, %xmm2
2218 ; SSE2-NEXT:    por %xmm14, %xmm2
2219 ; SSE2-NEXT:    movdqa %xmm13, %xmm1
2220 ; SSE2-NEXT:    pxor %xmm8, %xmm1
2221 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
2222 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm3
2223 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2224 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm1
2225 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2226 ; SSE2-NEXT:    pand %xmm4, %xmm1
2227 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2228 ; SSE2-NEXT:    por %xmm1, %xmm3
2229 ; SSE2-NEXT:    pand %xmm3, %xmm13
2230 ; SSE2-NEXT:    pandn %xmm10, %xmm3
2231 ; SSE2-NEXT:    por %xmm13, %xmm3
2232 ; SSE2-NEXT:    packssdw %xmm2, %xmm3
2233 ; SSE2-NEXT:    movdqa %xmm12, %xmm1
2234 ; SSE2-NEXT:    pxor %xmm8, %xmm1
2235 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
2236 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm2
2237 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2238 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm1
2239 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2240 ; SSE2-NEXT:    pand %xmm4, %xmm1
2241 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2242 ; SSE2-NEXT:    por %xmm1, %xmm2
2243 ; SSE2-NEXT:    pand %xmm2, %xmm12
2244 ; SSE2-NEXT:    pandn %xmm10, %xmm2
2245 ; SSE2-NEXT:    por %xmm12, %xmm2
2246 ; SSE2-NEXT:    pxor %xmm9, %xmm8
2247 ; SSE2-NEXT:    movdqa %xmm8, %xmm1
2248 ; SSE2-NEXT:    pcmpgtd %xmm11, %xmm1
2249 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
2250 ; SSE2-NEXT:    pcmpeqd %xmm11, %xmm8
2251 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]
2252 ; SSE2-NEXT:    pand %xmm4, %xmm5
2253 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2254 ; SSE2-NEXT:    por %xmm5, %xmm1
2255 ; SSE2-NEXT:    pand %xmm1, %xmm9
2256 ; SSE2-NEXT:    pandn %xmm10, %xmm1
2257 ; SSE2-NEXT:    por %xmm9, %xmm1
2258 ; SSE2-NEXT:    packssdw %xmm2, %xmm1
2259 ; SSE2-NEXT:    packssdw %xmm1, %xmm3
2260 ; SSE2-NEXT:    packsswb %xmm3, %xmm0
2261 ; SSE2-NEXT:    retq
2263 ; SSSE3-LABEL: trunc_ssat_v16i64_v16i8:
2264 ; SSSE3:       # %bb.0:
2265 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [127,127]
2266 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,2147483648]
2267 ; SSSE3-NEXT:    movdqa %xmm6, %xmm9
2268 ; SSSE3-NEXT:    pxor %xmm8, %xmm9
2269 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm11 = [2147483775,2147483775]
2270 ; SSSE3-NEXT:    movdqa %xmm11, %xmm12
2271 ; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm12
2272 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
2273 ; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm9
2274 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm14 = xmm9[1,1,3,3]
2275 ; SSSE3-NEXT:    pand %xmm13, %xmm14
2276 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm12[1,1,3,3]
2277 ; SSSE3-NEXT:    por %xmm14, %xmm9
2278 ; SSSE3-NEXT:    pand %xmm9, %xmm6
2279 ; SSSE3-NEXT:    pandn %xmm10, %xmm9
2280 ; SSSE3-NEXT:    por %xmm6, %xmm9
2281 ; SSSE3-NEXT:    movdqa %xmm7, %xmm6
2282 ; SSSE3-NEXT:    pxor %xmm8, %xmm6
2283 ; SSSE3-NEXT:    movdqa %xmm11, %xmm12
2284 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm12
2285 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
2286 ; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm6
2287 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2288 ; SSSE3-NEXT:    pand %xmm13, %xmm6
2289 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
2290 ; SSSE3-NEXT:    por %xmm6, %xmm12
2291 ; SSSE3-NEXT:    pand %xmm12, %xmm7
2292 ; SSSE3-NEXT:    pandn %xmm10, %xmm12
2293 ; SSSE3-NEXT:    por %xmm7, %xmm12
2294 ; SSSE3-NEXT:    movdqa %xmm4, %xmm6
2295 ; SSSE3-NEXT:    pxor %xmm8, %xmm6
2296 ; SSSE3-NEXT:    movdqa %xmm11, %xmm7
2297 ; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm7
2298 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm7[0,0,2,2]
2299 ; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm6
2300 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
2301 ; SSSE3-NEXT:    pand %xmm13, %xmm6
2302 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm13 = xmm7[1,1,3,3]
2303 ; SSSE3-NEXT:    por %xmm6, %xmm13
2304 ; SSSE3-NEXT:    pand %xmm13, %xmm4
2305 ; SSSE3-NEXT:    pandn %xmm10, %xmm13
2306 ; SSSE3-NEXT:    por %xmm4, %xmm13
2307 ; SSSE3-NEXT:    movdqa %xmm5, %xmm4
2308 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
2309 ; SSSE3-NEXT:    movdqa %xmm11, %xmm6
2310 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm6
2311 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2312 ; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm4
2313 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2314 ; SSSE3-NEXT:    pand %xmm7, %xmm4
2315 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm14 = xmm6[1,1,3,3]
2316 ; SSSE3-NEXT:    por %xmm4, %xmm14
2317 ; SSSE3-NEXT:    pand %xmm14, %xmm5
2318 ; SSSE3-NEXT:    pandn %xmm10, %xmm14
2319 ; SSSE3-NEXT:    por %xmm5, %xmm14
2320 ; SSSE3-NEXT:    movdqa %xmm2, %xmm4
2321 ; SSSE3-NEXT:    pxor %xmm8, %xmm4
2322 ; SSSE3-NEXT:    movdqa %xmm11, %xmm5
2323 ; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm5
2324 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
2325 ; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm4
2326 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2327 ; SSSE3-NEXT:    pand %xmm6, %xmm4
2328 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2329 ; SSSE3-NEXT:    por %xmm4, %xmm5
2330 ; SSSE3-NEXT:    pand %xmm5, %xmm2
2331 ; SSSE3-NEXT:    pandn %xmm10, %xmm5
2332 ; SSSE3-NEXT:    por %xmm2, %xmm5
2333 ; SSSE3-NEXT:    movdqa %xmm3, %xmm2
2334 ; SSSE3-NEXT:    pxor %xmm8, %xmm2
2335 ; SSSE3-NEXT:    movdqa %xmm11, %xmm4
2336 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm4
2337 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2338 ; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm2
2339 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2340 ; SSSE3-NEXT:    pand %xmm6, %xmm2
2341 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3]
2342 ; SSSE3-NEXT:    por %xmm2, %xmm6
2343 ; SSSE3-NEXT:    pand %xmm6, %xmm3
2344 ; SSSE3-NEXT:    pandn %xmm10, %xmm6
2345 ; SSSE3-NEXT:    por %xmm3, %xmm6
2346 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
2347 ; SSSE3-NEXT:    pxor %xmm8, %xmm2
2348 ; SSSE3-NEXT:    movdqa %xmm11, %xmm3
2349 ; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
2350 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2351 ; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm2
2352 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2353 ; SSSE3-NEXT:    pand %xmm4, %xmm2
2354 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2355 ; SSSE3-NEXT:    por %xmm2, %xmm3
2356 ; SSSE3-NEXT:    pand %xmm3, %xmm0
2357 ; SSSE3-NEXT:    pandn %xmm10, %xmm3
2358 ; SSSE3-NEXT:    por %xmm0, %xmm3
2359 ; SSSE3-NEXT:    movdqa %xmm1, %xmm0
2360 ; SSSE3-NEXT:    pxor %xmm8, %xmm0
2361 ; SSSE3-NEXT:    movdqa %xmm11, %xmm2
2362 ; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
2363 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2364 ; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm0
2365 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2366 ; SSSE3-NEXT:    pand %xmm4, %xmm0
2367 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
2368 ; SSSE3-NEXT:    por %xmm0, %xmm4
2369 ; SSSE3-NEXT:    pand %xmm4, %xmm1
2370 ; SSSE3-NEXT:    pandn %xmm10, %xmm4
2371 ; SSSE3-NEXT:    por %xmm1, %xmm4
2372 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm10 = [18446744073709551488,18446744073709551488]
2373 ; SSSE3-NEXT:    movdqa %xmm4, %xmm0
2374 ; SSSE3-NEXT:    pxor %xmm8, %xmm0
2375 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm11 = [18446744071562067840,18446744071562067840]
2376 ; SSSE3-NEXT:    movdqa %xmm0, %xmm1
2377 ; SSSE3-NEXT:    pcmpgtd %xmm11, %xmm1
2378 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
2379 ; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm0
2380 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2381 ; SSSE3-NEXT:    pand %xmm2, %xmm0
2382 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2383 ; SSSE3-NEXT:    por %xmm0, %xmm1
2384 ; SSSE3-NEXT:    pand %xmm1, %xmm4
2385 ; SSSE3-NEXT:    pandn %xmm10, %xmm1
2386 ; SSSE3-NEXT:    por %xmm4, %xmm1
2387 ; SSSE3-NEXT:    movdqa %xmm3, %xmm0
2388 ; SSSE3-NEXT:    pxor %xmm8, %xmm0
2389 ; SSSE3-NEXT:    movdqa %xmm0, %xmm2
2390 ; SSSE3-NEXT:    pcmpgtd %xmm11, %xmm2
2391 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2392 ; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm0
2393 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
2394 ; SSSE3-NEXT:    pand %xmm4, %xmm7
2395 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
2396 ; SSSE3-NEXT:    por %xmm7, %xmm0
2397 ; SSSE3-NEXT:    pand %xmm0, %xmm3
2398 ; SSSE3-NEXT:    pandn %xmm10, %xmm0
2399 ; SSSE3-NEXT:    por %xmm3, %xmm0
2400 ; SSSE3-NEXT:    packssdw %xmm1, %xmm0
2401 ; SSSE3-NEXT:    movdqa %xmm6, %xmm1
2402 ; SSSE3-NEXT:    pxor %xmm8, %xmm1
2403 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
2404 ; SSSE3-NEXT:    pcmpgtd %xmm11, %xmm2
2405 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
2406 ; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm1
2407 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2408 ; SSSE3-NEXT:    pand %xmm3, %xmm1
2409 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2410 ; SSSE3-NEXT:    por %xmm1, %xmm2
2411 ; SSSE3-NEXT:    pand %xmm2, %xmm6
2412 ; SSSE3-NEXT:    pandn %xmm10, %xmm2
2413 ; SSSE3-NEXT:    por %xmm6, %xmm2
2414 ; SSSE3-NEXT:    movdqa %xmm5, %xmm1
2415 ; SSSE3-NEXT:    pxor %xmm8, %xmm1
2416 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
2417 ; SSSE3-NEXT:    pcmpgtd %xmm11, %xmm3
2418 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2419 ; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm1
2420 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2421 ; SSSE3-NEXT:    pand %xmm4, %xmm1
2422 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2423 ; SSSE3-NEXT:    por %xmm1, %xmm3
2424 ; SSSE3-NEXT:    pand %xmm3, %xmm5
2425 ; SSSE3-NEXT:    pandn %xmm10, %xmm3
2426 ; SSSE3-NEXT:    por %xmm5, %xmm3
2427 ; SSSE3-NEXT:    packssdw %xmm2, %xmm3
2428 ; SSSE3-NEXT:    packssdw %xmm3, %xmm0
2429 ; SSSE3-NEXT:    movdqa %xmm14, %xmm1
2430 ; SSSE3-NEXT:    pxor %xmm8, %xmm1
2431 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
2432 ; SSSE3-NEXT:    pcmpgtd %xmm11, %xmm2
2433 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
2434 ; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm1
2435 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2436 ; SSSE3-NEXT:    pand %xmm3, %xmm1
2437 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2438 ; SSSE3-NEXT:    por %xmm1, %xmm2
2439 ; SSSE3-NEXT:    pand %xmm2, %xmm14
2440 ; SSSE3-NEXT:    pandn %xmm10, %xmm2
2441 ; SSSE3-NEXT:    por %xmm14, %xmm2
2442 ; SSSE3-NEXT:    movdqa %xmm13, %xmm1
2443 ; SSSE3-NEXT:    pxor %xmm8, %xmm1
2444 ; SSSE3-NEXT:    movdqa %xmm1, %xmm3
2445 ; SSSE3-NEXT:    pcmpgtd %xmm11, %xmm3
2446 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2447 ; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm1
2448 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2449 ; SSSE3-NEXT:    pand %xmm4, %xmm1
2450 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2451 ; SSSE3-NEXT:    por %xmm1, %xmm3
2452 ; SSSE3-NEXT:    pand %xmm3, %xmm13
2453 ; SSSE3-NEXT:    pandn %xmm10, %xmm3
2454 ; SSSE3-NEXT:    por %xmm13, %xmm3
2455 ; SSSE3-NEXT:    packssdw %xmm2, %xmm3
2456 ; SSSE3-NEXT:    movdqa %xmm12, %xmm1
2457 ; SSSE3-NEXT:    pxor %xmm8, %xmm1
2458 ; SSSE3-NEXT:    movdqa %xmm1, %xmm2
2459 ; SSSE3-NEXT:    pcmpgtd %xmm11, %xmm2
2460 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
2461 ; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm1
2462 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2463 ; SSSE3-NEXT:    pand %xmm4, %xmm1
2464 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
2465 ; SSSE3-NEXT:    por %xmm1, %xmm2
2466 ; SSSE3-NEXT:    pand %xmm2, %xmm12
2467 ; SSSE3-NEXT:    pandn %xmm10, %xmm2
2468 ; SSSE3-NEXT:    por %xmm12, %xmm2
2469 ; SSSE3-NEXT:    pxor %xmm9, %xmm8
2470 ; SSSE3-NEXT:    movdqa %xmm8, %xmm1
2471 ; SSSE3-NEXT:    pcmpgtd %xmm11, %xmm1
2472 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
2473 ; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm8
2474 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]
2475 ; SSSE3-NEXT:    pand %xmm4, %xmm5
2476 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2477 ; SSSE3-NEXT:    por %xmm5, %xmm1
2478 ; SSSE3-NEXT:    pand %xmm1, %xmm9
2479 ; SSSE3-NEXT:    pandn %xmm10, %xmm1
2480 ; SSSE3-NEXT:    por %xmm9, %xmm1
2481 ; SSSE3-NEXT:    packssdw %xmm2, %xmm1
2482 ; SSSE3-NEXT:    packssdw %xmm1, %xmm3
2483 ; SSSE3-NEXT:    packsswb %xmm3, %xmm0
2484 ; SSSE3-NEXT:    retq
2486 ; SSE41-LABEL: trunc_ssat_v16i64_v16i8:
2487 ; SSE41:       # %bb.0:
2488 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
2489 ; SSE41-NEXT:    movapd {{.*#+}} xmm11 = [127,127]
2490 ; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,2147483648]
2491 ; SSE41-NEXT:    movdqa %xmm6, %xmm0
2492 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2493 ; SSE41-NEXT:    movdqa {{.*#+}} xmm12 = [2147483775,2147483775]
2494 ; SSE41-NEXT:    movdqa %xmm12, %xmm10
2495 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm10
2496 ; SSE41-NEXT:    pshufd {{.*#+}} xmm13 = xmm10[0,0,2,2]
2497 ; SSE41-NEXT:    pcmpeqd %xmm12, %xmm0
2498 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2499 ; SSE41-NEXT:    pand %xmm13, %xmm0
2500 ; SSE41-NEXT:    por %xmm10, %xmm0
2501 ; SSE41-NEXT:    movapd %xmm11, %xmm10
2502 ; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm10
2503 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
2504 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2505 ; SSE41-NEXT:    movdqa %xmm12, %xmm6
2506 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
2507 ; SSE41-NEXT:    pshufd {{.*#+}} xmm13 = xmm6[0,0,2,2]
2508 ; SSE41-NEXT:    pcmpeqd %xmm12, %xmm0
2509 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2510 ; SSE41-NEXT:    pand %xmm13, %xmm0
2511 ; SSE41-NEXT:    por %xmm6, %xmm0
2512 ; SSE41-NEXT:    movapd %xmm11, %xmm13
2513 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm13
2514 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
2515 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2516 ; SSE41-NEXT:    movdqa %xmm12, %xmm6
2517 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
2518 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2519 ; SSE41-NEXT:    pcmpeqd %xmm12, %xmm0
2520 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2521 ; SSE41-NEXT:    pand %xmm7, %xmm0
2522 ; SSE41-NEXT:    por %xmm6, %xmm0
2523 ; SSE41-NEXT:    movapd %xmm11, %xmm14
2524 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm14
2525 ; SSE41-NEXT:    movdqa %xmm5, %xmm0
2526 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2527 ; SSE41-NEXT:    movdqa %xmm12, %xmm4
2528 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
2529 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2530 ; SSE41-NEXT:    pcmpeqd %xmm12, %xmm0
2531 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2532 ; SSE41-NEXT:    pand %xmm6, %xmm0
2533 ; SSE41-NEXT:    por %xmm4, %xmm0
2534 ; SSE41-NEXT:    movapd %xmm11, %xmm15
2535 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm15
2536 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
2537 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2538 ; SSE41-NEXT:    movdqa %xmm12, %xmm5
2539 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
2540 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
2541 ; SSE41-NEXT:    pcmpeqd %xmm12, %xmm0
2542 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2543 ; SSE41-NEXT:    pand %xmm6, %xmm0
2544 ; SSE41-NEXT:    por %xmm5, %xmm0
2545 ; SSE41-NEXT:    movapd %xmm11, %xmm5
2546 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
2547 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
2548 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2549 ; SSE41-NEXT:    movdqa %xmm12, %xmm2
2550 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
2551 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
2552 ; SSE41-NEXT:    pcmpeqd %xmm12, %xmm0
2553 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2554 ; SSE41-NEXT:    pand %xmm6, %xmm0
2555 ; SSE41-NEXT:    por %xmm2, %xmm0
2556 ; SSE41-NEXT:    movapd %xmm11, %xmm6
2557 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm6
2558 ; SSE41-NEXT:    movdqa %xmm8, %xmm0
2559 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2560 ; SSE41-NEXT:    movdqa %xmm12, %xmm2
2561 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
2562 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
2563 ; SSE41-NEXT:    pcmpeqd %xmm12, %xmm0
2564 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2565 ; SSE41-NEXT:    pand %xmm3, %xmm0
2566 ; SSE41-NEXT:    por %xmm2, %xmm0
2567 ; SSE41-NEXT:    movapd %xmm11, %xmm7
2568 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm7
2569 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
2570 ; SSE41-NEXT:    pxor %xmm9, %xmm0
2571 ; SSE41-NEXT:    movdqa %xmm12, %xmm2
2572 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
2573 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
2574 ; SSE41-NEXT:    pcmpeqd %xmm12, %xmm0
2575 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2576 ; SSE41-NEXT:    pand %xmm3, %xmm0
2577 ; SSE41-NEXT:    por %xmm2, %xmm0
2578 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm11
2579 ; SSE41-NEXT:    movapd {{.*#+}} xmm2 = [18446744073709551488,18446744073709551488]
2580 ; SSE41-NEXT:    movapd %xmm11, %xmm0
2581 ; SSE41-NEXT:    xorpd %xmm9, %xmm0
2582 ; SSE41-NEXT:    movdqa {{.*#+}} xmm8 = [18446744071562067840,18446744071562067840]
2583 ; SSE41-NEXT:    movapd %xmm0, %xmm1
2584 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm1
2585 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
2586 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm0
2587 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2588 ; SSE41-NEXT:    pand %xmm4, %xmm0
2589 ; SSE41-NEXT:    por %xmm1, %xmm0
2590 ; SSE41-NEXT:    movapd %xmm2, %xmm4
2591 ; SSE41-NEXT:    blendvpd %xmm0, %xmm11, %xmm4
2592 ; SSE41-NEXT:    movapd %xmm7, %xmm0
2593 ; SSE41-NEXT:    xorpd %xmm9, %xmm0
2594 ; SSE41-NEXT:    movapd %xmm0, %xmm1
2595 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm1
2596 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
2597 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm0
2598 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2599 ; SSE41-NEXT:    pand %xmm3, %xmm0
2600 ; SSE41-NEXT:    por %xmm1, %xmm0
2601 ; SSE41-NEXT:    movapd %xmm2, %xmm1
2602 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
2603 ; SSE41-NEXT:    packssdw %xmm4, %xmm1
2604 ; SSE41-NEXT:    movapd %xmm6, %xmm0
2605 ; SSE41-NEXT:    xorpd %xmm9, %xmm0
2606 ; SSE41-NEXT:    movapd %xmm0, %xmm3
2607 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm3
2608 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2609 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm0
2610 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2611 ; SSE41-NEXT:    pand %xmm4, %xmm0
2612 ; SSE41-NEXT:    por %xmm3, %xmm0
2613 ; SSE41-NEXT:    movapd %xmm2, %xmm3
2614 ; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm3
2615 ; SSE41-NEXT:    movapd %xmm5, %xmm0
2616 ; SSE41-NEXT:    xorpd %xmm9, %xmm0
2617 ; SSE41-NEXT:    movapd %xmm0, %xmm4
2618 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm4
2619 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2620 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm0
2621 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2622 ; SSE41-NEXT:    pand %xmm6, %xmm0
2623 ; SSE41-NEXT:    por %xmm4, %xmm0
2624 ; SSE41-NEXT:    movapd %xmm2, %xmm4
2625 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm4
2626 ; SSE41-NEXT:    packssdw %xmm3, %xmm4
2627 ; SSE41-NEXT:    packssdw %xmm4, %xmm1
2628 ; SSE41-NEXT:    movapd %xmm15, %xmm0
2629 ; SSE41-NEXT:    xorpd %xmm9, %xmm0
2630 ; SSE41-NEXT:    movapd %xmm0, %xmm3
2631 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm3
2632 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
2633 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm0
2634 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2635 ; SSE41-NEXT:    pand %xmm4, %xmm0
2636 ; SSE41-NEXT:    por %xmm3, %xmm0
2637 ; SSE41-NEXT:    movapd %xmm2, %xmm3
2638 ; SSE41-NEXT:    blendvpd %xmm0, %xmm15, %xmm3
2639 ; SSE41-NEXT:    movapd %xmm14, %xmm0
2640 ; SSE41-NEXT:    xorpd %xmm9, %xmm0
2641 ; SSE41-NEXT:    movapd %xmm0, %xmm4
2642 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm4
2643 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
2644 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm0
2645 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2646 ; SSE41-NEXT:    pand %xmm5, %xmm0
2647 ; SSE41-NEXT:    por %xmm4, %xmm0
2648 ; SSE41-NEXT:    movapd %xmm2, %xmm4
2649 ; SSE41-NEXT:    blendvpd %xmm0, %xmm14, %xmm4
2650 ; SSE41-NEXT:    packssdw %xmm3, %xmm4
2651 ; SSE41-NEXT:    movapd %xmm13, %xmm0
2652 ; SSE41-NEXT:    xorpd %xmm9, %xmm0
2653 ; SSE41-NEXT:    movapd %xmm0, %xmm3
2654 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm3
2655 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
2656 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm0
2657 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
2658 ; SSE41-NEXT:    pand %xmm5, %xmm0
2659 ; SSE41-NEXT:    por %xmm3, %xmm0
2660 ; SSE41-NEXT:    movapd %xmm2, %xmm3
2661 ; SSE41-NEXT:    blendvpd %xmm0, %xmm13, %xmm3
2662 ; SSE41-NEXT:    xorpd %xmm10, %xmm9
2663 ; SSE41-NEXT:    movapd %xmm9, %xmm5
2664 ; SSE41-NEXT:    pcmpgtd %xmm8, %xmm5
2665 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
2666 ; SSE41-NEXT:    pcmpeqd %xmm8, %xmm9
2667 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[1,1,3,3]
2668 ; SSE41-NEXT:    pand %xmm6, %xmm0
2669 ; SSE41-NEXT:    por %xmm5, %xmm0
2670 ; SSE41-NEXT:    blendvpd %xmm0, %xmm10, %xmm2
2671 ; SSE41-NEXT:    packssdw %xmm3, %xmm2
2672 ; SSE41-NEXT:    packssdw %xmm2, %xmm4
2673 ; SSE41-NEXT:    packsswb %xmm4, %xmm1
2674 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
2675 ; SSE41-NEXT:    retq
2677 ; AVX1-LABEL: trunc_ssat_v16i64_v16i8:
2678 ; AVX1:       # %bb.0:
2679 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm8
2680 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [127,127]
2681 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm9
2682 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
2683 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
2684 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm5, %xmm6
2685 ; AVX1-NEXT:    vblendvpd %xmm6, %xmm0, %xmm5, %xmm10
2686 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm6
2687 ; AVX1-NEXT:    vblendvpd %xmm6, %xmm4, %xmm5, %xmm11
2688 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm5, %xmm6
2689 ; AVX1-NEXT:    vblendvpd %xmm6, %xmm1, %xmm5, %xmm1
2690 ; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm5, %xmm6
2691 ; AVX1-NEXT:    vblendvpd %xmm6, %xmm7, %xmm5, %xmm6
2692 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm5, %xmm7
2693 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm2, %xmm5, %xmm2
2694 ; AVX1-NEXT:    vpcmpgtq %xmm9, %xmm5, %xmm7
2695 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm9, %xmm5, %xmm7
2696 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm5, %xmm0
2697 ; AVX1-NEXT:    vblendvpd %xmm0, %xmm3, %xmm5, %xmm0
2698 ; AVX1-NEXT:    vpcmpgtq %xmm8, %xmm5, %xmm3
2699 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm8, %xmm5, %xmm3
2700 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [18446744073709551488,18446744073709551488]
2701 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm3, %xmm4
2702 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm5, %xmm8
2703 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm0, %xmm4
2704 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm0, %xmm5, %xmm0
2705 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm7, %xmm4
2706 ; AVX1-NEXT:    vblendvpd %xmm4, %xmm7, %xmm5, %xmm4
2707 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm2, %xmm7
2708 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm2, %xmm5, %xmm2
2709 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm7
2710 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm6, %xmm5, %xmm6
2711 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm1, %xmm7
2712 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm1, %xmm5, %xmm1
2713 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm11, %xmm7
2714 ; AVX1-NEXT:    vblendvpd %xmm7, %xmm11, %xmm5, %xmm7
2715 ; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm10, %xmm3
2716 ; AVX1-NEXT:    vblendvpd %xmm3, %xmm10, %xmm5, %xmm3
2717 ; AVX1-NEXT:    vpackssdw %xmm8, %xmm0, %xmm0
2718 ; AVX1-NEXT:    vpackssdw %xmm4, %xmm2, %xmm2
2719 ; AVX1-NEXT:    vpackssdw %xmm0, %xmm2, %xmm0
2720 ; AVX1-NEXT:    vpackssdw %xmm6, %xmm1, %xmm1
2721 ; AVX1-NEXT:    vpackssdw %xmm7, %xmm3, %xmm2
2722 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm2, %xmm1
2723 ; AVX1-NEXT:    vpacksswb %xmm0, %xmm1, %xmm0
2724 ; AVX1-NEXT:    vzeroupper
2725 ; AVX1-NEXT:    retq
2727 ; AVX2-LABEL: trunc_ssat_v16i64_v16i8:
2728 ; AVX2:       # %bb.0:
2729 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [127,127,127,127]
2730 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm4, %ymm5
2731 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm2, %ymm4, %ymm2
2732 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm4, %ymm5
2733 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm3, %ymm4, %ymm3
2734 ; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm4, %ymm5
2735 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm4, %ymm0
2736 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm4, %ymm5
2737 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm1, %ymm4, %ymm1
2738 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
2739 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm1, %ymm5
2740 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm1, %ymm4, %ymm1
2741 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm0, %ymm5
2742 ; AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm4, %ymm0
2743 ; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
2744 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm3, %ymm1
2745 ; AVX2-NEXT:    vblendvpd %ymm1, %ymm3, %ymm4, %ymm1
2746 ; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm2, %ymm3
2747 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm2, %ymm4, %ymm2
2748 ; AVX2-NEXT:    vpackssdw %ymm1, %ymm2, %ymm1
2749 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
2750 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2751 ; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
2752 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2753 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2754 ; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
2755 ; AVX2-NEXT:    vzeroupper
2756 ; AVX2-NEXT:    retq
2758 ; AVX512-LABEL: trunc_ssat_v16i64_v16i8:
2759 ; AVX512:       # %bb.0:
2760 ; AVX512-NEXT:    vpbroadcastq {{.*#+}} zmm2 = [127,127,127,127,127,127,127,127]
2761 ; AVX512-NEXT:    vpminsq %zmm2, %zmm0, %zmm0
2762 ; AVX512-NEXT:    vpminsq %zmm2, %zmm1, %zmm1
2763 ; AVX512-NEXT:    vpbroadcastq {{.*#+}} zmm2 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
2764 ; AVX512-NEXT:    vpmaxsq %zmm2, %zmm1, %zmm1
2765 ; AVX512-NEXT:    vpmaxsq %zmm2, %zmm0, %zmm0
2766 ; AVX512-NEXT:    vpmovqd %zmm0, %ymm0
2767 ; AVX512-NEXT:    vpmovqd %zmm1, %ymm1
2768 ; AVX512-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
2769 ; AVX512-NEXT:    vpmovdb %zmm0, %xmm0
2770 ; AVX512-NEXT:    vzeroupper
2771 ; AVX512-NEXT:    retq
2772   %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>
2773   %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>
2774   %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>
2775   %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>
2776   %5 = trunc <16 x i64> %4 to <16 x i8>
2777   ret <16 x i8> %5
2780 define <8 x i8> @trunc_ssat_v8i32_v8i8(<8 x i32> %a0) {
2781 ; SSE-LABEL: trunc_ssat_v8i32_v8i8:
2782 ; SSE:       # %bb.0:
2783 ; SSE-NEXT:    packssdw %xmm1, %xmm0
2784 ; SSE-NEXT:    packsswb %xmm0, %xmm0
2785 ; SSE-NEXT:    retq
2787 ; AVX1-LABEL: trunc_ssat_v8i32_v8i8:
2788 ; AVX1:       # %bb.0:
2789 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2790 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
2791 ; AVX1-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
2792 ; AVX1-NEXT:    vzeroupper
2793 ; AVX1-NEXT:    retq
2795 ; AVX2-LABEL: trunc_ssat_v8i32_v8i8:
2796 ; AVX2:       # %bb.0:
2797 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2798 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
2799 ; AVX2-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
2800 ; AVX2-NEXT:    vzeroupper
2801 ; AVX2-NEXT:    retq
2803 ; AVX512F-LABEL: trunc_ssat_v8i32_v8i8:
2804 ; AVX512F:       # %bb.0:
2805 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [127,127,127,127,127,127,127,127]
2806 ; AVX512F-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
2807 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [4294967168,4294967168,4294967168,4294967168,4294967168,4294967168,4294967168,4294967168]
2808 ; AVX512F-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
2809 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
2810 ; AVX512F-NEXT:    vzeroupper
2811 ; AVX512F-NEXT:    retq
2813 ; AVX512VL-LABEL: trunc_ssat_v8i32_v8i8:
2814 ; AVX512VL:       # %bb.0:
2815 ; AVX512VL-NEXT:    vpminsd {{.*}}(%rip){1to8}, %ymm0, %ymm0
2816 ; AVX512VL-NEXT:    vpmaxsd {{.*}}(%rip){1to8}, %ymm0, %ymm0
2817 ; AVX512VL-NEXT:    vpmovdb %ymm0, %xmm0
2818 ; AVX512VL-NEXT:    vzeroupper
2819 ; AVX512VL-NEXT:    retq
2821 ; AVX512BW-LABEL: trunc_ssat_v8i32_v8i8:
2822 ; AVX512BW:       # %bb.0:
2823 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [127,127,127,127,127,127,127,127]
2824 ; AVX512BW-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
2825 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [4294967168,4294967168,4294967168,4294967168,4294967168,4294967168,4294967168,4294967168]
2826 ; AVX512BW-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
2827 ; AVX512BW-NEXT:    vpmovdb %zmm0, %xmm0
2828 ; AVX512BW-NEXT:    vzeroupper
2829 ; AVX512BW-NEXT:    retq
2831 ; AVX512BWVL-LABEL: trunc_ssat_v8i32_v8i8:
2832 ; AVX512BWVL:       # %bb.0:
2833 ; AVX512BWVL-NEXT:    vpminsd {{.*}}(%rip){1to8}, %ymm0, %ymm0
2834 ; AVX512BWVL-NEXT:    vpmaxsd {{.*}}(%rip){1to8}, %ymm0, %ymm0
2835 ; AVX512BWVL-NEXT:    vpmovdb %ymm0, %xmm0
2836 ; AVX512BWVL-NEXT:    vzeroupper
2837 ; AVX512BWVL-NEXT:    retq
2838   %1 = icmp slt <8 x i32> %a0, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
2839   %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>
2840   %3 = icmp sgt <8 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
2841   %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>
2842   %5 = trunc <8 x i32> %4 to <8 x i8>
2843   ret <8 x i8> %5
2846 define void @trunc_ssat_v8i32_v8i8_store(<8 x i32> %a0, <8 x i8> *%p1) {
2847 ; SSE-LABEL: trunc_ssat_v8i32_v8i8_store:
2848 ; SSE:       # %bb.0:
2849 ; SSE-NEXT:    packssdw %xmm1, %xmm0
2850 ; SSE-NEXT:    packsswb %xmm0, %xmm0
2851 ; SSE-NEXT:    movq %xmm0, (%rdi)
2852 ; SSE-NEXT:    retq
2854 ; AVX1-LABEL: trunc_ssat_v8i32_v8i8_store:
2855 ; AVX1:       # %bb.0:
2856 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2857 ; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
2858 ; AVX1-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
2859 ; AVX1-NEXT:    vmovq %xmm0, (%rdi)
2860 ; AVX1-NEXT:    vzeroupper
2861 ; AVX1-NEXT:    retq
2863 ; AVX2-LABEL: trunc_ssat_v8i32_v8i8_store:
2864 ; AVX2:       # %bb.0:
2865 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2866 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
2867 ; AVX2-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
2868 ; AVX2-NEXT:    vmovq %xmm0, (%rdi)
2869 ; AVX2-NEXT:    vzeroupper
2870 ; AVX2-NEXT:    retq
2872 ; AVX512F-LABEL: trunc_ssat_v8i32_v8i8_store:
2873 ; AVX512F:       # %bb.0:
2874 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [127,127,127,127,127,127,127,127]
2875 ; AVX512F-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
2876 ; AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [4294967168,4294967168,4294967168,4294967168,4294967168,4294967168,4294967168,4294967168]
2877 ; AVX512F-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
2878 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
2879 ; AVX512F-NEXT:    vmovq %xmm0, (%rdi)
2880 ; AVX512F-NEXT:    vzeroupper
2881 ; AVX512F-NEXT:    retq
2883 ; AVX512VL-LABEL: trunc_ssat_v8i32_v8i8_store:
2884 ; AVX512VL:       # %bb.0:
2885 ; AVX512VL-NEXT:    vpmovsdb %ymm0, (%rdi)
2886 ; AVX512VL-NEXT:    vzeroupper
2887 ; AVX512VL-NEXT:    retq
2889 ; AVX512BW-LABEL: trunc_ssat_v8i32_v8i8_store:
2890 ; AVX512BW:       # %bb.0:
2891 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [127,127,127,127,127,127,127,127]
2892 ; AVX512BW-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
2893 ; AVX512BW-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [4294967168,4294967168,4294967168,4294967168,4294967168,4294967168,4294967168,4294967168]
2894 ; AVX512BW-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
2895 ; AVX512BW-NEXT:    vpmovdb %zmm0, %xmm0
2896 ; AVX512BW-NEXT:    vmovq %xmm0, (%rdi)
2897 ; AVX512BW-NEXT:    vzeroupper
2898 ; AVX512BW-NEXT:    retq
2900 ; AVX512BWVL-LABEL: trunc_ssat_v8i32_v8i8_store:
2901 ; AVX512BWVL:       # %bb.0:
2902 ; AVX512BWVL-NEXT:    vpmovsdb %ymm0, (%rdi)
2903 ; AVX512BWVL-NEXT:    vzeroupper
2904 ; AVX512BWVL-NEXT:    retq
2905   %1 = icmp slt <8 x i32> %a0, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
2906   %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>
2907   %3 = icmp sgt <8 x i32> %2, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
2908   %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>
2909   %5 = trunc <8 x i32> %4 to <8 x i8>
2910   store <8 x i8> %5, <8 x i8> *%p1
2911   ret void
2914 define <16 x i8> @trunc_ssat_v16i32_v16i8(<16 x i32> %a0) {
2915 ; SSE-LABEL: trunc_ssat_v16i32_v16i8:
2916 ; SSE:       # %bb.0:
2917 ; SSE-NEXT:    packssdw %xmm3, %xmm2
2918 ; SSE-NEXT:    packssdw %xmm1, %xmm0
2919 ; SSE-NEXT:    packsswb %xmm2, %xmm0
2920 ; SSE-NEXT:    retq
2922 ; AVX1-LABEL: trunc_ssat_v16i32_v16i8:
2923 ; AVX1:       # %bb.0:
2924 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2925 ; AVX1-NEXT:    vpackssdw %xmm2, %xmm1, %xmm1
2926 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2927 ; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0
2928 ; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
2929 ; AVX1-NEXT:    vzeroupper
2930 ; AVX1-NEXT:    retq
2932 ; AVX2-LABEL: trunc_ssat_v16i32_v16i8:
2933 ; AVX2:       # %bb.0:
2934 ; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
2935 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2936 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2937 ; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
2938 ; AVX2-NEXT:    vzeroupper
2939 ; AVX2-NEXT:    retq
2941 ; AVX512-LABEL: trunc_ssat_v16i32_v16i8:
2942 ; AVX512:       # %bb.0:
2943 ; AVX512-NEXT:    vpmovsdb %zmm0, %xmm0
2944 ; AVX512-NEXT:    vzeroupper
2945 ; AVX512-NEXT:    retq
2946   %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>
2947   %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>
2948   %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>
2949   %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>
2950   %5 = trunc <16 x i32> %4 to <16 x i8>
2951   ret <16 x i8> %5
2954 define <16 x i8> @trunc_ssat_v16i16_v16i8(<16 x i16> %a0) {
2955 ; SSE-LABEL: trunc_ssat_v16i16_v16i8:
2956 ; SSE:       # %bb.0:
2957 ; SSE-NEXT:    packsswb %xmm1, %xmm0
2958 ; SSE-NEXT:    retq
2960 ; AVX1-LABEL: trunc_ssat_v16i16_v16i8:
2961 ; AVX1:       # %bb.0:
2962 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2963 ; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
2964 ; AVX1-NEXT:    vzeroupper
2965 ; AVX1-NEXT:    retq
2967 ; AVX2-LABEL: trunc_ssat_v16i16_v16i8:
2968 ; AVX2:       # %bb.0:
2969 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2970 ; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
2971 ; AVX2-NEXT:    vzeroupper
2972 ; AVX2-NEXT:    retq
2974 ; AVX512F-LABEL: trunc_ssat_v16i16_v16i8:
2975 ; AVX512F:       # %bb.0:
2976 ; AVX512F-NEXT:    vpminsw {{.*}}(%rip), %ymm0, %ymm0
2977 ; AVX512F-NEXT:    vpmaxsw {{.*}}(%rip), %ymm0, %ymm0
2978 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
2979 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
2980 ; AVX512F-NEXT:    vzeroupper
2981 ; AVX512F-NEXT:    retq
2983 ; AVX512VL-LABEL: trunc_ssat_v16i16_v16i8:
2984 ; AVX512VL:       # %bb.0:
2985 ; AVX512VL-NEXT:    vpminsw {{.*}}(%rip), %ymm0, %ymm0
2986 ; AVX512VL-NEXT:    vpmaxsw {{.*}}(%rip), %ymm0, %ymm0
2987 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
2988 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
2989 ; AVX512VL-NEXT:    vzeroupper
2990 ; AVX512VL-NEXT:    retq
2992 ; AVX512BW-LABEL: trunc_ssat_v16i16_v16i8:
2993 ; AVX512BW:       # %bb.0:
2994 ; AVX512BW-NEXT:    vpminsw {{.*}}(%rip), %ymm0, %ymm0
2995 ; AVX512BW-NEXT:    vpmaxsw {{.*}}(%rip), %ymm0, %ymm0
2996 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
2997 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2998 ; AVX512BW-NEXT:    vzeroupper
2999 ; AVX512BW-NEXT:    retq
3001 ; AVX512BWVL-LABEL: trunc_ssat_v16i16_v16i8:
3002 ; AVX512BWVL:       # %bb.0:
3003 ; AVX512BWVL-NEXT:    vpmovswb %ymm0, %xmm0
3004 ; AVX512BWVL-NEXT:    vzeroupper
3005 ; AVX512BWVL-NEXT:    retq
3006   %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>
3007   %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>
3008   %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>
3009   %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>
3010   %5 = trunc <16 x i16> %4 to <16 x i8>
3011   ret <16 x i8> %5
3014 define <32 x i8> @trunc_ssat_v32i16_v32i8(<32 x i16> %a0) {
3015 ; SSE-LABEL: trunc_ssat_v32i16_v32i8:
3016 ; SSE:       # %bb.0:
3017 ; SSE-NEXT:    packsswb %xmm1, %xmm0
3018 ; SSE-NEXT:    packsswb %xmm3, %xmm2
3019 ; SSE-NEXT:    movdqa %xmm2, %xmm1
3020 ; SSE-NEXT:    retq
3022 ; AVX1-LABEL: trunc_ssat_v32i16_v32i8:
3023 ; AVX1:       # %bb.0:
3024 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
3025 ; AVX1-NEXT:    vpacksswb %xmm2, %xmm1, %xmm1
3026 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
3027 ; AVX1-NEXT:    vpacksswb %xmm2, %xmm0, %xmm0
3028 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3029 ; AVX1-NEXT:    retq
3031 ; AVX2-LABEL: trunc_ssat_v32i16_v32i8:
3032 ; AVX2:       # %bb.0:
3033 ; AVX2-NEXT:    vpacksswb %ymm1, %ymm0, %ymm0
3034 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
3035 ; AVX2-NEXT:    retq
3037 ; AVX512F-LABEL: trunc_ssat_v32i16_v32i8:
3038 ; AVX512F:       # %bb.0:
3039 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
3040 ; AVX512F-NEXT:    vpminsw %ymm2, %ymm0, %ymm0
3041 ; AVX512F-NEXT:    vpminsw %ymm2, %ymm1, %ymm1
3042 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm2 = [65408,65408,65408,65408,65408,65408,65408,65408,65408,65408,65408,65408,65408,65408,65408,65408]
3043 ; AVX512F-NEXT:    vpmaxsw %ymm2, %ymm1, %ymm1
3044 ; AVX512F-NEXT:    vpmaxsw %ymm2, %ymm0, %ymm0
3045 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
3046 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
3047 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
3048 ; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
3049 ; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
3050 ; AVX512F-NEXT:    retq
3052 ; AVX512VL-LABEL: trunc_ssat_v32i16_v32i8:
3053 ; AVX512VL:       # %bb.0:
3054 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
3055 ; AVX512VL-NEXT:    vpminsw %ymm2, %ymm0, %ymm0
3056 ; AVX512VL-NEXT:    vpminsw %ymm2, %ymm1, %ymm1
3057 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm2 = [65408,65408,65408,65408,65408,65408,65408,65408,65408,65408,65408,65408,65408,65408,65408,65408]
3058 ; AVX512VL-NEXT:    vpmaxsw %ymm2, %ymm1, %ymm1
3059 ; AVX512VL-NEXT:    vpmaxsw %ymm2, %ymm0, %ymm0
3060 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
3061 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
3062 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
3063 ; AVX512VL-NEXT:    vpmovdb %zmm1, %xmm1
3064 ; AVX512VL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
3065 ; AVX512VL-NEXT:    retq
3067 ; AVX512BW-LABEL: trunc_ssat_v32i16_v32i8:
3068 ; AVX512BW:       # %bb.0:
3069 ; AVX512BW-NEXT:    vpmovswb %zmm0, %ymm0
3070 ; AVX512BW-NEXT:    retq
3072 ; AVX512BWVL-LABEL: trunc_ssat_v32i16_v32i8:
3073 ; AVX512BWVL:       # %bb.0:
3074 ; AVX512BWVL-NEXT:    vpmovswb %zmm0, %ymm0
3075 ; AVX512BWVL-NEXT:    retq
3076   %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>
3077   %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>
3078   %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>
3079   %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>
3080   %5 = trunc <32 x i16> %4 to <32 x i8>
3081   ret <32 x i8> %5