int regulate(int conc_count, double concs[conc_count], int rows, int cols,
             double weights[rows][cols], int tf_count, int tf_genes[tf_count],
             int p_count, int p_genes[p_count], int delta, double e_total) {
  double updates[rows];
  double gene_count = rows - p_count;
  double signal;
  int below_zero = 0;
  int debug = 0;
  int idx;
  for (int i = 0; i < cols; i++) {
    signal = 0;
    for (int j = 0; j < rows; j++) {
      signal += (concs[j] * weights[j][i]);
    }
    signal = signal / gene_count;
    updates[i] = signal;
  }
  for (int i = 0; i < tf_count; i++) {
    idx = tf_genes[i];
    signal = (concs[idx] * updates[idx]) * delta;
    concs[idx] += signal;
    if (concs[idx] < 0) {
      below_zero = 1;
    }
    if (concs[idx] < 1e-10) {
      concs[idx] = 1e-10;
    }
  }
  for (int i = 0; i < p_count; i++) {
    idx = p_genes[i];
    concs[idx] += delta * updates[idx];
    if (concs[idx] < 1e-10) {
      concs[idx] = 1e-10;
    }
  }
  double tf_total = 0;
  for (int i = 0; i < tf_count; i++) {
    tf_total += concs[tf_genes[i]];
  }
  for (int i = 0; i < tf_count; i++) {
    concs[tf_genes[i]] *= 1 - e_total;
    concs[tf_genes[i]] = concs[tf_genes[i]] / tf_total;
  }
  double p_total = 0;
  for (int i = 0; i < p_count; i++) {
    p_total += concs[p_genes[i]];
  }
  for (int i = 0; i < p_count; i++) {
    concs[p_genes[i]] = concs[p_genes[i]] / p_total;
  }
  return below_zero;
}


x86 assembly (clang, -O0):
<regulate>:
push   %rbp
mov    %rsp,%rbp
sub    $0xa0,%rsp
mov    0x28(%rbp),%eax
mov    0x20(%rbp),%rax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9d,-0x24(%rbp)
movsd  %xmm0,-0x30(%rbp)
mov    -0x14(%rbp),%eax
mov    -0x18(%rbp),%ecx
mov    %rcx,-0xa0(%rbp)
mov    %rsp,%rcx
mov    %rcx,-0x38(%rbp)
lea    0xf(,%rax,8),%rdx
and    $0xfffffffffffffff0,%rdx
mov    %rsp,%rcx
sub    %rdx,%rcx
mov    %rcx,-0x98(%rbp)
mov    %rcx,%rsp
mov    %rax,-0x40(%rbp)
mov    -0x14(%rbp),%eax
sub    0x18(%rbp),%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0x0,-0x54(%rbp)
movl   $0x0,-0x58(%rbp)
movl   $0x0,-0x60(%rbp)
mov    -0x60(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    1234 <regulate+0x134>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x50(%rbp)
movl   $0x0,-0x64(%rbp)
mov    -0x64(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1202 <regulate+0x102>
mov    -0xa0(%rbp),%rdx
mov    -0x10(%rbp),%rax
movslq -0x64(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x64(%rbp),%rcx
imul   %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
movslq -0x60(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x64(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x64(%rbp)
jmp    11a6 <regulate+0xa6>
mov    -0x98(%rbp),%rax
movsd  -0x50(%rbp),%xmm0
divsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
movslq -0x60(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x60(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x60(%rbp)
jmp    118b <regulate+0x8b>
movl   $0x0,-0x68(%rbp)
mov    -0x68(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    12f7 <regulate+0x1f7>
mov    -0x98(%rbp),%rax
mov    0x10(%rbp),%rcx
movslq -0x68(%rbp),%rdx
mov    (%rcx,%rdx,4),%ecx
mov    %ecx,-0x5c(%rbp)
mov    -0x10(%rbp),%rcx
movslq -0x5c(%rbp),%rdx
movsd  (%rcx,%rdx,8),%xmm0
movslq -0x5c(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm0
cvtsi2sdl 0x28(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x5c(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
movslq -0x5c(%rbp),%rcx
xorps  %xmm0,%xmm0
ucomisd (%rax,%rcx,8),%xmm0
jbe    12b4 <regulate+0x1b4>
movl   $0x1,-0x54(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x5c(%rbp),%rcx
movsd  0xd44(%rip),%xmm0
ucomisd (%rax,%rcx,8),%xmm0
jbe    12e4 <regulate+0x1e4>
mov    -0x10(%rbp),%rax
movslq -0x5c(%rbp),%rcx
movsd  0xd29(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
jmp    12e9 <regulate+0x1e9>
mov    -0x68(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x68(%rbp)
jmp    123b <regulate+0x13b>
movl   $0x0,-0x6c(%rbp)
mov    -0x6c(%rbp),%eax
cmp    0x18(%rbp),%eax
jge    138a <regulate+0x28a>
mov    -0x98(%rbp),%rax
mov    0x20(%rbp),%rcx
movslq -0x6c(%rbp),%rdx
mov    (%rcx,%rdx,4),%ecx
mov    %ecx,-0x5c(%rbp)
cvtsi2sdl 0x28(%rbp),%xmm0
movslq -0x5c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x10(%rbp),%rax
movslq -0x5c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
movslq -0x5c(%rbp),%rcx
movsd  0xcb1(%rip),%xmm0
ucomisd (%rax,%rcx,8),%xmm0
jbe    1377 <regulate+0x277>
mov    -0x10(%rbp),%rax
movslq -0x5c(%rbp),%rcx
movsd  0xc96(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
jmp    137c <regulate+0x27c>
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x6c(%rbp)
jmp    12fe <regulate+0x1fe>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x78(%rbp)
movl   $0x0,-0x7c(%rbp)
mov    -0x7c(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    13d2 <regulate+0x2d2>
mov    -0x10(%rbp),%rax
mov    0x10(%rbp),%rcx
movslq -0x7c(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x7c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x7c(%rbp)
jmp    1399 <regulate+0x299>
movl   $0x0,-0x80(%rbp)
mov    -0x80(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    1449 <regulate+0x349>
movsd  0xc13(%rip),%xmm0
subsd  -0x30(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    0x10(%rbp),%rcx
movslq -0x80(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
mulsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
mov    0x10(%rbp),%rcx
movslq -0x80(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
movsd  (%rax,%rcx,8),%xmm0
divsd  -0x78(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    0x10(%rbp),%rcx
movslq -0x80(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x80(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x80(%rbp)
jmp    13d9 <regulate+0x2d9>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movl   $0x0,-0x8c(%rbp)
mov    -0x8c(%rbp),%eax
cmp    0x18(%rbp),%eax
jge    14a9 <regulate+0x3a9>
mov    -0x10(%rbp),%rax
mov    0x20(%rbp),%rcx
movslq -0x8c(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x8c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8c(%rbp)
jmp    145e <regulate+0x35e>
movl   $0x0,-0x90(%rbp)
mov    -0x90(%rbp),%eax
cmp    0x18(%rbp),%eax
jge    150e <regulate+0x40e>
mov    -0x10(%rbp),%rax
mov    0x20(%rbp),%rcx
movslq -0x90(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
movsd  (%rax,%rcx,8),%xmm0
divsd  -0x88(%rbp),%xmm0
ff
mov    -0x10(%rbp),%rax
mov    0x20(%rbp),%rcx
movslq -0x90(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x90(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x90(%rbp)
jmp    14b3 <regulate+0x3b3>
mov    -0x54(%rbp),%eax
mov    -0x38(%rbp),%rcx
mov    %rcx,%rsp
mov    %rbp,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<regulate>:
push   %rbp
mov    %rsp,%rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
mov    %r9d,-0x3c(%rbp)
mov    %edx,-0x2c(%rbp)
mov    %edx,%r12d
mov    %rsp,%rdx
lea    0xf(,%r12,8),%rax
and    $0xfffffffffffffff0,%rax
sub    %rax,%rdx
mov    %rdx,-0x38(%rbp)
mov    %rdx,%rsp
test   %ecx,%ecx
jle    125e <regulate+0x15e>
mov    %ecx,%r13d
mov    -0x2c(%rbp),%eax
sub    0x18(%rbp),%eax
cvtsi2sd %eax,%xmm1
lea    -0x1(%r12),%rax
mov    %rax,-0x48(%rbp)
mov    %r12d,%eax
and    $0x3,%eax
and    $0xfffffffc,%r12d
mov    %r13,%r9
shl    $0x4,%r9
mov    %r13,%r15
shl    $0x5,%r15
lea    0x0(,%r13,8),%rdi
lea    (%rdi,%rdi,2),%r10
xor    %r11d,%r11d
jmp    11a3 <regulate+0xa3>
nopl   0x0(%rax,%rax,1)
xorpd  %xmm2,%xmm2
divsd  %xmm1,%xmm2
mov    -0x38(%rbp),%rcx
movsd  %xmm2,(%rcx,%r11,8)
add    $0x1,%r11
add    $0x8,%r8
cmp    %r13,%r11
je     125e <regulate+0x15e>
cmpl   $0x0,-0x2c(%rbp)
jle    1180 <regulate+0x80>
cmpq   $0x3,-0x48(%rbp)
jae    11c0 <regulate+0xc0>
mov    %r8,%rcx
xorpd  %xmm2,%xmm2
xor    %r14d,%r14d
jmp    121e <regulate+0x11e>
nopl   0x0(%rax)
xorpd  %xmm2,%xmm2
mov    %r8,%rcx
xor    %r14d,%r14d
nopw   0x0(%rax,%rax,1)
movsd  (%rsi,%r14,8),%xmm3
mulsd  (%r8),%xmm3
movsd  0x8(%rsi,%r14,8),%xmm4
addsd  %xmm2,%xmm3
mulsd  (%r8,%r13,8),%xmm4
addsd  %xmm3,%xmm4
movsd  0x10(%rsi,%r14,8),%xmm3
mulsd  (%r8,%r9,1),%xmm3
addsd  %xmm4,%xmm3
movsd  0x18(%rsi,%r14,8),%xmm2
mulsd  (%r8,%r10,1),%xmm2
addsd  %xmm3,%xmm2
add    $0x4,%r14
add    %r15,%r8
cmp    %r14,%r12
jne    11d0 <regulate+0xd0>
test   %rax,%rax
mov    %rcx,%r8
je     1184 <regulate+0x84>
mov    %r13,%rcx
imul   %r14,%rcx
lea    (%r8,%rcx,8),%rbx
lea    (%rsi,%r14,8),%rdx
xor    %ecx,%ecx
nopl   0x0(%rax,%rax,1)
movsd  (%rdx,%rcx,8),%xmm3
mulsd  (%rbx),%xmm3
addsd  %xmm3,%xmm2
add    $0x1,%rcx
add    %rdi,%rbx
cmp    %rcx,%rax
jne    1240 <regulate+0x140>
jmp    1184 <regulate+0x84>
mov    0x10(%rbp),%r14
xorps  %xmm1,%xmm1
cvtsi2sdl 0x28(%rbp),%xmm1
mov    -0x3c(%rbp),%r12d
mov    %r12d,%r11d
test   %r12d,%r12d
jle    12cc <regulate+0x1cc>
cmp    $0x1,%r12d
mov    -0x38(%rbp),%r9
jne    12f7 <regulate+0x1f7>
xor    %ecx,%ecx
xor    %eax,%eax
mov    0x18(%rbp),%r15d
test   $0x1,%r11b
je     12d6 <regulate+0x1d6>
movslq (%r14,%rcx,4),%rcx
movsd  (%rsi,%rcx,8),%xmm2
movsd  (%r9,%rcx,8),%xmm3
mulsd  %xmm2,%xmm3
mulsd  %xmm1,%xmm3
addsd  %xmm2,%xmm3
xorpd  %xmm2,%xmm2
ucomisd %xmm3,%xmm2
mov    $0x1,%edx
cmova  %edx,%eax
movsd  0xd3f(%rip),%xmm2
maxsd  %xmm3,%xmm2
movsd  %xmm2,(%rsi,%rcx,8)
jmp    12d6 <regulate+0x1d6>
xor    %eax,%eax
mov    0x18(%rbp),%r15d
mov    -0x38(%rbp),%r9
mov    0x20(%rbp),%r10
mov    %r15d,%r8d
test   %r15d,%r15d
jle    1420 <regulate+0x320>
cmp    $0x1,%r15d
jne    1396 <regulate+0x296>
xor    %edi,%edi
jmp    13fa <regulate+0x2fa>
mov    %r11d,%edi
and    $0xfffffffe,%edi
xor    %ecx,%ecx
xorpd  %xmm2,%xmm2
movsd  0xcf5(%rip),%xmm3
xor    %edx,%edx
mov    0x18(%rbp),%r15d
mov    $0x1,%ebx
jmp    135f <regulate+0x25f>
nopl   0x0(%rax,%rax,1)
movslq 0x4(%r14,%rcx,4),%rdx
movsd  (%rsi,%rdx,8),%xmm4
movsd  (%r9,%rdx,8),%xmm5
mulsd  %xmm4,%xmm5
mulsd  %xmm1,%xmm5
addsd  %xmm4,%xmm5
ucomisd %xmm5,%xmm2
cmova  %ebx,%eax
movapd %xmm3,%xmm4
maxsd  %xmm5,%xmm4
movsd  %xmm4,(%rsi,%rdx,8)
add    $0x2,%rcx
mov    %eax,%edx
cmp    %rcx,%rdi
je     1288 <regulate+0x188>
movslq (%r14,%rcx,4),%rax
movsd  (%rsi,%rax,8),%xmm4
movsd  (%r9,%rax,8),%xmm5
mulsd  %xmm4,%xmm5
mulsd  %xmm1,%xmm5
addsd  %xmm4,%xmm5
ucomisd %xmm5,%xmm2
movapd %xmm3,%xmm4
maxsd  %xmm5,%xmm4
movsd  %xmm4,(%rsi,%rax,8)
mov    $0x1,%eax
ja     1320 <regulate+0x220>
mov    %edx,%eax
jmp    1320 <regulate+0x220>
mov    %r8d,%ebx
and    $0xfffffffe,%ebx
xor    %edi,%edi
movsd  0xc5a(%rip),%xmm2
cs nopw 0x0(%rax,%rax,1)
movslq (%r10,%rdi,4),%rcx
movsd  (%r9,%rcx,8),%xmm3
mulsd  %xmm1,%xmm3
addsd  (%rsi,%rcx,8),%xmm3
movapd %xmm2,%xmm4
maxsd  %xmm3,%xmm4
movsd  %xmm4,(%rsi,%rcx,8)
movslq 0x4(%r10,%rdi,4),%rcx
movsd  (%r9,%rcx,8),%xmm3
mulsd  %xmm1,%xmm3
addsd  (%rsi,%rcx,8),%xmm3
movapd %xmm2,%xmm4
maxsd  %xmm3,%xmm4
movsd  %xmm4,(%rsi,%rcx,8)
add    $0x2,%rdi
cmp    %rdi,%rbx
jne    13b0 <regulate+0x2b0>
test   $0x1,%r8b
je     1420 <regulate+0x320>
movslq (%r10,%rdi,4),%rcx
mulsd  (%r9,%rcx,8),%xmm1
addsd  (%rsi,%rcx,8),%xmm1
movsd  0xbe9(%rip),%xmm2
maxsd  %xmm1,%xmm2
movsd  %xmm2,(%rsi,%rcx,8)
test   %r12d,%r12d
jle    151e <regulate+0x41e>
lea    -0x1(%r11),%r9
mov    %r11d,%ebx
and    $0x3,%ebx
cmp    $0x3,%r9
jae    1441 <regulate+0x341>
xorpd  %xmm1,%xmm1
xor    %edi,%edi
jmp    1480 <regulate+0x380>
mov    %r11d,%ecx
and    $0xfffffffc,%ecx
xorpd  %xmm1,%xmm1
xor    %edi,%edi
nopl   (%rax)
movslq (%r14,%rdi,4),%rdx
addsd  (%rsi,%rdx,8),%xmm1
movslq 0x4(%r14,%rdi,4),%rdx
addsd  (%rsi,%rdx,8),%xmm1
movslq 0x8(%r14,%rdi,4),%rdx
addsd  (%rsi,%rdx,8),%xmm1
movslq 0xc(%r14,%rdi,4),%rdx
addsd  (%rsi,%rdx,8),%xmm1
add    $0x4,%rdi
cmp    %rdi,%rcx
jne    1450 <regulate+0x350>
test   %rbx,%rbx
je     14a2 <regulate+0x3a2>
lea    (%r14,%rdi,4),%rcx
xor    %edx,%edx
nopl   0x0(%rax,%rax,1)
movslq (%rcx,%rdx,4),%rdi
addsd  (%rsi,%rdi,8),%xmm1
add    $0x1,%rdx
cmp    %rdx,%rbx
jne    1490 <regulate+0x390>
test   %r12d,%r12d
jle    151e <regulate+0x41e>
movsd  0xb59(%rip),%xmm2
subsd  %xmm0,%xmm2
test   %r9,%r9
je     1615 <regulate+0x515>
mov    %r11d,%ecx
and    $0xfffffffe,%ecx
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movslq (%r14,%rdi,4),%rdx
movsd  (%rsi,%rdx,8),%xmm0
mulsd  %xmm2,%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,(%rsi,%rdx,8)
movslq 0x4(%r14,%rdi,4),%rdx
movsd  (%rsi,%rdx,8),%xmm0
mulsd  %xmm2,%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,(%rsi,%rdx,8)
add    $0x2,%rdi
cmp    %rdi,%rcx
jne    14d0 <regulate+0x3d0>
test   $0x1,%r11b
je     151e <regulate+0x41e>
movslq (%r14,%rdi,4),%rcx
mulsd  (%rsi,%rcx,8),%xmm2
divsd  %xmm1,%xmm2
movsd  %xmm2,(%rsi,%rcx,8)
test   %r15d,%r15d
jle    1606 <regulate+0x506>
lea    -0x1(%r8),%r9
mov    %r8d,%edi
and    $0x3,%edi
cmp    $0x3,%r9
jae    153f <regulate+0x43f>
xorpd  %xmm0,%xmm0
xor    %ebx,%ebx
jmp    1580 <regulate+0x480>
mov    %r8d,%ecx
and    $0xfffffffc,%ecx
xorpd  %xmm0,%xmm0
xor    %ebx,%ebx
nopl   0x0(%rax,%rax,1)
movslq (%r10,%rbx,4),%rdx
addsd  (%rsi,%rdx,8),%xmm0
movslq 0x4(%r10,%rbx,4),%rdx
addsd  (%rsi,%rdx,8),%xmm0
movslq 0x8(%r10,%rbx,4),%rdx
addsd  (%rsi,%rdx,8),%xmm0
movslq 0xc(%r10,%rbx,4),%rdx
addsd  (%rsi,%rdx,8),%xmm0
add    $0x4,%rbx
cmp    %rbx,%rcx
jne    1550 <regulate+0x450>
test   %rdi,%rdi
je     15a2 <regulate+0x4a2>
lea    (%r10,%rbx,4),%rcx
xor    %ebx,%ebx
nopl   0x0(%rax,%rax,1)
movslq (%rcx,%rbx,4),%rdx
addsd  (%rsi,%rdx,8),%xmm0
add    $0x1,%rbx
cmp    %rbx,%rdi
jne    1590 <regulate+0x490>
test   %r15d,%r15d
jle    1606 <regulate+0x506>
test   %r9,%r9
je     1626 <regulate+0x526>
mov    %r8d,%edx
and    $0xfffffffe,%edx
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movslq (%r10,%rcx,4),%rdi
movsd  (%rsi,%rdi,8),%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,(%rsi,%rdi,8)
movslq 0x4(%r10,%rcx,4),%rdi
movsd  (%rsi,%rdi,8),%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,(%rsi,%rdi,8)
add    $0x2,%rcx
cmp    %rcx,%rdx
jne    15c0 <regulate+0x4c0>
test   $0x1,%r8b
je     1606 <regulate+0x506>
movslq (%r10,%rcx,4),%rcx
movsd  (%rsi,%rcx,8),%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,(%rsi,%rcx,8)
lea    -0x28(%rbp),%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %edi,%edi
test   $0x1,%r11b
jne    150c <regulate+0x40c>
jmp    151e <regulate+0x41e>
xor    %ecx,%ecx
test   $0x1,%r8b
jne    15f4 <regulate+0x4f4>
jmp    1606 <regulate+0x506>

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

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