void LLdiscreteHartley(double *A, const unsigned int nPoints,
                       const double *sinTab) {
  unsigned int i, j, n, n2, theta_inc, nptDiv2;
  double alpha, beta;
  for (i = 0; i < nPoints; i += 4) {
    const double x0 = A[i];
    const double x1 = A[i + 1];
    const double x2 = A[i + 2];
    const double x3 = A[i + 3];
    const double y0 = x0 + x1;
    const double y1 = x0 - x1;
    const double y2 = x2 + x3;
    const double y3 = x2 - x3;
    A[i] = y0 + y2;
    A[i + 2] = y0 - y2;
    A[i + 1] = y1 + y3;
    A[i + 3] = y1 - y3;
  }
  for (i = 0; i < nPoints; i += 8) {
    alpha = A[i];
    beta = A[i + 4];
    A[i] = alpha + beta;
    A[i + 4] = alpha - beta;
    alpha = A[i + 2];
    beta = A[i + 6];
    A[i + 2] = alpha + beta;
    A[i + 6] = alpha - beta;
    alpha = A[i + 1];
    const double beta1 =
        0.70710678118654752440084436210485 * (A[i + 5] + A[i + 7]);
    const double beta2 =
        0.70710678118654752440084436210485 * (A[i + 5] - A[i + 7]);
    A[i + 1] = alpha + beta1;
    A[i + 5] = alpha - beta1;
    alpha = A[i + 3];
    A[i + 3] = alpha + beta2;
    A[i + 7] = alpha - beta2;
  }
  n = 16;
  n2 = 8;
  theta_inc = nPoints >> 4;
  nptDiv2 = nPoints >> 2;
  while (n <= nPoints) {
    for (i = 0; i < nPoints; i += n) {
      unsigned int theta = theta_inc;
      const unsigned int n4 = n2 >> 1;
      alpha = A[i];
      beta = A[i + n2];
      A[i] = alpha + beta;
      A[i + n2] = alpha - beta;
      alpha = A[i + n4];
      beta = A[i + n2 + n4];
      A[i + n4] = alpha + beta;
      A[i + n2 + n4] = alpha - beta;
      for (j = 1; j < n4; j++) {
        double sinval = sinTab[theta];
        double cosval = sinTab[theta + nptDiv2];
        double alpha1 = A[i + j];
        double alpha2 = A[i - j + n2];
        double beta1 = A[i + j + n2] * cosval + A[i - j + n] * sinval;
        double beta2 = A[i + j + n2] * sinval - A[i - j + n] * cosval;
        theta += theta_inc;
        A[i + j] = alpha1 + beta1;
        A[i + j + n2] = alpha1 - beta1;
        A[i - j + n2] = alpha2 + beta2;
        A[i - j + n] = alpha2 - beta2;
      }
    }
    n <<= 1;
    n2 <<= 1;
    theta_inc >>= 1;
  }
}


x86 assembly (clang, -O0):
<LLdiscreteHartley>:
push   %rbp
mov    %rsp,%rbp
sub    $0x48,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jae    122a <LLdiscreteHartley+0x12a>
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x2,%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x3,%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x48(%rbp),%xmm0
addsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x48(%rbp),%xmm0
subsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x58(%rbp),%xmm0
addsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x58(%rbp),%xmm0
subsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x68(%rbp),%xmm0
addsd  -0x78(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x68(%rbp),%xmm0
subsd  -0x78(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x2,%ecx
mov    %ecx,%ecx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x70(%rbp),%xmm0
addsd  -0x80(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x70(%rbp),%xmm0
subsd  -0x80(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x3,%ecx
mov    %ecx,%ecx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x1c(%rbp)
jmp    111a <LLdiscreteHartley+0x1a>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jae    1415 <LLdiscreteHartley+0x315>
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x4,%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x38(%rbp),%xmm0
addsd  -0x40(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x38(%rbp),%xmm0
subsd  -0x40(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x4,%ecx
mov    %ecx,%ecx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x2,%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x6,%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x38(%rbp),%xmm0
addsd  -0x40(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x2,%ecx
mov    %ecx,%ecx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x38(%rbp),%xmm0
subsd  -0x40(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x6,%ecx
mov    %ecx,%ecx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x5,%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x7,%ecx
mov    %ecx,%ecx
addsd  (%rax,%rcx,8),%xmm1
movsd  0xcc9(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x5,%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x7,%ecx
mov    %ecx,%ecx
subsd  (%rax,%rcx,8),%xmm1
movsd  0xc93(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
addsd  -0x88(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x38(%rbp),%xmm0
subsd  -0x88(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x5,%ecx
mov    %ecx,%ecx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x3,%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
addsd  -0x90(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x3,%ecx
mov    %ecx,%ecx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x38(%rbp),%xmm0
subsd  -0x90(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x7,%ecx
mov    %ecx,%ecx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x8,%eax
mov    %eax,-0x1c(%rbp)
jmp    1231 <LLdiscreteHartley+0x131>
movl   $0x10,-0x24(%rbp)
movl   $0x8,-0x28(%rbp)
mov    -0xc(%rbp),%eax
shr    $0x4,%eax
mov    %eax,-0x2c(%rbp)
mov    -0xc(%rbp),%eax
shr    $0x2,%eax
mov    %eax,-0x30(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
ja     1737 <LLdiscreteHartley+0x637>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jae    1717 <LLdiscreteHartley+0x617>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x94(%rbp)
mov    -0x28(%rbp),%eax
shr    $0x1,%eax
mov    %eax,-0x98(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x28(%rbp),%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x38(%rbp),%xmm0
addsd  -0x40(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x38(%rbp),%xmm0
subsd  -0x40(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x28(%rbp),%ecx
mov    %ecx,%ecx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x98(%rbp),%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x28(%rbp),%ecx
add    -0x98(%rbp),%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x38(%rbp),%xmm0
addsd  -0x40(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x98(%rbp),%ecx
mov    %ecx,%ecx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x38(%rbp),%xmm0
subsd  -0x40(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x28(%rbp),%ecx
add    -0x98(%rbp),%ecx
mov    %ecx,%ecx
movsd  %xmm0,(%rax,%rcx,8)
movl   $0x1,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x98(%rbp),%eax
jae    1704 <LLdiscreteHartley+0x604>
mov    -0x18(%rbp),%rax
mov    -0x94(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x94(%rbp),%ecx
add    -0x30(%rbp),%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x20(%rbp),%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    -0x20(%rbp),%ecx
add    -0x28(%rbp),%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x20(%rbp),%ecx
add    -0x28(%rbp),%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0xa8(%rbp),%xmm2
ff
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    -0x20(%rbp),%ecx
add    -0x24(%rbp),%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm1
mulsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x20(%rbp),%ecx
add    -0x28(%rbp),%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0xa0(%rbp),%xmm2
ff
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    -0x20(%rbp),%ecx
add    -0x24(%rbp),%ecx
mov    %ecx,%ecx
movsd  (%rax,%rcx,8),%xmm1
mulsd  -0xa8(%rbp),%xmm1
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
mov    -0x2c(%rbp),%eax
add    -0x94(%rbp),%eax
mov    %eax,-0x94(%rbp)
movsd  -0xb0(%rbp),%xmm0
ff
addsd  -0xc0(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x20(%rbp),%ecx
mov    %ecx,%ecx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0xb0(%rbp),%xmm0
ff
subsd  -0xc0(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    -0x20(%rbp),%ecx
add    -0x28(%rbp),%ecx
mov    %ecx,%ecx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0xb8(%rbp),%xmm0
ff
addsd  -0xc8(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    -0x20(%rbp),%ecx
add    -0x28(%rbp),%ecx
mov    %ecx,%ecx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0xb8(%rbp),%xmm0
ff
subsd  -0xc8(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    -0x20(%rbp),%ecx
add    -0x24(%rbp),%ecx
mov    %ecx,%ecx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    153c <LLdiscreteHartley+0x43c>
jmp    1709 <LLdiscreteHartley+0x609>
mov    -0x24(%rbp),%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    1448 <LLdiscreteHartley+0x348>
mov    -0x24(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x28(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x28(%rbp)
mov    -0x2c(%rbp),%eax
shr    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1435 <LLdiscreteHartley+0x335>
add    $0x48,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<LLdiscreteHartley>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %esi,-0x30(%rsp)
test   %esi,%esi
je     1476 <LLdiscreteHartley+0x376>
mov    -0x30(%rsp),%eax
lea    -0x1(%rax),%r8
cmp    $0x4,%r8
jae    112b <LLdiscreteHartley+0x2b>
xor    %ecx,%ecx
jmp    11f0 <LLdiscreteHartley+0xf0>
mov    %r8,%rsi
shr    $0x2,%rsi
add    $0x1,%rsi
mov    %rsi,%r9
and    $0xfffffffffffffffe,%r9
lea    0x0(,%r9,4),%rcx
mov    %r9,%rbp
mov    %rdi,%rbx
nopl   0x0(%rax,%rax,1)
movsd  (%rbx),%xmm0
movsd  0x8(%rbx),%xmm1
movsd  0x10(%rbx),%xmm2
movsd  0x18(%rbx),%xmm3
movhpd 0x20(%rbx),%xmm0
movhpd 0x28(%rbx),%xmm1
movhpd 0x30(%rbx),%xmm2
movhpd 0x38(%rbx),%xmm3
movapd %xmm0,%xmm4
addpd  %xmm1,%xmm4
subpd  %xmm1,%xmm0
movapd %xmm2,%xmm1
addpd  %xmm3,%xmm1
subpd  %xmm3,%xmm2
movapd %xmm4,%xmm3
addpd  %xmm1,%xmm3
subpd  %xmm1,%xmm4
movapd %xmm0,%xmm1
addpd  %xmm2,%xmm1
subpd  %xmm2,%xmm0
movapd %xmm4,%xmm2
unpcklpd %xmm0,%xmm2
movapd %xmm3,%xmm5
unpcklpd %xmm1,%xmm5
movhlps %xmm4,%xmm0
movhlps %xmm3,%xmm1
movups %xmm1,0x20(%rbx)
movups %xmm0,0x30(%rbx)
movupd %xmm5,(%rbx)
movupd %xmm2,0x10(%rbx)
add    $0x40,%rbx
add    $0xfffffffffffffffe,%rbp
jne    1150 <LLdiscreteHartley+0x50>
cmp    %r9,%rsi
je     1257 <LLdiscreteHartley+0x157>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  (%rdi,%rcx,8),%xmm0
movsd  0x8(%rdi,%rcx,8),%xmm1
movsd  0x10(%rdi,%rcx,8),%xmm2
movsd  0x18(%rdi,%rcx,8),%xmm3
movapd %xmm0,%xmm4
addsd  %xmm1,%xmm4
subsd  %xmm1,%xmm0
movapd %xmm2,%xmm1
addsd  %xmm3,%xmm1
subsd  %xmm3,%xmm2
movapd %xmm4,%xmm3
addsd  %xmm1,%xmm3
movsd  %xmm3,(%rdi,%rcx,8)
subsd  %xmm1,%xmm4
movsd  %xmm4,0x10(%rdi,%rcx,8)
movapd %xmm0,%xmm1
addsd  %xmm2,%xmm1
movsd  %xmm1,0x8(%rdi,%rcx,8)
subsd  %xmm2,%xmm0
movsd  %xmm0,0x18(%rdi,%rcx,8)
add    $0x4,%rcx
cmp    %rax,%rcx
jb     11f0 <LLdiscreteHartley+0xf0>
cmpl   $0x0,-0x30(%rsp)
je     1476 <LLdiscreteHartley+0x376>
cmp    $0x8,%r8
jae    126f <LLdiscreteHartley+0x16f>
xor    %ecx,%ecx
jmp    13aa <LLdiscreteHartley+0x2aa>
shr    $0x3,%r8
add    $0x1,%r8
mov    %r8,%r9
and    $0xfffffffffffffffe,%r9
lea    0x0(,%r9,8),%rcx
movapd 0xd71(%rip),%xmm8
mov    %r9,%rbp
mov    %rdi,%rbx
cs nopw 0x0(%rax,%rax,1)
nop
movsd  (%rbx),%xmm12
movsd  0x8(%rbx),%xmm2
movsd  0x10(%rbx),%xmm4
movsd  0x18(%rbx),%xmm3
movhpd 0x40(%rbx),%xmm12
movsd  0x20(%rbx),%xmm6
movhpd 0x60(%rbx),%xmm6
movapd %xmm12,%xmm9
addpd  %xmm6,%xmm9
subpd  %xmm6,%xmm12
movhpd 0x50(%rbx),%xmm4
movsd  0x30(%rbx),%xmm7
movhpd 0x70(%rbx),%xmm7
movapd %xmm4,%xmm10
movhpd 0x48(%rbx),%xmm2
addpd  %xmm7,%xmm10
movsd  0x28(%rbx),%xmm0
movhpd 0x68(%rbx),%xmm0
subpd  %xmm7,%xmm4
movsd  0x38(%rbx),%xmm7
movhpd 0x78(%rbx),%xmm7
movapd %xmm0,%xmm5
addpd  %xmm7,%xmm5
mulpd  %xmm8,%xmm5
subpd  %xmm7,%xmm0
mulpd  %xmm8,%xmm0
movapd %xmm2,%xmm7
addpd  %xmm5,%xmm7
subpd  %xmm5,%xmm2
movhpd 0x58(%rbx),%xmm3
movapd %xmm0,%xmm5
addpd  %xmm3,%xmm5
subpd  %xmm0,%xmm3
movapd %xmm10,%xmm11
unpcklpd %xmm5,%xmm11
movapd %xmm9,%xmm6
unpcklpd %xmm7,%xmm6
movapd %xmm4,%xmm0
unpcklpd %xmm3,%xmm0
movapd %xmm12,%xmm1
unpcklpd %xmm2,%xmm1
movhlps %xmm10,%xmm5
movhlps %xmm9,%xmm7
movhlps %xmm4,%xmm3
movhlps %xmm12,%xmm2
movups %xmm2,0x60(%rbx)
movups %xmm3,0x70(%rbx)
movups %xmm7,0x40(%rbx)
movups %xmm5,0x50(%rbx)
movupd %xmm1,0x20(%rbx)
movupd %xmm0,0x30(%rbx)
movupd %xmm6,(%rbx)
movupd %xmm11,0x10(%rbx)
sub    $0xffffffffffffff80,%rbx
add    $0xfffffffffffffffe,%rbp
jne    12a0 <LLdiscreteHartley+0x1a0>
cmp    %r9,%r8
je     146f <LLdiscreteHartley+0x36f>
movsd  0xc5e(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsd  0x20(%rdi,%rcx,8),%xmm1
movsd  (%rdi,%rcx,8),%xmm2
movsd  0x8(%rdi,%rcx,8),%xmm3
movapd %xmm2,%xmm4
addsd  %xmm1,%xmm4
movsd  %xmm4,(%rdi,%rcx,8)
subsd  %xmm1,%xmm2
movsd  %xmm2,0x20(%rdi,%rcx,8)
movsd  0x10(%rdi,%rcx,8),%xmm1
movsd  0x30(%rdi,%rcx,8),%xmm2
movapd %xmm1,%xmm4
addsd  %xmm2,%xmm4
movsd  %xmm4,0x10(%rdi,%rcx,8)
subsd  %xmm2,%xmm1
movsd  %xmm1,0x30(%rdi,%rcx,8)
movsd  0x28(%rdi,%rcx,8),%xmm1
movsd  0x38(%rdi,%rcx,8),%xmm2
movapd %xmm1,%xmm4
addsd  %xmm2,%xmm4
mulsd  %xmm0,%xmm4
subsd  %xmm2,%xmm1
mulsd  %xmm0,%xmm1
movapd %xmm3,%xmm2
addsd  %xmm4,%xmm2
movsd  %xmm2,0x8(%rdi,%rcx,8)
subsd  %xmm4,%xmm3
movsd  %xmm3,0x28(%rdi,%rcx,8)
movsd  0x18(%rdi,%rcx,8),%xmm2
movapd %xmm1,%xmm3
addsd  %xmm2,%xmm3
movsd  %xmm3,0x18(%rdi,%rcx,8)
subsd  %xmm1,%xmm2
movsd  %xmm2,0x38(%rdi,%rcx,8)
add    $0x8,%rcx
cmp    %rax,%rcx
jb     13c0 <LLdiscreteHartley+0x2c0>
cmpl   $0x10,-0x30(%rsp)
jae    1481 <LLdiscreteHartley+0x381>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    -0x30(%rsp),%r8d
mov    %r8d,%r13d
shr    $0x2,%r13d
shr    $0x4,%r8d
mov    $0x8,%ecx
mov    $0x10,%eax
jmp    14ad <LLdiscreteHartley+0x3ad>
nopl   (%rax)
add    %eax,%eax
add    %ecx,%ecx
shr    %r8d
cmp    -0x30(%rsp),%eax
ja     1476 <LLdiscreteHartley+0x376>
mov    %ecx,%esi
shr    %esi
cmp    $0x3,%esi
mov    $0x2,%ebp
mov    %rsi,-0x18(%rsp)
cmovae %esi,%ebp
lea    -0x1(%rax),%esi
mov    %esi,-0x24(%rsp)
lea    -0x1(%rcx),%esi
mov    %esi,-0x28(%rsp)
lea    0x1(%rcx),%esi
mov    %esi,-0x2c(%rsp)
add    $0xffffffffffffffff,%rbp
mov    %rbp,-0x20(%rsp)
xor    %ebp,%ebp
mov    %rcx,-0x8(%rsp)
mov    %rax,-0x10(%rsp)
jmp    1502 <LLdiscreteHartley+0x402>
nopl   (%rax)
mov    -0x10(%rsp),%rax
add    %eax,%ebp
cmp    -0x30(%rsp),%ebp
mov    -0x8(%rsp),%rcx
jae    14a0 <LLdiscreteHartley+0x3a0>
lea    (%rcx,%rbp,1),%eax
mov    -0x18(%rsp),%rsi
lea    (%rsi,%rbp,1),%r9d
lea    (%rax,%rsi,1),%ebx
mov    %ebp,%esi
movsd  (%rdi,%rsi,8),%xmm0
movsd  (%rdi,%rax,8),%xmm1
movapd %xmm0,%xmm2
addsd  %xmm1,%xmm2
movsd  %xmm2,(%rdi,%rsi,8)
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rdi,%rax,8)
movsd  (%rdi,%r9,8),%xmm0
movsd  (%rdi,%rbx,8),%xmm1
movapd %xmm0,%xmm2
addsd  %xmm1,%xmm2
movsd  %xmm2,(%rdi,%r9,8)
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rdi,%rbx,8)
test   %ecx,%ecx
je     14f0 <LLdiscreteHartley+0x3f0>
mov    $0x1,%ebx
mov    -0x20(%rsp),%rax
mov    -0x2c(%rsp),%ecx
mov    %ecx,%r14d
mov    -0x28(%rsp),%ecx
mov    %ecx,%esi
mov    -0x24(%rsp),%ecx
mov    %ecx,%r15d
mov    %r8d,%r12d
nopw   0x0(%rax,%rax,1)
mov    %r12d,%ecx
movsd  (%rdx,%rcx,8),%xmm1
lea    (%r12,%r13,1),%ecx
movsd  (%rdx,%rcx,8),%xmm3
lea    (%rbx,%rbp,1),%r9d
movsd  (%rdi,%r9,8),%xmm2
lea    0x0(%rbp,%rsi,1),%r11d
movsd  (%rdi,%r11,8),%xmm0
lea    0x0(%rbp,%r14,1),%ecx
movsd  (%rdi,%rcx,8),%xmm4
lea    0x0(%rbp,%r15,1),%r10d
movsd  (%rdi,%r10,8),%xmm5
movapd %xmm4,%xmm6
mulsd  %xmm1,%xmm4
mulsd  %xmm5,%xmm1
mulsd  %xmm3,%xmm6
addsd  %xmm1,%xmm6
mulsd  %xmm5,%xmm3
subsd  %xmm3,%xmm4
add    %r8d,%r12d
movapd %xmm2,%xmm1
addsd  %xmm6,%xmm1
movsd  %xmm1,(%rdi,%r9,8)
subsd  %xmm6,%xmm2
movsd  %xmm2,(%rdi,%rcx,8)
movapd %xmm0,%xmm1
addsd  %xmm4,%xmm1
movsd  %xmm1,(%rdi,%r11,8)
subsd  %xmm4,%xmm0
movsd  %xmm0,(%rdi,%r10,8)
add    $0xffffffff,%r15d
add    $0xffffffff,%esi
add    $0x1,%r14d
add    $0x1,%ebx
add    $0xffffffffffffffff,%rax
jne    1580 <LLdiscreteHartley+0x480>
jmp    14f0 <LLdiscreteHartley+0x3f0>

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

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