void wwghts(float wghts[], int n, float h,
            void (*kermom)(double[], double, int)) {
  int j, k;
  double wold[5], wnew[5], w[5], hh, hi, c, fac, a, b;
  hh = h;
  hi = 1.0 / hh;
  for (j = 1; j <= n; j++)
    wghts[j] = 0.0;
  (*kermom)(wold, 0.0, 4);
  if (n >= 4) {
    b = 0.0;
    for (j = 1; j <= n - 3; j++) {
      c = j - 1;
      a = b;
      b = a + hh;
      if (j == n - 3)
        b = (n - 1) * hh;
      (*kermom)(wnew, b, 4);
      for (fac = 1.0, k = 1; k <= 4; k++, fac *= hi)
        w[k] = (wnew[k] - wold[k]) * fac;
      wghts[j] += (((c + 1.0) * (c + 2.0) * (c + 3.0) * w[1] -
                    (11.0 + c * (12.0 + c * 3.0)) * w[2] +
                    3.0 * (c + 2.0) * w[3] - w[4]) /
                   6.0);
      wghts[j + 1] += ((-c * (c + 2.0) * (c + 3.0) * w[1] +
                        (6.0 + c * (10.0 + c * 3.0)) * w[2] -
                        (3.0 * c + 5.0) * w[3] + w[4]) *
                       0.5);
      wghts[j + 2] += ((c * (c + 1.0) * (c + 3.0) * w[1] -
                        (3.0 + c * (8.0 + c * 3.0)) * w[2] +
                        (3.0 * c + 4.0) * w[3] - w[4]) *
                       0.5);
      wghts[j + 3] += ((-c * (c + 1.0) * (c + 2.0) * w[1] +
                        (2.0 + c * (6.0 + c * 3.0)) * w[2] -
                        3.0 * (c + 1.0) * w[3] + w[4]) /
                       6.0);
      for (k = 1; k <= 4; k++)
        wold[k] = wnew[k];
    }
  } else if (n == 3) {
    (*kermom)(wnew, hh + hh, 3);
    w[1] = wnew[1] - wold[1];
    w[2] = hi * (wnew[2] - wold[2]);
    w[3] = hi * hi * (wnew[3] - wold[3]);
    wghts[1] = w[1] - 1.5 * w[2] + 0.5 * w[3];
    wghts[2] = 2.0 * w[2] - w[3];
    wghts[3] = 0.5 * (w[3] - w[2]);
  } else if (n == 2) {
    (*kermom)(wnew, hh, 2);
    wghts[1] = wnew[1] - wold[1] - (wghts[2] = hi * (wnew[2] - wold[2]));
  }
}


x86 assembly (clang, -O0):
<wwghts>:
push   %rbp
mov    %rsp,%rbp
sub    $0xe0,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movss  %xmm0,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
movsd  0xecc(%rip),%xmm0
divsd  -0xb8(%rbp),%xmm0
ff
movsd  %xmm0,-0xc0(%rbp)
ff
movl   $0x1,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jg     1175 <wwghts+0x75>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
xorps  %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    114b <wwghts+0x4b>
mov    -0x18(%rbp),%rax
lea    -0x50(%rbp),%rdi
xorps  %xmm0,%xmm0
mov    $0x4,%esi
call   *%rax
cmpl   $0x4,-0xc(%rbp)
jl     170c <wwghts+0x60c>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
movl   $0x1,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    -0xc(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jg     1707 <wwghts+0x607>
mov    -0x1c(%rbp),%eax
sub    $0x1,%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
movsd  -0xe0(%rbp),%xmm0
ff
movsd  %xmm0,-0xd8(%rbp)
ff
movsd  -0xd8(%rbp),%xmm0
ff
addsd  -0xb8(%rbp),%xmm0
ff
movsd  %xmm0,-0xe0(%rbp)
ff
mov    -0x1c(%rbp),%eax
mov    -0xc(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jne    1219 <wwghts+0x119>
mov    -0xc(%rbp),%eax
sub    $0x1,%eax
cvtsi2sd %eax,%xmm0
mulsd  -0xb8(%rbp),%xmm0
ff
movsd  %xmm0,-0xe0(%rbp)
ff
mov    -0x18(%rbp),%rax
lea    -0x80(%rbp),%rdi
movsd  -0xe0(%rbp),%xmm0
ff
mov    $0x4,%esi
call   *%rax
movsd  0xdc8(%rip),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
movl   $0x1,-0x20(%rbp)
cmpl   $0x4,-0x20(%rbp)
jg     12a0 <wwghts+0x1a0>
movslq -0x20(%rbp),%rax
movsd  -0x80(%rbp,%rax,8),%xmm0
movslq -0x20(%rbp),%rax
subsd  -0x50(%rbp,%rax,8),%xmm0
mulsd  -0xd0(%rbp),%xmm0
ff
movslq -0x20(%rbp),%rax
movsd  %xmm0,-0xb0(%rbp,%rax,8)
ff ff
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
movsd  -0xc0(%rbp),%xmm0
ff
mulsd  -0xd0(%rbp),%xmm0
ff
movsd  %xmm0,-0xd0(%rbp)
ff
jmp    1247 <wwghts+0x147>
movsd  0xd58(%rip),%xmm0
addsd  -0xc8(%rbp),%xmm0
ff
movsd  0xd70(%rip),%xmm1
addsd  -0xc8(%rbp),%xmm1
ff
mulsd  %xmm1,%xmm0
movsd  0xd54(%rip),%xmm1
addsd  -0xc8(%rbp),%xmm1
ff
mulsd  %xmm1,%xmm0
movsd  -0xa8(%rbp),%xmm2
ff
movsd  -0xc8(%rbp),%xmm1
ff
movsd  -0xc8(%rbp),%xmm3
ff
movsd  0xd28(%rip),%xmm4
mulsd  %xmm4,%xmm3
movsd  0xd54(%rip),%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm1
movsd  0xd3c(%rip),%xmm3
addsd  %xmm3,%xmm1
mulsd  -0xa0(%rbp),%xmm1
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xce1(%rip),%xmm2
addsd  -0xc8(%rbp),%xmm2
ff
movsd  0xcc9(%rip),%xmm1
mulsd  %xmm2,%xmm1
movsd  -0x98(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
subsd  -0x90(%rbp),%xmm1
ff
movsd  0xc9d(%rip),%xmm0
divsd  %xmm0,%xmm1
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
movsd  -0xc8(%rbp),%xmm0
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
movsd  0xc64(%rip),%xmm0
addsd  -0xc8(%rbp),%xmm0
ff
mulsd  %xmm0,%xmm1
movsd  0xc48(%rip),%xmm0
addsd  -0xc8(%rbp),%xmm0
ff
mulsd  %xmm0,%xmm1
movsd  -0xa8(%rbp),%xmm2
ff
movsd  -0xc8(%rbp),%xmm0
ff
movsd  -0xc8(%rbp),%xmm3
ff
movsd  0xc1c(%rip),%xmm4
mulsd  %xmm4,%xmm3
movsd  0xc38(%rip),%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm0
movsd  0xbf8(%rip),%xmm3
addsd  %xmm3,%xmm0
mulsd  -0xa0(%rbp),%xmm0
ff
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0xc8(%rbp),%xmm0
ff
movsd  0xbdc(%rip),%xmm2
mulsd  %xmm2,%xmm0
movsd  0xbf0(%rip),%xmm2
addsd  %xmm2,%xmm0
movsd  -0x98(%rbp),%xmm2
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
addsd  -0x90(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xb67(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
movsd  -0xc8(%rbp),%xmm1
ff
movsd  0xb3e(%rip),%xmm0
addsd  -0xc8(%rbp),%xmm0
ff
mulsd  %xmm0,%xmm1
movsd  0xb4a(%rip),%xmm0
addsd  -0xc8(%rbp),%xmm0
ff
mulsd  %xmm0,%xmm1
movsd  -0xa8(%rbp),%xmm2
ff
movsd  -0xc8(%rbp),%xmm0
ff
movsd  -0xc8(%rbp),%xmm3
ff
movsd  0xb1e(%rip),%xmm4
mulsd  %xmm4,%xmm3
movsd  0xb2a(%rip),%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm0
movsd  0xb02(%rip),%xmm3
addsd  %xmm3,%xmm0
mulsd  -0xa0(%rbp),%xmm0
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0xc8(%rbp),%xmm0
ff
movsd  0xac7(%rip),%xmm2
mulsd  %xmm2,%xmm0
movsd  0xacb(%rip),%xmm2
addsd  %xmm2,%xmm0
movsd  -0x98(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
subsd  -0x90(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xa69(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
movsd  -0xc8(%rbp),%xmm0
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  0xa29(%rip),%xmm1
addsd  -0xc8(%rbp),%xmm1
ff
mulsd  %xmm1,%xmm0
movsd  0xa3d(%rip),%xmm1
addsd  -0xc8(%rbp),%xmm1
ff
mulsd  %xmm1,%xmm0
movsd  -0xa8(%rbp),%xmm2
ff
movsd  -0xc8(%rbp),%xmm1
ff
movsd  -0xc8(%rbp),%xmm3
ff
movsd  0xa09(%rip),%xmm4
mulsd  %xmm4,%xmm3
movsd  0x9f5(%rip),%xmm4
addsd  %xmm4,%xmm3
mulsd  %xmm3,%xmm1
movsd  0x9f5(%rip),%xmm3
addsd  %xmm3,%xmm1
mulsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0x9b1(%rip),%xmm2
addsd  -0xc8(%rbp),%xmm2
ff
movsd  0x9c1(%rip),%xmm1
mulsd  %xmm2,%xmm1
movsd  -0x98(%rbp),%xmm2
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
addsd  -0x90(%rbp),%xmm1
ff
movsd  0x97e(%rip),%xmm0
divsd  %xmm0,%xmm1
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%rax,%rcx,4)
movl   $0x1,-0x20(%rbp)
cmpl   $0x4,-0x20(%rbp)
jg     16f4 <wwghts+0x5f4>
movslq -0x20(%rbp),%rax
movsd  -0x80(%rbp,%rax,8),%xmm0
movslq -0x20(%rbp),%rax
movsd  %xmm0,-0x50(%rbp,%rax,8)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    16c8 <wwghts+0x5c8>
jmp    16f9 <wwghts+0x5f9>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    11a3 <wwghts+0xa3>
jmp    18a7 <wwghts+0x7a7>
cmpl   $0x3,-0xc(%rbp)
jne    183a <wwghts+0x73a>
mov    -0x18(%rbp),%rax
lea    -0x80(%rbp),%rdi
movsd  -0xb8(%rbp),%xmm0
ff
addsd  -0xb8(%rbp),%xmm0
ff
mov    $0x3,%esi
call   *%rax
movsd  -0x78(%rbp),%xmm0
subsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  -0xc0(%rbp),%xmm0
ff
movsd  -0x70(%rbp),%xmm1
subsd  -0x40(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0xc0(%rbp),%xmm0
ff
mulsd  -0xc0(%rbp),%xmm0
ff
movsd  -0x68(%rbp),%xmm1
subsd  -0x38(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0xa8(%rbp),%xmm0
ff
movsd  -0xa0(%rbp),%xmm1
ff
movsd  0x86d(%rip),%xmm2
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x98(%rbp),%xmm0
ff
movsd  0x84d(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x4(%rax)
movsd  -0xa0(%rbp),%xmm0
ff
movsd  -0x98(%rbp),%xmm1
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
addsd  %xmm0,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x8(%rax)
movsd  -0x98(%rbp),%xmm1
ff
subsd  -0xa0(%rbp),%xmm1
ff
movsd  0x7e4(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0xc(%rax)
jmp    18a2 <wwghts+0x7a2>
cmpl   $0x2,-0xc(%rbp)
jne    189d <wwghts+0x79d>
mov    -0x18(%rbp),%rax
lea    -0x80(%rbp),%rdi
movsd  -0xb8(%rbp),%xmm0
ff
mov    $0x2,%esi
call   *%rax
movsd  -0x78(%rbp),%xmm0
subsd  -0x48(%rbp),%xmm0
movsd  -0xc0(%rbp),%xmm1
ff
movsd  -0x70(%rbp),%xmm2
subsd  -0x40(%rbp),%xmm2
mulsd  %xmm2,%xmm1
cvtsd2ss %xmm1,%xmm1
mov    -0x8(%rbp),%rax
movss  %xmm1,0x8(%rax)
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x4(%rax)
jmp    18a2 <wwghts+0x7a2>
jmp    18a7 <wwghts+0x7a7>
add    $0xe0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<wwghts>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0xc8,%rsp
mov    %rdx,%rbp
mov    %esi,%r15d
mov    %rdi,%rbx
cvtss2sd %xmm0,%xmm1
movsd  0xeca(%rip),%xmm0
movsd  %xmm1,0x8(%rsp)
divsd  %xmm1,%xmm0
movapd %xmm0,0x10(%rsp)
test   %esi,%esi
jle    14a0 <wwghts+0x390>
lea    0x4(%rbx),%rdi
mov    %r15d,%edx
shl    $0x2,%rdx
xor    %esi,%esi
call   1030 <memset@plt>
lea    0x50(%rsp),%rdi
xorpd  %xmm0,%xmm0
mov    $0x4,%esi
call   *%rbp
cmp    $0x4,%r15d
jb     14b0 <wwghts+0x3a0>
mov    %rbp,0x80(%rsp)
lea    -0x3(%r15),%r13d
lea    -0x1(%r15),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0x8(%rsp),%xmm0
movsd  %xmm0,0x78(%rsp)
lea    0x58(%rsp),%rbp
lea    0x28(%rsp),%r12
add    $0xfffffffe,%r15d
movapd 0x10(%rsp),%xmm0
movapd %xmm0,%xmm1
mulsd  %xmm0,%xmm1
movapd %xmm1,0xb0(%rsp)
mulsd  %xmm1,%xmm0
movapd %xmm0,0xa0(%rsp)
add    $0xffffffffffffffff,%r13
add    $0xffffffffffffffff,%r15
xor    %r14d,%r14d
xorpd  %xmm1,%xmm1
jmp    1482 <wwghts+0x372>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
lea    0x20(%rsp),%rdi
movsd  %xmm0,0x98(%rsp)
mov    $0x4,%esi
call   *0x80(%rsp)
movsd  0x28(%rsp),%xmm0
movsd  0x30(%rsp),%xmm9
subsd  0x58(%rsp),%xmm0
movsd  %xmm0,0x90(%rsp)
subsd  0x60(%rsp),%xmm9
movsd  0x38(%rsp),%xmm0
subsd  0x68(%rsp),%xmm0
mulsd  0x10(%rsp),%xmm9
mulsd  0xb0(%rsp),%xmm0
movsd  %xmm0,0x88(%rsp)
xorps  %xmm5,%xmm5
cvtsi2sd %r14d,%xmm5
movapd %xmm5,%xmm3
addsd  0xd9a(%rip),%xmm3
movapd %xmm5,%xmm10
movsd  0xd95(%rip),%xmm0
addsd  %xmm0,%xmm10
movapd %xmm3,%xmm13
mulsd  %xmm10,%xmm13
movapd %xmm5,%xmm7
movsd  0xd82(%rip),%xmm2
mulsd  %xmm2,%xmm7
movapd %xmm7,%xmm1
addsd  0xd7a(%rip),%xmm1
mulsd  %xmm5,%xmm1
movapd %xmm10,%xmm14
mulsd  %xmm5,%xmm14
movapd %xmm7,%xmm4
addsd  0xd78(%rip),%xmm4
mulsd  %xmm5,%xmm4
movapd %xmm7,%xmm12
movapd %xmm3,%xmm15
mulsd  %xmm5,%xmm15
movapd %xmm7,%xmm6
addsd  0xd69(%rip),%xmm6
mulsd  %xmm5,%xmm6
movapd %xmm7,%xmm0
movsd  0xd40(%rip),%xmm8
addsd  %xmm8,%xmm7
mulsd  %xmm5,%xmm7
addsd  %xmm2,%xmm5
mulsd  %xmm5,%xmm13
addsd  0xd1e(%rip),%xmm1
mulsd  %xmm9,%xmm1
movsd  0x90(%rsp),%xmm11
mulsd  %xmm11,%xmm13
subsd  %xmm1,%xmm13
movsd  0x40(%rsp),%xmm1
subsd  0x70(%rsp),%xmm1
mulsd  0xa0(%rsp),%xmm1
mulsd  %xmm5,%xmm14
mulsd  %xmm15,%xmm5
mulsd  %xmm10,%xmm15
mulsd  %xmm2,%xmm10
movsd  0x88(%rsp),%xmm8
mulsd  %xmm8,%xmm10
addsd  %xmm13,%xmm10
subsd  %xmm1,%xmm10
divsd  0xcc2(%rip),%xmm10
movss  0x4(%rbx,%r14,4),%xmm2
xorps  %xmm13,%xmm13
cvtss2sd %xmm2,%xmm13
addsd  %xmm10,%xmm13
movsd  0xca4(%rip),%xmm10
addsd  %xmm10,%xmm4
mulsd  %xmm9,%xmm4
mulsd  %xmm11,%xmm14
subsd  %xmm14,%xmm4
addsd  0xc97(%rip),%xmm12
mulsd  %xmm8,%xmm12
subsd  %xmm12,%xmm4
addsd  0xc5d(%rip),%xmm6
mulsd  %xmm9,%xmm6
mulsd  %xmm11,%xmm5
subsd  %xmm6,%xmm5
addsd  0xc7f(%rip),%xmm0
mulsd  %xmm8,%xmm0
addsd  %xmm5,%xmm0
unpcklpd %xmm0,%xmm0
unpcklpd %xmm1,%xmm5
subpd  %xmm5,%xmm0
addsd  %xmm1,%xmm4
shufpd $0x2,%xmm0,%xmm4
cvtps2pd 0x8(%rbx,%r14,4),%xmm0
mulpd  0xc7b(%rip),%xmm4
addpd  %xmm0,%xmm4
addsd  0xc07(%rip),%xmm7
mulsd  %xmm9,%xmm7
mulsd  %xmm11,%xmm15
subsd  %xmm15,%xmm7
mulsd  0xc38(%rip),%xmm3
mulsd  %xmm8,%xmm3
addsd  %xmm7,%xmm3
addsd  %xmm1,%xmm3
movss  0x10(%rbx,%r14,4),%xmm0
divsd  %xmm10,%xmm3
cvtss2sd %xmm0,%xmm0
addsd  %xmm3,%xmm0
unpcklpd %xmm4,%xmm13
shufpd $0x1,%xmm0,%xmm4
cvtpd2ps %xmm4,%xmm0
cvtpd2ps %xmm13,%xmm1
unpcklpd %xmm0,%xmm1
movupd %xmm1,0x4(%rbx,%r14,4)
movups 0x10(%r12),%xmm0
movups %xmm0,0x10(%rbp)
movupd (%r12),%xmm0
movupd %xmm0,0x0(%rbp)
add    $0x1,%r14
movsd  0x98(%rsp),%xmm1
cmp    %r14,%r15
je     15ba <wwghts+0x4aa>
movsd  0x78(%rsp),%xmm0
cmp    %r14,%r13
je     11f0 <wwghts+0xe0>
addsd  0x8(%rsp),%xmm1
movapd %xmm1,%xmm0
jmp    11f0 <wwghts+0xe0>
lea    0x50(%rsp),%rdi
xorpd  %xmm0,%xmm0
mov    $0x4,%esi
call   *%rbp
cmp    $0x2,%r15d
je     1564 <wwghts+0x454>
cmp    $0x3,%r15d
jne    15ba <wwghts+0x4aa>
movsd  0x8(%rsp),%xmm0
addsd  %xmm0,%xmm0
lea    0x20(%rsp),%rdi
mov    $0x3,%esi
call   *%rbp
movsd  0x28(%rsp),%xmm0
subsd  0x58(%rsp),%xmm0
movapd 0x10(%rsp),%xmm4
movapd %xmm4,%xmm1
mulsd  %xmm4,%xmm1
movapd 0x30(%rsp),%xmm2
subpd  0x60(%rsp),%xmm2
unpcklpd %xmm1,%xmm4
mulpd  %xmm2,%xmm4
movsd  0xb48(%rip),%xmm1
mulsd  %xmm4,%xmm1
addsd  %xmm0,%xmm1
movapd %xmm4,%xmm0
unpckhpd %xmm4,%xmm0
movsd  0xb38(%rip),%xmm2
movapd %xmm0,%xmm3
mulsd  %xmm2,%xmm3
addsd  %xmm1,%xmm3
xorps  %xmm1,%xmm1
cvtsd2ss %xmm3,%xmm1
movss  %xmm1,0x4(%rbx)
movapd %xmm4,%xmm1
addsd  %xmm4,%xmm1
subsd  %xmm0,%xmm1
cvtsd2ss %xmm1,%xmm1
movss  %xmm1,0x8(%rbx)
subsd  %xmm4,%xmm0
mulsd  %xmm2,%xmm0
mov    $0x3,%eax
jmp    15b1 <wwghts+0x4a1>
lea    0x20(%rsp),%rdi
movsd  0x8(%rsp),%xmm0
mov    $0x2,%esi
call   *%rbp
movsd  0x28(%rsp),%xmm0
movsd  0x30(%rsp),%xmm1
subsd  0x58(%rsp),%xmm0
subsd  0x60(%rsp),%xmm1
movapd 0x10(%rsp),%xmm2
mulsd  %xmm1,%xmm2
xorps  %xmm1,%xmm1
cvtsd2ss %xmm2,%xmm1
movss  %xmm1,0x8(%rbx)
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
mov    $0x1,%eax
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%rbx,%rax,4)
add    $0xc8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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