void Daub97Synthesis1D(double *signal_in, double *signal_out,
                       int signal_length) {
  double *even, *odd;
  int i, half;
  half = signal_length >> 1;
  even = signal_in;
  odd = signal_in + half;
  for (i = 0; i < half; i++) {
    signal_out[i << 1] = even[i];
    signal_out[(i << 1) + 1] = odd[i];
  }
  for (i = 1; i < signal_length; i += 2)
    signal_out[i] *= (-1.14960430535816);
  signal_out[0] =
      signal_out[0] / 1.14960430535816 - 2 * 0.44350482244527 * signal_out[1];
  for (i = 2; i < signal_length; i += 2)
    signal_out[i] = signal_out[i] / 1.14960430535816 -
                    0.44350482244527 * (signal_out[i + 1] + signal_out[i - 1]);
  for (i = 1; i < signal_length - 2; i += 2)
    signal_out[i] -= 0.88293362717904 * (signal_out[i - 1] + signal_out[i + 1]);
  signal_out[signal_length - 1] -=
      2 * 0.88293362717904 * signal_out[signal_length - 2];
  signal_out[0] -= 2 * -0.05297864003258 * signal_out[1];
  for (i = 2; i < signal_length; i += 2)
    signal_out[i] -=
        -0.05297864003258 * (signal_out[i + 1] + signal_out[i - 1]);
  for (i = 1; i < signal_length - 2; i += 2)
    signal_out[i] -=
        -1.58615986717275 * (signal_out[i - 1] + signal_out[i + 1]);
  signal_out[signal_length - 1] -=
      2 * -1.58615986717275 * signal_out[signal_length - 2];
}


x86 assembly (clang, -O0):
<Daub97Synthesis1D>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    -0x14(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x30(%rbp),%eax
jge    1195 <Daub97Synthesis1D+0x95>
mov    -0x20(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%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    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    113a <Daub97Synthesis1D+0x3a>
movl   $0x1,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    11d0 <Daub97Synthesis1D+0xd0>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  0xe90(%rip),%xmm0
mulsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x2c(%rbp)
jmp    119c <Daub97Synthesis1D+0x9c>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
movsd  0xe28(%rip),%xmm0
divsd  %xmm0,%xmm1
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  0xe0b(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x2,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1280 <Daub97Synthesis1D+0x180>
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  0xddb(%rip),%xmm0
divsd  %xmm0,%xmm1
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  0xde3(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x2c(%rbp)
jmp    120c <Daub97Synthesis1D+0x10c>
movl   $0x1,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x14(%rbp),%ecx
sub    $0x2,%ecx
cmp    %ecx,%eax
jge    12ec <Daub97Synthesis1D+0x1ec>
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%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
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  0xd67(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x2c(%rbp)
jmp    1287 <Daub97Synthesis1D+0x187>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  0xd00(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm1
movsd  0xcd2(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
movl   $0x2,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    13b1 <Daub97Synthesis1D+0x2b1>
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  0xc9a(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x2c(%rbp)
jmp    1351 <Daub97Synthesis1D+0x251>
movl   $0x1,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x14(%rbp),%ecx
sub    $0x2,%ecx
cmp    %ecx,%eax
jge    141d <Daub97Synthesis1D+0x31d>
mov    -0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%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
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  0xc26(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x2c(%rbp)
jmp    13b8 <Daub97Synthesis1D+0x2b8>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  0xbd7(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
pop    %rbp
ret

x86 assembly (clang, -O2):
<Daub97Synthesis1D>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %edx,%r14d
cmp    $0x2,%edx
jl     1387 <Daub97Synthesis1D+0x287>
mov    %edx,%eax
sar    %eax
movslq %eax,%r8
lea    (%rdi,%r8,8),%r10
cmp    $0x2,%r8d
mov    $0x1,%r9d
cmovge %r8d,%r9d
cmp    $0x2,%r9d
jae    11cb <Daub97Synthesis1D+0xcb>
xor    %ecx,%ecx
mov    %rcx,%rax
not    %rax
test   $0x1,%r9b
je     1168 <Daub97Synthesis1D+0x68>
movsd  (%rdi,%rcx,8),%xmm0
mov    %rcx,%rbp
shl    $0x4,%rbp
movsd  %xmm0,(%rsi,%rbp,1)
movsd  (%r10,%rcx,8),%xmm0
movsd  %xmm0,0x8(%rsi,%rbp,1)
or     $0x1,%rcx
add    %r9,%rax
je     12d3 <Daub97Synthesis1D+0x1d3>
mov    %rcx,%rax
shl    $0x4,%rax
add    %rsi,%rax
add    $0x18,%rax
lea    (%rdi,%r8,8),%rbx
add    $0x8,%rbx
nopw   0x0(%rax,%rax,1)
movsd  (%rdi,%rcx,8),%xmm0
movsd  %xmm0,-0x18(%rax)
movsd  -0x8(%rbx,%rcx,8),%xmm0
movsd  %xmm0,-0x10(%rax)
movsd  0x8(%rdi,%rcx,8),%xmm0
movsd  %xmm0,-0x8(%rax)
movsd  (%rbx,%rcx,8),%xmm0
movsd  %xmm0,(%rax)
add    $0x2,%rcx
add    $0x20,%rax
cmp    %rcx,%r9
jne    1190 <Daub97Synthesis1D+0x90>
jmp    12d3 <Daub97Synthesis1D+0x1d3>
mov    %r9,%rcx
shl    $0x4,%rcx
add    %rsi,%rcx
lea    (%r8,%r9,1),%rax
lea    (%rdi,%rax,8),%rax
lea    (%rdi,%r9,8),%rbx
cmp    %rsi,%rax
seta   %r11b
cmp    %rcx,%r10
setb   %bpl
cmp    %rsi,%rbx
seta   %al
cmp    %rdi,%rcx
seta   %bl
xor    %ecx,%ecx
test   %bpl,%r11b
jne    113b <Daub97Synthesis1D+0x3b>
and    %bl,%al
jne    113b <Daub97Synthesis1D+0x3b>
mov    %r9d,%ecx
and    $0x7ffffffe,%ecx
lea    -0x2(%rcx),%rax
mov    %rax,%r11
shr    %r11
add    $0x1,%r11
test   %rax,%rax
je     1789 <Daub97Synthesis1D+0x689>
mov    %r11,%r12
and    $0xfffffffffffffffe,%r12
lea    0x10(%rdi),%r15
lea    0x20(%rsi),%rax
lea    (%rdi,%r8,8),%r13
add    $0x10,%r13
xor    %ebx,%ebx
nopw   0x0(%rax,%rax,1)
movups -0x10(%r15,%rbx,8),%xmm0
movups -0x10(%r13,%rbx,8),%xmm1
movaps %xmm0,%xmm2
movlhps %xmm1,%xmm2
unpckhpd %xmm1,%xmm0
movups %xmm0,-0x10(%rax)
movups %xmm2,-0x20(%rax)
movupd (%r15,%rbx,8),%xmm0
movupd 0x0(%r13,%rbx,8),%xmm1
movapd %xmm0,%xmm2
unpcklpd %xmm1,%xmm2
unpckhpd %xmm1,%xmm0
movupd %xmm0,0x10(%rax)
movupd %xmm2,(%rax)
add    $0x4,%rbx
add    $0x40,%rax
add    $0xfffffffffffffffe,%r12
jne    1250 <Daub97Synthesis1D+0x150>
test   $0x1,%r11b
je     12ca <Daub97Synthesis1D+0x1ca>
movupd (%rdi,%rbx,8),%xmm0
movupd (%r10,%rbx,8),%xmm1
shl    $0x4,%rbx
movapd %xmm0,%xmm2
unpcklpd %xmm1,%xmm2
unpckhpd %xmm1,%xmm0
movupd %xmm0,0x10(%rsi,%rbx,1)
movupd %xmm2,(%rsi,%rbx,1)
cmp    %r9,%rcx
jne    113b <Daub97Synthesis1D+0x3b>
cmp    $0x2,%edx
jl     1387 <Daub97Synthesis1D+0x287>
lea    -0x2(%r14),%rax
mov    %rax,%rdi
shr    %rdi
add    $0x1,%rdi
mov    %edi,%ecx
and    $0x3,%ecx
mov    $0x1,%ebx
cmp    $0x6,%rax
jb     1358 <Daub97Synthesis1D+0x258>
and    $0xfffffffffffffffc,%rdi
mov    $0x1,%ebx
movsd  0xcf5(%rip),%xmm0
nopl   0x0(%rax,%rax,1)
movsd  (%rsi,%rbx,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%rsi,%rbx,8)
movsd  0x10(%rsi,%rbx,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,0x10(%rsi,%rbx,8)
movsd  0x20(%rsi,%rbx,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,0x20(%rsi,%rbx,8)
movsd  0x30(%rsi,%rbx,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,0x30(%rsi,%rbx,8)
add    $0x8,%rbx
add    $0xfffffffffffffffc,%rdi
jne    1310 <Daub97Synthesis1D+0x210>
test   %rcx,%rcx
je     1387 <Daub97Synthesis1D+0x287>
lea    (%rsi,%rbx,8),%rax
shl    $0x4,%rcx
xor    %edi,%edi
movsd  0xc91(%rip),%xmm0
nop
movsd  (%rax,%rdi,1),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%rax,%rdi,1)
add    $0x10,%rdi
cmp    %rdi,%rcx
jne    1370 <Daub97Synthesis1D+0x270>
movsd  (%rsi),%xmm1
movsd  0x8(%rsi),%xmm0
divsd  0xc70(%rip),%xmm1
mulsd  0xc70(%rip),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,(%rsi)
cmp    $0x2,%edx
jle    1577 <Daub97Synthesis1D+0x477>
cmp    $0x5,%r14
mov    $0x4,%edi
cmovae %r14,%rdi
add    $0xfffffffffffffffd,%rdi
mov    $0x2,%ecx
cmp    $0x3,%rdi
jbe    144e <Daub97Synthesis1D+0x34e>
shr    %rdi
add    $0x1,%rdi
mov    %edi,%eax
and    $0x1,%eax
test   %rax,%rax
mov    $0x2,%ecx
cmovne %rax,%rcx
sub    %rcx,%rdi
lea    (%rdi,%rdi,1),%rcx
add    $0x2,%rcx
lea    0x20(%rsi),%rax
movapd 0xc50(%rip),%xmm1
movapd 0xc58(%rip),%xmm2
nopl   0x0(%rax,%rax,1)
movupd -0x18(%rax),%xmm3
movupd -0x8(%rax),%xmm4
movapd %xmm3,%xmm5
unpckhpd %xmm4,%xmm5
unpcklpd %xmm4,%xmm3
movhpd 0x8(%rax),%xmm4
divpd  %xmm1,%xmm5
addpd  %xmm3,%xmm4
mulpd  %xmm2,%xmm4
addpd  %xmm5,%xmm4
movlpd %xmm4,-0x10(%rax)
movhpd %xmm4,(%rax)
add    $0x20,%rax
add    $0xfffffffffffffffe,%rdi
jne    1410 <Daub97Synthesis1D+0x310>
movsd  0xbb2(%rip),%xmm1
movsd  0xbba(%rip),%xmm2
xchg   %ax,%ax
lea    0x0(,%rcx,8),%rax
movsd  (%rsi,%rcx,8),%xmm3
divsd  %xmm1,%xmm3
or     $0x8,%rax
movsd  (%rsi,%rax,1),%xmm4
addsd  -0x8(%rsi,%rcx,8),%xmm4
mulsd  %xmm2,%xmm4
addsd  %xmm3,%xmm4
movsd  %xmm4,(%rsi,%rcx,8)
add    $0x2,%rcx
cmp    %r14,%rcx
jb     1460 <Daub97Synthesis1D+0x360>
lea    -0x2(%rdx),%eax
cmp    $0x4,%edx
setge  %r8b
jl     157a <Daub97Synthesis1D+0x47a>
mov    %eax,%ecx
cmp    $0x4,%rcx
mov    $0x3,%r10d
cmovae %rcx,%r10
add    $0xfffffffffffffffe,%r10
mov    $0x1,%edi
cmp    $0x2,%r10
jb     1540 <Daub97Synthesis1D+0x440>
shr    %r10
add    $0x1,%r10
movabs $0x7ffffffffffffffe,%r9
ff ff 7f
and    %r10,%r9
lea    (%r9,%r9,1),%rdi
add    $0x1,%rdi
unpcklpd %xmm0,%xmm0
lea    0x8(%rsi),%rax
movapd 0xb7f(%rip),%xmm1
mov    %r9,%rbx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movapd %xmm0,%xmm2
movups (%rax),%xmm3
movups 0x10(%rax),%xmm0
movaps %xmm3,%xmm4
movlhps %xmm0,%xmm4
movhlps %xmm3,%xmm0
unpckhpd %xmm3,%xmm2
addpd  %xmm0,%xmm2
mulpd  %xmm1,%xmm2
addpd  %xmm4,%xmm2
movlpd %xmm2,(%rax)
movhpd %xmm2,0x10(%rax)
add    $0x20,%rax
add    $0xfffffffffffffffe,%rbx
jne    1500 <Daub97Synthesis1D+0x400>
cmp    %r9,%r10
je     1580 <Daub97Synthesis1D+0x480>
unpckhpd %xmm0,%xmm0
movsd  0xad8(%rip),%xmm1
nopl   0x0(%rax,%rax,1)
movsd  0x8(%rsi,%rdi,8),%xmm2
addsd  %xmm2,%xmm0
mulsd  %xmm1,%xmm0
addsd  (%rsi,%rdi,8),%xmm0
movsd  %xmm0,(%rsi,%rdi,8)
add    $0x2,%rdi
movapd %xmm2,%xmm0
cmp    %rcx,%rdi
jb     1550 <Daub97Synthesis1D+0x450>
jmp    1580 <Daub97Synthesis1D+0x480>
lea    -0x2(%rdx),%eax
movslq %eax,%rcx
xor    %r8d,%r8d
movslq %edx,%r9
movsd  (%rsi,%rcx,8),%xmm0
mulsd  0xa98(%rip),%xmm0
addsd  -0x8(%rsi,%r9,8),%xmm0
movsd  %xmm0,-0x8(%rsi,%r9,8)
movsd  0x8(%rsi),%xmm0
mulsd  0xa85(%rip),%xmm0
addsd  (%rsi),%xmm0
movsd  %xmm0,(%rsi)
cmp    $0x3,%edx
jl     168e <Daub97Synthesis1D+0x58e>
cmp    $0x5,%r14
mov    $0x4,%ebx
cmovae %r14,%rbx
add    $0xfffffffffffffffd,%rbx
mov    $0x2,%edx
cmp    $0x3,%rbx
jbe    164a <Daub97Synthesis1D+0x54a>
shr    %rbx
add    $0x1,%rbx
mov    %ebx,%eax
and    $0x1,%eax
test   %rax,%rax
mov    $0x2,%edx
cmovne %rax,%rdx
sub    %rdx,%rbx
lea    (%rbx,%rbx,1),%rdx
add    $0x2,%rdx
lea    0x20(%rsi),%rax
movapd 0xa79(%rip),%xmm1
nopw   0x0(%rax,%rax,1)
movupd -0x18(%rax),%xmm2
movupd -0x8(%rax),%xmm3
movapd %xmm2,%xmm4
unpckhpd %xmm3,%xmm4
unpcklpd %xmm3,%xmm2
movhpd 0x8(%rax),%xmm3
addpd  %xmm2,%xmm3
mulpd  %xmm1,%xmm3
addpd  %xmm4,%xmm3
movlpd %xmm3,-0x10(%rax)
movhpd %xmm3,(%rax)
add    $0x20,%rax
add    $0xfffffffffffffffe,%rbx
jne    1610 <Daub97Synthesis1D+0x510>
movsd  0x9e6(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
lea    0x0(,%rdx,8),%rax
or     $0x8,%rax
movsd  (%rsi,%rax,1),%xmm2
addsd  -0x8(%rsi,%rdx,8),%xmm2
mulsd  %xmm1,%xmm2
addsd  (%rsi,%rdx,8),%xmm2
movsd  %xmm2,(%rsi,%rdx,8)
add    $0x2,%rdx
cmp    %r14,%rdx
jb     1660 <Daub97Synthesis1D+0x560>
add    $0xffffffffffffffff,%r9
test   %r8b,%r8b
je     1765 <Daub97Synthesis1D+0x665>
cmp    $0x4,%rcx
mov    $0x3,%edx
cmovge %rcx,%rdx
add    $0xfffffffffffffffe,%rdx
mov    $0x1,%eax
cmp    $0x2,%rdx
jb     1730 <Daub97Synthesis1D+0x630>
shr    %rdx
add    $0x1,%rdx
movabs $0x7ffffffffffffffe,%r8
ff ff 7f
and    %rdx,%r8
lea    (%r8,%r8,1),%rax
add    $0x1,%rax
unpcklpd %xmm0,%xmm0
lea    0x8(%rsi),%rbx
movapd 0x9ad(%rip),%xmm1
mov    %r8,%rdi
cs nopw 0x0(%rax,%rax,1)
movapd %xmm0,%xmm2
movups (%rbx),%xmm3
movups 0x10(%rbx),%xmm0
movaps %xmm3,%xmm4
movlhps %xmm0,%xmm4
movhlps %xmm3,%xmm0
unpckhpd %xmm3,%xmm2
addpd  %xmm0,%xmm2
mulpd  %xmm1,%xmm2
addpd  %xmm4,%xmm2
movlpd %xmm2,(%rbx)
movhpd %xmm2,0x10(%rbx)
add    $0x20,%rbx
add    $0xfffffffffffffffe,%rdi
jne    16f0 <Daub97Synthesis1D+0x5f0>
cmp    %r8,%rdx
je     1765 <Daub97Synthesis1D+0x665>
unpckhpd %xmm0,%xmm0
movsd  0x908(%rip),%xmm1
nopl   0x0(%rax,%rax,1)
movsd  0x8(%rsi,%rax,8),%xmm2
addsd  %xmm2,%xmm0
mulsd  %xmm1,%xmm0
addsd  (%rsi,%rax,8),%xmm0
movsd  %xmm0,(%rsi,%rax,8)
add    $0x2,%rax
movapd %xmm2,%xmm0
cmp    %rcx,%rax
jl     1740 <Daub97Synthesis1D+0x640>
movsd  (%rsi,%rcx,8),%xmm0
mulsd  0x8d6(%rip),%xmm0
addsd  (%rsi,%r9,8),%xmm0
movsd  %xmm0,(%rsi,%r9,8)
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %ebx,%ebx
test   $0x1,%r11b
jne    12a4 <Daub97Synthesis1D+0x1a4>
jmp    12ca <Daub97Synthesis1D+0x1ca>

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

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