| ; 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: {{.*}} |