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