blob: 718156a42267f77a1b116eecd9d722bd45eec4dd [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+adx,+ndd | FileCheck %s --check-prefixes=CHECK,NDD
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+adx | FileCheck %s --check-prefixes=CHECK,ADX
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=-adx | FileCheck %s --check-prefixes=CHECK,NOADX
declare { i8, i1 } @llvm.sadd.with.overflow.i8(i8, i8)
define i32 @adox_test_flags(i32 %a, i32 %b, i8 %c, i8 %d) {
; NDD-LABEL: adox_test_flags:
; NDD: # %bb.0:
; NDD-NEXT: addb %cl, %dl, %al
; NDD-NEXT: adoxl %esi, %edi, %eax
; NDD-NEXT: testl %eax, %eax
; NDD-NEXT: movl $10, %ecx
; NDD-NEXT: cmovel %ecx, %eax
; NDD-NEXT: retq
;
; ADX-LABEL: adox_test_flags:
; ADX: # %bb.0:
; ADX-NEXT: addb %cl, %dl
; ADX-NEXT: adoxl %esi, %edi
; ADX-NEXT: testl %edi, %edi
; ADX-NEXT: movl $10, %eax
; ADX-NEXT: cmovnel %edi, %eax
; ADX-NEXT: retq
;
; NOADX-LABEL: adox_test_flags:
; NOADX: # %bb.0:
; NOADX-NEXT: # kill: def $esi killed $esi def $rsi
; NOADX-NEXT: # kill: def $edi killed $edi def $rdi
; NOADX-NEXT: xorl %r8d, %r8d
; NOADX-NEXT: addb %cl, %dl
; NOADX-NEXT: seto %r8b
; NOADX-NEXT: leal (%rdi,%rsi), %eax
; NOADX-NEXT: addl %eax, %r8d
; NOADX-NEXT: movl $10, %eax
; NOADX-NEXT: cmovnel %r8d, %eax
; NOADX-NEXT: retq
%ssub = call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %c, i8 %d)
%ov = extractvalue { i8, i1 } %ssub, 1
%ov.ext = zext i1 %ov to i32
%sum = add i32 %a, %b
%res = add i32 %sum, %ov.ext
%cmp = icmp eq i32 %res, 0
%sel = select i1 %cmp, i32 10, i32 %res
ret i32 %sel
}
define i8 @adox_test_flags_i8(i8 %a, i8 %b, i8 %c, i8 %d) {
; NDD-LABEL: adox_test_flags_i8:
; NDD: # %bb.0:
; NDD-NEXT: addb %cl, %dl, %al
; NDD-NEXT: adoxl %esi, %edi, %eax
; NDD-NEXT: testb %al, %al
; NDD-NEXT: movl $10, %ecx
; NDD-NEXT: cmovel %ecx, %eax
; NDD-NEXT: # kill: def $al killed $al killed $eax
; NDD-NEXT: retq
;
; ADX-LABEL: adox_test_flags_i8:
; ADX: # %bb.0:
; ADX-NEXT: addb %cl, %dl
; ADX-NEXT: adoxl %esi, %edi
; ADX-NEXT: testb %dil, %dil
; ADX-NEXT: movl $10, %eax
; ADX-NEXT: cmovnel %edi, %eax
; ADX-NEXT: # kill: def $al killed $al killed $eax
; ADX-NEXT: retq
;
; NOADX-LABEL: adox_test_flags_i8:
; NOADX: # %bb.0:
; NOADX-NEXT: addb %cl, %dl
; NOADX-NEXT: seto %al
; NOADX-NEXT: addb %sil, %dil
; NOADX-NEXT: addb %al, %dil
; NOADX-NEXT: movzbl %dil, %ecx
; NOADX-NEXT: movl $10, %eax
; NOADX-NEXT: cmovnel %ecx, %eax
; NOADX-NEXT: # kill: def $al killed $al killed $eax
; NOADX-NEXT: retq
%ssub = call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %c, i8 %d)
%ov = extractvalue { i8, i1 } %ssub, 1
%ov.ext = zext i1 %ov to i8
%sum = add i8 %a, %b
%res = add i8 %sum, %ov.ext
%cmp = icmp eq i8 %res, 0
%sel = select i1 %cmp, i8 10, i8 %res
ret i8 %sel
}
define i16 @adox_test_flags_i16(i16 %a, i16 %b, i8 %c, i8 %d) {
; NDD-LABEL: adox_test_flags_i16:
; NDD: # %bb.0:
; NDD-NEXT: addb %cl, %dl, %al
; NDD-NEXT: adoxl %esi, %edi, %eax
; NDD-NEXT: testw %ax, %ax
; NDD-NEXT: movl $10, %ecx
; NDD-NEXT: cmovel %ecx, %eax
; NDD-NEXT: # kill: def $ax killed $ax killed $eax
; NDD-NEXT: retq
;
; ADX-LABEL: adox_test_flags_i16:
; ADX: # %bb.0:
; ADX-NEXT: addb %cl, %dl
; ADX-NEXT: adoxl %esi, %edi
; ADX-NEXT: testw %di, %di
; ADX-NEXT: movl $10, %eax
; ADX-NEXT: cmovnel %edi, %eax
; ADX-NEXT: # kill: def $ax killed $ax killed $eax
; ADX-NEXT: retq
;
; NOADX-LABEL: adox_test_flags_i16:
; NOADX: # %bb.0:
; NOADX-NEXT: # kill: def $esi killed $esi def $rsi
; NOADX-NEXT: # kill: def $edi killed $edi def $rdi
; NOADX-NEXT: xorl %r8d, %r8d
; NOADX-NEXT: addb %cl, %dl
; NOADX-NEXT: seto %r8b
; NOADX-NEXT: addl %edi, %r8d
; NOADX-NEXT: addl %esi, %r8d
; NOADX-NEXT: testw %r8w, %r8w
; NOADX-NEXT: movl $10, %eax
; NOADX-NEXT: cmovnel %r8d, %eax
; NOADX-NEXT: # kill: def $ax killed $ax killed $eax
; NOADX-NEXT: retq
%ssub = call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %c, i8 %d)
%ov = extractvalue { i8, i1 } %ssub, 1
%ov.ext = zext i1 %ov to i16
%sum = add i16 %a, %b
%res = add i16 %sum, %ov.ext
%cmp = icmp eq i16 %res, 0
%sel = select i1 %cmp, i16 10, i16 %res
ret i16 %sel
}
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
; CHECK: {{.*}}