void dradb4(long ido, long l1, const double *cc, double *ch, const double *wa1,
            const double *wa2, const double *wa3) {
  static double sqrt2 = 1.4142135623730950488016887242097;
  long i, k, t0, t1, t2, t3, t4, t5, t6, t7, t8;
  double ci2, ci3, ci4, cr2, cr3, cr4, ti1, ti2, ti3, ti4, tr1, tr2, tr3, tr4;
  t0 = l1 * ido;
  t1 = 0;
  t2 = ido << 2;
  t3 = 0;
  t6 = ido << 1;
  for (k = 0; k < l1; k++) {
    t4 = t3 + t6;
    t5 = t1;
    tr3 = cc[t4 - 1] + cc[t4 - 1];
    tr4 = cc[t4] + cc[t4];
    tr1 = cc[t3] - cc[(t4 += t6) - 1];
    tr2 = cc[t3] + cc[t4 - 1];
    ch[t5] = tr2 + tr3;
    ch[t5 += t0] = tr1 - tr4;
    ch[t5 += t0] = tr2 - tr3;
    ch[t5 += t0] = tr1 + tr4;
    t1 += ido;
    t3 += t2;
  }
  if (ido < 2)
    return;
  if (ido == 2)
    goto L105;
  t1 = 0;
  for (k = 0; k < l1; k++) {
    t5 = (t4 = (t3 = (t2 = t1 << 2) + t6)) + t6;
    t7 = t1;
    for (i = 2; i < ido; i += 2) {
      t2 += 2;
      t3 += 2;
      t4 -= 2;
      t5 -= 2;
      t7 += 2;
      ti1 = cc[t2] + cc[t5];
      ti2 = cc[t2] - cc[t5];
      ti3 = cc[t3] - cc[t4];
      tr4 = cc[t3] + cc[t4];
      tr1 = cc[t2 - 1] - cc[t5 - 1];
      tr2 = cc[t2 - 1] + cc[t5 - 1];
      ti4 = cc[t3 - 1] - cc[t4 - 1];
      tr3 = cc[t3 - 1] + cc[t4 - 1];
      ch[t7 - 1] = tr2 + tr3;
      cr3 = tr2 - tr3;
      ch[t7] = ti2 + ti3;
      ci3 = ti2 - ti3;
      cr2 = tr1 - tr4;
      cr4 = tr1 + tr4;
      ci2 = ti1 + ti4;
      ci4 = ti1 - ti4;
      ch[(t8 = t7 + t0) - 1] = wa1[i - 2] * cr2 - wa1[i - 1] * ci2;
      ch[t8] = wa1[i - 2] * ci2 + wa1[i - 1] * cr2;
      ch[(t8 += t0) - 1] = wa2[i - 2] * cr3 - wa2[i - 1] * ci3;
      ch[t8] = wa2[i - 2] * ci3 + wa2[i - 1] * cr3;
      ch[(t8 += t0) - 1] = wa3[i - 2] * cr4 - wa3[i - 1] * ci4;
      ch[t8] = wa3[i - 2] * ci4 + wa3[i - 1] * cr4;
    }
    t1 += ido;
  }
  if (ido % 2 == 1)
    return;
L105:
  t1 = ido;
  t2 = ido << 2;
  t3 = ido - 1;
  t4 = ido + (ido << 1);
  for (k = 0; k < l1; k++) {
    t5 = t3;
    ti1 = cc[t1] + cc[t4];
    ti2 = cc[t4] - cc[t1];
    tr1 = cc[t1 - 1] - cc[t4 - 1];
    tr2 = cc[t1 - 1] + cc[t4 - 1];
    ch[t5] = tr2 + tr2;
    ch[t5 += t0] = sqrt2 * (tr1 - ti1);
    ch[t5 += t0] = ti2 + ti2;
    ch[t5 += t0] = -sqrt2 * (tr1 + ti1);
    t3 += ido;
    t1 += t2;
    t4 += t2;
  }
}


x86 assembly (clang, -O0):
<dradb4>:
push   %rbp
mov    %rsp,%rbp
sub    $0x78,%rsp
mov    0x10(%rbp),%rax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
mov    -0x10(%rbp),%rax
imul   -0x8(%rbp),%rax
mov    %rax,-0x48(%rbp)
movq   $0x0,-0x50(%rbp)
mov    -0x8(%rbp),%rax
shl    $0x2,%rax
mov    %rax,-0x58(%rbp)
movq   $0x0,-0x60(%rbp)
mov    -0x8(%rbp),%rax
shl    $0x1,%rax
mov    %rax,-0x78(%rbp)
movq   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    12d8 <dradb4+0x1d8>
mov    -0x60(%rbp),%rax
add    -0x78(%rbp),%rax
mov    %rax,-0x68(%rbp)
mov    -0x50(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x68(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x68(%rbp),%rcx
sub    $0x1,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xf0(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x68(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x68(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xf8(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x60(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x78(%rbp),%rcx
add    -0x68(%rbp),%rcx
mov    %rcx,-0x68(%rbp)
sub    $0x1,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x60(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x68(%rbp),%rcx
sub    $0x1,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xe8(%rbp)
ff
movsd  -0xe8(%rbp),%xmm0
ff
addsd  -0xf0(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
mov    -0x70(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0xe0(%rbp),%xmm0
ff
subsd  -0xf8(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
mov    -0x48(%rbp),%rcx
add    -0x70(%rbp),%rcx
mov    %rcx,-0x70(%rbp)
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0xe8(%rbp),%xmm0
ff
subsd  -0xf0(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
mov    -0x48(%rbp),%rcx
add    -0x70(%rbp),%rcx
mov    %rcx,-0x70(%rbp)
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0xe0(%rbp),%xmm0
ff
addsd  -0xf8(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
mov    -0x48(%rbp),%rcx
add    -0x70(%rbp),%rcx
mov    %rcx,-0x70(%rbp)
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
add    -0x50(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x58(%rbp),%rax
add    -0x60(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    1161 <dradb4+0x61>
cmpq   $0x2,-0x8(%rbp)
jge    12e8 <dradb4+0x1e8>
jmp    19e2 <dradb4+0x8e2>
cmpq   $0x2,-0x8(%rbp)
jne    12f8 <dradb4+0x1f8>
jmp    1809 <dradb4+0x709>
movq   $0x0,-0x50(%rbp)
movq   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    17e7 <dradb4+0x6e7>
mov    -0x50(%rbp),%rax
shl    $0x2,%rax
mov    %rax,-0x58(%rbp)
add    -0x78(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    %rax,-0x68(%rbp)
add    -0x78(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x50(%rbp),%rax
mov    %rax,-0x80(%rbp)
movq   $0x2,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x8(%rbp),%rax
jge    17ca <dradb4+0x6ca>
mov    -0x58(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x58(%rbp)
mov    -0x60(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x60(%rbp)
mov    -0x68(%rbp),%rax
sub    $0x2,%rax
mov    %rax,-0x68(%rbp)
mov    -0x70(%rbp),%rax
sub    $0x2,%rax
mov    %rax,-0x70(%rbp)
mov    -0x80(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x80(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x58(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x70(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x58(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x70(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x60(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x68(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x60(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x68(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xf8(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x58(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x70(%rbp),%rcx
sub    $0x1,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x58(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x70(%rbp),%rcx
sub    $0x1,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xe8(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x60(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x68(%rbp),%rcx
sub    $0x1,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x60(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x68(%rbp),%rcx
sub    $0x1,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xf0(%rbp)
ff
movsd  -0xe8(%rbp),%xmm0
ff
addsd  -0xf0(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
mov    -0x80(%rbp),%rcx
sub    $0x1,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0xe8(%rbp),%xmm0
ff
subsd  -0xf0(%rbp),%xmm0
ff
movsd  %xmm0,-0xb0(%rbp)
ff
movsd  -0xc8(%rbp),%xmm0
addsd  -0xd0(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
mov    -0x80(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0xc8(%rbp),%xmm0
ff
subsd  -0xd0(%rbp),%xmm0
ff
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0xe0(%rbp),%xmm0
ff
subsd  -0xf8(%rbp),%xmm0
ff
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  -0xe0(%rbp),%xmm0
ff
addsd  -0xf8(%rbp),%xmm0
ff
movsd  %xmm0,-0xb8(%rbp)
ff
movsd  -0xc0(%rbp),%xmm0
ff
addsd  -0xd8(%rbp),%xmm0
ff
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0xc0(%rbp),%xmm0
ff
subsd  -0xd8(%rbp),%xmm0
ff
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x2,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0xa8(%rbp),%xmm2
ff
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  -0x90(%rbp),%xmm1
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
mov    -0x80(%rbp),%rcx
add    -0x48(%rbp),%rcx
mov    %rcx,-0x88(%rbp)
sub    $0x1,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x2,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x90(%rbp),%xmm2
ff
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  -0xa8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
mov    -0x88(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x2,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0xb0(%rbp),%xmm2
ff
mov    -0x30(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  -0x98(%rbp),%xmm1
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
mov    -0x48(%rbp),%rcx
add    -0x88(%rbp),%rcx
mov    %rcx,-0x88(%rbp)
sub    $0x1,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x2,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x98(%rbp),%xmm2
ff
mov    -0x30(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  -0xb0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
mov    -0x88(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x2,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0xb8(%rbp),%xmm2
ff
mov    0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  -0xa0(%rbp),%xmm1
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
mov    -0x48(%rbp),%rcx
add    -0x88(%rbp),%rcx
mov    %rcx,-0x88(%rbp)
sub    $0x1,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x2,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0xa0(%rbp),%xmm2
ff
mov    0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
mov    -0x88(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x38(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x38(%rbp)
jmp    1346 <dradb4+0x246>
mov    -0x8(%rbp),%rax
add    -0x50(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    1308 <dradb4+0x208>
mov    -0x8(%rbp),%rax
mov    $0x2,%ecx
cqto
idiv   %rcx
cmp    $0x1,%rdx
jne    1804 <dradb4+0x704>
jmp    19e2 <dradb4+0x8e2>
jmp    1809 <dradb4+0x709>
mov    -0x8(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x8(%rbp),%rax
shl    $0x2,%rax
mov    %rax,-0x58(%rbp)
mov    -0x8(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x60(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x8(%rbp),%rcx
shl    $0x1,%rcx
add    %rcx,%rax
mov    %rax,-0x68(%rbp)
movq   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    19e2 <dradb4+0x8e2>
mov    -0x60(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x50(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x68(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x68(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x50(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x50(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x68(%rbp),%rcx
sub    $0x1,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x50(%rbp),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x68(%rbp),%rcx
sub    $0x1,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xe8(%rbp)
ff
movsd  -0xe8(%rbp),%xmm0
ff
addsd  -0xe8(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
mov    -0x70(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  0x2709(%rip),%xmm0
movsd  -0xe0(%rbp),%xmm1
ff
subsd  -0xc0(%rbp),%xmm1
ff
mulsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
mov    -0x48(%rbp),%rcx
add    -0x70(%rbp),%rcx
mov    %rcx,-0x70(%rbp)
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0xc8(%rbp),%xmm0
ff
addsd  -0xc8(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
mov    -0x48(%rbp),%rcx
add    -0x70(%rbp),%rcx
mov    %rcx,-0x70(%rbp)
movsd  %xmm0,(%rax,%rcx,8)
movsd  0x26b3(%rip),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  -0xe0(%rbp),%xmm1
ff
addsd  -0xc0(%rbp),%xmm1
ff
mulsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
mov    -0x48(%rbp),%rcx
add    -0x70(%rbp),%rcx
mov    %rcx,-0x70(%rbp)
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
add    -0x60(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x58(%rbp),%rax
add    -0x50(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x58(%rbp),%rax
add    -0x68(%rbp),%rax
mov    %rax,-0x68(%rbp)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    1844 <dradb4+0x744>
add    $0x78,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<dradb4>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rsi,%r12
imul   %rdi,%r12
mov    %rdi,-0x28(%rsp)
lea    (%rdi,%rdi,1),%rax
mov    %rax,-0x20(%rsp)
test   %rsi,%rsi
jle    11d2 <dradb4+0xd2>
mov    -0x28(%rsp),%rdi
lea    0x0(,%rdi,4),%rax
lea    0x0(,%rdi,8),%r10
lea    (%r12,%r12,2),%rdi
lea    (%rcx,%rdi,8),%r11
mov    %r12,%rbp
shl    $0x4,%rbp
add    %rcx,%rbp
lea    (%rcx,%r12,8),%r14
lea    (%rdx,%rax,8),%r15
add    $0xfffffffffffffff8,%r15
mov    -0x20(%rsp),%rax
lea    (%rdx,%rax,8),%rax
xor    %ebx,%ebx
mov    %rsi,%rdi
nopl   0x0(%rax)
movsd  -0x8(%rax,%rbx,4),%xmm0
movsd  (%rax,%rbx,4),%xmm1
addsd  %xmm0,%xmm0
addsd  %xmm1,%xmm1
movsd  (%rdx,%rbx,4),%xmm2
movsd  (%r15,%rbx,4),%xmm3
movapd %xmm2,%xmm4
subsd  %xmm3,%xmm4
addsd  %xmm3,%xmm2
movapd %xmm0,%xmm3
addsd  %xmm2,%xmm3
movsd  %xmm3,(%rcx,%rbx,1)
movapd %xmm4,%xmm3
subsd  %xmm1,%xmm3
movsd  %xmm3,(%r14,%rbx,1)
subsd  %xmm0,%xmm2
movsd  %xmm2,0x0(%rbp,%rbx,1)
addsd  %xmm1,%xmm4
movsd  %xmm4,(%r11,%rbx,1)
add    %r10,%rbx
add    $0xffffffffffffffff,%rdi
jne    1170 <dradb4+0x70>
mov    -0x28(%rsp),%rax
cmp    $0x2,%rax
jl     14ea <dradb4+0x3ea>
jne    11f1 <dradb4+0xf1>
test   %rsi,%rsi
jg     1418 <dradb4+0x318>
jmp    14ea <dradb4+0x3ea>
test   %rsi,%rsi
jle    13f1 <dradb4+0x2f1>
mov    0x38(%rsp),%rdi
xor    %ebp,%ebp
xor    %r15d,%r15d
mov    %rsi,-0x18(%rsp)
nopl   0x0(%rax)
mov    %rbp,-0x8(%rsp)
lea    0x0(,%r15,4),%r10
mov    -0x20(%rsp),%rax
lea    (%rax,%r15,4),%r14
lea    (%r14,%rax,1),%r13
mov    $0x2,%ebx
mov    %r14,%r11
mov    %r15,-0x10(%rsp)
mov    %r15,%rbp
nopw   0x0(%rax,%rax,1)
lea    0x2(%r10),%r15
movsd  0x10(%rdx,%r10,8),%xmm0
shl    $0x3,%r10
or     $0x8,%r10
movsd  (%rdx,%r10,1),%xmm3
lea    0x2(%r14),%rsi
movsd  -0x18(%rdx,%r13,8),%xmm4
movsd  -0x10(%rdx,%r13,8),%xmm2
movapd %xmm0,%xmm1
addsd  %xmm2,%xmm1
subsd  %xmm2,%xmm0
movsd  0x10(%rdx,%r14,8),%xmm9
movsd  -0x18(%rdx,%r11,8),%xmm6
movsd  -0x10(%rdx,%r11,8),%xmm2
movapd %xmm9,%xmm7
subsd  %xmm2,%xmm7
addsd  %xmm2,%xmm9
movapd %xmm3,%xmm2
subsd  %xmm4,%xmm2
addsd  %xmm4,%xmm3
shl    $0x3,%r14
or     $0x8,%r14
movsd  (%rdx,%r14,1),%xmm4
movapd %xmm4,%xmm8
subsd  %xmm6,%xmm8
addsd  %xmm6,%xmm4
movapd %xmm3,%xmm6
addsd  %xmm4,%xmm6
movsd  %xmm6,0x8(%rcx,%rbp,8)
subsd  %xmm4,%xmm3
movapd %xmm0,%xmm4
addsd  %xmm7,%xmm4
movsd  %xmm4,0x10(%rcx,%rbp,8)
subsd  %xmm7,%xmm0
movapd %xmm2,%xmm4
subsd  %xmm9,%xmm4
movapd %xmm1,%xmm6
addsd  %xmm8,%xmm6
movsd  -0x8(%r8,%rbx,8),%xmm7
mulsd  %xmm6,%xmm7
movsd  -0x10(%r8,%rbx,8),%xmm5
mulsd  %xmm4,%xmm5
subsd  %xmm7,%xmm5
lea    0x2(%rbp,%r12,1),%rax
movsd  %xmm5,-0x8(%rcx,%rax,8)
mulsd  -0x8(%r8,%rbx,8),%xmm4
mulsd  -0x10(%r8,%rbx,8),%xmm6
addsd  %xmm9,%xmm2
addsd  %xmm4,%xmm6
movsd  %xmm6,(%rcx,%rax,8)
movsd  -0x8(%r9,%rbx,8),%xmm4
mulsd  %xmm0,%xmm4
movsd  -0x10(%r9,%rbx,8),%xmm5
mulsd  %xmm3,%xmm5
subsd  %xmm4,%xmm5
add    %r12,%rax
movsd  %xmm5,-0x8(%rcx,%rax,8)
mulsd  -0x8(%r9,%rbx,8),%xmm3
subsd  %xmm8,%xmm1
mulsd  -0x10(%r9,%rbx,8),%xmm0
addsd  %xmm3,%xmm0
movsd  %xmm0,(%rcx,%rax,8)
movsd  -0x8(%rdi,%rbx,8),%xmm0
mulsd  %xmm1,%xmm0
movsd  -0x10(%rdi,%rbx,8),%xmm3
mulsd  %xmm2,%xmm3
subsd  %xmm0,%xmm3
add    %r12,%rax
movsd  %xmm3,-0x8(%rcx,%rax,8)
mulsd  -0x8(%rdi,%rbx,8),%xmm2
mulsd  -0x10(%rdi,%rbx,8),%xmm1
addsd  %xmm2,%xmm1
movsd  %xmm1,(%rcx,%rax,8)
add    $0xfffffffffffffffe,%r11
add    $0xfffffffffffffffe,%r13
add    $0x2,%rbp
add    $0x2,%rbx
mov    %r15,%r10
mov    -0x28(%rsp),%rax
mov    %rsi,%r14
cmp    %rax,%rbx
jl     1240 <dradb4+0x140>
mov    -0x10(%rsp),%r15
add    %rax,%r15
mov    -0x8(%rsp),%rbp
add    $0x1,%rbp
mov    -0x18(%rsp),%rsi
cmp    %rsi,%rbp
jne    1210 <dradb4+0x110>
test   %rsi,%rsi
jle    14ea <dradb4+0x3ea>
mov    %rax,%rbp
shr    $0x3f,%rbp
add    %rax,%rbp
and    $0xfffffffffffffffe,%rbp
mov    %rax,%rdi
sub    %rbp,%rdi
cmp    $0x1,%rdi
je     14ea <dradb4+0x3ea>
lea    (%rdx,%rax,8),%rbx
lea    0x0(,%rax,8),%r8
lea    (%rcx,%rax,8),%r9
add    $0xfffffffffffffff8,%r9
lea    (%rsi,%rsi,2),%rdi
add    $0x1,%rdi
imul   %rax,%rdi
lea    (%rcx,%rdi,8),%r10
add    $0xfffffffffffffff8,%r10
lea    (%rsi,%rsi,1),%rdi
add    $0x1,%rdi
imul   %rax,%rdi
lea    (%rcx,%rdi,8),%rbp
add    $0xfffffffffffffff8,%rbp
lea    0x1(%rsi),%rdi
imul   %rax,%rdi
lea    (%rcx,%rdi,8),%rcx
add    $0xfffffffffffffff8,%rcx
lea    (%rax,%rax,2),%rdi
lea    (%rdx,%rdi,8),%rdx
xor    %edi,%edi
movsd  0xb8a(%rip),%xmm0
movsd  0xb8a(%rip),%xmm1
xchg   %ax,%ax
movsd  -0x8(%rbx,%rdi,4),%xmm2
movsd  (%rbx,%rdi,4),%xmm3
movsd  -0x8(%rdx,%rdi,4),%xmm4
movsd  (%rdx,%rdi,4),%xmm5
movapd %xmm3,%xmm6
addsd  %xmm5,%xmm6
subsd  %xmm3,%xmm5
movapd %xmm2,%xmm3
subsd  %xmm4,%xmm3
addsd  %xmm4,%xmm2
addsd  %xmm2,%xmm2
movsd  %xmm2,(%r9,%rdi,1)
movapd %xmm3,%xmm2
subsd  %xmm6,%xmm2
mulsd  %xmm0,%xmm2
movsd  %xmm2,(%rcx,%rdi,1)
addsd  %xmm5,%xmm5
movsd  %xmm5,0x0(%rbp,%rdi,1)
addsd  %xmm6,%xmm3
mulsd  %xmm1,%xmm3
movsd  %xmm3,(%r10,%rdi,1)
add    %r8,%rdi
add    $0xffffffffffffffff,%rsi
jne    1480 <dradb4+0x380>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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