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

```asm
<kern_r4_o_b>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbp
  mov    %rsi,%rax
  mov    %rdx,%rsi
  mov    %rcx,%rdi
  mov    0x38(%rsp),%r10
  mov    0x40(%rsp),%r11
  mov    0x50(%rsp),%r14
  test   %r14,%r14
  jle    L10
  mov    %r14,%rcx
  shl    $0x4,%rcx
  mov    $0x0,%edx
L31:
  movsd  (%r8,%rdx,1),%xmm2
  movsd  (%r10,%rdx,1),%xmm0
  movapd %xmm2,%xmm4
  addsd  %xmm0,%xmm4
  subsd  %xmm0,%xmm2
  movapd %xmm2,%xmm8
  movsd  0x8(%r8,%rdx,1),%xmm0
  movsd  0x8(%r10,%rdx,1),%xmm1
  movapd %xmm0,%xmm3
  addsd  %xmm1,%xmm3
  subsd  %xmm1,%xmm0
  movsd  (%r9,%rdx,1),%xmm1
  movsd  (%r11,%rdx,1),%xmm5
  movapd %xmm1,%xmm6
  addsd  %xmm5,%xmm6
  subsd  %xmm5,%xmm1
  movsd  0x8(%r9,%rdx,1),%xmm2
  movsd  0x8(%r11,%rdx,1),%xmm7
  movapd %xmm2,%xmm5
  addsd  %xmm7,%xmm5
  subsd  %xmm7,%xmm2
  movapd %xmm4,%xmm7
  addsd  %xmm6,%xmm7
  movsd  %xmm7,0x0(%rbp,%rdx,1)
  movapd %xmm3,%xmm7
  addsd  %xmm5,%xmm7
  movsd  %xmm7,0x8(%rbp,%rdx,1)
  subsd  %xmm6,%xmm4
  movsd  %xmm4,(%rsi,%rdx,1)
  subsd  %xmm5,%xmm3
  movsd  %xmm3,0x8(%rsi,%rdx,1)
  movapd %xmm8,%xmm3
  subsd  %xmm2,%xmm3
  movsd  %xmm3,(%rax,%rdx,1)
  movapd %xmm0,%xmm3
  addsd  %xmm1,%xmm3
  movsd  %xmm3,0x8(%rax,%rdx,1)
  addsd  %xmm8,%xmm2
  movsd  %xmm2,(%rdi,%rdx,1)
  subsd  %xmm1,%xmm0
  movsd  %xmm0,0x8(%rdi,%rdx,1)
  add    $0x10,%rdx
  cmp    %rcx,%rdx
  jne    L31
L10:
  mov    %r14,%rbx
  shl    $0x6,%rbx
  mov    %rbx,-0x18(%rsp)
  add    %rbx,%r8
  add    %rbx,%r9
  add    %rbx,%r10
  add    %rbx,%r11
  mov    %r14,%rbx
  shl    $0x4,%rbx
  lea    0x0(%rbp,%rbx,1),%rdx
  lea    (%rax,%rbx,1),%rcx
  add    %rbx,%rsi
  add    %rbx,%rdi
  cmpq   $0x1,0x58(%rsp)
  jle    L53
  mov    %rbx,%rbp
  add    0x48(%rsp),%rbp
  mov    %rbp,%r13
  mov    %r14,%rax
  shl    $0x5,%rax
  mov    %rax,-0x10(%rsp)
  add    %rbx,%rbp
  mov    %rbp,%r12
  lea    (%r14,%r14,2),%rax
  shl    $0x4,%rax
  mov    %rax,-0x8(%rsp)
  add    %rbx,%rbp
  mov    $0x1,%r15d
L13:
  movsd  0x0(%r13),%xmm7
  movsd  0x8(%r13),%xmm8
  movsd  (%r12),%xmm9
  movsd  0x8(%r12),%xmm10
  movsd  0x0(%rbp),%xmm11
  movsd  0x8(%rbp),%xmm12
  test   %r14,%r14
  jle    L55
  mov    $0x0,%eax
L34:
  movsd  (%r9,%rax,1),%xmm0
  movsd  0x8(%r9,%rax,1),%xmm1
  movapd %xmm0,%xmm2
  mulsd  %xmm7,%xmm2
  movapd %xmm1,%xmm3
  mulsd  %xmm8,%xmm3
  subsd  %xmm3,%xmm2
  mulsd  %xmm8,%xmm0
  mulsd  %xmm7,%xmm1
  addsd  %xmm1,%xmm0
  movsd  (%r10,%rax,1),%xmm5
  movsd  0x8(%r10,%rax,1),%xmm3
  movapd %xmm5,%xmm1
  mulsd  %xmm9,%xmm1
  movapd %xmm3,%xmm4
  mulsd  %xmm10,%xmm4
  subsd  %xmm4,%xmm1
  mulsd  %xmm10,%xmm5
  mulsd  %xmm9,%xmm3
  addsd  %xmm3,%xmm5
  movsd  (%r11,%rax,1),%xmm4
  movsd  0x8(%r11,%rax,1),%xmm3
  movapd %xmm4,%xmm15
  mulsd  %xmm11,%xmm15
  movapd %xmm3,%xmm6
  mulsd  %xmm12,%xmm6
  subsd  %xmm6,%xmm15
  mulsd  %xmm12,%xmm4
  mulsd  %xmm11,%xmm3
  addsd  %xmm3,%xmm4
  movsd  (%r8,%rax,1),%xmm3
  movapd %xmm3,%xmm13
  addsd  %xmm1,%xmm13
  subsd  %xmm1,%xmm3
  movsd  0x8(%r8,%rax,1),%xmm1
  movapd %xmm1,%xmm6
  addsd  %xmm5,%xmm6
  subsd  %xmm5,%xmm1
  movapd %xmm2,%xmm14
  addsd  %xmm15,%xmm14
  subsd  %xmm15,%xmm2
  movapd %xmm0,%xmm5
  addsd  %xmm4,%xmm5
  subsd  %xmm4,%xmm0
  movapd %xmm13,%xmm4
  addsd  %xmm14,%xmm4
  movsd  %xmm4,(%rdx,%rax,1)
  movapd %xmm6,%xmm4
  addsd  %xmm5,%xmm4
  movsd  %xmm4,0x8(%rdx,%rax,1)
  subsd  %xmm14,%xmm13
  movsd  %xmm13,(%rsi,%rax,1)
  subsd  %xmm5,%xmm6
  movsd  %xmm6,0x8(%rsi,%rax,1)
  movapd %xmm3,%xmm4
  subsd  %xmm0,%xmm4
  movsd  %xmm4,(%rcx,%rax,1)
  movapd %xmm1,%xmm4
  addsd  %xmm2,%xmm4
  movsd  %xmm4,0x8(%rcx,%rax,1)
  addsd  %xmm3,%xmm0
  movsd  %xmm0,(%rdi,%rax,1)
  subsd  %xmm2,%xmm1
  movsd  %xmm1,0x8(%rdi,%rax,1)
  add    $0x10,%rax
  cmp    %rax,%rbx
  jne    L34
L55:
  mov    -0x18(%rsp),%rax
  add    %rax,%r8
  add    %rax,%r9
  add    %rax,%r10
  add    %rax,%r11
  add    %rbx,%rdx
  add    %rbx,%rcx
  add    %rbx,%rsi
  add    %rbx,%rdi
  add    $0x1,%r15
  add    %rbx,%r13
  add    -0x10(%rsp),%r12
  add    -0x8(%rsp),%rbp
  cmp    %r15,0x58(%rsp)
  jne    L13
L53:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

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