int main(int argc, char **argv) {
  int x, y, i;
  int angle = 0;
  unsigned int elpased_time;
  float *xf = (float *)malloc(sizeof(float) * 1024 * 1024);
  float *yf = (float *)malloc(sizeof(float) * 1024 * 1024);
  for (y = 0; y < 1024; y++)
    for (x = 0; x < 1024; x++) {
      xf[y * 1024 + x] = x;
      yf[y * 1024 + x] = y;
    }
  float *af = (float *)malloc(sizeof(float) * 1024 * 1024);
  elpased_time = get_current_time();
  for (i = 0; i < 100; i++)
    FastAtan2_32f(yf, xf, af, 1024 * 1024);
  for (y = 0; y < 1024; y++)
    for (x = 0; x < 1024; x++)
      angle += af[y * 1024 + x];
  printf("FastAtan2_32f : %dms\n", get_current_time() - elpased_time);
  for (y = 0; y < 1024; y++)
    for (x = 0; x < 1024; x++) {
      double at = (atan2(y, x) * 180 / 3.141592654);
      if (at < 0)
        at = 360 - at;
      if (fabs(af[y * 1024 + x] - at) > 0.5)
        printf("%f != %f\n", af[y * 1024 + x], at);
    }
  free(xf);
  free(yf);
  free(af);
  int *xi = (int *)malloc(sizeof(int) * 1024 * 1024);
  int *yi = (int *)malloc(sizeof(int) * 1024 * 1024);
  for (y = 0; y < 1024; y++)
    for (x = 0; x < 1024; x++) {
      xi[y * 1024 + x] = x;
      yi[y * 1024 + x] = y;
    }
  int *ai = (int *)malloc(sizeof(int) * 1024 * 1024);
  elpased_time = get_current_time();
  for (i = 0; i < 100; i++)
    __ccv_atan2(xi, yi, ai, 1024 * 1024);
  for (y = 0; y < 1024; y++)
    for (x = 0; x < 1024; x++)
      angle += ai[y * 1024 + x];
  printf("__ccv_atan2 : %dms\n", get_current_time() - elpased_time);
  free(xi);
  free(yi);
  free(ai);
  elpased_time = get_current_time();
  for (y = 0; y < 1024; y++)
    for (x = 0; x < 1024; x++)
      angle += (int)(atan2(y, x) * 180 / 3.141592654 + 0.5);
  printf("atan2 : %dms x 100\n", get_current_time() - elpased_time);
  elpased_time = get_current_time();
  for (i = 0; i < 100; i++)
    for (y = 0; y < 1024; y++)
      for (x = 0; x < 1024; x++)
        angle += (int)(fastAtan2(y, x) + 0.5);
  printf("fastAtan2 : %dms\n", get_current_time() - elpased_time);
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
movl   $0x0,-0x4(%rbp)
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x20(%rbp)
mov    $0x400000,%edi
call   1070 <malloc@plt>
mov    %rax,-0x30(%rbp)
mov    $0x400000,%edi
call   1070 <malloc@plt>
mov    %rax,-0x38(%rbp)
movl   $0x0,-0x18(%rbp)
cmpl   $0x400,-0x18(%rbp)
jge    1236 <main+0xb6>
movl   $0x0,-0x14(%rbp)
cmpl   $0x400,-0x14(%rbp)
jge    1223 <main+0xa3>
cvtsi2ssl -0x14(%rbp),%xmm0
mov    -0x30(%rbp),%rax
mov    -0x18(%rbp),%ecx
shl    $0xa,%ecx
add    -0x14(%rbp),%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
cvtsi2ssl -0x18(%rbp),%xmm0
mov    -0x38(%rbp),%rax
mov    -0x18(%rbp),%ecx
shl    $0xa,%ecx
add    -0x14(%rbp),%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    11d4 <main+0x54>
jmp    1228 <main+0xa8>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    11c0 <main+0x40>
mov    $0x400000,%edi
call   1070 <malloc@plt>
mov    %rax,-0x40(%rbp)
mov    $0x0,%al
call   1090 <get_current_time@plt>
mov    %eax,-0x24(%rbp)
movl   $0x0,-0x1c(%rbp)
cmpl   $0x64,-0x1c(%rbp)
jge    1285 <main+0x105>
mov    -0x38(%rbp),%rdi
mov    -0x30(%rbp),%rsi
mov    -0x40(%rbp),%rdx
mov    $0x100000,%ecx
mov    $0x0,%al
call   10a0 <FastAtan2_32f@plt>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1255 <main+0xd5>
movl   $0x0,-0x18(%rbp)
cmpl   $0x400,-0x18(%rbp)
jge    12f3 <main+0x173>
movl   $0x0,-0x14(%rbp)
cmpl   $0x400,-0x14(%rbp)
jge    12e0 <main+0x160>
mov    -0x40(%rbp),%rax
mov    -0x18(%rbp),%ecx
shl    $0xa,%ecx
add    -0x14(%rbp),%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm1
cvtsi2ssl -0x20(%rbp),%xmm0
addss  %xmm1,%xmm0
cvttss2si %xmm0,%eax
mov    %eax,-0x20(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    12a0 <main+0x120>
jmp    12e5 <main+0x165>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    128c <main+0x10c>
mov    $0x0,%al
call   1090 <get_current_time@plt>
mov    %eax,%esi
sub    -0x24(%rbp),%esi
lea    0xd2a(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
movl   $0x0,-0x18(%rbp)
cmpl   $0x400,-0x18(%rbp)
jge    140e <main+0x28e>
movl   $0x0,-0x14(%rbp)
cmpl   $0x400,-0x14(%rbp)
jge    13fb <main+0x27b>
cvtsi2sdl -0x18(%rbp),%xmm0
cvtsi2sdl -0x14(%rbp),%xmm1
call   1040 <atan2@plt>
movsd  0xcc4(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xcb0(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x48(%rbp),%xmm0
jbe    1381 <main+0x201>
movsd  0xca1(%rip),%xmm0
subsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x40(%rbp),%rax
mov    -0x18(%rbp),%ecx
shl    $0xa,%ecx
add    -0x14(%rbp),%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
subsd  -0x48(%rbp),%xmm0
movaps 0xc7a(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  0xc4e(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    13e8 <main+0x268>
mov    -0x40(%rbp),%rax
mov    -0x18(%rbp),%ecx
shl    $0xa,%ecx
add    -0x14(%rbp),%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  -0x48(%rbp),%xmm1
lea    0xc65(%rip),%rdi
mov    $0x2,%al
call   1050 <printf@plt>
jmp    13ed <main+0x26d>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1328 <main+0x1a8>
jmp    1400 <main+0x280>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1314 <main+0x194>
mov    -0x30(%rbp),%rdi
call   1030 <free@plt>
mov    -0x38(%rbp),%rdi
call   1030 <free@plt>
mov    -0x40(%rbp),%rdi
call   1030 <free@plt>
mov    $0x400000,%edi
call   1070 <malloc@plt>
mov    %rax,-0x50(%rbp)
mov    $0x400000,%edi
call   1070 <malloc@plt>
mov    %rax,-0x58(%rbp)
movl   $0x0,-0x18(%rbp)
cmpl   $0x400,-0x18(%rbp)
jge    14ba <main+0x33a>
movl   $0x0,-0x14(%rbp)
cmpl   $0x400,-0x14(%rbp)
jge    14a7 <main+0x327>
mov    -0x14(%rbp),%edx
mov    -0x50(%rbp),%rax
mov    -0x18(%rbp),%ecx
shl    $0xa,%ecx
add    -0x14(%rbp),%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x18(%rbp),%edx
mov    -0x58(%rbp),%rax
mov    -0x18(%rbp),%ecx
shl    $0xa,%ecx
add    -0x14(%rbp),%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1460 <main+0x2e0>
jmp    14ac <main+0x32c>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    144c <main+0x2cc>
mov    $0x400000,%edi
call   1070 <malloc@plt>
mov    %rax,-0x60(%rbp)
mov    $0x0,%al
call   1090 <get_current_time@plt>
mov    %eax,-0x24(%rbp)
movl   $0x0,-0x1c(%rbp)
cmpl   $0x64,-0x1c(%rbp)
jge    1509 <main+0x389>
mov    -0x50(%rbp),%rdi
mov    -0x58(%rbp),%rsi
mov    -0x60(%rbp),%rdx
mov    $0x100000,%ecx
mov    $0x0,%al
call   1080 <__ccv_atan2@plt>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    14d9 <main+0x359>
movl   $0x0,-0x18(%rbp)
cmpl   $0x400,-0x18(%rbp)
jge    156b <main+0x3eb>
movl   $0x0,-0x14(%rbp)
cmpl   $0x400,-0x14(%rbp)
jge    1558 <main+0x3d8>
mov    -0x60(%rbp),%rax
mov    -0x18(%rbp),%ecx
shl    $0xa,%ecx
add    -0x14(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1524 <main+0x3a4>
jmp    155d <main+0x3dd>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1510 <main+0x390>
mov    $0x0,%al
call   1090 <get_current_time@plt>
mov    %eax,%esi
sub    -0x24(%rbp),%esi
lea    0xad2(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    -0x50(%rbp),%rdi
call   1030 <free@plt>
mov    -0x58(%rbp),%rdi
call   1030 <free@plt>
mov    -0x60(%rbp),%rdi
call   1030 <free@plt>
mov    $0x0,%al
call   1090 <get_current_time@plt>
mov    %eax,-0x24(%rbp)
movl   $0x0,-0x18(%rbp)
cmpl   $0x400,-0x18(%rbp)
jge    1630 <main+0x4b0>
movl   $0x0,-0x14(%rbp)
cmpl   $0x400,-0x14(%rbp)
jge    161d <main+0x49d>
cvtsi2sdl -0x18(%rbp),%xmm0
cvtsi2sdl -0x14(%rbp),%xmm1
call   1040 <atan2@plt>
movsd  0xa27(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xa13(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  0x9ff(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    15c5 <main+0x445>
jmp    1622 <main+0x4a2>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    15b1 <main+0x431>
mov    $0x0,%al
call   1090 <get_current_time@plt>
mov    %eax,%esi
sub    -0x24(%rbp),%esi
lea    0xa21(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    $0x0,%al
call   1090 <get_current_time@plt>
mov    %eax,-0x24(%rbp)
movl   $0x0,-0x1c(%rbp)
cmpl   $0x64,-0x1c(%rbp)
jge    16e8 <main+0x568>
movl   $0x0,-0x18(%rbp)
cmpl   $0x400,-0x18(%rbp)
jge    16d5 <main+0x555>
movl   $0x0,-0x14(%rbp)
cmpl   $0x400,-0x14(%rbp)
jge    16c2 <main+0x542>
mov    -0x18(%rbp),%edi
mov    -0x14(%rbp),%esi
mov    $0x0,%al
call   1060 <fastAtan2@plt>
cvtsi2sd %eax,%xmm0
movsd  0x95a(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1680 <main+0x500>
jmp    16c7 <main+0x547>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    166c <main+0x4ec>
jmp    16da <main+0x55a>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    165b <main+0x4db>
mov    $0x0,%al
call   1090 <get_current_time@plt>
mov    %eax,%esi
sub    -0x24(%rbp),%esi
lea    0x97d(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
xor    %eax,%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    $0x400000,%edi
call   1070 <malloc@plt>
mov    %rax,%rbx
mov    $0x400000,%edi
call   1070 <malloc@plt>
mov    %rax,%r15
add    $0x30,%rax
mov    %rbx,%rcx
add    $0x30,%rcx
xor    %edx,%edx
movdqa 0xe43(%rip),%xmm0
nopl   (%rax)
xorps  %xmm1,%xmm1
cvtsi2ss %edx,%xmm1
shufps $0x0,%xmm1,%xmm1
xor    %esi,%esi
movdqa %xmm0,%xmm2
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movdqa %xmm2,%xmm3
paddd  0xe24(%rip),%xmm3
cvtdq2ps %xmm2,%xmm4
cvtdq2ps %xmm3,%xmm3
movups %xmm4,-0x30(%rcx,%rsi,4)
movups %xmm3,-0x20(%rcx,%rsi,4)
movups %xmm1,-0x30(%rax,%rsi,4)
movups %xmm1,-0x20(%rax,%rsi,4)
movdqa %xmm2,%xmm3
paddd  0xe0e(%rip),%xmm3
movdqa %xmm2,%xmm4
paddd  0xe12(%rip),%xmm4
cvtdq2ps %xmm3,%xmm3
cvtdq2ps %xmm4,%xmm4
movups %xmm3,-0x10(%rcx,%rsi,4)
movups %xmm4,(%rcx,%rsi,4)
movups %xmm1,-0x10(%rax,%rsi,4)
movups %xmm1,(%rax,%rsi,4)
add    $0x10,%rsi
paddd  0xdfe(%rip),%xmm2
cmp    $0x400,%rsi
jne    11e0 <main+0x60>
add    $0x1,%rdx
add    $0x1000,%rax
add    $0x1000,%rcx
cmp    $0x400,%rdx
jne    11c0 <main+0x40>
mov    $0x400000,%edi
call   1070 <malloc@plt>
mov    %rax,%r12
xor    %eax,%eax
call   1090 <get_current_time@plt>
mov    %eax,%r14d
mov    $0x64,%ebp
cs nopw 0x0(%rax,%rax,1)
nop
mov    %r15,%rdi
mov    %rbx,%rsi
mov    %r12,%rdx
mov    $0x100000,%ecx
xor    %eax,%eax
call   10a0 <FastAtan2_32f@plt>
add    $0xffffffff,%ebp
jne    1290 <main+0x110>
mov    %rbx,0x10(%rsp)
xor    %r13d,%r13d
xor    %eax,%eax
call   1090 <get_current_time@plt>
sub    %r14d,%eax
lea    0xdcd(%rip),%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1050 <printf@plt>
lea    0xdd3(%rip),%rbx
mov    %r12,%rbp
jmp    12f8 <main+0x178>
nopl   0x0(%rax,%rax,1)
add    $0x1,%r13
add    $0x1000,%rbp
cmp    $0x400,%r13
je     1398 <main+0x218>
xorps  %xmm0,%xmm0
cvtsi2sd %r13d,%xmm0
movsd  %xmm0,0x8(%rsp)
xor    %r14d,%r14d
jmp    131d <main+0x19d>
nopl   0x0(%rax,%rax,1)
add    $0x1,%r14
cmp    $0x400,%r14
je     12e0 <main+0x160>
xorps  %xmm1,%xmm1
cvtsi2sd %r14d,%xmm1
movsd  0x8(%rsp),%xmm0
call   1040 <atan2@plt>
mulsd  0xd28(%rip),%xmm0
divsd  0xd28(%rip),%xmm0
movsd  0xd28(%rip),%xmm2
subsd  %xmm0,%xmm2
movapd %xmm0,%xmm1
cmpltsd 0xd2f(%rip),%xmm1
andpd  %xmm1,%xmm2
andnpd %xmm0,%xmm1
orpd   %xmm2,%xmm1
movss  0x0(%rbp,%r14,4),%xmm0
cvtss2sd %xmm0,%xmm0
movaps %xmm0,%xmm2
subsd  %xmm1,%xmm2
andpd  0xcd1(%rip),%xmm2
ucomisd 0xcf1(%rip),%xmm2
jbe    1310 <main+0x190>
mov    %rbx,%rdi
mov    $0x2,%al
call   1050 <printf@plt>
jmp    1310 <main+0x190>
mov    0x10(%rsp),%rdi
call   1030 <free@plt>
mov    %r15,%rdi
call   1030 <free@plt>
mov    %r12,%rdi
call   1030 <free@plt>
mov    $0x400000,%edi
call   1070 <malloc@plt>
mov    %rax,%r14
mov    $0x400000,%edi
call   1070 <malloc@plt>
mov    %rax,%r15
add    $0x30,%rax
mov    %r14,%rcx
add    $0x30,%rcx
xor    %edx,%edx
movdqa 0xc1e(%rip),%xmm8
movdqa 0xc26(%rip),%xmm5
movdqa 0xc2e(%rip),%xmm6
movdqa 0xc36(%rip),%xmm7
movdqa 0xc3e(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movd   %edx,%xmm1
pshufd $0x0,%xmm1,%xmm1
xor    %esi,%esi
movdqa %xmm8,%xmm2
movdqa %xmm2,%xmm3
paddd  %xmm5,%xmm3
movdqu %xmm2,-0x30(%rcx,%rsi,4)
movdqu %xmm3,-0x20(%rcx,%rsi,4)
movdqu %xmm1,-0x30(%rax,%rsi,4)
movdqu %xmm1,-0x20(%rax,%rsi,4)
movdqa %xmm2,%xmm3
paddd  %xmm6,%xmm3
movdqa %xmm2,%xmm4
paddd  %xmm7,%xmm4
movdqu %xmm3,-0x10(%rcx,%rsi,4)
movdqu %xmm4,(%rcx,%rsi,4)
movdqu %xmm1,-0x10(%rax,%rsi,4)
movdqu %xmm1,(%rax,%rsi,4)
add    $0x10,%rsi
paddd  %xmm0,%xmm2
cmp    $0x400,%rsi
jne    1420 <main+0x2a0>
add    $0x1,%rdx
add    $0x1000,%rax
add    $0x1000,%rcx
cmp    $0x400,%rdx
jne    1410 <main+0x290>
mov    $0x400000,%edi
call   1070 <malloc@plt>
mov    %rax,%rbx
xor    %eax,%eax
call   1090 <get_current_time@plt>
mov    %eax,%r12d
mov    $0x64,%ebp
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %r14,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    $0x100000,%ecx
xor    %eax,%eax
call   1080 <__ccv_atan2@plt>
add    $0xffffffff,%ebp
jne    14c0 <main+0x340>
xor    %ebp,%ebp
xor    %eax,%eax
call   1090 <get_current_time@plt>
sub    %r12d,%eax
lea    0xbc3(%rip),%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1050 <printf@plt>
mov    %r14,%rdi
call   1030 <free@plt>
mov    %r15,%rdi
call   1030 <free@plt>
mov    %rbx,%rdi
call   1030 <free@plt>
xor    %eax,%eax
call   1090 <get_current_time@plt>
mov    %eax,%r14d
pxor   %xmm0,%xmm0
nopl   0x0(%rax)
mov    $0x400,%ebx
pxor   %xmm2,%xmm2
movq   %xmm0,0x8(%rsp)
nop
movq   %xmm2,0x10(%rsp)
movsd  0x8(%rsp),%xmm0
movdqa %xmm2,%xmm1
call   1040 <atan2@plt>
movsd  0x10(%rsp),%xmm2
movsd  0xb2d(%rip),%xmm1
movsd  0x8(%rsp),%xmm0
addsd  %xmm1,%xmm2
add    $0xffffffff,%ebx
jne    1530 <main+0x3b0>
addsd  %xmm1,%xmm0
add    $0x1,%ebp
cmp    $0x400,%ebp
jne    1520 <main+0x3a0>
xor    %eax,%eax
call   1090 <get_current_time@plt>
sub    %r14d,%eax
lea    0xb42(%rip),%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1050 <printf@plt>
xor    %eax,%eax
call   1090 <get_current_time@plt>
mov    %eax,%r14d
xor    %r15d,%r15d
nopl   0x0(%rax,%rax,1)
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %ebp,%edi
mov    %ebx,%esi
xor    %eax,%eax
call   1060 <fastAtan2@plt>
add    $0x1,%ebx
cmp    $0x400,%ebx
jne    15c0 <main+0x440>
add    $0x1,%ebp
cmp    $0x400,%ebp
jne    15b0 <main+0x430>
add    $0x1,%r15d
cmp    $0x64,%r15d
jne    15a0 <main+0x420>
xor    %eax,%eax
call   1090 <get_current_time@plt>
sub    %r14d,%eax
lea    0xadc(%rip),%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1050 <printf@plt>
xor    %eax,%eax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
@.str = [22 x i8] c"FastAtan2_32f : %dms\0A\00"
@.str.1 = [10 x i8] c"%f != %f\0A\00"
@.str.2 = [20 x i8] c"__ccv_atan2 : %dms\0A\00"
@.str.3 = [20 x i8] c"atan2 : %dms x 100\0A\00"
@.str.4 = [18 x i8] c"fastAtan2 : %dms\0A\00"
define i32 @main(i32 %0, i8** nocapture readnone %1) {
%3 = tail call dereferenceable_or_null(4194304) i8* @malloc(i64 4194304)
%4 = bitcast i8* %3 to float*
%5 = tail call dereferenceable_or_null(4194304) i8* @malloc(i64 4194304)
%6 = bitcast i8* %5 to float*
br label %7
7: ; preds = %2, %48
%8 = phi i64 [ 0, %2 ], [ %49, %48 ]
%9 = shl nsw i64 %8, 10
%10 = trunc i64 %8 to i32
%11 = sitofp i32 %10 to float
%12 = insertelement <4 x float> poison, float %11, i64 0
%13 = shufflevector <4 x float> %12, <4 x float> poison, <4 x i32> zeroinitializer
%14 = insertelement <4 x float> poison, float %11, i64 0
%15 = shufflevector <4 x float> %14, <4 x float> poison, <4 x i32> zeroinitializer
br label %16
16: ; preds = %16, %7
%17 = phi i64 [ 0, %7 ], [ %45, %16 ]
%18 = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %7 ], [ %46, %16 ]
%19 = add <4 x i32> %18, <i32 4, i32 4, i32 4, i32 4>
%20 = sitofp <4 x i32> %18 to <4 x float>
%21 = sitofp <4 x i32> %19 to <4 x float>
%22 = add nuw nsw i64 %17, %9
%23 = getelementptr inbounds float, float* %4, i64 %22
%24 = bitcast float* %23 to <4 x float>*
store <4 x float> %20, <4 x float>* %24
%25 = getelementptr inbounds float, float* %23, i64 4
%26 = bitcast float* %25 to <4 x float>*
store <4 x float> %21, <4 x float>* %26
%27 = getelementptr inbounds float, float* %6, i64 %22
%28 = bitcast float* %27 to <4 x float>*
store <4 x float> %13, <4 x float>* %28
%29 = getelementptr inbounds float, float* %27, i64 4
%30 = bitcast float* %29 to <4 x float>*
store <4 x float> %15, <4 x float>* %30
%31 = or i64 %17, 8
%32 = add <4 x i32> %18, <i32 8, i32 8, i32 8, i32 8>
%33 = add <4 x i32> %18, <i32 12, i32 12, i32 12, i32 12>
%34 = sitofp <4 x i32> %32 to <4 x float>
%35 = sitofp <4 x i32> %33 to <4 x float>
%36 = add nuw nsw i64 %31, %9
%37 = getelementptr inbounds float, float* %4, i64 %36
%38 = bitcast float* %37 to <4 x float>*
store <4 x float> %34, <4 x float>* %38
%39 = getelementptr inbounds float, float* %37, i64 4
%40 = bitcast float* %39 to <4 x float>*
store <4 x float> %35, <4 x float>* %40
%41 = getelementptr inbounds float, float* %6, i64 %36
%42 = bitcast float* %41 to <4 x float>*
store <4 x float> %13, <4 x float>* %42
%43 = getelementptr inbounds float, float* %41, i64 4
%44 = bitcast float* %43 to <4 x float>*
store <4 x float> %15, <4 x float>* %44
%45 = add nuw nsw i64 %17, 16
%46 = add <4 x i32> %18, <i32 16, i32 16, i32 16, i32 16>
%47 = icmp eq i64 %45, 1024
br i1 %47, label %48, label %16
48: ; preds = %16
%49 = add nuw nsw i64 %8, 1
%50 = icmp eq i64 %49, 1024
br i1 %50, label %51, label %7
51: ; preds = %48
%52 = tail call dereferenceable_or_null(4194304) i8* @malloc(i64 4194304)
%53 = bitcast i8* %52 to float*
%54 = tail call i32 (...) @get_current_time()
br label %55
55: ; preds = %51, %55
%56 = phi i32 [ 0, %51 ], [ %58, %55 ]
%57 = tail call i32 (float*, float*, float*, i32, ...) bitcast (i32 (...)* @FastAtan2_32f to i32 (float*, float*, float*, i32, ...)*)(float* %6, float* %4, float* %53, i32 1048576)
%58 = add nuw nsw i32 %56, 1
%59 = icmp eq i32 %58, 100
br i1 %59, label %60, label %55
60: ; preds = %55
%61 = tail call i32 (...) @get_current_time()
%62 = sub i32 %61, %54
%63 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([22 x i8], [22 x i8]* @.str, i64 0, i64 0), i32 %62)
br label %64
64: ; preds = %60, %91
%65 = phi i64 [ 0, %60 ], [ %92, %91 ]
%66 = trunc i64 %65 to i32
%67 = sitofp i32 %66 to double
%68 = shl nsw i64 %65, 10
br label %69
69: ; preds = %64, %88
%70 = phi i64 [ 0, %64 ], [ %89, %88 ]
%71 = trunc i64 %70 to i32
%72 = sitofp i32 %71 to double
%73 = tail call double @atan2(double %67, double %72)
%74 = fmul double %73, 1.800000e+02
%75 = fdiv double %74, 0x400921FB54524550
%76 = fcmp olt double %75, 0.000000e+00
%77 = fsub double 3.600000e+02, %75
%78 = select i1 %76, double %77, double %75
%79 = add nuw nsw i64 %70, %68
%80 = getelementptr inbounds float, float* %53, i64 %79
%81 = load float, float* %80
%82 = fpext float %81 to double
%83 = fsub double %82, %78
%84 = tail call double @llvm.fabs.f64(double %83)
%85 = fcmp ogt double %84, 5.000000e-01
br i1 %85, label %86, label %88
86: ; preds = %69
%87 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.1, i64 0, i64 0), double %82, double %78)
br label %88
88: ; preds = %86, %69
%89 = add nuw nsw i64 %70, 1
%90 = icmp eq i64 %89, 1024
br i1 %90, label %91, label %69
91: ; preds = %88
%92 = add nuw nsw i64 %65, 1
%93 = icmp eq i64 %92, 1024
br i1 %93, label %94, label %64
94: ; preds = %91
tail call void @free(i8* %3)
tail call void @free(i8* %5)
tail call void @free(i8* %52)
%95 = tail call dereferenceable_or_null(4194304) i8* @malloc(i64 4194304)
%96 = bitcast i8* %95 to i32*
%97 = tail call dereferenceable_or_null(4194304) i8* @malloc(i64 4194304)
%98 = bitcast i8* %97 to i32*
br label %99
99: ; preds = %94, %135
%100 = phi i64 [ 0, %94 ], [ %136, %135 ]
%101 = shl nsw i64 %100, 10
%102 = trunc i64 %100 to i32
%103 = insertelement <4 x i32> poison, i32 %102, i64 0
%104 = shufflevector <4 x i32> %103, <4 x i32> poison, <4 x i32> zeroinitializer
%105 = insertelement <4 x i32> poison, i32 %102, i64 0
%106 = shufflevector <4 x i32> %105, <4 x i32> poison, <4 x i32> zeroinitializer
br label %107
107: ; preds = %107, %99
%108 = phi i64 [ 0, %99 ], [ %132, %107 ]
%109 = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %99 ], [ %133, %107 ]
%110 = add <4 x i32> %109, <i32 4, i32 4, i32 4, i32 4>
%111 = add nuw nsw i64 %108, %101
%112 = getelementptr inbounds i32, i32* %96, i64 %111
%113 = bitcast i32* %112 to <4 x i32>*
store <4 x i32> %109, <4 x i32>* %113
%114 = getelementptr inbounds i32, i32* %112, i64 4
%115 = bitcast i32* %114 to <4 x i32>*
store <4 x i32> %110, <4 x i32>* %115
%116 = getelementptr inbounds i32, i32* %98, i64 %111
%117 = bitcast i32* %116 to <4 x i32>*
store <4 x i32> %104, <4 x i32>* %117
%118 = getelementptr inbounds i32, i32* %116, i64 4
%119 = bitcast i32* %118 to <4 x i32>*
store <4 x i32> %106, <4 x i32>* %119
%120 = or i64 %108, 8
%121 = add <4 x i32> %109, <i32 8, i32 8, i32 8, i32 8>
%122 = add <4 x i32> %109, <i32 12, i32 12, i32 12, i32 12>
%123 = add nuw nsw i64 %120, %101
%124 = getelementptr inbounds i32, i32* %96, i64 %123
%125 = bitcast i32* %124 to <4 x i32>*
store <4 x i32> %121, <4 x i32>* %125
%126 = getelementptr inbounds i32, i32* %124, i64 4
%127 = bitcast i32* %126 to <4 x i32>*
store <4 x i32> %122, <4 x i32>* %127
%128 = getelementptr inbounds i32, i32* %98, i64 %123
%129 = bitcast i32* %128 to <4 x i32>*
store <4 x i32> %104, <4 x i32>* %129
%130 = getelementptr inbounds i32, i32* %128, i64 4
%131 = bitcast i32* %130 to <4 x i32>*
store <4 x i32> %106, <4 x i32>* %131
%132 = add nuw nsw i64 %108, 16
%133 = add <4 x i32> %109, <i32 16, i32 16, i32 16, i32 16>
%134 = icmp eq i64 %132, 1024
br i1 %134, label %135, label %107
135: ; preds = %107
%136 = add nuw nsw i64 %100, 1
%137 = icmp eq i64 %136, 1024
br i1 %137, label %138, label %99
138: ; preds = %135
%139 = tail call dereferenceable_or_null(4194304) i8* @malloc(i64 4194304)
%140 = bitcast i8* %139 to i32*
%141 = tail call i32 (...) @get_current_time()
br label %142
142: ; preds = %138, %142
%143 = phi i32 [ 0, %138 ], [ %145, %142 ]
%144 = tail call i32 (i32*, i32*, i32*, i32, ...) bitcast (i32 (...)* @__ccv_atan2 to i32 (i32*, i32*, i32*, i32, ...)*)(i32* %96, i32* %98, i32* %140, i32 1048576)
%145 = add nuw nsw i32 %143, 1
%146 = icmp eq i32 %145, 100
br i1 %146, label %147, label %142
147: ; preds = %142
%148 = tail call i32 (...) @get_current_time()
%149 = sub i32 %148, %141
%150 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([20 x i8], [20 x i8]* @.str.2, i64 0, i64 0), i32 %149)
tail call void @free(i8* %95)
tail call void @free(i8* %97)
tail call void @free(i8* %139)
%151 = tail call i32 (...) @get_current_time()
br label %152
152: ; preds = %147, %161
%153 = phi i32 [ 0, %147 ], [ %162, %161 ]
%154 = sitofp i32 %153 to double
br label %155
155: ; preds = %152, %155
%156 = phi i32 [ 0, %152 ], [ %159, %155 ]
%157 = sitofp i32 %156 to double
%158 = tail call double @atan2(double %154, double %157)
%159 = add nuw nsw i32 %156, 1
%160 = icmp eq i32 %159, 1024
br i1 %160, label %161, label %155
161: ; preds = %155
%162 = add nuw nsw i32 %153, 1
%163 = icmp eq i32 %162, 1024
br i1 %163, label %164, label %152
164: ; preds = %161
%165 = tail call i32 (...) @get_current_time()
%166 = sub i32 %165, %151
%167 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([20 x i8], [20 x i8]* @.str.3, i64 0, i64 0), i32 %166)
%168 = tail call i32 (...) @get_current_time()
br label %169
169: ; preds = %164, %181
%170 = phi i32 [ 0, %164 ], [ %182, %181 ]
br label %171
171: ; preds = %169, %178
%172 = phi i32 [ 0, %169 ], [ %179, %178 ]
br label %173
173: ; preds = %171, %173
%174 = phi i32 [ 0, %171 ], [ %176, %173 ]
%175 = tail call i32 (i32, i32, ...) bitcast (i32 (...)* @fastAtan2 to i32 (i32, i32, ...)*)(i32 %172, i32 %174)
%176 = add nuw nsw i32 %174, 1
%177 = icmp eq i32 %176, 1024
br i1 %177, label %178, label %173
178: ; preds = %173
%179 = add nuw nsw i32 %172, 1
%180 = icmp eq i32 %179, 1024
br i1 %180, label %181, label %171
181: ; preds = %178
%182 = add nuw nsw i32 %170, 1
%183 = icmp eq i32 %182, 100
br i1 %183, label %184, label %169
184: ; preds = %181
%185 = tail call i32 (...) @get_current_time()
%186 = sub i32 %185, %168
%187 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([18 x i8], [18 x i8]* @.str.4, i64 0, i64 0), i32 %186)
ret i32 0
}