141 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s --check-prefixes=X863; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=X644 5define i32 @PR40483_add1(ptr, i32) nounwind {6; X86-LABEL: PR40483_add1:7; X86: # %bb.0:8; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx9; X86-NEXT: movl (%ecx), %eax10; X86-NEXT: addl {{[0-9]+}}(%esp), %eax11; X86-NEXT: movl %eax, (%ecx)12; X86-NEXT: jae .LBB0_213; X86-NEXT: # %bb.1:14; X86-NEXT: xorl %eax, %eax15; X86-NEXT: .LBB0_2:16; X86-NEXT: retl17;18; X64-LABEL: PR40483_add1:19; X64: # %bb.0:20; X64-NEXT: xorl %eax, %eax21; X64-NEXT: addl (%rdi), %esi22; X64-NEXT: movl %esi, (%rdi)23; X64-NEXT: cmovael %esi, %eax24; X64-NEXT: retq25 %3 = load i32, ptr %0, align 826 %4 = tail call { i8, i32 } @llvm.x86.addcarry.32(i8 0, i32 %3, i32 %1)27 %5 = extractvalue { i8, i32 } %4, 128 store i32 %5, ptr %0, align 829 %6 = extractvalue { i8, i32 } %4, 030 %7 = icmp eq i8 %6, 031 %8 = add i32 %1, %332 %9 = or i32 %5, %833 %10 = select i1 %7, i32 %9, i32 034 ret i32 %1035}36 37define i32 @PR40483_add2(ptr, i32) nounwind {38; X86-LABEL: PR40483_add2:39; X86: # %bb.0:40; X86-NEXT: movl {{[0-9]+}}(%esp), %edx41; X86-NEXT: movl (%edx), %ecx42; X86-NEXT: xorl %eax, %eax43; X86-NEXT: addl {{[0-9]+}}(%esp), %ecx44; X86-NEXT: movl %ecx, (%edx)45; X86-NEXT: jae .LBB1_246; X86-NEXT: # %bb.1:47; X86-NEXT: movl %ecx, %eax48; X86-NEXT: .LBB1_2:49; X86-NEXT: retl50;51; X64-LABEL: PR40483_add2:52; X64: # %bb.0:53; X64-NEXT: xorl %eax, %eax54; X64-NEXT: addl (%rdi), %esi55; X64-NEXT: movl %esi, (%rdi)56; X64-NEXT: cmovbl %esi, %eax57; X64-NEXT: retq58 %3 = load i32, ptr %0, align 859 %4 = tail call { i8, i32 } @llvm.x86.addcarry.32(i8 0, i32 %3, i32 %1)60 %5 = extractvalue { i8, i32 } %4, 161 store i32 %5, ptr %0, align 862 %6 = extractvalue { i8, i32 } %4, 063 %7 = icmp eq i8 %6, 064 %8 = add i32 %3, %165 %9 = or i32 %5, %866 %10 = select i1 %7, i32 0, i32 %967 ret i32 %1068}69 70define i32 @adc_merge_constants(i32 %a0) nounwind {71; X86-LABEL: adc_merge_constants:72; X86: # %bb.0:73; X86-NEXT: xorl %eax, %eax74; X86-NEXT: btl $11, {{[0-9]+}}(%esp)75; X86-NEXT: adcl $54, %eax76; X86-NEXT: retl77;78; X64-LABEL: adc_merge_constants:79; X64: # %bb.0:80; X64-NEXT: xorl %eax, %eax81; X64-NEXT: btl $11, %edi82; X64-NEXT: adcl $54, %eax83; X64-NEXT: retq84 %bit = lshr i32 %a0, 1185 %mask = and i32 %bit, 186 %isz = trunc i32 %mask to i887 %adc = tail call { i8, i32 } @llvm.x86.addcarry.32(i8 %isz, i32 55, i32 -1)88 %sum = extractvalue { i8, i32 } %adc, 189 ret i32 %sum90}91 92define i32 @adc_merge_sub(i32 %a0) nounwind {93; X86-LABEL: adc_merge_sub:94; X86: # %bb.0:95; X86-NEXT: pushl %edi96; X86-NEXT: pushl %esi97; X86-NEXT: movl {{[0-9]+}}(%esp), %edi98; X86-NEXT: xorl %eax, %eax99; X86-NEXT: addl $42, %edi100; X86-NEXT: setb %al101; X86-NEXT: movl %edi, %esi102; X86-NEXT: negl %esi103; X86-NEXT: pushl %eax104; X86-NEXT: calll use@PLT105; X86-NEXT: addl $4, %esp106; X86-NEXT: xorl %edi, %esi107; X86-NEXT: movl %esi, %eax108; X86-NEXT: popl %esi109; X86-NEXT: popl %edi110; X86-NEXT: retl111;112; X64-LABEL: adc_merge_sub:113; X64: # %bb.0:114; X64-NEXT: pushq %rbp115; X64-NEXT: pushq %rbx116; X64-NEXT: pushq %rax117; X64-NEXT: movl %edi, %ebx118; X64-NEXT: xorl %edi, %edi119; X64-NEXT: addl $42, %ebx120; X64-NEXT: setb %dil121; X64-NEXT: movl %ebx, %ebp122; X64-NEXT: negl %ebp123; X64-NEXT: callq use@PLT124; X64-NEXT: xorl %ebx, %ebp125; X64-NEXT: movl %ebp, %eax126; X64-NEXT: addq $8, %rsp127; X64-NEXT: popq %rbx128; X64-NEXT: popq %rbp129; X64-NEXT: retq130 %adc = tail call { i8, i32 } @llvm.x86.addcarry.32(i8 0, i32 %a0, i32 42)131 %carry = extractvalue { i8, i32 } %adc, 0132 call void @use(i8 %carry)133 %sum = extractvalue { i8, i32 } %adc, 1134 %sub = sub i32 -42, %a0135 %result = xor i32 %sum, %sub136 ret i32 %result137}138 139declare { i8, i32 } @llvm.x86.addcarry.32(i8, i32, i32)140declare void @use(i8)141