int clip(const double lon_in[], const double lat_in[], int n_in, double ll_lon,
         double ll_lat, double ur_lon, double ur_lat, double lon_out[],
         double lat_out[]) {
  double x_tmp[50], y_tmp[50], x_last, y_last;
  int i_in, i_out, n_out, inside_last, inside;
  x_last = lon_in[n_in - 1];
  y_last = lat_in[n_in - 1];
  inside_last = (x_last >= ll_lon);
  for (i_in = 0, i_out = 0; i_in < n_in; i_in++) {
    if ((inside = (lon_in[i_in] >= ll_lon)) != inside_last) {
      x_tmp[i_out] = ll_lon;
      y_tmp[i_out++] = y_last + (ll_lon - x_last) * (lat_in[i_in] - y_last) /
                                    (lon_in[i_in] - x_last);
    }
    if (inside) {
      x_tmp[i_out] = lon_in[i_in];
      y_tmp[i_out++] = lat_in[i_in];
    }
    x_last = lon_in[i_in];
    y_last = lat_in[i_in];
    inside_last = inside;
  }
  if (!(n_out = i_out))
    return (0);
  x_last = x_tmp[n_out - 1];
  y_last = y_tmp[n_out - 1];
  inside_last = (x_last <= ur_lon);
  for (i_in = 0, i_out = 0; i_in < n_out; i_in++) {
    if ((inside = (x_tmp[i_in] <= ur_lon)) != inside_last) {
      lon_out[i_out] = ur_lon;
      lat_out[i_out++] = y_last + (ur_lon - x_last) * (y_tmp[i_in] - y_last) /
                                      (x_tmp[i_in] - x_last);
    }
    if (inside) {
      lon_out[i_out] = x_tmp[i_in];
      lat_out[i_out++] = y_tmp[i_in];
    }
    x_last = x_tmp[i_in];
    y_last = y_tmp[i_in];
    inside_last = inside;
  }
  if (!(n_out = i_out))
    return (0);
  x_last = lon_out[n_out - 1];
  y_last = lat_out[n_out - 1];
  inside_last = (y_last >= ll_lat);
  for (i_in = 0, i_out = 0; i_in < n_out; i_in++) {
    if ((inside = (lat_out[i_in] >= ll_lat)) != inside_last) {
      y_tmp[i_out] = ll_lat;
      x_tmp[i_out++] = x_last + (ll_lat - y_last) * (lon_out[i_in] - x_last) /
                                    (lat_out[i_in] - y_last);
    }
    if (inside) {
      x_tmp[i_out] = lon_out[i_in];
      y_tmp[i_out++] = lat_out[i_in];
    }
    x_last = lon_out[i_in];
    y_last = lat_out[i_in];
    inside_last = inside;
  }
  if (!(n_out = i_out))
    return (0);
  x_last = x_tmp[n_out - 1];
  y_last = y_tmp[n_out - 1];
  inside_last = (y_last <= ur_lat);
  for (i_in = 0, i_out = 0; i_in < n_out; i_in++) {
    if ((inside = (y_tmp[i_in] <= ur_lat)) != inside_last) {
      lat_out[i_out] = ur_lat;
      lon_out[i_out++] = x_last + (ur_lat - y_last) * (x_tmp[i_in] - x_last) /
                                      (y_tmp[i_in] - y_last);
    }
    if (inside) {
      lon_out[i_out] = x_tmp[i_in];
      lat_out[i_out++] = y_tmp[i_in];
    }
    x_last = x_tmp[i_in];
    y_last = y_tmp[i_in];
    inside_last = inside;
  }
  return (i_out);
}


x86 assembly (clang, -O0):
<clip>:
push   %rbp
mov    %rsp,%rbp
sub    $0x320,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
movsd  %xmm0,-0x28(%rbp)
movsd  %xmm1,-0x30(%rbp)
movsd  %xmm2,-0x38(%rbp)
movsd  %xmm3,-0x40(%rbp)
mov    %rcx,-0x48(%rbp)
mov    %r8,-0x50(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x378(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x380(%rbp)
ff
movsd  -0x378(%rbp),%xmm0
ff
ucomisd -0x28(%rbp),%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x390(%rbp)
movl   $0x0,-0x384(%rbp)
movl   $0x0,-0x388(%rbp)
mov    -0x384(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    12fe <clip+0x1fe>
mov    -0x10(%rbp),%rax
movslq -0x384(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x28(%rbp),%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x394(%rbp)
cmp    -0x390(%rbp),%eax
je     1255 <clip+0x155>
movsd  -0x28(%rbp),%xmm0
movslq -0x388(%rbp),%rax
movsd  %xmm0,-0x1e0(%rbp,%rax,8)
ff ff
movsd  -0x380(%rbp),%xmm0
ff
movsd  -0x28(%rbp),%xmm1
subsd  -0x378(%rbp),%xmm1
ff
mov    -0x18(%rbp),%rax
movslq -0x384(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
subsd  -0x380(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm1
mov    -0x10(%rbp),%rax
movslq -0x384(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
subsd  -0x378(%rbp),%xmm2
ff
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
mov    -0x388(%rbp),%eax
mov    %eax,%ecx
add    $0x1,%ecx
mov    %ecx,-0x388(%rbp)
cltq
movsd  %xmm0,-0x370(%rbp,%rax,8)
ff ff
cmpl   $0x0,-0x394(%rbp)
je     12ae <clip+0x1ae>
mov    -0x10(%rbp),%rax
movslq -0x384(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movslq -0x388(%rbp),%rax
movsd  %xmm0,-0x1e0(%rbp,%rax,8)
ff ff
mov    -0x18(%rbp),%rax
movslq -0x384(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x388(%rbp),%eax
mov    %eax,%ecx
add    $0x1,%ecx
mov    %ecx,-0x388(%rbp)
cltq
movsd  %xmm0,-0x370(%rbp,%rax,8)
ff ff
mov    -0x10(%rbp),%rax
movslq -0x384(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x378(%rbp)
ff
mov    -0x18(%rbp),%rax
movslq -0x384(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x380(%rbp)
ff
mov    -0x394(%rbp),%eax
mov    %eax,-0x390(%rbp)
mov    -0x384(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x384(%rbp)
jmp    1195 <clip+0x95>
mov    -0x388(%rbp),%eax
mov    %eax,-0x38c(%rbp)
cmp    $0x0,%eax
jne    131f <clip+0x21f>
movl   $0x0,-0x4(%rbp)
jmp    18f9 <clip+0x7f9>
mov    -0x38c(%rbp),%eax
sub    $0x1,%eax
cltq
movsd  -0x1e0(%rbp,%rax,8),%xmm0
ff ff
movsd  %xmm0,-0x378(%rbp)
ff
mov    -0x38c(%rbp),%eax
sub    $0x1,%eax
cltq
movsd  -0x370(%rbp,%rax,8),%xmm0
ff ff
movsd  %xmm0,-0x380(%rbp)
ff
movsd  -0x378(%rbp),%xmm1
ff
movsd  -0x38(%rbp),%xmm0
ucomisd %xmm1,%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x390(%rbp)
movl   $0x0,-0x384(%rbp)
movl   $0x0,-0x388(%rbp)
mov    -0x384(%rbp),%eax
cmp    -0x38c(%rbp),%eax
jge    14fc <clip+0x3fc>
movslq -0x384(%rbp),%rax
movsd  -0x1e0(%rbp,%rax,8),%xmm1
ff ff
movsd  -0x38(%rbp),%xmm0
ucomisd %xmm1,%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x394(%rbp)
cmp    -0x390(%rbp),%eax
je     1452 <clip+0x352>
movsd  -0x38(%rbp),%xmm0
mov    -0x48(%rbp),%rax
movslq -0x388(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x380(%rbp),%xmm0
ff
movsd  -0x38(%rbp),%xmm1
subsd  -0x378(%rbp),%xmm1
ff
movslq -0x384(%rbp),%rax
movsd  -0x370(%rbp,%rax,8),%xmm2
ff ff
subsd  -0x380(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm1
movslq -0x384(%rbp),%rax
movsd  -0x1e0(%rbp,%rax,8),%xmm2
ff ff
subsd  -0x378(%rbp),%xmm2
ff
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
mov    -0x50(%rbp),%rax
mov    -0x388(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x388(%rbp)
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
cmpl   $0x0,-0x394(%rbp)
je     14ac <clip+0x3ac>
movslq -0x384(%rbp),%rax
movsd  -0x1e0(%rbp,%rax,8),%xmm0
ff ff
mov    -0x48(%rbp),%rax
movslq -0x388(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movslq -0x384(%rbp),%rax
movsd  -0x370(%rbp,%rax,8),%xmm0
ff ff
mov    -0x50(%rbp),%rax
mov    -0x388(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x388(%rbp)
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movslq -0x384(%rbp),%rax
movsd  -0x1e0(%rbp,%rax,8),%xmm0
ff ff
movsd  %xmm0,-0x378(%rbp)
ff
movslq -0x384(%rbp),%rax
movsd  -0x370(%rbp,%rax,8),%xmm0
ff ff
movsd  %xmm0,-0x380(%rbp)
ff
mov    -0x394(%rbp),%eax
mov    %eax,-0x390(%rbp)
mov    -0x384(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x384(%rbp)
jmp    138a <clip+0x28a>
mov    -0x388(%rbp),%eax
mov    %eax,-0x38c(%rbp)
cmp    $0x0,%eax
jne    151d <clip+0x41d>
movl   $0x0,-0x4(%rbp)
jmp    18f9 <clip+0x7f9>
mov    -0x48(%rbp),%rax
mov    -0x38c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x378(%rbp)
ff
mov    -0x50(%rbp),%rax
mov    -0x38c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x380(%rbp)
ff
movsd  -0x380(%rbp),%xmm0
ff
ucomisd -0x30(%rbp),%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x390(%rbp)
movl   $0x0,-0x384(%rbp)
movl   $0x0,-0x388(%rbp)
mov    -0x384(%rbp),%eax
cmp    -0x38c(%rbp),%eax
jge    16f2 <clip+0x5f2>
mov    -0x50(%rbp),%rax
movslq -0x384(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x30(%rbp),%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x394(%rbp)
cmp    -0x390(%rbp),%eax
je     1649 <clip+0x549>
movsd  -0x30(%rbp),%xmm0
movslq -0x388(%rbp),%rax
movsd  %xmm0,-0x370(%rbp,%rax,8)
ff ff
movsd  -0x378(%rbp),%xmm0
ff
movsd  -0x30(%rbp),%xmm1
subsd  -0x380(%rbp),%xmm1
ff
mov    -0x48(%rbp),%rax
movslq -0x384(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
subsd  -0x378(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm1
mov    -0x50(%rbp),%rax
movslq -0x384(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
subsd  -0x380(%rbp),%xmm2
ff
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
mov    -0x388(%rbp),%eax
mov    %eax,%ecx
add    $0x1,%ecx
mov    %ecx,-0x388(%rbp)
cltq
movsd  %xmm0,-0x1e0(%rbp,%rax,8)
ff ff
cmpl   $0x0,-0x394(%rbp)
je     16a2 <clip+0x5a2>
mov    -0x48(%rbp),%rax
movslq -0x384(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movslq -0x388(%rbp),%rax
movsd  %xmm0,-0x1e0(%rbp,%rax,8)
ff ff
mov    -0x50(%rbp),%rax
movslq -0x384(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x388(%rbp),%eax
mov    %eax,%ecx
add    $0x1,%ecx
mov    %ecx,-0x388(%rbp)
cltq
movsd  %xmm0,-0x370(%rbp,%rax,8)
ff ff
mov    -0x48(%rbp),%rax
movslq -0x384(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x378(%rbp)
ff
mov    -0x50(%rbp),%rax
movslq -0x384(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x380(%rbp)
ff
mov    -0x394(%rbp),%eax
mov    %eax,-0x390(%rbp)
mov    -0x384(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x384(%rbp)
jmp    1586 <clip+0x486>
mov    -0x388(%rbp),%eax
mov    %eax,-0x38c(%rbp)
cmp    $0x0,%eax
jne    1713 <clip+0x613>
movl   $0x0,-0x4(%rbp)
jmp    18f9 <clip+0x7f9>
mov    -0x38c(%rbp),%eax
sub    $0x1,%eax
cltq
movsd  -0x1e0(%rbp,%rax,8),%xmm0
ff ff
movsd  %xmm0,-0x378(%rbp)
ff
mov    -0x38c(%rbp),%eax
sub    $0x1,%eax
cltq
movsd  -0x370(%rbp,%rax,8),%xmm0
ff ff
movsd  %xmm0,-0x380(%rbp)
ff
movsd  -0x380(%rbp),%xmm1
ff
movsd  -0x40(%rbp),%xmm0
ucomisd %xmm1,%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x390(%rbp)
movl   $0x0,-0x384(%rbp)
movl   $0x0,-0x388(%rbp)
mov    -0x384(%rbp),%eax
cmp    -0x38c(%rbp),%eax
jge    18f0 <clip+0x7f0>
movslq -0x384(%rbp),%rax
movsd  -0x370(%rbp,%rax,8),%xmm1
ff ff
movsd  -0x40(%rbp),%xmm0
ucomisd %xmm1,%xmm0
setae  %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x394(%rbp)
cmp    -0x390(%rbp),%eax
je     1846 <clip+0x746>
movsd  -0x40(%rbp),%xmm0
mov    -0x50(%rbp),%rax
movslq -0x388(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x378(%rbp),%xmm0
ff
movsd  -0x40(%rbp),%xmm1
subsd  -0x380(%rbp),%xmm1
ff
movslq -0x384(%rbp),%rax
movsd  -0x1e0(%rbp,%rax,8),%xmm2
ff ff
subsd  -0x378(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm1
movslq -0x384(%rbp),%rax
movsd  -0x370(%rbp,%rax,8),%xmm2
ff ff
subsd  -0x380(%rbp),%xmm2
ff
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
mov    -0x48(%rbp),%rax
mov    -0x388(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x388(%rbp)
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
cmpl   $0x0,-0x394(%rbp)
je     18a0 <clip+0x7a0>
movslq -0x384(%rbp),%rax
movsd  -0x1e0(%rbp,%rax,8),%xmm0
ff ff
mov    -0x48(%rbp),%rax
movslq -0x388(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movslq -0x384(%rbp),%rax
movsd  -0x370(%rbp,%rax,8),%xmm0
ff ff
mov    -0x50(%rbp),%rax
mov    -0x388(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x388(%rbp)
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movslq -0x384(%rbp),%rax
movsd  -0x1e0(%rbp,%rax,8),%xmm0
ff ff
movsd  %xmm0,-0x378(%rbp)
ff
movslq -0x384(%rbp),%rax
movsd  -0x370(%rbp,%rax,8),%xmm0
ff ff
movsd  %xmm0,-0x380(%rbp)
ff
mov    -0x394(%rbp),%eax
mov    %eax,-0x390(%rbp)
mov    -0x384(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x384(%rbp)
jmp    177e <clip+0x67e>
mov    -0x388(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x320,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<clip>:
push   %rbp
push   %rbx
sub    $0x2a8,%rsp
test   %edx,%edx
jle    129f <clip+0x19f>
movslq %edx,%rax
movsd  -0x8(%rdi,%rax,8),%xmm5
add    $0xffffffffffffffff,%rax
xor    %r11d,%r11d
ucomisd %xmm0,%xmm5
setae  %r11b
mov    %edx,%r9d
xor    %ebx,%ebx
xor    %r10d,%r10d
jmp    1154 <clip+0x54>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
lea    0x1(%rdx),%rbx
mov    %rdx,%rax
movapd %xmm4,%xmm5
cmp    %rbx,%r9
je     11d8 <clip+0xd8>
mov    %r11d,%ebp
mov    %rbx,%rdx
movsd  (%rdi,%rbx,8),%xmm4
xor    %r11d,%r11d
ucomisd %xmm0,%xmm4
setae  %r11b
cmp    %r11d,%ebp
je     11b2 <clip+0xb2>
movsd  (%rsi,%rax,8),%xmm8
movslq %r10d,%rax
movsd  %xmm0,0x110(%rsp,%rax,8)
movapd %xmm0,%xmm7
subsd  %xmm5,%xmm7
movsd  (%rsi,%rdx,8),%xmm6
subsd  %xmm8,%xmm6
mulsd  %xmm7,%xmm6
movapd %xmm4,%xmm7
subsd  %xmm5,%xmm7
divsd  %xmm7,%xmm6
addsd  %xmm8,%xmm6
lea    0x1(%rax),%r10d
movsd  %xmm6,-0x80(%rsp,%rax,8)
ucomisd %xmm0,%xmm4
jb     1140 <clip+0x40>
movslq %r10d,%rax
movsd  %xmm4,0x110(%rsp,%rax,8)
movsd  (%rsi,%rdx,8),%xmm5
lea    0x1(%rax),%r10d
movsd  %xmm5,-0x80(%rsp,%rax,8)
jmp    1140 <clip+0x40>
xor    %eax,%eax
test   %r10d,%r10d
je     12a1 <clip+0x1a1>
jle    12a1 <clip+0x1a1>
movslq %r10d,%rbx
movsd  0x108(%rsp,%rbx,8),%xmm4
add    $0xffffffffffffffff,%rbx
xor    %ebp,%ebp
ucomisd %xmm4,%xmm2
setae  %bpl
mov    %r10d,%r9d
xor    %edi,%edi
xor    %esi,%esi
jmp    1224 <clip+0x124>
nopl   0x0(%rax)
lea    0x1(%rdx),%rdi
mov    %rdx,%rbx
movapd %xmm0,%xmm4
cmp    %rdi,%r9
je     12ab <clip+0x1ab>
mov    %ebp,%eax
mov    %rdi,%rdx
movsd  0x110(%rsp,%rdi,8),%xmm0
xor    %ebp,%ebp
ucomisd %xmm0,%xmm2
setae  %bpl
cmp    %ebp,%eax
je     127d <clip+0x17d>
movsd  -0x80(%rsp,%rbx,8),%xmm5
movslq %esi,%rax
movsd  %xmm2,(%rcx,%rax,8)
movapd %xmm2,%xmm6
subsd  %xmm4,%xmm6
movsd  -0x80(%rsp,%rdx,8),%xmm7
subsd  %xmm5,%xmm7
mulsd  %xmm6,%xmm7
movapd %xmm0,%xmm6
subsd  %xmm4,%xmm6
divsd  %xmm6,%xmm7
addsd  %xmm5,%xmm7
lea    0x1(%rax),%esi
movsd  %xmm7,(%r8,%rax,8)
ucomisd %xmm0,%xmm2
jb     1210 <clip+0x110>
movslq %esi,%rax
movsd  %xmm0,(%rcx,%rax,8)
movsd  -0x80(%rsp,%rdx,8),%xmm4
lea    0x1(%rax),%esi
movsd  %xmm4,(%r8,%rax,8)
jmp    1210 <clip+0x110>
xor    %eax,%eax
add    $0x2a8,%rsp
pop    %rbx
pop    %rbp
ret
xor    %eax,%eax
test   %esi,%esi
je     12a1 <clip+0x1a1>
jle    12a1 <clip+0x1a1>
movslq %esi,%rbx
movsd  -0x8(%r8,%rbx,8),%xmm2
add    $0xffffffffffffffff,%rbx
xor    %ebp,%ebp
ucomisd %xmm1,%xmm2
setae  %bpl
mov    %esi,%r9d
xor    %edi,%edi
xor    %esi,%esi
jmp    12f0 <clip+0x1f0>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
lea    0x1(%rdx),%rdi
mov    %rdx,%rbx
movapd %xmm0,%xmm2
cmp    %rdi,%r9
je     136d <clip+0x26d>
mov    %ebp,%eax
mov    %rdi,%rdx
movsd  (%r8,%rdi,8),%xmm0
xor    %ebp,%ebp
ucomisd %xmm1,%xmm0
setae  %bpl
cmp    %ebp,%eax
je     1348 <clip+0x248>
movsd  (%rcx,%rbx,8),%xmm4
movslq %esi,%rax
movsd  %xmm1,-0x80(%rsp,%rax,8)
movapd %xmm1,%xmm5
subsd  %xmm2,%xmm5
movsd  (%rcx,%rdx,8),%xmm6
subsd  %xmm4,%xmm6
mulsd  %xmm5,%xmm6
movapd %xmm0,%xmm5
subsd  %xmm2,%xmm5
divsd  %xmm5,%xmm6
addsd  %xmm4,%xmm6
lea    0x1(%rax),%esi
movsd  %xmm6,0x110(%rsp,%rax,8)
ucomisd %xmm1,%xmm0
jb     12e0 <clip+0x1e0>
movsd  (%rcx,%rdx,8),%xmm2
movslq %esi,%rax
movsd  %xmm2,0x110(%rsp,%rax,8)
lea    0x1(%rax),%esi
movsd  %xmm0,-0x80(%rsp,%rax,8)
jmp    12e0 <clip+0x1e0>
xor    %eax,%eax
test   %esi,%esi
je     12a1 <clip+0x1a1>
jle    12a1 <clip+0x1a1>
movslq %esi,%r10
movsd  -0x88(%rsp,%r10,8),%xmm1
ff ff ff
add    $0xffffffffffffffff,%r10
xor    %r9d,%r9d
ucomisd %xmm1,%xmm3
setae  %r9b
mov    %esi,%esi
xor    %edi,%edi
xor    %eax,%eax
jmp    13c4 <clip+0x2c4>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
lea    0x1(%rdx),%rdi
mov    %rdx,%r10
movapd %xmm0,%xmm1
cmp    %rdi,%rsi
je     12a1 <clip+0x1a1>
mov    %r9d,%ebp
mov    %rdi,%rdx
movsd  -0x80(%rsp,%rdi,8),%xmm0
xor    %r9d,%r9d
ucomisd %xmm0,%xmm3
setae  %r9b
cmp    %r9d,%ebp
je     1424 <clip+0x324>
movsd  0x110(%rsp,%r10,8),%xmm2
movslq %eax,%rdi
movsd  %xmm3,(%r8,%rdi,8)
movapd %xmm3,%xmm4
subsd  %xmm1,%xmm4
movsd  0x110(%rsp,%rdx,8),%xmm5
subsd  %xmm2,%xmm5
mulsd  %xmm4,%xmm5
movapd %xmm0,%xmm4
subsd  %xmm1,%xmm4
divsd  %xmm4,%xmm5
addsd  %xmm2,%xmm5
lea    0x1(%rdi),%eax
movsd  %xmm5,(%rcx,%rdi,8)
ucomisd %xmm0,%xmm3
jb     13b0 <clip+0x2b0>
movsd  0x110(%rsp,%rdx,8),%xmm1
movslq %eax,%rdi
movsd  %xmm1,(%rcx,%rdi,8)
lea    0x1(%rdi),%eax
movsd  %xmm0,(%r8,%rdi,8)
jmp    13b0 <clip+0x2b0>

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

LLVM IR (-O2):
define i32 @clip(double* nocapture %0, double* nocapture %1, i32 %2, double %3, double %4, double %5, double %6, double* nocapture %7, double* nocapture %8) {
%10 = alloca [50 x double]
%11 = alloca [50 x double]
%12 = bitcast [50 x double]* %10 to i8*
%13 = bitcast [50 x double]* %11 to i8*
%14 = add nsw i32 %2, -1
%15 = sext i32 %14 to i64
%16 = getelementptr inbounds double, double* %0, i64 %15
%17 = load double, double* %16
%18 = icmp sgt i32 %2, 0
br i1 %18, label %19, label %215
19: ; preds = %9
%20 = fcmp oge double %17, %3
%21 = zext i1 %20 to i32
%22 = zext i32 %2 to i64
br label %23
23: ; preds = %19, %58
%24 = phi i64 [ 0, %19 ], [ %60, %58 ]
%25 = phi i64 [ %15, %19 ], [ %24, %58 ]
%26 = phi i32 [ %21, %19 ], [ %34, %58 ]
%27 = phi i32 [ 0, %19 ], [ %59, %58 ]
%28 = phi double [ %17, %19 ], [ %32, %58 ]
%29 = getelementptr inbounds double, double* %1, i64 %25
%30 = load double, double* %29
%31 = getelementptr inbounds double, double* %0, i64 %24
%32 = load double, double* %31
%33 = fcmp oge double %32, %3
%34 = zext i1 %33 to i32
%35 = icmp eq i32 %26, %34
br i1 %35, label %49, label %36
36: ; preds = %23
%37 = sext i32 %27 to i64
%38 = getelementptr inbounds [50 x double], [50 x double]* %10, i64 0, i64 %37
store double %3, double* %38
%39 = fsub double %3, %28
%40 = getelementptr inbounds double, double* %1, i64 %24
%41 = load double, double* %40
%42 = fsub double %41, %30
%43 = fmul double %39, %42
%44 = fsub double %32, %28
%45 = fdiv double %43, %44
%46 = fadd double %30, %45
%47 = add nsw i32 %27, 1
%48 = getelementptr inbounds [50 x double], [50 x double]* %11, i64 0, i64 %37
store double %46, double* %48
br label %49
49: ; preds = %36, %23
%50 = phi i32 [ %47, %36 ], [ %27, %23 ]
br i1 %33, label %51, label %58
51: ; preds = %49
%52 = sext i32 %50 to i64
%53 = getelementptr inbounds [50 x double], [50 x double]* %10, i64 0, i64 %52
store double %32, double* %53
%54 = getelementptr inbounds double, double* %1, i64 %24
%55 = load double, double* %54
%56 = add nsw i32 %50, 1
%57 = getelementptr inbounds [50 x double], [50 x double]* %11, i64 0, i64 %52
store double %55, double* %57
br label %58
58: ; preds = %51, %49
%59 = phi i32 [ %56, %51 ], [ %50, %49 ]
%60 = add nuw nsw i64 %24, 1
%61 = icmp eq i64 %60, %22
br i1 %61, label %62, label %23
62: ; preds = %58
%63 = icmp eq i32 %59, 0
br i1 %63, label %215, label %64
64: ; preds = %62
%65 = add nsw i32 %59, -1
%66 = sext i32 %65 to i64
%67 = getelementptr inbounds [50 x double], [50 x double]* %10, i64 0, i64 %66
%68 = load double, double* %67
%69 = icmp sgt i32 %59, 0
br i1 %69, label %70, label %215
70: ; preds = %64
%71 = fcmp ole double %68, %5
%72 = zext i1 %71 to i32
%73 = zext i32 %59 to i64
br label %74
74: ; preds = %70, %109
%75 = phi i64 [ 0, %70 ], [ %111, %109 ]
%76 = phi i64 [ %66, %70 ], [ %75, %109 ]
%77 = phi i32 [ %72, %70 ], [ %85, %109 ]
%78 = phi i32 [ 0, %70 ], [ %110, %109 ]
%79 = phi double [ %68, %70 ], [ %83, %109 ]
%80 = getelementptr inbounds [50 x double], [50 x double]* %11, i64 0, i64 %76
%81 = load double, double* %80
%82 = getelementptr inbounds [50 x double], [50 x double]* %10, i64 0, i64 %75
%83 = load double, double* %82
%84 = fcmp ole double %83, %5
%85 = zext i1 %84 to i32
%86 = icmp eq i32 %77, %85
br i1 %86, label %100, label %87
87: ; preds = %74
%88 = sext i32 %78 to i64
%89 = getelementptr inbounds double, double* %7, i64 %88
store double %5, double* %89
%90 = fsub double %5, %79
%91 = getelementptr inbounds [50 x double], [50 x double]* %11, i64 0, i64 %75
%92 = load double, double* %91
%93 = fsub double %92, %81
%94 = fmul double %90, %93
%95 = fsub double %83, %79
%96 = fdiv double %94, %95
%97 = fadd double %81, %96
%98 = add nsw i32 %78, 1
%99 = getelementptr inbounds double, double* %8, i64 %88
store double %97, double* %99
br label %100
100: ; preds = %87, %74
%101 = phi i32 [ %98, %87 ], [ %78, %74 ]
br i1 %84, label %102, label %109
102: ; preds = %100
%103 = sext i32 %101 to i64
%104 = getelementptr inbounds double, double* %7, i64 %103
store double %83, double* %104
%105 = getelementptr inbounds [50 x double], [50 x double]* %11, i64 0, i64 %75
%106 = load double, double* %105
%107 = add nsw i32 %101, 1
%108 = getelementptr inbounds double, double* %8, i64 %103
store double %106, double* %108
br label %109
109: ; preds = %102, %100
%110 = phi i32 [ %107, %102 ], [ %101, %100 ]
%111 = add nuw nsw i64 %75, 1
%112 = icmp eq i64 %111, %73
br i1 %112, label %113, label %74
113: ; preds = %109
%114 = icmp eq i32 %110, 0
br i1 %114, label %215, label %115
115: ; preds = %113
%116 = add nsw i32 %110, -1
%117 = sext i32 %116 to i64
%118 = getelementptr inbounds double, double* %8, i64 %117
%119 = load double, double* %118
%120 = icmp sgt i32 %110, 0
br i1 %120, label %121, label %215
121: ; preds = %115
%122 = fcmp oge double %119, %4
%123 = zext i1 %122 to i32
%124 = zext i32 %110 to i64
br label %125
125: ; preds = %121, %160
%126 = phi i64 [ 0, %121 ], [ %162, %160 ]
%127 = phi i64 [ %117, %121 ], [ %126, %160 ]
%128 = phi i32 [ %123, %121 ], [ %136, %160 ]
%129 = phi i32 [ 0, %121 ], [ %161, %160 ]
%130 = phi double [ %119, %121 ], [ %134, %160 ]
%131 = getelementptr inbounds double, double* %7, i64 %127
%132 = load double, double* %131
%133 = getelementptr inbounds double, double* %8, i64 %126
%134 = load double, double* %133
%135 = fcmp oge double %134, %4
%136 = zext i1 %135 to i32
%137 = icmp eq i32 %128, %136
br i1 %137, label %151, label %138
138: ; preds = %125
%139 = sext i32 %129 to i64
%140 = getelementptr inbounds [50 x double], [50 x double]* %11, i64 0, i64 %139
store double %4, double* %140
%141 = fsub double %4, %130
%142 = getelementptr inbounds double, double* %7, i64 %126
%143 = load double, double* %142
%144 = fsub double %143, %132
%145 = fmul double %141, %144
%146 = fsub double %134, %130
%147 = fdiv double %145, %146
%148 = fadd double %132, %147
%149 = add nsw i32 %129, 1
%150 = getelementptr inbounds [50 x double], [50 x double]* %10, i64 0, i64 %139
store double %148, double* %150
br label %151
151: ; preds = %138, %125
%152 = phi i32 [ %149, %138 ], [ %129, %125 ]
br i1 %135, label %153, label %160
153: ; preds = %151
%154 = getelementptr inbounds double, double* %7, i64 %126
%155 = load double, double* %154
%156 = sext i32 %152 to i64
%157 = getelementptr inbounds [50 x double], [50 x double]* %10, i64 0, i64 %156
store double %155, double* %157
%158 = add nsw i32 %152, 1
%159 = getelementptr inbounds [50 x double], [50 x double]* %11, i64 0, i64 %156
store double %134, double* %159
br label %160
160: ; preds = %153, %151
%161 = phi i32 [ %158, %153 ], [ %152, %151 ]
%162 = add nuw nsw i64 %126, 1
%163 = icmp eq i64 %162, %124
br i1 %163, label %164, label %125
164: ; preds = %160
%165 = icmp eq i32 %161, 0
br i1 %165, label %215, label %166
166: ; preds = %164
%167 = add nsw i32 %161, -1
%168 = sext i32 %167 to i64
%169 = getelementptr inbounds [50 x double], [50 x double]* %11, i64 0, i64 %168
%170 = load double, double* %169
%171 = icmp sgt i32 %161, 0
br i1 %171, label %172, label %215
172: ; preds = %166
%173 = fcmp ole double %170, %6
%174 = zext i1 %173 to i32
%175 = zext i32 %161 to i64
br label %176
176: ; preds = %172, %211
%177 = phi i64 [ 0, %172 ], [ %213, %211 ]
%178 = phi i64 [ %168, %172 ], [ %177, %211 ]
%179 = phi i32 [ %174, %172 ], [ %187, %211 ]
%180 = phi i32 [ 0, %172 ], [ %212, %211 ]
%181 = phi double [ %170, %172 ], [ %185, %211 ]
%182 = getelementptr inbounds [50 x double], [50 x double]* %10, i64 0, i64 %178
%183 = load double, double* %182
%184 = getelementptr inbounds [50 x double], [50 x double]* %11, i64 0, i64 %177
%185 = load double, double* %184
%186 = fcmp ole double %185, %6
%187 = zext i1 %186 to i32
%188 = icmp eq i32 %179, %187
br i1 %188, label %202, label %189
189: ; preds = %176
%190 = sext i32 %180 to i64
%191 = getelementptr inbounds double, double* %8, i64 %190
store double %6, double* %191
%192 = fsub double %6, %181
%193 = getelementptr inbounds [50 x double], [50 x double]* %10, i64 0, i64 %177
%194 = load double, double* %193
%195 = fsub double %194, %183
%196 = fmul double %192, %195
%197 = fsub double %185, %181
%198 = fdiv double %196, %197
%199 = fadd double %183, %198
%200 = add nsw i32 %180, 1
%201 = getelementptr inbounds double, double* %7, i64 %190
store double %199, double* %201
br label %202
202: ; preds = %189, %176
%203 = phi i32 [ %200, %189 ], [ %180, %176 ]
br i1 %186, label %204, label %211
204: ; preds = %202
%205 = getelementptr inbounds [50 x double], [50 x double]* %10, i64 0, i64 %177
%206 = load double, double* %205
%207 = sext i32 %203 to i64
%208 = getelementptr inbounds double, double* %7, i64 %207
store double %206, double* %208
%209 = add nsw i32 %203, 1
%210 = getelementptr inbounds double, double* %8, i64 %207
store double %185, double* %210
br label %211
211: ; preds = %204, %202
%212 = phi i32 [ %209, %204 ], [ %203, %202 ]
%213 = add nuw nsw i64 %177, 1
%214 = icmp eq i64 %213, %175
br i1 %214, label %215, label %176
215: ; preds = %211, %115, %64, %9, %166, %164, %113, %62
%216 = phi i32 [ 0, %62 ], [ 0, %113 ], [ 0, %164 ], [ 0, %166 ], [ 0, %9 ], [ 0, %64 ], [ 0, %115 ], [ %212, %211 ]
ret i32 %216
}