void projillum(wtab, xdots, ydots, dec) short *wtab;
int xdots, ydots;
double dec;
{
  int i, ftf = 1, ilon, ilat, lilon = 0, lilat = 0, xt;
  double m, x, y, z, th, lon, lat, s, c;
  for (i = 0; i < ydots; i++)
    wtab[i] = -1;
  s = sin(-((dec) * (3.14159265358979323846 / 180.0)));
  c = cos(-((dec) * (3.14159265358979323846 / 180.0)));
  for (th = -(3.14159265358979323846 / 2);
       th <= 3.14159265358979323846 / 2 + 0.001;
       th += 3.14159265358979323846 / 100) {
    x = -s * sin(th);
    y = cos(th);
    z = c * sin(th);
    lon = (y == 0 && x == 0)
              ? 0.0
              : ((atan2(y, x)) / (3.14159265358979323846 / 180.0));
    lat = ((asin(z)) / (3.14159265358979323846 / 180.0));
    ilat = ydots - (lat + 90) * (ydots / 180.0);
    ilon = lon * (xdots / 360.0);
    if (ftf) {
      lilon = ilon;
      lilat = ilat;
      ftf = 0;
    } else {
      if (lilat == ilat) {
        wtab[(ydots - 1) - ilat] = ilon == 0 ? 1 : ilon;
      } else {
        m = ((double)(ilon - lilon)) / (ilat - lilat);
        for (i = lilat; i != ilat;
             i += (((ilat - lilat) < 0) ? -1 : ((ilat - lilat) > 0 ? 1 : 0))) {
          xt = lilon + floor((m * (i - lilat)) + 0.5);
          wtab[(ydots - 1) - i] = xt == 0 ? 1 : xt;
        }
      }
      lilon = ilon;
      lilat = ilat;
    }
  }
  if (dec < 0.0) {
    ilat = ydots - 1;
    lilat = -1;
  } else {
    ilat = 0;
    lilat = 1;
  }
  for (i = ilat; i != ydots / 2; i += lilat) {
    if (wtab[i] != -1) {
      while (1) {
        wtab[i] = xdots / 2;
        if (i == ilat)
          break;
        i -= lilat;
      }
      break;
    }
  }
}


x86 assembly (clang, -O0):
<projillum>:
push   %rbp
mov    %rsp,%rbp
sub    $0xc0,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
movl   $0x1,-0x20(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    11ae <projillum+0x5e>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movw   $0xffff,(%rax,%rcx,2)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1186 <projillum+0x36>
movsd  0xe52(%rip),%xmm0
mulsd  -0x18(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
call   1040 <sin@plt>
movsd  %xmm0,-0x78(%rbp)
movsd  0xe24(%rip),%xmm0
mulsd  -0x18(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
call   1060 <cos@plt>
movsd  %xmm0,-0x80(%rbp)
movsd  0xdee(%rip),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  0xdf1(%rip),%xmm0
ucomisd -0x60(%rbp),%xmm0
jb     153a <projillum+0x3ea>
movsd  -0x78(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x60(%rbp),%xmm0
call   1040 <sin@plt>
movaps %xmm0,%xmm1
movsd  -0x90(%rbp),%xmm0
ff
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x60(%rbp),%xmm0
call   1060 <cos@plt>
movsd  %xmm0,-0x50(%rbp)
movsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x60(%rbp),%xmm0
call   1040 <sin@plt>
movaps %xmm0,%xmm1
movsd  -0x88(%rbp),%xmm0
ff
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x50(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    12e6 <projillum+0x196>
jp     12e6 <projillum+0x196>
movsd  -0x48(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    12e6 <projillum+0x196>
jp     12e6 <projillum+0x196>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
jmp    1309 <projillum+0x1b9>
movsd  -0x50(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm1
call   1030 <atan2@plt>
movsd  0xd0b(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x98(%rbp),%xmm0
ff
movsd  %xmm0,-0x68(%rbp)
movsd  -0x58(%rbp),%xmm0
call   1050 <asin@plt>
movsd  0xce0(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
cvtsi2sdl -0x10(%rbp),%xmm1
movsd  0xcea(%rip),%xmm0
addsd  -0x70(%rbp),%xmm0
cvtsi2sdl -0x10(%rbp),%xmm2
movsd  0xcd0(%rip),%xmm3
divsd  %xmm3,%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x28(%rbp)
movsd  -0x68(%rbp),%xmm0
cvtsi2sdl -0xc(%rbp),%xmm1
movsd  0xc8c(%rip),%xmm2
divsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x20(%rbp)
je     13bd <projillum+0x26d>
mov    -0x24(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x28(%rbp),%eax
mov    %eax,-0x30(%rbp)
movl   $0x0,-0x20(%rbp)
jmp    151e <projillum+0x3ce>
mov    -0x30(%rbp),%eax
cmp    -0x28(%rbp),%eax
jne    140e <projillum+0x2be>
cmpl   $0x0,-0x24(%rbp)
jne    13e3 <projillum+0x293>
mov    $0x1,%eax
mov    %eax,-0x9c(%rbp)
jmp    13ec <projillum+0x29c>
mov    -0x24(%rbp),%eax
mov    %eax,-0x9c(%rbp)
mov    -0x9c(%rbp),%eax
mov    %ax,%dx
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
sub    $0x1,%ecx
sub    -0x28(%rbp),%ecx
movslq %ecx,%rcx
mov    %dx,(%rax,%rcx,2)
jmp    1512 <projillum+0x3c2>
mov    -0x24(%rbp),%eax
sub    -0x2c(%rbp),%eax
cvtsi2sd %eax,%xmm0
mov    -0x28(%rbp),%eax
sub    -0x30(%rbp),%eax
cvtsi2sd %eax,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x30(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x28(%rbp),%eax
je     150d <projillum+0x3bd>
cvtsi2sdl -0x2c(%rbp),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  -0x40(%rbp),%xmm0
mov    -0x1c(%rbp),%eax
sub    -0x30(%rbp),%eax
cvtsi2sd %eax,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xbcb(%rip),%xmm1
addsd  %xmm1,%xmm0
call   1070 <floor@plt>
movaps %xmm0,%xmm1
movsd  -0xa8(%rbp),%xmm0
ff
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x0,-0x34(%rbp)
jne    149e <projillum+0x34e>
mov    $0x1,%eax
mov    %eax,-0xac(%rbp)
jmp    14a7 <projillum+0x357>
mov    -0x34(%rbp),%eax
mov    %eax,-0xac(%rbp)
mov    -0xac(%rbp),%eax
mov    %ax,%dx
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
sub    $0x1,%ecx
sub    -0x1c(%rbp),%ecx
movslq %ecx,%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x28(%rbp),%eax
sub    -0x30(%rbp),%eax
cmp    $0x0,%eax
jge    14e3 <projillum+0x393>
mov    $0xffffffff,%eax
mov    %eax,-0xb0(%rbp)
jmp    14fc <projillum+0x3ac>
mov    -0x28(%rbp),%edx
sub    -0x30(%rbp),%edx
xor    %eax,%eax
mov    $0x1,%ecx
cmp    $0x0,%edx
cmovg  %ecx,%eax
mov    %eax,-0xb0(%rbp)
mov    -0xb0(%rbp),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    1431 <projillum+0x2e1>
jmp    1512 <projillum+0x3c2>
mov    -0x24(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x28(%rbp),%eax
mov    %eax,-0x30(%rbp)
jmp    1523 <projillum+0x3d3>
movsd  0xb0d(%rip),%xmm0
addsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
jmp    1217 <projillum+0xc7>
xorps  %xmm0,%xmm0
ucomisd -0x18(%rbp),%xmm0
jbe    155d <projillum+0x40d>
mov    -0x10(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x28(%rbp)
movl   $0xffffffff,-0x30(%rbp)
jmp    156b <projillum+0x41b>
movl   $0x0,-0x28(%rbp)
movl   $0x1,-0x30(%rbp)
mov    -0x28(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    %eax,-0xb4(%rbp)
mov    -0x10(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0xb4(%rbp),%eax
cmp    %ecx,%eax
je     1602 <projillum+0x4b2>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cmp    $0xffffffff,%eax
je     15ef <projillum+0x49f>
jmp    15af <projillum+0x45f>
mov    -0xc(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %ax,%dx
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x1c(%rbp),%eax
cmp    -0x28(%rbp),%eax
jne    15da <projillum+0x48a>
jmp    15ea <projillum+0x49a>
mov    -0x30(%rbp),%ecx
mov    -0x1c(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x1c(%rbp)
jmp    15af <projillum+0x45f>
jmp    1602 <projillum+0x4b2>
jmp    15f4 <projillum+0x4a4>
mov    -0x30(%rbp),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    1571 <projillum+0x421>
add    $0xc0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<projillum>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x88,%rsp
movsd  %xmm0,0x38(%rsp)
mov    %edx,%ebp
mov    %esi,%ebx
mov    %rdi,%r13
test   %edx,%edx
jle    1194 <projillum+0x34>
mov    %ebp,%edx
add    %rdx,%rdx
mov    %r13,%rdi
mov    $0xff,%esi
call   1040 <memset@plt>
movsd  0xe64(%rip),%xmm0
mulsd  0x38(%rsp),%xmm0
movsd  %xmm0,0x8(%rsp)
call   1050 <sin@plt>
movapd %xmm0,0x50(%rsp)
movsd  0x8(%rsp),%xmm0
call   1070 <cos@plt>
movaps 0x50(%rsp),%xmm1
xorps  0xe86(%rip),%xmm1
movaps %xmm1,0x50(%rsp)
xorps  %xmm1,%xmm1
cvtsi2sd %ebp,%xmm1
movsd  %xmm1,0x80(%rsp)
divsd  0xe21(%rip),%xmm1
movsd  %xmm1,0x78(%rsp)
mov    %ebx,0x34(%rsp)
xorps  %xmm1,%xmm1
cvtsi2sd %ebx,%xmm1
movsd  %xmm0,0x68(%rsp)
divsd  0xe0a(%rip),%xmm1
movsd  %xmm1,0x70(%rsp)
mov    %rbp,0x40(%rsp)
lea    -0x1(%rbp),%eax
mov    %rax,0x48(%rsp)
movsd  0xdf7(%rip),%xmm0
xor    %r12d,%r12d
movl   $0x0,0x10(%rsp)
xor    %r14d,%r14d
jmp    1282 <projillum+0x122>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    0x10(%rsp),%eax
test   %eax,%eax
cmove  %ecx,%eax
not    %r14d
add    0x40(%rsp),%r14d
movslq %r14d,%rcx
mov    %ax,0x0(%r13,%rcx,2)
movsd  0x20(%rsp),%xmm0
addsd  0xdd0(%rip),%xmm0
mov    $0x1,%r12b
movsd  0xdcd(%rip),%xmm1
ucomisd %xmm0,%xmm1
mov    0x1c(%rsp),%r14d
jb     140b <projillum+0x2ab>
mov    0x10(%rsp),%ebx
movsd  %xmm0,0x20(%rsp)
call   1050 <sin@plt>
mulsd  0x50(%rsp),%xmm0
movsd  %xmm0,0x8(%rsp)
movsd  0x20(%rsp),%xmm0
call   1070 <cos@plt>
movsd  %xmm0,0x28(%rsp)
movsd  0x20(%rsp),%xmm0
call   1050 <sin@plt>
movsd  0x28(%rsp),%xmm3
movsd  0x8(%rsp),%xmm1
ucomisd 0xd7b(%rip),%xmm3
jne    12e1 <projillum+0x181>
jp     12e1 <projillum+0x181>
ucomisd 0xd6f(%rip),%xmm1
xorpd  %xmm2,%xmm2
jne    12e1 <projillum+0x181>
jnp    1302 <projillum+0x1a2>
movsd  %xmm0,0x10(%rsp)
movapd %xmm3,%xmm0
call   1030 <atan2@plt>
movapd %xmm0,%xmm2
movsd  0x10(%rsp),%xmm0
divsd  0xd1e(%rip),%xmm2
mulsd  0x70(%rsp),%xmm2
movsd  %xmm2,0x8(%rsp)
mulsd  0x68(%rsp),%xmm0
call   1060 <asin@plt>
divsd  0xcff(%rip),%xmm0
addsd  0xcff(%rip),%xmm0
mulsd  0x78(%rsp),%xmm0
movsd  0x80(%rsp),%xmm1
subsd  %xmm0,%xmm1
cvttsd2si %xmm1,%eax
mov    %eax,0x1c(%rsp)
cvttsd2si 0x8(%rsp),%eax
mov    %eax,0x10(%rsp)
test   $0x1,%r12b
mov    $0x1,%ecx
movsd  0xcd1(%rip),%xmm1
je     125a <projillum+0xfa>
mov    0x1c(%rsp),%r12d
cmp    %r12d,%r14d
je     1240 <projillum+0xe0>
mov    0x10(%rsp),%eax
sub    %ebx,%eax
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
xor    %r15d,%r15d
sub    %r14d,%r12d
xorps  %xmm0,%xmm0
cvtsi2sd %r12d,%xmm0
divsd  %xmm0,%xmm2
movsd  %xmm2,0x8(%rsp)
xorps  %xmm0,%xmm0
cvtsi2sd %ebx,%xmm0
movsd  %xmm0,0x28(%rsp)
setne  %r15b
mov    $0xffffffff,%eax
cmovs  %eax,%r15d
mov    0x48(%rsp),%rbx
sub    %r14d,%ebx
xor    %ebp,%ebp
nopl   0x0(%rax)
xorps  %xmm0,%xmm0
cvtsi2sd %ebp,%xmm0
mulsd  0x8(%rsp),%xmm0
addsd  %xmm1,%xmm0
call   1080 <floor@plt>
movsd  0xc52(%rip),%xmm1
mov    $0x1,%ecx
addsd  0x28(%rsp),%xmm0
cvttsd2si %xmm0,%eax
test   %eax,%eax
cmove  %ecx,%eax
movslq %ebx,%rbx
mov    %ax,0x0(%r13,%rbx,2)
add    %r15d,%ebp
sub    %r15d,%ebx
cmp    %ebp,%r12d
jne    13c0 <projillum+0x260>
jmp    125a <projillum+0xfa>
xor    %eax,%eax
xorpd  %xmm0,%xmm0
xor    %ecx,%ecx
ucomisd 0x38(%rsp),%xmm0
setbe  %bl
mov    0x48(%rsp),%rbp
cmovbe %eax,%ebp
mov    0x40(%rsp),%rsi
mov    %esi,%edx
shr    $0x1f,%edx
add    %esi,%edx
sar    %edx
cmp    %edx,%ebp
je     14a2 <projillum+0x342>
mov    %bl,%cl
add    %ecx,%ecx
add    $0xffffffff,%ecx
movslq %ebp,%rdi
movslq %ecx,%rsi
lea    0x0(,%rdi,2),%rdi
add    %r13,%rdi
add    %rsi,%rsi
sub    %ebp,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
cmpw   $0xffff,(%rdi)
jne    1471 <projillum+0x311>
add    %ecx,%eax
add    %rsi,%rdi
cmp    %eax,%edx
jne    1460 <projillum+0x300>
jmp    14a2 <projillum+0x342>
mov    0x34(%rsp),%esi
mov    %esi,%edx
shr    $0x1f,%edx
add    %esi,%edx
shr    %edx
mov    %ecx,%esi
neg    %esi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
lea    (%rax,%rbp,1),%edi
movslq %edi,%rdi
mov    %dx,0x0(%r13,%rdi,2)
sub    %ecx,%eax
cmp    %eax,%esi
jne    1490 <projillum+0x330>
add    $0x88,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @projillum(i16* %0, i32 %1, i32 %2, double %3) {
%5 = alloca i16*
%6 = alloca i32
%7 = alloca i32
%8 = alloca double
%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 double
%19 = alloca double
%20 = alloca double
%21 = alloca double
%22 = alloca double
%23 = alloca double
%24 = alloca double
store i16* %0, i16** %5
store i32 %1, i32* %6
store i32 %2, i32* %7
store double %3, double* %8
store i32 1, i32* %10
store i32 0, i32* %13
store i32 0, i32* %14
store i32 0, i32* %9
br label %25
25: ; preds = %34, %4
%26 = load i32, i32* %9
%27 = load i32, i32* %7
%28 = icmp slt i32 %26, %27
br i1 %28, label %29, label %37
29: ; preds = %25
%30 = load i16*, i16** %5
%31 = load i32, i32* %9
%32 = sext i32 %31 to i64
%33 = getelementptr inbounds i16, i16* %30, i64 %32
store i16 -1, i16* %33
br label %34
34: ; preds = %29
%35 = load i32, i32* %9
%36 = add nsw i32 %35, 1
store i32 %36, i32* %9
br label %25
37: ; preds = %25
%38 = load double, double* %8
%39 = fmul double %38, 0x3F91DF46A2529D39
%40 = fneg double %39
%41 = call double @sin(double %40)
store double %41, double* %23
%42 = load double, double* %8
%43 = fmul double %42, 0x3F91DF46A2529D39
%44 = fneg double %43
%45 = call double @cos(double %44)
store double %45, double* %24
store double 0xBFF921FB54442D18, double* %20
br label %46
46: ; preds = %182, %37
%47 = load double, double* %20
%48 = fcmp ole double %47, 0x3FF92613E7B8E982
br i1 %48, label %49, label %185
49: ; preds = %46
%50 = load double, double* %23
%51 = fneg double %50
%52 = load double, double* %20
%53 = call double @sin(double %52)
%54 = fmul double %51, %53
store double %54, double* %17
%55 = load double, double* %20
%56 = call double @cos(double %55)
store double %56, double* %18
%57 = load double, double* %24
%58 = load double, double* %20
%59 = call double @sin(double %58)
%60 = fmul double %57, %59
store double %60, double* %19
%61 = load double, double* %18
%62 = fcmp oeq double %61, 0.000000e+00
br i1 %62, label %63, label %67
63: ; preds = %49
%64 = load double, double* %17
%65 = fcmp oeq double %64, 0.000000e+00
br i1 %65, label %66, label %67
66: ; preds = %63
br label %72
67: ; preds = %63, %49
%68 = load double, double* %18
%69 = load double, double* %17
%70 = call double @atan2(double %68, double %69)
%71 = fdiv double %70, 0x3F91DF46A2529D39
br label %72
72: ; preds = %67, %66
%73 = phi double [ 0.000000e+00, %66 ], [ %71, %67 ]
store double %73, double* %21
%74 = load double, double* %19
%75 = call double @asin(double %74)
%76 = fdiv double %75, 0x3F91DF46A2529D39
store double %76, double* %22
%77 = load i32, i32* %7
%78 = sitofp i32 %77 to double
%79 = load double, double* %22
%80 = fadd double %79, 9.000000e+01
%81 = load i32, i32* %7
%82 = sitofp i32 %81 to double
%83 = fdiv double %82, 1.800000e+02
%84 = fneg double %80
%85 = call double @llvm.fmuladd.f64(double %84, double %83, double %78)
%86 = fptosi double %85 to i32
store i32 %86, i32* %12
%87 = load double, double* %21
%88 = load i32, i32* %6
%89 = sitofp i32 %88 to double
%90 = fdiv double %89, 3.600000e+02
%91 = fmul double %87, %90
%92 = fptosi double %91 to i32
store i32 %92, i32* %11
%93 = load i32, i32* %10
%94 = icmp ne i32 %93, 0
br i1 %94, label %95, label %98
95: ; preds = %72
%96 = load i32, i32* %11
store i32 %96, i32* %13
%97 = load i32, i32* %12
store i32 %97, i32* %14
store i32 0, i32* %10
br label %181
98: ; preds = %72
%99 = load i32, i32* %14
%100 = load i32, i32* %12
%101 = icmp eq i32 %99, %100
br i1 %101, label %102, label %118
102: ; preds = %98
%103 = load i32, i32* %11
%104 = icmp eq i32 %103, 0
br i1 %104, label %105, label %106
105: ; preds = %102
br label %108
106: ; preds = %102
%107 = load i32, i32* %11
br label %108
108: ; preds = %106, %105
%109 = phi i32 [ 1, %105 ], [ %107, %106 ]
%110 = trunc i32 %109 to i16
%111 = load i16*, i16** %5
%112 = load i32, i32* %7
%113 = sub nsw i32 %112, 1
%114 = load i32, i32* %12
%115 = sub nsw i32 %113, %114
%116 = sext i32 %115 to i64
%117 = getelementptr inbounds i16, i16* %111, i64 %116
store i16 %110, i16* %117
br label %178
118: ; preds = %98
%119 = load i32, i32* %11
%120 = load i32, i32* %13
%121 = sub nsw i32 %119, %120
%122 = sitofp i32 %121 to double
%123 = load i32, i32* %12
%124 = load i32, i32* %14
%125 = sub nsw i32 %123, %124
%126 = sitofp i32 %125 to double
%127 = fdiv double %122, %126
store double %127, double* %16
%128 = load i32, i32* %14
store i32 %128, i32* %9
br label %129
129: ; preds = %173, %118
%130 = load i32, i32* %9
%131 = load i32, i32* %12
%132 = icmp ne i32 %130, %131
br i1 %132, label %133, label %177
133: ; preds = %129
%134 = load i32, i32* %13
%135 = sitofp i32 %134 to double
%136 = load double, double* %16
%137 = load i32, i32* %9
%138 = load i32, i32* %14
%139 = sub nsw i32 %137, %138
%140 = sitofp i32 %139 to double
%141 = call double @llvm.fmuladd.f64(double %136, double %140, double 5.000000e-01)
%142 = call double @llvm.floor.f64(double %141)
%143 = fadd double %135, %142
%144 = fptosi double %143 to i32
store i32 %144, i32* %15
%145 = load i32, i32* %15
%146 = icmp eq i32 %145, 0
br i1 %146, label %147, label %148
147: ; preds = %133
br label %150
148: ; preds = %133
%149 = load i32, i32* %15
br label %150
150: ; preds = %148, %147
%151 = phi i32 [ 1, %147 ], [ %149, %148 ]
%152 = trunc i32 %151 to i16
%153 = load i16*, i16** %5
%154 = load i32, i32* %7
%155 = sub nsw i32 %154, 1
%156 = load i32, i32* %9
%157 = sub nsw i32 %155, %156
%158 = sext i32 %157 to i64
%159 = getelementptr inbounds i16, i16* %153, i64 %158
store i16 %152, i16* %159
br label %160
160: ; preds = %150
%161 = load i32, i32* %12
%162 = load i32, i32* %14
%163 = sub nsw i32 %161, %162
%164 = icmp slt i32 %163, 0
br i1 %164, label %165, label %166
165: ; preds = %160
br label %173
166: ; preds = %160
%167 = load i32, i32* %12
%168 = load i32, i32* %14
%169 = sub nsw i32 %167, %168
%170 = icmp sgt i32 %169, 0
%171 = zext i1 %170 to i64
%172 = select i1 %170, i32 1, i32 0
br label %173
173: ; preds = %166, %165
%174 = phi i32 [ -1, %165 ], [ %172, %166 ]
%175 = load i32, i32* %9
%176 = add nsw i32 %175, %174
store i32 %176, i32* %9
br label %129
177: ; preds = %129
br label %178
178: ; preds = %177, %108
%179 = load i32, i32* %11
store i32 %179, i32* %13
%180 = load i32, i32* %12
store i32 %180, i32* %14
br label %181
181: ; preds = %178, %95
br label %182
182: ; preds = %181
%183 = load double, double* %20
%184 = fadd double %183, 0x3FA015BF9217271A
store double %184, double* %20
br label %46
185: ; preds = %46
%186 = load double, double* %8
%187 = fcmp olt double %186, 0.000000e+00
br i1 %187, label %188, label %191
188: ; preds = %185
%189 = load i32, i32* %7
%190 = sub nsw i32 %189, 1
store i32 %190, i32* %12
store i32 -1, i32* %14
br label %192
191: ; preds = %185
store i32 0, i32* %12
store i32 1, i32* %14
br label %192
192: ; preds = %191, %188
%193 = load i32, i32* %12
store i32 %193, i32* %9
br label %194
194: ; preds = %226, %192
%195 = load i32, i32* %9
%196 = load i32, i32* %7
%197 = sdiv i32 %196, 2
%198 = icmp ne i32 %195, %197
br i1 %198, label %199, label %230
199: ; preds = %194
%200 = load i16*, i16** %5
%201 = load i32, i32* %9
%202 = sext i32 %201 to i64
%203 = getelementptr inbounds i16, i16* %200, i64 %202
%204 = load i16, i16* %203
%205 = sext i16 %204 to i32
%206 = icmp ne i32 %205, -1
br i1 %206, label %207, label %225
207: ; preds = %199
br label %208
208: ; preds = %207, %220
%209 = load i32, i32* %6
%210 = sdiv i32 %209, 2
%211 = trunc i32 %210 to i16
%212 = load i16*, i16** %5
%213 = load i32, i32* %9
%214 = sext i32 %213 to i64
%215 = getelementptr inbounds i16, i16* %212, i64 %214
store i16 %211, i16* %215
%216 = load i32, i32* %9
%217 = load i32, i32* %12
%218 = icmp eq i32 %216, %217
br i1 %218, label %219, label %220
219: ; preds = %208
br label %224
220: ; preds = %208
%221 = load i32, i32* %14
%222 = load i32, i32* %9
%223 = sub nsw i32 %222, %221
store i32 %223, i32* %9
br label %208
224: ; preds = %219
br label %230
225: ; preds = %199
br label %226
226: ; preds = %225
%227 = load i32, i32* %14
%228 = load i32, i32* %9
%229 = add nsw i32 %228, %227
store i32 %229, i32* %9
br label %194
230: ; preds = %224, %194
ret void
}

LLVM IR (-O2):
define void @projillum(i16* nocapture %0, i32 %1, i32 %2, double %3) {
%5 = icmp sgt i32 %2, 0
br i1 %5, label %6, label %10
6: ; preds = %4
%7 = bitcast i16* %0 to i8*
%8 = zext i32 %2 to i64
%9 = shl nuw nsw i64 %8, 1
br label %10
10: ; preds = %6, %4
%11 = fmul double %3, 0xBF91DF46A2529D39
%12 = tail call double @sin(double %11)
%13 = tail call double @cos(double %11)
%14 = fneg double %12
%15 = sitofp i32 %2 to double
%16 = fdiv double %15, 1.800000e+02
%17 = sitofp i32 %1 to double
%18 = fdiv double %17, 3.600000e+02
br label %19
19: ; preds = %10, %87
%20 = phi i1 [ false, %10 ], [ true, %87 ]
%21 = phi i32 [ 0, %10 ], [ %44, %87 ]
%22 = phi double [ 0xBFF921FB54442D18, %10 ], [ %88, %87 ]
%23 = phi i32 [ 0, %10 ], [ %42, %87 ]
%24 = tail call double @sin(double %22)
%25 = fmul double %24, %14
%26 = tail call double @cos(double %22)
%27 = tail call double @sin(double %22)
%28 = fmul double %13, %27
%29 = fcmp oeq double %26, 0.000000e+00
%30 = fcmp oeq double %25, 0.000000e+00
%31 = select i1 %29, i1 %30, i1 false
br i1 %31, label %35, label %32
32: ; preds = %19
%33 = tail call double @atan2(double %26, double %25)
%34 = fdiv double %33, 0x3F91DF46A2529D39
br label %35
35: ; preds = %19, %32
%36 = phi double [ %34, %32 ], [ 0.000000e+00, %19 ]
%37 = tail call double @asin(double %28)
%38 = fdiv double %37, 0x3F91DF46A2529D39
%39 = fadd double %38, 9.000000e+01
%40 = fneg double %39
%41 = tail call double @llvm.fmuladd.f64(double %40, double %16, double %15)
%42 = fptosi double %41 to i32
%43 = fmul double %18, %36
%44 = fptosi double %43 to i32
br i1 %20, label %45, label %87
45: ; preds = %35
%46 = icmp eq i32 %23, %42
br i1 %46, label %47, label %55
47: ; preds = %45
%48 = icmp eq i32 %44, 0
%49 = trunc i32 %44 to i16
%50 = select i1 %48, i16 1, i16 %49
%51 = xor i32 %23, -1
%52 = add i32 %51, %2
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds i16, i16* %0, i64 %53
store i16 %50, i16* %54
br label %87
55: ; preds = %45
%56 = sub nsw i32 %44, %21
%57 = sitofp i32 %56 to double
%58 = sub nsw i32 %42, %23
%59 = sitofp i32 %58 to double
%60 = fdiv double %57, %59
%61 = sitofp i32 %21 to double
%62 = icmp ne i32 %58, 0
%63 = zext i1 %62 to i64
%64 = icmp sgt i32 %58, -1
%65 = select i1 %64, i64 %63, i64 4294967295
%66 = zext i32 %23 to i64
br label %67
67: ; preds = %55, %67
%68 = phi i64 [ %66, %55 ], [ %84, %67 ]
%69 = trunc i64 %68 to i32
%70 = sub i32 %69, %23
%71 = sitofp i32 %70 to double
%72 = tail call double @llvm.fmuladd.f64(double %60, double %71, double 5.000000e-01)
%73 = tail call double @llvm.floor.f64(double %72)
%74 = fadd double %73, %61
%75 = fptosi double %74 to i32
%76 = icmp eq i32 %75, 0
%77 = trunc i32 %75 to i16
%78 = select i1 %76, i16 1, i16 %77
%79 = trunc i64 %68 to i32
%80 = xor i32 %79, -1
%81 = add i32 %80, %2
%82 = sext i32 %81 to i64
%83 = getelementptr inbounds i16, i16* %0, i64 %82
store i16 %78, i16* %83
%84 = add i64 %68, %65
%85 = trunc i64 %84 to i32
%86 = icmp eq i32 %85, %42
br i1 %86, label %87, label %67
87: ; preds = %67, %47, %35
%88 = fadd double %22, 0x3FA015BF9217271A
%89 = fcmp ugt double %88, 0x3FF92613E7B8E982
br i1 %89, label %90, label %19
90: ; preds = %87
%91 = fcmp olt double %3, 0.000000e+00
%92 = add nsw i32 %2, -1
%93 = select i1 %91, i32 -1, i32 1
%94 = select i1 %91, i32 %92, i32 0
%95 = sdiv i32 %2, 2
%96 = icmp eq i32 %94, %95
br i1 %96, label %119, label %97
97: ; preds = %90
%98 = sext i32 %94 to i64
%99 = sext i32 %93 to i64
br label %100
100: ; preds = %97, %115
%101 = phi i64 [ %98, %97 ], [ %116, %115 ]
%102 = getelementptr inbounds i16, i16* %0, i64 %101
%103 = load i16, i16* %102
%104 = icmp eq i16 %103, -1
br i1 %104, label %115, label %105
105: ; preds = %100
%106 = trunc i64 %101 to i32
%107 = sdiv i32 %1, 2
%108 = trunc i32 %107 to i16
br label %109
109: ; preds = %109, %105
%110 = phi i32 [ %114, %109 ], [ %106, %105 ]
%111 = sext i32 %110 to i64
%112 = getelementptr inbounds i16, i16* %0, i64 %111
store i16 %108, i16* %112
%113 = icmp eq i32 %110, %94
%114 = sub nsw i32 %110, %93
br i1 %113, label %119, label %109
115: ; preds = %100
%116 = add i64 %101, %99
%117 = trunc i64 %116 to i32
%118 = icmp eq i32 %95, %117
br i1 %118, label %119, label %100
119: ; preds = %115, %109, %90
ret void
}