blob: b7ed76da4922b4c0e7af765d1e3752fec0815439 [file]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v2 | FileCheck %s --check-prefixes=CHECK,SSE
; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=CHECK,AVX2
; RUN: llc < %s -mtriple=x86_64-- -mcpu=knl | FileCheck %s --check-prefixes=AVX512,AVX512F
; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=AVX512,AVX512VL
define i512 @test_add_i512_reg_reg(i512 %a0, i512 %a1) nounwind {
; SSE-LABEL: test_add_i512_reg_reg:
; SSE: # %bb.0:
; SSE-NEXT: addq {{[0-9]+}}(%rsp), %rsi
; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %rdx
; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %rcx
; SSE-NEXT: movq %rdi, %rax
; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %r8
; SSE-NEXT: movq {{[0-9]+}}(%rsp), %rdi
; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %r9
; SSE-NEXT: movq {{[0-9]+}}(%rsp), %r10
; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %r10
; SSE-NEXT: movq {{[0-9]+}}(%rsp), %r11
; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %rdi
; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %r11
; SSE-NEXT: movq %rcx, 16(%rax)
; SSE-NEXT: movq %rdx, 8(%rax)
; SSE-NEXT: movq %rsi, (%rax)
; SSE-NEXT: movq %r8, 24(%rax)
; SSE-NEXT: movq %r9, 32(%rax)
; SSE-NEXT: movq %r10, 40(%rax)
; SSE-NEXT: movq %rdi, 48(%rax)
; SSE-NEXT: movq %r11, 56(%rax)
; SSE-NEXT: retq
;
; AVX2-LABEL: test_add_i512_reg_reg:
; AVX2: # %bb.0:
; AVX2-NEXT: addq {{[0-9]+}}(%rsp), %rsi
; AVX2-NEXT: adcq {{[0-9]+}}(%rsp), %rdx
; AVX2-NEXT: adcq {{[0-9]+}}(%rsp), %rcx
; AVX2-NEXT: adcq {{[0-9]+}}(%rsp), %r8
; AVX2-NEXT: movq %rdi, %rax
; AVX2-NEXT: adcq {{[0-9]+}}(%rsp), %r9
; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %rdi
; AVX2-NEXT: adcq {{[0-9]+}}(%rsp), %rdi
; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %r10
; AVX2-NEXT: adcq {{[0-9]+}}(%rsp), %r10
; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %r11
; AVX2-NEXT: adcq {{[0-9]+}}(%rsp), %r11
; AVX2-NEXT: movq %rcx, 16(%rax)
; AVX2-NEXT: movq %rdx, 8(%rax)
; AVX2-NEXT: movq %rsi, (%rax)
; AVX2-NEXT: movq %r8, 24(%rax)
; AVX2-NEXT: movq %r9, 32(%rax)
; AVX2-NEXT: movq %rdi, 40(%rax)
; AVX2-NEXT: movq %r10, 48(%rax)
; AVX2-NEXT: movq %r11, 56(%rax)
; AVX2-NEXT: retq
;
; AVX512F-LABEL: test_add_i512_reg_reg:
; AVX512F: # %bb.0:
; AVX512F-NEXT: addq {{[0-9]+}}(%rsp), %rsi
; AVX512F-NEXT: adcq {{[0-9]+}}(%rsp), %rdx
; AVX512F-NEXT: adcq {{[0-9]+}}(%rsp), %rcx
; AVX512F-NEXT: adcq {{[0-9]+}}(%rsp), %r8
; AVX512F-NEXT: movq %rdi, %rax
; AVX512F-NEXT: adcq {{[0-9]+}}(%rsp), %r9
; AVX512F-NEXT: movq {{[0-9]+}}(%rsp), %rdi
; AVX512F-NEXT: adcq {{[0-9]+}}(%rsp), %rdi
; AVX512F-NEXT: movq {{[0-9]+}}(%rsp), %r10
; AVX512F-NEXT: adcq {{[0-9]+}}(%rsp), %r10
; AVX512F-NEXT: movq {{[0-9]+}}(%rsp), %r11
; AVX512F-NEXT: adcq {{[0-9]+}}(%rsp), %r11
; AVX512F-NEXT: movq %rcx, 16(%rax)
; AVX512F-NEXT: movq %rdx, 8(%rax)
; AVX512F-NEXT: movq %rsi, (%rax)
; AVX512F-NEXT: movq %r8, 24(%rax)
; AVX512F-NEXT: movq %r9, 32(%rax)
; AVX512F-NEXT: movq %rdi, 40(%rax)
; AVX512F-NEXT: movq %r10, 48(%rax)
; AVX512F-NEXT: movq %r11, 56(%rax)
; AVX512F-NEXT: retq
;
; AVX512VL-LABEL: test_add_i512_reg_reg:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: movq %rdi, %rax
; AVX512VL-NEXT: movq {{[0-9]+}}(%rsp), %rdi
; AVX512VL-NEXT: movq {{[0-9]+}}(%rsp), %r10
; AVX512VL-NEXT: movq {{[0-9]+}}(%rsp), %r11
; AVX512VL-NEXT: addq {{[0-9]+}}(%rsp), %rsi
; AVX512VL-NEXT: adcq {{[0-9]+}}(%rsp), %rdx
; AVX512VL-NEXT: adcq {{[0-9]+}}(%rsp), %rcx
; AVX512VL-NEXT: adcq {{[0-9]+}}(%rsp), %r8
; AVX512VL-NEXT: adcq {{[0-9]+}}(%rsp), %r9
; AVX512VL-NEXT: adcq {{[0-9]+}}(%rsp), %r11
; AVX512VL-NEXT: adcq {{[0-9]+}}(%rsp), %rdi
; AVX512VL-NEXT: adcq {{[0-9]+}}(%rsp), %r10
; AVX512VL-NEXT: movq %rcx, 16(%rax)
; AVX512VL-NEXT: movq %rdx, 8(%rax)
; AVX512VL-NEXT: movq %rsi, (%rax)
; AVX512VL-NEXT: movq %r8, 24(%rax)
; AVX512VL-NEXT: movq %r9, 32(%rax)
; AVX512VL-NEXT: movq %r11, 40(%rax)
; AVX512VL-NEXT: movq %rdi, 48(%rax)
; AVX512VL-NEXT: movq %r10, 56(%rax)
; AVX512VL-NEXT: retq
%r = add i512 %a0, %a1
ret i512 %r
}
define i512 @test_add_i512_reg_mem(i512 %a0, ptr %p1) nounwind {
; SSE-LABEL: test_add_i512_reg_mem:
; SSE: # %bb.0:
; SSE-NEXT: pushq %rbx
; SSE-NEXT: movq {{[0-9]+}}(%rsp), %r10
; SSE-NEXT: addq (%r10), %rsi
; SSE-NEXT: adcq 8(%r10), %rdx
; SSE-NEXT: adcq 16(%r10), %rcx
; SSE-NEXT: movq %rdi, %rax
; SSE-NEXT: adcq 24(%r10), %r8
; SSE-NEXT: movq {{[0-9]+}}(%rsp), %rdi
; SSE-NEXT: adcq 32(%r10), %r9
; SSE-NEXT: movq {{[0-9]+}}(%rsp), %r11
; SSE-NEXT: adcq 40(%r10), %r11
; SSE-NEXT: movq {{[0-9]+}}(%rsp), %rbx
; SSE-NEXT: adcq 48(%r10), %rdi
; SSE-NEXT: adcq 56(%r10), %rbx
; SSE-NEXT: movq %rsi, (%rax)
; SSE-NEXT: movq %rdx, 8(%rax)
; SSE-NEXT: movq %rcx, 16(%rax)
; SSE-NEXT: movq %r8, 24(%rax)
; SSE-NEXT: movq %r9, 32(%rax)
; SSE-NEXT: movq %r11, 40(%rax)
; SSE-NEXT: movq %rdi, 48(%rax)
; SSE-NEXT: movq %rbx, 56(%rax)
; SSE-NEXT: popq %rbx
; SSE-NEXT: retq
;
; AVX2-LABEL: test_add_i512_reg_mem:
; AVX2: # %bb.0:
; AVX2-NEXT: pushq %rbx
; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %r10
; AVX2-NEXT: addq (%r10), %rsi
; AVX2-NEXT: adcq 8(%r10), %rdx
; AVX2-NEXT: adcq 16(%r10), %rcx
; AVX2-NEXT: adcq 24(%r10), %r8
; AVX2-NEXT: movq %rdi, %rax
; AVX2-NEXT: adcq 32(%r10), %r9
; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %rdi
; AVX2-NEXT: adcq 40(%r10), %rdi
; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %r11
; AVX2-NEXT: adcq 48(%r10), %r11
; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %rbx
; AVX2-NEXT: adcq 56(%r10), %rbx
; AVX2-NEXT: movq %rsi, (%rax)
; AVX2-NEXT: movq %rdx, 8(%rax)
; AVX2-NEXT: movq %rcx, 16(%rax)
; AVX2-NEXT: movq %r8, 24(%rax)
; AVX2-NEXT: movq %r9, 32(%rax)
; AVX2-NEXT: movq %rdi, 40(%rax)
; AVX2-NEXT: movq %r11, 48(%rax)
; AVX2-NEXT: movq %rbx, 56(%rax)
; AVX2-NEXT: popq %rbx
; AVX2-NEXT: retq
;
; AVX512F-LABEL: test_add_i512_reg_mem:
; AVX512F: # %bb.0:
; AVX512F-NEXT: pushq %rbx
; AVX512F-NEXT: movq {{[0-9]+}}(%rsp), %r10
; AVX512F-NEXT: addq (%r10), %rsi
; AVX512F-NEXT: adcq 8(%r10), %rdx
; AVX512F-NEXT: adcq 16(%r10), %rcx
; AVX512F-NEXT: adcq 24(%r10), %r8
; AVX512F-NEXT: movq %rdi, %rax
; AVX512F-NEXT: adcq 32(%r10), %r9
; AVX512F-NEXT: movq {{[0-9]+}}(%rsp), %rdi
; AVX512F-NEXT: adcq 40(%r10), %rdi
; AVX512F-NEXT: movq {{[0-9]+}}(%rsp), %r11
; AVX512F-NEXT: adcq 48(%r10), %r11
; AVX512F-NEXT: movq {{[0-9]+}}(%rsp), %rbx
; AVX512F-NEXT: adcq 56(%r10), %rbx
; AVX512F-NEXT: movq %rsi, (%rax)
; AVX512F-NEXT: movq %rdx, 8(%rax)
; AVX512F-NEXT: movq %rcx, 16(%rax)
; AVX512F-NEXT: movq %r8, 24(%rax)
; AVX512F-NEXT: movq %r9, 32(%rax)
; AVX512F-NEXT: movq %rdi, 40(%rax)
; AVX512F-NEXT: movq %r11, 48(%rax)
; AVX512F-NEXT: movq %rbx, 56(%rax)
; AVX512F-NEXT: popq %rbx
; AVX512F-NEXT: retq
;
; AVX512VL-LABEL: test_add_i512_reg_mem:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: pushq %rbx
; AVX512VL-NEXT: movq %rdi, %rax
; AVX512VL-NEXT: movq {{[0-9]+}}(%rsp), %rdi
; AVX512VL-NEXT: movq {{[0-9]+}}(%rsp), %r10
; AVX512VL-NEXT: movq {{[0-9]+}}(%rsp), %r11
; AVX512VL-NEXT: movq {{[0-9]+}}(%rsp), %rbx
; AVX512VL-NEXT: addq (%rbx), %rsi
; AVX512VL-NEXT: adcq 8(%rbx), %rdx
; AVX512VL-NEXT: adcq 16(%rbx), %rcx
; AVX512VL-NEXT: adcq 24(%rbx), %r8
; AVX512VL-NEXT: adcq 32(%rbx), %r9
; AVX512VL-NEXT: adcq 40(%rbx), %r11
; AVX512VL-NEXT: adcq 48(%rbx), %rdi
; AVX512VL-NEXT: adcq 56(%rbx), %r10
; AVX512VL-NEXT: movq %rsi, (%rax)
; AVX512VL-NEXT: movq %rdx, 8(%rax)
; AVX512VL-NEXT: movq %rcx, 16(%rax)
; AVX512VL-NEXT: movq %r8, 24(%rax)
; AVX512VL-NEXT: movq %r9, 32(%rax)
; AVX512VL-NEXT: movq %r11, 40(%rax)
; AVX512VL-NEXT: movq %rdi, 48(%rax)
; AVX512VL-NEXT: movq %r10, 56(%rax)
; AVX512VL-NEXT: popq %rbx
; AVX512VL-NEXT: retq
%a1 = load i512, ptr %p1
%r = add i512 %a0, %a1
ret i512 %r
}
define i512 @test_add_i512_mem_reg(ptr %p0, i512 %a1) nounwind {
; SSE-LABEL: test_add_i512_mem_reg:
; SSE: # %bb.0:
; SSE-NEXT: addq (%rsi), %rdx
; SSE-NEXT: adcq 8(%rsi), %rcx
; SSE-NEXT: movq %rdi, %rax
; SSE-NEXT: adcq 16(%rsi), %r8
; SSE-NEXT: movq 56(%rsi), %rdi
; SSE-NEXT: adcq 24(%rsi), %r9
; SSE-NEXT: movq 32(%rsi), %r10
; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %r10
; SSE-NEXT: movq 40(%rsi), %r11
; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %r11
; SSE-NEXT: movq 48(%rsi), %rsi
; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %rsi
; SSE-NEXT: adcq {{[0-9]+}}(%rsp), %rdi
; SSE-NEXT: movq %rdx, (%rax)
; SSE-NEXT: movq %rcx, 8(%rax)
; SSE-NEXT: movq %r8, 16(%rax)
; SSE-NEXT: movq %r9, 24(%rax)
; SSE-NEXT: movq %r10, 32(%rax)
; SSE-NEXT: movq %r11, 40(%rax)
; SSE-NEXT: movq %rsi, 48(%rax)
; SSE-NEXT: movq %rdi, 56(%rax)
; SSE-NEXT: retq
;
; AVX2-LABEL: test_add_i512_mem_reg:
; AVX2: # %bb.0:
; AVX2-NEXT: addq (%rsi), %rdx
; AVX2-NEXT: adcq 8(%rsi), %rcx
; AVX2-NEXT: adcq 16(%rsi), %r8
; AVX2-NEXT: movq %rdi, %rax
; AVX2-NEXT: adcq 24(%rsi), %r9
; AVX2-NEXT: movq 32(%rsi), %rdi
; AVX2-NEXT: adcq {{[0-9]+}}(%rsp), %rdi
; AVX2-NEXT: movq 40(%rsi), %r10
; AVX2-NEXT: adcq {{[0-9]+}}(%rsp), %r10
; AVX2-NEXT: movq 48(%rsi), %r11
; AVX2-NEXT: adcq {{[0-9]+}}(%rsp), %r11
; AVX2-NEXT: movq 56(%rsi), %rsi
; AVX2-NEXT: adcq {{[0-9]+}}(%rsp), %rsi
; AVX2-NEXT: movq %rdx, (%rax)
; AVX2-NEXT: movq %rcx, 8(%rax)
; AVX2-NEXT: movq %r8, 16(%rax)
; AVX2-NEXT: movq %r9, 24(%rax)
; AVX2-NEXT: movq %rdi, 32(%rax)
; AVX2-NEXT: movq %r10, 40(%rax)
; AVX2-NEXT: movq %r11, 48(%rax)
; AVX2-NEXT: movq %rsi, 56(%rax)
; AVX2-NEXT: retq
;
; AVX512F-LABEL: test_add_i512_mem_reg:
; AVX512F: # %bb.0:
; AVX512F-NEXT: addq (%rsi), %rdx
; AVX512F-NEXT: adcq 8(%rsi), %rcx
; AVX512F-NEXT: adcq 16(%rsi), %r8
; AVX512F-NEXT: movq %rdi, %rax
; AVX512F-NEXT: adcq 24(%rsi), %r9
; AVX512F-NEXT: movq 32(%rsi), %rdi
; AVX512F-NEXT: adcq {{[0-9]+}}(%rsp), %rdi
; AVX512F-NEXT: movq 40(%rsi), %r10
; AVX512F-NEXT: adcq {{[0-9]+}}(%rsp), %r10
; AVX512F-NEXT: movq 48(%rsi), %r11
; AVX512F-NEXT: adcq {{[0-9]+}}(%rsp), %r11
; AVX512F-NEXT: movq 56(%rsi), %rsi
; AVX512F-NEXT: adcq {{[0-9]+}}(%rsp), %rsi
; AVX512F-NEXT: movq %rdx, (%rax)
; AVX512F-NEXT: movq %rcx, 8(%rax)
; AVX512F-NEXT: movq %r8, 16(%rax)
; AVX512F-NEXT: movq %r9, 24(%rax)
; AVX512F-NEXT: movq %rdi, 32(%rax)
; AVX512F-NEXT: movq %r10, 40(%rax)
; AVX512F-NEXT: movq %r11, 48(%rax)
; AVX512F-NEXT: movq %rsi, 56(%rax)
; AVX512F-NEXT: retq
;
; AVX512VL-LABEL: test_add_i512_mem_reg:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: pushq %rbx
; AVX512VL-NEXT: movq %rdi, %rax
; AVX512VL-NEXT: movq 56(%rsi), %rdi
; AVX512VL-NEXT: movq 48(%rsi), %r10
; AVX512VL-NEXT: movq 32(%rsi), %r11
; AVX512VL-NEXT: movq 40(%rsi), %rbx
; AVX512VL-NEXT: addq (%rsi), %rdx
; AVX512VL-NEXT: adcq 8(%rsi), %rcx
; AVX512VL-NEXT: adcq 16(%rsi), %r8
; AVX512VL-NEXT: adcq 24(%rsi), %r9
; AVX512VL-NEXT: adcq {{[0-9]+}}(%rsp), %r11
; AVX512VL-NEXT: adcq {{[0-9]+}}(%rsp), %rbx
; AVX512VL-NEXT: adcq {{[0-9]+}}(%rsp), %r10
; AVX512VL-NEXT: adcq {{[0-9]+}}(%rsp), %rdi
; AVX512VL-NEXT: movq %rdx, (%rax)
; AVX512VL-NEXT: movq %rcx, 8(%rax)
; AVX512VL-NEXT: movq %r8, 16(%rax)
; AVX512VL-NEXT: movq %r9, 24(%rax)
; AVX512VL-NEXT: movq %r11, 32(%rax)
; AVX512VL-NEXT: movq %rbx, 40(%rax)
; AVX512VL-NEXT: movq %r10, 48(%rax)
; AVX512VL-NEXT: movq %rdi, 56(%rax)
; AVX512VL-NEXT: popq %rbx
; AVX512VL-NEXT: retq
%a0 = load i512, ptr %p0
%r = add i512 %a0, %a1
ret i512 %r
}
define i512 @test_inc_i512_mem(ptr %p0) nounwind {
; SSE-LABEL: test_inc_i512_mem:
; SSE: # %bb.0:
; SSE-NEXT: movq %rdi, %rax
; SSE-NEXT: movq 48(%rsi), %rcx
; SSE-NEXT: movq 40(%rsi), %rdx
; SSE-NEXT: movq 32(%rsi), %rdi
; SSE-NEXT: movq 24(%rsi), %r8
; SSE-NEXT: movq 16(%rsi), %r9
; SSE-NEXT: movq (%rsi), %r10
; SSE-NEXT: movq 8(%rsi), %r11
; SSE-NEXT: addq $1, %r10
; SSE-NEXT: adcq $0, %r11
; SSE-NEXT: adcq $0, %r9
; SSE-NEXT: adcq $0, %r8
; SSE-NEXT: adcq $0, %rdi
; SSE-NEXT: adcq $0, %rdx
; SSE-NEXT: adcq $0, %rcx
; SSE-NEXT: movq 56(%rsi), %rsi
; SSE-NEXT: adcq $0, %rsi
; SSE-NEXT: movq %r10, (%rax)
; SSE-NEXT: movq %r11, 8(%rax)
; SSE-NEXT: movq %r9, 16(%rax)
; SSE-NEXT: movq %r8, 24(%rax)
; SSE-NEXT: movq %rdi, 32(%rax)
; SSE-NEXT: movq %rdx, 40(%rax)
; SSE-NEXT: movq %rcx, 48(%rax)
; SSE-NEXT: movq %rsi, 56(%rax)
; SSE-NEXT: retq
;
; AVX2-LABEL: test_inc_i512_mem:
; AVX2: # %bb.0:
; AVX2-NEXT: movq %rdi, %rax
; AVX2-NEXT: movq 56(%rsi), %rcx
; AVX2-NEXT: movq 48(%rsi), %rdx
; AVX2-NEXT: movq 40(%rsi), %rdi
; AVX2-NEXT: movq 32(%rsi), %r8
; AVX2-NEXT: movq 24(%rsi), %r9
; AVX2-NEXT: movq 16(%rsi), %r10
; AVX2-NEXT: movq (%rsi), %r11
; AVX2-NEXT: movq 8(%rsi), %rsi
; AVX2-NEXT: addq $1, %r11
; AVX2-NEXT: adcq $0, %rsi
; AVX2-NEXT: adcq $0, %r10
; AVX2-NEXT: adcq $0, %r9
; AVX2-NEXT: adcq $0, %r8
; AVX2-NEXT: adcq $0, %rdi
; AVX2-NEXT: adcq $0, %rdx
; AVX2-NEXT: adcq $0, %rcx
; AVX2-NEXT: movq %r11, (%rax)
; AVX2-NEXT: movq %rsi, 8(%rax)
; AVX2-NEXT: movq %r10, 16(%rax)
; AVX2-NEXT: movq %r9, 24(%rax)
; AVX2-NEXT: movq %r8, 32(%rax)
; AVX2-NEXT: movq %rdi, 40(%rax)
; AVX2-NEXT: movq %rdx, 48(%rax)
; AVX2-NEXT: movq %rcx, 56(%rax)
; AVX2-NEXT: retq
;
; AVX512F-LABEL: test_inc_i512_mem:
; AVX512F: # %bb.0:
; AVX512F-NEXT: movq %rdi, %rax
; AVX512F-NEXT: vmovdqu64 (%rsi), %zmm0
; AVX512F-NEXT: vpternlogd {{.*#+}} zmm1 = -1
; AVX512F-NEXT: vpsubq %zmm1, %zmm0, %zmm1
; AVX512F-NEXT: vpcmpnleuq %zmm0, %zmm1, %k0
; AVX512F-NEXT: kmovw %k0, %ecx
; AVX512F-NEXT: vptestnmq %zmm1, %zmm1, %k0
; AVX512F-NEXT: kmovw %k0, %edx
; AVX512F-NEXT: movzbl %dl, %edx
; AVX512F-NEXT: leal (%rdx,%rcx,2), %ecx
; AVX512F-NEXT: xorl %edx, %ecx
; AVX512F-NEXT: kmovw %ecx, %k1
; AVX512F-NEXT: vmovdqa64 %zmm0, %zmm1 {%k1}
; AVX512F-NEXT: vmovdqu64 %zmm1, (%rdi)
; AVX512F-NEXT: retq
;
; AVX512VL-LABEL: test_inc_i512_mem:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: movq %rdi, %rax
; AVX512VL-NEXT: vmovdqu64 (%rsi), %zmm0
; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm1 = -1
; AVX512VL-NEXT: vpsubq %zmm1, %zmm0, %zmm1
; AVX512VL-NEXT: vpcmpnleuq %zmm0, %zmm1, %k0
; AVX512VL-NEXT: kmovd %k0, %ecx
; AVX512VL-NEXT: vptestnmq %zmm1, %zmm1, %k0
; AVX512VL-NEXT: kmovb %k0, %edx
; AVX512VL-NEXT: leal (%rdx,%rcx,2), %ecx
; AVX512VL-NEXT: xorl %edx, %ecx
; AVX512VL-NEXT: kmovd %ecx, %k1
; AVX512VL-NEXT: vmovdqa64 %zmm0, %zmm1 {%k1}
; AVX512VL-NEXT: vmovdqu64 %zmm1, (%rdi)
; AVX512VL-NEXT: vzeroupper
; AVX512VL-NEXT: retq
%a0 = load i512, ptr %p0
%r = add i512 %a0, 1
ret i512 %r
}
define i512 @test_add_i512_mem_mem(ptr %p0, ptr %p1) nounwind {
; SSE-LABEL: test_add_i512_mem_mem:
; SSE: # %bb.0:
; SSE-NEXT: pushq %rbx
; SSE-NEXT: movq %rdi, %rax
; SSE-NEXT: movq 56(%rsi), %rcx
; SSE-NEXT: movq (%rsi), %rdi
; SSE-NEXT: addq (%rdx), %rdi
; SSE-NEXT: movq 8(%rsi), %r8
; SSE-NEXT: adcq 8(%rdx), %r8
; SSE-NEXT: movq 16(%rsi), %r9
; SSE-NEXT: adcq 16(%rdx), %r9
; SSE-NEXT: movq 24(%rsi), %r10
; SSE-NEXT: adcq 24(%rdx), %r10
; SSE-NEXT: movq 32(%rsi), %r11
; SSE-NEXT: adcq 32(%rdx), %r11
; SSE-NEXT: movq 40(%rsi), %rbx
; SSE-NEXT: adcq 40(%rdx), %rbx
; SSE-NEXT: movq 48(%rsi), %rsi
; SSE-NEXT: adcq 48(%rdx), %rsi
; SSE-NEXT: adcq 56(%rdx), %rcx
; SSE-NEXT: movq %rdi, (%rax)
; SSE-NEXT: movq %r8, 8(%rax)
; SSE-NEXT: movq %r9, 16(%rax)
; SSE-NEXT: movq %r10, 24(%rax)
; SSE-NEXT: movq %r11, 32(%rax)
; SSE-NEXT: movq %rbx, 40(%rax)
; SSE-NEXT: movq %rsi, 48(%rax)
; SSE-NEXT: movq %rcx, 56(%rax)
; SSE-NEXT: popq %rbx
; SSE-NEXT: retq
;
; AVX2-LABEL: test_add_i512_mem_mem:
; AVX2: # %bb.0:
; AVX2-NEXT: pushq %rbx
; AVX2-NEXT: movq %rdi, %rax
; AVX2-NEXT: movq (%rsi), %rcx
; AVX2-NEXT: addq (%rdx), %rcx
; AVX2-NEXT: movq 8(%rsi), %rdi
; AVX2-NEXT: adcq 8(%rdx), %rdi
; AVX2-NEXT: movq 16(%rsi), %r8
; AVX2-NEXT: adcq 16(%rdx), %r8
; AVX2-NEXT: movq 24(%rsi), %r9
; AVX2-NEXT: adcq 24(%rdx), %r9
; AVX2-NEXT: movq 32(%rsi), %r10
; AVX2-NEXT: adcq 32(%rdx), %r10
; AVX2-NEXT: movq 40(%rsi), %r11
; AVX2-NEXT: adcq 40(%rdx), %r11
; AVX2-NEXT: movq 48(%rsi), %rbx
; AVX2-NEXT: adcq 48(%rdx), %rbx
; AVX2-NEXT: movq 56(%rsi), %rsi
; AVX2-NEXT: adcq 56(%rdx), %rsi
; AVX2-NEXT: movq %rcx, (%rax)
; AVX2-NEXT: movq %rdi, 8(%rax)
; AVX2-NEXT: movq %r8, 16(%rax)
; AVX2-NEXT: movq %r9, 24(%rax)
; AVX2-NEXT: movq %r10, 32(%rax)
; AVX2-NEXT: movq %r11, 40(%rax)
; AVX2-NEXT: movq %rbx, 48(%rax)
; AVX2-NEXT: movq %rsi, 56(%rax)
; AVX2-NEXT: popq %rbx
; AVX2-NEXT: retq
;
; AVX512F-LABEL: test_add_i512_mem_mem:
; AVX512F: # %bb.0:
; AVX512F-NEXT: movq %rdi, %rax
; AVX512F-NEXT: vmovdqu64 (%rsi), %zmm0
; AVX512F-NEXT: vpaddq (%rdx), %zmm0, %zmm1
; AVX512F-NEXT: vpcmpltuq %zmm0, %zmm1, %k0
; AVX512F-NEXT: kmovw %k0, %ecx
; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 = -1
; AVX512F-NEXT: vpcmpeqq %zmm0, %zmm1, %k0
; AVX512F-NEXT: kmovw %k0, %edx
; AVX512F-NEXT: movzbl %dl, %edx
; AVX512F-NEXT: leal (%rdx,%rcx,2), %ecx
; AVX512F-NEXT: xorl %edx, %ecx
; AVX512F-NEXT: kmovw %ecx, %k1
; AVX512F-NEXT: vpsubq %zmm0, %zmm1, %zmm1 {%k1}
; AVX512F-NEXT: vmovdqu64 %zmm1, (%rdi)
; AVX512F-NEXT: retq
;
; AVX512VL-LABEL: test_add_i512_mem_mem:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: vmovdqu64 (%rsi), %zmm0
; AVX512VL-NEXT: movq %rdi, %rax
; AVX512VL-NEXT: vpaddq (%rdx), %zmm0, %zmm1
; AVX512VL-NEXT: vpcmpltuq %zmm0, %zmm1, %k0
; AVX512VL-NEXT: kmovd %k0, %ecx
; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm0 = -1
; AVX512VL-NEXT: vpcmpeqq %zmm0, %zmm1, %k0
; AVX512VL-NEXT: kmovb %k0, %edx
; AVX512VL-NEXT: leal (%rdx,%rcx,2), %ecx
; AVX512VL-NEXT: xorl %edx, %ecx
; AVX512VL-NEXT: kmovd %ecx, %k1
; AVX512VL-NEXT: vpsubq %zmm0, %zmm1, %zmm1 {%k1}
; AVX512VL-NEXT: vmovdqu64 %zmm1, (%rdi)
; AVX512VL-NEXT: vzeroupper
; AVX512VL-NEXT: retq
%a0 = load i512, ptr %p0
%a1 = load i512, ptr %p1
%r = add i512 %a0, %a1
ret i512 %r
}
define void @test_inc_i512_rmw(ptr %p0) nounwind {
; CHECK-LABEL: test_inc_i512_rmw:
; CHECK: # %bb.0:
; CHECK-NEXT: addq $1, (%rdi)
; CHECK-NEXT: adcq $0, 8(%rdi)
; CHECK-NEXT: adcq $0, 16(%rdi)
; CHECK-NEXT: adcq $0, 24(%rdi)
; CHECK-NEXT: adcq $0, 32(%rdi)
; CHECK-NEXT: adcq $0, 40(%rdi)
; CHECK-NEXT: adcq $0, 48(%rdi)
; CHECK-NEXT: adcq $0, 56(%rdi)
; CHECK-NEXT: retq
;
; AVX512F-LABEL: test_inc_i512_rmw:
; AVX512F: # %bb.0:
; AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
; AVX512F-NEXT: vpternlogd {{.*#+}} zmm1 = -1
; AVX512F-NEXT: vpsubq %zmm1, %zmm0, %zmm1
; AVX512F-NEXT: vpcmpnleuq %zmm0, %zmm1, %k0
; AVX512F-NEXT: kmovw %k0, %eax
; AVX512F-NEXT: vptestnmq %zmm1, %zmm1, %k0
; AVX512F-NEXT: kmovw %k0, %ecx
; AVX512F-NEXT: movzbl %cl, %ecx
; AVX512F-NEXT: leal (%rcx,%rax,2), %eax
; AVX512F-NEXT: xorl %ecx, %eax
; AVX512F-NEXT: kmovw %eax, %k0
; AVX512F-NEXT: knotw %k0, %k1
; AVX512F-NEXT: vmovdqu64 %zmm1, (%rdi) {%k1}
; AVX512F-NEXT: retq
;
; AVX512VL-LABEL: test_inc_i512_rmw:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: vmovdqu64 (%rdi), %zmm0
; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm1 = -1
; AVX512VL-NEXT: vpsubq %zmm1, %zmm0, %zmm1
; AVX512VL-NEXT: vpcmpnleuq %zmm0, %zmm1, %k0
; AVX512VL-NEXT: kmovd %k0, %eax
; AVX512VL-NEXT: vptestnmq %zmm1, %zmm1, %k0
; AVX512VL-NEXT: kmovb %k0, %ecx
; AVX512VL-NEXT: leal (%rcx,%rax,2), %eax
; AVX512VL-NEXT: xorl %ecx, %eax
; AVX512VL-NEXT: kmovd %eax, %k0
; AVX512VL-NEXT: knotb %k0, %k1
; AVX512VL-NEXT: vmovdqu64 %zmm1, (%rdi) {%k1}
; AVX512VL-NEXT: vzeroupper
; AVX512VL-NEXT: retq
%a0 = load i512, ptr %p0
%r = add i512 %a0, 1
store i512 %r, ptr %p0
ret void
}
define void @test_add_i512_rmw(ptr %p0) nounwind {
; CHECK-LABEL: test_add_i512_rmw:
; CHECK: # %bb.0:
; CHECK-NEXT: addq $9, (%rdi)
; CHECK-NEXT: adcq $0, 8(%rdi)
; CHECK-NEXT: adcq $0, 16(%rdi)
; CHECK-NEXT: adcq $0, 24(%rdi)
; CHECK-NEXT: adcq $0, 32(%rdi)
; CHECK-NEXT: adcq $0, 40(%rdi)
; CHECK-NEXT: adcq $0, 48(%rdi)
; CHECK-NEXT: adcq $0, 56(%rdi)
; CHECK-NEXT: retq
;
; AVX512F-LABEL: test_add_i512_rmw:
; AVX512F: # %bb.0:
; AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0
; AVX512F-NEXT: vmovd {{.*#+}} xmm1 = [9,0,0,0]
; AVX512F-NEXT: vpaddq %zmm1, %zmm0, %zmm1
; AVX512F-NEXT: vpcmpltuq %zmm0, %zmm1, %k0
; AVX512F-NEXT: kmovw %k0, %eax
; AVX512F-NEXT: vpternlogd {{.*#+}} zmm2 = -1
; AVX512F-NEXT: vpcmpeqq %zmm2, %zmm1, %k0
; AVX512F-NEXT: kmovw %k0, %ecx
; AVX512F-NEXT: movzbl %cl, %ecx
; AVX512F-NEXT: leal (%rcx,%rax,2), %eax
; AVX512F-NEXT: xorl %ecx, %eax
; AVX512F-NEXT: kmovw %eax, %k1
; AVX512F-NEXT: vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm1 {%k1}
; AVX512F-NEXT: vmovdqu64 %zmm1, (%rdi)
; AVX512F-NEXT: retq
;
; AVX512VL-LABEL: test_add_i512_rmw:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: vmovdqu64 (%rdi), %zmm0
; AVX512VL-NEXT: vmovd {{.*#+}} xmm1 = [9,0,0,0]
; AVX512VL-NEXT: vpaddq %zmm1, %zmm0, %zmm1
; AVX512VL-NEXT: vpcmpltuq %zmm0, %zmm1, %k0
; AVX512VL-NEXT: kmovd %k0, %eax
; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm2 = -1
; AVX512VL-NEXT: vpcmpeqq %zmm2, %zmm1, %k0
; AVX512VL-NEXT: kmovb %k0, %ecx
; AVX512VL-NEXT: leal (%rcx,%rax,2), %eax
; AVX512VL-NEXT: xorl %ecx, %eax
; AVX512VL-NEXT: kmovd %eax, %k1
; AVX512VL-NEXT: vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm1 {%k1}
; AVX512VL-NEXT: vmovdqu64 %zmm1, (%rdi)
; AVX512VL-NEXT: vzeroupper
; AVX512VL-NEXT: retq
%a0 = load i512, ptr %p0
%r = add i512 %a0, 9
store i512 %r, ptr %p0
ret void
}
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
; AVX512: {{.*}}