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.sadd.sat.v1i8(<1 x i8>, <1 x i8>)
13 declare <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8>, <2 x i8>)
14 declare <4 x i8> @llvm.sadd.sat.v4i8(<4 x i8>, <4 x i8>)
15 declare <8 x i8> @llvm.sadd.sat.v8i8(<8 x i8>, <8 x i8>)
16 declare <12 x i8> @llvm.sadd.sat.v12i8(<12 x i8>, <12 x i8>)
17 declare <16 x i8> @llvm.sadd.sat.v16i8(<16 x i8>, <16 x i8>)
18 declare <32 x i8> @llvm.sadd.sat.v32i8(<32 x i8>, <32 x i8>)
19 declare <64 x i8> @llvm.sadd.sat.v64i8(<64 x i8>, <64 x i8>)
21 declare <1 x i16> @llvm.sadd.sat.v1i16(<1 x i16>, <1 x i16>)
22 declare <2 x i16> @llvm.sadd.sat.v2i16(<2 x i16>, <2 x i16>)
23 declare <4 x i16> @llvm.sadd.sat.v4i16(<4 x i16>, <4 x i16>)
24 declare <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16>, <8 x i16>)
25 declare <12 x i16> @llvm.sadd.sat.v12i16(<12 x i16>, <12 x i16>)
26 declare <16 x i16> @llvm.sadd.sat.v16i16(<16 x i16>, <16 x i16>)
27 declare <32 x i16> @llvm.sadd.sat.v32i16(<32 x i16>, <32 x i16>)
29 declare <16 x i1> @llvm.sadd.sat.v16i1(<16 x i1>, <16 x i1>)
30 declare <16 x i4> @llvm.sadd.sat.v16i4(<16 x i4>, <16 x i4>)
32 declare <2 x i32> @llvm.sadd.sat.v2i32(<2 x i32>, <2 x i32>)
33 declare <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32>, <4 x i32>)
34 declare <8 x i32> @llvm.sadd.sat.v8i32(<8 x i32>, <8 x i32>)
35 declare <16 x i32> @llvm.sadd.sat.v16i32(<16 x i32>, <16 x i32>)
36 declare <2 x i64> @llvm.sadd.sat.v2i64(<2 x i64>, <2 x i64>)
37 declare <4 x i64> @llvm.sadd.sat.v4i64(<4 x i64>, <4 x i64>)
38 declare <8 x i64> @llvm.sadd.sat.v8i64(<8 x i64>, <8 x i64>)
40 declare <4 x i24> @llvm.sadd.sat.v4i24(<4 x i24>, <4 x i24>)
41 declare <2 x i128> @llvm.sadd.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: paddsb %xmm1, %xmm0
53 ; AVX-NEXT: vpaddsb %xmm1, %xmm0, %xmm0
55 %z = call <16 x i8> @llvm.sadd.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: paddsb %xmm2, %xmm0
63 ; SSE-NEXT: paddsb %xmm3, %xmm1
68 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
69 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
70 ; AVX1-NEXT: vpaddsb %xmm2, %xmm3, %xmm2
71 ; AVX1-NEXT: vpaddsb %xmm1, %xmm0, %xmm0
72 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
77 ; AVX2-NEXT: vpaddsb %ymm1, %ymm0, %ymm0
80 ; AVX512-LABEL: v32i8:
82 ; AVX512-NEXT: vpaddsb %ymm1, %ymm0, %ymm0
84 %z = call <32 x i8> @llvm.sadd.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: paddsb %xmm4, %xmm0
92 ; SSE-NEXT: paddsb %xmm5, %xmm1
93 ; SSE-NEXT: paddsb %xmm6, %xmm2
94 ; SSE-NEXT: paddsb %xmm7, %xmm3
99 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
100 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
101 ; AVX1-NEXT: vpaddsb %xmm4, %xmm5, %xmm4
102 ; AVX1-NEXT: vpaddsb %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: vpaddsb %xmm2, %xmm4, %xmm2
107 ; AVX1-NEXT: vpaddsb %xmm3, %xmm1, %xmm1
108 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
113 ; AVX2-NEXT: vpaddsb %ymm2, %ymm0, %ymm0
114 ; AVX2-NEXT: vpaddsb %ymm3, %ymm1, %ymm1
117 ; AVX512F-LABEL: v64i8:
119 ; AVX512F-NEXT: vextracti64x4 $1, %zmm1, %ymm2
120 ; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm3
121 ; AVX512F-NEXT: vpaddsb %ymm2, %ymm3, %ymm2
122 ; AVX512F-NEXT: vpaddsb %ymm1, %ymm0, %ymm0
123 ; AVX512F-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm0
126 ; AVX512BW-LABEL: v64i8:
128 ; AVX512BW-NEXT: vpaddsb %zmm1, %zmm0, %zmm0
129 ; AVX512BW-NEXT: retq
130 %z = call <64 x i8> @llvm.sadd.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: paddsw %xmm1, %xmm0
142 ; AVX-NEXT: vpaddsw %xmm1, %xmm0, %xmm0
144 %z = call <8 x i16> @llvm.sadd.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: paddsw %xmm2, %xmm0
152 ; SSE-NEXT: paddsw %xmm3, %xmm1
155 ; AVX1-LABEL: v16i16:
157 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
158 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
159 ; AVX1-NEXT: vpaddsw %xmm2, %xmm3, %xmm2
160 ; AVX1-NEXT: vpaddsw %xmm1, %xmm0, %xmm0
161 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
164 ; AVX2-LABEL: v16i16:
166 ; AVX2-NEXT: vpaddsw %ymm1, %ymm0, %ymm0
169 ; AVX512-LABEL: v16i16:
171 ; AVX512-NEXT: vpaddsw %ymm1, %ymm0, %ymm0
173 %z = call <16 x i16> @llvm.sadd.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: paddsw %xmm4, %xmm0
181 ; SSE-NEXT: paddsw %xmm5, %xmm1
182 ; SSE-NEXT: paddsw %xmm6, %xmm2
183 ; SSE-NEXT: paddsw %xmm7, %xmm3
186 ; AVX1-LABEL: v32i16:
188 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
189 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
190 ; AVX1-NEXT: vpaddsw %xmm4, %xmm5, %xmm4
191 ; AVX1-NEXT: vpaddsw %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: vpaddsw %xmm2, %xmm4, %xmm2
196 ; AVX1-NEXT: vpaddsw %xmm3, %xmm1, %xmm1
197 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
200 ; AVX2-LABEL: v32i16:
202 ; AVX2-NEXT: vpaddsw %ymm2, %ymm0, %ymm0
203 ; AVX2-NEXT: vpaddsw %ymm3, %ymm1, %ymm1
206 ; AVX512F-LABEL: v32i16:
208 ; AVX512F-NEXT: vextracti64x4 $1, %zmm1, %ymm2
209 ; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm3
210 ; AVX512F-NEXT: vpaddsw %ymm2, %ymm3, %ymm2
211 ; AVX512F-NEXT: vpaddsw %ymm1, %ymm0, %ymm0
212 ; AVX512F-NEXT: vinserti64x4 $1, %ymm2, %zmm0, %zmm0
215 ; AVX512BW-LABEL: v32i16:
217 ; AVX512BW-NEXT: vpaddsw %zmm1, %zmm0, %zmm0
218 ; AVX512BW-NEXT: retq
219 %z = call <32 x i16> @llvm.sadd.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: paddsb %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: vpaddsb %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.sadd.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: paddsb %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: vpaddsb %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.sadd.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: paddsb %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: paddsb %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: paddsb %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: vpaddsb %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.sadd.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: paddsw %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: vpaddsw %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.sadd.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: paddsw %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: vpaddsw %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.sadd.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: paddsb %xmm1, %xmm0
374 ; AVX-NEXT: vpaddsb %xmm1, %xmm0, %xmm0
376 %z = call <12 x i8> @llvm.sadd.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: paddsw 16(%rsi), %xmm1
386 ; SSE-NEXT: paddsw (%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: vpaddsw 16(%rsi), %xmm1, %xmm1
396 ; AVX1-NEXT: vpaddsw (%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: vpaddsw (%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: vpaddsw (%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.sadd.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: movzbl (%rsi), %ecx
434 ; SSE-NEXT: leal (%rax,%rcx), %esi
435 ; SSE-NEXT: sarb $7, %sil
436 ; SSE-NEXT: addb $-128, %sil
437 ; SSE-NEXT: addb %cl, %al
438 ; SSE-NEXT: movzbl %al, %eax
439 ; SSE-NEXT: movzbl %sil, %ecx
440 ; SSE-NEXT: cmovnol %eax, %ecx
441 ; SSE-NEXT: movb %cl, (%rdx)
446 ; AVX-NEXT: movzbl (%rdi), %eax
447 ; AVX-NEXT: movzbl (%rsi), %ecx
448 ; AVX-NEXT: leal (%rax,%rcx), %esi
449 ; AVX-NEXT: sarb $7, %sil
450 ; AVX-NEXT: addb $-128, %sil
451 ; AVX-NEXT: addb %cl, %al
452 ; AVX-NEXT: movzbl %al, %eax
453 ; AVX-NEXT: movzbl %sil, %ecx
454 ; AVX-NEXT: cmovnol %eax, %ecx
455 ; AVX-NEXT: movb %cl, (%rdx)
457 %x = load <1 x i8>, ptr %px
458 %y = load <1 x i8>, ptr %py
459 %z = call <1 x i8> @llvm.sadd.sat.v1i8(<1 x i8> %x, <1 x i8> %y)
460 store <1 x i8> %z, ptr %pz
464 define void @v1i16(ptr %px, ptr %py, ptr %pz) nounwind {
467 ; SSE-NEXT: movzwl (%rdi), %eax
468 ; SSE-NEXT: movzwl (%rsi), %ecx
469 ; SSE-NEXT: leal (%rax,%rcx), %esi
470 ; SSE-NEXT: movswl %si, %esi
471 ; SSE-NEXT: sarl $15, %esi
472 ; SSE-NEXT: xorl $-32768, %esi # imm = 0x8000
473 ; SSE-NEXT: addw %cx, %ax
474 ; SSE-NEXT: cmovol %esi, %eax
475 ; SSE-NEXT: movw %ax, (%rdx)
480 ; AVX-NEXT: movzwl (%rdi), %eax
481 ; AVX-NEXT: movzwl (%rsi), %ecx
482 ; AVX-NEXT: leal (%rax,%rcx), %esi
483 ; AVX-NEXT: movswl %si, %esi
484 ; AVX-NEXT: sarl $15, %esi
485 ; AVX-NEXT: xorl $-32768, %esi # imm = 0x8000
486 ; AVX-NEXT: addw %cx, %ax
487 ; AVX-NEXT: cmovol %esi, %eax
488 ; AVX-NEXT: movw %ax, (%rdx)
490 %x = load <1 x i16>, ptr %px
491 %y = load <1 x i16>, ptr %py
492 %z = call <1 x i16> @llvm.sadd.sat.v1i16(<1 x i16> %x, <1 x i16> %y)
493 store <1 x i16> %z, ptr %pz
499 define <16 x i4> @v16i4(<16 x i4> %x, <16 x i4> %y) nounwind {
502 ; SSE-NEXT: psllw $4, %xmm1
503 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
504 ; SSE-NEXT: pand %xmm2, %xmm1
505 ; SSE-NEXT: psllw $4, %xmm0
506 ; SSE-NEXT: pand %xmm2, %xmm0
507 ; SSE-NEXT: paddsb %xmm1, %xmm0
508 ; SSE-NEXT: psrlw $4, %xmm0
509 ; SSE-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
510 ; SSE-NEXT: movdqa {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
511 ; SSE-NEXT: pxor %xmm1, %xmm0
512 ; SSE-NEXT: psubb %xmm1, %xmm0
517 ; AVX1-NEXT: vpsllw $4, %xmm1, %xmm1
518 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
519 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
520 ; AVX1-NEXT: vpsllw $4, %xmm0, %xmm0
521 ; AVX1-NEXT: vpand %xmm2, %xmm0, %xmm0
522 ; AVX1-NEXT: vpaddsb %xmm1, %xmm0, %xmm0
523 ; AVX1-NEXT: vpsrlw $4, %xmm0, %xmm0
524 ; AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
525 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
526 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
527 ; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm0
532 ; AVX2-NEXT: vpsllw $4, %xmm1, %xmm1
533 ; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
534 ; AVX2-NEXT: vpand %xmm2, %xmm1, %xmm1
535 ; AVX2-NEXT: vpsllw $4, %xmm0, %xmm0
536 ; AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
537 ; AVX2-NEXT: vpaddsb %xmm1, %xmm0, %xmm0
538 ; AVX2-NEXT: vpsrlw $4, %xmm0, %xmm0
539 ; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
540 ; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
541 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
542 ; AVX2-NEXT: vpsubb %xmm1, %xmm0, %xmm0
545 ; AVX512F-LABEL: v16i4:
547 ; AVX512F-NEXT: vpsllw $4, %xmm1, %xmm1
548 ; AVX512F-NEXT: vpbroadcastb {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
549 ; AVX512F-NEXT: vpand %xmm2, %xmm1, %xmm1
550 ; AVX512F-NEXT: vpsllw $4, %xmm0, %xmm0
551 ; AVX512F-NEXT: vpand %xmm2, %xmm0, %xmm0
552 ; AVX512F-NEXT: vpaddsb %xmm1, %xmm0, %xmm0
553 ; AVX512F-NEXT: vpsrlw $4, %xmm0, %xmm0
554 ; AVX512F-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
555 ; AVX512F-NEXT: vpbroadcastb {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
556 ; AVX512F-NEXT: vpxor %xmm1, %xmm0, %xmm0
557 ; AVX512F-NEXT: vpsubb %xmm1, %xmm0, %xmm0
560 ; AVX512BW-LABEL: v16i4:
562 ; AVX512BW-NEXT: vpsllw $4, %xmm1, %xmm1
563 ; AVX512BW-NEXT: vpbroadcastb {{.*#+}} xmm2 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
564 ; AVX512BW-NEXT: vpand %xmm2, %xmm1, %xmm1
565 ; AVX512BW-NEXT: vpsllw $4, %xmm0, %xmm0
566 ; AVX512BW-NEXT: vpand %xmm2, %xmm0, %xmm0
567 ; AVX512BW-NEXT: vpaddsb %xmm1, %xmm0, %xmm0
568 ; AVX512BW-NEXT: vpsrlw $4, %xmm0, %xmm0
569 ; AVX512BW-NEXT: vpbroadcastb {{.*#+}} xmm1 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
570 ; AVX512BW-NEXT: vpternlogd $108, {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm1, %xmm0
571 ; AVX512BW-NEXT: vpsubb %xmm1, %xmm0, %xmm0
572 ; AVX512BW-NEXT: retq
573 %z = call <16 x i4> @llvm.sadd.sat.v16i4(<16 x i4> %x, <16 x i4> %y)
577 define <16 x i1> @v16i1(<16 x i1> %x, <16 x i1> %y) nounwind {
580 ; SSE-NEXT: orps %xmm1, %xmm0
585 ; AVX-NEXT: vorps %xmm1, %xmm0, %xmm0
587 %z = call <16 x i1> @llvm.sadd.sat.v16i1(<16 x i1> %x, <16 x i1> %y)
593 define <2 x i32> @v2i32(<2 x i32> %x, <2 x i32> %y) nounwind {
596 ; SSE2-NEXT: pxor %xmm2, %xmm2
597 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
598 ; SSE2-NEXT: paddd %xmm0, %xmm1
599 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm0
600 ; SSE2-NEXT: pxor %xmm2, %xmm0
601 ; SSE2-NEXT: movdqa %xmm0, %xmm2
602 ; SSE2-NEXT: pandn %xmm1, %xmm2
603 ; SSE2-NEXT: psrad $31, %xmm1
604 ; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
605 ; SSE2-NEXT: pand %xmm1, %xmm0
606 ; SSE2-NEXT: por %xmm2, %xmm0
609 ; SSSE3-LABEL: v2i32:
611 ; SSSE3-NEXT: pxor %xmm2, %xmm2
612 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
613 ; SSSE3-NEXT: paddd %xmm0, %xmm1
614 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm0
615 ; SSSE3-NEXT: pxor %xmm2, %xmm0
616 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
617 ; SSSE3-NEXT: pandn %xmm1, %xmm2
618 ; SSSE3-NEXT: psrad $31, %xmm1
619 ; SSSE3-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
620 ; SSSE3-NEXT: pand %xmm1, %xmm0
621 ; SSSE3-NEXT: por %xmm2, %xmm0
624 ; SSE41-LABEL: v2i32:
626 ; SSE41-NEXT: movdqa %xmm0, %xmm2
627 ; SSE41-NEXT: paddd %xmm1, %xmm2
628 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm0
629 ; SSE41-NEXT: pxor %xmm1, %xmm0
630 ; SSE41-NEXT: movdqa %xmm2, %xmm1
631 ; SSE41-NEXT: psrad $31, %xmm1
632 ; SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
633 ; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm2
634 ; SSE41-NEXT: movaps %xmm2, %xmm0
639 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm2
640 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm0
641 ; AVX1-NEXT: vpxor %xmm0, %xmm1, %xmm0
642 ; AVX1-NEXT: vpsrad $31, %xmm2, %xmm1
643 ; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
644 ; AVX1-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0
649 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm2
650 ; AVX2-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm0
651 ; AVX2-NEXT: vpxor %xmm0, %xmm1, %xmm0
652 ; AVX2-NEXT: vpsrad $31, %xmm2, %xmm1
653 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
654 ; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm1
655 ; AVX2-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0
658 ; AVX512F-LABEL: v2i32:
660 ; AVX512F-NEXT: vpaddd %xmm1, %xmm0, %xmm2
661 ; AVX512F-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm0
662 ; AVX512F-NEXT: vpxor %xmm0, %xmm1, %xmm0
663 ; AVX512F-NEXT: vpsrad $31, %xmm2, %xmm1
664 ; AVX512F-NEXT: vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
665 ; AVX512F-NEXT: vpxor %xmm3, %xmm1, %xmm1
666 ; AVX512F-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0
669 ; AVX512BW-LABEL: v2i32:
671 ; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2
672 ; AVX512BW-NEXT: vpcmpgtd %xmm1, %xmm2, %k0
673 ; AVX512BW-NEXT: vpaddd %xmm1, %xmm0, %xmm1
674 ; AVX512BW-NEXT: vpcmpgtd %xmm1, %xmm0, %k1
675 ; AVX512BW-NEXT: kxorw %k1, %k0, %k1
676 ; AVX512BW-NEXT: vpsrad $31, %xmm1, %xmm0
677 ; AVX512BW-NEXT: vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm1 {%k1}
678 ; AVX512BW-NEXT: vmovdqa %xmm1, %xmm0
679 ; AVX512BW-NEXT: retq
680 %z = call <2 x i32> @llvm.sadd.sat.v2i32(<2 x i32> %x, <2 x i32> %y)
684 define <4 x i32> @v4i32(<4 x i32> %x, <4 x i32> %y) nounwind {
687 ; SSE2-NEXT: pxor %xmm2, %xmm2
688 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
689 ; SSE2-NEXT: paddd %xmm0, %xmm1
690 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm0
691 ; SSE2-NEXT: pxor %xmm2, %xmm0
692 ; SSE2-NEXT: movdqa %xmm0, %xmm2
693 ; SSE2-NEXT: pandn %xmm1, %xmm2
694 ; SSE2-NEXT: psrad $31, %xmm1
695 ; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
696 ; SSE2-NEXT: pand %xmm1, %xmm0
697 ; SSE2-NEXT: por %xmm2, %xmm0
700 ; SSSE3-LABEL: v4i32:
702 ; SSSE3-NEXT: pxor %xmm2, %xmm2
703 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
704 ; SSSE3-NEXT: paddd %xmm0, %xmm1
705 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm0
706 ; SSSE3-NEXT: pxor %xmm2, %xmm0
707 ; SSSE3-NEXT: movdqa %xmm0, %xmm2
708 ; SSSE3-NEXT: pandn %xmm1, %xmm2
709 ; SSSE3-NEXT: psrad $31, %xmm1
710 ; SSSE3-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
711 ; SSSE3-NEXT: pand %xmm1, %xmm0
712 ; SSSE3-NEXT: por %xmm2, %xmm0
715 ; SSE41-LABEL: v4i32:
717 ; SSE41-NEXT: movdqa %xmm0, %xmm2
718 ; SSE41-NEXT: paddd %xmm1, %xmm2
719 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm0
720 ; SSE41-NEXT: pxor %xmm1, %xmm0
721 ; SSE41-NEXT: movdqa %xmm2, %xmm1
722 ; SSE41-NEXT: psrad $31, %xmm1
723 ; SSE41-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
724 ; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm2
725 ; SSE41-NEXT: movaps %xmm2, %xmm0
730 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm2
731 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm0
732 ; AVX1-NEXT: vpxor %xmm0, %xmm1, %xmm0
733 ; AVX1-NEXT: vpsrad $31, %xmm2, %xmm1
734 ; AVX1-NEXT: vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
735 ; AVX1-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0
740 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm2
741 ; AVX2-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm0
742 ; AVX2-NEXT: vpxor %xmm0, %xmm1, %xmm0
743 ; AVX2-NEXT: vpsrad $31, %xmm2, %xmm1
744 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
745 ; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm1
746 ; AVX2-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0
749 ; AVX512F-LABEL: v4i32:
751 ; AVX512F-NEXT: vpaddd %xmm1, %xmm0, %xmm2
752 ; AVX512F-NEXT: vpcmpgtd %xmm2, %xmm0, %xmm0
753 ; AVX512F-NEXT: vpxor %xmm0, %xmm1, %xmm0
754 ; AVX512F-NEXT: vpsrad $31, %xmm2, %xmm1
755 ; AVX512F-NEXT: vpbroadcastd {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
756 ; AVX512F-NEXT: vpxor %xmm3, %xmm1, %xmm1
757 ; AVX512F-NEXT: vblendvps %xmm0, %xmm1, %xmm2, %xmm0
760 ; AVX512BW-LABEL: v4i32:
762 ; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2
763 ; AVX512BW-NEXT: vpcmpgtd %xmm1, %xmm2, %k0
764 ; AVX512BW-NEXT: vpaddd %xmm1, %xmm0, %xmm1
765 ; AVX512BW-NEXT: vpcmpgtd %xmm1, %xmm0, %k1
766 ; AVX512BW-NEXT: kxorw %k1, %k0, %k1
767 ; AVX512BW-NEXT: vpsrad $31, %xmm1, %xmm0
768 ; AVX512BW-NEXT: vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm1 {%k1}
769 ; AVX512BW-NEXT: vmovdqa %xmm1, %xmm0
770 ; AVX512BW-NEXT: retq
771 %z = call <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32> %x, <4 x i32> %y)
775 define <8 x i32> @v8i32(<8 x i32> %x, <8 x i32> %y) nounwind {
778 ; SSE2-NEXT: pxor %xmm4, %xmm4
779 ; SSE2-NEXT: pxor %xmm5, %xmm5
780 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm5
781 ; SSE2-NEXT: paddd %xmm0, %xmm2
782 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm0
783 ; SSE2-NEXT: pxor %xmm5, %xmm0
784 ; SSE2-NEXT: movdqa %xmm0, %xmm5
785 ; SSE2-NEXT: pandn %xmm2, %xmm5
786 ; SSE2-NEXT: psrad $31, %xmm2
787 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
788 ; SSE2-NEXT: pxor %xmm6, %xmm2
789 ; SSE2-NEXT: pand %xmm2, %xmm0
790 ; SSE2-NEXT: por %xmm5, %xmm0
791 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4
792 ; SSE2-NEXT: paddd %xmm1, %xmm3
793 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm1
794 ; SSE2-NEXT: pxor %xmm4, %xmm1
795 ; SSE2-NEXT: movdqa %xmm1, %xmm2
796 ; SSE2-NEXT: pandn %xmm3, %xmm2
797 ; SSE2-NEXT: psrad $31, %xmm3
798 ; SSE2-NEXT: pxor %xmm3, %xmm6
799 ; SSE2-NEXT: pand %xmm6, %xmm1
800 ; SSE2-NEXT: por %xmm2, %xmm1
803 ; SSSE3-LABEL: v8i32:
805 ; SSSE3-NEXT: pxor %xmm4, %xmm4
806 ; SSSE3-NEXT: pxor %xmm5, %xmm5
807 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm5
808 ; SSSE3-NEXT: paddd %xmm0, %xmm2
809 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0
810 ; SSSE3-NEXT: pxor %xmm5, %xmm0
811 ; SSSE3-NEXT: movdqa %xmm0, %xmm5
812 ; SSSE3-NEXT: pandn %xmm2, %xmm5
813 ; SSSE3-NEXT: psrad $31, %xmm2
814 ; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648]
815 ; SSSE3-NEXT: pxor %xmm6, %xmm2
816 ; SSSE3-NEXT: pand %xmm2, %xmm0
817 ; SSSE3-NEXT: por %xmm5, %xmm0
818 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4
819 ; SSSE3-NEXT: paddd %xmm1, %xmm3
820 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm1
821 ; SSSE3-NEXT: pxor %xmm4, %xmm1
822 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
823 ; SSSE3-NEXT: pandn %xmm3, %xmm2
824 ; SSSE3-NEXT: psrad $31, %xmm3
825 ; SSSE3-NEXT: pxor %xmm3, %xmm6
826 ; SSSE3-NEXT: pand %xmm6, %xmm1
827 ; SSSE3-NEXT: por %xmm2, %xmm1
830 ; SSE41-LABEL: v8i32:
832 ; SSE41-NEXT: movdqa %xmm1, %xmm5
833 ; SSE41-NEXT: movdqa %xmm0, %xmm4
834 ; SSE41-NEXT: paddd %xmm2, %xmm4
835 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm0
836 ; SSE41-NEXT: pxor %xmm2, %xmm0
837 ; SSE41-NEXT: movdqa %xmm4, %xmm1
838 ; SSE41-NEXT: psrad $31, %xmm1
839 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
840 ; SSE41-NEXT: pxor %xmm2, %xmm1
841 ; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm4
842 ; SSE41-NEXT: movdqa %xmm5, %xmm1
843 ; SSE41-NEXT: paddd %xmm3, %xmm1
844 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm5
845 ; SSE41-NEXT: pxor %xmm3, %xmm5
846 ; SSE41-NEXT: movdqa %xmm1, %xmm3
847 ; SSE41-NEXT: psrad $31, %xmm3
848 ; SSE41-NEXT: pxor %xmm2, %xmm3
849 ; SSE41-NEXT: movdqa %xmm5, %xmm0
850 ; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm1
851 ; SSE41-NEXT: movaps %xmm4, %xmm0
856 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
857 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
858 ; AVX1-NEXT: vpaddd %xmm2, %xmm3, %xmm2
859 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm4
860 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm4, %ymm5
861 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm3
862 ; AVX1-NEXT: vpcmpgtd %xmm4, %xmm0, %xmm0
863 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
864 ; AVX1-NEXT: vxorps %ymm0, %ymm1, %ymm0
865 ; AVX1-NEXT: vpsrad $31, %xmm4, %xmm1
866 ; AVX1-NEXT: vpsrad $31, %xmm2, %xmm2
867 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
868 ; AVX1-NEXT: vxorps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
869 ; AVX1-NEXT: vblendvps %ymm0, %ymm1, %ymm5, %ymm0
874 ; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm2
875 ; AVX2-NEXT: vpcmpgtd %ymm2, %ymm0, %ymm0
876 ; AVX2-NEXT: vpxor %ymm0, %ymm1, %ymm0
877 ; AVX2-NEXT: vpsrad $31, %ymm2, %ymm1
878 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
879 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
880 ; AVX2-NEXT: vblendvps %ymm0, %ymm1, %ymm2, %ymm0
883 ; AVX512F-LABEL: v8i32:
885 ; AVX512F-NEXT: vpaddd %ymm1, %ymm0, %ymm2
886 ; AVX512F-NEXT: vpcmpgtd %ymm2, %ymm0, %ymm0
887 ; AVX512F-NEXT: vpxor %ymm0, %ymm1, %ymm0
888 ; AVX512F-NEXT: vpsrad $31, %ymm2, %ymm1
889 ; AVX512F-NEXT: vpbroadcastd {{.*#+}} ymm3 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
890 ; AVX512F-NEXT: vpxor %ymm3, %ymm1, %ymm1
891 ; AVX512F-NEXT: vblendvps %ymm0, %ymm1, %ymm2, %ymm0
894 ; AVX512BW-LABEL: v8i32:
896 ; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2
897 ; AVX512BW-NEXT: vpcmpgtd %ymm1, %ymm2, %k0
898 ; AVX512BW-NEXT: vpaddd %ymm1, %ymm0, %ymm1
899 ; AVX512BW-NEXT: vpcmpgtd %ymm1, %ymm0, %k1
900 ; AVX512BW-NEXT: kxorw %k1, %k0, %k1
901 ; AVX512BW-NEXT: vpsrad $31, %ymm1, %ymm0
902 ; AVX512BW-NEXT: vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm1 {%k1}
903 ; AVX512BW-NEXT: vmovdqa %ymm1, %ymm0
904 ; AVX512BW-NEXT: retq
905 %z = call <8 x i32> @llvm.sadd.sat.v8i32(<8 x i32> %x, <8 x i32> %y)
909 define <16 x i32> @v16i32(<16 x i32> %x, <16 x i32> %y) nounwind {
910 ; SSE2-LABEL: v16i32:
912 ; SSE2-NEXT: pxor %xmm8, %xmm8
913 ; SSE2-NEXT: pxor %xmm9, %xmm9
914 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm9
915 ; SSE2-NEXT: paddd %xmm0, %xmm4
916 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm0
917 ; SSE2-NEXT: pxor %xmm9, %xmm0
918 ; SSE2-NEXT: movdqa %xmm0, %xmm10
919 ; SSE2-NEXT: pandn %xmm4, %xmm10
920 ; SSE2-NEXT: psrad $31, %xmm4
921 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [2147483648,2147483648,2147483648,2147483648]
922 ; SSE2-NEXT: pxor %xmm9, %xmm4
923 ; SSE2-NEXT: pand %xmm4, %xmm0
924 ; SSE2-NEXT: por %xmm10, %xmm0
925 ; SSE2-NEXT: pxor %xmm4, %xmm4
926 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm4
927 ; SSE2-NEXT: paddd %xmm1, %xmm5
928 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm1
929 ; SSE2-NEXT: pxor %xmm4, %xmm1
930 ; SSE2-NEXT: movdqa %xmm1, %xmm4
931 ; SSE2-NEXT: pandn %xmm5, %xmm4
932 ; SSE2-NEXT: psrad $31, %xmm5
933 ; SSE2-NEXT: pxor %xmm9, %xmm5
934 ; SSE2-NEXT: pand %xmm5, %xmm1
935 ; SSE2-NEXT: por %xmm4, %xmm1
936 ; SSE2-NEXT: pxor %xmm4, %xmm4
937 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm4
938 ; SSE2-NEXT: paddd %xmm2, %xmm6
939 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm2
940 ; SSE2-NEXT: pxor %xmm4, %xmm2
941 ; SSE2-NEXT: movdqa %xmm2, %xmm4
942 ; SSE2-NEXT: pandn %xmm6, %xmm4
943 ; SSE2-NEXT: psrad $31, %xmm6
944 ; SSE2-NEXT: pxor %xmm9, %xmm6
945 ; SSE2-NEXT: pand %xmm6, %xmm2
946 ; SSE2-NEXT: por %xmm4, %xmm2
947 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm8
948 ; SSE2-NEXT: paddd %xmm3, %xmm7
949 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm3
950 ; SSE2-NEXT: pxor %xmm8, %xmm3
951 ; SSE2-NEXT: movdqa %xmm3, %xmm4
952 ; SSE2-NEXT: pandn %xmm7, %xmm4
953 ; SSE2-NEXT: psrad $31, %xmm7
954 ; SSE2-NEXT: pxor %xmm7, %xmm9
955 ; SSE2-NEXT: pand %xmm9, %xmm3
956 ; SSE2-NEXT: por %xmm4, %xmm3
959 ; SSSE3-LABEL: v16i32:
961 ; SSSE3-NEXT: pxor %xmm8, %xmm8
962 ; SSSE3-NEXT: pxor %xmm9, %xmm9
963 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm9
964 ; SSSE3-NEXT: paddd %xmm0, %xmm4
965 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm0
966 ; SSSE3-NEXT: pxor %xmm9, %xmm0
967 ; SSSE3-NEXT: movdqa %xmm0, %xmm10
968 ; SSSE3-NEXT: pandn %xmm4, %xmm10
969 ; SSSE3-NEXT: psrad $31, %xmm4
970 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [2147483648,2147483648,2147483648,2147483648]
971 ; SSSE3-NEXT: pxor %xmm9, %xmm4
972 ; SSSE3-NEXT: pand %xmm4, %xmm0
973 ; SSSE3-NEXT: por %xmm10, %xmm0
974 ; SSSE3-NEXT: pxor %xmm4, %xmm4
975 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm4
976 ; SSSE3-NEXT: paddd %xmm1, %xmm5
977 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm1
978 ; SSSE3-NEXT: pxor %xmm4, %xmm1
979 ; SSSE3-NEXT: movdqa %xmm1, %xmm4
980 ; SSSE3-NEXT: pandn %xmm5, %xmm4
981 ; SSSE3-NEXT: psrad $31, %xmm5
982 ; SSSE3-NEXT: pxor %xmm9, %xmm5
983 ; SSSE3-NEXT: pand %xmm5, %xmm1
984 ; SSSE3-NEXT: por %xmm4, %xmm1
985 ; SSSE3-NEXT: pxor %xmm4, %xmm4
986 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm4
987 ; SSSE3-NEXT: paddd %xmm2, %xmm6
988 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm2
989 ; SSSE3-NEXT: pxor %xmm4, %xmm2
990 ; SSSE3-NEXT: movdqa %xmm2, %xmm4
991 ; SSSE3-NEXT: pandn %xmm6, %xmm4
992 ; SSSE3-NEXT: psrad $31, %xmm6
993 ; SSSE3-NEXT: pxor %xmm9, %xmm6
994 ; SSSE3-NEXT: pand %xmm6, %xmm2
995 ; SSSE3-NEXT: por %xmm4, %xmm2
996 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm8
997 ; SSSE3-NEXT: paddd %xmm3, %xmm7
998 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm3
999 ; SSSE3-NEXT: pxor %xmm8, %xmm3
1000 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
1001 ; SSSE3-NEXT: pandn %xmm7, %xmm4
1002 ; SSSE3-NEXT: psrad $31, %xmm7
1003 ; SSSE3-NEXT: pxor %xmm7, %xmm9
1004 ; SSSE3-NEXT: pand %xmm9, %xmm3
1005 ; SSSE3-NEXT: por %xmm4, %xmm3
1008 ; SSE41-LABEL: v16i32:
1010 ; SSE41-NEXT: movdqa %xmm3, %xmm11
1011 ; SSE41-NEXT: movdqa %xmm2, %xmm8
1012 ; SSE41-NEXT: movdqa %xmm1, %xmm9
1013 ; SSE41-NEXT: movdqa %xmm0, %xmm10
1014 ; SSE41-NEXT: paddd %xmm4, %xmm10
1015 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm0
1016 ; SSE41-NEXT: pxor %xmm4, %xmm0
1017 ; SSE41-NEXT: movdqa %xmm10, %xmm1
1018 ; SSE41-NEXT: psrad $31, %xmm1
1019 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
1020 ; SSE41-NEXT: pxor %xmm4, %xmm1
1021 ; SSE41-NEXT: blendvps %xmm0, %xmm1, %xmm10
1022 ; SSE41-NEXT: movdqa %xmm9, %xmm1
1023 ; SSE41-NEXT: paddd %xmm5, %xmm1
1024 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm9
1025 ; SSE41-NEXT: pxor %xmm5, %xmm9
1026 ; SSE41-NEXT: movdqa %xmm1, %xmm2
1027 ; SSE41-NEXT: psrad $31, %xmm2
1028 ; SSE41-NEXT: pxor %xmm4, %xmm2
1029 ; SSE41-NEXT: movdqa %xmm9, %xmm0
1030 ; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm1
1031 ; SSE41-NEXT: movdqa %xmm8, %xmm2
1032 ; SSE41-NEXT: paddd %xmm6, %xmm2
1033 ; SSE41-NEXT: pcmpgtd %xmm2, %xmm8
1034 ; SSE41-NEXT: pxor %xmm6, %xmm8
1035 ; SSE41-NEXT: movdqa %xmm2, %xmm3
1036 ; SSE41-NEXT: psrad $31, %xmm3
1037 ; SSE41-NEXT: pxor %xmm4, %xmm3
1038 ; SSE41-NEXT: movdqa %xmm8, %xmm0
1039 ; SSE41-NEXT: blendvps %xmm0, %xmm3, %xmm2
1040 ; SSE41-NEXT: movdqa %xmm11, %xmm3
1041 ; SSE41-NEXT: paddd %xmm7, %xmm3
1042 ; SSE41-NEXT: pcmpgtd %xmm3, %xmm11
1043 ; SSE41-NEXT: pxor %xmm7, %xmm11
1044 ; SSE41-NEXT: movdqa %xmm3, %xmm5
1045 ; SSE41-NEXT: psrad $31, %xmm5
1046 ; SSE41-NEXT: pxor %xmm4, %xmm5
1047 ; SSE41-NEXT: movdqa %xmm11, %xmm0
1048 ; SSE41-NEXT: blendvps %xmm0, %xmm5, %xmm3
1049 ; SSE41-NEXT: movaps %xmm10, %xmm0
1052 ; AVX1-LABEL: v16i32:
1054 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
1055 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
1056 ; AVX1-NEXT: vpaddd %xmm4, %xmm5, %xmm4
1057 ; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm6
1058 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm6, %ymm7
1059 ; AVX1-NEXT: vpcmpgtd %xmm4, %xmm5, %xmm5
1060 ; AVX1-NEXT: vpcmpgtd %xmm6, %xmm0, %xmm0
1061 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm0, %ymm0
1062 ; AVX1-NEXT: vxorps %ymm0, %ymm2, %ymm0
1063 ; AVX1-NEXT: vpsrad $31, %xmm6, %xmm2
1064 ; AVX1-NEXT: vpsrad $31, %xmm4, %xmm4
1065 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm2, %ymm2
1066 ; AVX1-NEXT: vbroadcastss {{.*#+}} ymm4 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1067 ; AVX1-NEXT: vxorps %ymm4, %ymm2, %ymm2
1068 ; AVX1-NEXT: vblendvps %ymm0, %ymm2, %ymm7, %ymm0
1069 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm2
1070 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
1071 ; AVX1-NEXT: vpaddd %xmm2, %xmm5, %xmm2
1072 ; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm6
1073 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm6, %ymm7
1074 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm5, %xmm5
1075 ; AVX1-NEXT: vpcmpgtd %xmm6, %xmm1, %xmm1
1076 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm1, %ymm1
1077 ; AVX1-NEXT: vxorps %ymm1, %ymm3, %ymm1
1078 ; AVX1-NEXT: vpsrad $31, %xmm6, %xmm3
1079 ; AVX1-NEXT: vpsrad $31, %xmm2, %xmm2
1080 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm3, %ymm2
1081 ; AVX1-NEXT: vxorps %ymm4, %ymm2, %ymm2
1082 ; AVX1-NEXT: vblendvps %ymm1, %ymm2, %ymm7, %ymm1
1085 ; AVX2-LABEL: v16i32:
1087 ; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm4
1088 ; AVX2-NEXT: vpcmpgtd %ymm4, %ymm0, %ymm0
1089 ; AVX2-NEXT: vpxor %ymm0, %ymm2, %ymm0
1090 ; AVX2-NEXT: vpsrad $31, %ymm4, %ymm2
1091 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm5 = [2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648,2147483648]
1092 ; AVX2-NEXT: vpxor %ymm5, %ymm2, %ymm2
1093 ; AVX2-NEXT: vblendvps %ymm0, %ymm2, %ymm4, %ymm0
1094 ; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm2
1095 ; AVX2-NEXT: vpcmpgtd %ymm2, %ymm1, %ymm1
1096 ; AVX2-NEXT: vpxor %ymm1, %ymm3, %ymm1
1097 ; AVX2-NEXT: vpsrad $31, %ymm2, %ymm3
1098 ; AVX2-NEXT: vpxor %ymm5, %ymm3, %ymm3
1099 ; AVX2-NEXT: vblendvps %ymm1, %ymm3, %ymm2, %ymm1
1102 ; AVX512-LABEL: v16i32:
1104 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
1105 ; AVX512-NEXT: vpcmpgtd %zmm1, %zmm2, %k0
1106 ; AVX512-NEXT: vpaddd %zmm1, %zmm0, %zmm1
1107 ; AVX512-NEXT: vpcmpgtd %zmm1, %zmm0, %k1
1108 ; AVX512-NEXT: kxorw %k1, %k0, %k1
1109 ; AVX512-NEXT: vpsrad $31, %zmm1, %zmm0
1110 ; AVX512-NEXT: vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm1 {%k1}
1111 ; AVX512-NEXT: vmovdqa64 %zmm1, %zmm0
1113 %z = call <16 x i32> @llvm.sadd.sat.v16i32(<16 x i32> %x, <16 x i32> %y)
1117 define <2 x i64> @v2i64(<2 x i64> %x, <2 x i64> %y) nounwind {
1118 ; SSE2-LABEL: v2i64:
1120 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1121 ; SSE2-NEXT: movdqa %xmm0, %xmm3
1122 ; SSE2-NEXT: pxor %xmm2, %xmm3
1123 ; SSE2-NEXT: paddq %xmm1, %xmm0
1124 ; SSE2-NEXT: pxor %xmm0, %xmm2
1125 ; SSE2-NEXT: movdqa %xmm3, %xmm4
1126 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm4
1127 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1128 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
1129 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1130 ; SSE2-NEXT: pand %xmm5, %xmm2
1131 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1132 ; SSE2-NEXT: por %xmm2, %xmm3
1133 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1134 ; SSE2-NEXT: pxor %xmm2, %xmm2
1135 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
1136 ; SSE2-NEXT: pxor %xmm3, %xmm2
1137 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
1138 ; SSE2-NEXT: psrad $31, %xmm1
1139 ; SSE2-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1140 ; SSE2-NEXT: pand %xmm2, %xmm1
1141 ; SSE2-NEXT: pandn %xmm0, %xmm2
1142 ; SSE2-NEXT: por %xmm2, %xmm1
1143 ; SSE2-NEXT: movdqa %xmm1, %xmm0
1146 ; SSSE3-LABEL: v2i64:
1148 ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
1149 ; SSSE3-NEXT: movdqa %xmm0, %xmm3
1150 ; SSSE3-NEXT: pxor %xmm2, %xmm3
1151 ; SSSE3-NEXT: paddq %xmm1, %xmm0
1152 ; SSSE3-NEXT: pxor %xmm0, %xmm2
1153 ; SSSE3-NEXT: movdqa %xmm3, %xmm4
1154 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4
1155 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
1156 ; SSSE3-NEXT: pcmpeqd %xmm3, %xmm2
1157 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1158 ; SSSE3-NEXT: pand %xmm5, %xmm2
1159 ; SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
1160 ; SSSE3-NEXT: por %xmm2, %xmm3
1161 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1162 ; SSSE3-NEXT: pxor %xmm2, %xmm2
1163 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2
1164 ; SSSE3-NEXT: pxor %xmm3, %xmm2
1165 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
1166 ; SSSE3-NEXT: psrad $31, %xmm1
1167 ; SSSE3-NEXT: pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1168 ; SSSE3-NEXT: pand %xmm2, %xmm1
1169 ; SSSE3-NEXT: pandn %xmm0, %xmm2
1170 ; SSSE3-NEXT: por %xmm2, %xmm1
1171 ; SSSE3-NEXT: movdqa %xmm1, %xmm0
1174 ; SSE41-LABEL: v2i64:
1176 ; SSE41-NEXT: movdqa %xmm0, %xmm2
1177 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm0 = [2147483648,2147483648]
1178 ; SSE41-NEXT: movdqa %xmm2, %xmm4
1179 ; SSE41-NEXT: pxor %xmm0, %xmm4
1180 ; SSE41-NEXT: paddq %xmm1, %xmm2
1181 ; SSE41-NEXT: pxor %xmm2, %xmm0
1182 ; SSE41-NEXT: movdqa %xmm4, %xmm5
1183 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm5
1184 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm4
1185 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm4[0,0,2,2]
1186 ; SSE41-NEXT: pand %xmm5, %xmm3
1187 ; SSE41-NEXT: por %xmm4, %xmm3
1188 ; SSE41-NEXT: pxor %xmm1, %xmm3
1189 ; SSE41-NEXT: movapd {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
1190 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1191 ; SSE41-NEXT: blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
1192 ; SSE41-NEXT: movdqa %xmm3, %xmm0
1193 ; SSE41-NEXT: blendvpd %xmm0, %xmm1, %xmm2
1194 ; SSE41-NEXT: movapd %xmm2, %xmm0
1197 ; AVX1-LABEL: v2i64:
1199 ; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm2
1200 ; AVX1-NEXT: vmovddup {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1201 ; AVX1-NEXT: # xmm3 = mem[0,0]
1202 ; AVX1-NEXT: vblendvpd %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3
1203 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm0
1204 ; AVX1-NEXT: vpxor %xmm0, %xmm1, %xmm0
1205 ; AVX1-NEXT: vblendvpd %xmm0, %xmm3, %xmm2, %xmm0
1208 ; AVX2-LABEL: v2i64:
1210 ; AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm2
1211 ; AVX2-NEXT: vmovddup {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1212 ; AVX2-NEXT: # xmm3 = mem[0,0]
1213 ; AVX2-NEXT: vblendvpd %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3
1214 ; AVX2-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm0
1215 ; AVX2-NEXT: vpxor %xmm0, %xmm1, %xmm0
1216 ; AVX2-NEXT: vblendvpd %xmm0, %xmm3, %xmm2, %xmm0
1219 ; AVX512F-LABEL: v2i64:
1221 ; AVX512F-NEXT: vpaddq %xmm1, %xmm0, %xmm2
1222 ; AVX512F-NEXT: vmovddup {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
1223 ; AVX512F-NEXT: # xmm3 = mem[0,0]
1224 ; AVX512F-NEXT: vblendvpd %xmm2, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3, %xmm3
1225 ; AVX512F-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm0
1226 ; AVX512F-NEXT: vpxor %xmm0, %xmm1, %xmm0
1227 ; AVX512F-NEXT: vblendvpd %xmm0, %xmm3, %xmm2, %xmm0
1228 ; AVX512F-NEXT: retq
1230 ; AVX512BW-LABEL: v2i64:
1231 ; AVX512BW: # %bb.0:
1232 ; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2
1233 ; AVX512BW-NEXT: vpcmpgtq %xmm1, %xmm2, %k0
1234 ; AVX512BW-NEXT: vpaddq %xmm1, %xmm0, %xmm1
1235 ; AVX512BW-NEXT: vpcmpgtq %xmm1, %xmm0, %k1
1236 ; AVX512BW-NEXT: kxorw %k1, %k0, %k1
1237 ; AVX512BW-NEXT: vpcmpgtq %xmm1, %xmm2, %k2
1238 ; AVX512BW-NEXT: vpbroadcastq {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
1239 ; AVX512BW-NEXT: vpbroadcastq {{.*#+}} xmm0 {%k2} = [9223372036854775807,9223372036854775807]
1240 ; AVX512BW-NEXT: vmovdqa64 %xmm0, %xmm1 {%k1}
1241 ; AVX512BW-NEXT: vmovdqa %xmm1, %xmm0
1242 ; AVX512BW-NEXT: retq
1243 %z = call <2 x i64> @llvm.sadd.sat.v2i64(<2 x i64> %x, <2 x i64> %y)
1247 define <4 x i64> @v4i64(<4 x i64> %x, <4 x i64> %y) nounwind {
1248 ; SSE2-LABEL: v4i64:
1250 ; SSE2-NEXT: movdqa %xmm0, %xmm4
1251 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648]
1252 ; SSE2-NEXT: pxor %xmm6, %xmm0
1253 ; SSE2-NEXT: paddq %xmm2, %xmm4
1254 ; SSE2-NEXT: movdqa %xmm4, %xmm5
1255 ; SSE2-NEXT: pxor %xmm6, %xmm5
1256 ; SSE2-NEXT: movdqa %xmm0, %xmm7
1257 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm7
1258 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
1259 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm5
1260 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
1261 ; SSE2-NEXT: pand %xmm8, %xmm0
1262 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1263 ; SSE2-NEXT: por %xmm0, %xmm7
1264 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
1265 ; SSE2-NEXT: pxor %xmm5, %xmm5
1266 ; SSE2-NEXT: pxor %xmm2, %xmm2
1267 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
1268 ; SSE2-NEXT: pxor %xmm7, %xmm2
1269 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1270 ; SSE2-NEXT: psrad $31, %xmm0
1271 ; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [9223372036854775808,9223372036854775808]
1272 ; SSE2-NEXT: pxor %xmm7, %xmm0
1273 ; SSE2-NEXT: pand %xmm2, %xmm0
1274 ; SSE2-NEXT: pandn %xmm4, %xmm2
1275 ; SSE2-NEXT: por %xmm2, %xmm0
1276 ; SSE2-NEXT: movdqa %xmm1, %xmm2
1277 ; SSE2-NEXT: pxor %xmm6, %xmm2
1278 ; SSE2-NEXT: paddq %xmm3, %xmm1
1279 ; SSE2-NEXT: pxor %xmm1, %xmm6
1280 ; SSE2-NEXT: movdqa %xmm2, %xmm4
1281 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm4
1282 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2]
1283 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm6
1284 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
1285 ; SSE2-NEXT: pand %xmm8, %xmm2
1286 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1287 ; SSE2-NEXT: por %xmm2, %xmm4
1288 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1289 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm5
1290 ; SSE2-NEXT: pxor %xmm4, %xmm5
1291 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1292 ; SSE2-NEXT: psrad $31, %xmm2
1293 ; SSE2-NEXT: pxor %xmm7, %xmm2
1294 ; SSE2-NEXT: pand %xmm5, %xmm2
1295 ; SSE2-NEXT: pandn %xmm1, %xmm5
1296 ; SSE2-NEXT: por %xmm5, %xmm2
1297 ; SSE2-NEXT: movdqa %xmm2, %xmm1
1300 ; SSSE3-LABEL: v4i64:
1302 ; SSSE3-NEXT: movdqa %xmm0, %xmm4
1303 ; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648]
1304 ; SSSE3-NEXT: pxor %xmm6, %xmm0
1305 ; SSSE3-NEXT: paddq %xmm2, %xmm4
1306 ; SSSE3-NEXT: movdqa %xmm4, %xmm5
1307 ; SSSE3-NEXT: pxor %xmm6, %xmm5
1308 ; SSSE3-NEXT: movdqa %xmm0, %xmm7
1309 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm7
1310 ; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
1311 ; SSSE3-NEXT: pcmpeqd %xmm0, %xmm5
1312 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
1313 ; SSSE3-NEXT: pand %xmm8, %xmm0
1314 ; SSSE3-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1315 ; SSSE3-NEXT: por %xmm0, %xmm7
1316 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
1317 ; SSSE3-NEXT: pxor %xmm5, %xmm5
1318 ; SSSE3-NEXT: pxor %xmm2, %xmm2
1319 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm2
1320 ; SSSE3-NEXT: pxor %xmm7, %xmm2
1321 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1322 ; SSSE3-NEXT: psrad $31, %xmm0
1323 ; SSSE3-NEXT: movdqa {{.*#+}} xmm7 = [9223372036854775808,9223372036854775808]
1324 ; SSSE3-NEXT: pxor %xmm7, %xmm0
1325 ; SSSE3-NEXT: pand %xmm2, %xmm0
1326 ; SSSE3-NEXT: pandn %xmm4, %xmm2
1327 ; SSSE3-NEXT: por %xmm2, %xmm0
1328 ; SSSE3-NEXT: movdqa %xmm1, %xmm2
1329 ; SSSE3-NEXT: pxor %xmm6, %xmm2
1330 ; SSSE3-NEXT: paddq %xmm3, %xmm1
1331 ; SSSE3-NEXT: pxor %xmm1, %xmm6
1332 ; SSSE3-NEXT: movdqa %xmm2, %xmm4
1333 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm4
1334 ; SSSE3-NEXT: pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2]
1335 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm6
1336 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
1337 ; SSSE3-NEXT: pand %xmm8, %xmm2
1338 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1339 ; SSSE3-NEXT: por %xmm2, %xmm4
1340 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
1341 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm5
1342 ; SSSE3-NEXT: pxor %xmm4, %xmm5
1343 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1344 ; SSSE3-NEXT: psrad $31, %xmm2
1345 ; SSSE3-NEXT: pxor %xmm7, %xmm2
1346 ; SSSE3-NEXT: pand %xmm5, %xmm2
1347 ; SSSE3-NEXT: pandn %xmm1, %xmm5
1348 ; SSSE3-NEXT: por %xmm5, %xmm2
1349 ; SSSE3-NEXT: movdqa %xmm2, %xmm1
1352 ; SSE41-LABEL: v4i64:
1354 ; SSE41-NEXT: movdqa %xmm0, %xmm4
1355 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm6 = [2147483648,2147483648]
1356 ; SSE41-NEXT: pxor %xmm6, %xmm0
1357 ; SSE41-NEXT: paddq %xmm2, %xmm4
1358 ; SSE41-NEXT: movdqa %xmm4, %xmm5
1359 ; SSE41-NEXT: pxor %xmm6, %xmm5
1360 ; SSE41-NEXT: movdqa %xmm0, %xmm7
1361 ; SSE41-NEXT: pcmpeqd %xmm5, %xmm7
1362 ; SSE41-NEXT: pcmpgtd %xmm5, %xmm0
1363 ; SSE41-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2]
1364 ; SSE41-NEXT: pand %xmm7, %xmm5
1365 ; SSE41-NEXT: por %xmm0, %xmm5
1366 ; SSE41-NEXT: pxor %xmm2, %xmm5
1367 ; SSE41-NEXT: movapd {{.*#+}} xmm7 = [9223372036854775807,9223372036854775807]
1368 ; SSE41-NEXT: movapd {{.*#+}} xmm8 = [9223372036854775808,9223372036854775808]
1369 ; SSE41-NEXT: movapd %xmm8, %xmm2
1370 ; SSE41-NEXT: movdqa %xmm4, %xmm0
1371 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm2
1372 ; SSE41-NEXT: movdqa %xmm5, %xmm0
1373 ; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm4
1374 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1375 ; SSE41-NEXT: pxor %xmm6, %xmm0
1376 ; SSE41-NEXT: paddq %xmm3, %xmm1
1377 ; SSE41-NEXT: pxor %xmm1, %xmm6
1378 ; SSE41-NEXT: movdqa %xmm0, %xmm5
1379 ; SSE41-NEXT: pcmpeqd %xmm6, %xmm5
1380 ; SSE41-NEXT: pcmpgtd %xmm6, %xmm0
1381 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
1382 ; SSE41-NEXT: pand %xmm5, %xmm2
1383 ; SSE41-NEXT: por %xmm0, %xmm2
1384 ; SSE41-NEXT: pxor %xmm3, %xmm2
1385 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1386 ; SSE41-NEXT: blendvpd %xmm0, %xmm7, %xmm8
1387 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1388 ; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm1
1389 ; SSE41-NEXT: movapd %xmm4, %xmm0
1392 ; AVX1-LABEL: v4i64:
1394 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
1395 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1396 ; AVX1-NEXT: vpaddq %xmm2, %xmm3, %xmm2
1397 ; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm4
1398 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm4, %ymm5
1399 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm3
1400 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm0
1401 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
1402 ; AVX1-NEXT: vxorpd %ymm0, %ymm1, %ymm0
1403 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
1404 ; AVX1-NEXT: vpcmpgtq %xmm2, %xmm1, %xmm2
1405 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm1, %xmm1
1406 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
1407 ; AVX1-NEXT: vxorpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
1408 ; AVX1-NEXT: vblendvpd %ymm0, %ymm1, %ymm5, %ymm0
1411 ; AVX2-LABEL: v4i64:
1413 ; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm2
1414 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm0
1415 ; AVX2-NEXT: vpxor %ymm0, %ymm1, %ymm0
1416 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
1417 ; AVX2-NEXT: vpcmpgtq %ymm2, %ymm1, %ymm1
1418 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1419 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
1420 ; AVX2-NEXT: vblendvpd %ymm0, %ymm1, %ymm2, %ymm0
1423 ; AVX512F-LABEL: v4i64:
1425 ; AVX512F-NEXT: vpaddq %ymm1, %ymm0, %ymm2
1426 ; AVX512F-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm0
1427 ; AVX512F-NEXT: vpxor %ymm0, %ymm1, %ymm0
1428 ; AVX512F-NEXT: vpsraq $63, %zmm2, %zmm1
1429 ; AVX512F-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1430 ; AVX512F-NEXT: vpxor %ymm3, %ymm1, %ymm1
1431 ; AVX512F-NEXT: vblendvpd %ymm0, %ymm1, %ymm2, %ymm0
1432 ; AVX512F-NEXT: retq
1434 ; AVX512BW-LABEL: v4i64:
1435 ; AVX512BW: # %bb.0:
1436 ; AVX512BW-NEXT: vpxor %xmm2, %xmm2, %xmm2
1437 ; AVX512BW-NEXT: vpcmpgtq %ymm1, %ymm2, %k0
1438 ; AVX512BW-NEXT: vpaddq %ymm1, %ymm0, %ymm1
1439 ; AVX512BW-NEXT: vpcmpgtq %ymm1, %ymm0, %k1
1440 ; AVX512BW-NEXT: kxorw %k1, %k0, %k1
1441 ; AVX512BW-NEXT: vpsraq $63, %ymm1, %ymm0
1442 ; AVX512BW-NEXT: vpxorq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm1 {%k1}
1443 ; AVX512BW-NEXT: vmovdqa %ymm1, %ymm0
1444 ; AVX512BW-NEXT: retq
1445 %z = call <4 x i64> @llvm.sadd.sat.v4i64(<4 x i64> %x, <4 x i64> %y)
1449 define <8 x i64> @v8i64(<8 x i64> %x, <8 x i64> %y) nounwind {
1450 ; SSE2-LABEL: v8i64:
1452 ; SSE2-NEXT: movdqa %xmm1, %xmm8
1453 ; SSE2-NEXT: movdqa %xmm0, %xmm1
1454 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147483648,2147483648]
1455 ; SSE2-NEXT: pxor %xmm10, %xmm0
1456 ; SSE2-NEXT: paddq %xmm4, %xmm1
1457 ; SSE2-NEXT: movdqa %xmm1, %xmm9
1458 ; SSE2-NEXT: pxor %xmm10, %xmm9
1459 ; SSE2-NEXT: movdqa %xmm0, %xmm11
1460 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm11
1461 ; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1462 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm9
1463 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm9[1,1,3,3]
1464 ; SSE2-NEXT: pand %xmm12, %xmm0
1465 ; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]
1466 ; SSE2-NEXT: por %xmm0, %xmm11
1467 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1468 ; SSE2-NEXT: pxor %xmm9, %xmm9
1469 ; SSE2-NEXT: pxor %xmm4, %xmm4
1470 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm4
1471 ; SSE2-NEXT: pxor %xmm11, %xmm4
1472 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1473 ; SSE2-NEXT: psrad $31, %xmm0
1474 ; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [9223372036854775808,9223372036854775808]
1475 ; SSE2-NEXT: pxor %xmm11, %xmm0
1476 ; SSE2-NEXT: pand %xmm4, %xmm0
1477 ; SSE2-NEXT: pandn %xmm1, %xmm4
1478 ; SSE2-NEXT: por %xmm4, %xmm0
1479 ; SSE2-NEXT: movdqa %xmm8, %xmm1
1480 ; SSE2-NEXT: pxor %xmm10, %xmm1
1481 ; SSE2-NEXT: paddq %xmm5, %xmm8
1482 ; SSE2-NEXT: movdqa %xmm8, %xmm4
1483 ; SSE2-NEXT: pxor %xmm10, %xmm4
1484 ; SSE2-NEXT: movdqa %xmm1, %xmm12
1485 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm12
1486 ; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
1487 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm4
1488 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
1489 ; SSE2-NEXT: pand %xmm13, %xmm1
1490 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm12[1,1,3,3]
1491 ; SSE2-NEXT: por %xmm1, %xmm4
1492 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]
1493 ; SSE2-NEXT: pxor %xmm5, %xmm5
1494 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm5
1495 ; SSE2-NEXT: pxor %xmm4, %xmm5
1496 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3]
1497 ; SSE2-NEXT: psrad $31, %xmm1
1498 ; SSE2-NEXT: pxor %xmm11, %xmm1
1499 ; SSE2-NEXT: pand %xmm5, %xmm1
1500 ; SSE2-NEXT: pandn %xmm8, %xmm5
1501 ; SSE2-NEXT: por %xmm5, %xmm1
1502 ; SSE2-NEXT: movdqa %xmm2, %xmm4
1503 ; SSE2-NEXT: pxor %xmm10, %xmm4
1504 ; SSE2-NEXT: paddq %xmm6, %xmm2
1505 ; SSE2-NEXT: movdqa %xmm2, %xmm5
1506 ; SSE2-NEXT: pxor %xmm10, %xmm5
1507 ; SSE2-NEXT: movdqa %xmm4, %xmm8
1508 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm8
1509 ; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm8[0,0,2,2]
1510 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm5
1511 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1512 ; SSE2-NEXT: pand %xmm12, %xmm4
1513 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]
1514 ; SSE2-NEXT: por %xmm4, %xmm5
1515 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
1516 ; SSE2-NEXT: pxor %xmm6, %xmm6
1517 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm6
1518 ; SSE2-NEXT: pxor %xmm5, %xmm6
1519 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
1520 ; SSE2-NEXT: psrad $31, %xmm4
1521 ; SSE2-NEXT: pxor %xmm11, %xmm4
1522 ; SSE2-NEXT: pand %xmm6, %xmm4
1523 ; SSE2-NEXT: pandn %xmm2, %xmm6
1524 ; SSE2-NEXT: por %xmm6, %xmm4
1525 ; SSE2-NEXT: movdqa %xmm3, %xmm2
1526 ; SSE2-NEXT: pxor %xmm10, %xmm2
1527 ; SSE2-NEXT: paddq %xmm7, %xmm3
1528 ; SSE2-NEXT: pxor %xmm3, %xmm10
1529 ; SSE2-NEXT: movdqa %xmm2, %xmm5
1530 ; SSE2-NEXT: pcmpgtd %xmm10, %xmm5
1531 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1532 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm10
1533 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]
1534 ; SSE2-NEXT: pand %xmm6, %xmm2
1535 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1536 ; SSE2-NEXT: por %xmm2, %xmm5
1537 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]
1538 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm9
1539 ; SSE2-NEXT: pxor %xmm5, %xmm9
1540 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]
1541 ; SSE2-NEXT: psrad $31, %xmm5
1542 ; SSE2-NEXT: pxor %xmm11, %xmm5
1543 ; SSE2-NEXT: pand %xmm9, %xmm5
1544 ; SSE2-NEXT: pandn %xmm3, %xmm9
1545 ; SSE2-NEXT: por %xmm9, %xmm5
1546 ; SSE2-NEXT: movdqa %xmm4, %xmm2
1547 ; SSE2-NEXT: movdqa %xmm5, %xmm3
1550 ; SSSE3-LABEL: v8i64:
1552 ; SSSE3-NEXT: movdqa %xmm1, %xmm8
1553 ; SSSE3-NEXT: movdqa %xmm0, %xmm1
1554 ; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [2147483648,2147483648]
1555 ; SSSE3-NEXT: pxor %xmm10, %xmm0
1556 ; SSSE3-NEXT: paddq %xmm4, %xmm1
1557 ; SSSE3-NEXT: movdqa %xmm1, %xmm9
1558 ; SSSE3-NEXT: pxor %xmm10, %xmm9
1559 ; SSSE3-NEXT: movdqa %xmm0, %xmm11
1560 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm11
1561 ; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
1562 ; SSSE3-NEXT: pcmpeqd %xmm0, %xmm9
1563 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm9[1,1,3,3]
1564 ; SSSE3-NEXT: pand %xmm12, %xmm0
1565 ; SSSE3-NEXT: pshufd {{.*#+}} xmm11 = xmm11[1,1,3,3]
1566 ; SSSE3-NEXT: por %xmm0, %xmm11
1567 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
1568 ; SSSE3-NEXT: pxor %xmm9, %xmm9
1569 ; SSSE3-NEXT: pxor %xmm4, %xmm4
1570 ; SSSE3-NEXT: pcmpgtd %xmm0, %xmm4
1571 ; SSSE3-NEXT: pxor %xmm11, %xmm4
1572 ; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
1573 ; SSSE3-NEXT: psrad $31, %xmm0
1574 ; SSSE3-NEXT: movdqa {{.*#+}} xmm11 = [9223372036854775808,9223372036854775808]
1575 ; SSSE3-NEXT: pxor %xmm11, %xmm0
1576 ; SSSE3-NEXT: pand %xmm4, %xmm0
1577 ; SSSE3-NEXT: pandn %xmm1, %xmm4
1578 ; SSSE3-NEXT: por %xmm4, %xmm0
1579 ; SSSE3-NEXT: movdqa %xmm8, %xmm1
1580 ; SSSE3-NEXT: pxor %xmm10, %xmm1
1581 ; SSSE3-NEXT: paddq %xmm5, %xmm8
1582 ; SSSE3-NEXT: movdqa %xmm8, %xmm4
1583 ; SSSE3-NEXT: pxor %xmm10, %xmm4
1584 ; SSSE3-NEXT: movdqa %xmm1, %xmm12
1585 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm12
1586 ; SSSE3-NEXT: pshufd {{.*#+}} xmm13 = xmm12[0,0,2,2]
1587 ; SSSE3-NEXT: pcmpeqd %xmm1, %xmm4
1588 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
1589 ; SSSE3-NEXT: pand %xmm13, %xmm1
1590 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm12[1,1,3,3]
1591 ; SSSE3-NEXT: por %xmm1, %xmm4
1592 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]
1593 ; SSSE3-NEXT: pxor %xmm5, %xmm5
1594 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm5
1595 ; SSSE3-NEXT: pxor %xmm4, %xmm5
1596 ; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3]
1597 ; SSSE3-NEXT: psrad $31, %xmm1
1598 ; SSSE3-NEXT: pxor %xmm11, %xmm1
1599 ; SSSE3-NEXT: pand %xmm5, %xmm1
1600 ; SSSE3-NEXT: pandn %xmm8, %xmm5
1601 ; SSSE3-NEXT: por %xmm5, %xmm1
1602 ; SSSE3-NEXT: movdqa %xmm2, %xmm4
1603 ; SSSE3-NEXT: pxor %xmm10, %xmm4
1604 ; SSSE3-NEXT: paddq %xmm6, %xmm2
1605 ; SSSE3-NEXT: movdqa %xmm2, %xmm5
1606 ; SSSE3-NEXT: pxor %xmm10, %xmm5
1607 ; SSSE3-NEXT: movdqa %xmm4, %xmm8
1608 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm8
1609 ; SSSE3-NEXT: pshufd {{.*#+}} xmm12 = xmm8[0,0,2,2]
1610 ; SSSE3-NEXT: pcmpeqd %xmm4, %xmm5
1611 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
1612 ; SSSE3-NEXT: pand %xmm12, %xmm4
1613 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm8[1,1,3,3]
1614 ; SSSE3-NEXT: por %xmm4, %xmm5
1615 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
1616 ; SSSE3-NEXT: pxor %xmm6, %xmm6
1617 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6
1618 ; SSSE3-NEXT: pxor %xmm5, %xmm6
1619 ; SSSE3-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
1620 ; SSSE3-NEXT: psrad $31, %xmm4
1621 ; SSSE3-NEXT: pxor %xmm11, %xmm4
1622 ; SSSE3-NEXT: pand %xmm6, %xmm4
1623 ; SSSE3-NEXT: pandn %xmm2, %xmm6
1624 ; SSSE3-NEXT: por %xmm6, %xmm4
1625 ; SSSE3-NEXT: movdqa %xmm3, %xmm2
1626 ; SSSE3-NEXT: pxor %xmm10, %xmm2
1627 ; SSSE3-NEXT: paddq %xmm7, %xmm3
1628 ; SSSE3-NEXT: pxor %xmm3, %xmm10
1629 ; SSSE3-NEXT: movdqa %xmm2, %xmm5
1630 ; SSSE3-NEXT: pcmpgtd %xmm10, %xmm5
1631 ; SSSE3-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
1632 ; SSSE3-NEXT: pcmpeqd %xmm2, %xmm10
1633 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm10[1,1,3,3]
1634 ; SSSE3-NEXT: pand %xmm6, %xmm2
1635 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
1636 ; SSSE3-NEXT: por %xmm2, %xmm5
1637 ; SSSE3-NEXT: pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]
1638 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm9
1639 ; SSSE3-NEXT: pxor %xmm5, %xmm9
1640 ; SSSE3-NEXT: pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]
1641 ; SSSE3-NEXT: psrad $31, %xmm5
1642 ; SSSE3-NEXT: pxor %xmm11, %xmm5
1643 ; SSSE3-NEXT: pand %xmm9, %xmm5
1644 ; SSSE3-NEXT: pandn %xmm3, %xmm9
1645 ; SSSE3-NEXT: por %xmm9, %xmm5
1646 ; SSSE3-NEXT: movdqa %xmm4, %xmm2
1647 ; SSSE3-NEXT: movdqa %xmm5, %xmm3
1650 ; SSE41-LABEL: v8i64:
1652 ; SSE41-NEXT: movdqa %xmm0, %xmm8
1653 ; SSE41-NEXT: pmovzxdq {{.*#+}} xmm10 = [2147483648,2147483648]
1654 ; SSE41-NEXT: pxor %xmm10, %xmm0
1655 ; SSE41-NEXT: paddq %xmm4, %xmm8
1656 ; SSE41-NEXT: movdqa %xmm8, %xmm9
1657 ; SSE41-NEXT: pxor %xmm10, %xmm9
1658 ; SSE41-NEXT: movdqa %xmm0, %xmm11
1659 ; SSE41-NEXT: pcmpeqd %xmm9, %xmm11
1660 ; SSE41-NEXT: pcmpgtd %xmm9, %xmm0
1661 ; SSE41-NEXT: pshufd {{.*#+}} xmm9 = xmm0[0,0,2,2]
1662 ; SSE41-NEXT: pand %xmm11, %xmm9
1663 ; SSE41-NEXT: por %xmm0, %xmm9
1664 ; SSE41-NEXT: pxor %xmm4, %xmm9
1665 ; SSE41-NEXT: movapd {{.*#+}} xmm12 = [9223372036854775807,9223372036854775807]
1666 ; SSE41-NEXT: movapd {{.*#+}} xmm11 = [9223372036854775808,9223372036854775808]
1667 ; SSE41-NEXT: movapd %xmm11, %xmm4
1668 ; SSE41-NEXT: movdqa %xmm8, %xmm0
1669 ; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm4
1670 ; SSE41-NEXT: movdqa %xmm9, %xmm0
1671 ; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm8
1672 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1673 ; SSE41-NEXT: pxor %xmm10, %xmm0
1674 ; SSE41-NEXT: paddq %xmm5, %xmm1
1675 ; SSE41-NEXT: movdqa %xmm1, %xmm4
1676 ; SSE41-NEXT: pxor %xmm10, %xmm4
1677 ; SSE41-NEXT: movdqa %xmm0, %xmm9
1678 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm9
1679 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm0
1680 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1681 ; SSE41-NEXT: pand %xmm9, %xmm4
1682 ; SSE41-NEXT: por %xmm0, %xmm4
1683 ; SSE41-NEXT: pxor %xmm5, %xmm4
1684 ; SSE41-NEXT: movapd %xmm11, %xmm5
1685 ; SSE41-NEXT: movdqa %xmm1, %xmm0
1686 ; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm5
1687 ; SSE41-NEXT: movdqa %xmm4, %xmm0
1688 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm1
1689 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1690 ; SSE41-NEXT: pxor %xmm10, %xmm0
1691 ; SSE41-NEXT: paddq %xmm6, %xmm2
1692 ; SSE41-NEXT: movdqa %xmm2, %xmm4
1693 ; SSE41-NEXT: pxor %xmm10, %xmm4
1694 ; SSE41-NEXT: movdqa %xmm0, %xmm5
1695 ; SSE41-NEXT: pcmpeqd %xmm4, %xmm5
1696 ; SSE41-NEXT: pcmpgtd %xmm4, %xmm0
1697 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1698 ; SSE41-NEXT: pand %xmm5, %xmm4
1699 ; SSE41-NEXT: por %xmm0, %xmm4
1700 ; SSE41-NEXT: pxor %xmm6, %xmm4
1701 ; SSE41-NEXT: movapd %xmm11, %xmm5
1702 ; SSE41-NEXT: movdqa %xmm2, %xmm0
1703 ; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm5
1704 ; SSE41-NEXT: movdqa %xmm4, %xmm0
1705 ; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm2
1706 ; SSE41-NEXT: movdqa %xmm3, %xmm0
1707 ; SSE41-NEXT: pxor %xmm10, %xmm0
1708 ; SSE41-NEXT: paddq %xmm7, %xmm3
1709 ; SSE41-NEXT: pxor %xmm3, %xmm10
1710 ; SSE41-NEXT: movdqa %xmm0, %xmm5
1711 ; SSE41-NEXT: pcmpeqd %xmm10, %xmm5
1712 ; SSE41-NEXT: pcmpgtd %xmm10, %xmm0
1713 ; SSE41-NEXT: pshufd {{.*#+}} xmm4 = xmm0[0,0,2,2]
1714 ; SSE41-NEXT: pand %xmm5, %xmm4
1715 ; SSE41-NEXT: por %xmm0, %xmm4
1716 ; SSE41-NEXT: pxor %xmm7, %xmm4
1717 ; SSE41-NEXT: movdqa %xmm3, %xmm0
1718 ; SSE41-NEXT: blendvpd %xmm0, %xmm12, %xmm11
1719 ; SSE41-NEXT: movdqa %xmm4, %xmm0
1720 ; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm3
1721 ; SSE41-NEXT: movapd %xmm8, %xmm0
1724 ; AVX1-LABEL: v8i64:
1726 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
1727 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5
1728 ; AVX1-NEXT: vpaddq %xmm4, %xmm5, %xmm4
1729 ; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm6
1730 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm6, %ymm7
1731 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm5
1732 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm0, %xmm0
1733 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm0, %ymm0
1734 ; AVX1-NEXT: vxorpd %ymm0, %ymm2, %ymm0
1735 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
1736 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm4
1737 ; AVX1-NEXT: vpcmpgtq %xmm6, %xmm2, %xmm5
1738 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm5, %ymm4
1739 ; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm5 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1740 ; AVX1-NEXT: vxorpd %ymm5, %ymm4, %ymm4
1741 ; AVX1-NEXT: vblendvpd %ymm0, %ymm4, %ymm7, %ymm0
1742 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
1743 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6
1744 ; AVX1-NEXT: vpaddq %xmm4, %xmm6, %xmm4
1745 ; AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm7
1746 ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm7, %ymm8
1747 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm6
1748 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm1, %xmm1
1749 ; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm1, %ymm1
1750 ; AVX1-NEXT: vxorpd %ymm1, %ymm3, %ymm1
1751 ; AVX1-NEXT: vpcmpgtq %xmm4, %xmm2, %xmm3
1752 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm2, %xmm2
1753 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2
1754 ; AVX1-NEXT: vxorpd %ymm5, %ymm2, %ymm2
1755 ; AVX1-NEXT: vblendvpd %ymm1, %ymm2, %ymm8, %ymm1
1758 ; AVX2-LABEL: v8i64:
1760 ; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm4
1761 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm0, %ymm0
1762 ; AVX2-NEXT: vpxor %ymm0, %ymm2, %ymm0
1763 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
1764 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm2, %ymm5
1765 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm6 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
1766 ; AVX2-NEXT: vpxor %ymm6, %ymm5, %ymm5
1767 ; AVX2-NEXT: vblendvpd %ymm0, %ymm5, %ymm4, %ymm0
1768 ; AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm4
1769 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm1, %ymm1
1770 ; AVX2-NEXT: vpxor %ymm1, %ymm3, %ymm1
1771 ; AVX2-NEXT: vpcmpgtq %ymm4, %ymm2, %ymm2
1772 ; AVX2-NEXT: vpxor %ymm6, %ymm2, %ymm2
1773 ; AVX2-NEXT: vblendvpd %ymm1, %ymm2, %ymm4, %ymm1
1776 ; AVX512-LABEL: v8i64:
1778 ; AVX512-NEXT: vpxor %xmm2, %xmm2, %xmm2
1779 ; AVX512-NEXT: vpcmpgtq %zmm1, %zmm2, %k0
1780 ; AVX512-NEXT: vpaddq %zmm1, %zmm0, %zmm1
1781 ; AVX512-NEXT: vpcmpgtq %zmm1, %zmm0, %k1
1782 ; AVX512-NEXT: kxorw %k1, %k0, %k1
1783 ; AVX512-NEXT: vpsraq $63, %zmm1, %zmm0
1784 ; AVX512-NEXT: vpxorq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm1 {%k1}
1785 ; AVX512-NEXT: vmovdqa64 %zmm1, %zmm0
1787 %z = call <8 x i64> @llvm.sadd.sat.v8i64(<8 x i64> %x, <8 x i64> %y)
1791 define <2 x i128> @v2i128(<2 x i128> %x, <2 x i128> %y) nounwind {
1792 ; SSE-LABEL: v2i128:
1794 ; SSE-NEXT: movq %rdi, %rax
1795 ; SSE-NEXT: addq {{[0-9]+}}(%rsp), %rcx
1796 ; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %r8
1797 ; SSE-NEXT: seto %dil
1798 ; SSE-NEXT: movq %r8, %r9
1799 ; SSE-NEXT: sarq $63, %r9
1800 ; SSE-NEXT: testb %dil, %dil
1801 ; SSE-NEXT: cmovneq %r9, %rcx
1802 ; SSE-NEXT: movabsq $-9223372036854775808, %r10 # imm = 0x8000000000000000
1803 ; SSE-NEXT: xorq %r10, %r9
1804 ; SSE-NEXT: testb %dil, %dil
1805 ; SSE-NEXT: cmoveq %r8, %r9
1806 ; SSE-NEXT: addq {{[0-9]+}}(%rsp), %rsi
1807 ; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %rdx
1808 ; SSE-NEXT: seto %dil
1809 ; SSE-NEXT: movq %rdx, %r8
1810 ; SSE-NEXT: sarq $63, %r8
1811 ; SSE-NEXT: testb %dil, %dil
1812 ; SSE-NEXT: cmovneq %r8, %rsi
1813 ; SSE-NEXT: xorq %r10, %r8
1814 ; SSE-NEXT: testb %dil, %dil
1815 ; SSE-NEXT: cmoveq %rdx, %r8
1816 ; SSE-NEXT: movq %rcx, 16(%rax)
1817 ; SSE-NEXT: movq %rsi, (%rax)
1818 ; SSE-NEXT: movq %r9, 24(%rax)
1819 ; SSE-NEXT: movq %r8, 8(%rax)
1822 ; AVX-LABEL: v2i128:
1824 ; AVX-NEXT: movq %rdi, %rax
1825 ; AVX-NEXT: addq {{[0-9]+}}(%rsp), %rcx
1826 ; AVX-NEXT: adcq {{[0-9]+}}(%rsp), %r8
1827 ; AVX-NEXT: seto %dil
1828 ; AVX-NEXT: movq %r8, %r9
1829 ; AVX-NEXT: sarq $63, %r9
1830 ; AVX-NEXT: testb %dil, %dil
1831 ; AVX-NEXT: cmovneq %r9, %rcx
1832 ; AVX-NEXT: movabsq $-9223372036854775808, %r10 # imm = 0x8000000000000000
1833 ; AVX-NEXT: xorq %r10, %r9
1834 ; AVX-NEXT: testb %dil, %dil
1835 ; AVX-NEXT: cmoveq %r8, %r9
1836 ; AVX-NEXT: addq {{[0-9]+}}(%rsp), %rsi
1837 ; AVX-NEXT: adcq {{[0-9]+}}(%rsp), %rdx
1838 ; AVX-NEXT: seto %dil
1839 ; AVX-NEXT: movq %rdx, %r8
1840 ; AVX-NEXT: sarq $63, %r8
1841 ; AVX-NEXT: testb %dil, %dil
1842 ; AVX-NEXT: cmovneq %r8, %rsi
1843 ; AVX-NEXT: xorq %r10, %r8
1844 ; AVX-NEXT: testb %dil, %dil
1845 ; AVX-NEXT: cmoveq %rdx, %r8
1846 ; AVX-NEXT: movq %rcx, 16(%rax)
1847 ; AVX-NEXT: movq %rsi, (%rax)
1848 ; AVX-NEXT: movq %r9, 24(%rax)
1849 ; AVX-NEXT: movq %r8, 8(%rax)
1851 %z = call <2 x i128> @llvm.sadd.sat.v2i128(<2 x i128> %x, <2 x i128> %y)