void powspec2d(float *Fr, float *Fi, float *PS2d, int N1, int N2) {
  int i, j, n, a, b;
  int ind, ind2, *number;
  float val;
  n = (N1 < N2 ? N1 : N2) / 2;
  number = (int *)malloc((n + 1) * sizeof(int));
  for (i = 0; i <= n; i++) {
    PS2d[i] = 0;
    number[i] = 0;
  }
  for (i = 0; i < N1 / 2; i++)
    for (j = 0; j < N2 / 2; j++) {
      a = i;
      b = j;
      ind2 = i + j * N1;
      val = sqrt((float)(a * a + b * b));
      if ((val - floor(val)) < 0.5)
        ind = (int)floor(val);
      else
        ind = (int)ceil(val);
      if (ind > n)
        ind = n;
      PS2d[ind] += Fr[ind2] * Fr[ind2] + Fi[ind2] * Fi[ind2];
      number[ind]++;
    }
  for (i = 0; i < N1 / 2; i++)
    for (j = N2 / 2; j < N2; j++) {
      a = i;
      b = j - N2;
      ind2 = i + j * N1;
      val = sqrt((float)(a * a + b * b));
      if ((val - floor(val)) < 0.5)
        ind = (int)floor(val);
      else
        ind = (int)ceil(val);
      if (ind > n)
        ind = n;
      PS2d[ind] += Fr[ind2] * Fr[ind2] + Fi[ind2] * Fi[ind2];
      number[ind]++;
    }
  for (i = N1 / 2; i < N1; i++)
    for (j = N2 / 2; j < N2; j++) {
      a = i - N1;
      b = j - N2;
      ind2 = i + j * N1;
      val = sqrt((float)(a * a + b * b));
      if ((val - floor(val)) < 0.5)
        ind = (int)floor(val);
      else
        ind = (int)ceil(val);
      if (ind > n)
        ind = n;
      PS2d[ind] += Fr[ind2] * Fr[ind2] + Fi[ind2] * Fi[ind2];
      number[ind]++;
    }
  for (i = N1 / 2; i < N1; i++)
    for (j = 0; j < N2 / 2; j++) {
      a = i - N1;
      b = j;
      ind2 = i + j * N1;
      val = sqrt((float)(a * a + b * b));
      if ((val - floor(val)) < 0.5)
        ind = (int)floor(val);
      else
        ind = (int)ceil(val);
      if (ind > n)
        ind = n;
      PS2d[ind] += Fr[ind2] * Fr[ind2] + Fi[ind2] * Fi[ind2];
      number[ind]++;
    }
  for (i = 0; i <= n; i++) {
    if (number[i] != 0)
      PS2d[i] = (float)(i)*PS2d[i] / (float)number[i];
  }
  free(number);
}


x86 assembly (clang, -O0):
<powspec2d>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    1185 <powspec2d+0x35>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x50(%rbp)
jmp    118b <powspec2d+0x3b>
mov    -0x20(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    -0x50(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
movslq %eax,%rdi
shl    $0x2,%rdi
call   1050 <malloc@plt>
mov    %rax,-0x48(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jg     11ef <powspec2d+0x9f>
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x48(%rbp),%rax
movslq -0x24(%rbp),%rcx
movl   $0x0,(%rax,%rcx,4)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11b6 <powspec2d+0x66>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x1c(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x54(%rbp),%eax
cmp    %ecx,%eax
jge    1372 <powspec2d+0x222>
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    %eax,-0x58(%rbp)
mov    -0x20(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x58(%rbp),%eax
cmp    %ecx,%eax
jge    135f <powspec2d+0x20f>
mov    -0x24(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x28(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x28(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x30(%rbp),%eax
imul   -0x30(%rbp),%eax
mov    -0x34(%rbp),%ecx
imul   -0x34(%rbp),%ecx
add    %ecx,%eax
cvtsi2ss %eax,%xmm0
cvtss2sd %xmm0,%xmm0
call   1060 <sqrt@plt>
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4c(%rbp)
movss  -0x4c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x60(%rbp)
movss  -0x4c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1070 <floor@plt>
movsd  -0x60(%rbp),%xmm1
subsd  %xmm0,%xmm1
movsd  0xd59(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    12cb <powspec2d+0x17b>
movss  -0x4c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1070 <floor@plt>
cvttsd2si %xmm0,%eax
mov    %eax,-0x38(%rbp)
jmp    12e0 <powspec2d+0x190>
movss  -0x4c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1040 <ceil@plt>
cvttsd2si %xmm0,%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jle    12f2 <powspec2d+0x1a2>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm2
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
mulss  (%rax,%rcx,4),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x38(%rbp),%rcx
addss  (%rax,%rcx,4),%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x48(%rbp),%rax
movslq -0x38(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
add    $0x1,%edx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    121b <powspec2d+0xcb>
jmp    1364 <powspec2d+0x214>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11f6 <powspec2d+0xa6>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x64(%rbp)
mov    -0x1c(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x64(%rbp),%eax
cmp    %ecx,%eax
jge    14ed <powspec2d+0x39d>
mov    -0x20(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    14da <powspec2d+0x38a>
mov    -0x24(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x28(%rbp),%eax
sub    -0x20(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x28(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x30(%rbp),%eax
imul   -0x30(%rbp),%eax
mov    -0x34(%rbp),%ecx
imul   -0x34(%rbp),%ecx
add    %ecx,%eax
cvtsi2ss %eax,%xmm0
cvtss2sd %xmm0,%xmm0
call   1060 <sqrt@plt>
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4c(%rbp)
movss  -0x4c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x70(%rbp)
movss  -0x4c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1070 <floor@plt>
movsd  -0x70(%rbp),%xmm1
subsd  %xmm0,%xmm1
movsd  0xbde(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    1446 <powspec2d+0x2f6>
movss  -0x4c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1070 <floor@plt>
cvttsd2si %xmm0,%eax
mov    %eax,-0x38(%rbp)
jmp    145b <powspec2d+0x30b>
movss  -0x4c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1040 <ceil@plt>
cvttsd2si %xmm0,%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jle    146d <powspec2d+0x31d>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm2
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
mulss  (%rax,%rcx,4),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x38(%rbp),%rcx
addss  (%rax,%rcx,4),%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x48(%rbp),%rax
movslq -0x38(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
add    $0x1,%edx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    13a5 <powspec2d+0x255>
jmp    14df <powspec2d+0x38f>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1379 <powspec2d+0x229>
mov    -0x1c(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    1660 <powspec2d+0x510>
mov    -0x20(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    164d <powspec2d+0x4fd>
mov    -0x24(%rbp),%eax
sub    -0x1c(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x28(%rbp),%eax
sub    -0x20(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x28(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x30(%rbp),%eax
imul   -0x30(%rbp),%eax
mov    -0x34(%rbp),%ecx
imul   -0x34(%rbp),%ecx
add    %ecx,%eax
cvtsi2ss %eax,%xmm0
cvtss2sd %xmm0,%xmm0
call   1060 <sqrt@plt>
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4c(%rbp)
movss  -0x4c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x78(%rbp)
movss  -0x4c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1070 <floor@plt>
movsd  -0x78(%rbp),%xmm1
subsd  %xmm0,%xmm1
movsd  0xa6b(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    15b9 <powspec2d+0x469>
movss  -0x4c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1070 <floor@plt>
cvttsd2si %xmm0,%eax
mov    %eax,-0x38(%rbp)
jmp    15ce <powspec2d+0x47e>
movss  -0x4c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1040 <ceil@plt>
cvttsd2si %xmm0,%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jle    15e0 <powspec2d+0x490>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm2
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
mulss  (%rax,%rcx,4),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x38(%rbp),%rcx
addss  (%rax,%rcx,4),%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x48(%rbp),%rax
movslq -0x38(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
add    $0x1,%edx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1515 <powspec2d+0x3c5>
jmp    1652 <powspec2d+0x502>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    14fb <powspec2d+0x3ab>
mov    -0x1c(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    17e1 <powspec2d+0x691>
movl   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    %eax,-0x7c(%rbp)
mov    -0x20(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x7c(%rbp),%eax
cmp    %ecx,%eax
jge    17ce <powspec2d+0x67e>
mov    -0x24(%rbp),%eax
sub    -0x1c(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x28(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x28(%rbp),%ecx
imul   -0x1c(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x30(%rbp),%eax
imul   -0x30(%rbp),%eax
mov    -0x34(%rbp),%ecx
imul   -0x34(%rbp),%ecx
add    %ecx,%eax
cvtsi2ss %eax,%xmm0
cvtss2sd %xmm0,%xmm0
call   1060 <sqrt@plt>
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4c(%rbp)
movss  -0x4c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movss  -0x4c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1070 <floor@plt>
movsd  -0x88(%rbp),%xmm1
ff
subsd  %xmm0,%xmm1
movsd  0x8ea(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    173a <powspec2d+0x5ea>
movss  -0x4c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1070 <floor@plt>
cvttsd2si %xmm0,%eax
mov    %eax,-0x38(%rbp)
jmp    174f <powspec2d+0x5ff>
movss  -0x4c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1040 <ceil@plt>
cvttsd2si %xmm0,%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jle    1761 <powspec2d+0x611>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm2
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
mulss  (%rax,%rcx,4),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x38(%rbp),%rcx
addss  (%rax,%rcx,4),%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x48(%rbp),%rax
movslq -0x38(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
add    $0x1,%edx
mov    %edx,(%rax,%rcx,4)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1681 <powspec2d+0x531>
jmp    17d3 <powspec2d+0x683>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    166e <powspec2d+0x51e>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jg     1849 <powspec2d+0x6f9>
mov    -0x48(%rbp),%rax
movslq -0x24(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
je     1836 <powspec2d+0x6e6>
cvtsi2ssl -0x24(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
mulss  (%rax,%rcx,4),%xmm0
mov    -0x48(%rbp),%rax
movslq -0x24(%rbp),%rcx
cvtsi2ssl (%rax,%rcx,4),%xmm1
divss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    183b <powspec2d+0x6eb>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    17e8 <powspec2d+0x698>
mov    -0x48(%rbp),%rdi
call   1030 <free@plt>
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<powspec2d>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x78,%rsp
mov    %ecx,%ebp
mov    %rdx,0x50(%rsp)
mov    %rsi,0x60(%rsp)
mov    %rdi,0x58(%rsp)
cmp    %r8d,%ecx
mov    %r8d,0x4(%rsp)
mov    %r8d,%ebx
cmovl  %ecx,%ebx
mov    %ebx,%r12d
shr    $0x1f,%r12d
add    %ebx,%r12d
sar    %r12d
movslq %r12d,%rax
lea    0x4(,%rax,4),%rdi
call   1060 <malloc@plt>
mov    %rax,0x28(%rsp)
mov    %ebx,0x74(%rsp)
cmp    $0xffffffff,%ebx
jl     11e1 <powspec2d+0x81>
mov    %r12d,%eax
lea    0x4(,%rax,4),%r15
mov    0x50(%rsp),%rdi
xor    %esi,%esi
mov    %r15,%rdx
call   1050 <memset@plt>
mov    0x28(%rsp),%rdi
xor    %esi,%esi
mov    %r15,%rdx
call   1050 <memset@plt>
mov    %ebp,%eax
shr    $0x1f,%eax
add    %ebp,%eax
sar    %eax
mov    %eax,0x30(%rsp)
mov    %ebp,0x1c(%rsp)
cmp    $0x2,%ebp
jl     14b0 <powspec2d+0x350>
mov    0x4(%rsp),%eax
mov    %eax,%ecx
shr    $0x1f,%ecx
add    %eax,%ecx
sar    %ecx
mov    %rcx,0x48(%rsp)
mov    0x1c(%rsp),%eax
mov    0x30(%rsp),%ecx
mov    %rcx,0x38(%rsp)
mov    %rax,0x40(%rsp)
lea    0x0(,%rax,4),%rax
mov    %rax,0x10(%rsp)
xor    %eax,%eax
mov    %rax,0x8(%rsp)
mov    0x60(%rsp),%rbp
mov    0x58(%rsp),%r15
jmp    1264 <powspec2d+0x104>
nop
mov    0x8(%rsp),%rcx
add    $0x1,%rcx
add    $0x4,%r15
add    $0x4,%rbp
mov    %rcx,%rax
mov    %rcx,0x8(%rsp)
cmp    0x38(%rsp),%rcx
je     1340 <powspec2d+0x1e0>
cmpl   $0x2,0x4(%rsp)
jl     1240 <powspec2d+0xe0>
mov    0x8(%rsp),%rbx
imul   %rbx,%rbx
xor    %r14d,%r14d
xor    %r13d,%r13d
jmp    12c7 <powspec2d+0x167>
nopl   0x0(%rax)
movss  (%r15,%r14,1),%xmm0
movss  0x0(%rbp,%r14,1),%xmm1
mulss  %xmm1,%xmm1
mulss  %xmm0,%xmm0
addss  %xmm1,%xmm0
cltq
mov    0x50(%rsp),%rcx
addss  (%rcx,%rax,4),%xmm0
movss  %xmm0,(%rcx,%rax,4)
mov    0x28(%rsp),%rcx
addl   $0x1,(%rcx,%rax,4)
add    $0x1,%r13
add    0x10(%rsp),%r14
cmp    %r13,0x48(%rsp)
je     1240 <powspec2d+0xe0>
mov    %r13d,%eax
imul   %eax,%eax
add    %ebx,%eax
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
ucomiss 0xd2b(%rip),%xmm0
jb     12f0 <powspec2d+0x190>
sqrtss %xmm0,%xmm0
jmp    12f5 <powspec2d+0x195>
cs nopw 0x0(%rax,%rax,1)
nop
call   1070 <sqrtf@plt>
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,0x20(%rsp)
call   1080 <floor@plt>
movsd  0x20(%rsp),%xmm3
movapd %xmm3,%xmm1
subsd  %xmm0,%xmm1
movsd  0xce6(%rip),%xmm2
ucomisd %xmm1,%xmm2
ja     1329 <powspec2d+0x1c9>
movapd %xmm3,%xmm0
call   1040 <ceil@plt>
cvttsd2si %xmm0,%ecx
mov    %r12d,%eax
cmp    %ecx,%r12d
jl     1280 <powspec2d+0x120>
mov    %ecx,%eax
jmp    1280 <powspec2d+0x120>
cmpl   $0x2,0x1c(%rsp)
jl     14b0 <powspec2d+0x350>
movslq 0x48(%rsp),%rax
mov    0x4(%rsp),%ecx
movslq %ecx,%rdx
mov    %eax,%esi
sub    %ecx,%esi
mov    %esi,0x34(%rsp)
sub    %rax,%rdx
mov    %rdx,0x68(%rsp)
mov    0x40(%rsp),%rdx
imul   %rdx,%rax
mov    0x58(%rsp),%rcx
lea    (%rcx,%rax,4),%rcx
mov    %rcx,0x10(%rsp)
shl    $0x2,%rdx
mov    %rdx,0x40(%rsp)
mov    0x60(%rsp),%rcx
lea    (%rcx,%rax,4),%r15
xor    %eax,%eax
mov    %rax,0x8(%rsp)
jmp    13c6 <powspec2d+0x266>
nopl   0x0(%rax)
mov    0x8(%rsp),%rcx
add    $0x1,%rcx
addq   $0x4,0x10(%rsp)
add    $0x4,%r15
mov    %rcx,%rax
mov    %rcx,0x8(%rsp)
cmp    0x38(%rsp),%rcx
je     14b0 <powspec2d+0x350>
mov    0x48(%rsp),%rax
cmp    0x4(%rsp),%eax
jge    13a0 <powspec2d+0x240>
mov    0x8(%rsp),%rax
mov    %eax,%ebp
imul   %eax,%ebp
mov    0x68(%rsp),%r14
xor    %ebx,%ebx
mov    0x34(%rsp),%r13d
jmp    1439 <powspec2d+0x2d9>
nopl   0x0(%rax)
mov    0x10(%rsp),%rcx
movss  (%rcx,%rbx,1),%xmm0
movss  (%r15,%rbx,1),%xmm1
mulss  %xmm1,%xmm1
mulss  %xmm0,%xmm0
addss  %xmm1,%xmm0
cltq
mov    0x50(%rsp),%rcx
addss  (%rcx,%rax,4),%xmm0
movss  %xmm0,(%rcx,%rax,4)
mov    0x28(%rsp),%rcx
addl   $0x1,(%rcx,%rax,4)
add    $0x1,%r13d
add    0x40(%rsp),%rbx
add    $0xffffffffffffffff,%r14
je     13a0 <powspec2d+0x240>
mov    %r13d,%eax
imul   %r13d,%eax
add    %ebp,%eax
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
ucomiss 0xbb8(%rip),%xmm0
jb     1460 <powspec2d+0x300>
sqrtss %xmm0,%xmm0
jmp    1465 <powspec2d+0x305>
nopl   0x0(%rax,%rax,1)
call   1070 <sqrtf@plt>
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,0x20(%rsp)
call   1080 <floor@plt>
movsd  0x20(%rsp),%xmm3
movapd %xmm3,%xmm1
subsd  %xmm0,%xmm1
movsd  0xb76(%rip),%xmm2
ucomisd %xmm1,%xmm2
ja     1499 <powspec2d+0x339>
movapd %xmm3,%xmm0
call   1040 <ceil@plt>
cvttsd2si %xmm0,%ecx
mov    %r12d,%eax
cmp    %ecx,%r12d
jl     13f0 <powspec2d+0x290>
mov    %ecx,%eax
jmp    13f0 <powspec2d+0x290>
mov    0x1c(%rsp),%edx
mov    0x30(%rsp),%esi
cmp    %edx,%esi
jge    1770 <powspec2d+0x610>
mov    0x4(%rsp),%ecx
mov    %ecx,%eax
shr    $0x1f,%eax
add    %ecx,%eax
sar    %eax
mov    %rax,0x40(%rsp)
cltq
movslq %ecx,%rdi
movslq %edx,%rdx
movslq %esi,%rsi
mov    %eax,%ebp
sub    %ecx,%ebp
mov    %ebp,0x34(%rsp)
sub    %rax,%rdi
mov    %rdi,0x68(%rsp)
imul   %rdx,%rax
mov    %rsi,0x8(%rsp)
add    %rsi,%rax
mov    0x58(%rsp),%rcx
lea    (%rcx,%rax,4),%rcx
mov    %rcx,0x10(%rsp)
mov    %rdx,0x38(%rsp)
lea    0x0(,%rdx,4),%rcx
mov    %rcx,0x48(%rsp)
mov    0x60(%rsp),%rcx
lea    (%rcx,%rax,4),%r13
jmp    1553 <powspec2d+0x3f3>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    0x8(%rsp),%rax
add    $0x1,%rax
addq   $0x4,0x10(%rsp)
add    $0x4,%r13
mov    %rax,0x8(%rsp)
cmp    0x38(%rsp),%rax
je     1640 <powspec2d+0x4e0>
mov    0x40(%rsp),%rax
cmp    0x4(%rsp),%eax
jge    1530 <powspec2d+0x3d0>
mov    0x8(%rsp),%rax
mov    %eax,%r14d
sub    0x1c(%rsp),%r14d
imul   %r14d,%r14d
mov    0x68(%rsp),%rbx
xor    %ebp,%ebp
mov    0x34(%rsp),%r15d
jmp    15ca <powspec2d+0x46a>
nopl   (%rax)
mov    0x10(%rsp),%rcx
movss  (%rcx,%rbp,1),%xmm0
movss  0x0(%r13,%rbp,1),%xmm1
mulss  %xmm1,%xmm1
mulss  %xmm0,%xmm0
addss  %xmm1,%xmm0
cltq
mov    0x50(%rsp),%rcx
addss  (%rcx,%rax,4),%xmm0
movss  %xmm0,(%rcx,%rax,4)
mov    0x28(%rsp),%rcx
addl   $0x1,(%rcx,%rax,4)
add    $0x1,%r15d
add    0x48(%rsp),%rbp
add    $0xffffffffffffffff,%rbx
je     1530 <powspec2d+0x3d0>
mov    %r15d,%eax
imul   %r15d,%eax
add    %r14d,%eax
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
ucomiss 0xa26(%rip),%xmm0
jb     15f0 <powspec2d+0x490>
sqrtss %xmm0,%xmm0
jmp    15f5 <powspec2d+0x495>
nopw   0x0(%rax,%rax,1)
call   1070 <sqrtf@plt>
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,0x20(%rsp)
call   1080 <floor@plt>
movsd  0x20(%rsp),%xmm3
movapd %xmm3,%xmm1
subsd  %xmm0,%xmm1
movsd  0x9e6(%rip),%xmm2
ucomisd %xmm1,%xmm2
ja     1629 <powspec2d+0x4c9>
movapd %xmm3,%xmm0
call   1040 <ceil@plt>
cvttsd2si %xmm0,%ecx
mov    %r12d,%eax
cmp    %ecx,%r12d
jl     1580 <powspec2d+0x420>
mov    %ecx,%eax
jmp    1580 <powspec2d+0x420>
mov    0x30(%rsp),%eax
cmp    0x1c(%rsp),%eax
jge    1770 <powspec2d+0x610>
movslq %eax,%rcx
mov    0x58(%rsp),%rax
lea    (%rax,%rcx,4),%r14
mov    0x60(%rsp),%rax
mov    %rcx,0x10(%rsp)
lea    (%rax,%rcx,4),%r15
jmp    1691 <powspec2d+0x531>
nopw   0x0(%rax,%rax,1)
mov    0x10(%rsp),%rax
add    $0x1,%rax
add    $0x4,%r14
add    $0x4,%r15
mov    %rax,0x10(%rsp)
cmp    0x38(%rsp),%rax
je     1770 <powspec2d+0x610>
cmpl   $0x2,0x4(%rsp)
jl     1670 <powspec2d+0x510>
mov    0x10(%rsp),%r13
sub    0x38(%rsp),%r13
imul   %r13,%r13
xor    %ebx,%ebx
xor    %ebp,%ebp
jmp    16f6 <powspec2d+0x596>
nopl   0x0(%rax)
movss  (%r14,%rbx,1),%xmm0
movss  (%r15,%rbx,1),%xmm1
mulss  %xmm1,%xmm1
mulss  %xmm0,%xmm0
addss  %xmm1,%xmm0
cltq
mov    0x50(%rsp),%rcx
addss  (%rcx,%rax,4),%xmm0
movss  %xmm0,(%rcx,%rax,4)
mov    0x28(%rsp),%rcx
addl   $0x1,(%rcx,%rax,4)
add    $0x1,%rbp
add    0x48(%rsp),%rbx
cmp    %rbp,0x40(%rsp)
je     1670 <powspec2d+0x510>
mov    %ebp,%eax
imul   %eax,%eax
add    %r13d,%eax
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
ucomiss 0x8fc(%rip),%xmm0
jb     1720 <powspec2d+0x5c0>
sqrtss %xmm0,%xmm0
jmp    1725 <powspec2d+0x5c5>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
call   1070 <sqrtf@plt>
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,0x20(%rsp)
call   1080 <floor@plt>
movsd  0x20(%rsp),%xmm3
movapd %xmm3,%xmm1
subsd  %xmm0,%xmm1
movsd  0x8b6(%rip),%xmm2
ucomisd %xmm1,%xmm2
ja     1759 <powspec2d+0x5f9>
movapd %xmm3,%xmm0
call   1040 <ceil@plt>
cvttsd2si %xmm0,%ecx
mov    %r12d,%eax
cmp    %ecx,%r12d
jl     16b0 <powspec2d+0x550>
mov    %ecx,%eax
jmp    16b0 <powspec2d+0x550>
cmpl   $0xffffffff,0x74(%rsp)
jge    178f <powspec2d+0x62f>
mov    0x28(%rsp),%rdi
add    $0x78,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1030 <free@plt>
add    $0x1,%r12d
mov    %r12d,%eax
xor    %ecx,%ecx
jmp    17a9 <powspec2d+0x649>
nopw   0x0(%rax,%rax,1)
add    $0x1,%rcx
cmp    %rcx,%rax
je     1777 <powspec2d+0x617>
mov    0x28(%rsp),%rdx
mov    (%rdx,%rcx,4),%edx
test   %edx,%edx
je     17a0 <powspec2d+0x640>
xorps  %xmm0,%xmm0
cvtsi2ss %ecx,%xmm0
xorps  %xmm1,%xmm1
cvtsi2ss %edx,%xmm1
mov    0x50(%rsp),%rdx
mulss  (%rdx,%rcx,4),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,(%rdx,%rcx,4)
jmp    17a0 <powspec2d+0x640>

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

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