int clipLine(int *xi, int *yi, int *dxi, int *dyi, int w, int h) {
  int x, y;
  double dx, dy;
  int x2, y2;
  x = *xi;
  y = *yi;
  dx = (double)*dxi;
  dy = (double)*dyi;
  x2 = x + dx;
  y2 = y + dy;
  if (dy == 0) {
    if (y < 0 || y >= h)
      return -1;
    if (x < 0)
      x = 0;
    if (x2 < 0)
      x2 = 0;
    if (x >= w)
      x = w - 1;
    if (x2 >= w)
      x2 = w - 1;
    *xi = x;
    *dxi = x2 - x;
    return 0;
  }
  if (dx == 0) {
    if (x < 0 || x >= w)
      return -1;
    if (y < 0)
      y = 0;
    if (y2 < 0)
      y2 = 0;
    if (y >= h)
      y = h - 1;
    if (y2 >= h)
      y2 = h - 1;
    *yi = y;
    *dyi = y2 - y;
    return 0;
  }
  if (x >= 0 && x < w && y >= 0 && y < h && x + dx >= 0 && x + dx < w &&
      y + dy >= 0 && y + dy < h) {
    return 0;
  }
  if ((x < 0 && x2 < 0) || (x >= w && x2 >= w) || (y < 0 && y2 < 0) ||
      (y >= h && y2 >= h)) {
    return -1;
  }
  if (x < 0 || x >= w || y < 0 || y >= h) {
    if (x < 0) {
      y = (int)(0.5 + y2 + (dy / dx) * x2);
      x = 0;
    } else if (x >= w) {
      y = (int)(0.5 + y2 + (dy / dx) * (w - x2 - 1));
      x = w - 1;
    }
    if (y < 0) {
      x = (int)(0.5 + x2 - (dx / dy) * y2);
      y = 0;
    } else if (y >= h) {
      x = (int)(0.5 + x2 + (dx / dy) * (h - 1 - y2));
      y = h - 1;
    }
  }
  if (x2 < 0 || x2 >= w || y2 < 0 || y2 >= h) {
    if (x2 < 0) {
      y2 = (int)(0.5 + y + (dy / dx) * x);
      x2 = 0;
    } else if (x2 >= w) {
      y2 = (int)(0.5 + y + (dy / dx) * (w - x - 1));
      x2 = w - 1;
    }
    if (y2 < 0) {
      x2 = (int)(0.5 + x + (dx / dy) * y);
      y2 = 0;
    } else if (y2 >= h) {
      x2 = (int)(0.5 + x + (dx / dy) * (h - 1 - y));
      y2 = h - 1;
    }
  }
  *xi = x;
  *yi = y;
  *dxi = x2 - x;
  *dyi = y2 - y;
  return 0;
}


x86 assembly (clang, -O0):
<clipLine>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8d,-0x2c(%rbp)
mov    %r9d,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x34(%rbp)
mov    -0x18(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x38(%rbp)
mov    -0x20(%rbp),%rax
cvtsi2sdl (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x28(%rbp),%rax
cvtsi2sdl (%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
cvtsi2sdl -0x34(%rbp),%xmm0
addsd  -0x40(%rbp),%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x4c(%rbp)
cvtsi2sdl -0x38(%rbp),%xmm0
addsd  -0x48(%rbp),%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x50(%rbp)
movsd  -0x48(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1211 <clipLine+0x111>
jp     1211 <clipLine+0x111>
cmpl   $0x0,-0x38(%rbp)
jl     1198 <clipLine+0x98>
mov    -0x38(%rbp),%eax
cmp    -0x30(%rbp),%eax
jl     11a4 <clipLine+0xa4>
movl   $0xffffffff,-0x4(%rbp)
jmp    16b6 <clipLine+0x5b6>
cmpl   $0x0,-0x34(%rbp)
jge    11b5 <clipLine+0xb5>
movl   $0x0,-0x34(%rbp)
cmpl   $0x0,-0x4c(%rbp)
jge    11c6 <clipLine+0xc6>
movl   $0x0,-0x4c(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jl     11db <clipLine+0xdb>
mov    -0x2c(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jl     11f0 <clipLine+0xf0>
mov    -0x2c(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x34(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x4c(%rbp),%ecx
sub    -0x34(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    16b6 <clipLine+0x5b6>
movsd  -0x40(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    12b8 <clipLine+0x1b8>
jp     12b8 <clipLine+0x1b8>
cmpl   $0x0,-0x34(%rbp)
jl     123f <clipLine+0x13f>
mov    -0x34(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jl     124b <clipLine+0x14b>
movl   $0xffffffff,-0x4(%rbp)
jmp    16b6 <clipLine+0x5b6>
cmpl   $0x0,-0x38(%rbp)
jge    125c <clipLine+0x15c>
movl   $0x0,-0x38(%rbp)
cmpl   $0x0,-0x50(%rbp)
jge    126d <clipLine+0x16d>
movl   $0x0,-0x50(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x30(%rbp),%eax
jl     1282 <clipLine+0x182>
mov    -0x30(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x38(%rbp)
mov    -0x50(%rbp),%eax
cmp    -0x30(%rbp),%eax
jl     1297 <clipLine+0x197>
mov    -0x30(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x50(%rbp)
mov    -0x38(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x50(%rbp),%ecx
sub    -0x38(%rbp),%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    16b6 <clipLine+0x5b6>
cmpl   $0x0,-0x34(%rbp)
jl     1350 <clipLine+0x250>
mov    -0x34(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    1350 <clipLine+0x250>
cmpl   $0x0,-0x38(%rbp)
jl     1350 <clipLine+0x250>
mov    -0x38(%rbp),%eax
cmp    -0x30(%rbp),%eax
jge    1350 <clipLine+0x250>
cvtsi2sdl -0x34(%rbp),%xmm0
addsd  -0x40(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     1350 <clipLine+0x250>
cvtsi2sdl -0x34(%rbp),%xmm1
addsd  -0x40(%rbp),%xmm1
cvtsi2sdl -0x2c(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1350 <clipLine+0x250>
cvtsi2sdl -0x38(%rbp),%xmm0
addsd  -0x48(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     1350 <clipLine+0x250>
cvtsi2sdl -0x38(%rbp),%xmm1
addsd  -0x48(%rbp),%xmm1
cvtsi2sdl -0x30(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1350 <clipLine+0x250>
movl   $0x0,-0x4(%rbp)
jmp    16b6 <clipLine+0x5b6>
cmpl   $0x0,-0x34(%rbp)
jge    1364 <clipLine+0x264>
cmpl   $0x0,-0x4c(%rbp)
jl     13a8 <clipLine+0x2a8>
mov    -0x34(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jl     137c <clipLine+0x27c>
mov    -0x4c(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    13a8 <clipLine+0x2a8>
cmpl   $0x0,-0x38(%rbp)
jge    1390 <clipLine+0x290>
cmpl   $0x0,-0x50(%rbp)
jl     13a8 <clipLine+0x2a8>
mov    -0x38(%rbp),%eax
cmp    -0x30(%rbp),%eax
jl     13b4 <clipLine+0x2b4>
mov    -0x50(%rbp),%eax
cmp    -0x30(%rbp),%eax
jl     13b4 <clipLine+0x2b4>
movl   $0xffffffff,-0x4(%rbp)
jmp    16b6 <clipLine+0x5b6>
cmpl   $0x0,-0x34(%rbp)
jl     13e0 <clipLine+0x2e0>
mov    -0x34(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    13e0 <clipLine+0x2e0>
cmpl   $0x0,-0x38(%rbp)
jl     13e0 <clipLine+0x2e0>
mov    -0x38(%rbp),%eax
cmp    -0x30(%rbp),%eax
jl     1528 <clipLine+0x428>
cmpl   $0x0,-0x34(%rbp)
jge    1425 <clipLine+0x325>
cvtsi2sdl -0x50(%rbp),%xmm0
movsd  0xc09(%rip),%xmm1
addsd  %xmm0,%xmm1
movsd  -0x48(%rbp),%xmm0
divsd  -0x40(%rbp),%xmm0
cvtsi2sdl -0x4c(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x38(%rbp)
movl   $0x0,-0x34(%rbp)
jmp    1476 <clipLine+0x376>
mov    -0x34(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jl     1471 <clipLine+0x371>
cvtsi2sdl -0x50(%rbp),%xmm0
movsd  0xbc2(%rip),%xmm1
addsd  %xmm0,%xmm1
movsd  -0x48(%rbp),%xmm0
divsd  -0x40(%rbp),%xmm0
mov    -0x2c(%rbp),%eax
sub    -0x4c(%rbp),%eax
sub    $0x1,%eax
cvtsi2sd %eax,%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x38(%rbp)
mov    -0x2c(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1476 <clipLine+0x376>
cmpl   $0x0,-0x38(%rbp)
jge    14d2 <clipLine+0x3d2>
cvtsi2sdl -0x4c(%rbp),%xmm0
movsd  0xb73(%rip),%xmm1
addsd  %xmm0,%xmm1
movsd  -0x40(%rbp),%xmm0
divsd  -0x48(%rbp),%xmm0
cvtsi2sdl -0x50(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x34(%rbp)
movl   $0x0,-0x38(%rbp)
jmp    1523 <clipLine+0x423>
mov    -0x38(%rbp),%eax
cmp    -0x30(%rbp),%eax
jl     151e <clipLine+0x41e>
cvtsi2sdl -0x4c(%rbp),%xmm0
movsd  0xb15(%rip),%xmm1
addsd  %xmm0,%xmm1
movsd  -0x40(%rbp),%xmm0
divsd  -0x48(%rbp),%xmm0
mov    -0x30(%rbp),%eax
sub    $0x1,%eax
sub    -0x50(%rbp),%eax
cvtsi2sd %eax,%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x34(%rbp)
mov    -0x30(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1523 <clipLine+0x423>
jmp    1528 <clipLine+0x428>
cmpl   $0x0,-0x4c(%rbp)
jl     1554 <clipLine+0x454>
mov    -0x4c(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    1554 <clipLine+0x454>
cmpl   $0x0,-0x50(%rbp)
jl     1554 <clipLine+0x454>
mov    -0x50(%rbp),%eax
cmp    -0x30(%rbp),%eax
jl     1685 <clipLine+0x585>
cmpl   $0x0,-0x4c(%rbp)
jge    1599 <clipLine+0x499>
cvtsi2sdl -0x38(%rbp),%xmm0
movsd  0xa95(%rip),%xmm1
addsd  %xmm0,%xmm1
movsd  -0x48(%rbp),%xmm0
divsd  -0x40(%rbp),%xmm0
cvtsi2sdl -0x34(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x50(%rbp)
movl   $0x0,-0x4c(%rbp)
jmp    15ea <clipLine+0x4ea>
mov    -0x4c(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jl     15e5 <clipLine+0x4e5>
cvtsi2sdl -0x38(%rbp),%xmm0
movsd  0xa4e(%rip),%xmm1
addsd  %xmm0,%xmm1
movsd  -0x48(%rbp),%xmm0
divsd  -0x40(%rbp),%xmm0
mov    -0x2c(%rbp),%eax
sub    -0x34(%rbp),%eax
sub    $0x1,%eax
cvtsi2sd %eax,%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x50(%rbp)
mov    -0x2c(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    15ea <clipLine+0x4ea>
cmpl   $0x0,-0x50(%rbp)
jge    162f <clipLine+0x52f>
cvtsi2sdl -0x34(%rbp),%xmm0
movsd  0x9ff(%rip),%xmm1
addsd  %xmm0,%xmm1
movsd  -0x40(%rbp),%xmm0
divsd  -0x48(%rbp),%xmm0
cvtsi2sdl -0x38(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x4c(%rbp)
movl   $0x0,-0x50(%rbp)
jmp    1680 <clipLine+0x580>
mov    -0x50(%rbp),%eax
cmp    -0x30(%rbp),%eax
jl     167b <clipLine+0x57b>
cvtsi2sdl -0x34(%rbp),%xmm0
movsd  0x9b8(%rip),%xmm1
addsd  %xmm0,%xmm1
movsd  -0x40(%rbp),%xmm0
divsd  -0x48(%rbp),%xmm0
mov    -0x30(%rbp),%eax
sub    $0x1,%eax
sub    -0x38(%rbp),%eax
cvtsi2sd %eax,%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x30(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    1680 <clipLine+0x580>
jmp    1685 <clipLine+0x585>
mov    -0x34(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x38(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x4c(%rbp),%ecx
sub    -0x34(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x50(%rbp),%ecx
sub    -0x38(%rbp),%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<clipLine>:
push   %rbp
push   %r14
push   %rbx
mov    (%rdi),%r11d
mov    (%rdx),%eax
cvtsi2sd %eax,%xmm0
mov    (%rsi),%r10d
mov    (%rcx),%ebp
cvtsi2sd %r11d,%xmm3
addsd  %xmm0,%xmm3
cvttsd2si %xmm3,%ebx
test   %ebp,%ebp
je     1196 <clipLine+0x96>
cvtsi2sd %ebp,%xmm1
cvtsi2sd %r10d,%xmm2
addsd  %xmm1,%xmm2
cvttsd2si %xmm2,%ebp
test   %eax,%eax
je     11d9 <clipLine+0xd9>
test   %r11d,%r11d
js     121c <clipLine+0x11c>
cmp    %r8d,%r11d
jge    118a <clipLine+0x8a>
test   %r10d,%r10d
js     118a <clipLine+0x8a>
cmp    %r9d,%r10d
jge    118a <clipLine+0x8a>
xorpd  %xmm4,%xmm4
ucomisd %xmm4,%xmm3
jb     118a <clipLine+0x8a>
xorps  %xmm4,%xmm4
cvtsi2sd %r8d,%xmm4
ucomisd %xmm3,%xmm4
jbe    118a <clipLine+0x8a>
xorpd  %xmm3,%xmm3
ucomisd %xmm3,%xmm2
jb     118a <clipLine+0x8a>
xor    %eax,%eax
xorps  %xmm3,%xmm3
cvtsi2sd %r9d,%xmm3
ucomisd %xmm2,%xmm3
ja     1451 <clipLine+0x351>
mov    %ebx,%r14d
shr    $0x1f,%r14d
jmp    1227 <clipLine+0x127>
mov    $0xffffffff,%eax
test   %r10d,%r10d
js     1451 <clipLine+0x351>
cmp    %r9d,%r10d
jge    1451 <clipLine+0x351>
xor    %eax,%eax
test   %r11d,%r11d
cmovs  %eax,%r11d
test   %ebx,%ebx
cmovs  %eax,%ebx
lea    -0x1(%r8),%ecx
cmp    %r8d,%r11d
cmovge %ecx,%r11d
cmp    %r8d,%ebx
cmovge %ecx,%ebx
mov    %r11d,(%rdi)
sub    %r11d,%ebx
mov    %ebx,(%rdx)
jmp    1451 <clipLine+0x351>
mov    $0xffffffff,%eax
test   %r11d,%r11d
js     1451 <clipLine+0x351>
cmp    %r8d,%r11d
jge    1451 <clipLine+0x351>
xor    %eax,%eax
test   %r10d,%r10d
cmovs  %eax,%r10d
test   %ebp,%ebp
cmovs  %eax,%ebp
lea    -0x1(%r9),%edx
cmp    %r9d,%r10d
cmovge %edx,%r10d
cmp    %r9d,%ebp
cmovge %edx,%ebp
mov    %r10d,(%rsi)
sub    %r10d,%ebp
mov    %ebp,(%rcx)
jmp    1451 <clipLine+0x351>
test   %ebx,%ebx
js     12aa <clipLine+0x1aa>
xor    %r14d,%r14d
mov    $0xffffffff,%eax
cmp    %r8d,%r11d
jl     123a <clipLine+0x13a>
cmp    %r8d,%ebx
jge    1451 <clipLine+0x351>
test   %r10d,%r10d
jns    1247 <clipLine+0x147>
test   %ebp,%ebp
js     1451 <clipLine+0x351>
cmp    %r9d,%r10d
jl     1255 <clipLine+0x155>
cmp    %r9d,%ebp
jge    1451 <clipLine+0x351>
test   %r11d,%r11d
js     12b4 <clipLine+0x1b4>
cmp    %r8d,%r11d
jge    126d <clipLine+0x16d>
test   %r10d,%r10d
js     126d <clipLine+0x16d>
cmp    %r9d,%r10d
jl     1350 <clipLine+0x250>
cmp    %r8d,%r11d
jl     12e2 <clipLine+0x1e2>
xorps  %xmm2,%xmm2
cvtsi2sd %ebp,%xmm2
addsd  0xd7f(%rip),%xmm2
movapd %xmm1,%xmm3
divsd  %xmm0,%xmm3
mov    %ebx,%eax
not    %eax
add    %r8d,%eax
xorps  %xmm4,%xmm4
cvtsi2sd %eax,%xmm4
mulsd  %xmm3,%xmm4
addsd  %xmm2,%xmm4
cvttsd2si %xmm4,%r10d
lea    -0x1(%r8),%r11d
jmp    12e2 <clipLine+0x1e2>
mov    $0xffffffff,%eax
jmp    1451 <clipLine+0x351>
xorps  %xmm2,%xmm2
cvtsi2sd %ebp,%xmm2
addsd  0xd3d(%rip),%xmm2
movapd %xmm1,%xmm3
divsd  %xmm0,%xmm3
xorps  %xmm4,%xmm4
cvtsi2sd %ebx,%xmm4
mulsd  %xmm3,%xmm4
addsd  %xmm2,%xmm4
cvttsd2si %xmm4,%r10d
xor    %r11d,%r11d
test   %r10d,%r10d
js     1322 <clipLine+0x222>
cmp    %r9d,%r10d
jl     1350 <clipLine+0x250>
xorps  %xmm2,%xmm2
cvtsi2sd %ebx,%xmm2
addsd  0xd05(%rip),%xmm2
movapd %xmm0,%xmm3
divsd  %xmm1,%xmm3
lea    -0x1(%r9),%r10d
mov    %r10d,%eax
sub    %ebp,%eax
xorps  %xmm4,%xmm4
cvtsi2sd %eax,%xmm4
mulsd  %xmm3,%xmm4
addsd  %xmm2,%xmm4
cvttsd2si %xmm4,%r11d
jmp    1350 <clipLine+0x250>
xorps  %xmm2,%xmm2
cvtsi2sd %ebx,%xmm2
addsd  0xccf(%rip),%xmm2
xorps  %xmm3,%xmm3
cvtsi2sd %ebp,%xmm3
movapd %xmm0,%xmm4
divsd  %xmm1,%xmm4
mulsd  %xmm3,%xmm4
subsd  %xmm4,%xmm2
cvttsd2si %xmm2,%r11d
xor    %r10d,%r10d
test   %r14b,%r14b
je     1385 <clipLine+0x285>
xorps  %xmm2,%xmm2
cvtsi2sd %r10d,%xmm2
addsd  0xc9b(%rip),%xmm2
movapd %xmm1,%xmm3
divsd  %xmm0,%xmm3
xorps  %xmm4,%xmm4
cvtsi2sd %r11d,%xmm4
mulsd  %xmm3,%xmm4
addsd  %xmm2,%xmm4
cvttsd2si %xmm4,%ebp
xor    %ebx,%ebx
jmp    13d6 <clipLine+0x2d6>
cmp    %r8d,%ebx
jge    1397 <clipLine+0x297>
test   %ebp,%ebp
js     1397 <clipLine+0x297>
cmp    %r9d,%ebp
jl     143f <clipLine+0x33f>
cmp    %r8d,%ebx
jl     13d6 <clipLine+0x2d6>
xorps  %xmm2,%xmm2
cvtsi2sd %r10d,%xmm2
addsd  0xc54(%rip),%xmm2
movapd %xmm1,%xmm3
divsd  %xmm0,%xmm3
mov    %r11d,%eax
not    %eax
add    %r8d,%eax
xorps  %xmm4,%xmm4
cvtsi2sd %eax,%xmm4
mulsd  %xmm3,%xmm4
addsd  %xmm2,%xmm4
cvttsd2si %xmm4,%ebp
add    $0xffffffff,%r8d
mov    %r8d,%ebx
test   %ebp,%ebp
js     1415 <clipLine+0x315>
cmp    %r9d,%ebp
jl     143f <clipLine+0x33f>
xorps  %xmm2,%xmm2
cvtsi2sd %r11d,%xmm2
addsd  0xc11(%rip),%xmm2
divsd  %xmm1,%xmm0
add    $0xffffffff,%r9d
mov    %r9d,%eax
sub    %r10d,%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
mulsd  %xmm0,%xmm1
addsd  %xmm2,%xmm1
cvttsd2si %xmm1,%ebx
mov    %r9d,%ebp
jmp    143f <clipLine+0x33f>
xorps  %xmm2,%xmm2
cvtsi2sd %r11d,%xmm2
addsd  0xbdb(%rip),%xmm2
divsd  %xmm1,%xmm0
xorps  %xmm1,%xmm1
cvtsi2sd %r10d,%xmm1
mulsd  %xmm0,%xmm1
addsd  %xmm2,%xmm1
cvttsd2si %xmm1,%ebx
xor    %ebp,%ebp
mov    %r11d,(%rdi)
mov    %r10d,(%rsi)
sub    %r11d,%ebx
mov    %ebx,(%rdx)
sub    %r10d,%ebp
mov    %ebp,(%rcx)
xor    %eax,%eax
pop    %rbx
pop    %r14
pop    %rbp
ret

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

LLVM IR (-O2):
define i32 @clipLine(i32* nocapture %0, i32* nocapture %1, i32* nocapture %2, i32* nocapture %3, i32 %4, i32 %5) {
%7 = load i32, i32* %0
%8 = load i32, i32* %1
%9 = load i32, i32* %2
%10 = sitofp i32 %9 to double
%11 = load i32, i32* %3
%12 = sitofp i32 %11 to double
%13 = sitofp i32 %7 to double
%14 = fadd double %13, %10
%15 = fptosi double %14 to i32
%16 = sitofp i32 %8 to double
%17 = fadd double %16, %12
%18 = fptosi double %17 to i32
%19 = icmp eq i32 %11, 0
br i1 %19, label %20, label %35
20: ; preds = %6
%21 = icmp sgt i32 %8, -1
%22 = icmp slt i32 %8, %5
%23 = and i1 %21, %22
br i1 %23, label %24, label %186
24: ; preds = %20
%25 = icmp sgt i32 %7, 0
%26 = select i1 %25, i32 %7, i32 0
%27 = icmp sgt i32 %15, 0
%28 = select i1 %27, i32 %15, i32 0
%29 = icmp slt i32 %26, %4
%30 = add nsw i32 %4, -1
%31 = select i1 %29, i32 %26, i32 %30
%32 = icmp slt i32 %28, %4
%33 = select i1 %32, i32 %28, i32 %30
store i32 %31, i32* %0
%34 = sub nsw i32 %33, %31
store i32 %34, i32* %2
br label %186
35: ; preds = %6
%36 = icmp eq i32 %9, 0
%37 = icmp sgt i32 %7, -1
br i1 %36, label %38, label %52
38: ; preds = %35
%39 = icmp slt i32 %7, %4
%40 = and i1 %37, %39
br i1 %40, label %41, label %186
41: ; preds = %38
%42 = icmp sgt i32 %8, 0
%43 = select i1 %42, i32 %8, i32 0
%44 = icmp sgt i32 %18, 0
%45 = select i1 %44, i32 %18, i32 0
%46 = icmp slt i32 %43, %5
%47 = add nsw i32 %5, -1
%48 = select i1 %46, i32 %43, i32 %47
%49 = icmp slt i32 %45, %5
%50 = select i1 %49, i32 %45, i32 %47
store i32 %48, i32* %1
%51 = sub nsw i32 %50, %48
store i32 %51, i32* %3
br label %186
52: ; preds = %35
br i1 %37, label %53, label %71
53: ; preds = %52
%54 = icmp slt i32 %7, %4
%55 = icmp sgt i32 %8, -1
%56 = select i1 %54, i1 %55, i1 false
%57 = icmp slt i32 %8, %5
%58 = select i1 %56, i1 %57, i1 false
%59 = fcmp oge double %14, 0.000000e+00
%60 = select i1 %58, i1 %59, i1 false
%61 = sitofp i32 %4 to double
%62 = fcmp olt double %14, %61
%63 = select i1 %60, i1 %62, i1 false
%64 = fcmp oge double %17, 0.000000e+00
%65 = select i1 %63, i1 %64, i1 false
%66 = sitofp i32 %5 to double
%67 = fcmp olt double %17, %66
%68 = select i1 %65, i1 %67, i1 false
br i1 %68, label %186, label %69
69: ; preds = %53
%70 = icmp slt i32 %15, 0
br label %73
71: ; preds = %52
%72 = icmp slt i32 %15, 0
br i1 %72, label %186, label %73
73: ; preds = %69, %71
%74 = phi i1 [ %70, %69 ], [ false, %71 ]
%75 = icmp sge i32 %7, %4
%76 = xor i1 %75, true
%77 = icmp slt i32 %15, %4
%78 = select i1 %76, i1 true, i1 %77
br i1 %78, label %79, label %186
79: ; preds = %73
%80 = icmp slt i32 %8, 0
%81 = icmp slt i32 %18, 0
%82 = select i1 %80, i1 %81, i1 false
br i1 %82, label %186, label %83
83: ; preds = %79
%84 = icmp slt i32 %8, %5
%85 = icmp slt i32 %18, %5
%86 = select i1 %84, i1 true, i1 %85
br i1 %86, label %87, label %186
87: ; preds = %83
br i1 %37, label %88, label %92
88: ; preds = %87
%89 = select i1 %75, i1 true, i1 %80
%90 = xor i1 %84, true
%91 = select i1 %89, i1 true, i1 %90
br i1 %91, label %99, label %133
92: ; preds = %87
%93 = sitofp i32 %18 to double
%94 = fadd double %93, 5.000000e-01
%95 = fdiv double %12, %10
%96 = sitofp i32 %15 to double
%97 = tail call double @llvm.fmuladd.f64(double %95, double %96, double %94)
%98 = fptosi double %97 to i32
br label %110
99: ; preds = %88
br i1 %75, label %100, label %110
100: ; preds = %99
%101 = sitofp i32 %18 to double
%102 = fadd double %101, 5.000000e-01
%103 = fdiv double %12, %10
%104 = xor i32 %15, -1
%105 = add i32 %104, %4
%106 = sitofp i32 %105 to double
%107 = tail call double @llvm.fmuladd.f64(double %103, double %106, double %102)
%108 = fptosi double %107 to i32
%109 = add nsw i32 %4, -1
br label %110
110: ; preds = %99, %100, %92
%111 = phi i32 [ %98, %92 ], [ %108, %100 ], [ %8, %99 ]
%112 = phi i32 [ 0, %92 ], [ %109, %100 ], [ %7, %99 ]
%113 = icmp slt i32 %111, 0
br i1 %113, label %114, label %122
114: ; preds = %110
%115 = sitofp i32 %15 to double
%116 = fadd double %115, 5.000000e-01
%117 = sitofp i32 %18 to double
%118 = fneg double %10
%119 = fdiv double %118, %12
%120 = tail call double @llvm.fmuladd.f64(double %119, double %117, double %116)
%121 = fptosi double %120 to i32
br label %133
122: ; preds = %110
%123 = icmp slt i32 %111, %5
br i1 %123, label %133, label %124
124: ; preds = %122
%125 = sitofp i32 %15 to double
%126 = fadd double %125, 5.000000e-01
%127 = fdiv double %10, %12
%128 = add nsw i32 %5, -1
%129 = sub nsw i32 %128, %18
%130 = sitofp i32 %129 to double
%131 = tail call double @llvm.fmuladd.f64(double %127, double %130, double %126)
%132 = fptosi double %131 to i32
br label %133
133: ; preds = %88, %114, %124, %122
%134 = phi i32 [ 0, %114 ], [ %128, %124 ], [ %111, %122 ], [ %8, %88 ]
%135 = phi i32 [ %121, %114 ], [ %132, %124 ], [ %112, %122 ], [ %7, %88 ]
br i1 %74, label %141, label %136
136: ; preds = %133
%137 = icmp sge i32 %15, %4
%138 = select i1 %137, i1 true, i1 %81
%139 = xor i1 %138, true
%140 = select i1 %139, i1 %85, i1 false
br i1 %140, label %181, label %148
141: ; preds = %133
%142 = sitofp i32 %134 to double
%143 = fadd double %142, 5.000000e-01
%144 = fdiv double %12, %10
%145 = sitofp i32 %135 to double
%146 = tail call double @llvm.fmuladd.f64(double %144, double %145, double %143)
%147 = fptosi double %146 to i32
br label %159
148: ; preds = %136
br i1 %77, label %159, label %149
149: ; preds = %148
%150 = sitofp i32 %134 to double
%151 = fadd double %150, 5.000000e-01
%152 = fdiv double %12, %10
%153 = xor i32 %135, -1
%154 = add i32 %153, %4
%155 = sitofp i32 %154 to double
%156 = tail call double @llvm.fmuladd.f64(double %152, double %155, double %151)
%157 = fptosi double %156 to i32
%158 = add nsw i32 %4, -1
br label %159
159: ; preds = %148, %149, %141
%160 = phi i32 [ 0, %141 ], [ %158, %149 ], [ %15, %148 ]
%161 = phi i32 [ %147, %141 ], [ %157, %149 ], [ %18, %148 ]
%162 = icmp slt i32 %161, 0
br i1 %162, label %163, label %170
163: ; preds = %159
%164 = sitofp i32 %135 to double
%165 = fadd double %164, 5.000000e-01
%166 = fdiv double %10, %12
%167 = sitofp i32 %134 to double
%168 = tail call double @llvm.fmuladd.f64(double %166, double %167, double %165)
%169 = fptosi double %168 to i32
br label %181
170: ; preds = %159
%171 = icmp slt i32 %161, %5
br i1 %171, label %181, label %172
172: ; preds = %170
%173 = sitofp i32 %135 to double
%174 = fadd double %173, 5.000000e-01
%175 = fdiv double %10, %12
%176 = add nsw i32 %5, -1
%177 = sub nsw i32 %176, %134
%178 = sitofp i32 %177 to double
%179 = tail call double @llvm.fmuladd.f64(double %175, double %178, double %174)
%180 = fptosi double %179 to i32
br label %181
181: ; preds = %136, %163, %172, %170
%182 = phi i32 [ %169, %163 ], [ %180, %172 ], [ %160, %170 ], [ %15, %136 ]
%183 = phi i32 [ 0, %163 ], [ %176, %172 ], [ %161, %170 ], [ %18, %136 ]
store i32 %135, i32* %0
store i32 %134, i32* %1
%184 = sub nsw i32 %182, %135
store i32 %184, i32* %2
%185 = sub nsw i32 %183, %134
store i32 %185, i32* %3
br label %186
186: ; preds = %71, %79, %73, %83, %53, %38, %20, %181, %41, %24
%187 = phi i32 [ 0, %24 ], [ 0, %41 ], [ 0, %181 ], [ -1, %20 ], [ -1, %38 ], [ 0, %53 ], [ -1, %83 ], [ -1, %73 ], [ -1, %79 ], [ -1, %71 ]
ret i32 %187
}