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 16(%rsi), %xmm1, %xmm1
464 ; AVX1-NEXT: vpaddusw (%rsi), %xmm0, %xmm0
465 ; AVX1-NEXT: vmovdqa %xmm0, (%rdx)
466 ; AVX1-NEXT: vmovq %xmm1, 16(%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: movzbl %al, %eax
503 ; SSE-NEXT: movl $255, %ecx
504 ; SSE-NEXT: cmovael %eax, %ecx
505 ; SSE-NEXT: movb %cl, (%rdx)
510 ; AVX-NEXT: movb (%rdi), %al
511 ; AVX-NEXT: addb (%rsi), %al
512 ; AVX-NEXT: movzbl %al, %eax
513 ; AVX-NEXT: movl $255, %ecx
514 ; AVX-NEXT: cmovael %eax, %ecx
515 ; AVX-NEXT: movb %cl, (%rdx)
517 %x = load <1 x i8>, <1 x i8>* %px
518 %y = load <1 x i8>, <1 x i8>* %py
519 %z = call <1 x i8> @llvm.uadd.sat.v1i8(<1 x i8> %x, <1 x i8> %y)
520 store <1 x i8> %z, <1 x i8>* %pz
524 define void @v1i16(<1 x i16>* %px, <1 x i16>* %py, <1 x i16>* %pz) nounwind {
527 ; SSE-NEXT: movzwl (%rdi), %eax
528 ; SSE-NEXT: addw (%rsi), %ax
529 ; SSE-NEXT: movl $65535, %ecx # imm = 0xFFFF
530 ; SSE-NEXT: cmovael %eax, %ecx
531 ; SSE-NEXT: movw %cx, (%rdx)
536 ; AVX-NEXT: movzwl (%rdi), %eax
537 ; AVX-NEXT: addw (%rsi), %ax
538 ; AVX-NEXT: movl $65535, %ecx # imm = 0xFFFF
539 ; AVX-NEXT: cmovael %eax, %ecx
540 ; AVX-NEXT: movw %cx, (%rdx)
542 %x = load <1 x i16>, <1 x i16>* %px
543 %y = load <1 x i16>, <1 x i16>* %py
544 %z = call <1 x i16> @llvm.uadd.sat.v1i16(<1 x i16> %x, <1 x i16> %y)
545 store <1 x i16> %z, <1 x i16>* %pz
551 define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind {
554 ; SSE-NEXT: psllw $4, %xmm1
555 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
556 ; SSE-NEXT: pand %xmm2, %xmm1
557 ; SSE-NEXT: psllw $4, %xmm0
558 ; SSE-NEXT: pand %xmm2, %xmm0
559 ; SSE-NEXT: paddusb %xmm1, %xmm0
560 ; SSE-NEXT: psrlw $4, %xmm0
561 ; SSE-NEXT: pand {{.*}}(%rip), %xmm0
566 ; AVX-NEXT: vpsllw $4, %xmm1, %xmm1
567 ; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
568 ; AVX-NEXT: vpand %xmm2, %xmm1, %xmm1
569 ; AVX-NEXT: vpsllw $4, %xmm0, %xmm0
570 ; AVX-NEXT: vpand %xmm2, %xmm0, %xmm0
571 ; AVX-NEXT: vpaddusb %xmm1, %xmm0, %xmm0
572 ; AVX-NEXT: vpsrlw $4, %xmm0, %xmm0
573 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
575 %z = call <16 x i4> @llvm.uadd.sat.v16i4(<16 x i4> %x, <16 x i4> %y)
579 define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind {
582 ; SSE-NEXT: psllw $7, %xmm1
583 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
584 ; SSE-NEXT: pand %xmm2, %xmm1
585 ; SSE-NEXT: psllw $7, %xmm0
586 ; SSE-NEXT: pand %xmm2, %xmm0
587 ; SSE-NEXT: paddusb %xmm1, %xmm0
588 ; SSE-NEXT: psrlw $7, %xmm0
589 ; SSE-NEXT: pand {{.*}}(%rip), %xmm0
594 ; AVX1-NEXT: vpsllw $7, %xmm1, %xmm1
595 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
596 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
597 ; AVX1-NEXT: vpsllw $7, %xmm0, %xmm0
598 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
599 ; AVX1-NEXT: vpaddusb %xmm1, %xmm0, %xmm0
600 ; AVX1-NEXT: vpsrlw $7, %xmm0, %xmm0
601 ; AVX1-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
606 ; AVX2-NEXT: vpsllw $7, %xmm1, %xmm1
607 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
608 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1
609 ; AVX2-NEXT: vpsllw $7, %xmm0, %xmm0
610 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
611 ; AVX2-NEXT: vpaddusb %xmm1, %xmm0, %xmm0
612 ; AVX2-NEXT: vpsrlw $7, %xmm0, %xmm0
613 ; AVX2-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
616 ; AVX512-LABEL: v16i1:
618 ; AVX512-NEXT: vpsllw $7, %xmm1, %xmm1
619 ; AVX512-NEXT: vpmovb2m %xmm1, %k0
620 ; AVX512-NEXT: vpsllw $7, %xmm0, %xmm0
621 ; AVX512-NEXT: vpmovb2m %xmm0, %k1
622 ; AVX512-NEXT: korw %k0, %k1, %k0
623 ; AVX512-NEXT: vpmovm2b %k0, %xmm0
625 %z = call <16 x i1> @llvm.uadd.sat.v16i1(<16 x i1> %x, <16 x i1> %y)
631 define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {
634 ; SSE2-NEXT: psllq $32, %xmm0
635 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
636 ; SSE2-NEXT: psllq $32, %xmm1
637 ; SSE2-NEXT: paddq %xmm0, %xmm1
638 ; SSE2-NEXT: pxor %xmm2, %xmm0
639 ; SSE2-NEXT: pxor %xmm1, %xmm2
640 ; SSE2-NEXT: movdqa %xmm0, %xmm3
641 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3
642 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm0
643 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
644 ; SSE2-NEXT: pand %xmm2, %xmm3
645 ; SSE2-NEXT: por %xmm1, %xmm0
646 ; SSE2-NEXT: por %xmm3, %xmm0
647 ; SSE2-NEXT: psrlq $32, %xmm0
650 ; SSSE3-LABEL: v2i32:
652 ; SSSE3-NEXT: psllq $32, %xmm0
653 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
654 ; SSSE3-NEXT: psllq $32, %xmm1
655 ; SSSE3-NEXT: paddq %xmm0, %xmm1
656 ; SSSE3-NEXT: pxor %xmm2, %xmm0
657 ; SSSE3-NEXT: pxor %xmm1, %xmm2
658 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
659 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm3
660 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0
661 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
662 ; SSSE3-NEXT: pand %xmm2, %xmm3
663 ; SSSE3-NEXT: por %xmm1, %xmm0
664 ; SSSE3-NEXT: por %xmm3, %xmm0
665 ; SSSE3-NEXT: psrlq $32, %xmm0
668 ; SSE41-LABEL: v2i32:
670 ; SSE41-NEXT: psllq $32, %xmm0
671 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
672 ; SSE41-NEXT: psllq $32, %xmm1
673 ; SSE41-NEXT: paddq %xmm0, %xmm1
674 ; SSE41-NEXT: movdqa %xmm0, %xmm3
675 ; SSE41-NEXT: pxor %xmm2, %xmm3
676 ; SSE41-NEXT: pxor %xmm1, %xmm2
677 ; SSE41-NEXT: movdqa %xmm3, %xmm0
678 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm0
679 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
680 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm2
681 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
682 ; SSE41-NEXT: pand %xmm4, %xmm2
683 ; SSE41-NEXT: por %xmm2, %xmm0
684 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm2
685 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
686 ; SSE41-NEXT: psrlq $32, %xmm1
687 ; SSE41-NEXT: movdqa %xmm1, %xmm0
692 ; AVX1-NEXT: vpsllq $32, %xmm0, %xmm0
693 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
694 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm3
695 ; AVX1-NEXT: vpsllq $32, %xmm1, %xmm1
696 ; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0
697 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm1
698 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1
699 ; AVX1-NEXT: vpor %xmm0, %xmm1, %xmm0
700 ; AVX1-NEXT: vpsrlq $32, %xmm0, %xmm0
705 ; AVX2-NEXT: vpsllq $32, %xmm0, %xmm0
706 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
707 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm3
708 ; AVX2-NEXT: vpsllq $32, %xmm1, %xmm1
709 ; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0
710 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm1
711 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1
712 ; AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0
713 ; AVX2-NEXT: vpsrlq $32, %xmm0, %xmm0
716 ; AVX512-LABEL: v2i32:
718 ; AVX512-NEXT: vpsllq $32, %xmm0, %xmm0
719 ; AVX512-NEXT: vpsllq $32, %xmm1, %xmm1
720 ; AVX512-NEXT: vmovdqa %xmm1, %xmm2
721 ; AVX512-NEXT: vpternlogq $15, %xmm1, %xmm1, %xmm2
722 ; AVX512-NEXT: vpminuq %xmm2, %xmm0, %xmm0
723 ; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm0
724 ; AVX512-NEXT: vpsrlq $32, %xmm0, %xmm0
726 %z = call <2 x i32> @llvm.uadd.sat.v2i32(<2 x i32> %x, <2 x i32> %y)
730 define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
733 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
734 ; SSE2-NEXT: paddd %xmm0, %xmm1
735 ; SSE2-NEXT: pxor %xmm2, %xmm0
736 ; SSE2-NEXT: pxor %xmm1, %xmm2
737 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm0
738 ; SSE2-NEXT: por %xmm1, %xmm0
741 ; SSSE3-LABEL: v4i32:
743 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
744 ; SSSE3-NEXT: paddd %xmm0, %xmm1
745 ; SSSE3-NEXT: pxor %xmm2, %xmm0
746 ; SSSE3-NEXT: pxor %xmm1, %xmm2
747 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0
748 ; SSSE3-NEXT: por %xmm1, %xmm0
751 ; SSE41-LABEL: v4i32:
753 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm2
754 ; SSE41-NEXT: pxor %xmm1, %xmm2
755 ; SSE41-NEXT: pminud %xmm2, %xmm0
756 ; SSE41-NEXT: paddd %xmm1, %xmm0
761 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
762 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm2
763 ; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0
764 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
769 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
770 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm2
771 ; AVX2-NEXT: vpminud %xmm2, %xmm0, %xmm0
772 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0
775 ; AVX512-LABEL: v4i32:
777 ; AVX512-NEXT: vmovdqa %xmm1, %xmm2
778 ; AVX512-NEXT: vpternlogq $15, %xmm1, %xmm1, %xmm2
779 ; AVX512-NEXT: vpminud %xmm2, %xmm0, %xmm0
780 ; AVX512-NEXT: vpaddd %xmm1, %xmm0, %xmm0
782 %z = call <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32> %x, <4 x i32> %y)
786 define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
789 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
790 ; SSE2-NEXT: paddd %xmm0, %xmm2
791 ; SSE2-NEXT: pxor %xmm4, %xmm0
792 ; SSE2-NEXT: movdqa %xmm2, %xmm5
793 ; SSE2-NEXT: pxor %xmm4, %xmm5
794 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm0
795 ; SSE2-NEXT: por %xmm2, %xmm0
796 ; SSE2-NEXT: paddd %xmm1, %xmm3
797 ; SSE2-NEXT: pxor %xmm4, %xmm1
798 ; SSE2-NEXT: pxor %xmm3, %xmm4
799 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm1
800 ; SSE2-NEXT: por %xmm3, %xmm1
803 ; SSSE3-LABEL: v8i32:
805 ; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
806 ; SSSE3-NEXT: paddd %xmm0, %xmm2
807 ; SSSE3-NEXT: pxor %xmm4, %xmm0
808 ; SSSE3-NEXT: movdqa %xmm2, %xmm5
809 ; SSSE3-NEXT: pxor %xmm4, %xmm5
810 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm0
811 ; SSSE3-NEXT: por %xmm2, %xmm0
812 ; SSSE3-NEXT: paddd %xmm1, %xmm3
813 ; SSSE3-NEXT: pxor %xmm4, %xmm1
814 ; SSSE3-NEXT: pxor %xmm3, %xmm4
815 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm1
816 ; SSSE3-NEXT: por %xmm3, %xmm1
819 ; SSE41-LABEL: v8i32:
821 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm4
822 ; SSE41-NEXT: movdqa %xmm2, %xmm5
823 ; SSE41-NEXT: pxor %xmm4, %xmm5
824 ; SSE41-NEXT: pminud %xmm5, %xmm0
825 ; SSE41-NEXT: paddd %xmm2, %xmm0
826 ; SSE41-NEXT: pxor %xmm3, %xmm4
827 ; SSE41-NEXT: pminud %xmm4, %xmm1
828 ; SSE41-NEXT: paddd %xmm3, %xmm1
833 ; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2
834 ; AVX1-NEXT: vcmptrueps %ymm2, %ymm2, %ymm2
835 ; AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm2
836 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
837 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
838 ; AVX1-NEXT: vpminud %xmm3, %xmm4, %xmm3
839 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
840 ; AVX1-NEXT: vpaddd %xmm4, %xmm3, %xmm3
841 ; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0
842 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
843 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
848 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2
849 ; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm2
850 ; AVX2-NEXT: vpminud %ymm2, %ymm0, %ymm0
851 ; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0
854 ; AVX512-LABEL: v8i32:
856 ; AVX512-NEXT: vmovdqa %ymm1, %ymm2
857 ; AVX512-NEXT: vpternlogq $15, %ymm1, %ymm1, %ymm2
858 ; AVX512-NEXT: vpminud %ymm2, %ymm0, %ymm0
859 ; AVX512-NEXT: vpaddd %ymm1, %ymm0, %ymm0
861 %z = call <8 x i32> @llvm.uadd.sat.v8i32(<8 x i32> %x, <8 x i32> %y)
865 define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind {
866 ; SSE2-LABEL: v16i32:
868 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
869 ; SSE2-NEXT: paddd %xmm0, %xmm4
870 ; SSE2-NEXT: pxor %xmm8, %xmm0
871 ; SSE2-NEXT: movdqa %xmm4, %xmm9
872 ; SSE2-NEXT: pxor %xmm8, %xmm9
873 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm0
874 ; SSE2-NEXT: por %xmm4, %xmm0
875 ; SSE2-NEXT: paddd %xmm1, %xmm5
876 ; SSE2-NEXT: pxor %xmm8, %xmm1
877 ; SSE2-NEXT: movdqa %xmm5, %xmm4
878 ; SSE2-NEXT: pxor %xmm8, %xmm4
879 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm1
880 ; SSE2-NEXT: por %xmm5, %xmm1
881 ; SSE2-NEXT: paddd %xmm2, %xmm6
882 ; SSE2-NEXT: pxor %xmm8, %xmm2
883 ; SSE2-NEXT: movdqa %xmm6, %xmm4
884 ; SSE2-NEXT: pxor %xmm8, %xmm4
885 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm2
886 ; SSE2-NEXT: por %xmm6, %xmm2
887 ; SSE2-NEXT: paddd %xmm3, %xmm7
888 ; SSE2-NEXT: pxor %xmm8, %xmm3
889 ; SSE2-NEXT: pxor %xmm7, %xmm8
890 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm3
891 ; SSE2-NEXT: por %xmm7, %xmm3
894 ; SSSE3-LABEL: v16i32:
896 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
897 ; SSSE3-NEXT: paddd %xmm0, %xmm4
898 ; SSSE3-NEXT: pxor %xmm8, %xmm0
899 ; SSSE3-NEXT: movdqa %xmm4, %xmm9
900 ; SSSE3-NEXT: pxor %xmm8, %xmm9
901 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm0
902 ; SSSE3-NEXT: por %xmm4, %xmm0
903 ; SSSE3-NEXT: paddd %xmm1, %xmm5
904 ; SSSE3-NEXT: pxor %xmm8, %xmm1
905 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
906 ; SSSE3-NEXT: pxor %xmm8, %xmm4
907 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm1
908 ; SSSE3-NEXT: por %xmm5, %xmm1
909 ; SSSE3-NEXT: paddd %xmm2, %xmm6
910 ; SSSE3-NEXT: pxor %xmm8, %xmm2
911 ; SSSE3-NEXT: movdqa %xmm6, %xmm4
912 ; SSSE3-NEXT: pxor %xmm8, %xmm4
913 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm2
914 ; SSSE3-NEXT: por %xmm6, %xmm2
915 ; SSSE3-NEXT: paddd %xmm3, %xmm7
916 ; SSSE3-NEXT: pxor %xmm8, %xmm3
917 ; SSSE3-NEXT: pxor %xmm7, %xmm8
918 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm3
919 ; SSSE3-NEXT: por %xmm7, %xmm3
922 ; SSE41-LABEL: v16i32:
924 ; SSE41-NEXT: pcmpeqd %xmm8, %xmm8
925 ; SSE41-NEXT: movdqa %xmm4, %xmm9
926 ; SSE41-NEXT: pxor %xmm8, %xmm9
927 ; SSE41-NEXT: pminud %xmm9, %xmm0
928 ; SSE41-NEXT: paddd %xmm4, %xmm0
929 ; SSE41-NEXT: movdqa %xmm5, %xmm4
930 ; SSE41-NEXT: pxor %xmm8, %xmm4
931 ; SSE41-NEXT: pminud %xmm4, %xmm1
932 ; SSE41-NEXT: paddd %xmm5, %xmm1
933 ; SSE41-NEXT: movdqa %xmm6, %xmm4
934 ; SSE41-NEXT: pxor %xmm8, %xmm4
935 ; SSE41-NEXT: pminud %xmm4, %xmm2
936 ; SSE41-NEXT: paddd %xmm6, %xmm2
937 ; SSE41-NEXT: pxor %xmm7, %xmm8
938 ; SSE41-NEXT: pminud %xmm8, %xmm3
939 ; SSE41-NEXT: paddd %xmm7, %xmm3
942 ; AVX1-LABEL: v16i32:
944 ; AVX1-NEXT: vxorps %xmm4, %xmm4, %xmm4
945 ; AVX1-NEXT: vcmptrueps %ymm4, %ymm4, %ymm4
946 ; AVX1-NEXT: vxorps %ymm4, %ymm2, %ymm5
947 ; AVX1-NEXT: vextractf128 $1, %ymm5, %xmm6
948 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7
949 ; AVX1-NEXT: vpminud %xmm6, %xmm7, %xmm6
950 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm7
951 ; AVX1-NEXT: vpaddd %xmm7, %xmm6, %xmm6
952 ; AVX1-NEXT: vpminud %xmm5, %xmm0, %xmm0
953 ; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm0
954 ; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm0, %ymm0
955 ; AVX1-NEXT: vxorps %ymm4, %ymm3, %ymm2
956 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
957 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
958 ; AVX1-NEXT: vpminud %xmm4, %xmm5, %xmm4
959 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm5
960 ; AVX1-NEXT: vpaddd %xmm5, %xmm4, %xmm4
961 ; AVX1-NEXT: vpminud %xmm2, %xmm1, %xmm1
962 ; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1
963 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm1, %ymm1
966 ; AVX2-LABEL: v16i32:
968 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4
969 ; AVX2-NEXT: vpxor %ymm4, %ymm2, %ymm5
970 ; AVX2-NEXT: vpminud %ymm5, %ymm0, %ymm0
971 ; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm0
972 ; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm2
973 ; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm1
974 ; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm1
977 ; AVX512-LABEL: v16i32:
979 ; AVX512-NEXT: vmovdqa64 %zmm1, %zmm2
980 ; AVX512-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm2
981 ; AVX512-NEXT: vpminud %zmm2, %zmm0, %zmm0
982 ; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0
984 %z = call <16 x i32> @llvm.uadd.sat.v16i32(<16 x i32> %x, <16 x i32> %y)
988 define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {
991 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
992 ; SSE2-NEXT: paddq %xmm0, %xmm1
993 ; SSE2-NEXT: pxor %xmm2, %xmm0
994 ; SSE2-NEXT: pxor %xmm1, %xmm2
995 ; SSE2-NEXT: movdqa %xmm0, %xmm3
996 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
997 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
998 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm2
999 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1000 ; SSE2-NEXT: pand %xmm4, %xmm2
1001 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
1002 ; SSE2-NEXT: por %xmm1, %xmm0
1003 ; SSE2-NEXT: por %xmm2, %xmm0
1006 ; SSSE3-LABEL: v2i64:
1008 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
1009 ; SSSE3-NEXT: paddq %xmm0, %xmm1
1010 ; SSSE3-NEXT: pxor %xmm2, %xmm0
1011 ; SSSE3-NEXT: pxor %xmm1, %xmm2
1012 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
1013 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
1014 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
1015 ; SSSE3-NEXT: pcmpeqd %xmm0, %xmm2
1016 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1017 ; SSSE3-NEXT: pand %xmm4, %xmm2
1018 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
1019 ; SSSE3-NEXT: por %xmm1, %xmm0
1020 ; SSSE3-NEXT: por %xmm2, %xmm0
1023 ; SSE41-LABEL: v2i64:
1025 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
1026 ; SSE41-NEXT: paddq %xmm0, %xmm1
1027 ; SSE41-NEXT: movdqa %xmm0, %xmm3
1028 ; SSE41-NEXT: pxor %xmm2, %xmm3
1029 ; SSE41-NEXT: pxor %xmm1, %xmm2
1030 ; SSE41-NEXT: movdqa %xmm3, %xmm0
1031 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm0
1032 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1033 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm2
1034 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1035 ; SSE41-NEXT: pand %xmm4, %xmm2
1036 ; SSE41-NEXT: por %xmm2, %xmm0
1037 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm2
1038 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
1039 ; SSE41-NEXT: movapd %xmm1, %xmm0
1042 ; AVX1-LABEL: v2i64:
1044 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1045 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm3
1046 ; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0
1047 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm1
1048 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1
1049 ; AVX1-NEXT: vpor %xmm0, %xmm1, %xmm0
1052 ; AVX2-LABEL: v2i64:
1054 ; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
1055 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm3
1056 ; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0
1057 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm1
1058 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1
1059 ; AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0
1062 ; AVX512-LABEL: v2i64:
1064 ; AVX512-NEXT: vmovdqa %xmm1, %xmm2
1065 ; AVX512-NEXT: vpternlogq $15, %xmm1, %xmm1, %xmm2
1066 ; AVX512-NEXT: vpminuq %xmm2, %xmm0, %xmm0
1067 ; AVX512-NEXT: vpaddq %xmm1, %xmm0, %xmm0
1069 %z = call <2 x i64> @llvm.uadd.sat.v2i64(<2 x i64> %x, <2 x i64> %y)
1073 define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
1074 ; SSE2-LABEL: v4i64:
1076 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
1077 ; SSE2-NEXT: paddq %xmm0, %xmm2
1078 ; SSE2-NEXT: pxor %xmm4, %xmm0
1079 ; SSE2-NEXT: movdqa %xmm2, %xmm5
1080 ; SSE2-NEXT: pxor %xmm4, %xmm5
1081 ; SSE2-NEXT: movdqa %xmm0, %xmm6
1082 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm6
1083 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1084 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm5
1085 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1086 ; SSE2-NEXT: pand %xmm7, %xmm5
1087 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
1088 ; SSE2-NEXT: por %xmm2, %xmm0
1089 ; SSE2-NEXT: por %xmm5, %xmm0
1090 ; SSE2-NEXT: paddq %xmm1, %xmm3
1091 ; SSE2-NEXT: pxor %xmm4, %xmm1
1092 ; SSE2-NEXT: pxor %xmm3, %xmm4
1093 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1094 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm2
1095 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
1096 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm4
1097 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1098 ; SSE2-NEXT: pand %xmm5, %xmm4
1099 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1100 ; SSE2-NEXT: por %xmm3, %xmm1
1101 ; SSE2-NEXT: por %xmm4, %xmm1
1104 ; SSSE3-LABEL: v4i64:
1106 ; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
1107 ; SSSE3-NEXT: paddq %xmm0, %xmm2
1108 ; SSSE3-NEXT: pxor %xmm4, %xmm0
1109 ; SSSE3-NEXT: movdqa %xmm2, %xmm5
1110 ; SSSE3-NEXT: pxor %xmm4, %xmm5
1111 ; SSSE3-NEXT: movdqa %xmm0, %xmm6
1112 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm6
1113 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1114 ; SSSE3-NEXT: pcmpeqd %xmm0, %xmm5
1115 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1116 ; SSSE3-NEXT: pand %xmm7, %xmm5
1117 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
1118 ; SSSE3-NEXT: por %xmm2, %xmm0
1119 ; SSSE3-NEXT: por %xmm5, %xmm0
1120 ; SSSE3-NEXT: paddq %xmm1, %xmm3
1121 ; SSSE3-NEXT: pxor %xmm4, %xmm1
1122 ; SSSE3-NEXT: pxor %xmm3, %xmm4
1123 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
1124 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm2
1125 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
1126 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm4
1127 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1128 ; SSSE3-NEXT: pand %xmm5, %xmm4
1129 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
1130 ; SSSE3-NEXT: por %xmm3, %xmm1
1131 ; SSSE3-NEXT: por %xmm4, %xmm1
1134 ; SSE41-LABEL: v4i64:
1136 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
1137 ; SSE41-NEXT: paddq %xmm0, %xmm2
1138 ; SSE41-NEXT: movdqa %xmm0, %xmm5
1139 ; SSE41-NEXT: pxor %xmm4, %xmm5
1140 ; SSE41-NEXT: movdqa %xmm2, %xmm6
1141 ; SSE41-NEXT: pxor %xmm4, %xmm6
1142 ; SSE41-NEXT: movdqa %xmm5, %xmm0
1143 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm0
1144 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm0[0,0,2,2]
1145 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm6
1146 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
1147 ; SSE41-NEXT: pand %xmm7, %xmm5
1148 ; SSE41-NEXT: por %xmm5, %xmm0
1149 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm5
1150 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm2
1151 ; SSE41-NEXT: paddq %xmm1, %xmm3
1152 ; SSE41-NEXT: pxor %xmm4, %xmm1
1153 ; SSE41-NEXT: pxor %xmm3, %xmm4
1154 ; SSE41-NEXT: movdqa %xmm1, %xmm6
1155 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm6
1156 ; SSE41-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
1157 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm4
1158 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1159 ; SSE41-NEXT: pand %xmm7, %xmm0
1160 ; SSE41-NEXT: por %xmm6, %xmm0
1161 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm3
1162 ; SSE41-NEXT: movapd %xmm2, %xmm0
1163 ; SSE41-NEXT: movapd %xmm3, %xmm1
1166 ; AVX1-LABEL: v4i64:
1168 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
1169 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1170 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm4
1171 ; AVX1-NEXT: vxorps %xmm5, %xmm5, %xmm5
1172 ; AVX1-NEXT: vcmptrueps %ymm5, %ymm5, %ymm5
1173 ; AVX1-NEXT: vxorps %ymm5, %ymm1, %ymm5
1174 ; AVX1-NEXT: vextractf128 $1, %ymm5, %xmm6
1175 ; AVX1-NEXT: vpxor %xmm3, %xmm6, %xmm7
1176 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm7, %xmm4
1177 ; AVX1-NEXT: vblendvpd %xmm4, %xmm2, %xmm6, %xmm2
1178 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
1179 ; AVX1-NEXT: vpaddq %xmm4, %xmm2, %xmm2
1180 ; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm4
1181 ; AVX1-NEXT: vxorps %xmm3, %xmm5, %xmm3
1182 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm3
1183 ; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm5, %xmm0
1184 ; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0
1185 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1188 ; AVX2-LABEL: v4i64:
1190 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1191 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm2
1192 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
1193 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm3
1194 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm3, %ymm2
1195 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
1196 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm3
1197 ; AVX2-NEXT: vblendvpd %ymm2, %ymm0, %ymm3, %ymm0
1198 ; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0
1201 ; AVX512-LABEL: v4i64:
1203 ; AVX512-NEXT: vmovdqa %ymm1, %ymm2
1204 ; AVX512-NEXT: vpternlogq $15, %ymm1, %ymm1, %ymm2
1205 ; AVX512-NEXT: vpminuq %ymm2, %ymm0, %ymm0
1206 ; AVX512-NEXT: vpaddq %ymm1, %ymm0, %ymm0
1208 %z = call <4 x i64> @llvm.uadd.sat.v4i64(<4 x i64> %x, <4 x i64> %y)
1212 define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind {
1213 ; SSE2-LABEL: v8i64:
1215 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
1216 ; SSE2-NEXT: paddq %xmm0, %xmm4
1217 ; SSE2-NEXT: pxor %xmm8, %xmm0
1218 ; SSE2-NEXT: movdqa %xmm4, %xmm9
1219 ; SSE2-NEXT: pxor %xmm8, %xmm9
1220 ; SSE2-NEXT: movdqa %xmm0, %xmm10
1221 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm10
1222 ; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1223 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm9
1224 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
1225 ; SSE2-NEXT: pand %xmm11, %xmm9
1226 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]
1227 ; SSE2-NEXT: por %xmm4, %xmm0
1228 ; SSE2-NEXT: por %xmm9, %xmm0
1229 ; SSE2-NEXT: paddq %xmm1, %xmm5
1230 ; SSE2-NEXT: pxor %xmm8, %xmm1
1231 ; SSE2-NEXT: movdqa %xmm5, %xmm4
1232 ; SSE2-NEXT: pxor %xmm8, %xmm4
1233 ; SSE2-NEXT: movdqa %xmm1, %xmm9
1234 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm9
1235 ; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
1236 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm4
1237 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1238 ; SSE2-NEXT: pand %xmm10, %xmm4
1239 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm9[1,1,3,3]
1240 ; SSE2-NEXT: por %xmm5, %xmm1
1241 ; SSE2-NEXT: por %xmm4, %xmm1
1242 ; SSE2-NEXT: paddq %xmm2, %xmm6
1243 ; SSE2-NEXT: pxor %xmm8, %xmm2
1244 ; SSE2-NEXT: movdqa %xmm6, %xmm4
1245 ; SSE2-NEXT: pxor %xmm8, %xmm4
1246 ; SSE2-NEXT: movdqa %xmm2, %xmm5
1247 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm5
1248 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
1249 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm4
1250 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1251 ; SSE2-NEXT: pand %xmm9, %xmm4
1252 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
1253 ; SSE2-NEXT: por %xmm6, %xmm2
1254 ; SSE2-NEXT: por %xmm4, %xmm2
1255 ; SSE2-NEXT: paddq %xmm3, %xmm7
1256 ; SSE2-NEXT: pxor %xmm8, %xmm3
1257 ; SSE2-NEXT: pxor %xmm7, %xmm8
1258 ; SSE2-NEXT: movdqa %xmm3, %xmm4
1259 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm4
1260 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1261 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm8
1262 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm8[1,1,3,3]
1263 ; SSE2-NEXT: pand %xmm5, %xmm6
1264 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1265 ; SSE2-NEXT: por %xmm7, %xmm3
1266 ; SSE2-NEXT: por %xmm6, %xmm3
1269 ; SSSE3-LABEL: v8i64:
1271 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
1272 ; SSSE3-NEXT: paddq %xmm0, %xmm4
1273 ; SSSE3-NEXT: pxor %xmm8, %xmm0
1274 ; SSSE3-NEXT: movdqa %xmm4, %xmm9
1275 ; SSSE3-NEXT: pxor %xmm8, %xmm9
1276 ; SSSE3-NEXT: movdqa %xmm0, %xmm10
1277 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm10
1278 ; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1279 ; SSSE3-NEXT: pcmpeqd %xmm0, %xmm9
1280 ; SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
1281 ; SSSE3-NEXT: pand %xmm11, %xmm9
1282 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]
1283 ; SSSE3-NEXT: por %xmm4, %xmm0
1284 ; SSSE3-NEXT: por %xmm9, %xmm0
1285 ; SSSE3-NEXT: paddq %xmm1, %xmm5
1286 ; SSSE3-NEXT: pxor %xmm8, %xmm1
1287 ; SSSE3-NEXT: movdqa %xmm5, %xmm4
1288 ; SSSE3-NEXT: pxor %xmm8, %xmm4
1289 ; SSSE3-NEXT: movdqa %xmm1, %xmm9
1290 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm9
1291 ; SSSE3-NEXT: pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
1292 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm4
1293 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1294 ; SSSE3-NEXT: pand %xmm10, %xmm4
1295 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm9[1,1,3,3]
1296 ; SSSE3-NEXT: por %xmm5, %xmm1
1297 ; SSSE3-NEXT: por %xmm4, %xmm1
1298 ; SSSE3-NEXT: paddq %xmm2, %xmm6
1299 ; SSSE3-NEXT: pxor %xmm8, %xmm2
1300 ; SSSE3-NEXT: movdqa %xmm6, %xmm4
1301 ; SSSE3-NEXT: pxor %xmm8, %xmm4
1302 ; SSSE3-NEXT: movdqa %xmm2, %xmm5
1303 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm5
1304 ; SSSE3-NEXT: pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
1305 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm4
1306 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1307 ; SSSE3-NEXT: pand %xmm9, %xmm4
1308 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm5[1,1,3,3]
1309 ; SSSE3-NEXT: por %xmm6, %xmm2
1310 ; SSSE3-NEXT: por %xmm4, %xmm2
1311 ; SSSE3-NEXT: paddq %xmm3, %xmm7
1312 ; SSSE3-NEXT: pxor %xmm8, %xmm3
1313 ; SSSE3-NEXT: pxor %xmm7, %xmm8
1314 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
1315 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm4
1316 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1317 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm8
1318 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm8[1,1,3,3]
1319 ; SSSE3-NEXT: pand %xmm5, %xmm6
1320 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1321 ; SSSE3-NEXT: por %xmm7, %xmm3
1322 ; SSSE3-NEXT: por %xmm6, %xmm3
1325 ; SSE41-LABEL: v8i64:
1327 ; SSE41-NEXT: movdqa %xmm7, %xmm8
1328 ; SSE41-NEXT: movdqa %xmm6, %xmm10
1329 ; SSE41-NEXT: movdqa %xmm5, %xmm11
1330 ; SSE41-NEXT: movdqa %xmm4, %xmm12
1331 ; SSE41-NEXT: movdqa {{.*#+}} xmm7 = [9223372039002259456,9223372039002259456]
1332 ; SSE41-NEXT: paddq %xmm0, %xmm12
1333 ; SSE41-NEXT: movdqa %xmm0, %xmm6
1334 ; SSE41-NEXT: pxor %xmm7, %xmm6
1335 ; SSE41-NEXT: movdqa %xmm12, %xmm4
1336 ; SSE41-NEXT: pxor %xmm7, %xmm4
1337 ; SSE41-NEXT: movdqa %xmm6, %xmm0
1338 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm0
1339 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2]
1340 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm4
1341 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1342 ; SSE41-NEXT: pand %xmm5, %xmm4
1343 ; SSE41-NEXT: por %xmm4, %xmm0
1344 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm9
1345 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm12
1346 ; SSE41-NEXT: paddq %xmm1, %xmm11
1347 ; SSE41-NEXT: pxor %xmm7, %xmm1
1348 ; SSE41-NEXT: movdqa %xmm11, %xmm0
1349 ; SSE41-NEXT: pxor %xmm7, %xmm0
1350 ; SSE41-NEXT: movdqa %xmm1, %xmm4
1351 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
1352 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1353 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm0
1354 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1355 ; SSE41-NEXT: pand %xmm5, %xmm0
1356 ; SSE41-NEXT: por %xmm4, %xmm0
1357 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm11
1358 ; SSE41-NEXT: paddq %xmm2, %xmm10
1359 ; SSE41-NEXT: pxor %xmm7, %xmm2
1360 ; SSE41-NEXT: movdqa %xmm10, %xmm0
1361 ; SSE41-NEXT: pxor %xmm7, %xmm0
1362 ; SSE41-NEXT: movdqa %xmm2, %xmm1
1363 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm1
1364 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
1365 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm0
1366 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1367 ; SSE41-NEXT: pand %xmm4, %xmm0
1368 ; SSE41-NEXT: por %xmm1, %xmm0
1369 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm10
1370 ; SSE41-NEXT: paddq %xmm3, %xmm8
1371 ; SSE41-NEXT: pxor %xmm7, %xmm3
1372 ; SSE41-NEXT: pxor %xmm8, %xmm7
1373 ; SSE41-NEXT: movdqa %xmm3, %xmm1
1374 ; SSE41-NEXT: pcmpgtd %xmm7, %xmm1
1375 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
1376 ; SSE41-NEXT: pcmpeqd %xmm3, %xmm7
1377 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
1378 ; SSE41-NEXT: pand %xmm2, %xmm0
1379 ; SSE41-NEXT: por %xmm1, %xmm0
1380 ; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm8
1381 ; SSE41-NEXT: movapd %xmm12, %xmm0
1382 ; SSE41-NEXT: movapd %xmm11, %xmm1
1383 ; SSE41-NEXT: movapd %xmm10, %xmm2
1384 ; SSE41-NEXT: movapd %xmm8, %xmm3
1387 ; AVX1-LABEL: v8i64:
1389 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
1390 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
1391 ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm9
1392 ; AVX1-NEXT: vxorps %xmm7, %xmm7, %xmm7
1393 ; AVX1-NEXT: vcmptrueps %ymm7, %ymm7, %ymm10
1394 ; AVX1-NEXT: vxorps %ymm10, %ymm2, %ymm8
1395 ; AVX1-NEXT: vextractf128 $1, %ymm8, %xmm6
1396 ; AVX1-NEXT: vpxor %xmm4, %xmm6, %xmm7
1397 ; AVX1-NEXT: vpcmpgtq %xmm9, %xmm7, %xmm7
1398 ; AVX1-NEXT: vblendvpd %xmm7, %xmm5, %xmm6, %xmm5
1399 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm6
1400 ; AVX1-NEXT: vpaddq %xmm6, %xmm5, %xmm5
1401 ; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm6
1402 ; AVX1-NEXT: vxorps %xmm4, %xmm8, %xmm7
1403 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm7, %xmm6
1404 ; AVX1-NEXT: vblendvpd %xmm6, %xmm0, %xmm8, %xmm0
1405 ; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm0
1406 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm0, %ymm0
1407 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1408 ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm8
1409 ; AVX1-NEXT: vxorps %ymm10, %ymm3, %ymm6
1410 ; AVX1-NEXT: vextractf128 $1, %ymm6, %xmm7
1411 ; AVX1-NEXT: vpxor %xmm4, %xmm7, %xmm5
1412 ; AVX1-NEXT: vpcmpgtq %xmm8, %xmm5, %xmm5
1413 ; AVX1-NEXT: vblendvpd %xmm5, %xmm2, %xmm7, %xmm2
1414 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm5
1415 ; AVX1-NEXT: vpaddq %xmm5, %xmm2, %xmm2
1416 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm5
1417 ; AVX1-NEXT: vxorps %xmm4, %xmm6, %xmm4
1418 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm4, %xmm4
1419 ; AVX1-NEXT: vblendvpd %xmm4, %xmm1, %xmm6, %xmm1
1420 ; AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm1
1421 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
1424 ; AVX2-LABEL: v8i64:
1426 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1427 ; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm5
1428 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm6 = [9223372036854775807,9223372036854775807,9223372036854775807,9223372036854775807]
1429 ; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm7
1430 ; AVX2-NEXT: vpcmpgtq %ymm5, %ymm7, %ymm5
1431 ; AVX2-NEXT: vpcmpeqd %ymm7, %ymm7, %ymm7
1432 ; AVX2-NEXT: vpxor %ymm7, %ymm2, %ymm8
1433 ; AVX2-NEXT: vblendvpd %ymm5, %ymm0, %ymm8, %ymm0
1434 ; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0
1435 ; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm2
1436 ; AVX2-NEXT: vpxor %ymm6, %ymm3, %ymm4
1437 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm4, %ymm2
1438 ; AVX2-NEXT: vpxor %ymm7, %ymm3, %ymm4
1439 ; AVX2-NEXT: vblendvpd %ymm2, %ymm1, %ymm4, %ymm1
1440 ; AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm1
1443 ; AVX512-LABEL: v8i64:
1445 ; AVX512-NEXT: vmovdqa64 %zmm1, %zmm2
1446 ; AVX512-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm2
1447 ; AVX512-NEXT: vpminuq %zmm2, %zmm0, %zmm0
1448 ; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm0
1450 %z = call <8 x i64> @llvm.uadd.sat.v8i64(<8 x i64> %x, <8 x i64> %y)
1454 define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind {
1455 ; SSE-LABEL: v2i128:
1457 ; SSE-NEXT: movq %rdi, %rax
1458 ; SSE-NEXT: addq %r9, %rsi
1459 ; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %rdx
1460 ; SSE-NEXT: movq $-1, %rdi
1461 ; SSE-NEXT: cmovbq %rdi, %rsi
1462 ; SSE-NEXT: cmovbq %rdi, %rdx
1463 ; SSE-NEXT: addq {{[0-9]+}}(%rsp), %rcx
1464 ; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %r8
1465 ; SSE-NEXT: cmovbq %rdi, %r8
1466 ; SSE-NEXT: cmovbq %rdi, %rcx
1467 ; SSE-NEXT: movq %r8, 24(%rax)
1468 ; SSE-NEXT: movq %rcx, 16(%rax)
1469 ; SSE-NEXT: movq %rdx, 8(%rax)
1470 ; SSE-NEXT: movq %rsi, (%rax)
1473 ; AVX-LABEL: v2i128:
1475 ; AVX-NEXT: movq %rdi, %rax
1476 ; AVX-NEXT: addq %r9, %rsi
1477 ; AVX-NEXT: adcq {{[0-9]+}}(%rsp), %rdx
1478 ; AVX-NEXT: movq $-1, %rdi
1479 ; AVX-NEXT: cmovbq %rdi, %rsi
1480 ; AVX-NEXT: cmovbq %rdi, %rdx
1481 ; AVX-NEXT: addq {{[0-9]+}}(%rsp), %rcx
1482 ; AVX-NEXT: adcq {{[0-9]+}}(%rsp), %r8
1483 ; AVX-NEXT: cmovbq %rdi, %r8
1484 ; AVX-NEXT: cmovbq %rdi, %rcx
1485 ; AVX-NEXT: movq %r8, 24(%rax)
1486 ; AVX-NEXT: movq %rcx, 16(%rax)
1487 ; AVX-NEXT: movq %rdx, 8(%rax)
1488 ; AVX-NEXT: movq %rsi, (%rax)
1490 %z = call <2 x i128> @llvm.uadd.sat.v2i128(<2 x i128> %x, <2 x i128> %y)