unsigned long long carried_add_loop2(unsigned long long carry,
                                     unsigned long long *res,
                                     unsigned long long *a1,
                                     unsigned long long *a2, long long ct) {
  long long idx;
  for (idx = ct; idx > 0; idx--) {
    asm("xor %%rax, %%rax;"
        "adc (%%rbx), %%rdx;"
        "lahf;"
        "mov  %%ah,    %%al;"
        "adc (%%rcx),   %%rdx;"
        "lahf;"
        "or   %%ah,    %%al;"
        "and  $0x0001, %%rax;"
        : "=a"(carry), "=d"(*res)
        : "b"(a1), "c"(a2), "d"(carry));
    a1--;
    a2--;
    res--;
  }
  return carry;
}


x86 assembly (clang, -O0):
<carried_add_loop2>:
push   %rbp
mov    %rsp,%rbp
push   %rbx
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,-0x38(%rbp)
cmpq   $0x0,-0x38(%rbp)
jle    1196 <carried_add_loop2+0x96>
mov    -0x18(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x20(%rbp),%rbx
mov    -0x28(%rbp),%rcx
mov    -0x10(%rbp),%rdx
xor    %rax,%rax
adc    (%rbx),%rdx
lahf
mov    %ah,%al
adc    (%rcx),%rdx
lahf
or     %ah,%al
and    $0x1,%rax
mov    %rax,%rcx
mov    -0x40(%rbp),%rax
mov    %rcx,-0x10(%rbp)
mov    %rdx,(%rax)
mov    -0x20(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x18(%rbp)
mov    -0x38(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x38(%rbp)
jmp    1121 <carried_add_loop2+0x21>
mov    -0x10(%rbp),%rax
pop    %rbx
pop    %rbp
ret

x86 assembly (clang, -O2):
<carried_add_loop2>:
mov    %rdi,%rax
test   %r8,%r8
jle    1140 <carried_add_loop2+0x40>
push   %rbx
mov    %rdx,%rbx
add    $0x1,%r8
mov    %rax,%rdx
xor    %rax,%rax
adc    (%rbx),%rdx
lahf
mov    %ah,%al
adc    (%rcx),%rdx
lahf
or     %ah,%al
and    $0x1,%rax
mov    %rdx,(%rsi)
add    $0xfffffffffffffff8,%rbx
add    $0xfffffffffffffff8,%rcx
add    $0xfffffffffffffff8,%rsi
add    $0xffffffffffffffff,%r8
cmp    $0x1,%r8
ja     1110 <carried_add_loop2+0x10>
pop    %rbx
ret

LLVM IR (-O0):
define i64 @carried_add_loop2(i64 %0, i64* %1, i64* %2, i64* %3, i64 %4) {
%6 = alloca i64
%7 = alloca i64*
%8 = alloca i64*
%9 = alloca i64*
%10 = alloca i64
%11 = alloca i64
store i64 %0, i64* %6
store i64* %1, i64** %7
store i64* %2, i64** %8
store i64* %3, i64** %9
store i64 %4, i64* %10
%12 = load i64, i64* %10
store i64 %12, i64* %11
br label %13
13: ; preds = %30, %5
%14 = load i64, i64* %11
%15 = icmp sgt i64 %14, 0
br i1 %15, label %16, label %33
16: ; preds = %13
%17 = load i64*, i64** %7
%18 = load i64*, i64** %8
%19 = load i64*, i64** %9
%20 = load i64, i64* %6
%21 = call { i64, i64 } asm "xor %rax, %rax;adc (%rbx), %rdx;lahf;mov %ah, %al;adc (%rcx), %rdx;lahf;or %ah, %al;and $$0x0001, %rax;", "={ax},={dx},{bx},{cx},{dx},~{dirflag},~{fpsr},~{flags}"(i64* %18, i64* %19, i64 %20)
%22 = extractvalue { i64, i64 } %21, 0
%23 = extractvalue { i64, i64 } %21, 1
store i64 %22, i64* %6
store i64 %23, i64* %17
%24 = load i64*, i64** %8
%25 = getelementptr inbounds i64, i64* %24, i32 -1
store i64* %25, i64** %8
%26 = load i64*, i64** %9
%27 = getelementptr inbounds i64, i64* %26, i32 -1
store i64* %27, i64** %9
%28 = load i64*, i64** %7
%29 = getelementptr inbounds i64, i64* %28, i32 -1
store i64* %29, i64** %7
br label %30
30: ; preds = %16
%31 = load i64, i64* %11
%32 = add nsw i64 %31, -1
store i64 %32, i64* %11
br label %13
33: ; preds = %13
%34 = load i64, i64* %6
ret i64 %34
}

LLVM IR (-O2):
define i64 @carried_add_loop2(i64 %0, i64* nocapture writeonly %1, i64* %2, i64* %3, i64 %4) {
%6 = icmp sgt i64 %4, 0
br i1 %6, label %7, label %23
7: ; preds = %5, %7
%8 = phi i64 [ %19, %7 ], [ %4, %5 ]
%9 = phi i64 [ %14, %7 ], [ %0, %5 ]
%10 = phi i64* [ %17, %7 ], [ %3, %5 ]
%11 = phi i64* [ %16, %7 ], [ %2, %5 ]
%12 = phi i64* [ %18, %7 ], [ %1, %5 ]
%13 = tail call { i64, i64 } asm "xor %rax, %rax;adc (%rbx), %rdx;lahf;mov %ah, %al;adc (%rcx), %rdx;lahf;or %ah, %al;and $$0x0001, %rax;", "={ax},={dx},{bx},{cx},{dx},~{dirflag},~{fpsr},~{flags}"(i64* %11, i64* %10, i64 %9)
%14 = extractvalue { i64, i64 } %13, 0
%15 = extractvalue { i64, i64 } %13, 1
store i64 %15, i64* %12
%16 = getelementptr inbounds i64, i64* %11, i64 -1
%17 = getelementptr inbounds i64, i64* %10, i64 -1
%18 = getelementptr inbounds i64, i64* %12, i64 -1
%19 = add nsw i64 %8, -1
%20 = icmp ugt i64 %8, 1
br i1 %20, label %7, label %21
21: ; preds = %7
%22 = extractvalue { i64, i64 } %13, 0
br label %23
23: ; preds = %21, %5
%24 = phi i64 [ %0, %5 ], [ %22, %21 ]
ret i64 %24
}