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=+avx512f,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
12 declare <1 x i8> @llvm.uadd.sat.v1i8(<1 x i8>, <1 x i8>)
13 declare <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8>, <2 x i8>)
14 declare <4 x i8> @llvm.uadd.sat.v4i8(<4 x i8>, <4 x i8>)
15 declare <8 x i8> @llvm.uadd.sat.v8i8(<8 x i8>, <8 x i8>)
16 declare <12 x i8> @llvm.uadd.sat.v12i8(<12 x i8>, <12 x i8>)
17 declare <16 x i8> @llvm.uadd.sat.v16i8(<16 x i8>, <16 x i8>)
18 declare <32 x i8> @llvm.uadd.sat.v32i8(<32 x i8>, <32 x i8>)
19 declare <64 x i8> @llvm.uadd.sat.v64i8(<64 x i8>, <64 x i8>)
21 declare <1 x i16> @llvm.uadd.sat.v1i16(<1 x i16>, <1 x i16>)
22 declare <2 x i16> @llvm.uadd.sat.v2i16(<2 x i16>, <2 x i16>)
23 declare <4 x i16> @llvm.uadd.sat.v4i16(<4 x i16>, <4 x i16>)
24 declare <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16>, <8 x i16>)
25 declare <12 x i16> @llvm.uadd.sat.v12i16(<12 x i16>, <12 x i16>)
26 declare <16 x i16> @llvm.uadd.sat.v16i16(<16 x i16>, <16 x i16>)
27 declare <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16>, <32 x i16>)
29 declare <16 x i1> @llvm.uadd.sat.v16i1(<16 x i1>, <16 x i1>)
30 declare <16 x i4> @llvm.uadd.sat.v16i4(<16 x i4>, <16 x i4>)
32 declare <2 x i32> @llvm.uadd.sat.v2i32(<2 x i32>, <2 x i32>)
33 declare <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32>, <4 x i32>)
34 declare <8 x i32> @llvm.uadd.sat.v8i32(<8 x i32>, <8 x i32>)
35 declare <16 x i32> @llvm.uadd.sat.v16i32(<16 x i32>, <16 x i32>)
36 declare <2 x i64> @llvm.uadd.sat.v2i64(<2 x i64>, <2 x i64>)
37 declare <4 x i64> @llvm.uadd.sat.v4i64(<4 x i64>, <4 x i64>)
38 declare <8 x i64> @llvm.uadd.sat.v8i64(<8 x i64>, <8 x i64>)
40 declare <4 x i24> @llvm.uadd.sat.v4i24(<4 x i24>, <4 x i24>)
41 declare <2 x i128> @llvm.uadd.sat.v2i128(<2 x i128>, <2 x i128>)
43 ; Legal types, depending on architecture.
45 define <16 x i8> @v16i8(<16 x i8> %x, <16 x i8> %y) nounwind {
48 ; SSE-NEXT: paddusb %xmm1, %xmm0
53 ; AVX-NEXT: vpaddusb %xmm1, %xmm0, %xmm0
55 %z = call <16 x i8> @llvm.uadd.sat.v16i8(<16 x i8> %x, <16 x i8> %y)
59 define <32 x i8> @v32i8(<32 x i8> %x, <32 x i8> %y) nounwind {
62 ; SSE-NEXT: paddusb %xmm2, %xmm0
63 ; SSE-NEXT: paddusb %xmm3, %xmm1
68 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
69 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
70 ; AVX1-NEXT: vpaddusb %xmm2, %xmm3, %xmm2
71 ; AVX1-NEXT: vpaddusb %xmm1, %xmm0, %xmm0
72 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
77 ; AVX2-NEXT: vpaddusb %ymm1, %ymm0, %ymm0
80 ; AVX512-LABEL: v32i8:
82 ; AVX512-NEXT: vpaddusb %ymm1, %ymm0, %ymm0
84 %z = call <32 x i8> @llvm.uadd.sat.v32i8(<32 x i8> %x, <32 x i8> %y)
88 define <64 x i8> @v64i8(<64 x i8> %x, <64 x i8> %y) nounwind {
91 ; SSE-NEXT: paddusb %xmm4, %xmm0
92 ; SSE-NEXT: paddusb %xmm5, %xmm1
93 ; SSE-NEXT: paddusb %xmm6, %xmm2
94 ; SSE-NEXT: paddusb %xmm7, %xmm3
99 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
100 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
101 ; AVX1-NEXT: vpaddusb %xmm4, %xmm5, %xmm4
102 ; AVX1-NEXT: vpaddusb %xmm2, %xmm0, %xmm0
103 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
104 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2
105 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
106 ; AVX1-NEXT: vpaddusb %xmm2, %xmm4, %xmm2
107 ; AVX1-NEXT: vpaddusb %xmm3, %xmm1, %xmm1
108 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
113 ; AVX2-NEXT: vpaddusb %ymm2, %ymm0, %ymm0
114 ; AVX2-NEXT: vpaddusb %ymm3, %ymm1, %ymm1
117 ; AVX512F-LABEL: v64i8:
119 ; AVX512F-NEXT: vextracti64x4 $1, %zmm1, %ymm2
120 ; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm3
121 ; AVX512F-NEXT: vpaddusb %ymm2, %ymm3, %ymm2
122 ; AVX512F-NEXT: vpaddusb %ymm1, %ymm0, %ymm0
123 ; AVX512F-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm0
126 ; AVX512BW-LABEL: v64i8:
128 ; AVX512BW-NEXT: vpaddusb %zmm1, %zmm0, %zmm0
129 ; AVX512BW-NEXT: retq
130 %z = call <64 x i8> @llvm.uadd.sat.v64i8(<64 x i8> %x, <64 x i8> %y)
134 define <8 x i16> @v8i16(<8 x i16> %x, <8 x i16> %y) nounwind {
137 ; SSE-NEXT: paddusw %xmm1, %xmm0
142 ; AVX-NEXT: vpaddusw %xmm1, %xmm0, %xmm0
144 %z = call <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16> %x, <8 x i16> %y)
148 define <16 x i16> @v16i16(<16 x i16> %x, <16 x i16> %y) nounwind {
151 ; SSE-NEXT: paddusw %xmm2, %xmm0
152 ; SSE-NEXT: paddusw %xmm3, %xmm1
155 ; AVX1-LABEL: v16i16:
157 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
158 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
159 ; AVX1-NEXT: vpaddusw %xmm2, %xmm3, %xmm2
160 ; AVX1-NEXT: vpaddusw %xmm1, %xmm0, %xmm0
161 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
164 ; AVX2-LABEL: v16i16:
166 ; AVX2-NEXT: vpaddusw %ymm1, %ymm0, %ymm0
169 ; AVX512-LABEL: v16i16:
171 ; AVX512-NEXT: vpaddusw %ymm1, %ymm0, %ymm0
173 %z = call <16 x i16> @llvm.uadd.sat.v16i16(<16 x i16> %x, <16 x i16> %y)
177 define <32 x i16> @v32i16(<32 x i16> %x, <32 x i16> %y) nounwind {
180 ; SSE-NEXT: paddusw %xmm4, %xmm0
181 ; SSE-NEXT: paddusw %xmm5, %xmm1
182 ; SSE-NEXT: paddusw %xmm6, %xmm2
183 ; SSE-NEXT: paddusw %xmm7, %xmm3
186 ; AVX1-LABEL: v32i16:
188 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
189 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
190 ; AVX1-NEXT: vpaddusw %xmm4, %xmm5, %xmm4
191 ; AVX1-NEXT: vpaddusw %xmm2, %xmm0, %xmm0
192 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
193 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2
194 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
195 ; AVX1-NEXT: vpaddusw %xmm2, %xmm4, %xmm2
196 ; AVX1-NEXT: vpaddusw %xmm3, %xmm1, %xmm1
197 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
200 ; AVX2-LABEL: v32i16:
202 ; AVX2-NEXT: vpaddusw %ymm2, %ymm0, %ymm0
203 ; AVX2-NEXT: vpaddusw %ymm3, %ymm1, %ymm1
206 ; AVX512F-LABEL: v32i16:
208 ; AVX512F-NEXT: vextracti64x4 $1, %zmm1, %ymm2
209 ; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm3
210 ; AVX512F-NEXT: vpaddusw %ymm2, %ymm3, %ymm2
211 ; AVX512F-NEXT: vpaddusw %ymm1, %ymm0, %ymm0
212 ; AVX512F-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm0
215 ; AVX512BW-LABEL: v32i16:
217 ; AVX512BW-NEXT: vpaddusw %zmm1, %zmm0, %zmm0
218 ; AVX512BW-NEXT: retq
219 %z = call <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16> %x, <32 x i16> %y)
223 ; Too narrow vectors, legalized by widening.
225 define void @v8i8(ptr %px, ptr %py, ptr %pz) nounwind {
228 ; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
229 ; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero
230 ; SSE-NEXT: paddusb %xmm0, %xmm1
231 ; SSE-NEXT: movq %xmm1, (%rdx)
236 ; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero
237 ; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
238 ; AVX-NEXT: vpaddusb %xmm1, %xmm0, %xmm0
239 ; AVX-NEXT: vmovq %xmm0, (%rdx)
241 %x = load <8 x i8>, ptr %px
242 %y = load <8 x i8>, ptr %py
243 %z = call <8 x i8> @llvm.uadd.sat.v8i8(<8 x i8> %x, <8 x i8> %y)
244 store <8 x i8> %z, ptr %pz
248 define void @v4i8(ptr %px, ptr %py, ptr %pz) nounwind {
251 ; SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
252 ; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
253 ; SSE-NEXT: paddusb %xmm0, %xmm1
254 ; SSE-NEXT: movd %xmm1, (%rdx)
259 ; AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
260 ; AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
261 ; AVX-NEXT: vpaddusb %xmm1, %xmm0, %xmm0
262 ; AVX-NEXT: vmovd %xmm0, (%rdx)
264 %x = load <4 x i8>, ptr %px
265 %y = load <4 x i8>, ptr %py
266 %z = call <4 x i8> @llvm.uadd.sat.v4i8(<4 x i8> %x, <4 x i8> %y)
267 store <4 x i8> %z, ptr %pz
271 define void @v2i8(ptr %px, ptr %py, ptr %pz) nounwind {
274 ; SSE2-NEXT: movzwl (%rdi), %eax
275 ; SSE2-NEXT: movd %eax, %xmm0
276 ; SSE2-NEXT: movzwl (%rsi), %eax
277 ; SSE2-NEXT: movd %eax, %xmm1
278 ; SSE2-NEXT: paddusb %xmm0, %xmm1
279 ; SSE2-NEXT: movd %xmm1, %eax
280 ; SSE2-NEXT: movw %ax, (%rdx)
285 ; SSSE3-NEXT: movzwl (%rdi), %eax
286 ; SSSE3-NEXT: movd %eax, %xmm0
287 ; SSSE3-NEXT: movzwl (%rsi), %eax
288 ; SSSE3-NEXT: movd %eax, %xmm1
289 ; SSSE3-NEXT: paddusb %xmm0, %xmm1
290 ; SSSE3-NEXT: movd %xmm1, %eax
291 ; SSSE3-NEXT: movw %ax, (%rdx)
296 ; SSE41-NEXT: movzwl (%rdi), %eax
297 ; SSE41-NEXT: movd %eax, %xmm0
298 ; SSE41-NEXT: movzwl (%rsi), %eax
299 ; SSE41-NEXT: movd %eax, %xmm1
300 ; SSE41-NEXT: paddusb %xmm0, %xmm1
301 ; SSE41-NEXT: pextrw $0, %xmm1, (%rdx)
306 ; AVX-NEXT: movzwl (%rdi), %eax
307 ; AVX-NEXT: vmovd %eax, %xmm0
308 ; AVX-NEXT: movzwl (%rsi), %eax
309 ; AVX-NEXT: vmovd %eax, %xmm1
310 ; AVX-NEXT: vpaddusb %xmm1, %xmm0, %xmm0
311 ; AVX-NEXT: vpextrw $0, %xmm0, (%rdx)
313 %x = load <2 x i8>, ptr %px
314 %y = load <2 x i8>, ptr %py
315 %z = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> %x, <2 x i8> %y)
316 store <2 x i8> %z, ptr %pz
320 define void @v4i16(ptr %px, ptr %py, ptr %pz) nounwind {
323 ; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
324 ; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero
325 ; SSE-NEXT: paddusw %xmm0, %xmm1
326 ; SSE-NEXT: movq %xmm1, (%rdx)
331 ; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero
332 ; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
333 ; AVX-NEXT: vpaddusw %xmm1, %xmm0, %xmm0
334 ; AVX-NEXT: vmovq %xmm0, (%rdx)
336 %x = load <4 x i16>, ptr %px
337 %y = load <4 x i16>, ptr %py
338 %z = call <4 x i16> @llvm.uadd.sat.v4i16(<4 x i16> %x, <4 x i16> %y)
339 store <4 x i16> %z, ptr %pz
343 define void @v2i16(ptr %px, ptr %py, ptr %pz) nounwind {
346 ; SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
347 ; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
348 ; SSE-NEXT: paddusw %xmm0, %xmm1
349 ; SSE-NEXT: movd %xmm1, (%rdx)
354 ; AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
355 ; AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
356 ; AVX-NEXT: vpaddusw %xmm1, %xmm0, %xmm0
357 ; AVX-NEXT: vmovd %xmm0, (%rdx)
359 %x = load <2 x i16>, ptr %px
360 %y = load <2 x i16>, ptr %py
361 %z = call <2 x i16> @llvm.uadd.sat.v2i16(<2 x i16> %x, <2 x i16> %y)
362 store <2 x i16> %z, ptr %pz
366 define <12 x i8> @v12i8(<12 x i8> %x, <12 x i8> %y) nounwind {
369 ; SSE-NEXT: paddusb %xmm1, %xmm0
374 ; AVX-NEXT: vpaddusb %xmm1, %xmm0, %xmm0
376 %z = call <12 x i8> @llvm.uadd.sat.v12i8(<12 x i8> %x, <12 x i8> %y)
380 define void @v12i16(ptr %px, ptr %py, ptr %pz) nounwind {
383 ; SSE-NEXT: movdqa (%rdi), %xmm0
384 ; SSE-NEXT: movdqa 16(%rdi), %xmm1
385 ; SSE-NEXT: paddusw 16(%rsi), %xmm1
386 ; SSE-NEXT: paddusw (%rsi), %xmm0
387 ; SSE-NEXT: movdqa %xmm0, (%rdx)
388 ; SSE-NEXT: movq %xmm1, 16(%rdx)
391 ; AVX1-LABEL: v12i16:
393 ; AVX1-NEXT: vmovdqa (%rdi), %xmm0
394 ; AVX1-NEXT: vmovdqa 16(%rdi), %xmm1
395 ; AVX1-NEXT: vpaddusw 16(%rsi), %xmm1, %xmm1
396 ; AVX1-NEXT: vpaddusw (%rsi), %xmm0, %xmm0
397 ; AVX1-NEXT: vmovdqa %xmm0, (%rdx)
398 ; AVX1-NEXT: vmovq %xmm1, 16(%rdx)
401 ; AVX2-LABEL: v12i16:
403 ; AVX2-NEXT: vmovdqa (%rdi), %ymm0
404 ; AVX2-NEXT: vpaddusw (%rsi), %ymm0, %ymm0
405 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
406 ; AVX2-NEXT: vmovq %xmm1, 16(%rdx)
407 ; AVX2-NEXT: vmovdqa %xmm0, (%rdx)
408 ; AVX2-NEXT: vzeroupper
411 ; AVX512-LABEL: v12i16:
413 ; AVX512-NEXT: vmovdqa (%rdi), %ymm0
414 ; AVX512-NEXT: vpaddusw (%rsi), %ymm0, %ymm0
415 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm1
416 ; AVX512-NEXT: vmovq %xmm1, 16(%rdx)
417 ; AVX512-NEXT: vmovdqa %xmm0, (%rdx)
418 ; AVX512-NEXT: vzeroupper
420 %x = load <12 x i16>, ptr %px
421 %y = load <12 x i16>, ptr %py
422 %z = call <12 x i16> @llvm.uadd.sat.v12i16(<12 x i16> %x, <12 x i16> %y)
423 store <12 x i16> %z, ptr %pz
429 define void @v1i8(ptr %px, ptr %py, ptr %pz) nounwind {
432 ; SSE-NEXT: movzbl (%rdi), %eax
433 ; SSE-NEXT: addb (%rsi), %al
434 ; SSE-NEXT: movzbl %al, %eax
435 ; SSE-NEXT: movl $255, %ecx
436 ; SSE-NEXT: cmovael %eax, %ecx
437 ; SSE-NEXT: movb %cl, (%rdx)
442 ; AVX-NEXT: movzbl (%rdi), %eax
443 ; AVX-NEXT: addb (%rsi), %al
444 ; AVX-NEXT: movzbl %al, %eax
445 ; AVX-NEXT: movl $255, %ecx
446 ; AVX-NEXT: cmovael %eax, %ecx
447 ; AVX-NEXT: movb %cl, (%rdx)
449 %x = load <1 x i8>, ptr %px
450 %y = load <1 x i8>, ptr %py
451 %z = call <1 x i8> @llvm.uadd.sat.v1i8(<1 x i8> %x, <1 x i8> %y)
452 store <1 x i8> %z, ptr %pz
456 define void @v1i16(ptr %px, ptr %py, ptr %pz) nounwind {
459 ; SSE-NEXT: movzwl (%rdi), %eax
460 ; SSE-NEXT: addw (%rsi), %ax
461 ; SSE-NEXT: movl $65535, %ecx # imm = 0xFFFF
462 ; SSE-NEXT: cmovael %eax, %ecx
463 ; SSE-NEXT: movw %cx, (%rdx)
468 ; AVX-NEXT: movzwl (%rdi), %eax
469 ; AVX-NEXT: addw (%rsi), %ax
470 ; AVX-NEXT: movl $65535, %ecx # imm = 0xFFFF
471 ; AVX-NEXT: cmovael %eax, %ecx
472 ; AVX-NEXT: movw %cx, (%rdx)
474 %x = load <1 x i16>, ptr %px
475 %y = load <1 x i16>, ptr %py
476 %z = call <1 x i16> @llvm.uadd.sat.v1i16(<1 x i16> %x, <1 x i16> %y)
477 store <1 x i16> %z, ptr %pz
483 define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind {
486 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
487 ; SSE-NEXT: pand %xmm2, %xmm1
488 ; SSE-NEXT: pand %xmm2, %xmm0
489 ; SSE-NEXT: paddb %xmm1, %xmm0
490 ; SSE-NEXT: pminub %xmm2, %xmm0
495 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
496 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
497 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
498 ; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm0
499 ; AVX1-NEXT: vpminub %xmm2, %xmm0, %xmm0
504 ; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
505 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1
506 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
507 ; AVX2-NEXT: vpaddb %xmm1, %xmm0, %xmm0
508 ; AVX2-NEXT: vpminub %xmm2, %xmm0, %xmm0
511 ; AVX512-LABEL: v16i4:
513 ; AVX512-NEXT: vpbroadcastb {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
514 ; AVX512-NEXT: vpand %xmm2, %xmm1, %xmm1
515 ; AVX512-NEXT: vpand %xmm2, %xmm0, %xmm0
516 ; AVX512-NEXT: vpaddb %xmm1, %xmm0, %xmm0
517 ; AVX512-NEXT: vpminub %xmm2, %xmm0, %xmm0
519 %z = call <16 x i4> @llvm.uadd.sat.v16i4(<16 x i4> %x, <16 x i4> %y)
523 define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind {
526 ; SSE-NEXT: orps %xmm1, %xmm0
531 ; AVX-NEXT: vorps %xmm1, %xmm0, %xmm0
533 %z = call <16 x i1> @llvm.uadd.sat.v16i1(<16 x i1> %x, <16 x i1> %y)
539 define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {
542 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
543 ; SSE2-NEXT: movdqa %xmm0, %xmm3
544 ; SSE2-NEXT: pxor %xmm2, %xmm3
545 ; SSE2-NEXT: paddd %xmm1, %xmm0
546 ; SSE2-NEXT: pxor %xmm0, %xmm2
547 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
548 ; SSE2-NEXT: por %xmm3, %xmm0
551 ; SSSE3-LABEL: v2i32:
553 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
554 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
555 ; SSSE3-NEXT: pxor %xmm2, %xmm3
556 ; SSSE3-NEXT: paddd %xmm1, %xmm0
557 ; SSSE3-NEXT: pxor %xmm0, %xmm2
558 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
559 ; SSSE3-NEXT: por %xmm3, %xmm0
562 ; SSE41-LABEL: v2i32:
564 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm2
565 ; SSE41-NEXT: pxor %xmm1, %xmm2
566 ; SSE41-NEXT: pminud %xmm2, %xmm0
567 ; SSE41-NEXT: paddd %xmm1, %xmm0
572 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
573 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm2
574 ; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0
575 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
580 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
581 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm2
582 ; AVX2-NEXT: vpminud %xmm2, %xmm0, %xmm0
583 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0
586 ; AVX512F-LABEL: v2i32:
588 ; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
589 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm2
590 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm2
591 ; AVX512F-NEXT: vpminud %xmm2, %xmm0, %xmm0
592 ; AVX512F-NEXT: vpaddd %xmm1, %xmm0, %xmm0
593 ; AVX512F-NEXT: vzeroupper
596 ; AVX512BW-LABEL: v2i32:
598 ; AVX512BW-NEXT: vmovdqa %xmm1, %xmm2
599 ; AVX512BW-NEXT: vpternlogq $15, %xmm1, %xmm1, %xmm2
600 ; AVX512BW-NEXT: vpminud %xmm2, %xmm0, %xmm0
601 ; AVX512BW-NEXT: vpaddd %xmm1, %xmm0, %xmm0
602 ; AVX512BW-NEXT: retq
603 %z = call <2 x i32> @llvm.uadd.sat.v2i32(<2 x i32> %x, <2 x i32> %y)
607 define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
610 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
611 ; SSE2-NEXT: movdqa %xmm0, %xmm3
612 ; SSE2-NEXT: pxor %xmm2, %xmm3
613 ; SSE2-NEXT: paddd %xmm1, %xmm0
614 ; SSE2-NEXT: pxor %xmm0, %xmm2
615 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm3
616 ; SSE2-NEXT: por %xmm3, %xmm0
619 ; SSSE3-LABEL: v4i32:
621 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
622 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
623 ; SSSE3-NEXT: pxor %xmm2, %xmm3
624 ; SSSE3-NEXT: paddd %xmm1, %xmm0
625 ; SSSE3-NEXT: pxor %xmm0, %xmm2
626 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm3
627 ; SSSE3-NEXT: por %xmm3, %xmm0
630 ; SSE41-LABEL: v4i32:
632 ; SSE41-NEXT: pcmpeqd %xmm2, %xmm2
633 ; SSE41-NEXT: pxor %xmm1, %xmm2
634 ; SSE41-NEXT: pminud %xmm2, %xmm0
635 ; SSE41-NEXT: paddd %xmm1, %xmm0
640 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
641 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm2
642 ; AVX1-NEXT: vpminud %xmm2, %xmm0, %xmm0
643 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
648 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
649 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm2
650 ; AVX2-NEXT: vpminud %xmm2, %xmm0, %xmm0
651 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0
654 ; AVX512F-LABEL: v4i32:
656 ; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
657 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm2
658 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm2
659 ; AVX512F-NEXT: vpminud %xmm2, %xmm0, %xmm0
660 ; AVX512F-NEXT: vpaddd %xmm1, %xmm0, %xmm0
661 ; AVX512F-NEXT: vzeroupper
664 ; AVX512BW-LABEL: v4i32:
666 ; AVX512BW-NEXT: vmovdqa %xmm1, %xmm2
667 ; AVX512BW-NEXT: vpternlogq $15, %xmm1, %xmm1, %xmm2
668 ; AVX512BW-NEXT: vpminud %xmm2, %xmm0, %xmm0
669 ; AVX512BW-NEXT: vpaddd %xmm1, %xmm0, %xmm0
670 ; AVX512BW-NEXT: retq
671 %z = call <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32> %x, <4 x i32> %y)
675 define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
678 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
679 ; SSE2-NEXT: movdqa %xmm0, %xmm5
680 ; SSE2-NEXT: pxor %xmm4, %xmm5
681 ; SSE2-NEXT: paddd %xmm2, %xmm0
682 ; SSE2-NEXT: movdqa %xmm0, %xmm2
683 ; SSE2-NEXT: pxor %xmm4, %xmm2
684 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm5
685 ; SSE2-NEXT: por %xmm5, %xmm0
686 ; SSE2-NEXT: movdqa %xmm1, %xmm2
687 ; SSE2-NEXT: pxor %xmm4, %xmm2
688 ; SSE2-NEXT: paddd %xmm3, %xmm1
689 ; SSE2-NEXT: pxor %xmm1, %xmm4
690 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm2
691 ; SSE2-NEXT: por %xmm2, %xmm1
694 ; SSSE3-LABEL: v8i32:
696 ; SSSE3-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
697 ; SSSE3-NEXT: movdqa %xmm0, %xmm5
698 ; SSSE3-NEXT: pxor %xmm4, %xmm5
699 ; SSSE3-NEXT: paddd %xmm2, %xmm0
700 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
701 ; SSSE3-NEXT: pxor %xmm4, %xmm2
702 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm5
703 ; SSSE3-NEXT: por %xmm5, %xmm0
704 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
705 ; SSSE3-NEXT: pxor %xmm4, %xmm2
706 ; SSSE3-NEXT: paddd %xmm3, %xmm1
707 ; SSSE3-NEXT: pxor %xmm1, %xmm4
708 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm2
709 ; SSSE3-NEXT: por %xmm2, %xmm1
712 ; SSE41-LABEL: v8i32:
714 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm4
715 ; SSE41-NEXT: movdqa %xmm2, %xmm5
716 ; SSE41-NEXT: pxor %xmm4, %xmm5
717 ; SSE41-NEXT: pminud %xmm5, %xmm0
718 ; SSE41-NEXT: paddd %xmm2, %xmm0
719 ; SSE41-NEXT: pxor %xmm3, %xmm4
720 ; SSE41-NEXT: pminud %xmm4, %xmm1
721 ; SSE41-NEXT: paddd %xmm3, %xmm1
726 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
727 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3
728 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm4
729 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
730 ; AVX1-NEXT: vpminud %xmm4, %xmm5, %xmm4
731 ; AVX1-NEXT: vpaddd %xmm2, %xmm4, %xmm2
732 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm3
733 ; AVX1-NEXT: vpminud %xmm3, %xmm0, %xmm0
734 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
735 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
740 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2
741 ; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm2
742 ; AVX2-NEXT: vpminud %ymm2, %ymm0, %ymm0
743 ; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0
746 ; AVX512F-LABEL: v8i32:
748 ; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
749 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm2
750 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm2
751 ; AVX512F-NEXT: vpminud %ymm2, %ymm0, %ymm0
752 ; AVX512F-NEXT: vpaddd %ymm1, %ymm0, %ymm0
755 ; AVX512BW-LABEL: v8i32:
757 ; AVX512BW-NEXT: vmovdqa %ymm1, %ymm2
758 ; AVX512BW-NEXT: vpternlogq $15, %ymm1, %ymm1, %ymm2
759 ; AVX512BW-NEXT: vpminud %ymm2, %ymm0, %ymm0
760 ; AVX512BW-NEXT: vpaddd %ymm1, %ymm0, %ymm0
761 ; AVX512BW-NEXT: retq
762 %z = call <8 x i32> @llvm.uadd.sat.v8i32(<8 x i32> %x, <8 x i32> %y)
766 define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind {
767 ; SSE2-LABEL: v16i32:
769 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
770 ; SSE2-NEXT: movdqa %xmm0, %xmm9
771 ; SSE2-NEXT: pxor %xmm8, %xmm9
772 ; SSE2-NEXT: paddd %xmm4, %xmm0
773 ; SSE2-NEXT: movdqa %xmm0, %xmm4
774 ; SSE2-NEXT: pxor %xmm8, %xmm4
775 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm9
776 ; SSE2-NEXT: por %xmm9, %xmm0
777 ; SSE2-NEXT: movdqa %xmm1, %xmm4
778 ; SSE2-NEXT: pxor %xmm8, %xmm4
779 ; SSE2-NEXT: paddd %xmm5, %xmm1
780 ; SSE2-NEXT: movdqa %xmm1, %xmm5
781 ; SSE2-NEXT: pxor %xmm8, %xmm5
782 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm4
783 ; SSE2-NEXT: por %xmm4, %xmm1
784 ; SSE2-NEXT: movdqa %xmm2, %xmm4
785 ; SSE2-NEXT: pxor %xmm8, %xmm4
786 ; SSE2-NEXT: paddd %xmm6, %xmm2
787 ; SSE2-NEXT: movdqa %xmm2, %xmm5
788 ; SSE2-NEXT: pxor %xmm8, %xmm5
789 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm4
790 ; SSE2-NEXT: por %xmm4, %xmm2
791 ; SSE2-NEXT: movdqa %xmm3, %xmm4
792 ; SSE2-NEXT: pxor %xmm8, %xmm4
793 ; SSE2-NEXT: paddd %xmm7, %xmm3
794 ; SSE2-NEXT: pxor %xmm3, %xmm8
795 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm4
796 ; SSE2-NEXT: por %xmm4, %xmm3
799 ; SSSE3-LABEL: v16i32:
801 ; SSSE3-NEXT: movdqa {{.*#+}} xmm8 = [2147483648,2147483648,2147483648,2147483648]
802 ; SSSE3-NEXT: movdqa %xmm0, %xmm9
803 ; SSSE3-NEXT: pxor %xmm8, %xmm9
804 ; SSSE3-NEXT: paddd %xmm4, %xmm0
805 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
806 ; SSSE3-NEXT: pxor %xmm8, %xmm4
807 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm9
808 ; SSSE3-NEXT: por %xmm9, %xmm0
809 ; SSSE3-NEXT: movdqa %xmm1, %xmm4
810 ; SSSE3-NEXT: pxor %xmm8, %xmm4
811 ; SSSE3-NEXT: paddd %xmm5, %xmm1
812 ; SSSE3-NEXT: movdqa %xmm1, %xmm5
813 ; SSSE3-NEXT: pxor %xmm8, %xmm5
814 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm4
815 ; SSSE3-NEXT: por %xmm4, %xmm1
816 ; SSSE3-NEXT: movdqa %xmm2, %xmm4
817 ; SSSE3-NEXT: pxor %xmm8, %xmm4
818 ; SSSE3-NEXT: paddd %xmm6, %xmm2
819 ; SSSE3-NEXT: movdqa %xmm2, %xmm5
820 ; SSSE3-NEXT: pxor %xmm8, %xmm5
821 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm4
822 ; SSSE3-NEXT: por %xmm4, %xmm2
823 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
824 ; SSSE3-NEXT: pxor %xmm8, %xmm4
825 ; SSSE3-NEXT: paddd %xmm7, %xmm3
826 ; SSSE3-NEXT: pxor %xmm3, %xmm8
827 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm4
828 ; SSSE3-NEXT: por %xmm4, %xmm3
831 ; SSE41-LABEL: v16i32:
833 ; SSE41-NEXT: pcmpeqd %xmm8, %xmm8
834 ; SSE41-NEXT: movdqa %xmm4, %xmm9
835 ; SSE41-NEXT: pxor %xmm8, %xmm9
836 ; SSE41-NEXT: pminud %xmm9, %xmm0
837 ; SSE41-NEXT: paddd %xmm4, %xmm0
838 ; SSE41-NEXT: movdqa %xmm5, %xmm4
839 ; SSE41-NEXT: pxor %xmm8, %xmm4
840 ; SSE41-NEXT: pminud %xmm4, %xmm1
841 ; SSE41-NEXT: paddd %xmm5, %xmm1
842 ; SSE41-NEXT: movdqa %xmm6, %xmm4
843 ; SSE41-NEXT: pxor %xmm8, %xmm4
844 ; SSE41-NEXT: pminud %xmm4, %xmm2
845 ; SSE41-NEXT: paddd %xmm6, %xmm2
846 ; SSE41-NEXT: pxor %xmm7, %xmm8
847 ; SSE41-NEXT: pminud %xmm8, %xmm3
848 ; SSE41-NEXT: paddd %xmm7, %xmm3
851 ; AVX1-LABEL: v16i32:
853 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
854 ; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5
855 ; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm6
856 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7
857 ; AVX1-NEXT: vpminud %xmm6, %xmm7, %xmm6
858 ; AVX1-NEXT: vpaddd %xmm4, %xmm6, %xmm4
859 ; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm6
860 ; AVX1-NEXT: vpminud %xmm6, %xmm0, %xmm0
861 ; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm0
862 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
863 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2
864 ; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm4
865 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6
866 ; AVX1-NEXT: vpminud %xmm4, %xmm6, %xmm4
867 ; AVX1-NEXT: vpaddd %xmm2, %xmm4, %xmm2
868 ; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm4
869 ; AVX1-NEXT: vpminud %xmm4, %xmm1, %xmm1
870 ; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1
871 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
874 ; AVX2-LABEL: v16i32:
876 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4
877 ; AVX2-NEXT: vpxor %ymm4, %ymm2, %ymm5
878 ; AVX2-NEXT: vpminud %ymm5, %ymm0, %ymm0
879 ; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm0
880 ; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm2
881 ; AVX2-NEXT: vpminud %ymm2, %ymm1, %ymm1
882 ; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm1
885 ; AVX512-LABEL: v16i32:
887 ; AVX512-NEXT: vmovdqa64 %zmm1, %zmm2
888 ; AVX512-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm2
889 ; AVX512-NEXT: vpminud %zmm2, %zmm0, %zmm0
890 ; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm0
892 %z = call <16 x i32> @llvm.uadd.sat.v16i32(<16 x i32> %x, <16 x i32> %y)
896 define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {
899 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
900 ; SSE-NEXT: movdqa %xmm0, %xmm3
901 ; SSE-NEXT: pxor %xmm2, %xmm3
902 ; SSE-NEXT: paddq %xmm1, %xmm0
903 ; SSE-NEXT: pxor %xmm0, %xmm2
904 ; SSE-NEXT: movdqa %xmm3, %xmm1
905 ; SSE-NEXT: pcmpgtd %xmm2, %xmm1
906 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm1[0,0,2,2]
907 ; SSE-NEXT: pcmpeqd %xmm3, %xmm2
908 ; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
909 ; SSE-NEXT: pand %xmm4, %xmm2
910 ; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
911 ; SSE-NEXT: por %xmm1, %xmm0
912 ; SSE-NEXT: por %xmm2, %xmm0
917 ; AVX1-NEXT: vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
918 ; AVX1-NEXT: # xmm2 = mem[0,0]
919 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm3
920 ; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0
921 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm1
922 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1
923 ; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
928 ; AVX2-NEXT: vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
929 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm3
930 ; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0
931 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm1
932 ; AVX2-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm1
933 ; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
936 ; AVX512F-LABEL: v2i64:
938 ; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
939 ; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0
940 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm2
941 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm2
942 ; AVX512F-NEXT: vpminuq %zmm2, %zmm0, %zmm0
943 ; AVX512F-NEXT: vpaddq %xmm1, %xmm0, %xmm0
944 ; AVX512F-NEXT: vzeroupper
947 ; AVX512BW-LABEL: v2i64:
949 ; AVX512BW-NEXT: vmovdqa %xmm1, %xmm2
950 ; AVX512BW-NEXT: vpternlogq $15, %xmm1, %xmm1, %xmm2
951 ; AVX512BW-NEXT: vpminuq %xmm2, %xmm0, %xmm0
952 ; AVX512BW-NEXT: vpaddq %xmm1, %xmm0, %xmm0
953 ; AVX512BW-NEXT: retq
954 %z = call <2 x i64> @llvm.uadd.sat.v2i64(<2 x i64> %x, <2 x i64> %y)
958 define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
961 ; SSE-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
962 ; SSE-NEXT: movdqa %xmm0, %xmm5
963 ; SSE-NEXT: pxor %xmm4, %xmm5
964 ; SSE-NEXT: paddq %xmm2, %xmm0
965 ; SSE-NEXT: movdqa %xmm0, %xmm2
966 ; SSE-NEXT: pxor %xmm4, %xmm2
967 ; SSE-NEXT: movdqa %xmm5, %xmm6
968 ; SSE-NEXT: pcmpgtd %xmm2, %xmm6
969 ; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
970 ; SSE-NEXT: pcmpeqd %xmm5, %xmm2
971 ; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
972 ; SSE-NEXT: pand %xmm7, %xmm2
973 ; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
974 ; SSE-NEXT: por %xmm5, %xmm0
975 ; SSE-NEXT: por %xmm2, %xmm0
976 ; SSE-NEXT: movdqa %xmm1, %xmm2
977 ; SSE-NEXT: pxor %xmm4, %xmm2
978 ; SSE-NEXT: paddq %xmm3, %xmm1
979 ; SSE-NEXT: pxor %xmm1, %xmm4
980 ; SSE-NEXT: movdqa %xmm2, %xmm3
981 ; SSE-NEXT: pcmpgtd %xmm4, %xmm3
982 ; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
983 ; SSE-NEXT: pcmpeqd %xmm2, %xmm4
984 ; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
985 ; SSE-NEXT: pand %xmm5, %xmm2
986 ; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
987 ; SSE-NEXT: por %xmm3, %xmm1
988 ; SSE-NEXT: por %xmm2, %xmm1
993 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
994 ; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
995 ; AVX1-NEXT: # xmm3 = mem[0,0]
996 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm4
997 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
998 ; AVX1-NEXT: vpaddq %xmm5, %xmm2, %xmm2
999 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm5
1000 ; AVX1-NEXT: vpcmpgtq %xmm5, %xmm4, %xmm4
1001 ; AVX1-NEXT: vpor %xmm4, %xmm2, %xmm2
1002 ; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm4
1003 ; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0
1004 ; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm1
1005 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm1
1006 ; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
1007 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1010 ; AVX2-LABEL: v4i64:
1012 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1013 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm3
1014 ; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0
1015 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm1
1016 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm3, %ymm1
1017 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
1020 ; AVX512F-LABEL: v4i64:
1022 ; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
1023 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1024 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm2
1025 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm2
1026 ; AVX512F-NEXT: vpminuq %zmm2, %zmm0, %zmm0
1027 ; AVX512F-NEXT: vpaddq %ymm1, %ymm0, %ymm0
1028 ; AVX512F-NEXT: retq
1030 ; AVX512BW-LABEL: v4i64:
1031 ; AVX512BW: # %bb.0:
1032 ; AVX512BW-NEXT: vmovdqa %ymm1, %ymm2
1033 ; AVX512BW-NEXT: vpternlogq $15, %ymm1, %ymm1, %ymm2
1034 ; AVX512BW-NEXT: vpminuq %ymm2, %ymm0, %ymm0
1035 ; AVX512BW-NEXT: vpaddq %ymm1, %ymm0, %ymm0
1036 ; AVX512BW-NEXT: retq
1037 %z = call <4 x i64> @llvm.uadd.sat.v4i64(<4 x i64> %x, <4 x i64> %y)
1041 define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind {
1044 ; SSE-NEXT: movdqa {{.*#+}} xmm8 = [9223372039002259456,9223372039002259456]
1045 ; SSE-NEXT: movdqa %xmm0, %xmm9
1046 ; SSE-NEXT: pxor %xmm8, %xmm9
1047 ; SSE-NEXT: paddq %xmm4, %xmm0
1048 ; SSE-NEXT: movdqa %xmm0, %xmm4
1049 ; SSE-NEXT: pxor %xmm8, %xmm4
1050 ; SSE-NEXT: movdqa %xmm9, %xmm10
1051 ; SSE-NEXT: pcmpgtd %xmm4, %xmm10
1052 ; SSE-NEXT: pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
1053 ; SSE-NEXT: pcmpeqd %xmm9, %xmm4
1054 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1055 ; SSE-NEXT: pand %xmm11, %xmm4
1056 ; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm10[1,1,3,3]
1057 ; SSE-NEXT: por %xmm9, %xmm0
1058 ; SSE-NEXT: por %xmm4, %xmm0
1059 ; SSE-NEXT: movdqa %xmm1, %xmm4
1060 ; SSE-NEXT: pxor %xmm8, %xmm4
1061 ; SSE-NEXT: paddq %xmm5, %xmm1
1062 ; SSE-NEXT: movdqa %xmm1, %xmm5
1063 ; SSE-NEXT: pxor %xmm8, %xmm5
1064 ; SSE-NEXT: movdqa %xmm4, %xmm9
1065 ; SSE-NEXT: pcmpgtd %xmm5, %xmm9
1066 ; SSE-NEXT: pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
1067 ; SSE-NEXT: pcmpeqd %xmm4, %xmm5
1068 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1069 ; SSE-NEXT: pand %xmm10, %xmm4
1070 ; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm9[1,1,3,3]
1071 ; SSE-NEXT: por %xmm5, %xmm1
1072 ; SSE-NEXT: por %xmm4, %xmm1
1073 ; SSE-NEXT: movdqa %xmm2, %xmm4
1074 ; SSE-NEXT: pxor %xmm8, %xmm4
1075 ; SSE-NEXT: paddq %xmm6, %xmm2
1076 ; SSE-NEXT: movdqa %xmm2, %xmm5
1077 ; SSE-NEXT: pxor %xmm8, %xmm5
1078 ; SSE-NEXT: movdqa %xmm4, %xmm6
1079 ; SSE-NEXT: pcmpgtd %xmm5, %xmm6
1080 ; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm6[0,0,2,2]
1081 ; SSE-NEXT: pcmpeqd %xmm4, %xmm5
1082 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1083 ; SSE-NEXT: pand %xmm9, %xmm4
1084 ; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
1085 ; SSE-NEXT: por %xmm5, %xmm2
1086 ; SSE-NEXT: por %xmm4, %xmm2
1087 ; SSE-NEXT: movdqa %xmm3, %xmm4
1088 ; SSE-NEXT: pxor %xmm8, %xmm4
1089 ; SSE-NEXT: paddq %xmm7, %xmm3
1090 ; SSE-NEXT: pxor %xmm3, %xmm8
1091 ; SSE-NEXT: movdqa %xmm4, %xmm5
1092 ; SSE-NEXT: pcmpgtd %xmm8, %xmm5
1093 ; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1094 ; SSE-NEXT: pcmpeqd %xmm4, %xmm8
1095 ; SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm8[1,1,3,3]
1096 ; SSE-NEXT: pand %xmm6, %xmm4
1097 ; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1098 ; SSE-NEXT: por %xmm5, %xmm3
1099 ; SSE-NEXT: por %xmm4, %xmm3
1102 ; AVX1-LABEL: v8i64:
1104 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
1105 ; AVX1-NEXT: vmovddup {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]
1106 ; AVX1-NEXT: # xmm5 = mem[0,0]
1107 ; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm6
1108 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm7
1109 ; AVX1-NEXT: vpaddq %xmm7, %xmm4, %xmm4
1110 ; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm7
1111 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm6, %xmm6
1112 ; AVX1-NEXT: vpor %xmm6, %xmm4, %xmm4
1113 ; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm6
1114 ; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm0
1115 ; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm2
1116 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm6, %xmm2
1117 ; AVX1-NEXT: vpor %xmm2, %xmm0, %xmm0
1118 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0
1119 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1120 ; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm4
1121 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm6
1122 ; AVX1-NEXT: vpaddq %xmm6, %xmm2, %xmm2
1123 ; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm6
1124 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm4, %xmm4
1125 ; AVX1-NEXT: vpor %xmm4, %xmm2, %xmm2
1126 ; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm4
1127 ; AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm1
1128 ; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm3
1129 ; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3
1130 ; AVX1-NEXT: vpor %xmm3, %xmm1, %xmm1
1131 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
1134 ; AVX2-LABEL: v8i64:
1136 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1137 ; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm5
1138 ; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0
1139 ; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm2
1140 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm5, %ymm2
1141 ; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
1142 ; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm2
1143 ; AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm1
1144 ; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm3
1145 ; AVX2-NEXT: vpcmpgtq %ymm3, %ymm2, %ymm2
1146 ; AVX2-NEXT: vpor %ymm2, %ymm1, %ymm1
1149 ; AVX512-LABEL: v8i64:
1151 ; AVX512-NEXT: vmovdqa64 %zmm1, %zmm2
1152 ; AVX512-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm2
1153 ; AVX512-NEXT: vpminuq %zmm2, %zmm0, %zmm0
1154 ; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm0
1156 %z = call <8 x i64> @llvm.uadd.sat.v8i64(<8 x i64> %x, <8 x i64> %y)
1160 define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind {
1161 ; SSE-LABEL: v2i128:
1163 ; SSE-NEXT: movq %rdi, %rax
1164 ; SSE-NEXT: addq {{[0-9]+}}(%rsp), %rsi
1165 ; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %rdx
1166 ; SSE-NEXT: movq $-1, %rdi
1167 ; SSE-NEXT: cmovbq %rdi, %rdx
1168 ; SSE-NEXT: cmovbq %rdi, %rsi
1169 ; SSE-NEXT: addq {{[0-9]+}}(%rsp), %rcx
1170 ; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %r8
1171 ; SSE-NEXT: cmovbq %rdi, %r8
1172 ; SSE-NEXT: cmovbq %rdi, %rcx
1173 ; SSE-NEXT: movq %r8, 24(%rax)
1174 ; SSE-NEXT: movq %rcx, 16(%rax)
1175 ; SSE-NEXT: movq %rdx, 8(%rax)
1176 ; SSE-NEXT: movq %rsi, (%rax)
1179 ; AVX-LABEL: v2i128:
1181 ; AVX-NEXT: movq %rdi, %rax
1182 ; AVX-NEXT: addq {{[0-9]+}}(%rsp), %rsi
1183 ; AVX-NEXT: adcq {{[0-9]+}}(%rsp), %rdx
1184 ; AVX-NEXT: movq $-1, %rdi
1185 ; AVX-NEXT: cmovbq %rdi, %rdx
1186 ; AVX-NEXT: cmovbq %rdi, %rsi
1187 ; AVX-NEXT: addq {{[0-9]+}}(%rsp), %rcx
1188 ; AVX-NEXT: adcq {{[0-9]+}}(%rsp), %r8
1189 ; AVX-NEXT: cmovbq %rdi, %r8
1190 ; AVX-NEXT: cmovbq %rdi, %rcx
1191 ; AVX-NEXT: movq %r8, 24(%rax)
1192 ; AVX-NEXT: movq %rcx, 16(%rax)
1193 ; AVX-NEXT: movq %rdx, 8(%rax)
1194 ; AVX-NEXT: movq %rsi, (%rax)
1196 %z = call <2 x i128> @llvm.uadd.sat.v2i128(<2 x i128> %x, <2 x i128> %y)