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.uadd.sat.v1i8(<1 x i8>, <1 x i8>)
10 declare <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8>, <2 x i8>)
11 declare <4 x i8> @llvm.uadd.sat.v4i8(<4 x i8>, <4 x i8>)
12 declare <8 x i8> @llvm.uadd.sat.v8i8(<8 x i8>, <8 x i8>)
13 declare <12 x i8> @llvm.uadd.sat.v12i8(<12 x i8>, <12 x i8>)
14 declare <16 x i8> @llvm.uadd.sat.v16i8(<16 x i8>, <16 x i8>)
15 declare <32 x i8> @llvm.uadd.sat.v32i8(<32 x i8>, <32 x i8>)
16 declare <64 x i8> @llvm.uadd.sat.v64i8(<64 x i8>, <64 x i8>)
18 declare <1 x i16> @llvm.uadd.sat.v1i16(<1 x i16>, <1 x i16>)
19 declare <2 x i16> @llvm.uadd.sat.v2i16(<2 x i16>, <2 x i16>)
20 declare <4 x i16> @llvm.uadd.sat.v4i16(<4 x i16>, <4 x i16>)
21 declare <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16>, <8 x i16>)
22 declare <12 x i16> @llvm.uadd.sat.v12i16(<12 x i16>, <12 x i16>)
23 declare <16 x i16> @llvm.uadd.sat.v16i16(<16 x i16>, <16 x i16>)
24 declare <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16>, <32 x i16>)
26 declare <16 x i1> @llvm.uadd.sat.v16i1(<16 x i1>, <16 x i1>)
27 declare <16 x i4> @llvm.uadd.sat.v16i4(<16 x i4>, <16 x i4>)
29 declare <2 x i32> @llvm.uadd.sat.v2i32(<2 x i32>, <2 x i32>)
30 declare <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32>, <4 x i32>)
31 declare <8 x i32> @llvm.uadd.sat.v8i32(<8 x i32>, <8 x i32>)
32 declare <16 x i32> @llvm.uadd.sat.v16i32(<16 x i32>, <16 x i32>)
33 declare <2 x i64> @llvm.uadd.sat.v2i64(<2 x i64>, <2 x i64>)
34 declare <4 x i64> @llvm.uadd.sat.v4i64(<4 x i64>, <4 x i64>)
35 declare <8 x i64> @llvm.uadd.sat.v8i64(<8 x i64>, <8 x i64>)
37 declare <4 x i24> @llvm.uadd.sat.v4i24(<4 x i24>, <4 x i24>)
38 declare <2 x i128> @llvm.uadd.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 {
45 ; SSE-NEXT: paddusb %xmm1, %xmm0
50 ; AVX-NEXT: vpaddusb %xmm1, %xmm0, %xmm0
52 %z = call <16 x i8> @llvm.uadd.sat.v16i8(<16 x i8> %x, <16 x i8> %y)
56 define <32 x i8> @v32i8(<32 x i8> %x, <32 x i8> %y) nounwind {
59 ; SSE-NEXT: paddusb %xmm2, %xmm0
60 ; SSE-NEXT: paddusb %xmm3, %xmm1
65 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
66 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
67 ; AVX1-NEXT: vpaddusb %xmm2, %xmm3, %xmm2
68 ; AVX1-NEXT: vpaddusb %xmm1, %xmm0, %xmm0
69 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
74 ; AVX2-NEXT: vpaddusb %ymm1, %ymm0, %ymm0
77 ; AVX512-LABEL: v32i8:
79 ; AVX512-NEXT: vpaddusb %ymm1, %ymm0, %ymm0
81 %z = call <32 x i8> @llvm.uadd.sat.v32i8(<32 x i8> %x, <32 x i8> %y)
85 define <64 x i8> @v64i8(<64 x i8> %x, <64 x i8> %y) nounwind {
88 ; SSE-NEXT: paddusb %xmm4, %xmm0
89 ; SSE-NEXT: paddusb %xmm5, %xmm1
90 ; SSE-NEXT: paddusb %xmm6, %xmm2
91 ; SSE-NEXT: paddusb %xmm7, %xmm3
96 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
97 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
98 ; AVX1-NEXT: vpaddusb %xmm4, %xmm5, %xmm4
99 ; AVX1-NEXT: vpaddusb %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: vpaddusb %xmm2, %xmm4, %xmm2
104 ; AVX1-NEXT: vpaddusb %xmm3, %xmm1, %xmm1
105 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
110 ; AVX2-NEXT: vpaddusb %ymm2, %ymm0, %ymm0
111 ; AVX2-NEXT: vpaddusb %ymm3, %ymm1, %ymm1
114 ; AVX512-LABEL: v64i8:
116 ; AVX512-NEXT: vpaddusb %zmm1, %zmm0, %zmm0
118 %z = call <64 x i8> @llvm.uadd.sat.v64i8(<64 x i8> %x, <64 x i8> %y)
122 define <8 x i16> @v8i16(<8 x i16> %x, <8 x i16> %y) nounwind {
125 ; SSE-NEXT: paddusw %xmm1, %xmm0
130 ; AVX-NEXT: vpaddusw %xmm1, %xmm0, %xmm0
132 %z = call <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16> %x, <8 x i16> %y)
136 define <16 x i16> @v16i16(<16 x i16> %x, <16 x i16> %y) nounwind {
139 ; SSE-NEXT: paddusw %xmm2, %xmm0
140 ; SSE-NEXT: paddusw %xmm3, %xmm1
143 ; AVX1-LABEL: v16i16:
145 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
146 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
147 ; AVX1-NEXT: vpaddusw %xmm2, %xmm3, %xmm2
148 ; AVX1-NEXT: vpaddusw %xmm1, %xmm0, %xmm0
149 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
152 ; AVX2-LABEL: v16i16:
154 ; AVX2-NEXT: vpaddusw %ymm1, %ymm0, %ymm0
157 ; AVX512-LABEL: v16i16:
159 ; AVX512-NEXT: vpaddusw %ymm1, %ymm0, %ymm0
161 %z = call <16 x i16> @llvm.uadd.sat.v16i16(<16 x i16> %x, <16 x i16> %y)
165 define <32 x i16> @v32i16(<32 x i16> %x, <32 x i16> %y) nounwind {
168 ; SSE-NEXT: paddusw %xmm4, %xmm0
169 ; SSE-NEXT: paddusw %xmm5, %xmm1
170 ; SSE-NEXT: paddusw %xmm6, %xmm2
171 ; SSE-NEXT: paddusw %xmm7, %xmm3
174 ; AVX1-LABEL: v32i16:
176 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
177 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
178 ; AVX1-NEXT: vpaddusw %xmm4, %xmm5, %xmm4
179 ; AVX1-NEXT: vpaddusw %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: vpaddusw %xmm2, %xmm4, %xmm2
184 ; AVX1-NEXT: vpaddusw %xmm3, %xmm1, %xmm1
185 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
188 ; AVX2-LABEL: v32i16:
190 ; AVX2-NEXT: vpaddusw %ymm2, %ymm0, %ymm0
191 ; AVX2-NEXT: vpaddusw %ymm3, %ymm1, %ymm1
194 ; AVX512-LABEL: v32i16:
196 ; AVX512-NEXT: vpaddusw %zmm1, %zmm0, %zmm0
198 %z = call <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16> %x, <32 x i16> %y)
202 ; Too narrow vectors, legalized by widening.
204 define void @v8i8(<8 x i8>* %px, <8 x i8>* %py, <8 x i8>* %pz) nounwind {
207 ; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
208 ; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero
209 ; SSE-NEXT: paddusb %xmm0, %xmm1
210 ; SSE-NEXT: movq %xmm1, (%rdx)
215 ; AVX1-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero
216 ; AVX1-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
217 ; AVX1-NEXT: vpaddusb %xmm1, %xmm0, %xmm0
218 ; AVX1-NEXT: vmovq %xmm0, (%rdx)
223 ; AVX2-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero
224 ; AVX2-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
225 ; AVX2-NEXT: vpaddusb %xmm1, %xmm0, %xmm0
226 ; AVX2-NEXT: vmovq %xmm0, (%rdx)
229 ; AVX512-LABEL: v8i8:
231 ; AVX512-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero
232 ; AVX512-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
233 ; AVX512-NEXT: vpaddusb %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)
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.uadd.sat.v8i8(<8 x i8> %x, <8 x i8> %y)
240 store <8 x i8> %z, <8 x i8>* %pz
244 define void @v4i8(<4 x i8>* %px, <4 x i8>* %py, <4 x i8>* %pz) nounwind {
247 ; SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
248 ; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
249 ; SSE-NEXT: paddusb %xmm0, %xmm1
250 ; SSE-NEXT: movd %xmm1, (%rdx)
255 ; AVX1-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
256 ; AVX1-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
257 ; AVX1-NEXT: vpaddusb %xmm1, %xmm0, %xmm0
258 ; AVX1-NEXT: vmovd %xmm0, (%rdx)
263 ; AVX2-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
264 ; AVX2-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
265 ; AVX2-NEXT: vpaddusb %xmm1, %xmm0, %xmm0
266 ; AVX2-NEXT: vmovd %xmm0, (%rdx)
269 ; AVX512-LABEL: v4i8:
271 ; AVX512-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
272 ; AVX512-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
273 ; AVX512-NEXT: vpaddusb %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)
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.uadd.sat.v4i8(<4 x i8> %x, <4 x i8> %y)
280 store <4 x i8> %z, <4 x i8>* %pz
284 define void @v2i8(<2 x i8>* %px, <2 x i8>* %py, <2 x i8>* %pz) nounwind {
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: paddusb %xmm0, %xmm1
292 ; SSE2-NEXT: movd %xmm1, %eax
293 ; SSE2-NEXT: movw %ax, (%rdx)
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: paddusb %xmm0, %xmm1
303 ; SSSE3-NEXT: movd %xmm1, %eax
304 ; SSSE3-NEXT: movw %ax, (%rdx)
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: paddusb %xmm0, %xmm1
314 ; SSE41-NEXT: pextrw $0, %xmm1, (%rdx)
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: vpaddusb %xmm1, %xmm0, %xmm0
324 ; AVX1-NEXT: vpextrw $0, %xmm0, (%rdx)
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: vpaddusb %xmm1, %xmm0, %xmm0
334 ; AVX2-NEXT: vpextrw $0, %xmm0, (%rdx)
337 ; AVX512-LABEL: v2i8:
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: vpaddusb %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)
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.uadd.sat.v2i8(<2 x i8> %x, <2 x i8> %y)
350 store <2 x i8> %z, <2 x i8>* %pz
354 define void @v4i16(<4 x i16>* %px, <4 x i16>* %py, <4 x i16>* %pz) nounwind {
357 ; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
358 ; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero
359 ; SSE-NEXT: paddusw %xmm0, %xmm1
360 ; SSE-NEXT: movq %xmm1, (%rdx)
365 ; AVX1-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero
366 ; AVX1-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
367 ; AVX1-NEXT: vpaddusw %xmm1, %xmm0, %xmm0
368 ; AVX1-NEXT: vmovq %xmm0, (%rdx)
373 ; AVX2-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero
374 ; AVX2-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
375 ; AVX2-NEXT: vpaddusw %xmm1, %xmm0, %xmm0
376 ; AVX2-NEXT: vmovq %xmm0, (%rdx)
379 ; AVX512-LABEL: v4i16:
381 ; AVX512-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero
382 ; AVX512-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
383 ; AVX512-NEXT: vpaddusw %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)
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.uadd.sat.v4i16(<4 x i16> %x, <4 x i16> %y)
390 store <4 x i16> %z, <4 x i16>* %pz
394 define void @v2i16(<2 x i16>* %px, <2 x i16>* %py, <2 x i16>* %pz) nounwind {
397 ; SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
398 ; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
399 ; SSE-NEXT: paddusw %xmm0, %xmm1
400 ; SSE-NEXT: movd %xmm1, (%rdx)
405 ; AVX1-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
406 ; AVX1-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
407 ; AVX1-NEXT: vpaddusw %xmm1, %xmm0, %xmm0
408 ; AVX1-NEXT: vmovd %xmm0, (%rdx)
413 ; AVX2-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
414 ; AVX2-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
415 ; AVX2-NEXT: vpaddusw %xmm1, %xmm0, %xmm0
416 ; AVX2-NEXT: vmovd %xmm0, (%rdx)
419 ; AVX512-LABEL: v2i16:
421 ; AVX512-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
422 ; AVX512-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
423 ; AVX512-NEXT: vpaddusw %xmm1, %xmm0, %xmm0
424 ; AVX512-NEXT: vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
425 ; AVX512-NEXT: vpmovqw %xmm0, (%rdx)
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.uadd.sat.v2i16(<2 x i16> %x, <2 x i16> %y)
430 store <2 x i16> %z, <2 x i16>* %pz
434 define <12 x i8> @v12i8(<12 x i8> %x, <12 x i8> %y) nounwind {
437 ; SSE-NEXT: paddusb %xmm1, %xmm0
442 ; AVX-NEXT: vpaddusb %xmm1, %xmm0, %xmm0
444 %z = call <12 x i8> @llvm.uadd.sat.v12i8(<12 x i8> %x, <12 x i8> %y)
448 define void @v12i16(<12 x i16>* %px, <12 x i16>* %py, <12 x i16>* %pz) nounwind {
451 ; SSE-NEXT: movdqa (%rdi), %xmm0
452 ; SSE-NEXT: movdqa 16(%rdi), %xmm1
453 ; SSE-NEXT: paddusw (%rsi), %xmm0
454 ; SSE-NEXT: paddusw 16(%rsi), %xmm1
455 ; SSE-NEXT: movq %xmm1, 16(%rdx)
456 ; SSE-NEXT: movdqa %xmm0, (%rdx)
459 ; AVX1-LABEL: v12i16:
461 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
462 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
463 ; AVX1-NEXT: vpaddusw (%rsi), %xmm0, %xmm0
464 ; AVX1-NEXT: vpaddusw 16(%rsi), %xmm1, %xmm1
465 ; AVX1-NEXT: vmovq %xmm1, 16(%rdx)
466 ; AVX1-NEXT: vmovdqa %xmm0, (%rdx)
469 ; AVX2-LABEL: v12i16:
471 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
472 ; AVX2-NEXT: vpaddusw (%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
479 ; AVX512-LABEL: v12i16:
481 ; AVX512-NEXT: vmovdqa (%rdi), %ymm0
482 ; AVX512-NEXT: vpaddusw (%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
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.uadd.sat.v12i16(<12 x i16> %x, <12 x i16> %y)
491 store <12 x i16> %z, <12 x i16>* %pz
497 define void @v1i8(<1 x i8>* %px, <1 x i8>* %py, <1 x i8>* %pz) nounwind {
500 ; SSE-NEXT: movb (%rdi), %al
501 ; SSE-NEXT: addb (%rsi), %al
502 ; SSE-NEXT: movb $-1, %cl
503 ; SSE-NEXT: jb .LBB13_2
505 ; SSE-NEXT: movl %eax, %ecx
506 ; SSE-NEXT: .LBB13_2:
507 ; SSE-NEXT: movb %cl, (%rdx)
512 ; AVX-NEXT: movb (%rdi), %al
513 ; AVX-NEXT: addb (%rsi), %al
514 ; AVX-NEXT: movb $-1, %cl
515 ; AVX-NEXT: jb .LBB13_2
517 ; AVX-NEXT: movl %eax, %ecx
518 ; AVX-NEXT: .LBB13_2:
519 ; AVX-NEXT: movb %cl, (%rdx)
521 %x = load <1 x i8>, <1 x i8>* %px
522 %y = load <1 x i8>, <1 x i8>* %py
523 %z = call <1 x i8> @llvm.uadd.sat.v1i8(<1 x i8> %x, <1 x i8> %y)
524 store <1 x i8> %z, <1 x i8>* %pz
528 define void @v1i16(<1 x i16>* %px, <1 x i16>* %py, <1 x i16>* %pz) nounwind {
531 ; SSE-NEXT: movzwl (%rdi), %eax
532 ; SSE-NEXT: addw (%rsi), %ax
533 ; SSE-NEXT: movl $65535, %ecx # imm = 0xFFFF
534 ; SSE-NEXT: cmovael %eax, %ecx
535 ; SSE-NEXT: movw %cx, (%rdx)
540 ; AVX-NEXT: movzwl (%rdi), %eax
541 ; AVX-NEXT: addw (%rsi), %ax
542 ; AVX-NEXT: movl $65535, %ecx # imm = 0xFFFF
543 ; AVX-NEXT: cmovael %eax, %ecx
544 ; AVX-NEXT: movw %cx, (%rdx)
546 %x = load <1 x i16>, <1 x i16>* %px
547 %y = load <1 x i16>, <1 x i16>* %py
548 %z = call <1 x i16> @llvm.uadd.sat.v1i16(<1 x i16> %x, <1 x i16> %y)
549 store <1 x i16> %z, <1 x i16>* %pz
555 define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind {
558 ; SSE-NEXT: psllw $4, %xmm1
559 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
560 ; SSE-NEXT: pand %xmm2, %xmm1
561 ; SSE-NEXT: psllw $4, %xmm0
562 ; SSE-NEXT: pand %xmm2, %xmm0
563 ; SSE-NEXT: paddusb %xmm1, %xmm0
564 ; SSE-NEXT: psrlw $4, %xmm0
565 ; SSE-NEXT: pand {{.*}}(%rip), %xmm0
570 ; AVX-NEXT: vpsllw $4, %xmm1, %xmm1
571 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
572 ; AVX-NEXT: vpand %xmm2, %xmm1, %xmm1
573 ; AVX-NEXT: vpsllw $4, %xmm0, %xmm0
574 ; AVX-NEXT: vpand %xmm2, %xmm0, %xmm0
575 ; AVX-NEXT: vpaddusb %xmm1, %xmm0, %xmm0
576 ; AVX-NEXT: vpsrlw $4, %xmm0, %xmm0
577 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
579 %z = call <16 x i4> @llvm.uadd.sat.v16i4(<16 x i4> %x, <16 x i4> %y)
583 define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind {
586 ; SSE-NEXT: psllw $7, %xmm1
587 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
588 ; SSE-NEXT: pand %xmm2, %xmm1
589 ; SSE-NEXT: psllw $7, %xmm0
590 ; SSE-NEXT: pand %xmm2, %xmm0
591 ; SSE-NEXT: paddusb %xmm1, %xmm0
592 ; SSE-NEXT: psrlw $7, %xmm0
593 ; SSE-NEXT: pand {{.*}}(%rip), %xmm0
598 ; AVX1-NEXT: vpsllw $7, %xmm1, %xmm1
599 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
600 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
601 ; AVX1-NEXT: vpsllw $7, %xmm0, %xmm0
602 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
603 ; AVX1-NEXT: vpaddusb %xmm1, %xmm0, %xmm0
604 ; AVX1-NEXT: vpsrlw $7, %xmm0, %xmm0
605 ; AVX1-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
610 ; AVX2-NEXT: vpsllw $7, %xmm1, %xmm1
611 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
612 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1
613 ; AVX2-NEXT: vpsllw $7, %xmm0, %xmm0
614 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
615 ; AVX2-NEXT: vpaddusb %xmm1, %xmm0, %xmm0
616 ; AVX2-NEXT: vpsrlw $7, %xmm0, %xmm0
617 ; AVX2-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
620 ; AVX512-LABEL: v16i1:
622 ; AVX512-NEXT: vpsllw $7, %xmm1, %xmm1
623 ; AVX512-NEXT: vpmovb2m %xmm1, %k0
624 ; AVX512-NEXT: vpsllw $7, %xmm0, %xmm0
625 ; AVX512-NEXT: vpmovb2m %xmm0, %k1
626 ; AVX512-NEXT: korw %k0, %k1, %k0
627 ; AVX512-NEXT: vpmovm2b %k0, %xmm0
629 %z = call <16 x i1> @llvm.uadd.sat.v16i1(<16 x i1> %x, <16 x i1> %y)
635 define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {
638 ; SSE2-NEXT: psllq $32, %xmm0
639 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
640 ; SSE2-NEXT: pxor %xmm0, %xmm2
641 ; SSE2-NEXT: psllq $32, %xmm1
642 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [9223372034707292159,9223372034707292159]
643 ; SSE2-NEXT: pxor %xmm1, %xmm3
644 ; SSE2-NEXT: movdqa %xmm3, %xmm4
645 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
646 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
647 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3
648 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
649 ; SSE2-NEXT: pand %xmm5, %xmm2
650 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
651 ; SSE2-NEXT: por %xmm2, %xmm3
652 ; SSE2-NEXT: pand %xmm3, %xmm0
653 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
654 ; SSE2-NEXT: pxor %xmm3, %xmm2
655 ; SSE2-NEXT: movdqa %xmm1, %xmm3
656 ; SSE2-NEXT: pandn %xmm2, %xmm3
657 ; SSE2-NEXT: por %xmm3, %xmm0
658 ; SSE2-NEXT: paddq %xmm1, %xmm0
659 ; SSE2-NEXT: psrlq $32, %xmm0
662 ; SSSE3-LABEL: v2i32:
664 ; SSSE3-NEXT: psllq $32, %xmm0
665 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
666 ; SSSE3-NEXT: pxor %xmm0, %xmm2
667 ; SSSE3-NEXT: psllq $32, %xmm1
668 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [9223372034707292159,9223372034707292159]
669 ; SSSE3-NEXT: pxor %xmm1, %xmm3
670 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
671 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
672 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
673 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm3
674 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
675 ; SSSE3-NEXT: pand %xmm5, %xmm2
676 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
677 ; SSSE3-NEXT: por %xmm2, %xmm3
678 ; SSSE3-NEXT: pand %xmm3, %xmm0
679 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm2
680 ; SSSE3-NEXT: pxor %xmm3, %xmm2
681 ; SSSE3-NEXT: movdqa %xmm1, %xmm3
682 ; SSSE3-NEXT: pandn %xmm2, %xmm3
683 ; SSSE3-NEXT: por %xmm3, %xmm0
684 ; SSSE3-NEXT: paddq %xmm1, %xmm0
685 ; SSSE3-NEXT: psrlq $32, %xmm0
688 ; SSE41-LABEL: v2i32:
690 ; SSE41-NEXT: movdqa %xmm0, %xmm2
691 ; SSE41-NEXT: psllq $32, %xmm2
692 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
693 ; SSE41-NEXT: pxor %xmm2, %xmm0
694 ; SSE41-NEXT: psllq $32, %xmm1
695 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372034707292159,9223372034707292159]
696 ; SSE41-NEXT: pxor %xmm1, %xmm3
697 ; SSE41-NEXT: movdqa %xmm3, %xmm4
698 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
699 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
700 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
701 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
702 ; SSE41-NEXT: pand %xmm5, %xmm0
703 ; SSE41-NEXT: por %xmm4, %xmm0
704 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm3
705 ; SSE41-NEXT: pxor %xmm1, %xmm3
706 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm3
707 ; SSE41-NEXT: paddq %xmm1, %xmm3
708 ; SSE41-NEXT: psrlq $32, %xmm3
709 ; SSE41-NEXT: movdqa %xmm3, %xmm0
714 ; AVX1-NEXT: vpsllq $32, %xmm1, %xmm1
715 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
716 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm2
717 ; AVX1-NEXT: vpsllq $32, %xmm0, %xmm0
718 ; AVX1-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm3
719 ; AVX1-NEXT: vpxor {{.*}}(%rip), %xmm1, %xmm4
720 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3
721 ; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm2, %xmm0
722 ; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0
723 ; AVX1-NEXT: vpsrlq $32, %xmm0, %xmm0
728 ; AVX2-NEXT: vpsllq $32, %xmm1, %xmm1
729 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
730 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm2
731 ; AVX2-NEXT: vpsllq $32, %xmm0, %xmm0
732 ; AVX2-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm3
733 ; AVX2-NEXT: vpxor {{.*}}(%rip), %xmm1, %xmm4
734 ; AVX2-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3
735 ; AVX2-NEXT: vblendvpd %xmm3, %xmm0, %xmm2, %xmm0
736 ; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0
737 ; AVX2-NEXT: vpsrlq $32, %xmm0, %xmm0
740 ; AVX512-LABEL: v2i32:
742 ; AVX512-NEXT: vpsllq $32, %xmm0, %xmm0
743 ; AVX512-NEXT: vpsllq $32, %xmm1, %xmm1
744 ; AVX512-NEXT: vmovdqa %xmm1, %xmm2
745 ; AVX512-NEXT: vpternlogq $15, %xmm1, %xmm1, %xmm2
746 ; AVX512-NEXT: vpminuq %xmm2, %xmm0, %xmm0
747 ; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm0
748 ; AVX512-NEXT: vpsrlq $32, %xmm0, %xmm0
750 %z = call <2 x i32> @llvm.uadd.sat.v2i32(<2 x i32> %x, <2 x i32> %y)
754 define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
757 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
758 ; SSE2-NEXT: pxor %xmm0, %xmm2
759 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483647,2147483647,2147483647,2147483647]
760 ; SSE2-NEXT: pxor %xmm1, %xmm3
761 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
762 ; SSE2-NEXT: pand %xmm3, %xmm0
763 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
764 ; SSE2-NEXT: pxor %xmm3, %xmm2
765 ; SSE2-NEXT: movdqa %xmm1, %xmm3
766 ; SSE2-NEXT: pandn %xmm2, %xmm3
767 ; SSE2-NEXT: por %xmm3, %xmm0
768 ; SSE2-NEXT: paddd %xmm1, %xmm0
771 ; SSSE3-LABEL: v4i32:
773 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
774 ; SSSE3-NEXT: pxor %xmm0, %xmm2
775 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [2147483647,2147483647,2147483647,2147483647]
776 ; SSSE3-NEXT: pxor %xmm1, %xmm3
777 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
778 ; SSSE3-NEXT: pand %xmm3, %xmm0
779 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm2
780 ; SSSE3-NEXT: pxor %xmm3, %xmm2
781 ; SSSE3-NEXT: movdqa %xmm1, %xmm3
782 ; SSSE3-NEXT: pandn %xmm2, %xmm3
783 ; SSSE3-NEXT: por %xmm3, %xmm0
784 ; SSSE3-NEXT: paddd %xmm1, %xmm0
787 ; SSE41-LABEL: v4i32:
789 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm2
790 ; SSE41-NEXT: pxor %xmm1, %xmm2
791 ; SSE41-NEXT: pminud %xmm2, %xmm0
792 ; SSE41-NEXT: paddd %xmm1, %xmm0
797 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
798 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm2
799 ; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0
800 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
805 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
806 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm2
807 ; AVX2-NEXT: vpminud %xmm2, %xmm0, %xmm0
808 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0
811 ; AVX512-LABEL: v4i32:
813 ; AVX512-NEXT: vmovdqa %xmm1, %xmm2
814 ; AVX512-NEXT: vpternlogq $15, %xmm1, %xmm1, %xmm2
815 ; AVX512-NEXT: vpminud %xmm2, %xmm0, %xmm0
816 ; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm0
818 %z = call <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32> %x, <4 x i32> %y)
822 define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
825 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
826 ; SSE2-NEXT: movdqa %xmm0, %xmm5
827 ; SSE2-NEXT: pxor %xmm4, %xmm5
828 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483647,2147483647,2147483647,2147483647]
829 ; SSE2-NEXT: movdqa %xmm2, %xmm7
830 ; SSE2-NEXT: pxor %xmm6, %xmm7
831 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm7
832 ; SSE2-NEXT: pand %xmm7, %xmm0
833 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm8
834 ; SSE2-NEXT: pxor %xmm8, %xmm7
835 ; SSE2-NEXT: movdqa %xmm2, %xmm5
836 ; SSE2-NEXT: pandn %xmm7, %xmm5
837 ; SSE2-NEXT: por %xmm5, %xmm0
838 ; SSE2-NEXT: paddd %xmm2, %xmm0
839 ; SSE2-NEXT: pxor %xmm1, %xmm4
840 ; SSE2-NEXT: pxor %xmm3, %xmm6
841 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm6
842 ; SSE2-NEXT: pand %xmm6, %xmm1
843 ; SSE2-NEXT: pxor %xmm8, %xmm6
844 ; SSE2-NEXT: movdqa %xmm3, %xmm2
845 ; SSE2-NEXT: pandn %xmm6, %xmm2
846 ; SSE2-NEXT: por %xmm2, %xmm1
847 ; SSE2-NEXT: paddd %xmm3, %xmm1
850 ; SSSE3-LABEL: v8i32:
852 ; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
853 ; SSSE3-NEXT: movdqa %xmm0, %xmm5
854 ; SSSE3-NEXT: pxor %xmm4, %xmm5
855 ; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483647,2147483647,2147483647,2147483647]
856 ; SSSE3-NEXT: movdqa %xmm2, %xmm7
857 ; SSSE3-NEXT: pxor %xmm6, %xmm7
858 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm7
859 ; SSSE3-NEXT: pand %xmm7, %xmm0
860 ; SSSE3-NEXT: pcmpeqd %xmm8, %xmm8
861 ; SSSE3-NEXT: pxor %xmm8, %xmm7
862 ; SSSE3-NEXT: movdqa %xmm2, %xmm5
863 ; SSSE3-NEXT: pandn %xmm7, %xmm5
864 ; SSSE3-NEXT: por %xmm5, %xmm0
865 ; SSSE3-NEXT: paddd %xmm2, %xmm0
866 ; SSSE3-NEXT: pxor %xmm1, %xmm4
867 ; SSSE3-NEXT: pxor %xmm3, %xmm6
868 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
869 ; SSSE3-NEXT: pand %xmm6, %xmm1
870 ; SSSE3-NEXT: pxor %xmm8, %xmm6
871 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
872 ; SSSE3-NEXT: pandn %xmm6, %xmm2
873 ; SSSE3-NEXT: por %xmm2, %xmm1
874 ; SSSE3-NEXT: paddd %xmm3, %xmm1
877 ; SSE41-LABEL: v8i32:
879 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm4
880 ; SSE41-NEXT: movdqa %xmm2, %xmm5
881 ; SSE41-NEXT: pxor %xmm4, %xmm5
882 ; SSE41-NEXT: pminud %xmm5, %xmm0
883 ; SSE41-NEXT: paddd %xmm2, %xmm0
884 ; SSE41-NEXT: pxor %xmm3, %xmm4
885 ; SSE41-NEXT: pminud %xmm4, %xmm1
886 ; SSE41-NEXT: paddd %xmm3, %xmm1
891 ; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2
892 ; AVX1-NEXT: vcmptrueps %ymm2, %ymm2, %ymm2
893 ; AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm2
894 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
895 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
896 ; AVX1-NEXT: vpminud %xmm3, %xmm4, %xmm3
897 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
898 ; AVX1-NEXT: vpaddd %xmm4, %xmm3, %xmm3
899 ; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0
900 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
901 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
906 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2
907 ; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm2
908 ; AVX2-NEXT: vpminud %ymm2, %ymm0, %ymm0
909 ; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0
912 ; AVX512-LABEL: v8i32:
914 ; AVX512-NEXT: vmovdqa %ymm1, %ymm2
915 ; AVX512-NEXT: vpternlogq $15, %ymm1, %ymm1, %ymm2
916 ; AVX512-NEXT: vpminud %ymm2, %ymm0, %ymm0
917 ; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm0
919 %z = call <8 x i32> @llvm.uadd.sat.v8i32(<8 x i32> %x, <8 x i32> %y)
923 define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind {
924 ; SSE2-LABEL: v16i32:
926 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [2147483648,2147483648,2147483648,2147483648]
927 ; SSE2-NEXT: movdqa %xmm0, %xmm10
928 ; SSE2-NEXT: pxor %xmm9, %xmm10
929 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483647,2147483647,2147483647,2147483647]
930 ; SSE2-NEXT: movdqa %xmm4, %xmm11
931 ; SSE2-NEXT: pxor %xmm8, %xmm11
932 ; SSE2-NEXT: pcmpgtd %xmm10, %xmm11
933 ; SSE2-NEXT: pand %xmm11, %xmm0
934 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm10
935 ; SSE2-NEXT: pxor %xmm10, %xmm11
936 ; SSE2-NEXT: movdqa %xmm4, %xmm12
937 ; SSE2-NEXT: pandn %xmm11, %xmm12
938 ; SSE2-NEXT: por %xmm12, %xmm0
939 ; SSE2-NEXT: paddd %xmm4, %xmm0
940 ; SSE2-NEXT: movdqa %xmm1, %xmm11
941 ; SSE2-NEXT: pxor %xmm9, %xmm11
942 ; SSE2-NEXT: movdqa %xmm5, %xmm12
943 ; SSE2-NEXT: pxor %xmm8, %xmm12
944 ; SSE2-NEXT: pcmpgtd %xmm11, %xmm12
945 ; SSE2-NEXT: pand %xmm12, %xmm1
946 ; SSE2-NEXT: pxor %xmm10, %xmm12
947 ; SSE2-NEXT: movdqa %xmm5, %xmm4
948 ; SSE2-NEXT: pandn %xmm12, %xmm4
949 ; SSE2-NEXT: por %xmm4, %xmm1
950 ; SSE2-NEXT: paddd %xmm5, %xmm1
951 ; SSE2-NEXT: movdqa %xmm2, %xmm4
952 ; SSE2-NEXT: pxor %xmm9, %xmm4
953 ; SSE2-NEXT: movdqa %xmm6, %xmm5
954 ; SSE2-NEXT: pxor %xmm8, %xmm5
955 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm5
956 ; SSE2-NEXT: pand %xmm5, %xmm2
957 ; SSE2-NEXT: pxor %xmm10, %xmm5
958 ; SSE2-NEXT: movdqa %xmm6, %xmm4
959 ; SSE2-NEXT: pandn %xmm5, %xmm4
960 ; SSE2-NEXT: por %xmm4, %xmm2
961 ; SSE2-NEXT: paddd %xmm6, %xmm2
962 ; SSE2-NEXT: pxor %xmm3, %xmm9
963 ; SSE2-NEXT: pxor %xmm7, %xmm8
964 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm8
965 ; SSE2-NEXT: pand %xmm8, %xmm3
966 ; SSE2-NEXT: pxor %xmm10, %xmm8
967 ; SSE2-NEXT: movdqa %xmm7, %xmm4
968 ; SSE2-NEXT: pandn %xmm8, %xmm4
969 ; SSE2-NEXT: por %xmm4, %xmm3
970 ; SSE2-NEXT: paddd %xmm7, %xmm3
973 ; SSSE3-LABEL: v16i32:
975 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [2147483648,2147483648,2147483648,2147483648]
976 ; SSSE3-NEXT: movdqa %xmm0, %xmm10
977 ; SSSE3-NEXT: pxor %xmm9, %xmm10
978 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [2147483647,2147483647,2147483647,2147483647]
979 ; SSSE3-NEXT: movdqa %xmm4, %xmm11
980 ; SSSE3-NEXT: pxor %xmm8, %xmm11
981 ; SSSE3-NEXT: pcmpgtd %xmm10, %xmm11
982 ; SSSE3-NEXT: pand %xmm11, %xmm0
983 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm10
984 ; SSSE3-NEXT: pxor %xmm10, %xmm11
985 ; SSSE3-NEXT: movdqa %xmm4, %xmm12
986 ; SSSE3-NEXT: pandn %xmm11, %xmm12
987 ; SSSE3-NEXT: por %xmm12, %xmm0
988 ; SSSE3-NEXT: paddd %xmm4, %xmm0
989 ; SSSE3-NEXT: movdqa %xmm1, %xmm11
990 ; SSSE3-NEXT: pxor %xmm9, %xmm11
991 ; SSSE3-NEXT: movdqa %xmm5, %xmm12
992 ; SSSE3-NEXT: pxor %xmm8, %xmm12
993 ; SSSE3-NEXT: pcmpgtd %xmm11, %xmm12
994 ; SSSE3-NEXT: pand %xmm12, %xmm1
995 ; SSSE3-NEXT: pxor %xmm10, %xmm12
996 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
997 ; SSSE3-NEXT: pandn %xmm12, %xmm4
998 ; SSSE3-NEXT: por %xmm4, %xmm1
999 ; SSSE3-NEXT: paddd %xmm5, %xmm1
1000 ; SSSE3-NEXT: movdqa %xmm2, %xmm4
1001 ; SSSE3-NEXT: pxor %xmm9, %xmm4
1002 ; SSSE3-NEXT: movdqa %xmm6, %xmm5
1003 ; SSSE3-NEXT: pxor %xmm8, %xmm5
1004 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm5
1005 ; SSSE3-NEXT: pand %xmm5, %xmm2
1006 ; SSSE3-NEXT: pxor %xmm10, %xmm5
1007 ; SSSE3-NEXT: movdqa %xmm6, %xmm4
1008 ; SSSE3-NEXT: pandn %xmm5, %xmm4
1009 ; SSSE3-NEXT: por %xmm4, %xmm2
1010 ; SSSE3-NEXT: paddd %xmm6, %xmm2
1011 ; SSSE3-NEXT: pxor %xmm3, %xmm9
1012 ; SSSE3-NEXT: pxor %xmm7, %xmm8
1013 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm8
1014 ; SSSE3-NEXT: pand %xmm8, %xmm3
1015 ; SSSE3-NEXT: pxor %xmm10, %xmm8
1016 ; SSSE3-NEXT: movdqa %xmm7, %xmm4
1017 ; SSSE3-NEXT: pandn %xmm8, %xmm4
1018 ; SSSE3-NEXT: por %xmm4, %xmm3
1019 ; SSSE3-NEXT: paddd %xmm7, %xmm3
1022 ; SSE41-LABEL: v16i32:
1024 ; SSE41-NEXT: pcmpeqd %xmm8, %xmm8
1025 ; SSE41-NEXT: movdqa %xmm4, %xmm9
1026 ; SSE41-NEXT: pxor %xmm8, %xmm9
1027 ; SSE41-NEXT: pminud %xmm9, %xmm0
1028 ; SSE41-NEXT: paddd %xmm4, %xmm0
1029 ; SSE41-NEXT: movdqa %xmm5, %xmm4
1030 ; SSE41-NEXT: pxor %xmm8, %xmm4
1031 ; SSE41-NEXT: pminud %xmm4, %xmm1
1032 ; SSE41-NEXT: paddd %xmm5, %xmm1
1033 ; SSE41-NEXT: movdqa %xmm6, %xmm4
1034 ; SSE41-NEXT: pxor %xmm8, %xmm4
1035 ; SSE41-NEXT: pminud %xmm4, %xmm2
1036 ; SSE41-NEXT: paddd %xmm6, %xmm2
1037 ; SSE41-NEXT: pxor %xmm7, %xmm8
1038 ; SSE41-NEXT: pminud %xmm8, %xmm3
1039 ; SSE41-NEXT: paddd %xmm7, %xmm3
1042 ; AVX1-LABEL: v16i32:
1044 ; AVX1-NEXT: vxorps %xmm4, %xmm4, %xmm4
1045 ; AVX1-NEXT: vcmptrueps %ymm4, %ymm4, %ymm4
1046 ; AVX1-NEXT: vxorps %ymm4, %ymm2, %ymm5
1047 ; AVX1-NEXT: vextractf128 $1, %ymm5, %xmm6
1048 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7
1049 ; AVX1-NEXT: vpminud %xmm6, %xmm7, %xmm6
1050 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm7
1051 ; AVX1-NEXT: vpaddd %xmm7, %xmm6, %xmm6
1052 ; AVX1-NEXT: vpminud %xmm5, %xmm0, %xmm0
1053 ; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm0
1054 ; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm0, %ymm0
1055 ; AVX1-NEXT: vxorps %ymm4, %ymm3, %ymm2
1056 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
1057 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
1058 ; AVX1-NEXT: vpminud %xmm4, %xmm5, %xmm4
1059 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm5
1060 ; AVX1-NEXT: vpaddd %xmm5, %xmm4, %xmm4
1061 ; AVX1-NEXT: vpminud %xmm2, %xmm1, %xmm1
1062 ; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1
1063 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm1, %ymm1
1066 ; AVX2-LABEL: v16i32:
1068 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4
1069 ; AVX2-NEXT: vpxor %ymm4, %ymm2, %ymm5
1070 ; AVX2-NEXT: vpminud %ymm5, %ymm0, %ymm0
1071 ; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm0
1072 ; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm2
1073 ; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm1
1074 ; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm1
1077 ; AVX512-LABEL: v16i32:
1079 ; AVX512-NEXT: vmovdqa64 %zmm1, %zmm2
1080 ; AVX512-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm2
1081 ; AVX512-NEXT: vpminud %zmm2, %zmm0, %zmm0
1082 ; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0
1084 %z = call <16 x i32> @llvm.uadd.sat.v16i32(<16 x i32> %x, <16 x i32> %y)
1088 define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {
1089 ; SSE2-LABEL: v2i64:
1091 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
1092 ; SSE2-NEXT: pxor %xmm0, %xmm2
1093 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [9223372034707292159,9223372034707292159]
1094 ; SSE2-NEXT: pxor %xmm1, %xmm3
1095 ; SSE2-NEXT: movdqa %xmm3, %xmm4
1096 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
1097 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1098 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3
1099 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1100 ; SSE2-NEXT: pand %xmm5, %xmm2
1101 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1102 ; SSE2-NEXT: por %xmm2, %xmm3
1103 ; SSE2-NEXT: pand %xmm3, %xmm0
1104 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
1105 ; SSE2-NEXT: pxor %xmm3, %xmm2
1106 ; SSE2-NEXT: movdqa %xmm1, %xmm3
1107 ; SSE2-NEXT: pandn %xmm2, %xmm3
1108 ; SSE2-NEXT: por %xmm3, %xmm0
1109 ; SSE2-NEXT: paddq %xmm1, %xmm0
1112 ; SSSE3-LABEL: v2i64:
1114 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
1115 ; SSSE3-NEXT: pxor %xmm0, %xmm2
1116 ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [9223372034707292159,9223372034707292159]
1117 ; SSSE3-NEXT: pxor %xmm1, %xmm3
1118 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
1119 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
1120 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1121 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm3
1122 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1123 ; SSSE3-NEXT: pand %xmm5, %xmm2
1124 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1125 ; SSSE3-NEXT: por %xmm2, %xmm3
1126 ; SSSE3-NEXT: pand %xmm3, %xmm0
1127 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm2
1128 ; SSSE3-NEXT: pxor %xmm3, %xmm2
1129 ; SSSE3-NEXT: movdqa %xmm1, %xmm3
1130 ; SSSE3-NEXT: pandn %xmm2, %xmm3
1131 ; SSSE3-NEXT: por %xmm3, %xmm0
1132 ; SSSE3-NEXT: paddq %xmm1, %xmm0
1135 ; SSE41-LABEL: v2i64:
1137 ; SSE41-NEXT: movdqa %xmm0, %xmm2
1138 ; SSE41-NEXT: movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
1139 ; SSE41-NEXT: pxor %xmm2, %xmm0
1140 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [9223372034707292159,9223372034707292159]
1141 ; SSE41-NEXT: pxor %xmm1, %xmm3
1142 ; SSE41-NEXT: movdqa %xmm3, %xmm4
1143 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
1144 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1145 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm3
1146 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
1147 ; SSE41-NEXT: pand %xmm5, %xmm0
1148 ; SSE41-NEXT: por %xmm4, %xmm0
1149 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm3
1150 ; SSE41-NEXT: pxor %xmm1, %xmm3
1151 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm3
1152 ; SSE41-NEXT: paddq %xmm1, %xmm3
1153 ; SSE41-NEXT: movdqa %xmm3, %xmm0
1156 ; AVX1-LABEL: v2i64:
1158 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1159 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm2
1160 ; AVX1-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm3
1161 ; AVX1-NEXT: vpxor {{.*}}(%rip), %xmm1, %xmm4
1162 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3
1163 ; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm2, %xmm0
1164 ; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0
1167 ; AVX2-LABEL: v2i64:
1169 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1170 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm2
1171 ; AVX2-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm3
1172 ; AVX2-NEXT: vpxor {{.*}}(%rip), %xmm1, %xmm4
1173 ; AVX2-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3
1174 ; AVX2-NEXT: vblendvpd %xmm3, %xmm0, %xmm2, %xmm0
1175 ; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0
1178 ; AVX512-LABEL: v2i64:
1180 ; AVX512-NEXT: vmovdqa %xmm1, %xmm2
1181 ; AVX512-NEXT: vpternlogq $15, %xmm1, %xmm1, %xmm2
1182 ; AVX512-NEXT: vpminuq %xmm2, %xmm0, %xmm0
1183 ; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm0
1185 %z = call <2 x i64> @llvm.uadd.sat.v2i64(<2 x i64> %x, <2 x i64> %y)
1189 define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
1190 ; SSE2-LABEL: v4i64:
1192 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
1193 ; SSE2-NEXT: movdqa %xmm0, %xmm6
1194 ; SSE2-NEXT: pxor %xmm8, %xmm6
1195 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [9223372034707292159,9223372034707292159]
1196 ; SSE2-NEXT: movdqa %xmm2, %xmm7
1197 ; SSE2-NEXT: pxor %xmm5, %xmm7
1198 ; SSE2-NEXT: movdqa %xmm7, %xmm4
1199 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm4
1200 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm4[0,0,2,2]
1201 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm7
1202 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
1203 ; SSE2-NEXT: pand %xmm9, %xmm6
1204 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1205 ; SSE2-NEXT: por %xmm6, %xmm4
1206 ; SSE2-NEXT: pand %xmm4, %xmm0
1207 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm6
1208 ; SSE2-NEXT: pxor %xmm6, %xmm4
1209 ; SSE2-NEXT: movdqa %xmm2, %xmm7
1210 ; SSE2-NEXT: pandn %xmm4, %xmm7
1211 ; SSE2-NEXT: por %xmm7, %xmm0
1212 ; SSE2-NEXT: paddq %xmm2, %xmm0
1213 ; SSE2-NEXT: pxor %xmm1, %xmm8
1214 ; SSE2-NEXT: pxor %xmm3, %xmm5
1215 ; SSE2-NEXT: movdqa %xmm5, %xmm2
1216 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm2
1217 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1218 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm5
1219 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1220 ; SSE2-NEXT: pand %xmm4, %xmm5
1221 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1222 ; SSE2-NEXT: por %xmm5, %xmm2
1223 ; SSE2-NEXT: pand %xmm2, %xmm1
1224 ; SSE2-NEXT: pxor %xmm6, %xmm2
1225 ; SSE2-NEXT: movdqa %xmm3, %xmm4
1226 ; SSE2-NEXT: pandn %xmm2, %xmm4
1227 ; SSE2-NEXT: por %xmm4, %xmm1
1228 ; SSE2-NEXT: paddq %xmm3, %xmm1
1231 ; SSSE3-LABEL: v4i64:
1233 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
1234 ; SSSE3-NEXT: movdqa %xmm0, %xmm6
1235 ; SSSE3-NEXT: pxor %xmm8, %xmm6
1236 ; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [9223372034707292159,9223372034707292159]
1237 ; SSSE3-NEXT: movdqa %xmm2, %xmm7
1238 ; SSSE3-NEXT: pxor %xmm5, %xmm7
1239 ; SSSE3-NEXT: movdqa %xmm7, %xmm4
1240 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm4
1241 ; SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm4[0,0,2,2]
1242 ; SSSE3-NEXT: pcmpeqd %xmm6, %xmm7
1243 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
1244 ; SSSE3-NEXT: pand %xmm9, %xmm6
1245 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1246 ; SSSE3-NEXT: por %xmm6, %xmm4
1247 ; SSSE3-NEXT: pand %xmm4, %xmm0
1248 ; SSSE3-NEXT: pcmpeqd %xmm6, %xmm6
1249 ; SSSE3-NEXT: pxor %xmm6, %xmm4
1250 ; SSSE3-NEXT: movdqa %xmm2, %xmm7
1251 ; SSSE3-NEXT: pandn %xmm4, %xmm7
1252 ; SSSE3-NEXT: por %xmm7, %xmm0
1253 ; SSSE3-NEXT: paddq %xmm2, %xmm0
1254 ; SSSE3-NEXT: pxor %xmm1, %xmm8
1255 ; SSSE3-NEXT: pxor %xmm3, %xmm5
1256 ; SSSE3-NEXT: movdqa %xmm5, %xmm2
1257 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm2
1258 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
1259 ; SSSE3-NEXT: pcmpeqd %xmm8, %xmm5
1260 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1261 ; SSSE3-NEXT: pand %xmm4, %xmm5
1262 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1263 ; SSSE3-NEXT: por %xmm5, %xmm2
1264 ; SSSE3-NEXT: pand %xmm2, %xmm1
1265 ; SSSE3-NEXT: pxor %xmm6, %xmm2
1266 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
1267 ; SSSE3-NEXT: pandn %xmm2, %xmm4
1268 ; SSSE3-NEXT: por %xmm4, %xmm1
1269 ; SSSE3-NEXT: paddq %xmm3, %xmm1
1272 ; SSE41-LABEL: v4i64:
1274 ; SSE41-NEXT: movdqa %xmm0, %xmm8
1275 ; SSE41-NEXT: movdqa {{.*#+}} xmm7 = [9223372039002259456,9223372039002259456]
1276 ; SSE41-NEXT: pxor %xmm7, %xmm0
1277 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [9223372034707292159,9223372034707292159]
1278 ; SSE41-NEXT: movdqa %xmm2, %xmm5
1279 ; SSE41-NEXT: pxor %xmm4, %xmm5
1280 ; SSE41-NEXT: movdqa %xmm5, %xmm6
1281 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm6
1282 ; SSE41-NEXT: pshufd {{.*#+}} xmm9 = xmm6[0,0,2,2]
1283 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
1284 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
1285 ; SSE41-NEXT: pand %xmm9, %xmm0
1286 ; SSE41-NEXT: por %xmm6, %xmm0
1287 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm5
1288 ; SSE41-NEXT: movdqa %xmm2, %xmm6
1289 ; SSE41-NEXT: pxor %xmm5, %xmm6
1290 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm6
1291 ; SSE41-NEXT: paddq %xmm2, %xmm6
1292 ; SSE41-NEXT: pxor %xmm1, %xmm7
1293 ; SSE41-NEXT: pxor %xmm3, %xmm4
1294 ; SSE41-NEXT: movdqa %xmm4, %xmm2
1295 ; SSE41-NEXT: pcmpgtd %xmm7, %xmm2
1296 ; SSE41-NEXT: pshufd {{.*#+}} xmm8 = xmm2[0,0,2,2]
1297 ; SSE41-NEXT: pcmpeqd %xmm7, %xmm4
1298 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1299 ; SSE41-NEXT: pand %xmm8, %xmm0
1300 ; SSE41-NEXT: por %xmm2, %xmm0
1301 ; SSE41-NEXT: pxor %xmm3, %xmm5
1302 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm5
1303 ; SSE41-NEXT: paddq %xmm3, %xmm5
1304 ; SSE41-NEXT: movdqa %xmm6, %xmm0
1305 ; SSE41-NEXT: movdqa %xmm5, %xmm1
1308 ; AVX1-LABEL: v4i64:
1310 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
1311 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1312 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2
1313 ; AVX1-NEXT: vxorps %xmm4, %xmm4, %xmm4
1314 ; AVX1-NEXT: vcmptrueps %ymm4, %ymm4, %ymm4
1315 ; AVX1-NEXT: vxorps %ymm4, %ymm1, %ymm4
1316 ; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5
1317 ; AVX1-NEXT: vpxor %xmm3, %xmm5, %xmm5
1318 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm5, %xmm2
1319 ; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm5
1320 ; AVX1-NEXT: vxorps %xmm3, %xmm4, %xmm3
1321 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm3, %xmm3
1322 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
1323 ; AVX1-NEXT: vblendvpd %ymm2, %ymm0, %ymm4, %ymm0
1324 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
1325 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
1326 ; AVX1-NEXT: vpaddq %xmm3, %xmm2, %xmm2
1327 ; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0
1328 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1331 ; AVX2-LABEL: v4i64:
1333 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1334 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm2
1335 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
1336 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm3
1337 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm3, %ymm2
1338 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
1339 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm3
1340 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm3, %ymm0
1341 ; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0
1344 ; AVX512-LABEL: v4i64:
1346 ; AVX512-NEXT: vmovdqa %ymm1, %ymm2
1347 ; AVX512-NEXT: vpternlogq $15, %ymm1, %ymm1, %ymm2
1348 ; AVX512-NEXT: vpminuq %ymm2, %ymm0, %ymm0
1349 ; AVX512-NEXT: vpaddq %ymm1, %ymm0, %ymm0
1351 %z = call <4 x i64> @llvm.uadd.sat.v4i64(<4 x i64> %x, <4 x i64> %y)
1355 define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind {
1356 ; SSE2-LABEL: v8i64:
1358 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
1359 ; SSE2-NEXT: movdqa %xmm0, %xmm10
1360 ; SSE2-NEXT: pxor %xmm8, %xmm10
1361 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372034707292159,9223372034707292159]
1362 ; SSE2-NEXT: movdqa %xmm4, %xmm11
1363 ; SSE2-NEXT: pxor %xmm9, %xmm11
1364 ; SSE2-NEXT: movdqa %xmm11, %xmm12
1365 ; SSE2-NEXT: pcmpgtd %xmm10, %xmm12
1366 ; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
1367 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm11
1368 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm11[1,1,3,3]
1369 ; SSE2-NEXT: pand %xmm13, %xmm10
1370 ; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm12[1,1,3,3]
1371 ; SSE2-NEXT: por %xmm10, %xmm11
1372 ; SSE2-NEXT: pand %xmm11, %xmm0
1373 ; SSE2-NEXT: pcmpeqd %xmm10, %xmm10
1374 ; SSE2-NEXT: pxor %xmm10, %xmm11
1375 ; SSE2-NEXT: movdqa %xmm4, %xmm12
1376 ; SSE2-NEXT: pandn %xmm11, %xmm12
1377 ; SSE2-NEXT: por %xmm12, %xmm0
1378 ; SSE2-NEXT: paddq %xmm4, %xmm0
1379 ; SSE2-NEXT: movdqa %xmm1, %xmm11
1380 ; SSE2-NEXT: pxor %xmm8, %xmm11
1381 ; SSE2-NEXT: movdqa %xmm5, %xmm4
1382 ; SSE2-NEXT: pxor %xmm9, %xmm4
1383 ; SSE2-NEXT: movdqa %xmm4, %xmm12
1384 ; SSE2-NEXT: pcmpgtd %xmm11, %xmm12
1385 ; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
1386 ; SSE2-NEXT: pcmpeqd %xmm11, %xmm4
1387 ; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm4[1,1,3,3]
1388 ; SSE2-NEXT: pand %xmm13, %xmm11
1389 ; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
1390 ; SSE2-NEXT: por %xmm11, %xmm12
1391 ; SSE2-NEXT: pand %xmm12, %xmm1
1392 ; SSE2-NEXT: pxor %xmm10, %xmm12
1393 ; SSE2-NEXT: movdqa %xmm5, %xmm4
1394 ; SSE2-NEXT: pandn %xmm12, %xmm4
1395 ; SSE2-NEXT: por %xmm4, %xmm1
1396 ; SSE2-NEXT: paddq %xmm5, %xmm1
1397 ; SSE2-NEXT: movdqa %xmm2, %xmm4
1398 ; SSE2-NEXT: pxor %xmm8, %xmm4
1399 ; SSE2-NEXT: movdqa %xmm6, %xmm5
1400 ; SSE2-NEXT: pxor %xmm9, %xmm5
1401 ; SSE2-NEXT: movdqa %xmm5, %xmm11
1402 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm11
1403 ; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1404 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm5
1405 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1406 ; SSE2-NEXT: pand %xmm12, %xmm4
1407 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm11[1,1,3,3]
1408 ; SSE2-NEXT: por %xmm4, %xmm5
1409 ; SSE2-NEXT: pand %xmm5, %xmm2
1410 ; SSE2-NEXT: pxor %xmm10, %xmm5
1411 ; SSE2-NEXT: movdqa %xmm6, %xmm4
1412 ; SSE2-NEXT: pandn %xmm5, %xmm4
1413 ; SSE2-NEXT: por %xmm4, %xmm2
1414 ; SSE2-NEXT: paddq %xmm6, %xmm2
1415 ; SSE2-NEXT: pxor %xmm3, %xmm8
1416 ; SSE2-NEXT: pxor %xmm7, %xmm9
1417 ; SSE2-NEXT: movdqa %xmm9, %xmm4
1418 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm4
1419 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1420 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm9
1421 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm9[1,1,3,3]
1422 ; SSE2-NEXT: pand %xmm5, %xmm6
1423 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1424 ; SSE2-NEXT: por %xmm6, %xmm4
1425 ; SSE2-NEXT: pand %xmm4, %xmm3
1426 ; SSE2-NEXT: pxor %xmm10, %xmm4
1427 ; SSE2-NEXT: movdqa %xmm7, %xmm5
1428 ; SSE2-NEXT: pandn %xmm4, %xmm5
1429 ; SSE2-NEXT: por %xmm5, %xmm3
1430 ; SSE2-NEXT: paddq %xmm7, %xmm3
1433 ; SSSE3-LABEL: v8i64:
1435 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
1436 ; SSSE3-NEXT: movdqa %xmm0, %xmm10
1437 ; SSSE3-NEXT: pxor %xmm8, %xmm10
1438 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [9223372034707292159,9223372034707292159]
1439 ; SSSE3-NEXT: movdqa %xmm4, %xmm11
1440 ; SSSE3-NEXT: pxor %xmm9, %xmm11
1441 ; SSSE3-NEXT: movdqa %xmm11, %xmm12
1442 ; SSSE3-NEXT: pcmpgtd %xmm10, %xmm12
1443 ; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
1444 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm11
1445 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm11[1,1,3,3]
1446 ; SSSE3-NEXT: pand %xmm13, %xmm10
1447 ; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm12[1,1,3,3]
1448 ; SSSE3-NEXT: por %xmm10, %xmm11
1449 ; SSSE3-NEXT: pand %xmm11, %xmm0
1450 ; SSSE3-NEXT: pcmpeqd %xmm10, %xmm10
1451 ; SSSE3-NEXT: pxor %xmm10, %xmm11
1452 ; SSSE3-NEXT: movdqa %xmm4, %xmm12
1453 ; SSSE3-NEXT: pandn %xmm11, %xmm12
1454 ; SSSE3-NEXT: por %xmm12, %xmm0
1455 ; SSSE3-NEXT: paddq %xmm4, %xmm0
1456 ; SSSE3-NEXT: movdqa %xmm1, %xmm11
1457 ; SSSE3-NEXT: pxor %xmm8, %xmm11
1458 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
1459 ; SSSE3-NEXT: pxor %xmm9, %xmm4
1460 ; SSSE3-NEXT: movdqa %xmm4, %xmm12
1461 ; SSSE3-NEXT: pcmpgtd %xmm11, %xmm12
1462 ; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
1463 ; SSSE3-NEXT: pcmpeqd %xmm11, %xmm4
1464 ; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm4[1,1,3,3]
1465 ; SSSE3-NEXT: pand %xmm13, %xmm11
1466 ; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm12[1,1,3,3]
1467 ; SSSE3-NEXT: por %xmm11, %xmm12
1468 ; SSSE3-NEXT: pand %xmm12, %xmm1
1469 ; SSSE3-NEXT: pxor %xmm10, %xmm12
1470 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
1471 ; SSSE3-NEXT: pandn %xmm12, %xmm4
1472 ; SSSE3-NEXT: por %xmm4, %xmm1
1473 ; SSSE3-NEXT: paddq %xmm5, %xmm1
1474 ; SSSE3-NEXT: movdqa %xmm2, %xmm4
1475 ; SSSE3-NEXT: pxor %xmm8, %xmm4
1476 ; SSSE3-NEXT: movdqa %xmm6, %xmm5
1477 ; SSSE3-NEXT: pxor %xmm9, %xmm5
1478 ; SSSE3-NEXT: movdqa %xmm5, %xmm11
1479 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm11
1480 ; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1481 ; SSSE3-NEXT: pcmpeqd %xmm4, %xmm5
1482 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1483 ; SSSE3-NEXT: pand %xmm12, %xmm4
1484 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm11[1,1,3,3]
1485 ; SSSE3-NEXT: por %xmm4, %xmm5
1486 ; SSSE3-NEXT: pand %xmm5, %xmm2
1487 ; SSSE3-NEXT: pxor %xmm10, %xmm5
1488 ; SSSE3-NEXT: movdqa %xmm6, %xmm4
1489 ; SSSE3-NEXT: pandn %xmm5, %xmm4
1490 ; SSSE3-NEXT: por %xmm4, %xmm2
1491 ; SSSE3-NEXT: paddq %xmm6, %xmm2
1492 ; SSSE3-NEXT: pxor %xmm3, %xmm8
1493 ; SSSE3-NEXT: pxor %xmm7, %xmm9
1494 ; SSSE3-NEXT: movdqa %xmm9, %xmm4
1495 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm4
1496 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1497 ; SSSE3-NEXT: pcmpeqd %xmm8, %xmm9
1498 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm9[1,1,3,3]
1499 ; SSSE3-NEXT: pand %xmm5, %xmm6
1500 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1501 ; SSSE3-NEXT: por %xmm6, %xmm4
1502 ; SSSE3-NEXT: pand %xmm4, %xmm3
1503 ; SSSE3-NEXT: pxor %xmm10, %xmm4
1504 ; SSSE3-NEXT: movdqa %xmm7, %xmm5
1505 ; SSSE3-NEXT: pandn %xmm4, %xmm5
1506 ; SSSE3-NEXT: por %xmm5, %xmm3
1507 ; SSSE3-NEXT: paddq %xmm7, %xmm3
1510 ; SSE41-LABEL: v8i64:
1512 ; SSE41-NEXT: movdqa %xmm1, %xmm9
1513 ; SSE41-NEXT: movdqa %xmm0, %xmm13
1514 ; SSE41-NEXT: movdqa {{.*#+}} xmm11 = [9223372039002259456,9223372039002259456]
1515 ; SSE41-NEXT: pxor %xmm11, %xmm0
1516 ; SSE41-NEXT: movdqa {{.*#+}} xmm12 = [9223372034707292159,9223372034707292159]
1517 ; SSE41-NEXT: movdqa %xmm4, %xmm1
1518 ; SSE41-NEXT: pxor %xmm12, %xmm1
1519 ; SSE41-NEXT: movdqa %xmm1, %xmm8
1520 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm8
1521 ; SSE41-NEXT: pshufd {{.*#+}} xmm10 = xmm8[0,0,2,2]
1522 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
1523 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1524 ; SSE41-NEXT: pand %xmm10, %xmm0
1525 ; SSE41-NEXT: por %xmm8, %xmm0
1526 ; SSE41-NEXT: pcmpeqd %xmm10, %xmm10
1527 ; SSE41-NEXT: movdqa %xmm4, %xmm8
1528 ; SSE41-NEXT: pxor %xmm10, %xmm8
1529 ; SSE41-NEXT: blendvpd %xmm0, %xmm13, %xmm8
1530 ; SSE41-NEXT: paddq %xmm4, %xmm8
1531 ; SSE41-NEXT: movdqa %xmm9, %xmm0
1532 ; SSE41-NEXT: pxor %xmm11, %xmm0
1533 ; SSE41-NEXT: movdqa %xmm5, %xmm1
1534 ; SSE41-NEXT: pxor %xmm12, %xmm1
1535 ; SSE41-NEXT: movdqa %xmm1, %xmm4
1536 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
1537 ; SSE41-NEXT: pshufd {{.*#+}} xmm13 = xmm4[0,0,2,2]
1538 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
1539 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1540 ; SSE41-NEXT: pand %xmm13, %xmm0
1541 ; SSE41-NEXT: por %xmm4, %xmm0
1542 ; SSE41-NEXT: movdqa %xmm5, %xmm1
1543 ; SSE41-NEXT: pxor %xmm10, %xmm1
1544 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm1
1545 ; SSE41-NEXT: paddq %xmm5, %xmm1
1546 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1547 ; SSE41-NEXT: pxor %xmm11, %xmm0
1548 ; SSE41-NEXT: movdqa %xmm6, %xmm4
1549 ; SSE41-NEXT: pxor %xmm12, %xmm4
1550 ; SSE41-NEXT: movdqa %xmm4, %xmm5
1551 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm5
1552 ; SSE41-NEXT: pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
1553 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm4
1554 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1555 ; SSE41-NEXT: pand %xmm9, %xmm0
1556 ; SSE41-NEXT: por %xmm5, %xmm0
1557 ; SSE41-NEXT: movdqa %xmm6, %xmm4
1558 ; SSE41-NEXT: pxor %xmm10, %xmm4
1559 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4
1560 ; SSE41-NEXT: paddq %xmm6, %xmm4
1561 ; SSE41-NEXT: pxor %xmm3, %xmm11
1562 ; SSE41-NEXT: pxor %xmm7, %xmm12
1563 ; SSE41-NEXT: movdqa %xmm12, %xmm2
1564 ; SSE41-NEXT: pcmpgtd %xmm11, %xmm2
1565 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
1566 ; SSE41-NEXT: pcmpeqd %xmm11, %xmm12
1567 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm12[1,1,3,3]
1568 ; SSE41-NEXT: pand %xmm5, %xmm0
1569 ; SSE41-NEXT: por %xmm2, %xmm0
1570 ; SSE41-NEXT: pxor %xmm7, %xmm10
1571 ; SSE41-NEXT: blendvpd %xmm0, %xmm3, %xmm10
1572 ; SSE41-NEXT: paddq %xmm7, %xmm10
1573 ; SSE41-NEXT: movdqa %xmm8, %xmm0
1574 ; SSE41-NEXT: movdqa %xmm4, %xmm2
1575 ; SSE41-NEXT: movdqa %xmm10, %xmm3
1578 ; AVX1-LABEL: v8i64:
1580 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
1581 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
1582 ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5
1583 ; AVX1-NEXT: vxorps %xmm6, %xmm6, %xmm6
1584 ; AVX1-NEXT: vcmptrueps %ymm6, %ymm6, %ymm8
1585 ; AVX1-NEXT: vxorps %ymm8, %ymm2, %ymm7
1586 ; AVX1-NEXT: vextractf128 $1, %ymm7, %xmm6
1587 ; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6
1588 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm9
1589 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm6
1590 ; AVX1-NEXT: vxorps %xmm4, %xmm7, %xmm5
1591 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm5, %xmm5
1592 ; AVX1-NEXT: vinsertf128 $1, %xmm9, %ymm5, %ymm5
1593 ; AVX1-NEXT: vblendvpd %ymm5, %ymm0, %ymm7, %ymm0
1594 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
1595 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm6
1596 ; AVX1-NEXT: vpaddq %xmm6, %xmm5, %xmm5
1597 ; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm0
1598 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm0, %ymm0
1599 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1600 ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2
1601 ; AVX1-NEXT: vxorps %ymm8, %ymm3, %ymm5
1602 ; AVX1-NEXT: vextractf128 $1, %ymm5, %xmm6
1603 ; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm6
1604 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm6, %xmm2
1605 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm6
1606 ; AVX1-NEXT: vxorps %xmm4, %xmm5, %xmm4
1607 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm4, %xmm4
1608 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm4, %ymm2
1609 ; AVX1-NEXT: vblendvpd %ymm2, %ymm1, %ymm5, %ymm1
1610 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1611 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
1612 ; AVX1-NEXT: vpaddq %xmm4, %xmm2, %xmm2
1613 ; AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm1
1614 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
1617 ; AVX2-LABEL: v8i64:
1619 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1620 ; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm5
1621 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm6 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
1622 ; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm7
1623 ; AVX2-NEXT: vpcmpgtq %ymm5, %ymm7, %ymm5
1624 ; AVX2-NEXT: vpcmpeqd %ymm7, %ymm7, %ymm7
1625 ; AVX2-NEXT: vpxor %ymm7, %ymm2, %ymm8
1626 ; AVX2-NEXT: vblendvpd %ymm5, %ymm0, %ymm8, %ymm0
1627 ; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0
1628 ; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm2
1629 ; AVX2-NEXT: vpxor %ymm6, %ymm3, %ymm4
1630 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm4, %ymm2
1631 ; AVX2-NEXT: vpxor %ymm7, %ymm3, %ymm4
1632 ; AVX2-NEXT: vblendvpd %ymm2, %ymm1, %ymm4, %ymm1
1633 ; AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm1
1636 ; AVX512-LABEL: v8i64:
1638 ; AVX512-NEXT: vmovdqa64 %zmm1, %zmm2
1639 ; AVX512-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm2
1640 ; AVX512-NEXT: vpminuq %zmm2, %zmm0, %zmm0
1641 ; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm0
1643 %z = call <8 x i64> @llvm.uadd.sat.v8i64(<8 x i64> %x, <8 x i64> %y)
1647 define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind {
1648 ; SSE-LABEL: v2i128:
1650 ; SSE-NEXT: movq %rdi, %rax
1651 ; SSE-NEXT: addq %r9, %rsi
1652 ; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %rdx
1653 ; SSE-NEXT: movq $-1, %rdi
1654 ; SSE-NEXT: cmovbq %rdi, %rsi
1655 ; SSE-NEXT: cmovbq %rdi, %rdx
1656 ; SSE-NEXT: addq {{[0-9]+}}(%rsp), %rcx
1657 ; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %r8
1658 ; SSE-NEXT: cmovbq %rdi, %r8
1659 ; SSE-NEXT: cmovbq %rdi, %rcx
1660 ; SSE-NEXT: movq %r8, 24(%rax)
1661 ; SSE-NEXT: movq %rcx, 16(%rax)
1662 ; SSE-NEXT: movq %rdx, 8(%rax)
1663 ; SSE-NEXT: movq %rsi, (%rax)
1666 ; AVX-LABEL: v2i128:
1668 ; AVX-NEXT: movq %rdi, %rax
1669 ; AVX-NEXT: addq %r9, %rsi
1670 ; AVX-NEXT: adcq {{[0-9]+}}(%rsp), %rdx
1671 ; AVX-NEXT: movq $-1, %rdi
1672 ; AVX-NEXT: cmovbq %rdi, %rsi
1673 ; AVX-NEXT: cmovbq %rdi, %rdx
1674 ; AVX-NEXT: addq {{[0-9]+}}(%rsp), %rcx
1675 ; AVX-NEXT: adcq {{[0-9]+}}(%rsp), %r8
1676 ; AVX-NEXT: cmovbq %rdi, %r8
1677 ; AVX-NEXT: cmovbq %rdi, %rcx
1678 ; AVX-NEXT: movq %r8, 24(%rax)
1679 ; AVX-NEXT: movq %rcx, 16(%rax)
1680 ; AVX-NEXT: movq %rdx, 8(%rax)
1681 ; AVX-NEXT: movq %rsi, (%rax)
1683 %z = call <2 x i128> @llvm.uadd.sat.v2i128(<2 x i128> %x, <2 x i128> %y)