#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ assert(int);
unsigned int bn_add_words(unsigned int *, unsigned int const *,
                          unsigned int const *, int);
unsigned int bn_add_part_words(unsigned int *r, const unsigned int *a,
                               const unsigned int *b, int cl, int dl) {
  unsigned int c, l, t;
  assert(cl >= 0);
  c = bn_add_words(r, a, b, cl);
  if (dl == 0)
    return c;
  r += cl;
  a += cl;
  b += cl;
  if (dl < 0) {
    int save_dl = dl;
    while (c) {
      l = (c + b[0]) & (0xffffffffL);
      c = (l < c);
      r[0] = l;
      if (++dl >= 0)
        break;
      l = (c + b[1]) & (0xffffffffL);
      c = (l < c);
      r[1] = l;
      if (++dl >= 0)
        break;
      l = (c + b[2]) & (0xffffffffL);
      c = (l < c);
      r[2] = l;
      if (++dl >= 0)
        break;
      l = (c + b[3]) & (0xffffffffL);
      c = (l < c);
      r[3] = l;
      if (++dl >= 0)
        break;
      save_dl = dl;
      b += 4;
      r += 4;
    }
    if (dl < 0) {
      if (save_dl < dl) {
        switch (dl - save_dl) {
        case 1:
          r[1] = b[1];
          if (++dl >= 0)
            break;
        case 2:
          r[2] = b[2];
          if (++dl >= 0)
            break;
        case 3:
          r[3] = b[3];
          if (++dl >= 0)
            break;
        }
        b += 4;
        r += 4;
      }
    }
    if (dl < 0) {
      for (;;) {
        r[0] = b[0];
        if (++dl >= 0)
          break;
        r[1] = b[1];
        if (++dl >= 0)
          break;
        r[2] = b[2];
        if (++dl >= 0)
          break;
        r[3] = b[3];
        if (++dl >= 0)
          break;
        b += 4;
        r += 4;
      }
    }
  } else {
    int save_dl = dl;
    while (c) {
      t = (a[0] + c) & (0xffffffffL);
      c = (t < c);
      r[0] = t;
      if (--dl <= 0)
        break;
      t = (a[1] + c) & (0xffffffffL);
      c = (t < c);
      r[1] = t;
      if (--dl <= 0)
        break;
      t = (a[2] + c) & (0xffffffffL);
      c = (t < c);
      r[2] = t;
      if (--dl <= 0)
        break;
      t = (a[3] + c) & (0xffffffffL);
      c = (t < c);
      r[3] = t;
      if (--dl <= 0)
        break;
      save_dl = dl;
      a += 4;
      r += 4;
    }
    if (dl > 0) {
      if (save_dl > dl) {
        switch (save_dl - dl) {
        case 1:
          r[1] = a[1];
          if (--dl <= 0)
            break;
        case 2:
          r[2] = a[2];
          if (--dl <= 0)
            break;
        case 3:
          r[3] = a[3];
          if (--dl <= 0)
            break;
        }
        a += 4;
        r += 4;
      }
    }
    if (dl > 0) {
      for (;;) {
        r[0] = a[0];
        if (--dl <= 0)
          break;
        r[1] = a[1];
        if (--dl <= 0)
          break;
        r[2] = a[2];
        if (--dl <= 0)
          break;
        r[3] = a[3];
        if (--dl <= 0)
          break;
        a += 4;
        r += 4;
      }
    }
  }
  return c;
}


x86 assembly (clang, -O0):
<bn_add_part_words>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
mov    %r8d,-0x28(%rbp)
cmpl   $0x0,-0x24(%rbp)
setge  %al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    -0x20(%rbp),%rdx
mov    -0x24(%rbp),%ecx
call   1040 <bn_add_words@plt>
mov    %eax,-0x2c(%rbp)
cmpl   $0x0,-0x28(%rbp)
jne    1178 <bn_add_part_words+0x58>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1801 <bn_add_part_words+0x6e1>
mov    -0x24(%rbp),%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x24(%rbp),%ecx
mov    -0x18(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x18(%rbp)
mov    -0x24(%rbp),%ecx
mov    -0x20(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
cmpl   $0x0,-0x28(%rbp)
jge    14de <bn_add_part_words+0x3be>
mov    -0x28(%rbp),%eax
mov    %eax,-0x38(%rbp)
cmpl   $0x0,-0x2c(%rbp)
je     132a <bn_add_part_words+0x20a>
mov    -0x2c(%rbp),%eax
mov    -0x20(%rbp),%rcx
add    (%rcx),%eax
mov    %eax,%eax
movabs $0xffffffff,%rcx
and    %rcx,%rax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x2c(%rbp),%eax
setb   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x30(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jl     121d <bn_add_part_words+0xfd>
jmp    132a <bn_add_part_words+0x20a>
mov    -0x2c(%rbp),%eax
mov    -0x20(%rbp),%rcx
add    0x4(%rcx),%eax
mov    %eax,%eax
movabs $0xffffffff,%rcx
and    %rcx,%rax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x2c(%rbp),%eax
setb   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x30(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x4(%rax)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jl     126b <bn_add_part_words+0x14b>
jmp    132a <bn_add_part_words+0x20a>
mov    -0x2c(%rbp),%eax
mov    -0x20(%rbp),%rcx
add    0x8(%rcx),%eax
mov    %eax,%eax
movabs $0xffffffff,%rcx
and    %rcx,%rax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x2c(%rbp),%eax
setb   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x30(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x8(%rax)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jl     12b9 <bn_add_part_words+0x199>
jmp    132a <bn_add_part_words+0x20a>
mov    -0x2c(%rbp),%eax
mov    -0x20(%rbp),%rcx
add    0xc(%rcx),%eax
mov    %eax,%eax
movabs $0xffffffff,%rcx
and    %rcx,%rax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x2c(%rbp),%eax
setb   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x30(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0xc(%rax)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jl     1307 <bn_add_part_words+0x1e7>
jmp    132a <bn_add_part_words+0x20a>
mov    -0x28(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x20(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x10(%rbp)
jmp    11c7 <bn_add_part_words+0xa7>
cmpl   $0x0,-0x28(%rbp)
jge    1416 <bn_add_part_words+0x2f6>
mov    -0x38(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    1411 <bn_add_part_words+0x2f1>
mov    -0x28(%rbp),%eax
mov    -0x38(%rbp),%ecx
sub    %ecx,%eax
mov    %eax,-0x40(%rbp)
sub    $0x1,%eax
je     137b <bn_add_part_words+0x25b>
jmp    1359 <bn_add_part_words+0x239>
mov    -0x40(%rbp),%eax
sub    $0x2,%eax
je     13a5 <bn_add_part_words+0x285>
jmp    136a <bn_add_part_words+0x24a>
mov    -0x40(%rbp),%eax
sub    $0x3,%eax
je     13cf <bn_add_part_words+0x2af>
jmp    13f9 <bn_add_part_words+0x2d9>
mov    -0x20(%rbp),%rax
mov    0x4(%rax),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x4(%rax)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jl     13a0 <bn_add_part_words+0x280>
jmp    13f9 <bn_add_part_words+0x2d9>
jmp    13a5 <bn_add_part_words+0x285>
mov    -0x20(%rbp),%rax
mov    0x8(%rax),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x8(%rax)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jl     13ca <bn_add_part_words+0x2aa>
jmp    13f9 <bn_add_part_words+0x2d9>
jmp    13cf <bn_add_part_words+0x2af>
mov    -0x20(%rbp),%rax
mov    0xc(%rax),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0xc(%rax)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jl     13f4 <bn_add_part_words+0x2d4>
jmp    13f9 <bn_add_part_words+0x2d9>
jmp    13f9 <bn_add_part_words+0x2d9>
mov    -0x20(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x10(%rbp)
jmp    1416 <bn_add_part_words+0x2f6>
cmpl   $0x0,-0x28(%rbp)
jge    14d9 <bn_add_part_words+0x3b9>
jmp    1425 <bn_add_part_words+0x305>
mov    -0x20(%rbp),%rax
mov    (%rax),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jl     1448 <bn_add_part_words+0x328>
jmp    14d4 <bn_add_part_words+0x3b4>
mov    -0x20(%rbp),%rax
mov    0x4(%rax),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x4(%rax)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jl     146d <bn_add_part_words+0x34d>
jmp    14d4 <bn_add_part_words+0x3b4>
mov    -0x20(%rbp),%rax
mov    0x8(%rax),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x8(%rax)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jl     1492 <bn_add_part_words+0x372>
jmp    14d4 <bn_add_part_words+0x3b4>
mov    -0x20(%rbp),%rax
mov    0xc(%rax),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0xc(%rax)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jl     14b7 <bn_add_part_words+0x397>
jmp    14d4 <bn_add_part_words+0x3b4>
mov    -0x20(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x10(%rbp)
jmp    1425 <bn_add_part_words+0x305>
jmp    14d9 <bn_add_part_words+0x3b9>
jmp    17fb <bn_add_part_words+0x6db>
mov    -0x28(%rbp),%eax
mov    %eax,-0x3c(%rbp)
cmpl   $0x0,-0x2c(%rbp)
je     1647 <bn_add_part_words+0x527>
mov    -0x18(%rbp),%rax
mov    (%rax),%eax
add    -0x2c(%rbp),%eax
mov    %eax,%eax
movabs $0xffffffff,%rcx
and    %rcx,%rax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x2c(%rbp),%eax
setb   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x34(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jg     153a <bn_add_part_words+0x41a>
jmp    1647 <bn_add_part_words+0x527>
mov    -0x18(%rbp),%rax
mov    0x4(%rax),%eax
add    -0x2c(%rbp),%eax
mov    %eax,%eax
movabs $0xffffffff,%rcx
and    %rcx,%rax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x2c(%rbp),%eax
setb   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x34(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x4(%rax)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jg     1588 <bn_add_part_words+0x468>
jmp    1647 <bn_add_part_words+0x527>
mov    -0x18(%rbp),%rax
mov    0x8(%rax),%eax
add    -0x2c(%rbp),%eax
mov    %eax,%eax
movabs $0xffffffff,%rcx
and    %rcx,%rax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x2c(%rbp),%eax
setb   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x34(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x8(%rax)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jg     15d6 <bn_add_part_words+0x4b6>
jmp    1647 <bn_add_part_words+0x527>
mov    -0x18(%rbp),%rax
mov    0xc(%rax),%eax
add    -0x2c(%rbp),%eax
mov    %eax,%eax
movabs $0xffffffff,%rcx
and    %rcx,%rax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x2c(%rbp),%eax
setb   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x34(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0xc(%rax)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jg     1624 <bn_add_part_words+0x504>
jmp    1647 <bn_add_part_words+0x527>
mov    -0x28(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x18(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x10(%rbp)
jmp    14e4 <bn_add_part_words+0x3c4>
cmpl   $0x0,-0x28(%rbp)
jle    1733 <bn_add_part_words+0x613>
mov    -0x3c(%rbp),%eax
cmp    -0x28(%rbp),%eax
jle    172e <bn_add_part_words+0x60e>
mov    -0x3c(%rbp),%eax
mov    -0x28(%rbp),%ecx
sub    %ecx,%eax
mov    %eax,-0x44(%rbp)
sub    $0x1,%eax
je     1698 <bn_add_part_words+0x578>
jmp    1676 <bn_add_part_words+0x556>
mov    -0x44(%rbp),%eax
sub    $0x2,%eax
je     16c2 <bn_add_part_words+0x5a2>
jmp    1687 <bn_add_part_words+0x567>
mov    -0x44(%rbp),%eax
sub    $0x3,%eax
je     16ec <bn_add_part_words+0x5cc>
jmp    1716 <bn_add_part_words+0x5f6>
mov    -0x18(%rbp),%rax
mov    0x4(%rax),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x4(%rax)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jg     16bd <bn_add_part_words+0x59d>
jmp    1716 <bn_add_part_words+0x5f6>
jmp    16c2 <bn_add_part_words+0x5a2>
mov    -0x18(%rbp),%rax
mov    0x8(%rax),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x8(%rax)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jg     16e7 <bn_add_part_words+0x5c7>
jmp    1716 <bn_add_part_words+0x5f6>
jmp    16ec <bn_add_part_words+0x5cc>
mov    -0x18(%rbp),%rax
mov    0xc(%rax),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0xc(%rax)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jg     1711 <bn_add_part_words+0x5f1>
jmp    1716 <bn_add_part_words+0x5f6>
jmp    1716 <bn_add_part_words+0x5f6>
mov    -0x18(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x10(%rbp)
jmp    1733 <bn_add_part_words+0x613>
cmpl   $0x0,-0x28(%rbp)
jle    17f6 <bn_add_part_words+0x6d6>
jmp    1742 <bn_add_part_words+0x622>
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jg     1765 <bn_add_part_words+0x645>
jmp    17f1 <bn_add_part_words+0x6d1>
mov    -0x18(%rbp),%rax
mov    0x4(%rax),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x4(%rax)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jg     178a <bn_add_part_words+0x66a>
jmp    17f1 <bn_add_part_words+0x6d1>
mov    -0x18(%rbp),%rax
mov    0x8(%rax),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0x8(%rax)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jg     17af <bn_add_part_words+0x68f>
jmp    17f1 <bn_add_part_words+0x6d1>
mov    -0x18(%rbp),%rax
mov    0xc(%rax),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,0xc(%rax)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
cmp    $0x0,%eax
jg     17d4 <bn_add_part_words+0x6b4>
jmp    17f1 <bn_add_part_words+0x6d1>
mov    -0x18(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x10(%rbp)
jmp    1742 <bn_add_part_words+0x622>
jmp    17f6 <bn_add_part_words+0x6d6>
jmp    17fb <bn_add_part_words+0x6db>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<bn_add_part_words>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    %r8d,%r14d
mov    %ecx,%r12d
mov    %rdx,%r15
mov    %rsi,%rbx
mov    %rdi,%rbp
mov    %ecx,%edi
not    %edi
shr    $0x1f,%edi
call   1030 <assert@plt>
mov    %rbp,%rdi
mov    %rbx,%rsi
mov    %r15,%rdx
mov    %r12d,%ecx
call   1040 <bn_add_words@plt>
test   %r14d,%r14d
je     1371 <bn_add_part_words+0x251>
movslq %r12d,%rdx
lea    0x0(%rbp,%rdx,4),%rcx
js     1205 <bn_add_part_words+0xe5>
test   %eax,%eax
je     1301 <bn_add_part_words+0x1e1>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
xor    %ecx,%ecx
add    (%rbx,%rdx,4),%eax
setb   %cl
mov    %eax,0x0(%rbp,%rdx,4)
cmp    $0x2,%r14d
jl     1358 <bn_add_part_words+0x238>
xor    %eax,%eax
add    0x4(%rbx,%rdx,4),%ecx
setb   %al
mov    %ecx,0x4(%rbp,%rdx,4)
cmp    $0x2,%r14d
je     1371 <bn_add_part_words+0x251>
xor    %ecx,%ecx
add    0x8(%rbx,%rdx,4),%eax
setb   %cl
mov    %eax,0x8(%rbp,%rdx,4)
mov    %r14d,%edi
sub    $0x4,%edi
jb     1358 <bn_add_part_words+0x238>
mov    0xc(%rbx,%rdx,4),%esi
add    %ecx,%esi
mov    %esi,0xc(%rbp,%rdx,4)
cmp    $0x4,%r14d
je     1360 <bn_add_part_words+0x240>
add    $0x10,%rbx
add    $0x10,%rbp
mov    $0x1,%eax
mov    %edi,%r14d
cmp    %ecx,%esi
jb     1180 <bn_add_part_words+0x60>
lea    (%rbx,%rdx,4),%rsi
lea    0x0(,%rdx,4),%rcx
add    %rbp,%rcx
mov    %edi,%r14d
jmp    1305 <bn_add_part_words+0x1e5>
lea    (%r15,%rdx,4),%r9
test   %eax,%eax
je     1297 <bn_add_part_words+0x177>
mov    %r14d,%r8d
xor    %esi,%esi
xor    %ebp,%ebp
nopl   0x0(%rax,%rax,1)
xor    %edi,%edi
add    (%r9,%rbp,4),%eax
lea    (%r8,%rbp,1),%rbx
setb   %dil
mov    %eax,(%rcx,%rbp,4)
cmp    $0xfffffffe,%ebx
jg     135c <bn_add_part_words+0x23c>
xor    %eax,%eax
add    0x4(%r9,%rbp,4),%edi
setb   %al
mov    %edi,0x4(%rcx,%rbp,4)
cmp    $0xfffffffe,%ebx
je     1371 <bn_add_part_words+0x251>
xor    %edi,%edi
add    0x8(%r9,%rbp,4),%eax
setb   %dil
mov    %eax,0x8(%rcx,%rbp,4)
cmp    $0xfffffffc,%ebx
ja     135c <bn_add_part_words+0x23c>
mov    0xc(%r9,%rbp,4),%edx
add    %edi,%edx
mov    %edx,0xc(%rcx,%rbp,4)
cmp    $0xfffffffc,%ebx
je     136a <bn_add_part_words+0x24a>
add    $0x4,%rbp
add    $0xfffffffffffffff0,%rsi
mov    $0x1,%eax
cmp    %edi,%edx
jb     1220 <bn_add_part_words+0x100>
add    %ebp,%r14d
sub    %rsi,%r9
sub    %rsi,%rcx
mov    (%r9),%eax
mov    %eax,(%rcx)
cmp    $0xffffffff,%r14d
je     1366 <bn_add_part_words+0x246>
mov    %r14d,%esi
xor    %eax,%eax
xor    %edi,%edi
nopl   (%rax)
lea    (%rsi,%rdi,1),%rdx
mov    0x4(%r9,%rdi,4),%ebp
mov    %ebp,0x4(%rcx,%rdi,4)
cmp    $0xfffffffe,%edx
je     1371 <bn_add_part_words+0x251>
mov    0x8(%r9,%rdi,4),%ebp
mov    %ebp,0x8(%rcx,%rdi,4)
cmp    $0xfffffffc,%edx
ja     1371 <bn_add_part_words+0x251>
mov    0xc(%r9,%rdi,4),%ebp
mov    %ebp,0xc(%rcx,%rdi,4)
cmp    $0xfffffffc,%edx
je     1371 <bn_add_part_words+0x251>
mov    0x10(%r9,%rdi,4),%edx
mov    %edx,0x10(%rcx,%rdi,4)
add    $0x4,%rdi
lea    (%rdi,%rsi,1),%edx
cmp    $0xffffffff,%edx
jne    12b0 <bn_add_part_words+0x190>
jmp    1371 <bn_add_part_words+0x251>
lea    (%rbx,%rdx,4),%rsi
mov    (%rsi),%eax
mov    %eax,(%rcx)
xor    %eax,%eax
cmp    $0x1,%r14d
je     1371 <bn_add_part_words+0x251>
mov    $0x4,%edx
cs nopw 0x0(%rax,%rax,1)
mov    -0xc(%rsi,%rdx,4),%edi
mov    %edi,-0xc(%rcx,%rdx,4)
cmp    $0x2,%r14d
je     1371 <bn_add_part_words+0x251>
mov    -0x8(%rsi,%rdx,4),%edi
mov    %edi,-0x8(%rcx,%rdx,4)
sub    $0x4,%r14d
jb     1371 <bn_add_part_words+0x251>
mov    -0x4(%rsi,%rdx,4),%edi
mov    %edi,-0x4(%rcx,%rdx,4)
je     1371 <bn_add_part_words+0x251>
mov    (%rsi,%rdx,4),%edi
mov    %edi,(%rcx,%rdx,4)
add    $0x4,%rdx
cmp    $0x2,%r14d
jae    1320 <bn_add_part_words+0x200>
jmp    1371 <bn_add_part_words+0x251>
mov    %ecx,%eax
jmp    1371 <bn_add_part_words+0x251>
mov    %edi,%eax
jmp    1371 <bn_add_part_words+0x251>
xor    %eax,%eax
cmp    %ecx,%esi
jmp    136e <bn_add_part_words+0x24e>
xor    %eax,%eax
jmp    1371 <bn_add_part_words+0x251>
xor    %eax,%eax
cmp    %edi,%edx
setb   %al
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @bn_add_part_words(i32* %0, i32* %1, i32* %2, i32 %3, i32 %4) {
%6 = alloca i32
%7 = alloca i32*
%8 = alloca i32*
%9 = alloca i32*
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
store i32* %0, i32** %7
store i32* %1, i32** %8
store i32* %2, i32** %9
store i32 %3, i32* %10
store i32 %4, i32* %11
%17 = load i32, i32* %10
%18 = icmp sge i32 %17, 0
%19 = zext i1 %18 to i32
%20 = call i32 @assert(i32 %19)
%21 = load i32*, i32** %7
%22 = load i32*, i32** %8
%23 = load i32*, i32** %9
%24 = load i32, i32* %10
%25 = call i32 @bn_add_words(i32* %21, i32* %22, i32* %23, i32 %24)
store i32 %25, i32* %12
%26 = load i32, i32* %11
%27 = icmp eq i32 %26, 0
br i1 %27, label %28, label %30
28: ; preds = %5
%29 = load i32, i32* %12
store i32 %29, i32* %6
br label %431
30: ; preds = %5
%31 = load i32, i32* %10
%32 = load i32*, i32** %7
%33 = sext i32 %31 to i64
%34 = getelementptr inbounds i32, i32* %32, i64 %33
store i32* %34, i32** %7
%35 = load i32, i32* %10
%36 = load i32*, i32** %8
%37 = sext i32 %35 to i64
%38 = getelementptr inbounds i32, i32* %36, i64 %37
store i32* %38, i32** %8
%39 = load i32, i32* %10
%40 = load i32*, i32** %9
%41 = sext i32 %39 to i64
%42 = getelementptr inbounds i32, i32* %40, i64 %41
store i32* %42, i32** %9
%43 = load i32, i32* %11
%44 = icmp slt i32 %43, 0
br i1 %44, label %45, label %237
45: ; preds = %30
%46 = load i32, i32* %11
store i32 %46, i32* %15
br label %47
47: ; preds = %130, %45
%48 = load i32, i32* %12
%49 = icmp ne i32 %48, 0
br i1 %49, label %50, label %136
50: ; preds = %47
%51 = load i32, i32* %12
%52 = load i32*, i32** %9
%53 = getelementptr inbounds i32, i32* %52, i64 0
%54 = load i32, i32* %53
%55 = add i32 %51, %54
%56 = zext i32 %55 to i64
%57 = and i64 %56, 4294967295
%58 = trunc i64 %57 to i32
store i32 %58, i32* %13
%59 = load i32, i32* %13
%60 = load i32, i32* %12
%61 = icmp ult i32 %59, %60
%62 = zext i1 %61 to i32
store i32 %62, i32* %12
%63 = load i32, i32* %13
%64 = load i32*, i32** %7
%65 = getelementptr inbounds i32, i32* %64, i64 0
store i32 %63, i32* %65
%66 = load i32, i32* %11
%67 = add nsw i32 %66, 1
store i32 %67, i32* %11
%68 = icmp sge i32 %67, 0
br i1 %68, label %69, label %70
69: ; preds = %50
br label %136
70: ; preds = %50
%71 = load i32, i32* %12
%72 = load i32*, i32** %9
%73 = getelementptr inbounds i32, i32* %72, i64 1
%74 = load i32, i32* %73
%75 = add i32 %71, %74
%76 = zext i32 %75 to i64
%77 = and i64 %76, 4294967295
%78 = trunc i64 %77 to i32
store i32 %78, i32* %13
%79 = load i32, i32* %13
%80 = load i32, i32* %12
%81 = icmp ult i32 %79, %80
%82 = zext i1 %81 to i32
store i32 %82, i32* %12
%83 = load i32, i32* %13
%84 = load i32*, i32** %7
%85 = getelementptr inbounds i32, i32* %84, i64 1
store i32 %83, i32* %85
%86 = load i32, i32* %11
%87 = add nsw i32 %86, 1
store i32 %87, i32* %11
%88 = icmp sge i32 %87, 0
br i1 %88, label %89, label %90
89: ; preds = %70
br label %136
90: ; preds = %70
%91 = load i32, i32* %12
%92 = load i32*, i32** %9
%93 = getelementptr inbounds i32, i32* %92, i64 2
%94 = load i32, i32* %93
%95 = add i32 %91, %94
%96 = zext i32 %95 to i64
%97 = and i64 %96, 4294967295
%98 = trunc i64 %97 to i32
store i32 %98, i32* %13
%99 = load i32, i32* %13
%100 = load i32, i32* %12
%101 = icmp ult i32 %99, %100
%102 = zext i1 %101 to i32
store i32 %102, i32* %12
%103 = load i32, i32* %13
%104 = load i32*, i32** %7
%105 = getelementptr inbounds i32, i32* %104, i64 2
store i32 %103, i32* %105
%106 = load i32, i32* %11
%107 = add nsw i32 %106, 1
store i32 %107, i32* %11
%108 = icmp sge i32 %107, 0
br i1 %108, label %109, label %110
109: ; preds = %90
br label %136
110: ; preds = %90
%111 = load i32, i32* %12
%112 = load i32*, i32** %9
%113 = getelementptr inbounds i32, i32* %112, i64 3
%114 = load i32, i32* %113
%115 = add i32 %111, %114
%116 = zext i32 %115 to i64
%117 = and i64 %116, 4294967295
%118 = trunc i64 %117 to i32
store i32 %118, i32* %13
%119 = load i32, i32* %13
%120 = load i32, i32* %12
%121 = icmp ult i32 %119, %120
%122 = zext i1 %121 to i32
store i32 %122, i32* %12
%123 = load i32, i32* %13
%124 = load i32*, i32** %7
%125 = getelementptr inbounds i32, i32* %124, i64 3
store i32 %123, i32* %125
%126 = load i32, i32* %11
%127 = add nsw i32 %126, 1
store i32 %127, i32* %11
%128 = icmp sge i32 %127, 0
br i1 %128, label %129, label %130
129: ; preds = %110
br label %136
130: ; preds = %110
%131 = load i32, i32* %11
store i32 %131, i32* %15
%132 = load i32*, i32** %9
%133 = getelementptr inbounds i32, i32* %132, i64 4
store i32* %133, i32** %9
%134 = load i32*, i32** %7
%135 = getelementptr inbounds i32, i32* %134, i64 4
store i32* %135, i32** %7
br label %47
136: ; preds = %129, %109, %89, %69, %47
%137 = load i32, i32* %11
%138 = icmp slt i32 %137, 0
br i1 %138, label %139, label %186
139: ; preds = %136
%140 = load i32, i32* %15
%141 = load i32, i32* %11
%142 = icmp slt i32 %140, %141
br i1 %142, label %143, label %185
143: ; preds = %139
%144 = load i32, i32* %11
%145 = load i32, i32* %15
%146 = sub nsw i32 %144, %145
switch i32 %146, label %180 [
i32 1, label %147
i32 2, label %158
i32 3, label %169
]
147: ; preds = %143
%148 = load i32*, i32** %9
%149 = getelementptr inbounds i32, i32* %148, i64 1
%150 = load i32, i32* %149
%151 = load i32*, i32** %7
%152 = getelementptr inbounds i32, i32* %151, i64 1
store i32 %150, i32* %152
%153 = load i32, i32* %11
%154 = add nsw i32 %153, 1
store i32 %154, i32* %11
%155 = icmp sge i32 %154, 0
br i1 %155, label %156, label %157
156: ; preds = %147
br label %180
157: ; preds = %147
br label %158
158: ; preds = %143, %157
%159 = load i32*, i32** %9
%160 = getelementptr inbounds i32, i32* %159, i64 2
%161 = load i32, i32* %160
%162 = load i32*, i32** %7
%163 = getelementptr inbounds i32, i32* %162, i64 2
store i32 %161, i32* %163
%164 = load i32, i32* %11
%165 = add nsw i32 %164, 1
store i32 %165, i32* %11
%166 = icmp sge i32 %165, 0
br i1 %166, label %167, label %168
167: ; preds = %158
br label %180
168: ; preds = %158
br label %169
169: ; preds = %143, %168
%170 = load i32*, i32** %9
%171 = getelementptr inbounds i32, i32* %170, i64 3
%172 = load i32, i32* %171
%173 = load i32*, i32** %7
%174 = getelementptr inbounds i32, i32* %173, i64 3
store i32 %172, i32* %174
%175 = load i32, i32* %11
%176 = add nsw i32 %175, 1
store i32 %176, i32* %11
%177 = icmp sge i32 %176, 0
br i1 %177, label %178, label %179
178: ; preds = %169
br label %180
179: ; preds = %169
br label %180
180: ; preds = %179, %143, %178, %167, %156
%181 = load i32*, i32** %9
%182 = getelementptr inbounds i32, i32* %181, i64 4
store i32* %182, i32** %9
%183 = load i32*, i32** %7
%184 = getelementptr inbounds i32, i32* %183, i64 4
store i32* %184, i32** %7
br label %185
185: ; preds = %180, %139
br label %186
186: ; preds = %185, %136
%187 = load i32, i32* %11
%188 = icmp slt i32 %187, 0
br i1 %188, label %189, label %236
189: ; preds = %186
br label %190
190: ; preds = %230, %189
%191 = load i32*, i32** %9
%192 = getelementptr inbounds i32, i32* %191, i64 0
%193 = load i32, i32* %192
%194 = load i32*, i32** %7
%195 = getelementptr inbounds i32, i32* %194, i64 0
store i32 %193, i32* %195
%196 = load i32, i32* %11
%197 = add nsw i32 %196, 1
store i32 %197, i32* %11
%198 = icmp sge i32 %197, 0
br i1 %198, label %199, label %200
199: ; preds = %190
br label %235
200: ; preds = %190
%201 = load i32*, i32** %9
%202 = getelementptr inbounds i32, i32* %201, i64 1
%203 = load i32, i32* %202
%204 = load i32*, i32** %7
%205 = getelementptr inbounds i32, i32* %204, i64 1
store i32 %203, i32* %205
%206 = load i32, i32* %11
%207 = add nsw i32 %206, 1
store i32 %207, i32* %11
%208 = icmp sge i32 %207, 0
br i1 %208, label %209, label %210
209: ; preds = %200
br label %235
210: ; preds = %200
%211 = load i32*, i32** %9
%212 = getelementptr inbounds i32, i32* %211, i64 2
%213 = load i32, i32* %212
%214 = load i32*, i32** %7
%215 = getelementptr inbounds i32, i32* %214, i64 2
store i32 %213, i32* %215
%216 = load i32, i32* %11
%217 = add nsw i32 %216, 1
store i32 %217, i32* %11
%218 = icmp sge i32 %217, 0
br i1 %218, label %219, label %220
219: ; preds = %210
br label %235
220: ; preds = %210
%221 = load i32*, i32** %9
%222 = getelementptr inbounds i32, i32* %221, i64 3
%223 = load i32, i32* %222
%224 = load i32*, i32** %7
%225 = getelementptr inbounds i32, i32* %224, i64 3
store i32 %223, i32* %225
%226 = load i32, i32* %11
%227 = add nsw i32 %226, 1
store i32 %227, i32* %11
%228 = icmp sge i32 %227, 0
br i1 %228, label %229, label %230
229: ; preds = %220
br label %235
230: ; preds = %220
%231 = load i32*, i32** %9
%232 = getelementptr inbounds i32, i32* %231, i64 4
store i32* %232, i32** %9
%233 = load i32*, i32** %7
%234 = getelementptr inbounds i32, i32* %233, i64 4
store i32* %234, i32** %7
br label %190
235: ; preds = %229, %219, %209, %199
br label %236
236: ; preds = %235, %186
br label %429
237: ; preds = %30
%238 = load i32, i32* %11
store i32 %238, i32* %16
br label %239
239: ; preds = %322, %237
%240 = load i32, i32* %12
%241 = icmp ne i32 %240, 0
br i1 %241, label %242, label %328
242: ; preds = %239
%243 = load i32*, i32** %8
%244 = getelementptr inbounds i32, i32* %243, i64 0
%245 = load i32, i32* %244
%246 = load i32, i32* %12
%247 = add i32 %245, %246
%248 = zext i32 %247 to i64
%249 = and i64 %248, 4294967295
%250 = trunc i64 %249 to i32
store i32 %250, i32* %14
%251 = load i32, i32* %14
%252 = load i32, i32* %12
%253 = icmp ult i32 %251, %252
%254 = zext i1 %253 to i32
store i32 %254, i32* %12
%255 = load i32, i32* %14
%256 = load i32*, i32** %7
%257 = getelementptr inbounds i32, i32* %256, i64 0
store i32 %255, i32* %257
%258 = load i32, i32* %11
%259 = add nsw i32 %258, -1
store i32 %259, i32* %11
%260 = icmp sle i32 %259, 0
br i1 %260, label %261, label %262
261: ; preds = %242
br label %328
262: ; preds = %242
%263 = load i32*, i32** %8
%264 = getelementptr inbounds i32, i32* %263, i64 1
%265 = load i32, i32* %264
%266 = load i32, i32* %12
%267 = add i32 %265, %266
%268 = zext i32 %267 to i64
%269 = and i64 %268, 4294967295
%270 = trunc i64 %269 to i32
store i32 %270, i32* %14
%271 = load i32, i32* %14
%272 = load i32, i32* %12
%273 = icmp ult i32 %271, %272
%274 = zext i1 %273 to i32
store i32 %274, i32* %12
%275 = load i32, i32* %14
%276 = load i32*, i32** %7
%277 = getelementptr inbounds i32, i32* %276, i64 1
store i32 %275, i32* %277
%278 = load i32, i32* %11
%279 = add nsw i32 %278, -1
store i32 %279, i32* %11
%280 = icmp sle i32 %279, 0
br i1 %280, label %281, label %282
281: ; preds = %262
br label %328
282: ; preds = %262
%283 = load i32*, i32** %8
%284 = getelementptr inbounds i32, i32* %283, i64 2
%285 = load i32, i32* %284
%286 = load i32, i32* %12
%287 = add i32 %285, %286
%288 = zext i32 %287 to i64
%289 = and i64 %288, 4294967295
%290 = trunc i64 %289 to i32
store i32 %290, i32* %14
%291 = load i32, i32* %14
%292 = load i32, i32* %12
%293 = icmp ult i32 %291, %292
%294 = zext i1 %293 to i32
store i32 %294, i32* %12
%295 = load i32, i32* %14
%296 = load i32*, i32** %7
%297 = getelementptr inbounds i32, i32* %296, i64 2
store i32 %295, i32* %297
%298 = load i32, i32* %11
%299 = add nsw i32 %298, -1
store i32 %299, i32* %11
%300 = icmp sle i32 %299, 0
br i1 %300, label %301, label %302
301: ; preds = %282
br label %328
302: ; preds = %282
%303 = load i32*, i32** %8
%304 = getelementptr inbounds i32, i32* %303, i64 3
%305 = load i32, i32* %304
%306 = load i32, i32* %12
%307 = add i32 %305, %306
%308 = zext i32 %307 to i64
%309 = and i64 %308, 4294967295
%310 = trunc i64 %309 to i32
store i32 %310, i32* %14
%311 = load i32, i32* %14
%312 = load i32, i32* %12
%313 = icmp ult i32 %311, %312
%314 = zext i1 %313 to i32
store i32 %314, i32* %12
%315 = load i32, i32* %14
%316 = load i32*, i32** %7
%317 = getelementptr inbounds i32, i32* %316, i64 3
store i32 %315, i32* %317
%318 = load i32, i32* %11
%319 = add nsw i32 %318, -1
store i32 %319, i32* %11
%320 = icmp sle i32 %319, 0
br i1 %320, label %321, label %322
321: ; preds = %302
br label %328
322: ; preds = %302
%323 = load i32, i32* %11
store i32 %323, i32* %16
%324 = load i32*, i32** %8
%325 = getelementptr inbounds i32, i32* %324, i64 4
store i32* %325, i32** %8
%326 = load i32*, i32** %7
%327 = getelementptr inbounds i32, i32* %326, i64 4
store i32* %327, i32** %7
br label %239
328: ; preds = %321, %301, %281, %261, %239
%329 = load i32, i32* %11
%330 = icmp sgt i32 %329, 0
br i1 %330, label %331, label %378
331: ; preds = %328
%332 = load i32, i32* %16
%333 = load i32, i32* %11
%334 = icmp sgt i32 %332, %333
br i1 %334, label %335, label %377
335: ; preds = %331
%336 = load i32, i32* %16
%337 = load i32, i32* %11
%338 = sub nsw i32 %336, %337
switch i32 %338, label %372 [
i32 1, label %339
i32 2, label %350
i32 3, label %361
]
339: ; preds = %335
%340 = load i32*, i32** %8
%341 = getelementptr inbounds i32, i32* %340, i64 1
%342 = load i32, i32* %341
%343 = load i32*, i32** %7
%344 = getelementptr inbounds i32, i32* %343, i64 1
store i32 %342, i32* %344
%345 = load i32, i32* %11
%346 = add nsw i32 %345, -1
store i32 %346, i32* %11
%347 = icmp sle i32 %346, 0
br i1 %347, label %348, label %349
348: ; preds = %339
br label %372
349: ; preds = %339
br label %350
350: ; preds = %335, %349
%351 = load i32*, i32** %8
%352 = getelementptr inbounds i32, i32* %351, i64 2
%353 = load i32, i32* %352
%354 = load i32*, i32** %7
%355 = getelementptr inbounds i32, i32* %354, i64 2
store i32 %353, i32* %355
%356 = load i32, i32* %11
%357 = add nsw i32 %356, -1
store i32 %357, i32* %11
%358 = icmp sle i32 %357, 0
br i1 %358, label %359, label %360
359: ; preds = %350
br label %372
360: ; preds = %350
br label %361
361: ; preds = %335, %360
%362 = load i32*, i32** %8
%363 = getelementptr inbounds i32, i32* %362, i64 3
%364 = load i32, i32* %363
%365 = load i32*, i32** %7
%366 = getelementptr inbounds i32, i32* %365, i64 3
store i32 %364, i32* %366
%367 = load i32, i32* %11
%368 = add nsw i32 %367, -1
store i32 %368, i32* %11
%369 = icmp sle i32 %368, 0
br i1 %369, label %370, label %371
370: ; preds = %361
br label %372
371: ; preds = %361
br label %372
372: ; preds = %371, %335, %370, %359, %348
%373 = load i32*, i32** %8
%374 = getelementptr inbounds i32, i32* %373, i64 4
store i32* %374, i32** %8
%375 = load i32*, i32** %7
%376 = getelementptr inbounds i32, i32* %375, i64 4
store i32* %376, i32** %7
br label %377
377: ; preds = %372, %331
br label %378
378: ; preds = %377, %328
%379 = load i32, i32* %11
%380 = icmp sgt i32 %379, 0
br i1 %380, label %381, label %428
381: ; preds = %378
br label %382
382: ; preds = %422, %381
%383 = load i32*, i32** %8
%384 = getelementptr inbounds i32, i32* %383, i64 0
%385 = load i32, i32* %384
%386 = load i32*, i32** %7
%387 = getelementptr inbounds i32, i32* %386, i64 0
store i32 %385, i32* %387
%388 = load i32, i32* %11
%389 = add nsw i32 %388, -1
store i32 %389, i32* %11
%390 = icmp sle i32 %389, 0
br i1 %390, label %391, label %392
391: ; preds = %382
br label %427
392: ; preds = %382
%393 = load i32*, i32** %8
%394 = getelementptr inbounds i32, i32* %393, i64 1
%395 = load i32, i32* %394
%396 = load i32*, i32** %7
%397 = getelementptr inbounds i32, i32* %396, i64 1
store i32 %395, i32* %397
%398 = load i32, i32* %11
%399 = add nsw i32 %398, -1
store i32 %399, i32* %11
%400 = icmp sle i32 %399, 0
br i1 %400, label %401, label %402
401: ; preds = %392
br label %427
402: ; preds = %392
%403 = load i32*, i32** %8
%404 = getelementptr inbounds i32, i32* %403, i64 2
%405 = load i32, i32* %404
%406 = load i32*, i32** %7
%407 = getelementptr inbounds i32, i32* %406, i64 2
store i32 %405, i32* %407
%408 = load i32, i32* %11
%409 = add nsw i32 %408, -1
store i32 %409, i32* %11
%410 = icmp sle i32 %409, 0
br i1 %410, label %411, label %412
411: ; preds = %402
br label %427
412: ; preds = %402
%413 = load i32*, i32** %8
%414 = getelementptr inbounds i32, i32* %413, i64 3
%415 = load i32, i32* %414
%416 = load i32*, i32** %7
%417 = getelementptr inbounds i32, i32* %416, i64 3
store i32 %415, i32* %417
%418 = load i32, i32* %11
%419 = add nsw i32 %418, -1
store i32 %419, i32* %11
%420 = icmp sle i32 %419, 0
br i1 %420, label %421, label %422
421: ; preds = %412
br label %427
422: ; preds = %412
%423 = load i32*, i32** %8
%424 = getelementptr inbounds i32, i32* %423, i64 4
store i32* %424, i32** %8
%425 = load i32*, i32** %7
%426 = getelementptr inbounds i32, i32* %425, i64 4
store i32* %426, i32** %7
br label %382
427: ; preds = %421, %411, %401, %391
br label %428
428: ; preds = %427, %378
br label %429
429: ; preds = %428, %236
%430 = load i32, i32* %12
store i32 %430, i32* %6
br label %431
431: ; preds = %429, %28
%432 = load i32, i32* %6
ret i32 %432
}

LLVM IR (-O2):
define i32 @bn_add_part_words(i32* %0, i32* %1, i32* %2, i32 %3, i32 %4) {
%6 = xor i32 %3, -1
%7 = lshr i32 %6, 31
%8 = tail call i32 @assert(i32 %7)
%9 = tail call i32 @bn_add_words(i32* %0, i32* %1, i32* %2, i32 %3)
%10 = icmp eq i32 %4, 0
br i1 %10, label %159, label %11
11: ; preds = %5
%12 = sext i32 %3 to i64
%13 = getelementptr inbounds i32, i32* %0, i64 %12
%14 = icmp slt i32 %4, 0
br i1 %14, label %15, label %85
15: ; preds = %11
%16 = getelementptr inbounds i32, i32* %2, i64 %12
%17 = icmp eq i32 %9, 0
br i1 %17, label %18, label %24
18: ; preds = %57, %15
%19 = phi i32* [ %13, %15 ], [ %60, %57 ]
%20 = phi i32* [ %16, %15 ], [ %59, %57 ]
%21 = phi i32 [ %4, %15 ], [ %58, %57 ]
%22 = load i32, i32* %20
store i32 %22, i32* %19
%23 = icmp eq i32 %21, -1
br i1 %23, label %159, label %61
24: ; preds = %15, %57
%25 = phi i32 [ %58, %57 ], [ %4, %15 ]
%26 = phi i32 [ 1, %57 ], [ %9, %15 ]
%27 = phi i32* [ %59, %57 ], [ %16, %15 ]
%28 = phi i32* [ %60, %57 ], [ %13, %15 ]
%29 = load i32, i32* %27
%30 = add i32 %29, %26
%31 = icmp ult i32 %30, %26
%32 = zext i1 %31 to i32
store i32 %30, i32* %28
%33 = icmp sgt i32 %25, -2
br i1 %33, label %159, label %34
34: ; preds = %24
%35 = getelementptr inbounds i32, i32* %27, i64 1
%36 = load i32, i32* %35
%37 = add i32 %36, %32
%38 = icmp ult i32 %37, %32
%39 = zext i1 %38 to i32
%40 = getelementptr inbounds i32, i32* %28, i64 1
store i32 %37, i32* %40
%41 = icmp eq i32 %25, -2
br i1 %41, label %159, label %42
42: ; preds = %34
%43 = getelementptr inbounds i32, i32* %27, i64 2
%44 = load i32, i32* %43
%45 = add i32 %44, %39
%46 = icmp ult i32 %45, %39
%47 = zext i1 %46 to i32
%48 = getelementptr inbounds i32, i32* %28, i64 2
store i32 %45, i32* %48
%49 = icmp ugt i32 %25, -4
br i1 %49, label %159, label %50
50: ; preds = %42
%51 = getelementptr inbounds i32, i32* %27, i64 3
%52 = load i32, i32* %51
%53 = add i32 %52, %47
%54 = icmp ult i32 %53, %47
%55 = getelementptr inbounds i32, i32* %28, i64 3
store i32 %53, i32* %55
%56 = icmp eq i32 %25, -4
br i1 %56, label %155, label %57
57: ; preds = %50
%58 = add nuw nsw i32 %25, 4
%59 = getelementptr inbounds i32, i32* %27, i64 4
%60 = getelementptr inbounds i32, i32* %28, i64 4
br i1 %54, label %24, label %18
61: ; preds = %18, %79
%62 = phi i32 [ %80, %79 ], [ %21, %18 ]
%63 = phi i32* [ %81, %79 ], [ %20, %18 ]
%64 = phi i32* [ %82, %79 ], [ %19, %18 ]
%65 = getelementptr inbounds i32, i32* %63, i64 1
%66 = load i32, i32* %65
%67 = getelementptr inbounds i32, i32* %64, i64 1
store i32 %66, i32* %67
%68 = icmp eq i32 %62, -2
br i1 %68, label %159, label %69
69: ; preds = %61
%70 = getelementptr inbounds i32, i32* %63, i64 2
%71 = load i32, i32* %70
%72 = getelementptr inbounds i32, i32* %64, i64 2
store i32 %71, i32* %72
%73 = icmp ugt i32 %62, -4
br i1 %73, label %159, label %74
74: ; preds = %69
%75 = getelementptr inbounds i32, i32* %63, i64 3
%76 = load i32, i32* %75
%77 = getelementptr inbounds i32, i32* %64, i64 3
store i32 %76, i32* %77
%78 = icmp eq i32 %62, -4
br i1 %78, label %159, label %79
79: ; preds = %74
%80 = add nuw nsw i32 %62, 4
%81 = getelementptr inbounds i32, i32* %63, i64 4
%82 = getelementptr inbounds i32, i32* %64, i64 4
%83 = load i32, i32* %81
store i32 %83, i32* %82
%84 = icmp eq i32 %80, -1
br i1 %84, label %159, label %61
85: ; preds = %11
%86 = getelementptr inbounds i32, i32* %1, i64 %12
%87 = icmp eq i32 %9, 0
br i1 %87, label %125, label %88
88: ; preds = %85, %121
%89 = phi i32 [ %122, %121 ], [ %4, %85 ]
%90 = phi i32 [ 1, %121 ], [ %9, %85 ]
%91 = phi i32* [ %123, %121 ], [ %86, %85 ]
%92 = phi i32* [ %124, %121 ], [ %13, %85 ]
%93 = load i32, i32* %91
%94 = add i32 %93, %90
%95 = icmp ult i32 %94, %90
%96 = zext i1 %95 to i32
store i32 %94, i32* %92
%97 = icmp slt i32 %89, 2
br i1 %97, label %159, label %98
98: ; preds = %88
%99 = getelementptr inbounds i32, i32* %91, i64 1
%100 = load i32, i32* %99
%101 = add i32 %100, %96
%102 = icmp ult i32 %101, %96
%103 = zext i1 %102 to i32
%104 = getelementptr inbounds i32, i32* %92, i64 1
store i32 %101, i32* %104
%105 = icmp eq i32 %89, 2
br i1 %105, label %159, label %106
106: ; preds = %98
%107 = getelementptr inbounds i32, i32* %91, i64 2
%108 = load i32, i32* %107
%109 = add i32 %108, %103
%110 = icmp ult i32 %109, %103
%111 = zext i1 %110 to i32
%112 = getelementptr inbounds i32, i32* %92, i64 2
store i32 %109, i32* %112
%113 = icmp ult i32 %89, 4
br i1 %113, label %159, label %114
114: ; preds = %106
%115 = getelementptr inbounds i32, i32* %91, i64 3
%116 = load i32, i32* %115
%117 = add i32 %116, %111
%118 = icmp ult i32 %117, %111
%119 = getelementptr inbounds i32, i32* %92, i64 3
store i32 %117, i32* %119
%120 = icmp eq i32 %89, 4
br i1 %120, label %157, label %121
121: ; preds = %114
%122 = add nsw i32 %89, -4
%123 = getelementptr inbounds i32, i32* %91, i64 4
%124 = getelementptr inbounds i32, i32* %92, i64 4
br i1 %118, label %88, label %125
125: ; preds = %121, %85
%126 = phi i32* [ %13, %85 ], [ %124, %121 ]
%127 = phi i32* [ %86, %85 ], [ %123, %121 ]
%128 = phi i32 [ %4, %85 ], [ %122, %121 ]
%129 = load i32, i32* %127
store i32 %129, i32* %126
%130 = icmp eq i32 %128, 1
br i1 %130, label %159, label %131
131: ; preds = %125, %149
%132 = phi i32 [ %150, %149 ], [ %128, %125 ]
%133 = phi i32* [ %151, %149 ], [ %127, %125 ]
%134 = phi i32* [ %152, %149 ], [ %126, %125 ]
%135 = getelementptr inbounds i32, i32* %133, i64 1
%136 = load i32, i32* %135
%137 = getelementptr inbounds i32, i32* %134, i64 1
store i32 %136, i32* %137
%138 = icmp eq i32 %132, 2
br i1 %138, label %159, label %139
139: ; preds = %131
%140 = getelementptr inbounds i32, i32* %133, i64 2
%141 = load i32, i32* %140
%142 = getelementptr inbounds i32, i32* %134, i64 2
store i32 %141, i32* %142
%143 = icmp ult i32 %132, 4
br i1 %143, label %159, label %144
144: ; preds = %139
%145 = getelementptr inbounds i32, i32* %133, i64 3
%146 = load i32, i32* %145
%147 = getelementptr inbounds i32, i32* %134, i64 3
store i32 %146, i32* %147
%148 = icmp eq i32 %132, 4
br i1 %148, label %159, label %149
149: ; preds = %144
%150 = add nsw i32 %132, -4
%151 = getelementptr inbounds i32, i32* %133, i64 4
%152 = getelementptr inbounds i32, i32* %134, i64 4
%153 = load i32, i32* %151
store i32 %153, i32* %152
%154 = icmp ult i32 %150, 2
br i1 %154, label %159, label %131
155: ; preds = %50
%156 = zext i1 %54 to i32
br label %159
157: ; preds = %114
%158 = zext i1 %118 to i32
br label %159
159: ; preds = %106, %98, %88, %144, %139, %131, %149, %42, %34, %24, %74, %69, %61, %79, %157, %155, %125, %18, %5
%160 = phi i32 [ %9, %5 ], [ 0, %18 ], [ 0, %125 ], [ %156, %155 ], [ %158, %157 ], [ 0, %79 ], [ 0, %61 ], [ 0, %69 ], [ 0, %74 ], [ %47, %42 ], [ %39, %34 ], [ %32, %24 ], [ 0, %149 ], [ 0, %131 ], [ 0, %139 ], [ 0, %144 ], [ %111, %106 ], [ %103, %98 ], [ %96, %88 ]
ret i32 %160
}