void line(int *bits, int nColors, int width, int height, int fun, int x0,
          int y0, int dx, int dy, int xe, int ye, int xf, int yf) {
  int x, num, lx;
  int xx, y, x00, f;
  int x11;
  x = ((x0) >
       (((xe) > ((dy == 0)
                     ? xe
                     : x0 + ((dx * (((ye - y0) << 1) - 1)) + ((dy << 1)) - 1) /
                                ((dy << 1))))
            ? (xe)
            : ((dy == 0)
                   ? xe
                   : x0 + ((dx * (((ye - y0) << 1) - 1)) + ((dy << 1)) - 1) /
                              ((dy << 1)))))
          ? (x0)
          : (((xe) > ((dy == 0) ? xe
                                : x0 + ((dx * (((ye - y0) << 1) - 1)) +
                                        ((dy << 1)) - 1) /
                                           ((dy << 1))))
                 ? (xe)
                 : ((dy == 0) ? xe
                              : x0 + ((dx * (((ye - y0) << 1) - 1)) +
                                      ((dy << 1)) - 1) /
                                         ((dy << 1))));
  num = dx + 2 * dy * (x - x0);
  lx = ((xf) < ((dy == 0)
                    ? xf
                    : x0 + ((dx * (((yf - y0) << 1) - 1)) + ((dy << 1)) - 1) /
                               ((dy << 1))))
           ? (xf)
           : ((dy == 0)
                  ? xf
                  : x0 + ((dx * (((yf - y0) << 1) - 1)) + ((dy << 1)) - 1) /
                             ((dy << 1)));
  xx = ((lx) < (x0 + (dx >> 1))) ? (lx) : (x0 + (dx >> 1));
  y = y0 + (((num) - ((dx << 1))) + (((dx << 1))) - 1) / (((dx << 1)));
  f = ((((num) - ((dx << 1))) + (((dx << 1))) - 1) / (((dx << 1))) - dx) >> 1;
  for (x00 = x; x00 < xx; x00++, f += dy) {
    if (f + f > dx) {
      f -= dx;
      y++;
    }
    switch (fun) {
    case 0:
      bits[((y)) * width + ((x00))] =
          (bits[((y)) * width + ((x00))] + 1) % nColors;
      ;
      break;
    case 1:
      bits[((x00)) * width + ((y))] =
          (bits[((x00)) * width + ((y))] + 1) % nColors;
      ;
      break;
    case 2:
      bits[((x00)) * width + ((-y))] =
          (bits[((x00)) * width + ((-y))] + 1) % nColors;
      ;
      break;
    case 3:
      bits[((y)) * width + ((-x00))] =
          (bits[((y)) * width + ((-x00))] + 1) % nColors;
      ;
      break;
    case 4:
      bits[((-y)) * width + ((-x00))] =
          (bits[((-y)) * width + ((-x00))] + 1) % nColors;
      ;
      break;
    case 5:
      bits[((-x00)) * width + ((-y))] =
          (bits[((-x00)) * width + ((-y))] + 1) % nColors;
      ;
      break;
    case 6:
      bits[((-x00)) * width + ((y))] =
          (bits[((-x00)) * width + ((y))] + 1) % nColors;
      ;
      break;
    case 7:
      bits[((-y)) * width + ((x00))] =
          (bits[((-y)) * width + ((x00))] + 1) % nColors;
      ;
      break;
    }
  }
  for (x11 = x00; x11 < lx; x11++, f += dy) {
    if (f + f > dx) {
      f -= dx;
      y++;
    }
    switch (fun) {
    case 0:
      bits[((y)) * width + ((x11))] =
          (bits[((y)) * width + ((x11))] + 1) % nColors;
      ;
      break;
    case 1:
      bits[((x11)) * width + ((y))] =
          (bits[((x11)) * width + ((y))] + 1) % nColors;
      ;
      break;
    case 2:
      bits[((x11)) * width + ((-y))] =
          (bits[((x11)) * width + ((-y))] + 1) % nColors;
      ;
      break;
    case 3:
      bits[((y)) * width + ((-x11))] =
          (bits[((y)) * width + ((-x11))] + 1) % nColors;
      ;
      break;
    case 4:
      bits[((-y)) * width + ((-x11))] =
          (bits[((-y)) * width + ((-x11))] + 1) % nColors;
      ;
      break;
    case 5:
      bits[((-x11)) * width + ((-y))] =
          (bits[((-x11)) * width + ((-y))] + 1) % nColors;
      ;
      break;
    case 6:
      bits[((-x11)) * width + ((y))] =
          (bits[((-x11)) * width + ((y))] + 1) % nColors;
      ;
      break;
    case 7:
      bits[((-y)) * width + ((x11))] =
          (bits[((-y)) * width + ((x11))] + 1) % nColors;
      ;
      break;
    }
  }
}


x86 assembly (clang, -O0):
<line>:
push   %rbp
mov    %rsp,%rbp
sub    $0x28,%rsp
mov    0x40(%rbp),%eax
mov    0x38(%rbp),%eax
mov    0x30(%rbp),%eax
mov    0x28(%rbp),%eax
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8d,-0x18(%rbp)
mov    %r9d,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    0x28(%rbp),%eax
mov    %eax,-0x40(%rbp)
cmpl   $0x0,0x20(%rbp)
jne    1153 <line+0x53>
mov    0x28(%rbp),%eax
mov    %eax,-0x48(%rbp)
jmp    1189 <line+0x89>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    0x18(%rbp),%eax
mov    0x30(%rbp),%ecx
sub    0x10(%rbp),%ecx
shl    $0x1,%ecx
sub    $0x1,%ecx
imul   %ecx,%eax
mov    0x20(%rbp),%ecx
shl    $0x1,%ecx
add    %ecx,%eax
sub    $0x1,%eax
mov    0x20(%rbp),%ecx
shl    $0x1,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x4c(%rbp),%eax
add    %ecx,%eax
mov    %eax,-0x48(%rbp)
mov    -0x40(%rbp),%eax
mov    -0x48(%rbp),%ecx
cmp    %ecx,%eax
jle    11a2 <line+0xa2>
mov    0x28(%rbp),%eax
mov    %eax,-0x50(%rbp)
jmp    11f3 <line+0xf3>
cmpl   $0x0,0x20(%rbp)
jne    11b7 <line+0xb7>
mov    0x28(%rbp),%eax
mov    %eax,-0x54(%rbp)
jmp    11ed <line+0xed>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x58(%rbp)
mov    0x18(%rbp),%eax
mov    0x30(%rbp),%ecx
sub    0x10(%rbp),%ecx
shl    $0x1,%ecx
sub    $0x1,%ecx
imul   %ecx,%eax
mov    0x20(%rbp),%ecx
shl    $0x1,%ecx
add    %ecx,%eax
sub    $0x1,%eax
mov    0x20(%rbp),%ecx
shl    $0x1,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x58(%rbp),%eax
add    %ecx,%eax
mov    %eax,-0x54(%rbp)
mov    -0x54(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    -0x44(%rbp),%eax
mov    -0x50(%rbp),%ecx
cmp    %ecx,%eax
jle    120c <line+0x10c>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x5c(%rbp)
jmp    12cd <line+0x1cd>
mov    0x28(%rbp),%eax
mov    %eax,-0x60(%rbp)
cmpl   $0x0,0x20(%rbp)
jne    1227 <line+0x127>
mov    0x28(%rbp),%eax
mov    %eax,-0x64(%rbp)
jmp    125d <line+0x15d>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x68(%rbp)
mov    0x18(%rbp),%eax
mov    0x30(%rbp),%ecx
sub    0x10(%rbp),%ecx
shl    $0x1,%ecx
sub    $0x1,%ecx
imul   %ecx,%eax
mov    0x20(%rbp),%ecx
shl    $0x1,%ecx
add    %ecx,%eax
sub    $0x1,%eax
mov    0x20(%rbp),%ecx
shl    $0x1,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x68(%rbp),%eax
add    %ecx,%eax
mov    %eax,-0x64(%rbp)
mov    -0x60(%rbp),%eax
mov    -0x64(%rbp),%ecx
cmp    %ecx,%eax
jle    1276 <line+0x176>
mov    0x28(%rbp),%eax
mov    %eax,-0x6c(%rbp)
jmp    12c7 <line+0x1c7>
cmpl   $0x0,0x20(%rbp)
jne    128b <line+0x18b>
mov    0x28(%rbp),%eax
mov    %eax,-0x70(%rbp)
jmp    12c1 <line+0x1c1>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x74(%rbp)
mov    0x18(%rbp),%eax
mov    0x30(%rbp),%ecx
sub    0x10(%rbp),%ecx
shl    $0x1,%ecx
sub    $0x1,%ecx
imul   %ecx,%eax
mov    0x20(%rbp),%ecx
shl    $0x1,%ecx
add    %ecx,%eax
sub    $0x1,%eax
mov    0x20(%rbp),%ecx
shl    $0x1,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x74(%rbp),%eax
add    %ecx,%eax
mov    %eax,-0x70(%rbp)
mov    -0x70(%rbp),%eax
mov    %eax,-0x6c(%rbp)
mov    -0x6c(%rbp),%eax
mov    %eax,-0x5c(%rbp)
mov    -0x5c(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    0x18(%rbp),%eax
mov    0x20(%rbp),%ecx
shl    $0x1,%ecx
mov    -0x20(%rbp),%edx
sub    -0x1c(%rbp),%edx
imul   %edx,%ecx
add    %ecx,%eax
mov    %eax,-0x24(%rbp)
mov    0x38(%rbp),%eax
mov    %eax,-0x78(%rbp)
cmpl   $0x0,0x20(%rbp)
jne    1305 <line+0x205>
mov    0x38(%rbp),%eax
mov    %eax,-0x7c(%rbp)
jmp    133b <line+0x23b>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x80(%rbp)
mov    0x18(%rbp),%eax
mov    0x40(%rbp),%ecx
sub    0x10(%rbp),%ecx
shl    $0x1,%ecx
sub    $0x1,%ecx
imul   %ecx,%eax
mov    0x20(%rbp),%ecx
shl    $0x1,%ecx
add    %ecx,%eax
sub    $0x1,%eax
mov    0x20(%rbp),%ecx
shl    $0x1,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x80(%rbp),%eax
add    %ecx,%eax
mov    %eax,-0x7c(%rbp)
mov    -0x78(%rbp),%eax
mov    -0x7c(%rbp),%ecx
cmp    %ecx,%eax
jge    1357 <line+0x257>
mov    0x38(%rbp),%eax
mov    %eax,-0x84(%rbp)
jmp    13ba <line+0x2ba>
cmpl   $0x0,0x20(%rbp)
jne    136f <line+0x26f>
mov    0x38(%rbp),%eax
mov    %eax,-0x88(%rbp)
jmp    13ae <line+0x2ae>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x8c(%rbp)
mov    0x18(%rbp),%eax
mov    0x40(%rbp),%ecx
sub    0x10(%rbp),%ecx
shl    $0x1,%ecx
sub    $0x1,%ecx
imul   %ecx,%eax
mov    0x20(%rbp),%ecx
shl    $0x1,%ecx
add    %ecx,%eax
sub    $0x1,%eax
mov    0x20(%rbp),%ecx
shl    $0x1,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x8c(%rbp),%eax
add    %ecx,%eax
mov    %eax,-0x88(%rbp)
mov    -0x88(%rbp),%eax
mov    %eax,-0x84(%rbp)
mov    -0x84(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    -0x1c(%rbp),%ecx
mov    0x18(%rbp),%edx
sar    $0x1,%edx
add    %edx,%ecx
cmp    %ecx,%eax
jge    13e7 <line+0x2e7>
mov    -0x28(%rbp),%eax
mov    %eax,-0x90(%rbp)
jmp    13f8 <line+0x2f8>
mov    -0x1c(%rbp),%eax
mov    0x18(%rbp),%ecx
sar    $0x1,%ecx
add    %ecx,%eax
mov    %eax,-0x90(%rbp)
mov    -0x90(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    0x10(%rbp),%eax
mov    %eax,-0x94(%rbp)
mov    -0x24(%rbp),%eax
mov    0x18(%rbp),%ecx
shl    $0x1,%ecx
sub    %ecx,%eax
mov    0x18(%rbp),%ecx
shl    $0x1,%ecx
add    %ecx,%eax
sub    $0x1,%eax
mov    0x18(%rbp),%ecx
shl    $0x1,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x94(%rbp),%eax
add    %ecx,%eax
mov    %eax,-0x30(%rbp)
mov    -0x24(%rbp),%eax
mov    0x18(%rbp),%ecx
shl    $0x1,%ecx
sub    %ecx,%eax
mov    0x18(%rbp),%ecx
shl    $0x1,%ecx
add    %ecx,%eax
sub    $0x1,%eax
mov    0x18(%rbp),%ecx
shl    $0x1,%ecx
cltd
idiv   %ecx
sub    0x18(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x38(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    16a5 <line+0x5a5>
mov    -0x38(%rbp),%eax
add    -0x38(%rbp),%eax
cmp    0x18(%rbp),%eax
jle    1493 <line+0x393>
mov    0x18(%rbp),%ecx
mov    -0x38(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x38(%rbp)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x18(%rbp),%eax
mov    %rax,-0xa0(%rbp)
sub    $0x7,%rax
ja     1689 <line+0x589>
mov    -0xa0(%rbp),%rax
lea    0xb6b(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
add    $0x1,%eax
cltd
idivl  -0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1689 <line+0x589>
mov    -0x8(%rbp),%rax
mov    -0x34(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
add    $0x1,%eax
cltd
idivl  -0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x34(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1689 <line+0x589>
mov    -0x8(%rbp),%rax
mov    -0x34(%rbp),%ecx
imul   -0x10(%rbp),%ecx
xor    %edx,%edx
sub    -0x30(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
add    $0x1,%eax
cltd
idivl  -0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x34(%rbp),%ecx
imul   -0x10(%rbp),%ecx
xor    %esi,%esi
sub    -0x30(%rbp),%esi
add    %esi,%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1689 <line+0x589>
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0x10(%rbp),%ecx
xor    %edx,%edx
sub    -0x34(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
add    $0x1,%eax
cltd
idivl  -0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0x10(%rbp),%ecx
xor    %esi,%esi
sub    -0x34(%rbp),%esi
add    %esi,%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1689 <line+0x589>
mov    -0x8(%rbp),%rax
xor    %ecx,%ecx
sub    -0x30(%rbp),%ecx
imul   -0x10(%rbp),%ecx
xor    %edx,%edx
sub    -0x34(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
add    $0x1,%eax
cltd
idivl  -0xc(%rbp)
mov    -0x8(%rbp),%rax
xor    %ecx,%ecx
sub    -0x30(%rbp),%ecx
imul   -0x10(%rbp),%ecx
xor    %esi,%esi
sub    -0x34(%rbp),%esi
add    %esi,%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1689 <line+0x589>
mov    -0x8(%rbp),%rax
xor    %ecx,%ecx
sub    -0x34(%rbp),%ecx
imul   -0x10(%rbp),%ecx
xor    %edx,%edx
sub    -0x30(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
add    $0x1,%eax
cltd
idivl  -0xc(%rbp)
mov    -0x8(%rbp),%rax
xor    %ecx,%ecx
sub    -0x34(%rbp),%ecx
imul   -0x10(%rbp),%ecx
xor    %esi,%esi
sub    -0x30(%rbp),%esi
add    %esi,%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1689 <line+0x589>
mov    -0x8(%rbp),%rax
xor    %ecx,%ecx
sub    -0x34(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
add    $0x1,%eax
cltd
idivl  -0xc(%rbp)
mov    -0x8(%rbp),%rax
xor    %ecx,%ecx
sub    -0x34(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1689 <line+0x589>
mov    -0x8(%rbp),%rax
xor    %ecx,%ecx
sub    -0x30(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
add    $0x1,%eax
cltd
idivl  -0xc(%rbp)
mov    -0x8(%rbp),%rax
xor    %ecx,%ecx
sub    -0x30(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    168e <line+0x58e>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    0x20(%rbp),%eax
add    -0x38(%rbp),%eax
mov    %eax,-0x38(%rbp)
jmp    1464 <line+0x364>
mov    -0x34(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    18ec <line+0x7ec>
mov    -0x38(%rbp),%eax
add    -0x38(%rbp),%eax
cmp    0x18(%rbp),%eax
jle    16da <line+0x5da>
mov    0x18(%rbp),%ecx
mov    -0x38(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x38(%rbp)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x18(%rbp),%eax
mov    %rax,-0xa8(%rbp)
sub    $0x7,%rax
ja     18d0 <line+0x7d0>
mov    -0xa8(%rbp),%rax
lea    0x904(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x3c(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
add    $0x1,%eax
cltd
idivl  -0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x3c(%rbp),%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    18d0 <line+0x7d0>
mov    -0x8(%rbp),%rax
mov    -0x3c(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
add    $0x1,%eax
cltd
idivl  -0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x3c(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    18d0 <line+0x7d0>
mov    -0x8(%rbp),%rax
mov    -0x3c(%rbp),%ecx
imul   -0x10(%rbp),%ecx
xor    %edx,%edx
sub    -0x30(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
add    $0x1,%eax
cltd
idivl  -0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x3c(%rbp),%ecx
imul   -0x10(%rbp),%ecx
xor    %esi,%esi
sub    -0x30(%rbp),%esi
add    %esi,%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    18d0 <line+0x7d0>
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0x10(%rbp),%ecx
xor    %edx,%edx
sub    -0x3c(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
add    $0x1,%eax
cltd
idivl  -0xc(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%ecx
imul   -0x10(%rbp),%ecx
xor    %esi,%esi
sub    -0x3c(%rbp),%esi
add    %esi,%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    18d0 <line+0x7d0>
mov    -0x8(%rbp),%rax
xor    %ecx,%ecx
sub    -0x30(%rbp),%ecx
imul   -0x10(%rbp),%ecx
xor    %edx,%edx
sub    -0x3c(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
add    $0x1,%eax
cltd
idivl  -0xc(%rbp)
mov    -0x8(%rbp),%rax
xor    %ecx,%ecx
sub    -0x30(%rbp),%ecx
imul   -0x10(%rbp),%ecx
xor    %esi,%esi
sub    -0x3c(%rbp),%esi
add    %esi,%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    18d0 <line+0x7d0>
mov    -0x8(%rbp),%rax
xor    %ecx,%ecx
sub    -0x3c(%rbp),%ecx
imul   -0x10(%rbp),%ecx
xor    %edx,%edx
sub    -0x30(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
add    $0x1,%eax
cltd
idivl  -0xc(%rbp)
mov    -0x8(%rbp),%rax
xor    %ecx,%ecx
sub    -0x3c(%rbp),%ecx
imul   -0x10(%rbp),%ecx
xor    %esi,%esi
sub    -0x30(%rbp),%esi
add    %esi,%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    18d0 <line+0x7d0>
mov    -0x8(%rbp),%rax
xor    %ecx,%ecx
sub    -0x3c(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
add    $0x1,%eax
cltd
idivl  -0xc(%rbp)
mov    -0x8(%rbp),%rax
xor    %ecx,%ecx
sub    -0x3c(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    18d0 <line+0x7d0>
mov    -0x8(%rbp),%rax
xor    %ecx,%ecx
sub    -0x30(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x3c(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
add    $0x1,%eax
cltd
idivl  -0xc(%rbp)
mov    -0x8(%rbp),%rax
xor    %ecx,%ecx
sub    -0x30(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    -0x3c(%rbp),%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    18d5 <line+0x7d5>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
mov    0x20(%rbp),%eax
add    -0x38(%rbp),%eax
mov    %eax,-0x38(%rbp)
jmp    16ab <line+0x5ab>
add    $0x28,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<line>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %edx,%r10d
mov    %esi,-0x10(%rsp)
mov    0x60(%rsp),%r12d
mov    0x50(%rsp),%esi
mov    0x48(%rsp),%ecx
mov    0x40(%rsp),%r15d
mov    0x38(%rsp),%r13d
test   %ecx,%ecx
je     1169 <line+0x69>
mov    0x68(%rsp),%ebp
mov    0x58(%rsp),%eax
sub    %r13d,%eax
add    %eax,%eax
add    $0xffffffff,%eax
imul   %r15d,%eax
lea    (%rcx,%rcx,1),%r14d
lea    (%rcx,%rcx,1),%ebx
add    $0xffffffff,%ebx
lea    (%rax,%rcx,2),%eax
add    $0xffffffff,%eax
cltd
idiv   %r14d
lea    (%rax,%r9,1),%ecx
cmp    %esi,%ecx
jge    1181 <line+0x81>
mov    %r15d,%ecx
mov    %r9d,%r11d
cmp    %r9d,%esi
jge    118d <line+0x8d>
jmp    119c <line+0x9c>
cmp    %r9d,%esi
cmovl  %r9d,%esi
mov    %esi,%eax
sub    %r9d,%eax
imul   %ecx,%eax
lea    (%r15,%rax,2),%ecx
mov    %esi,%r11d
jmp    11b9 <line+0xb9>
mov    %ecx,%esi
mov    %r15d,%ecx
mov    %r9d,%r11d
test   %eax,%eax
js     119c <line+0x9c>
mov    %esi,%ecx
sub    %r9d,%ecx
imul   %r14d,%ecx
add    %r15d,%ecx
mov    %esi,%r11d
sub    %r13d,%ebp
lea    -0x1(%rbp,%rbp,1),%eax
imul   %r15d,%eax
add    %eax,%ebx
mov    %ebx,%eax
cltd
idiv   %r14d
add    %r9d,%eax
cmp    %r12d,%eax
cmovle %eax,%r12d
mov    %r15,%r14
mov    %r14d,%ebx
sar    %ebx
add    %r9d,%ebx
cmp    %ebx,%r12d
cmovl  %r12d,%ebx
lea    (%r15,%r15,1),%esi
add    $0xffffffff,%ecx
mov    %ecx,%eax
cltd
idiv   %esi
mov    %r15,%rsi
mov    %eax,%ecx
add    %eax,%r13d
sub    %esi,%ecx
sar    %ecx
mov    %r8d,%eax
mov    %rax,-0x8(%rsp)
cmp    %ebx,%r11d
jge    12e6 <line+0x1e6>
mov    %r8d,%r9d
mov    %ebx,-0xc(%rsp)
sub    %r11d,%ebx
mov    %r11d,%ebp
imul   %r10d,%ebp
jmp    1243 <line+0x143>
mov    %r15d,%edx
imul   %r10d,%edx
mov    %r11d,%eax
sub    %edx,%eax
movslq %eax,%rsi
mov    (%rdi,%rsi,4),%eax
add    $0x1,%eax
cltd
idivl  -0x10(%rsp)
mov    %edx,(%rdi,%rsi,4)
mov    %r14,%rsi
add    $0x1,%r11d
mov    0x48(%rsp),%eax
add    %eax,%ecx
sub    %r8d,%ecx
add    %r10d,%ebp
mov    %r15d,%r13d
add    $0xffffffff,%ebx
je     12db <line+0x1db>
lea    (%rcx,%rcx,1),%edx
xor    %eax,%eax
cmp    %esi,%edx
setg   %al
mov    $0x0,%r8d
cmovg  %esi,%r8d
lea    (%rax,%r13,1),%r15d
cmp    $0x7,%r9d
ja     1227 <line+0x127>
mov    -0x8(%rsp),%rdx
lea    0xd93(%rip),%rsi
movslq (%rsi,%rdx,4),%rdx
add    %rsi,%rdx
jmp    *%rdx
mov    %r15d,%eax
imul   %r10d,%eax
add    %r11d,%eax
jmp    1213 <line+0x113>
mov    %r11d,%eax
imul   %r10d,%eax
add    %r15d,%eax
jmp    1213 <line+0x113>
add    %eax,%r13d
mov    %ebp,%eax
sub    %r13d,%eax
jmp    1213 <line+0x113>
mov    %r15d,%eax
imul   %r10d,%eax
sub    %r11d,%eax
jmp    1213 <line+0x113>
mov    %r15d,%eax
imul   %r10d,%eax
add    %r11d,%eax
neg    %eax
jmp    1213 <line+0x113>
mov    %r11d,%eax
imul   %r10d,%eax
add    %r15d,%eax
neg    %eax
jmp    1213 <line+0x113>
mov    %r11d,%edx
imul   %r10d,%edx
mov    %r15d,%eax
jmp    1211 <line+0x111>
mov    %r15d,%r13d
mov    -0xc(%rsp),%r11d
mov    %r9d,%r8d
mov    0x48(%rsp),%r9d
cmp    %r12d,%r11d
jge    13cc <line+0x2cc>
sub    %r11d,%r12d
mov    %r10d,%ebx
imul   %r11d,%ebx
jmp    1339 <line+0x239>
mov    %r15d,%edx
imul   %r10d,%edx
mov    %r11d,%eax
sub    %edx,%eax
movslq %eax,%rsi
mov    (%rdi,%rsi,4),%eax
add    $0x1,%eax
cltd
idivl  -0x10(%rsp)
mov    %edx,(%rdi,%rsi,4)
mov    %r14,%rsi
add    $0x1,%r11d
add    %r9d,%ecx
sub    %ebp,%ecx
add    %r10d,%ebx
mov    %r15d,%r13d
add    $0xffffffff,%r12d
je     13cc <line+0x2cc>
lea    (%rcx,%rcx,1),%edx
xor    %eax,%eax
cmp    %esi,%edx
setg   %al
mov    $0x0,%ebp
cmovg  %esi,%ebp
lea    (%rax,%r13,1),%r15d
cmp    $0x7,%r8d
ja     1320 <line+0x220>
mov    -0x8(%rsp),%rdx
lea    0xcbf(%rip),%rsi
movslq (%rsi,%rdx,4),%rdx
add    %rsi,%rdx
jmp    *%rdx
mov    %r15d,%eax
imul   %r10d,%eax
add    %r11d,%eax
jmp    130c <line+0x20c>
mov    %r11d,%eax
imul   %r10d,%eax
add    %r15d,%eax
jmp    130c <line+0x20c>
add    %eax,%r13d
mov    %ebx,%eax
sub    %r13d,%eax
jmp    130c <line+0x20c>
mov    %r15d,%eax
imul   %r10d,%eax
sub    %r11d,%eax
jmp    130c <line+0x20c>
mov    %r15d,%eax
imul   %r10d,%eax
add    %r11d,%eax
neg    %eax
jmp    130c <line+0x20c>
mov    %r11d,%eax
imul   %r10d,%eax
add    %r15d,%eax
neg    %eax
jmp    130c <line+0x20c>
mov    %r11d,%edx
imul   %r10d,%edx
mov    %r15d,%eax
jmp    130a <line+0x20a>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @line(i32* %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, i32 %9, i32 %10, i32 %11, i32 %12) {
%14 = alloca i32*
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca i32
%22 = alloca i32
%23 = alloca i32
%24 = alloca i32
%25 = alloca i32
%26 = alloca i32
%27 = alloca i32
%28 = alloca i32
%29 = alloca i32
%30 = alloca i32
%31 = alloca i32
%32 = alloca i32
%33 = alloca i32
%34 = alloca i32
store i32* %0, i32** %14
store i32 %1, i32* %15
store i32 %2, i32* %16
store i32 %3, i32* %17
store i32 %4, i32* %18
store i32 %5, i32* %19
store i32 %6, i32* %20
store i32 %7, i32* %21
store i32 %8, i32* %22
store i32 %9, i32* %23
store i32 %10, i32* %24
store i32 %11, i32* %25
store i32 %12, i32* %26
%35 = load i32, i32* %19
%36 = load i32, i32* %23
%37 = load i32, i32* %22
%38 = icmp eq i32 %37, 0
br i1 %38, label %39, label %41
39: ; preds = %13
%40 = load i32, i32* %23
br label %58
41: ; preds = %13
%42 = load i32, i32* %19
%43 = load i32, i32* %21
%44 = load i32, i32* %24
%45 = load i32, i32* %20
%46 = sub nsw i32 %44, %45
%47 = shl i32 %46, 1
%48 = sub nsw i32 %47, 1
%49 = mul nsw i32 %43, %48
%50 = load i32, i32* %22
%51 = shl i32 %50, 1
%52 = add nsw i32 %49, %51
%53 = sub nsw i32 %52, 1
%54 = load i32, i32* %22
%55 = shl i32 %54, 1
%56 = sdiv i32 %53, %55
%57 = add nsw i32 %42, %56
br label %58
58: ; preds = %41, %39
%59 = phi i32 [ %40, %39 ], [ %57, %41 ]
%60 = icmp sgt i32 %36, %59
br i1 %60, label %61, label %63
61: ; preds = %58
%62 = load i32, i32* %23
br label %87
63: ; preds = %58
%64 = load i32, i32* %22
%65 = icmp eq i32 %64, 0
br i1 %65, label %66, label %68
66: ; preds = %63
%67 = load i32, i32* %23
br label %85
68: ; preds = %63
%69 = load i32, i32* %19
%70 = load i32, i32* %21
%71 = load i32, i32* %24
%72 = load i32, i32* %20
%73 = sub nsw i32 %71, %72
%74 = shl i32 %73, 1
%75 = sub nsw i32 %74, 1
%76 = mul nsw i32 %70, %75
%77 = load i32, i32* %22
%78 = shl i32 %77, 1
%79 = add nsw i32 %76, %78
%80 = sub nsw i32 %79, 1
%81 = load i32, i32* %22
%82 = shl i32 %81, 1
%83 = sdiv i32 %80, %82
%84 = add nsw i32 %69, %83
br label %85
85: ; preds = %68, %66
%86 = phi i32 [ %67, %66 ], [ %84, %68 ]
br label %87
87: ; preds = %85, %61
%88 = phi i32 [ %62, %61 ], [ %86, %85 ]
%89 = icmp sgt i32 %35, %88
br i1 %89, label %90, label %92
90: ; preds = %87
%91 = load i32, i32* %19
br label %146
92: ; preds = %87
%93 = load i32, i32* %23
%94 = load i32, i32* %22
%95 = icmp eq i32 %94, 0
br i1 %95, label %96, label %98
96: ; preds = %92
%97 = load i32, i32* %23
br label %115
98: ; preds = %92
%99 = load i32, i32* %19
%100 = load i32, i32* %21
%101 = load i32, i32* %24
%102 = load i32, i32* %20
%103 = sub nsw i32 %101, %102
%104 = shl i32 %103, 1
%105 = sub nsw i32 %104, 1
%106 = mul nsw i32 %100, %105
%107 = load i32, i32* %22
%108 = shl i32 %107, 1
%109 = add nsw i32 %106, %108
%110 = sub nsw i32 %109, 1
%111 = load i32, i32* %22
%112 = shl i32 %111, 1
%113 = sdiv i32 %110, %112
%114 = add nsw i32 %99, %113
br label %115
115: ; preds = %98, %96
%116 = phi i32 [ %97, %96 ], [ %114, %98 ]
%117 = icmp sgt i32 %93, %116
br i1 %117, label %118, label %120
118: ; preds = %115
%119 = load i32, i32* %23
br label %144
120: ; preds = %115
%121 = load i32, i32* %22
%122 = icmp eq i32 %121, 0
br i1 %122, label %123, label %125
123: ; preds = %120
%124 = load i32, i32* %23
br label %142
125: ; preds = %120
%126 = load i32, i32* %19
%127 = load i32, i32* %21
%128 = load i32, i32* %24
%129 = load i32, i32* %20
%130 = sub nsw i32 %128, %129
%131 = shl i32 %130, 1
%132 = sub nsw i32 %131, 1
%133 = mul nsw i32 %127, %132
%134 = load i32, i32* %22
%135 = shl i32 %134, 1
%136 = add nsw i32 %133, %135
%137 = sub nsw i32 %136, 1
%138 = load i32, i32* %22
%139 = shl i32 %138, 1
%140 = sdiv i32 %137, %139
%141 = add nsw i32 %126, %140
br label %142
142: ; preds = %125, %123
%143 = phi i32 [ %124, %123 ], [ %141, %125 ]
br label %144
144: ; preds = %142, %118
%145 = phi i32 [ %119, %118 ], [ %143, %142 ]
br label %146
146: ; preds = %144, %90
%147 = phi i32 [ %91, %90 ], [ %145, %144 ]
store i32 %147, i32* %27
%148 = load i32, i32* %21
%149 = load i32, i32* %22
%150 = mul nsw i32 2, %149
%151 = load i32, i32* %27
%152 = load i32, i32* %19
%153 = sub nsw i32 %151, %152
%154 = mul nsw i32 %150, %153
%155 = add nsw i32 %148, %154
store i32 %155, i32* %28
%156 = load i32, i32* %25
%157 = load i32, i32* %22
%158 = icmp eq i32 %157, 0
br i1 %158, label %159, label %161
159: ; preds = %146
%160 = load i32, i32* %25
br label %178
161: ; preds = %146
%162 = load i32, i32* %19
%163 = load i32, i32* %21
%164 = load i32, i32* %26
%165 = load i32, i32* %20
%166 = sub nsw i32 %164, %165
%167 = shl i32 %166, 1
%168 = sub nsw i32 %167, 1
%169 = mul nsw i32 %163, %168
%170 = load i32, i32* %22
%171 = shl i32 %170, 1
%172 = add nsw i32 %169, %171
%173 = sub nsw i32 %172, 1
%174 = load i32, i32* %22
%175 = shl i32 %174, 1
%176 = sdiv i32 %173, %175
%177 = add nsw i32 %162, %176
br label %178
178: ; preds = %161, %159
%179 = phi i32 [ %160, %159 ], [ %177, %161 ]
%180 = icmp slt i32 %156, %179
br i1 %180, label %181, label %183
181: ; preds = %178
%182 = load i32, i32* %25
br label %207
183: ; preds = %178
%184 = load i32, i32* %22
%185 = icmp eq i32 %184, 0
br i1 %185, label %186, label %188
186: ; preds = %183
%187 = load i32, i32* %25
br label %205
188: ; preds = %183
%189 = load i32, i32* %19
%190 = load i32, i32* %21
%191 = load i32, i32* %26
%192 = load i32, i32* %20
%193 = sub nsw i32 %191, %192
%194 = shl i32 %193, 1
%195 = sub nsw i32 %194, 1
%196 = mul nsw i32 %190, %195
%197 = load i32, i32* %22
%198 = shl i32 %197, 1
%199 = add nsw i32 %196, %198
%200 = sub nsw i32 %199, 1
%201 = load i32, i32* %22
%202 = shl i32 %201, 1
%203 = sdiv i32 %200, %202
%204 = add nsw i32 %189, %203
br label %205
205: ; preds = %188, %186
%206 = phi i32 [ %187, %186 ], [ %204, %188 ]
br label %207
207: ; preds = %205, %181
%208 = phi i32 [ %182, %181 ], [ %206, %205 ]
store i32 %208, i32* %29
%209 = load i32, i32* %29
%210 = load i32, i32* %19
%211 = load i32, i32* %21
%212 = ashr i32 %211, 1
%213 = add nsw i32 %210, %212
%214 = icmp slt i32 %209, %213
br i1 %214, label %215, label %217
215: ; preds = %207
%216 = load i32, i32* %29
br label %222
217: ; preds = %207
%218 = load i32, i32* %19
%219 = load i32, i32* %21
%220 = ashr i32 %219, 1
%221 = add nsw i32 %218, %220
br label %222
222: ; preds = %217, %215
%223 = phi i32 [ %216, %215 ], [ %221, %217 ]
store i32 %223, i32* %30
%224 = load i32, i32* %20
%225 = load i32, i32* %28
%226 = load i32, i32* %21
%227 = shl i32 %226, 1
%228 = sub nsw i32 %225, %227
%229 = load i32, i32* %21
%230 = shl i32 %229, 1
%231 = add nsw i32 %228, %230
%232 = sub nsw i32 %231, 1
%233 = load i32, i32* %21
%234 = shl i32 %233, 1
%235 = sdiv i32 %232, %234
%236 = add nsw i32 %224, %235
store i32 %236, i32* %31
%237 = load i32, i32* %28
%238 = load i32, i32* %21
%239 = shl i32 %238, 1
%240 = sub nsw i32 %237, %239
%241 = load i32, i32* %21
%242 = shl i32 %241, 1
%243 = add nsw i32 %240, %242
%244 = sub nsw i32 %243, 1
%245 = load i32, i32* %21
%246 = shl i32 %245, 1
%247 = sdiv i32 %244, %246
%248 = load i32, i32* %21
%249 = sub nsw i32 %247, %248
%250 = ashr i32 %249, 1
store i32 %250, i32* %33
%251 = load i32, i32* %27
store i32 %251, i32* %32
br label %252
252: ; preds = %455, %222
%253 = load i32, i32* %32
%254 = load i32, i32* %30
%255 = icmp slt i32 %253, %254
br i1 %255, label %256, label %461
256: ; preds = %252
%257 = load i32, i32* %33
%258 = load i32, i32* %33
%259 = add nsw i32 %257, %258
%260 = load i32, i32* %21
%261 = icmp sgt i32 %259, %260
br i1 %261, label %262, label %268
262: ; preds = %256
%263 = load i32, i32* %21
%264 = load i32, i32* %33
%265 = sub nsw i32 %264, %263
store i32 %265, i32* %33
%266 = load i32, i32* %31
%267 = add nsw i32 %266, 1
store i32 %267, i32* %31
br label %268
268: ; preds = %262, %256
%269 = load i32, i32* %18
switch i32 %269, label %454 [
i32 0, label %270
i32 1, label %291
i32 2, label %312
i32 3, label %335
i32 4, label %358
i32 5, label %383
i32 6, label %408
i32 7, label %431
]
270: ; preds = %268
%271 = load i32*, i32** %14
%272 = load i32, i32* %31
%273 = load i32, i32* %16
%274 = mul nsw i32 %272, %273
%275 = load i32, i32* %32
%276 = add nsw i32 %274, %275
%277 = sext i32 %276 to i64
%278 = getelementptr inbounds i32, i32* %271, i64 %277
%279 = load i32, i32* %278
%280 = add nsw i32 %279, 1
%281 = load i32, i32* %15
%282 = srem i32 %280, %281
%283 = load i32*, i32** %14
%284 = load i32, i32* %31
%285 = load i32, i32* %16
%286 = mul nsw i32 %284, %285
%287 = load i32, i32* %32
%288 = add nsw i32 %286, %287
%289 = sext i32 %288 to i64
%290 = getelementptr inbounds i32, i32* %283, i64 %289
store i32 %282, i32* %290
br label %454
291: ; preds = %268
%292 = load i32*, i32** %14
%293 = load i32, i32* %32
%294 = load i32, i32* %16
%295 = mul nsw i32 %293, %294
%296 = load i32, i32* %31
%297 = add nsw i32 %295, %296
%298 = sext i32 %297 to i64
%299 = getelementptr inbounds i32, i32* %292, i64 %298
%300 = load i32, i32* %299
%301 = add nsw i32 %300, 1
%302 = load i32, i32* %15
%303 = srem i32 %301, %302
%304 = load i32*, i32** %14
%305 = load i32, i32* %32
%306 = load i32, i32* %16
%307 = mul nsw i32 %305, %306
%308 = load i32, i32* %31
%309 = add nsw i32 %307, %308
%310 = sext i32 %309 to i64
%311 = getelementptr inbounds i32, i32* %304, i64 %310
store i32 %303, i32* %311
br label %454
312: ; preds = %268
%313 = load i32*, i32** %14
%314 = load i32, i32* %32
%315 = load i32, i32* %16
%316 = mul nsw i32 %314, %315
%317 = load i32, i32* %31
%318 = sub nsw i32 0, %317
%319 = add nsw i32 %316, %318
%320 = sext i32 %319 to i64
%321 = getelementptr inbounds i32, i32* %313, i64 %320
%322 = load i32, i32* %321
%323 = add nsw i32 %322, 1
%324 = load i32, i32* %15
%325 = srem i32 %323, %324
%326 = load i32*, i32** %14
%327 = load i32, i32* %32
%328 = load i32, i32* %16
%329 = mul nsw i32 %327, %328
%330 = load i32, i32* %31
%331 = sub nsw i32 0, %330
%332 = add nsw i32 %329, %331
%333 = sext i32 %332 to i64
%334 = getelementptr inbounds i32, i32* %326, i64 %333
store i32 %325, i32* %334
br label %454
335: ; preds = %268
%336 = load i32*, i32** %14
%337 = load i32, i32* %31
%338 = load i32, i32* %16
%339 = mul nsw i32 %337, %338
%340 = load i32, i32* %32
%341 = sub nsw i32 0, %340
%342 = add nsw i32 %339, %341
%343 = sext i32 %342 to i64
%344 = getelementptr inbounds i32, i32* %336, i64 %343
%345 = load i32, i32* %344
%346 = add nsw i32 %345, 1
%347 = load i32, i32* %15
%348 = srem i32 %346, %347
%349 = load i32*, i32** %14
%350 = load i32, i32* %31
%351 = load i32, i32* %16
%352 = mul nsw i32 %350, %351
%353 = load i32, i32* %32
%354 = sub nsw i32 0, %353
%355 = add nsw i32 %352, %354
%356 = sext i32 %355 to i64
%357 = getelementptr inbounds i32, i32* %349, i64 %356
store i32 %348, i32* %357
br label %454
358: ; preds = %268
%359 = load i32*, i32** %14
%360 = load i32, i32* %31
%361 = sub nsw i32 0, %360
%362 = load i32, i32* %16
%363 = mul nsw i32 %361, %362
%364 = load i32, i32* %32
%365 = sub nsw i32 0, %364
%366 = add nsw i32 %363, %365
%367 = sext i32 %366 to i64
%368 = getelementptr inbounds i32, i32* %359, i64 %367
%369 = load i32, i32* %368
%370 = add nsw i32 %369, 1
%371 = load i32, i32* %15
%372 = srem i32 %370, %371
%373 = load i32*, i32** %14
%374 = load i32, i32* %31
%375 = sub nsw i32 0, %374
%376 = load i32, i32* %16
%377 = mul nsw i32 %375, %376
%378 = load i32, i32* %32
%379 = sub nsw i32 0, %378
%380 = add nsw i32 %377, %379
%381 = sext i32 %380 to i64
%382 = getelementptr inbounds i32, i32* %373, i64 %381
store i32 %372, i32* %382
br label %454
383: ; preds = %268
%384 = load i32*, i32** %14
%385 = load i32, i32* %32
%386 = sub nsw i32 0, %385
%387 = load i32, i32* %16
%388 = mul nsw i32 %386, %387
%389 = load i32, i32* %31
%390 = sub nsw i32 0, %389
%391 = add nsw i32 %388, %390
%392 = sext i32 %391 to i64
%393 = getelementptr inbounds i32, i32* %384, i64 %392
%394 = load i32, i32* %393
%395 = add nsw i32 %394, 1
%396 = load i32, i32* %15
%397 = srem i32 %395, %396
%398 = load i32*, i32** %14
%399 = load i32, i32* %32
%400 = sub nsw i32 0, %399
%401 = load i32, i32* %16
%402 = mul nsw i32 %400, %401
%403 = load i32, i32* %31
%404 = sub nsw i32 0, %403
%405 = add nsw i32 %402, %404
%406 = sext i32 %405 to i64
%407 = getelementptr inbounds i32, i32* %398, i64 %406
store i32 %397, i32* %407
br label %454
408: ; preds = %268
%409 = load i32*, i32** %14
%410 = load i32, i32* %32
%411 = sub nsw i32 0, %410
%412 = load i32, i32* %16
%413 = mul nsw i32 %411, %412
%414 = load i32, i32* %31
%415 = add nsw i32 %413, %414
%416 = sext i32 %415 to i64
%417 = getelementptr inbounds i32, i32* %409, i64 %416
%418 = load i32, i32* %417
%419 = add nsw i32 %418, 1
%420 = load i32, i32* %15
%421 = srem i32 %419, %420
%422 = load i32*, i32** %14
%423 = load i32, i32* %32
%424 = sub nsw i32 0, %423
%425 = load i32, i32* %16
%426 = mul nsw i32 %424, %425
%427 = load i32, i32* %31
%428 = add nsw i32 %426, %427
%429 = sext i32 %428 to i64
%430 = getelementptr inbounds i32, i32* %422, i64 %429
store i32 %421, i32* %430
br label %454
431: ; preds = %268
%432 = load i32*, i32** %14
%433 = load i32, i32* %31
%434 = sub nsw i32 0, %433
%435 = load i32, i32* %16
%436 = mul nsw i32 %434, %435
%437 = load i32, i32* %32
%438 = add nsw i32 %436, %437
%439 = sext i32 %438 to i64
%440 = getelementptr inbounds i32, i32* %432, i64 %439
%441 = load i32, i32* %440
%442 = add nsw i32 %441, 1
%443 = load i32, i32* %15
%444 = srem i32 %442, %443
%445 = load i32*, i32** %14
%446 = load i32, i32* %31
%447 = sub nsw i32 0, %446
%448 = load i32, i32* %16
%449 = mul nsw i32 %447, %448
%450 = load i32, i32* %32
%451 = add nsw i32 %449, %450
%452 = sext i32 %451 to i64
%453 = getelementptr inbounds i32, i32* %445, i64 %452
store i32 %444, i32* %453
br label %454
454: ; preds = %268, %431, %408, %383, %358, %335, %312, %291, %270
br label %455
455: ; preds = %454
%456 = load i32, i32* %32
%457 = add nsw i32 %456, 1
store i32 %457, i32* %32
%458 = load i32, i32* %22
%459 = load i32, i32* %33
%460 = add nsw i32 %459, %458
store i32 %460, i32* %33
br label %252
461: ; preds = %252
%462 = load i32, i32* %32
store i32 %462, i32* %34
br label %463
463: ; preds = %666, %461
%464 = load i32, i32* %34
%465 = load i32, i32* %29
%466 = icmp slt i32 %464, %465
br i1 %466, label %467, label %672
467: ; preds = %463
%468 = load i32, i32* %33
%469 = load i32, i32* %33
%470 = add nsw i32 %468, %469
%471 = load i32, i32* %21
%472 = icmp sgt i32 %470, %471
br i1 %472, label %473, label %479
473: ; preds = %467
%474 = load i32, i32* %21
%475 = load i32, i32* %33
%476 = sub nsw i32 %475, %474
store i32 %476, i32* %33
%477 = load i32, i32* %31
%478 = add nsw i32 %477, 1
store i32 %478, i32* %31
br label %479
479: ; preds = %473, %467
%480 = load i32, i32* %18
switch i32 %480, label %665 [
i32 0, label %481
i32 1, label %502
i32 2, label %523
i32 3, label %546
i32 4, label %569
i32 5, label %594
i32 6, label %619
i32 7, label %642
]
481: ; preds = %479
%482 = load i32*, i32** %14
%483 = load i32, i32* %31
%484 = load i32, i32* %16
%485 = mul nsw i32 %483, %484
%486 = load i32, i32* %34
%487 = add nsw i32 %485, %486
%488 = sext i32 %487 to i64
%489 = getelementptr inbounds i32, i32* %482, i64 %488
%490 = load i32, i32* %489
%491 = add nsw i32 %490, 1
%492 = load i32, i32* %15
%493 = srem i32 %491, %492
%494 = load i32*, i32** %14
%495 = load i32, i32* %31
%496 = load i32, i32* %16
%497 = mul nsw i32 %495, %496
%498 = load i32, i32* %34
%499 = add nsw i32 %497, %498
%500 = sext i32 %499 to i64
%501 = getelementptr inbounds i32, i32* %494, i64 %500
store i32 %493, i32* %501
br label %665
502: ; preds = %479
%503 = load i32*, i32** %14
%504 = load i32, i32* %34
%505 = load i32, i32* %16
%506 = mul nsw i32 %504, %505
%507 = load i32, i32* %31
%508 = add nsw i32 %506, %507
%509 = sext i32 %508 to i64
%510 = getelementptr inbounds i32, i32* %503, i64 %509
%511 = load i32, i32* %510
%512 = add nsw i32 %511, 1
%513 = load i32, i32* %15
%514 = srem i32 %512, %513
%515 = load i32*, i32** %14
%516 = load i32, i32* %34
%517 = load i32, i32* %16
%518 = mul nsw i32 %516, %517
%519 = load i32, i32* %31
%520 = add nsw i32 %518, %519
%521 = sext i32 %520 to i64
%522 = getelementptr inbounds i32, i32* %515, i64 %521
store i32 %514, i32* %522
br label %665
523: ; preds = %479
%524 = load i32*, i32** %14
%525 = load i32, i32* %34
%526 = load i32, i32* %16
%527 = mul nsw i32 %525, %526
%528 = load i32, i32* %31
%529 = sub nsw i32 0, %528
%530 = add nsw i32 %527, %529
%531 = sext i32 %530 to i64
%532 = getelementptr inbounds i32, i32* %524, i64 %531
%533 = load i32, i32* %532
%534 = add nsw i32 %533, 1
%535 = load i32, i32* %15
%536 = srem i32 %534, %535
%537 = load i32*, i32** %14
%538 = load i32, i32* %34
%539 = load i32, i32* %16
%540 = mul nsw i32 %538, %539
%541 = load i32, i32* %31
%542 = sub nsw i32 0, %541
%543 = add nsw i32 %540, %542
%544 = sext i32 %543 to i64
%545 = getelementptr inbounds i32, i32* %537, i64 %544
store i32 %536, i32* %545
br label %665
546: ; preds = %479
%547 = load i32*, i32** %14
%548 = load i32, i32* %31
%549 = load i32, i32* %16
%550 = mul nsw i32 %548, %549
%551 = load i32, i32* %34
%552 = sub nsw i32 0, %551
%553 = add nsw i32 %550, %552
%554 = sext i32 %553 to i64
%555 = getelementptr inbounds i32, i32* %547, i64 %554
%556 = load i32, i32* %555
%557 = add nsw i32 %556, 1
%558 = load i32, i32* %15
%559 = srem i32 %557, %558
%560 = load i32*, i32** %14
%561 = load i32, i32* %31
%562 = load i32, i32* %16
%563 = mul nsw i32 %561, %562
%564 = load i32, i32* %34
%565 = sub nsw i32 0, %564
%566 = add nsw i32 %563, %565
%567 = sext i32 %566 to i64
%568 = getelementptr inbounds i32, i32* %560, i64 %567
store i32 %559, i32* %568
br label %665
569: ; preds = %479
%570 = load i32*, i32** %14
%571 = load i32, i32* %31
%572 = sub nsw i32 0, %571
%573 = load i32, i32* %16
%574 = mul nsw i32 %572, %573
%575 = load i32, i32* %34
%576 = sub nsw i32 0, %575
%577 = add nsw i32 %574, %576
%578 = sext i32 %577 to i64
%579 = getelementptr inbounds i32, i32* %570, i64 %578
%580 = load i32, i32* %579
%581 = add nsw i32 %580, 1
%582 = load i32, i32* %15
%583 = srem i32 %581, %582
%584 = load i32*, i32** %14
%585 = load i32, i32* %31
%586 = sub nsw i32 0, %585
%587 = load i32, i32* %16
%588 = mul nsw i32 %586, %587
%589 = load i32, i32* %34
%590 = sub nsw i32 0, %589
%591 = add nsw i32 %588, %590
%592 = sext i32 %591 to i64
%593 = getelementptr inbounds i32, i32* %584, i64 %592
store i32 %583, i32* %593
br label %665
594: ; preds = %479
%595 = load i32*, i32** %14
%596 = load i32, i32* %34
%597 = sub nsw i32 0, %596
%598 = load i32, i32* %16
%599 = mul nsw i32 %597, %598
%600 = load i32, i32* %31
%601 = sub nsw i32 0, %600
%602 = add nsw i32 %599, %601
%603 = sext i32 %602 to i64
%604 = getelementptr inbounds i32, i32* %595, i64 %603
%605 = load i32, i32* %604
%606 = add nsw i32 %605, 1
%607 = load i32, i32* %15
%608 = srem i32 %606, %607
%609 = load i32*, i32** %14
%610 = load i32, i32* %34
%611 = sub nsw i32 0, %610
%612 = load i32, i32* %16
%613 = mul nsw i32 %611, %612
%614 = load i32, i32* %31
%615 = sub nsw i32 0, %614
%616 = add nsw i32 %613, %615
%617 = sext i32 %616 to i64
%618 = getelementptr inbounds i32, i32* %609, i64 %617
store i32 %608, i32* %618
br label %665
619: ; preds = %479
%620 = load i32*, i32** %14
%621 = load i32, i32* %34
%622 = sub nsw i32 0, %621
%623 = load i32, i32* %16
%624 = mul nsw i32 %622, %623
%625 = load i32, i32* %31
%626 = add nsw i32 %624, %625
%627 = sext i32 %626 to i64
%628 = getelementptr inbounds i32, i32* %620, i64 %627
%629 = load i32, i32* %628
%630 = add nsw i32 %629, 1
%631 = load i32, i32* %15
%632 = srem i32 %630, %631
%633 = load i32*, i32** %14
%634 = load i32, i32* %34
%635 = sub nsw i32 0, %634
%636 = load i32, i32* %16
%637 = mul nsw i32 %635, %636
%638 = load i32, i32* %31
%639 = add nsw i32 %637, %638
%640 = sext i32 %639 to i64
%641 = getelementptr inbounds i32, i32* %633, i64 %640
store i32 %632, i32* %641
br label %665
642: ; preds = %479
%643 = load i32*, i32** %14
%644 = load i32, i32* %31
%645 = sub nsw i32 0, %644
%646 = load i32, i32* %16
%647 = mul nsw i32 %645, %646
%648 = load i32, i32* %34
%649 = add nsw i32 %647, %648
%650 = sext i32 %649 to i64
%651 = getelementptr inbounds i32, i32* %643, i64 %650
%652 = load i32, i32* %651
%653 = add nsw i32 %652, 1
%654 = load i32, i32* %15
%655 = srem i32 %653, %654
%656 = load i32*, i32** %14
%657 = load i32, i32* %31
%658 = sub nsw i32 0, %657
%659 = load i32, i32* %16
%660 = mul nsw i32 %658, %659
%661 = load i32, i32* %34
%662 = add nsw i32 %660, %661
%663 = sext i32 %662 to i64
%664 = getelementptr inbounds i32, i32* %656, i64 %663
store i32 %655, i32* %664
br label %665
665: ; preds = %479, %642, %619, %594, %569, %546, %523, %502, %481
br label %666
666: ; preds = %665
%667 = load i32, i32* %34
%668 = add nsw i32 %667, 1
store i32 %668, i32* %34
%669 = load i32, i32* %22
%670 = load i32, i32* %33
%671 = add nsw i32 %670, %669
store i32 %671, i32* %33
br label %463
672: ; preds = %463
ret void
}

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