int gels(A, R, M, EPS, AUX)
double A[], R[];
int M;
double EPS;
double AUX[];
{
  int I = 0, J = 0, K, L, IER;
  int II, LL, LLD, LR, LT, LST, LLST, LEND;
  double tb, piv, tol, pivi;
  if (M <= 0) {
  fatal:
    IER = -1;
    goto done;
  }
  IER = 0;
  piv = 0.0;
  L = 0;
  for (K = 1; K <= M; K++) {
    L += K;
    tb = fabs(A[L - 1]);
    if (tb > piv) {
      piv = tb;
      I = L;
      J = K;
    }
  }
  tol = EPS * piv;
  LST = 0;
  LEND = M - 1;
  for (K = 1; K <= M; K++) {
    if (piv <= 0.0)
      goto fatal;
    if (IER == 0) {
      if (piv <= tol) {
        IER = K - 1;
      }
    }
    LT = J - K;
    LST += K;
    pivi = 1.0 / A[I - 1];
    L = K;
    LL = L + LT;
    tb = pivi * R[LL - 1];
    R[LL - 1] = R[L - 1];
    R[L - 1] = tb;
    if (K >= M)
      break;
    LR = LST + (LT * (K + J - 1)) / 2;
    LL = LR;
    L = LST;
    for (II = K; II <= LEND; II++) {
      L += II;
      LL += 1;
      if (L == LR) {
        A[LL - 1] = A[LST - 1];
        tb = A[L - 1];
        goto lab13;
      }
      if (L > LR)
        LL = L + LT;
      tb = A[LL - 1];
      A[LL - 1] = A[L - 1];
    lab13:
      AUX[II - 1] = tb;
      A[L - 1] = pivi * tb;
    }
    A[LST - 1] = LT;
    piv = 0.0;
    LLST = LST;
    LT = 0;
    for (II = K; II <= LEND; II++) {
      pivi = -AUX[II - 1];
      LL = LLST;
      LT += 1;
      for (LLD = II; LLD <= LEND; LLD++) {
        LL += LLD;
        L = LL + LT;
        A[L - 1] += pivi * A[LL - 1];
      }
      LLST += II;
      LR = LLST + LT;
      tb = fabs(A[LR - 1]);
      if (tb > piv) {
        piv = tb;
        I = LR;
        J = II + 1;
      }
      LR = K;
      LL = LR + LT;
      R[LL - 1] += pivi * R[LR - 1];
    }
  }
  if (LEND <= 0) {
    if (LEND < 0)
      goto fatal;
    goto done;
  }
  II = M;
  for (I = 2; I <= M; I++) {
    LST -= II;
    II -= 1;
    L = A[LST - 1] + 0.5;
    J = II;
    tb = R[J - 1];
    LL = J;
    K = LST;
    for (LT = II; LT <= LEND; LT++) {
      LL += 1;
      K += LT;
      tb -= A[K - 1] * R[LL - 1];
    }
    K = J + L;
    R[J - 1] = R[K - 1];
    R[K - 1] = tb;
  }
done:
  return (IER);
}


x86 assembly (clang, -O0):
<gels>:
push   %rbp
mov    %rsp,%rbp
push   %rax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movsd  %xmm0,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
cmpl   $0x0,-0x14(%rbp)
jg     1142 <gels+0x42>
jmp    1136 <gels+0x36>
movl   $0xffffffff,-0x3c(%rbp)
jmp    1733 <gels+0x633>
movl   $0x0,-0x3c(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x70(%rbp)
movl   $0x0,-0x38(%rbp)
movl   $0x1,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x14(%rbp),%eax
jg     11cf <gels+0xcf>
mov    -0x34(%rbp),%eax
add    -0x38(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movaps 0xe83(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
ucomisd -0x70(%rbp),%xmm0
jbe    11bc <gels+0xbc>
movsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x38(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x34(%rbp),%eax
mov    %eax,-0x30(%rbp)
jmp    11c1 <gels+0xc1>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    115f <gels+0x5f>
movsd  -0x20(%rbp),%xmm0
mulsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x5c(%rbp)
movl   $0x1,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x14(%rbp),%eax
jg     15c8 <gels+0x4c8>
xorps  %xmm0,%xmm0
ucomisd -0x70(%rbp),%xmm0
jb     1214 <gels+0x114>
jmp    1136 <gels+0x36>
cmpl   $0x0,-0x3c(%rbp)
jne    1240 <gels+0x140>
movsd  -0x70(%rbp),%xmm1
movsd  -0x78(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jb     123b <gels+0x13b>
mov    -0x34(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1240 <gels+0x140>
mov    -0x30(%rbp),%eax
sub    -0x34(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    -0x34(%rbp),%eax
add    -0x54(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  0xd99(%rip),%xmm0
divsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x34(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
add    -0x50(%rbp),%eax
mov    %eax,-0x44(%rbp)
movsd  -0x80(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mulsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x68(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x34(%rbp),%eax
cmp    -0x14(%rbp),%eax
jl     12e8 <gels+0x1e8>
jmp    15c8 <gels+0x4c8>
mov    -0x54(%rbp),%eax
mov    %eax,-0x84(%rbp)
mov    -0x50(%rbp),%eax
mov    -0x34(%rbp),%ecx
add    -0x30(%rbp),%ecx
sub    $0x1,%ecx
imul   %ecx,%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x84(%rbp),%eax
add    %ecx,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x54(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x34(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x40(%rbp),%eax
cmp    -0x5c(%rbp),%eax
jg     1422 <gels+0x322>
mov    -0x40(%rbp),%eax
add    -0x38(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x4c(%rbp),%eax
jne    1391 <gels+0x291>
mov    -0x8(%rbp),%rax
mov    -0x54(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x68(%rbp)
jmp    13e1 <gels+0x2e1>
mov    -0x38(%rbp),%eax
cmp    -0x4c(%rbp),%eax
jle    13a6 <gels+0x2a6>
mov    -0x38(%rbp),%eax
add    -0x50(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x68(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x40(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x80(%rbp),%xmm0
mulsd  -0x68(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    1327 <gels+0x227>
cvtsi2sdl -0x50(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x54(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x54(%rbp),%eax
mov    %eax,-0x58(%rbp)
movl   $0x0,-0x50(%rbp)
mov    -0x34(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x40(%rbp),%eax
cmp    -0x5c(%rbp),%eax
jg     15b5 <gels+0x4b5>
mov    -0x28(%rbp),%rax
mov    -0x40(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x58(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
mov    -0x40(%rbp),%eax
mov    %eax,-0x48(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0x5c(%rbp),%eax
jg     1505 <gels+0x405>
mov    -0x48(%rbp),%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%eax
add    -0x50(%rbp),%eax
mov    %eax,-0x38(%rbp)
movsd  -0x80(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    14a3 <gels+0x3a3>
mov    -0x40(%rbp),%eax
add    -0x58(%rbp),%eax
mov    %eax,-0x58(%rbp)
mov    -0x58(%rbp),%eax
add    -0x50(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x4c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movaps 0xae0(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
ucomisd -0x70(%rbp),%xmm0
jbe    1562 <gels+0x462>
movsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x4c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x34(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
add    -0x50(%rbp),%eax
mov    %eax,-0x44(%rbp)
movsd  -0x80(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x4c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x10(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    1454 <gels+0x354>
jmp    15ba <gels+0x4ba>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    11f5 <gels+0xf5>
cmpl   $0x0,-0x5c(%rbp)
jg     15e6 <gels+0x4e6>
cmpl   $0x0,-0x5c(%rbp)
jge    15e1 <gels+0x4e1>
jmp    1136 <gels+0x36>
jmp    1733 <gels+0x633>
mov    -0x14(%rbp),%eax
mov    %eax,-0x40(%rbp)
movl   $0x2,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jg     172e <gels+0x62e>
mov    -0x40(%rbp),%ecx
mov    -0x54(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x54(%rbp)
mov    -0x40(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x40(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x54(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  0x9e0(%rip),%xmm0
addsd  (%rax,%rcx,8),%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x38(%rbp)
mov    -0x40(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x30(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x54(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x40(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    -0x50(%rbp),%eax
cmp    -0x5c(%rbp),%eax
jg     16dc <gels+0x5dc>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
mov    -0x50(%rbp),%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x68(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    1663 <gels+0x563>
mov    -0x30(%rbp),%eax
add    -0x38(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x68(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    15f3 <gels+0x4f3>
jmp    1733 <gels+0x633>
mov    -0x3c(%rbp),%eax
add    $0x8,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<gels>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rcx,-0x8(%rsp)
mov    $0xffffffff,%eax
test   %edx,%edx
jle    1458 <gels+0x358>
mov    %edx,%r8d
cmp    $0x1,%edx
mov    %r8,-0x30(%rsp)
jne    113c <gels+0x3c>
xorpd  %xmm5,%xmm5
xor    %r9d,%r9d
mov    $0x1,%ebx
xor    %r13d,%r13d
xor    %ebp,%ebp
jmp    11b2 <gels+0xb2>
and    $0xfffffffe,%r8d
xorpd  %xmm5,%xmm5
xor    %r9d,%r9d
mov    $0x1,%ebx
movapd 0xeac(%rip),%xmm1
xor    %r13d,%r13d
xor    %ebp,%ebp
xor    %r10d,%r10d
nopl   0x0(%rax)
add    %ebx,%ebp
movslq %ebp,%rcx
movsd  -0x8(%rdi,%rcx,8),%xmm2
andpd  %xmm1,%xmm2
ucomisd %xmm5,%xmm2
cmova  %ebx,%r13d
cmova  %ecx,%r9d
maxsd  %xmm5,%xmm2
lea    (%rbx,%rcx,1),%ebp
add    $0x1,%ebp
add    %ebx,%ecx
movslq %ecx,%rcx
movsd  (%rdi,%rcx,8),%xmm5
andpd  %xmm1,%xmm5
ucomisd %xmm2,%xmm5
lea    0x1(%rbx),%ecx
cmova  %ecx,%r13d
cmova  %ebp,%r9d
maxsd  %xmm2,%xmm5
add    $0x2,%r10
add    $0x2,%ebx
cmp    %r8,%r10
jne    1160 <gels+0x60>
mov    -0x30(%rsp),%r11
test   $0x1,%r11b
je     11e4 <gels+0xe4>
add    %ebx,%ebp
movslq %ebp,%rbp
movsd  -0x8(%rdi,%rbp,8),%xmm1
andpd  0xe30(%rip),%xmm1
ucomisd %xmm5,%xmm1
cmova  %ebx,%r13d
maxsd  %xmm5,%xmm1
cmova  %ebp,%r9d
movapd %xmm1,%xmm5
xorpd  %xmm1,%xmm1
ucomisd %xmm5,%xmm1
jae    1458 <gels+0x358>
mulsd  %xmm5,%xmm0
movslq %edx,%rbx
mov    $0x1,%r14d
xor    %eax,%eax
mov    %rax,-0x40(%rsp)
movsd  0xe12(%rip),%xmm2
movapd 0xdfa(%rip),%xmm3
movapd 0xde2(%rip),%xmm4
mov    %edx,-0x24(%rsp)
mov    %edx,-0x34(%rsp)
xor    %r15d,%r15d
nopl   0x0(%rax)
cmpl   $0x0,-0x40(%rsp)
jne    1250 <gels+0x150>
xor    %eax,%eax
mov    %rax,-0x40(%rsp)
ucomisd %xmm5,%xmm0
jb     1250 <gels+0x150>
lea    -0x1(%r14),%eax
mov    %rax,-0x40(%rsp)
nopl   (%rax)
movslq %r9d,%rax
movapd %xmm2,%xmm5
divsd  -0x8(%rdi,%rax,8),%xmm5
add    %r14d,%r15d
movslq %r13d,%rax
movsd  -0x8(%rsi,%rax,8),%xmm6
mulsd  %xmm5,%xmm6
movsd  -0x8(%rsi,%r14,8),%xmm7
movsd  %xmm7,-0x8(%rsi,%rax,8)
movsd  %xmm6,-0x8(%rsi,%r14,8)
cmp    %rbx,%r14
je     1448 <gels+0x348>
addl   $0xffffffff,-0x34(%rsp)
mov    %r13d,%edx
sub    %r14d,%edx
lea    -0x1(%r14),%rax
add    %r13d,%eax
mov    %rdx,%rcx
mov    %rdx,-0x10(%rsp)
imul   %edx,%eax
mov    %eax,%edx
shr    $0x1f,%edx
add    %eax,%edx
sar    %edx
lea    -0x1(%r15),%eax
cltq
mov    %rax,-0x18(%rsp)
lea    (%rdx,%r15,1),%eax
add    $0xffffffff,%eax
mov    %edx,%r10d
add    %r15d,%r10d
movslq %eax,%r12
mov    %r14,%rbp
mov    %r10d,%r8d
mov    %r15,-0x20(%rsp)
mov    %r15d,%edx
jmp    132f <gels+0x22f>
nopl   0x0(%rax,%rax,1)
mov    -0x10(%rsp),%rax
add    %edx,%eax
cmp    %r10d,%edx
cmovg  %eax,%r15d
movslq %r15d,%rcx
movsd  -0x8(%rdi,%rcx,8),%xmm6
movslq %edx,%rax
movsd  -0x8(%rdi,%rax,8),%xmm7
add    $0xffffffffffffffff,%rax
movsd  %xmm7,-0x8(%rdi,%rcx,8)
mov    -0x30(%rsp),%r11
mov    -0x8(%rsp),%rcx
movsd  %xmm6,-0x8(%rcx,%rbp,8)
mulsd  %xmm5,%xmm6
movsd  %xmm6,(%rdi,%rax,8)
add    $0x1,%rbp
mov    %r15d,%r8d
cmp    %rbp,%r11
je     1360 <gels+0x260>
add    %ebp,%edx
lea    0x1(%r8),%r15d
cmp    %r10d,%edx
jne    12e0 <gels+0x1e0>
mov    -0x18(%rsp),%rax
movsd  (%rdi,%rax,8),%xmm6
movslq %r8d,%rax
movsd  %xmm6,(%rdi,%rax,8)
movsd  (%rdi,%r12,8),%xmm6
lea    -0x1(%rdx),%eax
cltq
jmp    130f <gels+0x20f>
nopl   0x0(%rax)
xorps  %xmm5,%xmm5
cvtsi2sdl -0x10(%rsp),%xmm5
mov    -0x18(%rsp),%rax
movsd  %xmm5,(%rdi,%rax,8)
mov    -0x34(%rsp),%r12d
xorpd  %xmm6,%xmm6
xor    %r10d,%r10d
mov    %r14,%r8
mov    -0x20(%rsp),%r11
nopw   0x0(%rax,%rax,1)
mov    -0x8(%rsp),%rax
movsd  -0x8(%rax,%r8,8),%xmm7
xorpd  %xmm3,%xmm7
lea    0x1(%r10),%r15
mov    %r8,%rax
mov    %r11d,%edx
nopw   0x0(%rax,%rax,1)
add    %eax,%edx
movslq %edx,%rcx
lea    (%rcx,%r10,1),%ebp
movslq %ebp,%rbp
movsd  -0x8(%rdi,%rcx,8),%xmm5
mulsd  %xmm7,%xmm5
addsd  (%rdi,%rbp,8),%xmm5
movsd  %xmm5,(%rdi,%rbp,8)
add    $0x1,%rax
cmp    %rbx,%rax
jl     13b0 <gels+0x2b0>
add    %r8d,%r11d
lea    (%r11,%r10,1),%eax
cltq
movsd  (%rdi,%rax,8),%xmm5
andpd  %xmm4,%xmm5
add    $0x1,%r8
ucomisd %xmm6,%xmm5
cmova  %r8d,%r13d
lea    (%r15,%r11,1),%eax
cmova  %eax,%r9d
maxsd  %xmm6,%xmm5
add    %r14,%r10
mulsd  -0x8(%rsi,%r14,8),%xmm7
addsd  (%rsi,%r10,8),%xmm7
movsd  %xmm7,(%rsi,%r10,8)
mov    %r15,%r10
movapd %xmm5,%xmm6
cmp    %r12,%r15
jne    1390 <gels+0x290>
add    $0x1,%r14
ucomisd %xmm5,%xmm1
mov    -0x30(%rsp),%r11
mov    -0x20(%rsp),%r15
jb     1230 <gels+0x130>
mov    $0xffffffff,%eax
jmp    1458 <gels+0x358>
mov    -0x24(%rsp),%r10d
cmp    $0x2,%r10d
jge    1463 <gels+0x363>
mov    -0x40(%rsp),%rax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    $0x2,%r8d
xor    %r14d,%r14d
movsd  0xbb4(%rip),%xmm0
mov    %r11,%r9
jmp    14ac <gels+0x3ac>
nopl   0x0(%rax)
cvttsd2si %xmm2,%ecx
add    %ebp,%ecx
add    $0xfffffffe,%ecx
movslq %ecx,%rcx
movsd  (%rsi,%rcx,8),%xmm2
movsd  %xmm2,-0x10(%rsi,%rbp,8)
movsd  %xmm1,(%rsi,%rcx,8)
lea    0x1(%r8),%ecx
add    $0x1,%r14d
cmp    %r10d,%r8d
mov    %ecx,%r8d
je     1453 <gels+0x353>
mov    %r9,%rbp
add    $0xffffffffffffffff,%r9
sub    %ebp,%r15d
movslq %r15d,%rdx
movsd  -0x8(%rdi,%rdx,8),%xmm2
addsd  %xmm0,%xmm2
movsd  -0x10(%rsi,%rbp,8),%xmm1
cmp    %r11,%rbp
jg     1480 <gels+0x380>
movslq %r9d,%rdx
test   $0x1,%r14b
jne    1500 <gels+0x400>
lea    (%r15,%rdx,1),%ebx
movslq %ebx,%rcx
movsd  -0x8(%rdi,%rcx,8),%xmm3
mulsd  (%rsi,%rdx,8),%xmm3
add    $0x1,%rdx
subsd  %xmm3,%xmm1
jmp    1503 <gels+0x403>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %r15d,%ebx
test   %r14d,%r14d
mov    -0x30(%rsp),%r11
je     1480 <gels+0x380>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    %edx,%ebx
movslq %ebx,%rcx
movsd  -0x8(%rdi,%rcx,8),%xmm3
mulsd  (%rsi,%rdx,8),%xmm3
lea    (%rdx,%rcx,1),%ebx
add    $0x1,%ebx
movslq %ebx,%rcx
movsd  -0x8(%rdi,%rcx,8),%xmm4
mulsd  0x8(%rsi,%rdx,8),%xmm4
subsd  %xmm3,%xmm1
add    $0x2,%rdx
subsd  %xmm4,%xmm1
cmp    %edx,%r11d
jne    1520 <gels+0x420>
jmp    1480 <gels+0x380>

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

LLVM IR (-O2):
define i32 @gels(double* nocapture %0, double* nocapture %1, i32 %2, double %3, double* nocapture %4) {
%6 = icmp slt i32 %2, 1
br i1 %6, label %301, label %7
7: ; preds = %5
%8 = zext i32 %2 to i64
%9 = and i64 %8, 1
%10 = icmp eq i32 %2, 1
br i1 %10, label %48, label %11
11: ; preds = %7
%12 = and i64 %8, 4294967294
br label %13
13: ; preds = %13, %11
%14 = phi i64 [ 1, %11 ], [ %43, %13 ]
%15 = phi i32 [ 0, %11 ], [ %42, %13 ]
%16 = phi double [ 0.000000e+00, %11 ], [ %41, %13 ]
%17 = phi i32 [ 0, %11 ], [ %40, %13 ]
%18 = phi i32 [ 0, %11 ], [ %33, %13 ]
%19 = phi i64 [ 0, %11 ], [ %44, %13 ]
%20 = trunc i64 %14 to i32
%21 = add nuw nsw i32 %18, %20
%22 = add nsw i32 %21, -1
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds double, double* %0, i64 %23
%25 = load double, double* %24
%26 = tail call double @llvm.fabs.f64(double %25)
%27 = fcmp ogt double %26, %16
%28 = select i1 %27, i32 %20, i32 %17
%29 = select i1 %27, double %26, double %16
%30 = select i1 %27, i32 %21, i32 %15
%31 = trunc i64 %14 to i32
%32 = add i32 %31, 1
%33 = add nuw nsw i32 %21, %32
%34 = add i32 %21, %31
%35 = sext i32 %34 to i64
%36 = getelementptr inbounds double, double* %0, i64 %35
%37 = load double, double* %36
%38 = tail call double @llvm.fabs.f64(double %37)
%39 = fcmp ogt double %38, %29
%40 = select i1 %39, i32 %32, i32 %28
%41 = select i1 %39, double %38, double %29
%42 = select i1 %39, i32 %33, i32 %30
%43 = add nuw nsw i64 %14, 2
%44 = add i64 %19, 2
%45 = icmp eq i64 %44, %12
br i1 %45, label %46, label %13
46: ; preds = %13
%47 = trunc i64 %43 to i32
br label %48
48: ; preds = %46, %7
%49 = phi i32 [ undef, %7 ], [ %40, %46 ]
%50 = phi double [ undef, %7 ], [ %41, %46 ]
%51 = phi i32 [ undef, %7 ], [ %42, %46 ]
%52 = phi i32 [ 1, %7 ], [ %47, %46 ]
%53 = phi i32 [ 0, %7 ], [ %42, %46 ]
%54 = phi double [ 0.000000e+00, %7 ], [ %41, %46 ]
%55 = phi i32 [ 0, %7 ], [ %40, %46 ]
%56 = phi i32 [ 0, %7 ], [ %33, %46 ]
%57 = icmp eq i64 %9, 0
br i1 %57, label %69, label %58
58: ; preds = %48
%59 = add nuw nsw i32 %56, %52
%60 = add nsw i32 %59, -1
%61 = sext i32 %60 to i64
%62 = getelementptr inbounds double, double* %0, i64 %61
%63 = load double, double* %62
%64 = tail call double @llvm.fabs.f64(double %63)
%65 = fcmp ogt double %64, %54
%66 = select i1 %65, i32 %52, i32 %55
%67 = select i1 %65, double %64, double %54
%68 = select i1 %65, i32 %59, i32 %53
br label %69
69: ; preds = %48, %58
%70 = phi i32 [ %49, %48 ], [ %66, %58 ]
%71 = phi double [ %50, %48 ], [ %67, %58 ]
%72 = phi i32 [ %51, %48 ], [ %68, %58 ]
%73 = fmul double %71, %3
%74 = sext i32 %2 to i64
%75 = zext i32 %2 to i64
%76 = fcmp ugt double %71, 0.000000e+00
br i1 %76, label %77, label %301
77: ; preds = %69, %215
%78 = phi i32 [ %85, %215 ], [ %2, %69 ]
%79 = phi i32 [ %93, %215 ], [ 0, %69 ]
%80 = phi i32 [ %96, %215 ], [ 0, %69 ]
%81 = phi i32 [ %206, %215 ], [ %70, %69 ]
%82 = phi double [ %207, %215 ], [ %71, %69 ]
%83 = phi i32 [ %208, %215 ], [ %72, %69 ]
%84 = phi i64 [ %216, %215 ], [ 1, %69 ]
%85 = add i32 %78, -1
%86 = icmp eq i32 %79, 0
br i1 %86, label %87, label %92
87: ; preds = %77
%88 = fcmp ugt double %82, %73
br i1 %88, label %92, label %89
89: ; preds = %87
%90 = trunc i64 %84 to i32
%91 = add i32 %90, -1
br label %92
92: ; preds = %87, %89, %77
%93 = phi i32 [ %91, %89 ], [ 0, %87 ], [ %79, %77 ]
%94 = trunc i64 %84 to i32
%95 = sub nsw i32 %81, %94
%96 = add nuw nsw i32 %80, %94
%97 = add nsw i32 %83, -1
%98 = sext i32 %97 to i64
%99 = getelementptr inbounds double, double* %0, i64 %98
%100 = load double, double* %99
%101 = fdiv double 1.000000e+00, %100
%102 = add nsw i32 %81, -1
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds double, double* %1, i64 %103
%105 = load double, double* %104
%106 = fmul double %101, %105
%107 = add nsw i64 %84, -1
%108 = getelementptr inbounds double, double* %1, i64 %107
%109 = load double, double* %108
store double %109, double* %104
store double %106, double* %108
%110 = icmp eq i64 %84, %74
br i1 %110, label %218, label %111
111: ; preds = %92
%112 = trunc i64 %107 to i32
%113 = add i32 %81, %112
%114 = mul nsw i32 %95, %113
%115 = sdiv i32 %114, 2
%116 = add nsw i32 %115, %96
%117 = add nsw i32 %96, -1
%118 = sext i32 %117 to i64
%119 = getelementptr inbounds double, double* %0, i64 %118
%120 = add nsw i32 %116, -1
%121 = sext i32 %120 to i64
%122 = getelementptr inbounds double, double* %0, i64 %121
br label %123
123: ; preds = %111, %150
%124 = phi i64 [ %84, %111 ], [ %158, %150 ]
%125 = phi i32 [ %116, %111 ], [ %152, %150 ]
%126 = phi i32 [ %96, %111 ], [ %128, %150 ]
%127 = trunc i64 %124 to i32
%128 = add nuw nsw i32 %126, %127
%129 = add nsw i32 %125, 1
%130 = icmp eq i32 %128, %116
br i1 %130, label %131, label %138
131: ; preds = %123
%132 = load double, double* %119
%133 = sext i32 %125 to i64
%134 = getelementptr inbounds double, double* %0, i64 %133
store double %132, double* %134
%135 = load double, double* %122
%136 = add nsw i32 %128, -1
%137 = sext i32 %136 to i64
br label %150
138: ; preds = %123
%139 = icmp sgt i32 %128, %116
%140 = add nsw i32 %128, %95
%141 = select i1 %139, i32 %140, i32 %129
%142 = add nsw i32 %141, -1
%143 = sext i32 %142 to i64
%144 = getelementptr inbounds double, double* %0, i64 %143
%145 = load double, double* %144
%146 = add nsw i32 %128, -1
%147 = sext i32 %146 to i64
%148 = getelementptr inbounds double, double* %0, i64 %147
%149 = load double, double* %148
store double %149, double* %144
br label %150
150: ; preds = %138, %131
%151 = phi i64 [ %147, %138 ], [ %137, %131 ]
%152 = phi i32 [ %141, %138 ], [ %129, %131 ]
%153 = phi double [ %145, %138 ], [ %135, %131 ]
%154 = add nsw i64 %124, -1
%155 = getelementptr inbounds double, double* %4, i64 %154
store double %153, double* %155
%156 = fmul double %101, %153
%157 = getelementptr inbounds double, double* %0, i64 %151
store double %156, double* %157
%158 = add nuw nsw i64 %124, 1
%159 = icmp eq i64 %158, %75
br i1 %159, label %160, label %123
160: ; preds = %150
%161 = sitofp i32 %95 to double
store double %161, double* %119
%162 = zext i32 %85 to i64
br label %163
163: ; preds = %192, %160
%164 = phi i64 [ 0, %160 ], [ %174, %192 ]
%165 = phi i64 [ %84, %160 ], [ %204, %192 ]
%166 = phi i32 [ %83, %160 ], [ %208, %192 ]
%167 = phi double [ 0.000000e+00, %160 ], [ %207, %192 ]
%168 = phi i32 [ %81, %160 ], [ %206, %192 ]
%169 = phi i32 [ %96, %160 ], [ %195, %192 ]
%170 = add nsw i64 %165, -1
%171 = getelementptr inbounds double, double* %4, i64 %170
%172 = load double, double* %171
%173 = fneg double %172
%174 = add nuw nsw i64 %164, 1
%175 = trunc i64 %164 to i32
br label %176
176: ; preds = %163, %176
%177 = phi i64 [ %165, %163 ], [ %190, %176 ]
%178 = phi i32 [ %169, %163 ], [ %180, %176 ]
%179 = trunc i64 %177 to i32
%180 = add nuw nsw i32 %178, %179
%181 = add nsw i32 %180, -1
%182 = sext i32 %181 to i64
%183 = getelementptr inbounds double, double* %0, i64 %182
%184 = load double, double* %183
%185 = add nuw i32 %180, %175
%186 = sext i32 %185 to i64
%187 = getelementptr inbounds double, double* %0, i64 %186
%188 = load double, double* %187
%189 = tail call double @llvm.fmuladd.f64(double %173, double %184, double %188)
store double %189, double* %187
%190 = add nuw nsw i64 %177, 1
%191 = icmp slt i64 %190, %74
br i1 %191, label %176, label %192
192: ; preds = %176
%193 = trunc i64 %164 to i32
%194 = trunc i64 %165 to i32
%195 = add nuw nsw i32 %169, %194
%196 = add nuw i32 %195, %193
%197 = sext i32 %196 to i64
%198 = getelementptr inbounds double, double* %0, i64 %197
%199 = load double, double* %198
%200 = tail call double @llvm.fabs.f64(double %199)
%201 = fcmp ogt double %200, %167
%202 = trunc i64 %174 to i32
%203 = add nuw nsw i32 %195, %202
%204 = add nuw nsw i64 %165, 1
%205 = trunc i64 %204 to i32
%206 = select i1 %201, i32 %205, i32 %168
%207 = select i1 %201, double %200, double %167
%208 = select i1 %201, i32 %203, i32 %166
%209 = load double, double* %108
%210 = add nuw nsw i64 %164, %84
%211 = getelementptr inbounds double, double* %1, i64 %210
%212 = load double, double* %211
%213 = tail call double @llvm.fmuladd.f64(double %173, double %209, double %212)
store double %213, double* %211
%214 = icmp eq i64 %174, %162
br i1 %214, label %215, label %163
215: ; preds = %192
%216 = add nuw nsw i64 %84, 1
%217 = fcmp ugt double %207, 0.000000e+00
br i1 %217, label %77, label %301
218: ; preds = %92
%219 = icmp slt i32 %2, 2
br i1 %219, label %301, label %220
220: ; preds = %218
%221 = zext i32 %2 to i64
br label %222
222: ; preds = %220, %291
%223 = phi i32 [ 0, %220 ], [ %300, %291 ]
%224 = phi i64 [ %221, %220 ], [ %231, %291 ]
%225 = phi i32 [ %2, %220 ], [ %228, %291 ]
%226 = phi i32 [ 2, %220 ], [ %298, %291 ]
%227 = phi i32 [ %96, %220 ], [ %230, %291 ]
%228 = add i32 %225, -1
%229 = trunc i64 %224 to i32
%230 = sub nsw i32 %227, %229
%231 = add nsw i64 %224, -1
%232 = add nsw i32 %230, -1
%233 = sext i32 %232 to i64
%234 = getelementptr inbounds double, double* %0, i64 %233
%235 = load double, double* %234
%236 = fadd double %235, 5.000000e-01
%237 = fptosi double %236 to i32
%238 = add nsw i64 %224, -2
%239 = getelementptr inbounds double, double* %1, i64 %238
%240 = load double, double* %239
%241 = icmp sgt i64 %224, %221
br i1 %241, label %291, label %242
242: ; preds = %222
%243 = sext i32 %228 to i64
%244 = and i32 %223, 1
%245 = icmp eq i32 %244, 0
br i1 %245, label %246, label %257
246: ; preds = %242
%247 = add nsw i64 %243, 1
%248 = add nsw i32 %230, %228
%249 = add nsw i32 %248, -1
%250 = sext i32 %249 to i64
%251 = getelementptr inbounds double, double* %0, i64 %250
%252 = load double, double* %251
%253 = getelementptr inbounds double, double* %1, i64 %243
%254 = load double, double* %253
%255 = fneg double %252
%256 = tail call double @llvm.fmuladd.f64(double %255, double %254, double %240)
br label %257
257: ; preds = %246, %242
%258 = phi double [ undef, %242 ], [ %256, %246 ]
%259 = phi i64 [ %243, %242 ], [ %247, %246 ]
%260 = phi double [ %240, %242 ], [ %256, %246 ]
%261 = phi i32 [ %230, %242 ], [ %248, %246 ]
%262 = icmp eq i32 %223, 0
br i1 %262, label %291, label %263
263: ; preds = %257, %263
%264 = phi i64 [ %278, %263 ], [ %259, %257 ]
%265 = phi double [ %288, %263 ], [ %260, %257 ]
%266 = phi i32 [ %280, %263 ], [ %261, %257 ]
%267 = add nsw i64 %264, 1
%268 = trunc i64 %264 to i32
%269 = add nsw i32 %266, %268
%270 = add nsw i32 %269, -1
%271 = sext i32 %270 to i64
%272 = getelementptr inbounds double, double* %0, i64 %271
%273 = load double, double* %272
%274 = getelementptr inbounds double, double* %1, i64 %264
%275 = load double, double* %274
%276 = fneg double %273
%277 = tail call double @llvm.fmuladd.f64(double %276, double %275, double %265)
%278 = add nsw i64 %264, 2
%279 = trunc i64 %267 to i32
%280 = add nsw i32 %269, %279
%281 = add nsw i32 %280, -1
%282 = sext i32 %281 to i64
%283 = getelementptr inbounds double, double* %0, i64 %282
%284 = load double, double* %283
%285 = getelementptr inbounds double, double* %1, i64 %267
%286 = load double, double* %285
%287 = fneg double %284
%288 = tail call double @llvm.fmuladd.f64(double %287, double %286, double %277)
%289 = trunc i64 %278 to i32
%290 = icmp eq i32 %289, %2
br i1 %290, label %291, label %263
291: ; preds = %257, %263, %222
%292 = phi double [ %240, %222 ], [ %258, %257 ], [ %288, %263 ]
%293 = add i32 %229, -2
%294 = add i32 %293, %237
%295 = sext i32 %294 to i64
%296 = getelementptr inbounds double, double* %1, i64 %295
%297 = load double, double* %296
store double %297, double* %239
store double %292, double* %296
%298 = add nuw i32 %226, 1
%299 = icmp eq i32 %226, %2
%300 = add i32 %223, 1
br i1 %299, label %301, label %222
301: ; preds = %215, %291, %69, %218, %5
%302 = phi i32 [ -1, %5 ], [ %93, %218 ], [ -1, %69 ], [ %93, %291 ], [ -1, %215 ]
ret i32 %302
}