user: What would the C source look like for the assembly code provided here:

```asm
<kern_r4_fma_n_b>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  cmpq   $0x0,0x60(%rsp)
  mov    0x38(%rsp),%r11
  mov    0x40(%rsp),%rbx
  mov    0x58(%rsp),%rax
  jle    L19
  mov    %rdx,%r10
  mov    %rax,%r13
  mov    %rax,%rdx
  shl    $0x6,%r13
  shl    $0x4,%rdx
  test   %rax,%rax
  jle    L19
  shl    $0x5,%rax
  mov    0x48(%rsp),%r12
  xor    %r15d,%r15d
  mov    %rax,-0x10(%rsp)
  mov    0x50(%rsp),%rax
  lea    0x8(%r12),%r14
  lea    0x8(%rax),%rbp
  nopw   0x0(%rax,%rax,1)
L31:
  movsd  (%r14),%xmm7
  movsd  0x0(%rbp),%xmm6
  xor    %eax,%eax
  movsd  -0x8(%rbp),%xmm5
  movsd  -0x8(%r14),%xmm4
  movsd  0x8(%r12),%xmm9
  movsd  (%r12),%xmm8
  unpcklpd %xmm7,%xmm7
  unpcklpd %xmm6,%xmm6
  unpcklpd %xmm5,%xmm5
  unpcklpd %xmm4,%xmm4
  unpcklpd %xmm9,%xmm9
  unpcklpd %xmm8,%xmm8
  cs nopw 0x0(%rax,%rax,1)
L13:
  movupd (%r11,%rax,1),%xmm0
  movapd %xmm8,%xmm2
  movapd %xmm5,%xmm14
  movupd (%r9,%rax,1),%xmm12
  movupd (%rbx,%rax,1),%xmm15
  movapd %xmm4,%xmm11
  mulpd  %xmm0,%xmm2
  movapd %xmm12,%xmm10
  shufpd $0x1,%xmm0,%xmm0
  shufpd $0x1,%xmm12,%xmm10
  mulpd  %xmm15,%xmm14
  movapd %xmm10,%xmm1
  mulpd  %xmm4,%xmm1
  mulpd  %xmm12,%xmm11
  movapd %xmm2,%xmm3
  subpd  %xmm0,%xmm3
  addpd  %xmm2,%xmm0
  movapd %xmm15,%xmm2
  shufpd $0x1,%xmm15,%xmm2
  movapd %xmm2,%xmm13
  mulpd  %xmm5,%xmm13
  shufpd $0x2,%xmm0,%xmm3
  movapd %xmm1,%xmm0
  subpd  %xmm12,%xmm1
  addpd  %xmm12,%xmm0
  mulpd  %xmm9,%xmm3
  shufpd $0x2,%xmm1,%xmm0
  movapd %xmm13,%xmm1
  subpd  %xmm15,%xmm13
  addpd  %xmm15,%xmm1
  movsd  %xmm1,%xmm13
  movapd %xmm14,%xmm1
  subpd  %xmm2,%xmm1
  addpd  %xmm14,%xmm2
  mulpd  %xmm6,%xmm13
  movsd  %xmm1,%xmm2
  movapd %xmm11,%xmm1
  mulpd  %xmm6,%xmm2
  subpd  %xmm10,%xmm1
  addpd  %xmm11,%xmm10
  movupd (%r8,%rax,1),%xmm11
  subpd  %xmm13,%xmm0
  movsd  %xmm1,%xmm10
  mulpd  %xmm7,%xmm0
  addpd  %xmm10,%xmm2
  movupd (%r8,%rax,1),%xmm10
  subpd  %xmm3,%xmm10
  addpd  %xmm11,%xmm3
  mulpd  %xmm7,%xmm2
  movapd %xmm10,%xmm1
  subpd  %xmm0,%xmm1
  addpd  %xmm10,%xmm0
  movapd %xmm3,%xmm10
  subpd  %xmm2,%xmm3
  addpd  %xmm2,%xmm10
  movups %xmm3,(%r10,%rax,1)
  movapd %xmm0,%xmm3
  movsd  %xmm1,%xmm3
  movsd  %xmm0,%xmm1
  movups %xmm10,(%rdi,%rax,1)
  movups %xmm3,(%rsi,%rax,1)
  movups %xmm1,(%rcx,%rax,1)
  add    $0x10,%rax
  cmp    %rdx,%rax
  jne    L13
  add    %r13,%r8
  add    %r13,%r9
  add    %r13,%r11
  add    %r13,%rbx
  add    %rdx,%rdi
  add    %rdx,%rsi
  add    %rdx,%r10
  add    %rdx,%rcx
  add    $0x1,%r15
  add    -0x10(%rsp),%r12
  add    %rdx,%r14
  add    %rdx,%rbp
  cmp    %r15,0x60(%rsp)
  jne    L31
L19:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
void kern_r4_fma_n_b(double *restrict o0, double *restrict o1, double *restrict o2, double *restrict o3, double *i0, double *i1, double *i2, double *i3, double *w, double *w2, long bsize, long blocks) {
  long i, j;
  for (i = 0; i < blocks; i++) {
    double wr1, wi1;
    double wr2, wi2;
    double wr3, wi13;
    wr1 = w[2 * i * bsize];
    wi1 = w[2 * i * bsize + 1];
    wr2 = w[4 * i * bsize];
    wi2 = w[4 * i * bsize + 1];
    wr3 = w2[2 * i * bsize];
    wi13 = w2[2 * i * bsize + 1];
    for (j = 0; j < bsize; j++) {
      double pr1, pi1;
      double pr2, pi2;
      double pr3, pi3;
      double qr0, qi0;
      double qr1, qi1;
      double qr2, qi2;
      double qr3, qi3;
      pr1 = i1[2 * j] * wr1 - i1[2 * j + 1];
      pi1 = i1[2 * j] + i1[2 * j + 1] * wr1;
      pr2 = i2[2 * j] * wr2 - i2[2 * j + 1];
      pi2 = i2[2 * j] + i2[2 * j + 1] * wr2;
      pr3 = i3[2 * j] * wr3 - i3[2 * j + 1];
      pi3 = i3[2 * j] + i3[2 * j + 1] * wr3;
      qr0 = i0[2 * j] + pr2 * wi2;
      qr2 = i0[2 * j] - pr2 * wi2;
      qi0 = i0[2 * j + 1] + pi2 * wi2;
      qi2 = i0[2 * j + 1] - pi2 * wi2;
      qr1 = pr1 + pr3 * wi13;
      qr3 = pr1 - pr3 * wi13;
      qi1 = pi1 + pi3 * wi13;
      qi3 = pi1 - pi3 * wi13;
      o0[2 * j] = qr0 + qr1 * wi1;
      o0[2 * j + 1] = qi0 + qi1 * wi1;
      o2[2 * j] = qr0 - qr1 * wi1;
      o2[2 * j + 1] = qi0 - qi1 * wi1;
      o1[2 * j] = qr2 - qi3 * wi1;
      o1[2 * j + 1] = qi2 + qr3 * wi1;
      o3[2 * j] = qr2 + qi3 * wi1;
      o3[2 * j + 1] = qi2 - qr3 * wi1;
    }
    i0 += 8 * bsize;
    i1 += 8 * bsize;
    i2 += 8 * bsize;
    i3 += 8 * bsize;
    o0 += 2 * bsize;
    o1 += 2 * bsize;
    o2 += 2 * bsize;
    o3 += 2 * bsize;
  }
}
```