#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ bitrv2(int, int *, double *);
int /*<<< orphan*/ cftfsub(int, double *, double *);
int /*<<< orphan*/ dctsub(int, double *, int, double *);
int /*<<< orphan*/ makect(int, int *, double *);
int /*<<< orphan*/ makewt(int, int *, double *);
int /*<<< orphan*/ rftfsub(int, double *, int, double *);
void lsx_dfct(int n, double *a, double *t, int *ip, double *w) {
  int j, k, l, m, mh, nw, nc;
  double xr, xi, yr, yi;
  nw = ip[0];
  if (n > (nw << 3)) {
    nw = n >> 3;
    makewt(nw, ip, w);
  }
  nc = ip[1];
  if (n > (nc << 1)) {
    nc = n >> 1;
    makect(nc, ip, w + nw);
  }
  m = n >> 1;
  yi = a[m];
  xi = a[0] + a[n];
  a[0] -= a[n];
  t[0] = xi - yi;
  t[m] = xi + yi;
  if (n > 2) {
    mh = m >> 1;
    for (j = 1; j < mh; j++) {
      k = m - j;
      xr = a[j] - a[n - j];
      xi = a[j] + a[n - j];
      yr = a[k] - a[n - k];
      yi = a[k] + a[n - k];
      a[j] = xr;
      a[k] = yr;
      t[j] = xi - yi;
      t[k] = xi + yi;
    }
    t[mh] = a[mh] + a[n - mh];
    a[mh] -= a[n - mh];
    dctsub(m, a, nc, w + nw);
    if (m > 4) {
      bitrv2(m, ip + 2, a);
      cftfsub(m, a, w);
      rftfsub(m, a, nc, w + nw);
    } else if (m == 4) {
      cftfsub(m, a, w);
    }
    a[n - 1] = a[0] - a[1];
    a[1] = a[0] + a[1];
    for (j = m - 2; j >= 2; j -= 2) {
      a[2 * j + 1] = a[j] + a[j + 1];
      a[2 * j - 1] = a[j] - a[j + 1];
    }
    l = 2;
    m = mh;
    while (m >= 2) {
      dctsub(m, t, nc, w + nw);
      if (m > 4) {
        bitrv2(m, ip + 2, t);
        cftfsub(m, t, w);
        rftfsub(m, t, nc, w + nw);
      } else if (m == 4) {
        cftfsub(m, t, w);
      }
      a[n - l] = t[0] - t[1];
      a[l] = t[0] + t[1];
      k = 0;
      for (j = 2; j < m; j += 2) {
        k += l << 2;
        a[k - l] = t[j] - t[j + 1];
        a[k + l] = t[j] + t[j + 1];
      }
      l <<= 1;
      mh = m >> 1;
      for (j = 0; j < mh; j++) {
        k = m - j;
        t[j] = t[m + k] - t[m + j];
        t[k] = t[m + k] + t[m + j];
      }
      t[mh] = t[m + mh];
      m = mh;
    }
    a[l] = t[0];
    a[n] = t[2] - t[1];
    a[0] = t[2] + t[1];
  } else {
    a[1] = a[0];
    a[2] = t[0];
    a[0] = t[1];
  }
}


x86 assembly (clang, -O0):
<lsx_dfct>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x40(%rbp)
mov    -0x4(%rbp),%eax
mov    -0x40(%rbp),%ecx
shl    $0x3,%ecx
cmp    %ecx,%eax
jle    11ae <lsx_dfct+0x4e>
mov    -0x4(%rbp),%eax
sar    $0x3,%eax
mov    %eax,-0x40(%rbp)
mov    -0x40(%rbp),%edi
mov    -0x20(%rbp),%rsi
mov    -0x28(%rbp),%rdx
call   1040 <makewt@plt>
mov    -0x20(%rbp),%rax
mov    0x4(%rax),%eax
mov    %eax,-0x44(%rbp)
mov    -0x4(%rbp),%eax
mov    -0x44(%rbp),%ecx
shl    $0x1,%ecx
cmp    %ecx,%eax
jle    11ed <lsx_dfct+0x8d>
mov    -0x4(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%edi
mov    -0x20(%rbp),%rsi
mov    -0x28(%rbp),%rdx
movslq -0x40(%rbp),%rax
shl    $0x3,%rax
add    %rax,%rdx
call   1070 <makect@plt>
mov    -0x4(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x38(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x4(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x4(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
movsd  -0x58(%rbp),%xmm0
subsd  -0x68(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x58(%rbp),%xmm0
addsd  -0x68(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x38(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
cmpl   $0x2,-0x4(%rbp)
jle    17c6 <lsx_dfct+0x666>
mov    -0x38(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x3c(%rbp)
movl   $0x1,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x3c(%rbp),%eax
jge    1387 <lsx_dfct+0x227>
mov    -0x38(%rbp),%eax
sub    -0x2c(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x4(%rbp),%ecx
sub    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x4(%rbp),%ecx
sub    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x4(%rbp),%ecx
sub    -0x30(%rbp),%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x4(%rbp),%ecx
sub    -0x30(%rbp),%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x50(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x60(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x58(%rbp),%xmm0
subsd  -0x68(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x58(%rbp),%xmm0
addsd  -0x68(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1282 <lsx_dfct+0x122>
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x4(%rbp),%ecx
sub    -0x3c(%rbp),%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
mov    -0x4(%rbp),%ecx
sub    -0x3c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x38(%rbp),%edi
mov    -0x10(%rbp),%rsi
mov    -0x44(%rbp),%edx
mov    -0x28(%rbp),%rcx
movslq -0x40(%rbp),%rax
shl    $0x3,%rax
add    %rax,%rcx
call   1030 <dctsub@plt>
cmpl   $0x4,-0x38(%rbp)
jle    144a <lsx_dfct+0x2ea>
mov    -0x38(%rbp),%edi
mov    -0x20(%rbp),%rsi
add    $0x8,%rsi
mov    -0x10(%rbp),%rdx
call   1060 <bitrv2@plt>
mov    -0x38(%rbp),%edi
mov    -0x10(%rbp),%rsi
mov    -0x28(%rbp),%rdx
call   1080 <cftfsub@plt>
mov    -0x38(%rbp),%edi
mov    -0x10(%rbp),%rsi
mov    -0x44(%rbp),%edx
mov    -0x28(%rbp),%rcx
movslq -0x40(%rbp),%rax
shl    $0x3,%rax
add    %rax,%rcx
call   1050 <rftfsub@plt>
jmp    1469 <lsx_dfct+0x309>
cmpl   $0x4,-0x38(%rbp)
jne    1464 <lsx_dfct+0x304>
mov    -0x38(%rbp),%edi
mov    -0x10(%rbp),%rsi
mov    -0x28(%rbp),%rdx
call   1080 <cftfsub@plt>
jmp    1469 <lsx_dfct+0x309>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
subsd  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x4(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
addsd  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x38(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x2c(%rbp)
cmpl   $0x2,-0x2c(%rbp)
jl     152f <lsx_dfct+0x3cf>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x2c(%rbp)
jmp    14af <lsx_dfct+0x34f>
movl   $0x2,-0x34(%rbp)
mov    -0x3c(%rbp),%eax
mov    %eax,-0x38(%rbp)
cmpl   $0x2,-0x38(%rbp)
jl     1773 <lsx_dfct+0x613>
mov    -0x38(%rbp),%edi
mov    -0x18(%rbp),%rsi
mov    -0x44(%rbp),%edx
mov    -0x28(%rbp),%rcx
movslq -0x40(%rbp),%rax
shl    $0x3,%rax
add    %rax,%rcx
call   1030 <dctsub@plt>
cmpl   $0x4,-0x38(%rbp)
jle    15b5 <lsx_dfct+0x455>
mov    -0x38(%rbp),%edi
mov    -0x20(%rbp),%rsi
add    $0x8,%rsi
mov    -0x18(%rbp),%rdx
call   1060 <bitrv2@plt>
mov    -0x38(%rbp),%edi
mov    -0x18(%rbp),%rsi
mov    -0x28(%rbp),%rdx
call   1080 <cftfsub@plt>
mov    -0x38(%rbp),%edi
mov    -0x18(%rbp),%rsi
mov    -0x44(%rbp),%edx
mov    -0x28(%rbp),%rcx
movslq -0x40(%rbp),%rax
shl    $0x3,%rax
add    %rax,%rcx
call   1050 <rftfsub@plt>
jmp    15d4 <lsx_dfct+0x474>
cmpl   $0x4,-0x38(%rbp)
jne    15cf <lsx_dfct+0x46f>
mov    -0x38(%rbp),%edi
mov    -0x18(%rbp),%rsi
mov    -0x28(%rbp),%rdx
call   1080 <cftfsub@plt>
jmp    15d4 <lsx_dfct+0x474>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
subsd  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x4(%rbp),%ecx
sub    -0x34(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x18(%rbp),%rax
addsd  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movl   $0x0,-0x30(%rbp)
movl   $0x2,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x38(%rbp),%eax
jge    16ab <lsx_dfct+0x54b>
mov    -0x34(%rbp),%eax
shl    $0x2,%eax
add    -0x30(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
sub    -0x34(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x2c(%rbp)
jmp    1623 <lsx_dfct+0x4c3>
mov    -0x34(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x38(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x3c(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x3c(%rbp),%eax
jge    1749 <lsx_dfct+0x5e9>
mov    -0x38(%rbp),%eax
sub    -0x2c(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
add    -0x30(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    16c4 <lsx_dfct+0x564>
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
add    -0x3c(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x3c(%rbp),%eax
mov    %eax,-0x38(%rbp)
jmp    153c <lsx_dfct+0x3dc>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x18(%rbp),%rax
subsd  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x4(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x18(%rbp),%rax
addsd  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    17f9 <lsx_dfct+0x699>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<lsx_dfct>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x48,%rsp
mov    %r8,%r12
mov    %rcx,%rbp
mov    %rdx,%rbx
mov    %rsi,%r14
mov    (%rcx),%r13d
lea    0x0(,%r13,8),%eax
cmp    %edi,%eax
mov    %rdi,0x8(%rsp)
jge    11a8 <lsx_dfct+0x48>
mov    %edi,%r13d
sar    $0x3,%r13d
mov    %r13d,%edi
mov    %rbp,%rsi
mov    %r12,%rdx
call   1040 <makewt@plt>
mov    0x8(%rsp),%rdi
mov    0x4(%rbp),%eax
mov    %rax,0x10(%rsp)
add    %eax,%eax
mov    %edi,%r15d
sar    %r15d
cmp    %edi,%eax
jge    11db <lsx_dfct+0x7b>
movslq %r13d,%rax
lea    (%r12,%rax,8),%rdx
mov    %r15d,%edi
mov    %rbp,%rsi
call   1070 <makect@plt>
mov    0x8(%rsp),%rdi
mov    %r15d,%eax
mov    %rax,0x10(%rsp)
movslq %r15d,%rax
movsd  (%r14,%rax,8),%xmm0
movsd  (%r14),%xmm1
movslq %edi,%rcx
movsd  (%r14,%rcx,8),%xmm2
movapd %xmm1,%xmm3
addsd  %xmm2,%xmm3
subsd  %xmm2,%xmm1
movsd  %xmm1,(%r14)
movapd %xmm3,%xmm1
subsd  %xmm0,%xmm1
movsd  %xmm1,(%rbx)
addsd  %xmm0,%xmm3
movsd  %xmm3,(%rbx,%rax,8)
cmp    $0x3,%edi
jl     137a <lsx_dfct+0x21a>
mov    %rcx,0x28(%rsp)
mov    %rbp,0x20(%rsp)
mov    %r12,0x30(%rsp)
mov    %edi,%r12d
shr    $0x2,%r12d
cmp    $0x8,%edi
jb     12e6 <lsx_dfct+0x186>
cmp    $0x3,%r12d
mov    $0x2,%ebp
cmovae %r12d,%ebp
mov    0x28(%rsp),%rcx
lea    (%r14,%rcx,8),%r10
mov    $0x1,%ecx
mov    $0x1,%edx
sub    %rax,%rdx
lea    (%r14,%rax,8),%rsi
add    $0xfffffffffffffff8,%rsi
lea    (%rbx,%rax,8),%r8
add    $0xfffffffffffffff8,%r8
lea    -0x8(,%rbp,8),%r9
ff
xor    %eax,%eax
nopl   (%rax)
movsd  (%r14,%rcx,8),%xmm0
movsd  -0x8(%r10,%rax,1),%xmm1
movapd %xmm0,%xmm2
subsd  %xmm1,%xmm2
addsd  %xmm1,%xmm0
movsd  (%rsi,%rax,1),%xmm1
movsd  (%r10,%rdx,8),%xmm3
movapd %xmm1,%xmm4
subsd  %xmm3,%xmm4
addsd  %xmm3,%xmm1
movsd  %xmm2,(%r14,%rcx,8)
movsd  %xmm4,(%rsi,%rax,1)
movapd %xmm0,%xmm2
subsd  %xmm1,%xmm2
movsd  %xmm2,(%rbx,%rcx,8)
addsd  %xmm0,%xmm1
movsd  %xmm1,(%r8,%rax,1)
add    $0x1,%rcx
add    $0xfffffffffffffff8,%rax
add    $0x1,%rdx
mov    %r9,%rbp
add    %rax,%rbp
jne    1280 <lsx_dfct+0x120>
mov    %r12d,%eax
movsd  (%r14,%rax,8),%xmm0
mov    %edi,%ecx
sub    %r12d,%ecx
movslq %ecx,%rcx
addsd  (%r14,%rcx,8),%xmm0
movsd  %xmm0,(%rbx,%rax,8)
movsd  (%r14,%rax,8),%xmm0
subsd  (%r14,%rcx,8),%xmm0
movsd  %xmm0,(%r14,%rax,8)
movslq %r13d,%rax
mov    0x30(%rsp),%r13
lea    0x0(%r13,%rax,8),%rbp
mov    %r15d,%edi
mov    %r14,%rsi
mov    0x10(%rsp),%rdx
mov    %rbp,%rcx
call   1030 <dctsub@plt>
mov    0x8(%rsp),%rdi
cmp    $0xa,%edi
mov    %rbp,0x40(%rsp)
jl     1399 <lsx_dfct+0x239>
mov    0x20(%rsp),%rax
lea    0x8(%rax),%rsi
mov    %r15d,%edi
mov    %r14,%rdx
call   1060 <bitrv2@plt>
mov    %r15d,%edi
mov    %r14,%rsi
mov    %r13,%rdx
call   1080 <cftfsub@plt>
mov    %r15d,%edi
mov    %r14,%rsi
mov    0x10(%rsp),%rdx
mov    %rbp,%rcx
call   1050 <rftfsub@plt>
jmp    13af <lsx_dfct+0x24f>
movsd  (%r14),%xmm0
movsd  %xmm0,0x8(%r14)
movsd  (%rbx),%xmm0
movsd  %xmm0,0x10(%r14)
movsd  0x8(%rbx),%xmm0
jmp    1819 <lsx_dfct+0x6b9>
cmp    $0x4,%r15d
jne    13b4 <lsx_dfct+0x254>
mov    $0x4,%edi
mov    %r14,%rsi
mov    %r13,%rdx
call   1080 <cftfsub@plt>
mov    0x8(%rsp),%rdi
movsd  (%r14),%xmm0
subsd  0x8(%r14),%xmm0
lea    -0x1(%rdi),%eax
movsd  %xmm0,(%r14,%rax,8)
movsd  (%r14),%xmm0
addsd  0x8(%r14),%xmm0
movsd  %xmm0,0x8(%r14)
cmp    $0x8,%edi
jl     1428 <lsx_dfct+0x2c8>
mov    %r15d,%eax
add    $0x2,%eax
lea    (%r15,%r15,1),%ecx
add    $0xfffffffb,%ecx
nopl   0x0(%rax,%rax,1)
lea    -0x4(%rax),%edx
movsd  (%r14,%rdx,8),%xmm0
lea    -0x3(%rax),%edx
movsd  (%r14,%rdx,8),%xmm1
addsd  %xmm0,%xmm1
lea    0x2(%rcx),%esi
movsd  %xmm1,(%r14,%rsi,8)
subsd  (%r14,%rdx,8),%xmm0
mov    %ecx,%edx
movsd  %xmm0,(%r14,%rdx,8)
add    $0xfffffffe,%eax
add    $0xfffffffc,%ecx
cmp    $0x5,%eax
jg     13f0 <lsx_dfct+0x290>
mov    $0x2,%eax
cmp    $0x8,%edi
jb     17f0 <lsx_dfct+0x690>
addq   $0x8,0x20(%rsp)
lea    0x8(%rbx),%rax
mov    %rax,0x38(%rsp)
movl   $0x2,0x4(%rsp)
jmp    1470 <lsx_dfct+0x310>
nop
lea    (%r12,%r15,1),%eax
movsd  (%rbx,%rax,8),%xmm0
mov    %r12d,%eax
movsd  %xmm0,(%rbx,%rax,8)
cmp    $0x3,%r15d
mov    0x30(%rsp),%r13
jbe    17eb <lsx_dfct+0x68b>
mov    %r12d,%r15d
mov    %r12d,%edi
mov    %rbx,%rsi
mov    0x10(%rsp),%rbp
mov    %ebp,%edx
mov    0x40(%rsp),%r12
mov    %r12,%rcx
call   1030 <dctsub@plt>
cmp    $0x5,%r15d
jb     14d0 <lsx_dfct+0x370>
mov    %r15d,%edi
mov    0x20(%rsp),%rsi
mov    %rbx,%rdx
call   1060 <bitrv2@plt>
mov    %r15d,%edi
mov    %rbx,%rsi
mov    %r13,%rdx
call   1080 <cftfsub@plt>
mov    %r15d,%edi
mov    %rbx,%rsi
mov    %ebp,%edx
mov    %r12,%rcx
call   1050 <rftfsub@plt>
mov    0x8(%rsp),%rax
mov    0x4(%rsp),%r12d
jmp    14f5 <lsx_dfct+0x395>
nopl   (%rax)
cmp    $0x4,%r15d
mov    0x8(%rsp),%rax
mov    0x4(%rsp),%r12d
jne    14f5 <lsx_dfct+0x395>
mov    $0x4,%edi
mov    %rbx,%rsi
mov    %r13,%rdx
call   1080 <cftfsub@plt>
mov    0x8(%rsp),%rax
movsd  (%rbx),%xmm0
subsd  0x8(%rbx),%xmm0
sub    %r12d,%eax
cltq
movsd  %xmm0,(%r14,%rax,8)
movsd  (%rbx),%xmm0
addsd  0x8(%rbx),%xmm0
movslq %r12d,%rax
movsd  %xmm0,(%r14,%rax,8)
mov    %r15d,%ecx
cmp    $0x3,%r15d
jb     157c <lsx_dfct+0x41c>
lea    0x0(,%rax,4),%edx
movslq %edx,%rbp
lea    (%r14,%rax,8),%rdx
shl    $0x3,%rax
mov    %r14,%rsi
sub    %rax,%rsi
mov    $0x2,%edi
mov    %rbp,%rax
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  (%rbx,%rdi,8),%xmm0
subsd  0x8(%rbx,%rdi,8),%xmm0
movsd  %xmm0,(%rsi,%rax,8)
movsd  (%rbx,%rdi,8),%xmm0
addsd  0x8(%rbx,%rdi,8),%xmm0
movsd  %xmm0,(%rdx,%rax,8)
add    $0x2,%rdi
add    %rbp,%rax
cmp    %rcx,%rdi
jb     1550 <lsx_dfct+0x3f0>
add    %r12d,%r12d
mov    %r12d,0x4(%rsp)
mov    %r15d,%r12d
shr    %r12d
cmp    $0x1,%r15d
jbe    17da <lsx_dfct+0x67a>
cmp    $0x2,%r12d
mov    $0x1,%esi
cmovae %r12d,%esi
cmp    $0x2,%esi
jae    1670 <lsx_dfct+0x510>
xor    %eax,%eax
mov    %rax,%rdx
test   $0x1,%sil
je     15e7 <lsx_dfct+0x487>
mov    %rcx,%rdx
sub    %rax,%rdx
lea    (%rdx,%rcx,1),%rdi
movsd  (%rbx,%rdi,8),%xmm0
lea    (%rax,%rcx,1),%rbp
movsd  (%rbx,%rbp,8),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rbx,%rax,8)
addsd  (%rbx,%rdi,8),%xmm1
movsd  %xmm1,(%rbx,%rdx,8)
mov    %rax,%rdx
or     $0x1,%rdx
not    %rax
add    %rsi,%rax
je     1450 <lsx_dfct+0x2f0>
lea    (%rdx,%rcx,1),%rax
add    $0x1,%rax
mov    %rcx,%rdi
sub    %rdx,%rdi
shl    $0x4,%rcx
lea    0x0(,%rdx,8),%rbp
sub    %rbp,%rcx
movsd  (%rbx,%rcx,1),%xmm0
movsd  -0x8(%rbx,%rax,8),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rbx,%rdx,8)
addsd  (%rbx,%rcx,1),%xmm1
movsd  %xmm1,(%rbx,%rdi,8)
movsd  -0x8(%rbx,%rcx,1),%xmm0
movsd  (%rbx,%rax,8),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rbx,%rdx,8)
addsd  -0x8(%rbx,%rcx,1),%xmm1
movsd  %xmm1,-0x8(%rbx,%rdi,8)
add    $0x2,%rdx
add    $0x2,%rax
add    $0xfffffffffffffffe,%rdi
add    $0xfffffffffffffff0,%rcx
cmp    %rdx,%rsi
jne    1610 <lsx_dfct+0x4b0>
jmp    1450 <lsx_dfct+0x2f0>
nopl   0x0(%rax)
lea    -0x1(%rsi),%rax
mov    $0x8,%edx
mul    %rdx
lea    (%rbx,%rcx,8),%r8
seto   %dl
mov    %r8,%rdi
sub    %rax,%rdi
cmp    %r8,%rdi
ja     15aa <lsx_dfct+0x44a>
test   %dl,%dl
jne    15aa <lsx_dfct+0x44a>
mov    %rcx,%rbp
shl    $0x4,%rbp
lea    (%rbx,%rbp,1),%r10
mov    %r10,%rdi
sub    %rax,%rdi
cmp    %r10,%rdi
ja     15aa <lsx_dfct+0x44a>
mov    $0x0,%eax
test   %dl,%dl
jne    15ac <lsx_dfct+0x44c>
mov    0x38(%rsp),%rdx
cmp    %rbx,%rdx
seta   (%rsp)
lea    (%rbx,%rsi,8),%rdi
lea    (%rcx,%rsi,1),%rax
lea    (%rbx,%rax,8),%r11
mov    %r11,0x18(%rsp)
mov    %rcx,%rax
sub    %rsi,%rax
lea    (%rdx,%rax,8),%r9
lea    (%rdx,%rcx,8),%r13
lea    (%rcx,%rcx,1),%rax
sub    %rsi,%rax
add    %rdx,%rbp
cmp    %rbx,%r11
seta   0x3(%rsp)
lea    (%rdx,%rax,8),%rdx
cmp    %rdi,%r8
setb   0x2(%rsp)
cmp    %rbx,%r13
seta   %al
cmp    %rdi,%r9
setb   0x1(%rsp)
cmp    %rbx,%rbp
seta   %r11b
cmp    %rdi,%rdx
setb   %dil
cmp    0x18(%rsp),%r9
setb   0x18(%rsp)
cmp    %rbp,%r9
setb   %r9b
cmp    %r13,%rdx
setb   %bpl
mov    0x2(%rsp),%dl
test   %dl,0x3(%rsp)
jne    15aa <lsx_dfct+0x44a>
and    0x1(%rsp),%al
jne    15aa <lsx_dfct+0x44a>
and    %dil,%r11b
jne    15aa <lsx_dfct+0x44a>
mov    0x18(%rsp),%al
and    %al,(%rsp)
jne    15aa <lsx_dfct+0x44a>
mov    $0x0,%eax
and    %bpl,%r9b
jne    15ac <lsx_dfct+0x44c>
mov    %esi,%eax
and    $0x1ffffffe,%eax
mov    $0xfffffffffffffff8,%rbp
xor    %edx,%edx
nopw   0x0(%rax,%rax,1)
movupd (%r10,%rbp,1),%xmm0
shufpd $0x1,%xmm0,%xmm0
movupd (%r8,%rdx,8),%xmm1
subpd  %xmm1,%xmm0
movupd %xmm0,(%rbx,%rdx,8)
movupd (%r10,%rbp,1),%xmm0
shufpd $0x1,%xmm1,%xmm1
addpd  %xmm0,%xmm1
movupd %xmm1,(%r8,%rbp,1)
add    $0x2,%rdx
add    $0xfffffffffffffff0,%rbp
cmp    %rdx,%rax
jne    1790 <lsx_dfct+0x630>
cmp    %rsi,%rax
je     1450 <lsx_dfct+0x2f0>
jmp    15ac <lsx_dfct+0x44c>
add    %r12d,%r15d
movsd  (%rbx,%r15,8),%xmm0
mov    %r12d,%eax
movsd  %xmm0,(%rbx,%rax,8)
movslq 0x4(%rsp),%rax
movsd  (%rbx),%xmm0
movsd  %xmm0,(%r14,%rax,8)
movsd  0x10(%rbx),%xmm0
subsd  0x8(%rbx),%xmm0
mov    0x28(%rsp),%rax
movsd  %xmm0,(%r14,%rax,8)
movsd  0x10(%rbx),%xmm0
addsd  0x8(%rbx),%xmm0
movsd  %xmm0,(%r14)
add    $0x48,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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