void cdft2d_sub(int n1, int n2, int isgn, double **a, double *t, int *ip,
                double *w) {
  void cdft(int n, int isgn, double *a, int *ip, double *w);
  int i, j;
  if (n2 > 4) {
    for (j = 0; j < n2; j += 8) {
      for (i = 0; i < n1; i++) {
        t[2 * i] = a[i][j];
        t[2 * i + 1] = a[i][j + 1];
        t[2 * n1 + 2 * i] = a[i][j + 2];
        t[2 * n1 + 2 * i + 1] = a[i][j + 3];
        t[4 * n1 + 2 * i] = a[i][j + 4];
        t[4 * n1 + 2 * i + 1] = a[i][j + 5];
        t[6 * n1 + 2 * i] = a[i][j + 6];
        t[6 * n1 + 2 * i + 1] = a[i][j + 7];
      }
      cdft(2 * n1, isgn, t, ip, w);
      cdft(2 * n1, isgn, &t[2 * n1], ip, w);
      cdft(2 * n1, isgn, &t[4 * n1], ip, w);
      cdft(2 * n1, isgn, &t[6 * n1], ip, w);
      for (i = 0; i < n1; i++) {
        a[i][j] = t[2 * i];
        a[i][j + 1] = t[2 * i + 1];
        a[i][j + 2] = t[2 * n1 + 2 * i];
        a[i][j + 3] = t[2 * n1 + 2 * i + 1];
        a[i][j + 4] = t[4 * n1 + 2 * i];
        a[i][j + 5] = t[4 * n1 + 2 * i + 1];
        a[i][j + 6] = t[6 * n1 + 2 * i];
        a[i][j + 7] = t[6 * n1 + 2 * i + 1];
      }
    }
  } else if (n2 == 4) {
    for (i = 0; i < n1; i++) {
      t[2 * i] = a[i][0];
      t[2 * i + 1] = a[i][1];
      t[2 * n1 + 2 * i] = a[i][2];
      t[2 * n1 + 2 * i + 1] = a[i][3];
    }
    cdft(2 * n1, isgn, t, ip, w);
    cdft(2 * n1, isgn, &t[2 * n1], ip, w);
    for (i = 0; i < n1; i++) {
      a[i][0] = t[2 * i];
      a[i][1] = t[2 * i + 1];
      a[i][2] = t[2 * n1 + 2 * i];
      a[i][3] = t[2 * n1 + 2 * i + 1];
    }
  } else if (n2 == 2) {
    for (i = 0; i < n1; i++) {
      t[2 * i] = a[i][0];
      t[2 * i + 1] = a[i][1];
    }
    cdft(2 * n1, isgn, t, ip, w);
    for (i = 0; i < n1; i++) {
      a[i][0] = t[2 * i];
      a[i][1] = t[2 * i + 1];
    }
  }
}


x86 assembly (clang, -O0):
<cdft2d_sub>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9,-0x28(%rbp)
cmpl   $0x4,-0x8(%rbp)
jle    1561 <cdft2d_sub+0x451>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    155c <cdft2d_sub+0x44c>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1302 <cdft2d_sub+0x1f2>
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x30(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x4(%rbp),%ecx
shl    $0x1,%ecx
mov    -0x2c(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x30(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x4(%rbp),%ecx
shl    $0x1,%ecx
mov    -0x2c(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x30(%rbp),%ecx
add    $0x4,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x4(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x2c(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x30(%rbp),%ecx
add    $0x5,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x4(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x2c(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x30(%rbp),%ecx
add    $0x6,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
imul   $0x6,-0x4(%rbp),%ecx
mov    -0x2c(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x30(%rbp),%ecx
add    $0x7,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
imul   $0x6,-0x4(%rbp),%ecx
mov    -0x2c(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1155 <cdft2d_sub+0x45>
mov    -0x4(%rbp),%edi
shl    $0x1,%edi
mov    -0xc(%rbp),%esi
mov    -0x20(%rbp),%rdx
mov    -0x28(%rbp),%rcx
mov    0x10(%rbp),%r8
call   1030 <cdft@plt>
mov    -0x4(%rbp),%edi
shl    $0x1,%edi
mov    -0xc(%rbp),%esi
mov    -0x20(%rbp),%rdx
mov    -0x4(%rbp),%eax
shl    $0x1,%eax
cltq
shl    $0x3,%rax
add    %rax,%rdx
mov    -0x28(%rbp),%rcx
mov    0x10(%rbp),%r8
call   1030 <cdft@plt>
mov    -0x4(%rbp),%edi
shl    $0x1,%edi
mov    -0xc(%rbp),%esi
mov    -0x20(%rbp),%rdx
mov    -0x4(%rbp),%eax
shl    $0x2,%eax
cltq
shl    $0x3,%rax
add    %rax,%rdx
mov    -0x28(%rbp),%rcx
mov    0x10(%rbp),%r8
call   1030 <cdft@plt>
mov    -0x4(%rbp),%edi
shl    $0x1,%edi
mov    -0xc(%rbp),%esi
mov    -0x20(%rbp),%rdx
imul   $0x6,-0x4(%rbp),%eax
cltq
shl    $0x3,%rax
add    %rax,%rdx
mov    -0x28(%rbp),%rcx
mov    0x10(%rbp),%r8
call   1030 <cdft@plt>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1549 <cdft2d_sub+0x439>
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x20(%rbp),%rax
mov    -0x4(%rbp),%ecx
shl    $0x1,%ecx
mov    -0x2c(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x30(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x20(%rbp),%rax
mov    -0x4(%rbp),%ecx
shl    $0x1,%ecx
mov    -0x2c(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x30(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x20(%rbp),%rax
mov    -0x4(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x2c(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x30(%rbp),%ecx
add    $0x4,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x20(%rbp),%rax
mov    -0x4(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x2c(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x30(%rbp),%ecx
add    $0x5,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x20(%rbp),%rax
imul   $0x6,-0x4(%rbp),%ecx
mov    -0x2c(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x30(%rbp),%ecx
add    $0x6,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x20(%rbp),%rax
imul   $0x6,-0x4(%rbp),%ecx
mov    -0x2c(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x30(%rbp),%ecx
add    $0x7,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    139c <cdft2d_sub+0x28c>
jmp    154e <cdft2d_sub+0x43e>
mov    -0x30(%rbp),%eax
add    $0x8,%eax
mov    %eax,-0x30(%rbp)
jmp    1142 <cdft2d_sub+0x32>
jmp    183c <cdft2d_sub+0x72c>
cmpl   $0x4,-0x8(%rbp)
jne    1737 <cdft2d_sub+0x627>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    162d <cdft2d_sub+0x51d>
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  (%rax),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  0x8(%rax),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  0x10(%rax),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x4(%rbp),%ecx
shl    $0x1,%ecx
mov    -0x2c(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  0x18(%rax),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x4(%rbp),%ecx
shl    $0x1,%ecx
mov    -0x2c(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1572 <cdft2d_sub+0x462>
mov    -0x4(%rbp),%edi
shl    $0x1,%edi
mov    -0xc(%rbp),%esi
mov    -0x20(%rbp),%rdx
mov    -0x28(%rbp),%rcx
mov    0x10(%rbp),%r8
call   1030 <cdft@plt>
mov    -0x4(%rbp),%edi
shl    $0x1,%edi
mov    -0xc(%rbp),%esi
mov    -0x20(%rbp),%rdx
mov    -0x4(%rbp),%eax
shl    $0x1,%eax
cltq
shl    $0x3,%rax
add    %rax,%rdx
mov    -0x28(%rbp),%rcx
mov    0x10(%rbp),%r8
call   1030 <cdft@plt>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1732 <cdft2d_sub+0x622>
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x20(%rbp),%rax
mov    -0x4(%rbp),%ecx
shl    $0x1,%ecx
mov    -0x2c(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x20(%rbp),%rax
mov    -0x4(%rbp),%ecx
shl    $0x1,%ecx
mov    -0x2c(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  %xmm0,0x18(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1677 <cdft2d_sub+0x567>
jmp    1837 <cdft2d_sub+0x727>
cmpl   $0x2,-0x8(%rbp)
jne    1832 <cdft2d_sub+0x722>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    17aa <cdft2d_sub+0x69a>
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  (%rax),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  0x8(%rax),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1748 <cdft2d_sub+0x638>
mov    -0x4(%rbp),%edi
shl    $0x1,%edi
mov    -0xc(%rbp),%esi
mov    -0x20(%rbp),%rdx
mov    -0x28(%rbp),%rcx
mov    0x10(%rbp),%r8
call   1030 <cdft@plt>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    182d <cdft2d_sub+0x71d>
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    17cb <cdft2d_sub+0x6bb>
jmp    1832 <cdft2d_sub+0x722>
jmp    1837 <cdft2d_sub+0x727>
jmp    183c <cdft2d_sub+0x72c>
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<cdft2d_sub>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x98,%rsp
mov    %r9,0x8(%rsp)
mov    %r8,%r13
mov    %edx,0x4(%rsp)
mov    %edi,%r10d
mov    0xd0(%rsp),%rax
mov    %rax,0x10(%rsp)
cmp    $0x5,%esi
mov    %rcx,0x18(%rsp)
mov    %r10,0x28(%rsp)
jl     14d3 <cdft2d_sub+0x3c3>
lea    0x0(,%r10,4),%ebp
lea    (%r10,%r10,1),%edi
lea    (%rdi,%rdi,2),%eax
movslq %edi,%rdx
lea    0x0(,%rdx,8),%rbx
add    %r13,%rbx
movslq %ebp,%rbp
lea    0x0(%r13,%rbp,8),%rdx
mov    %rdx,0x40(%rsp)
movslq %eax,%rdx
lea    0x0(,%rdx,8),%r8
add    %r13,%r8
mov    %r10d,%eax
lea    0x8(,%rbp,8),%r14
add    %r13,%r14
shl    $0x20,%rdx
mov    %rdx,0x50(%rsp)
lea    (%rax,%rax,1),%rdx
mov    %rdx,0x80(%rsp)
shl    $0x3,%rax
mov    %rax,0x88(%rsp)
xor    %r11d,%r11d
mov    %esi,0x3c(%rsp)
mov    %rdi,0x30(%rsp)
mov    %r8,0x20(%rsp)
mov    %rbx,0x48(%rsp)
jmp    126a <cdft2d_sub+0x15a>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    0x4(%rsp),%r12d
mov    %r12d,%esi
mov    %r13,%rdx
mov    0x8(%rsp),%rbp
mov    %rbp,%rcx
mov    0x10(%rsp),%r15
mov    %r15,%r8
mov    %rdi,%rbx
call   1030 <cdft@plt>
mov    %ebx,%edi
mov    %r12d,%esi
mov    0x48(%rsp),%rdx
mov    %rbp,%rcx
mov    %r15,%r8
call   1030 <cdft@plt>
mov    %ebx,%edi
mov    %r12d,%esi
mov    0x40(%rsp),%rdx
mov    %rbp,%rcx
mov    %r15,%r8
call   1030 <cdft@plt>
mov    %ebx,%edi
mov    %r12d,%esi
mov    0x20(%rsp),%rdx
mov    %rbp,%rcx
mov    %r15,%r8
call   1030 <cdft@plt>
mov    0x20(%rsp),%r8
mov    0x28(%rsp),%r10
mov    0x18(%rsp),%rcx
mov    0x58(%rsp),%r11
add    $0x8,%r11
cmp    0x3c(%rsp),%r11d
mov    0x30(%rsp),%rdi
jge    1773 <cdft2d_sub+0x663>
test   %r10d,%r10d
mov    %r11,0x58(%rsp)
jle    11e0 <cdft2d_sub+0xd0>
mov    %r11,%r10
or     $0x1,%r10
mov    %r11,%rax
or     $0x2,%rax
mov    %rax,0x78(%rsp)
mov    %r11,%rax
or     $0x3,%rax
mov    %rax,0x70(%rsp)
mov    %r11,%rax
or     $0x4,%rax
mov    %rax,0x68(%rsp)
mov    %r11,%rax
or     $0x5,%rax
mov    %rax,0x60(%rsp)
mov    %r11,%r15
or     $0x6,%r15
mov    %r11,%r12
or     $0x7,%r12
mov    0x50(%rsp),%rax
xor    %ebx,%ebx
mov    0x80(%rsp),%rbp
nopl   0x0(%rax)
mov    (%rcx,%rbx,4),%rdx
movsd  (%rdx,%r11,8),%xmm0
movsd  %xmm0,0x0(%r13,%rbx,8)
movsd  (%rdx,%r10,8),%xmm0
movsd  %xmm0,0x8(%r13,%rbx,8)
mov    0x78(%rsp),%rsi
movsd  (%rdx,%rsi,8),%xmm0
lea    (%rdi,%rbx,1),%rsi
movslq %esi,%rsi
movsd  %xmm0,0x0(%r13,%rsi,8)
mov    0x70(%rsp),%r9
movsd  (%rdx,%r9,8),%xmm0
add    $0x1,%esi
movslq %esi,%rsi
movsd  %xmm0,0x0(%r13,%rsi,8)
mov    0x68(%rsp),%rsi
movsd  (%rdx,%rsi,8),%xmm0
movsd  %xmm0,-0x8(%r14,%rbx,8)
mov    0x60(%rsp),%rsi
movsd  (%rdx,%rsi,8),%xmm0
movsd  %xmm0,(%r14,%rbx,8)
movsd  (%rdx,%r15,8),%xmm0
movsd  %xmm0,(%r8,%rbx,8)
movsd  (%rdx,%r12,8),%xmm0
mov    %rax,%rdx
sar    $0x1d,%rdx
or     $0x8,%rdx
movsd  %xmm0,0x0(%r13,%rdx,1)
add    $0x2,%rbx
movabs $0x200000000,%rdx
add    %rdx,%rax
cmp    %rbx,%rbp
jne    12d0 <cdft2d_sub+0x1c0>
mov    0x4(%rsp),%ebx
mov    %ebx,%esi
mov    %r13,%rdx
mov    0x8(%rsp),%rcx
mov    %r10,0x90(%rsp)
mov    0x10(%rsp),%r8
mov    %rdi,%rbp
call   1030 <cdft@plt>
mov    %ebp,%edi
mov    %ebx,%esi
mov    0x48(%rsp),%rbx
mov    %rbx,%rdx
mov    0x8(%rsp),%rcx
mov    0x10(%rsp),%rbp
mov    %rbp,%r8
call   1030 <cdft@plt>
mov    0x30(%rsp),%rdi
mov    0x4(%rsp),%esi
mov    0x40(%rsp),%rdx
mov    0x8(%rsp),%rcx
mov    %rbp,%r8
call   1030 <cdft@plt>
mov    0x30(%rsp),%rdi
mov    0x4(%rsp),%esi
mov    0x20(%rsp),%rdx
mov    0x8(%rsp),%rcx
mov    %rbp,%r8
call   1030 <cdft@plt>
mov    0x20(%rsp),%r8
mov    0x18(%rsp),%rcx
mov    0x28(%rsp),%r10
test   %r10d,%r10d
mov    0x88(%rsp),%r11
mov    0x68(%rsp),%r9
mov    0x60(%rsp),%rbp
jle    1251 <cdft2d_sub+0x141>
mov    0x50(%rsp),%rax
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
nop
movsd  0x0(%r13,%rdi,2),%xmm0
mov    (%rcx,%rdi,1),%rdx
mov    0x58(%rsp),%rsi
movsd  %xmm0,(%rdx,%rsi,8)
movsd  0x8(%r13,%rdi,2),%xmm0
mov    0x90(%rsp),%rsi
movsd  %xmm0,(%rdx,%rsi,8)
movsd  (%rbx,%rdi,2),%xmm0
mov    0x78(%rsp),%rsi
movsd  %xmm0,(%rdx,%rsi,8)
movsd  0x8(%rbx,%rdi,2),%xmm0
mov    0x70(%rsp),%rsi
movsd  %xmm0,(%rdx,%rsi,8)
movsd  -0x8(%r14,%rdi,2),%xmm0
movsd  %xmm0,(%rdx,%r9,8)
movsd  (%r14,%rdi,2),%xmm0
movsd  %xmm0,(%rdx,%rbp,8)
movsd  (%r8,%rdi,2),%xmm0
movsd  %xmm0,(%rdx,%r15,8)
mov    %rax,%rsi
sar    $0x1d,%rsi
or     $0x8,%rsi
movsd  0x0(%r13,%rsi,1),%xmm0
movsd  %xmm0,(%rdx,%r12,8)
add    $0x8,%rdi
movabs $0x200000000,%rdx
add    %rdx,%rax
cmp    %rdi,%r11
jne    1430 <cdft2d_sub+0x320>
jmp    1251 <cdft2d_sub+0x141>
cmp    $0x4,%esi
je     15fa <cdft2d_sub+0x4ea>
cmp    $0x2,%esi
jne    1773 <cdft2d_sub+0x663>
test   %r10d,%r10d
jle    170b <cdft2d_sub+0x5fb>
mov    %r10d,%r14d
mov    %r14,%r15
add    $0xffffffffffffffff,%r15
je     1738 <cdft2d_sub+0x628>
mov    %r14d,%edi
and    $0xfffffffe,%edi
lea    0x18(%r13),%rdx
xor    %eax,%eax
nopw   0x0(%rax,%rax,1)
mov    (%rcx,%rax,8),%rsi
movsd  (%rsi),%xmm0
movsd  %xmm0,-0x18(%rdx)
movsd  0x8(%rsi),%xmm0
movsd  %xmm0,-0x10(%rdx)
mov    0x8(%rcx,%rax,8),%rsi
movsd  (%rsi),%xmm0
movsd  %xmm0,-0x8(%rdx)
movsd  0x8(%rsi),%xmm0
movsd  %xmm0,(%rdx)
add    $0x2,%rax
add    $0x20,%rdx
cmp    %rax,%rdi
jne    1510 <cdft2d_sub+0x400>
test   $0x1,%r14b
je     1570 <cdft2d_sub+0x460>
mov    (%rcx,%rax,8),%rcx
movsd  (%rcx),%xmm0
shl    $0x4,%rax
movsd  %xmm0,0x0(%r13,%rax,1)
movsd  0x8(%rcx),%xmm0
movsd  %xmm0,0x8(%r13,%rax,1)
lea    (%r10,%r10,1),%edi
mov    0x4(%rsp),%esi
mov    %r13,%rdx
mov    0x8(%rsp),%rcx
mov    %r10,%rbp
mov    0x10(%rsp),%r8
call   1030 <cdft@plt>
mov    0x18(%rsp),%rdi
test   %ebp,%ebp
jle    1773 <cdft2d_sub+0x663>
test   %r15,%r15
je     1749 <cdft2d_sub+0x639>
mov    %r14d,%ecx
and    $0xfffffffe,%ecx
lea    0x18(%r13),%rdx
xor    %eax,%eax
nop
movsd  -0x18(%rdx),%xmm0
mov    (%rdi,%rax,8),%rsi
movsd  %xmm0,(%rsi)
movsd  -0x10(%rdx),%xmm0
movsd  %xmm0,0x8(%rsi)
movsd  -0x8(%rdx),%xmm0
mov    0x8(%rdi,%rax,8),%rsi
movsd  %xmm0,(%rsi)
movsd  (%rdx),%xmm0
movsd  %xmm0,0x8(%rsi)
add    $0x2,%rax
add    $0x20,%rdx
cmp    %rax,%rcx
jne    15b0 <cdft2d_sub+0x4a0>
test   $0x1,%r14b
jne    1751 <cdft2d_sub+0x641>
jmp    1773 <cdft2d_sub+0x663>
test   %r10d,%r10d
jle    1658 <cdft2d_sub+0x548>
mov    %r10d,%eax
lea    (%r10,%r10,1),%edi
shl    $0x3,%rax
xor    %edx,%edx
nopl   0x0(%rax)
mov    (%rcx,%rdx,1),%rsi
movsd  (%rsi),%xmm0
movsd  %xmm0,0x0(%r13,%rdx,2)
movsd  0x8(%rsi),%xmm0
movsd  %xmm0,0x8(%r13,%rdx,2)
movsd  0x10(%rsi),%xmm0
movslq %edi,%rdi
movsd  %xmm0,0x0(%r13,%rdi,8)
movsd  0x18(%rsi),%xmm0
lea    0x1(%rdi),%esi
movslq %esi,%rsi
movsd  %xmm0,0x0(%r13,%rsi,8)
add    $0x2,%edi
add    $0x8,%rdx
cmp    %rdx,%rax
jne    1610 <cdft2d_sub+0x500>
lea    (%r10,%r10,1),%r15d
mov    %r15d,%edi
mov    0x4(%rsp),%r12d
mov    %r12d,%esi
mov    %r13,%rdx
mov    0x8(%rsp),%r14
mov    %r14,%rcx
mov    0x10(%rsp),%rbp
mov    %rbp,%r8
call   1030 <cdft@plt>
movslq %r15d,%r15
lea    0x0(,%r15,8),%rdx
add    %r13,%rdx
mov    %r15d,%edi
mov    %r12d,%esi
mov    %r14,%rcx
mov    %rbp,%r8
call   1030 <cdft@plt>
mov    0x28(%rsp),%rax
mov    0x18(%rsp),%rdi
test   %eax,%eax
jle    1773 <cdft2d_sub+0x663>
mov    %eax,%eax
lea    0x8(,%r15,8),%rcx
add    %r13,%rcx
add    $0x8,%r13
shl    $0x3,%rax
xor    %edx,%edx
nopw   0x0(%rax,%rax,1)
movsd  -0x8(%r13,%rdx,2),%xmm0
mov    (%rdi,%rdx,1),%rsi
movsd  %xmm0,(%rsi)
movsd  0x0(%r13,%rdx,2),%xmm0
movsd  %xmm0,0x8(%rsi)
movsd  -0x8(%rcx,%rdx,2),%xmm0
movsd  %xmm0,0x10(%rsi)
movsd  (%rcx,%rdx,2),%xmm0
movsd  %xmm0,0x18(%rsi)
add    $0x8,%rdx
cmp    %rdx,%rax
jne    16d0 <cdft2d_sub+0x5c0>
jmp    1773 <cdft2d_sub+0x663>
add    %r10d,%r10d
mov    %r10d,%edi
mov    0x4(%rsp),%esi
mov    %r13,%rdx
mov    0x8(%rsp),%rcx
mov    0x10(%rsp),%r8
add    $0x98,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1030 <cdft@plt>
xor    %eax,%eax
test   $0x1,%r14b
jne    1551 <cdft2d_sub+0x441>
jmp    1570 <cdft2d_sub+0x460>
xor    %eax,%eax
test   $0x1,%r14b
je     1773 <cdft2d_sub+0x663>
mov    %rax,%rcx
shl    $0x4,%rcx
movsd  0x0(%r13,%rcx,1),%xmm0
mov    (%rdi,%rax,8),%rax
movsd  %xmm0,(%rax)
movsd  0x8(%r13,%rcx,1),%xmm0
movsd  %xmm0,0x8(%rax)
add    $0x98,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @cdft2d_sub(i32 %0, i32 %1, i32 %2, double** nocapture %3, double* %4, i32* %5, double* %6) {
%8 = icmp sgt i32 %1, 4
br i1 %8, label %9, label %130
9: ; preds = %7
%10 = icmp sgt i32 %0, 0
%11 = shl nsw i32 %0, 2
%12 = mul nsw i32 %0, 6
%13 = shl nsw i32 %0, 1
%14 = sext i32 %13 to i64
%15 = getelementptr inbounds double, double* %4, i64 %14
%16 = sext i32 %11 to i64
%17 = getelementptr inbounds double, double* %4, i64 %16
%18 = sext i32 %12 to i64
%19 = getelementptr inbounds double, double* %4, i64 %18
%20 = zext i32 %0 to i64
%21 = zext i32 %0 to i64
br label %22
22: ; preds = %9, %126
%23 = phi i64 [ 0, %9 ], [ %127, %126 ]
br i1 %10, label %24, label %125
24: ; preds = %22
%25 = or i64 %23, 1
%26 = or i64 %23, 2
%27 = or i64 %23, 3
%28 = or i64 %23, 4
%29 = or i64 %23, 5
%30 = or i64 %23, 6
%31 = or i64 %23, 7
br label %32
32: ; preds = %24, %32
%33 = phi i64 [ 0, %24 ], [ %74, %32 ]
%34 = trunc i64 %33 to i32
%35 = getelementptr inbounds double*, double** %3, i64 %33
%36 = load double*, double** %35
%37 = getelementptr inbounds double, double* %36, i64 %23
%38 = load double, double* %37
%39 = shl nuw nsw i64 %33, 1
%40 = getelementptr inbounds double, double* %4, i64 %39
store double %38, double* %40
%41 = getelementptr inbounds double, double* %36, i64 %25
%42 = load double, double* %41
%43 = or i64 %39, 1
%44 = getelementptr inbounds double, double* %4, i64 %43
store double %42, double* %44
%45 = getelementptr inbounds double, double* %36, i64 %26
%46 = load double, double* %45
%47 = add nsw i32 %34, %0
%48 = shl nsw i32 %47, 1
%49 = sext i32 %48 to i64
%50 = getelementptr inbounds double, double* %4, i64 %49
store double %46, double* %50
%51 = getelementptr inbounds double, double* %36, i64 %27
%52 = load double, double* %51
%53 = or i32 %48, 1
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds double, double* %4, i64 %54
store double %52, double* %55
%56 = getelementptr inbounds double, double* %36, i64 %28
%57 = load double, double* %56
%58 = add nsw i64 %39, %16
%59 = getelementptr inbounds double, double* %4, i64 %58
store double %57, double* %59
%60 = getelementptr inbounds double, double* %36, i64 %29
%61 = load double, double* %60
%62 = or i64 %58, 1
%63 = getelementptr inbounds double, double* %4, i64 %62
store double %61, double* %63
%64 = getelementptr inbounds double, double* %36, i64 %30
%65 = load double, double* %64
%66 = add nsw i64 %39, %18
%67 = getelementptr inbounds double, double* %4, i64 %66
store double %65, double* %67
%68 = getelementptr inbounds double, double* %36, i64 %31
%69 = load double, double* %68
%70 = shl i64 %66, 32
%71 = ashr exact i64 %70, 32
%72 = or i64 %71, 1
%73 = getelementptr inbounds double, double* %4, i64 %72
store double %69, double* %73
%74 = add nuw nsw i64 %33, 1
%75 = icmp eq i64 %74, %20
br i1 %75, label %76, label %32
76: ; preds = %32
tail call void @cdft(i32 %13, i32 %2, double* %4, i32* %5, double* %6)
tail call void @cdft(i32 %13, i32 %2, double* %15, i32* %5, double* %6)
tail call void @cdft(i32 %13, i32 %2, double* %17, i32* %5, double* %6)
tail call void @cdft(i32 %13, i32 %2, double* %19, i32* %5, double* %6)
br i1 %10, label %77, label %126
77: ; preds = %76
%78 = or i64 %23, 1
%79 = or i64 %23, 2
%80 = or i64 %23, 3
%81 = or i64 %23, 4
%82 = or i64 %23, 5
%83 = or i64 %23, 6
%84 = or i64 %23, 7
br label %85
85: ; preds = %77, %85
%86 = phi i64 [ 0, %77 ], [ %123, %85 ]
%87 = shl nuw nsw i64 %86, 1
%88 = getelementptr inbounds double, double* %4, i64 %87
%89 = load double, double* %88
%90 = getelementptr inbounds double*, double** %3, i64 %86
%91 = load double*, double** %90
%92 = getelementptr inbounds double, double* %91, i64 %23
store double %89, double* %92
%93 = or i64 %87, 1
%94 = getelementptr inbounds double, double* %4, i64 %93
%95 = load double, double* %94
%96 = getelementptr inbounds double, double* %91, i64 %78
store double %95, double* %96
%97 = add nsw i64 %87, %14
%98 = getelementptr inbounds double, double* %4, i64 %97
%99 = load double, double* %98
%100 = getelementptr inbounds double, double* %91, i64 %79
store double %99, double* %100
%101 = or i64 %97, 1
%102 = getelementptr inbounds double, double* %4, i64 %101
%103 = load double, double* %102
%104 = getelementptr inbounds double, double* %91, i64 %80
store double %103, double* %104
%105 = add nsw i64 %87, %16
%106 = getelementptr inbounds double, double* %4, i64 %105
%107 = load double, double* %106
%108 = getelementptr inbounds double, double* %91, i64 %81
store double %107, double* %108
%109 = or i64 %105, 1
%110 = getelementptr inbounds double, double* %4, i64 %109
%111 = load double, double* %110
%112 = getelementptr inbounds double, double* %91, i64 %82
store double %111, double* %112
%113 = add nsw i64 %87, %18
%114 = getelementptr inbounds double, double* %4, i64 %113
%115 = load double, double* %114
%116 = getelementptr inbounds double, double* %91, i64 %83
store double %115, double* %116
%117 = shl i64 %113, 32
%118 = ashr exact i64 %117, 32
%119 = or i64 %118, 1
%120 = getelementptr inbounds double, double* %4, i64 %119
%121 = load double, double* %120
%122 = getelementptr inbounds double, double* %91, i64 %84
store double %121, double* %122
%123 = add nuw nsw i64 %86, 1
%124 = icmp eq i64 %123, %21
br i1 %124, label %126, label %85
125: ; preds = %22
tail call void @cdft(i32 %13, i32 %2, double* %4, i32* %5, double* %6)
tail call void @cdft(i32 %13, i32 %2, double* %15, i32* %5, double* %6)
tail call void @cdft(i32 %13, i32 %2, double* %17, i32* %5, double* %6)
tail call void @cdft(i32 %13, i32 %2, double* %19, i32* %5, double* %6)
br label %126
126: ; preds = %85, %125, %76
%127 = add nuw i64 %23, 8
%128 = trunc i64 %127 to i32
%129 = icmp slt i32 %128, %1
br i1 %129, label %22, label %282
130: ; preds = %7
switch i32 %1, label %282 [
i32 4, label %142
i32 2, label %131
]
131: ; preds = %130
%132 = icmp sgt i32 %0, 0
br i1 %132, label %135, label %133
133: ; preds = %131
%134 = shl nsw i32 %0, 1
tail call void @cdft(i32 %134, i32 %2, double* %4, i32* %5, double* %6)
br label %282
135: ; preds = %131
%136 = zext i32 %0 to i64
%137 = add nsw i64 %136, -1
%138 = and i64 %136, 1
%139 = icmp eq i64 %137, 0
br i1 %139, label %223, label %140
140: ; preds = %135
%141 = and i64 %136, 4294967294
br label %198
142: ; preds = %130
%143 = icmp sgt i32 %0, 0
br i1 %143, label %144, label %171
144: ; preds = %142
%145 = zext i32 %0 to i64
br label %146
146: ; preds = %144, %146
%147 = phi i64 [ 0, %144 ], [ %169, %146 ]
%148 = trunc i64 %147 to i32
%149 = getelementptr inbounds double*, double** %3, i64 %147
%150 = load double*, double** %149
%151 = load double, double* %150
%152 = shl nuw nsw i64 %147, 1
%153 = getelementptr inbounds double, double* %4, i64 %152
store double %151, double* %153
%154 = getelementptr inbounds double, double* %150, i64 1
%155 = load double, double* %154
%156 = or i64 %152, 1
%157 = getelementptr inbounds double, double* %4, i64 %156
store double %155, double* %157
%158 = getelementptr inbounds double, double* %150, i64 2
%159 = load double, double* %158
%160 = add nsw i32 %148, %0
%161 = shl nsw i32 %160, 1
%162 = sext i32 %161 to i64
%163 = getelementptr inbounds double, double* %4, i64 %162
store double %159, double* %163
%164 = getelementptr inbounds double, double* %150, i64 3
%165 = load double, double* %164
%166 = or i32 %161, 1
%167 = sext i32 %166 to i64
%168 = getelementptr inbounds double, double* %4, i64 %167
store double %165, double* %168
%169 = add nuw nsw i64 %147, 1
%170 = icmp eq i64 %169, %145
br i1 %170, label %171, label %146
171: ; preds = %146, %142
%172 = shl nsw i32 %0, 1
tail call void @cdft(i32 %172, i32 %2, double* %4, i32* %5, double* %6)
%173 = sext i32 %172 to i64
%174 = getelementptr inbounds double, double* %4, i64 %173
tail call void @cdft(i32 %172, i32 %2, double* %174, i32* %5, double* %6)
br i1 %143, label %175, label %282
175: ; preds = %171
%176 = zext i32 %0 to i64
br label %177
177: ; preds = %175, %177
%178 = phi i64 [ 0, %175 ], [ %196, %177 ]
%179 = shl nuw nsw i64 %178, 1
%180 = getelementptr inbounds double, double* %4, i64 %179
%181 = load double, double* %180
%182 = getelementptr inbounds double*, double** %3, i64 %178
%183 = load double*, double** %182
store double %181, double* %183
%184 = or i64 %179, 1
%185 = getelementptr inbounds double, double* %4, i64 %184
%186 = load double, double* %185
%187 = getelementptr inbounds double, double* %183, i64 1
store double %186, double* %187
%188 = add nsw i64 %179, %173
%189 = getelementptr inbounds double, double* %4, i64 %188
%190 = load double, double* %189
%191 = getelementptr inbounds double, double* %183, i64 2
store double %190, double* %191
%192 = or i64 %188, 1
%193 = getelementptr inbounds double, double* %4, i64 %192
%194 = load double, double* %193
%195 = getelementptr inbounds double, double* %183, i64 3
store double %194, double* %195
%196 = add nuw nsw i64 %178, 1
%197 = icmp eq i64 %196, %176
br i1 %197, label %282, label %177
198: ; preds = %198, %140
%199 = phi i64 [ 0, %140 ], [ %220, %198 ]
%200 = phi i64 [ 0, %140 ], [ %221, %198 ]
%201 = getelementptr inbounds double*, double** %3, i64 %199
%202 = load double*, double** %201
%203 = load double, double* %202
%204 = shl nuw nsw i64 %199, 1
%205 = getelementptr inbounds double, double* %4, i64 %204
store double %203, double* %205
%206 = getelementptr inbounds double, double* %202, i64 1
%207 = load double, double* %206
%208 = or i64 %204, 1
%209 = getelementptr inbounds double, double* %4, i64 %208
store double %207, double* %209
%210 = or i64 %199, 1
%211 = getelementptr inbounds double*, double** %3, i64 %210
%212 = load double*, double** %211
%213 = load double, double* %212
%214 = shl nuw nsw i64 %210, 1
%215 = getelementptr inbounds double, double* %4, i64 %214
store double %213, double* %215
%216 = getelementptr inbounds double, double* %212, i64 1
%217 = load double, double* %216
%218 = or i64 %214, 1
%219 = getelementptr inbounds double, double* %4, i64 %218
store double %217, double* %219
%220 = add nuw nsw i64 %199, 2
%221 = add nuw i64 %200, 2
%222 = icmp eq i64 %221, %141
br i1 %222, label %223, label %198
223: ; preds = %198, %135
%224 = phi i64 [ 0, %135 ], [ %220, %198 ]
%225 = icmp eq i64 %138, 0
br i1 %225, label %236, label %226
226: ; preds = %223
%227 = getelementptr inbounds double*, double** %3, i64 %224
%228 = load double*, double** %227
%229 = load double, double* %228
%230 = shl nuw nsw i64 %224, 1
%231 = getelementptr inbounds double, double* %4, i64 %230
store double %229, double* %231
%232 = getelementptr inbounds double, double* %228, i64 1
%233 = load double, double* %232
%234 = or i64 %230, 1
%235 = getelementptr inbounds double, double* %4, i64 %234
store double %233, double* %235
br label %236
236: ; preds = %223, %226
%237 = shl nsw i32 %0, 1
tail call void @cdft(i32 %237, i32 %2, double* %4, i32* %5, double* %6)
br i1 %132, label %238, label %282
238: ; preds = %236
%239 = zext i32 %0 to i64
%240 = and i64 %239, 1
%241 = icmp eq i64 %137, 0
br i1 %241, label %269, label %242
242: ; preds = %238
%243 = and i64 %239, 4294967294
br label %244
244: ; preds = %244, %242
%245 = phi i64 [ 0, %242 ], [ %266, %244 ]
%246 = phi i64 [ 0, %242 ], [ %267, %244 ]
%247 = shl nuw nsw i64 %245, 1
%248 = getelementptr inbounds double, double* %4, i64 %247
%249 = load double, double* %248
%250 = getelementptr inbounds double*, double** %3, i64 %245
%251 = load double*, double** %250
store double %249, double* %251
%252 = or i64 %247, 1
%253 = getelementptr inbounds double, double* %4, i64 %252
%254 = load double, double* %253
%255 = getelementptr inbounds double, double* %251, i64 1
store double %254, double* %255
%256 = or i64 %245, 1
%257 = shl nuw nsw i64 %256, 1
%258 = getelementptr inbounds double, double* %4, i64 %257
%259 = load double, double* %258
%260 = getelementptr inbounds double*, double** %3, i64 %256
%261 = load double*, double** %260
store double %259, double* %261
%262 = or i64 %257, 1
%263 = getelementptr inbounds double, double* %4, i64 %262
%264 = load double, double* %263
%265 = getelementptr inbounds double, double* %261, i64 1
store double %264, double* %265
%266 = add nuw nsw i64 %245, 2
%267 = add nuw i64 %246, 2
%268 = icmp eq i64 %267, %243
br i1 %268, label %269, label %244
269: ; preds = %244, %238
%270 = phi i64 [ 0, %238 ], [ %266, %244 ]
%271 = icmp eq i64 %240, 0
br i1 %271, label %282, label %272
272: ; preds = %269
%273 = shl nuw nsw i64 %270, 1
%274 = getelementptr inbounds double, double* %4, i64 %273
%275 = load double, double* %274
%276 = getelementptr inbounds double*, double** %3, i64 %270
%277 = load double*, double** %276
store double %275, double* %277
%278 = or i64 %273, 1
%279 = getelementptr inbounds double, double* %4, i64 %278
%280 = load double, double* %279
%281 = getelementptr inbounds double, double* %277, i64 1
store double %280, double* %281
br label %282
282: ; preds = %272, %269, %177, %126, %133, %236, %171, %130
ret void
}