void passf4(int ido, int l1, const double cc[], double ch[], const double wa1[],
            const double wa2[], const double wa3[], int isign) {
  int i, k, ac, ah;
  double ci2, ci3, ci4, cr2, cr3, cr4, ti1, ti2, ti3, ti4, tr1, tr2, tr3, tr4;
  if (ido == 2) {
    for (k = 0; k < l1; k++) {
      ac = 4 * k * ido + 1;
      ti1 = cc[ac] - cc[ac + 2 * ido];
      ti2 = cc[ac] + cc[ac + 2 * ido];
      tr4 = cc[ac + 3 * ido] - cc[ac + ido];
      ti3 = cc[ac + ido] + cc[ac + 3 * ido];
      tr1 = cc[ac - 1] - cc[ac + 2 * ido - 1];
      tr2 = cc[ac - 1] + cc[ac + 2 * ido - 1];
      ti4 = cc[ac + ido - 1] - cc[ac + 3 * ido - 1];
      tr3 = cc[ac + ido - 1] + cc[ac + 3 * ido - 1];
      ah = k * ido;
      ch[ah] = tr2 + tr3;
      ch[ah + 2 * l1 * ido] = tr2 - tr3;
      ch[ah + 1] = ti2 + ti3;
      ch[ah + 2 * l1 * ido + 1] = ti2 - ti3;
      ch[ah + l1 * ido] = tr1 + isign * tr4;
      ch[ah + 3 * l1 * ido] = tr1 - isign * tr4;
      ch[ah + l1 * ido + 1] = ti1 + isign * ti4;
      ch[ah + 3 * l1 * ido + 1] = ti1 - isign * ti4;
    }
  } else {
    for (k = 0; k < l1; k++) {
      for (i = 0; i < ido - 1; i += 2) {
        ac = i + 1 + 4 * k * ido;
        ti1 = cc[ac] - cc[ac + 2 * ido];
        ti2 = cc[ac] + cc[ac + 2 * ido];
        ti3 = cc[ac + ido] + cc[ac + 3 * ido];
        tr4 = cc[ac + 3 * ido] - cc[ac + ido];
        tr1 = cc[ac - 1] - cc[ac + 2 * ido - 1];
        tr2 = cc[ac - 1] + cc[ac + 2 * ido - 1];
        ti4 = cc[ac + ido - 1] - cc[ac + 3 * ido - 1];
        tr3 = cc[ac + ido - 1] + cc[ac + 3 * ido - 1];
        ah = i + k * ido;
        ch[ah] = tr2 + tr3;
        cr3 = tr2 - tr3;
        ch[ah + 1] = ti2 + ti3;
        ci3 = ti2 - ti3;
        cr2 = tr1 + isign * tr4;
        cr4 = tr1 - isign * tr4;
        ci2 = ti1 + isign * ti4;
        ci4 = ti1 - isign * ti4;
        ch[ah + l1 * ido] = wa1[i] * cr2 - isign * wa1[i + 1] * ci2;
        ch[ah + l1 * ido + 1] = wa1[i] * ci2 + isign * wa1[i + 1] * cr2;
        ch[ah + 2 * l1 * ido] = wa2[i] * cr3 - isign * wa2[i + 1] * ci3;
        ch[ah + 2 * l1 * ido + 1] = wa2[i] * ci3 + isign * wa2[i + 1] * cr3;
        ch[ah + 3 * l1 * ido] = wa3[i] * cr4 - isign * wa3[i + 1] * ci4;
        ch[ah + 3 * l1 * ido + 1] = wa3[i] * ci4 + isign * wa3[i + 1] * cr4;
      }
    }
  }
}


x86 assembly (clang, -O0):
<passf4>:
push   %rbp
mov    %rsp,%rbp
sub    $0x28,%rsp
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9,-0x28(%rbp)
cmpl   $0x2,-0x4(%rbp)
jne    147e <passf4+0x37e>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1479 <passf4+0x379>
mov    -0x30(%rbp),%eax
shl    $0x2,%eax
imul   -0x4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
mov    -0x4(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
mov    -0x4(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
imul   $0x3,-0x4(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    -0x4(%rbp),%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    -0x4(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
imul   $0x3,-0x4(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
mov    -0x4(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
mov    -0x4(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    -0x4(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
imul   $0x3,-0x4(%rbp),%edx
add    %edx,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    -0x4(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
imul   $0x3,-0x4(%rbp),%edx
add    %edx,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x30(%rbp),%eax
imul   -0x4(%rbp),%eax
mov    %eax,-0x38(%rbp)
movsd  -0x98(%rbp),%xmm0
ff
addsd  -0xa0(%rbp),%xmm0
ff
mov    -0x18(%rbp),%rax
movslq -0x38(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x98(%rbp),%xmm0
ff
subsd  -0xa0(%rbp),%xmm0
ff
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
mov    -0x8(%rbp),%edx
shl    $0x1,%edx
imul   -0x4(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x78(%rbp),%xmm0
addsd  -0x80(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x78(%rbp),%xmm0
subsd  -0x80(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
mov    -0x8(%rbp),%edx
shl    $0x1,%edx
imul   -0x4(%rbp),%edx
add    %edx,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x90(%rbp),%xmm1
ff
cvtsi2sdl 0x18(%rbp),%xmm0
movsd  -0xa8(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
mov    -0x8(%rbp),%edx
imul   -0x4(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x90(%rbp),%xmm1
ff
cvtsi2sdl 0x18(%rbp),%xmm0
movsd  -0xa8(%rbp),%xmm2
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
imul   $0x3,-0x8(%rbp),%edx
imul   -0x4(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x70(%rbp),%xmm1
cvtsi2sdl 0x18(%rbp),%xmm0
movsd  -0x88(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
mov    -0x8(%rbp),%edx
imul   -0x4(%rbp),%edx
add    %edx,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x70(%rbp),%xmm1
cvtsi2sdl 0x18(%rbp),%xmm0
movsd  -0x88(%rbp),%xmm2
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
imul   $0x3,-0x8(%rbp),%edx
imul   -0x4(%rbp),%edx
add    %edx,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1136 <passf4+0x36>
jmp    19a9 <passf4+0x8a9>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    19a4 <passf4+0x8a4>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    1991 <passf4+0x891>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    -0x30(%rbp),%ecx
shl    $0x2,%ecx
imul   -0x4(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x34(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
mov    -0x4(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
mov    -0x4(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    -0x4(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
imul   $0x3,-0x4(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
imul   $0x3,-0x4(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    -0x4(%rbp),%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
mov    -0x4(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
mov    -0x4(%rbp),%edx
shl    $0x1,%edx
add    %edx,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    -0x4(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
imul   $0x3,-0x4(%rbp),%edx
add    %edx,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
subsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
add    -0x4(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x34(%rbp),%ecx
imul   $0x3,-0x4(%rbp),%edx
add    %edx,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x2c(%rbp),%eax
mov    -0x30(%rbp),%ecx
imul   -0x4(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x38(%rbp)
movsd  -0x98(%rbp),%xmm0
ff
addsd  -0xa0(%rbp),%xmm0
ff
mov    -0x18(%rbp),%rax
movslq -0x38(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x98(%rbp),%xmm0
ff
subsd  -0xa0(%rbp),%xmm0
ff
movsd  %xmm0,-0x60(%rbp)
movsd  -0x78(%rbp),%xmm0
addsd  -0x80(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x78(%rbp),%xmm0
subsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x90(%rbp),%xmm1
ff
cvtsi2sdl 0x18(%rbp),%xmm0
movsd  -0xa8(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x90(%rbp),%xmm1
ff
cvtsi2sdl 0x18(%rbp),%xmm0
movsd  -0xa8(%rbp),%xmm2
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x70(%rbp),%xmm1
cvtsi2sdl 0x18(%rbp),%xmm0
movsd  -0x88(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x70(%rbp),%xmm1
cvtsi2sdl 0x18(%rbp),%xmm0
movsd  -0x88(%rbp),%xmm2
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x58(%rbp),%xmm2
cvtsi2sdl 0x18(%rbp),%xmm1
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mulsd  (%rax,%rcx,8),%xmm1
mulsd  -0x40(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
mov    -0x8(%rbp),%edx
imul   -0x4(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x20(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x40(%rbp),%xmm2
cvtsi2sdl 0x18(%rbp),%xmm1
mov    -0x20(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mulsd  (%rax,%rcx,8),%xmm1
mulsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
mov    -0x8(%rbp),%edx
imul   -0x4(%rbp),%edx
add    %edx,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x60(%rbp),%xmm2
cvtsi2sdl 0x18(%rbp),%xmm1
mov    -0x28(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mulsd  (%rax,%rcx,8),%xmm1
mulsd  -0x48(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
mov    -0x8(%rbp),%edx
shl    $0x1,%edx
imul   -0x4(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x48(%rbp),%xmm2
cvtsi2sdl 0x18(%rbp),%xmm1
mov    -0x28(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mulsd  (%rax,%rcx,8),%xmm1
mulsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
mov    -0x8(%rbp),%edx
shl    $0x1,%edx
imul   -0x4(%rbp),%edx
add    %edx,%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
movsd  -0x68(%rbp),%xmm2
cvtsi2sdl 0x18(%rbp),%xmm1
mov    0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mulsd  (%rax,%rcx,8),%xmm1
mulsd  -0x50(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
imul   $0x3,-0x8(%rbp),%edx
imul   -0x4(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    0x10(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x50(%rbp),%xmm2
cvtsi2sdl 0x18(%rbp),%xmm1
mov    0x10(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mulsd  (%rax,%rcx,8),%xmm1
mulsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x38(%rbp),%ecx
imul   $0x3,-0x8(%rbp),%edx
imul   -0x4(%rbp),%edx
add    %edx,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x2c(%rbp)
jmp    1498 <passf4+0x398>
jmp    1996 <passf4+0x896>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1485 <passf4+0x385>
jmp    19a9 <passf4+0x8a9>
add    $0x28,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<passf4>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    0x40(%rsp),%ebp
cmp    $0x2,%edi
jne    1251 <passf4+0x151>
test   %esi,%esi
jle    14dd <passf4+0x3dd>
lea    0x0(,%rsi,4),%r8d
cvtsi2sd %ebp,%xmm8
movapd 0xecb(%rip),%xmm9
xorpd  %xmm8,%xmm9
lea    (%rsi,%rsi,1),%edi
lea    (%rdi,%rdi,2),%r9d
mov    %esi,%esi
add    $0x38,%rdx
add    %rsi,%rsi
xor    %ebx,%ebx
nopl   0x0(%rax)
movsd  -0x38(%rdx),%xmm7
movsd  -0x30(%rdx),%xmm5
movsd  -0x10(%rdx),%xmm3
movapd %xmm5,%xmm10
subsd  %xmm3,%xmm10
addsd  %xmm3,%xmm5
movsd  (%rdx),%xmm0
movsd  -0x20(%rdx),%xmm3
movapd %xmm0,%xmm4
subsd  %xmm3,%xmm4
addsd  %xmm3,%xmm0
movsd  -0x18(%rdx),%xmm3
movapd %xmm7,%xmm6
subsd  %xmm3,%xmm6
addsd  %xmm3,%xmm7
movsd  -0x28(%rdx),%xmm3
movsd  -0x8(%rdx),%xmm2
movapd %xmm3,%xmm1
subsd  %xmm2,%xmm1
addsd  %xmm2,%xmm3
movapd %xmm7,%xmm2
addsd  %xmm3,%xmm2
movsd  %xmm2,(%rcx,%rbx,8)
subsd  %xmm3,%xmm7
lea    (%r8,%rbx,1),%rax
cltq
movsd  %xmm7,(%rcx,%rax,8)
movapd %xmm5,%xmm2
addsd  %xmm0,%xmm2
movsd  %xmm2,0x8(%rcx,%rbx,8)
subsd  %xmm0,%xmm5
add    $0x1,%eax
cltq
movsd  %xmm5,(%rcx,%rax,8)
movapd %xmm8,%xmm0
mulsd  %xmm4,%xmm0
addsd  %xmm6,%xmm0
lea    (%rdi,%rbx,1),%rax
cltq
movsd  %xmm0,(%rcx,%rax,8)
mulsd  %xmm9,%xmm4
addsd  %xmm6,%xmm4
lea    (%r9,%rbx,1),%rbp
movslq %ebp,%rbp
movsd  %xmm4,(%rcx,%rbp,8)
movapd %xmm8,%xmm0
mulsd  %xmm1,%xmm0
addsd  %xmm10,%xmm0
add    $0x1,%eax
cltq
movsd  %xmm0,(%rcx,%rax,8)
mulsd  %xmm9,%xmm1
addsd  %xmm10,%xmm1
add    $0x1,%ebp
movslq %ebp,%rax
movsd  %xmm1,(%rcx,%rax,8)
add    $0x2,%rbx
add    $0x40,%rdx
cmp    %rbx,%rsi
jne    1150 <passf4+0x50>
jmp    14dd <passf4+0x3dd>
test   %esi,%esi
jle    14dd <passf4+0x3dd>
mov    0x38(%rsp),%rax
lea    -0x1(%rdi),%r10d
lea    0x0(,%rdi,4),%ebx
mov    %ebx,-0x3c(%rsp)
lea    (%rdi,%rdi,1),%r11d
cvtsi2sd %ebp,%xmm9
lea    (%rdi,%rdi,2),%r15d
movapd 0xd7d(%rip),%xmm8
xorpd  %xmm9,%xmm8
mov    %esi,%ebp
imul   %edi,%ebp
movslq %r11d,%rbx
mov    %rbx,-0x28(%rsp)
movslq %edi,%r12
movslq %r15d,%rbx
mov    %rbx,-0x38(%rsp)
imul   %esi,%r15d
movslq %ebp,%r11
add    %ebp,%ebp
movslq %ebp,%r14
movslq %r15d,%rbp
movslq %r10d,%r15
mov    %esi,%esi
mov    %rsi,-0x18(%rsp)
lea    0x8(%rcx,%rbp,8),%rsi
mov    %r12,-0x30(%rsp)
lea    0x0(,%r12,8),%rbp
mov    %rbp,-0x10(%rsp)
lea    (%rcx,%r14,8),%rbp
add    $0x8,%rbp
lea    (%rcx,%r11,8),%r11
add    $0x8,%r11
xor    %ebx,%ebx
mov    %rbx,-0x48(%rsp)
xor    %ebx,%ebx
mov    %rdi,-0x8(%rsp)
jmp    1323 <passf4+0x223>
add    $0x1,%rbx
mov    -0x10(%rsp),%rdi
add    %rdi,%rsi
add    %rdi,%rbp
add    %rdi,%r11
add    %rdi,%rcx
mov    -0x48(%rsp),%rdi
add    -0x3c(%rsp),%edi
mov    %rdi,-0x48(%rsp)
cmp    -0x18(%rsp),%rbx
mov    -0x8(%rsp),%rdi
je     14dd <passf4+0x3dd>
cmp    $0x2,%edi
jl     12f0 <passf4+0x1f0>
movslq -0x48(%rsp),%rdi
mov    %rbx,%r10
mov    -0x38(%rsp),%rbx
lea    (%rbx,%rdi,1),%r14
mov    -0x30(%rsp),%rbx
lea    (%rbx,%rdi,1),%r13
mov    -0x28(%rsp),%rbx
add    %rdi,%rbx
mov    %rbx,-0x20(%rsp)
mov    %r10,%rbx
lea    (%rdx,%rdi,8),%r10
lea    (%rdx,%r14,8),%r12
lea    (%rdx,%r13,8),%r13
mov    -0x20(%rsp),%rdi
lea    (%rdx,%rdi,8),%rdi
xor    %r14d,%r14d
nopw   0x0(%rax,%rax,1)
movupd (%r10,%r14,8),%xmm4
movupd (%rdi,%r14,8),%xmm3
movapd %xmm4,%xmm5
subpd  %xmm3,%xmm5
movupd 0x0(%r13,%r14,8),%xmm6
movupd (%r12,%r14,8),%xmm7
movapd %xmm7,%xmm2
subpd  %xmm6,%xmm2
unpckhpd %xmm2,%xmm2
movapd %xmm9,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm5,%xmm0
mulsd  %xmm8,%xmm2
addsd  %xmm5,%xmm2
unpckhpd %xmm5,%xmm5
addpd  %xmm3,%xmm4
movapd %xmm6,%xmm3
subsd  %xmm7,%xmm3
addpd  %xmm7,%xmm6
movapd %xmm4,%xmm7
subpd  %xmm6,%xmm7
addpd  %xmm4,%xmm6
movupd %xmm6,(%rcx,%r14,8)
movapd %xmm7,%xmm4
unpckhpd %xmm7,%xmm4
movapd %xmm9,%xmm6
mulsd  %xmm3,%xmm6
addsd  %xmm5,%xmm6
mulsd  %xmm8,%xmm3
addsd  %xmm5,%xmm3
movsd  0x8(%r8,%r14,8),%xmm5
mulsd  %xmm9,%xmm5
mulsd  %xmm6,%xmm5
movsd  (%r8,%r14,8),%xmm1
mulsd  %xmm0,%xmm1
subsd  %xmm5,%xmm1
movsd  %xmm1,-0x8(%r11,%r14,8)
movsd  0x8(%r8,%r14,8),%xmm1
mulsd  %xmm9,%xmm1
mulsd  %xmm0,%xmm1
mulsd  (%r8,%r14,8),%xmm6
addsd  %xmm1,%xmm6
movsd  %xmm6,(%r11,%r14,8)
movsd  0x8(%r9,%r14,8),%xmm0
mulsd  %xmm9,%xmm0
mulsd  %xmm4,%xmm0
movsd  (%r9,%r14,8),%xmm1
mulsd  %xmm7,%xmm1
subsd  %xmm0,%xmm1
movsd  %xmm1,-0x8(%rbp,%r14,8)
movsd  0x8(%r9,%r14,8),%xmm0
mulsd  %xmm9,%xmm0
mulsd  %xmm7,%xmm0
movsd  (%r9,%r14,8),%xmm1
mulsd  %xmm4,%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,0x0(%rbp,%r14,8)
movsd  0x8(%rax,%r14,8),%xmm0
mulsd  %xmm9,%xmm0
mulsd  %xmm3,%xmm0
movsd  (%rax,%r14,8),%xmm1
mulsd  %xmm2,%xmm1
subsd  %xmm0,%xmm1
movsd  %xmm1,-0x8(%rsi,%r14,8)
movsd  0x8(%rax,%r14,8),%xmm0
mulsd  %xmm9,%xmm0
mulsd  %xmm2,%xmm0
mulsd  (%rax,%r14,8),%xmm3
addsd  %xmm0,%xmm3
movsd  %xmm3,(%rsi,%r14,8)
add    $0x2,%r14
cmp    %r15,%r14
jl     1370 <passf4+0x270>
jmp    12f0 <passf4+0x1f0>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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