user: 请从给定的汇编指令推导出C源代码:

```asm
<kern_r4_u1_b>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  cmpq   $0x0,0x58(%rsp)
  mov    0x38(%rsp),%r15
  mov    0x40(%rsp),%r14
  mov    0x48(%rsp),%r12
  jle    L42
  mov    0x58(%rsp),%rax
  mov    %rdi,%rbp
  mov    %rsi,%r11
  mov    %rdx,%rbx
  mov    %rcx,%r10
  sub    $0x1,%rax
  mov    %rax,-0x10(%rsp)
  cmp    $0x1,%rax
  jbe    L33
  shr    %rax
  mov    %r15,%rdi
  mov    %r9,%rsi
  mov    %r14,%rcx
  mov    %rax,%r13
  mov    %r8,%rdx
  xor    %eax,%eax
  shl    $0x5,%r13
  nopl   (%rax)
L3:
  movupd (%r12,%rax,1),%xmm6
  movupd 0x10(%r12,%rax,1),%xmm1
  sub    $0xffffffffffffff80,%rdi
  sub    $0xffffffffffffff80,%rsi
  movlpd 0x8(%r12,%rax,1),%xmm1
  movupd -0x80(%rsi),%xmm2
  sub    $0xffffffffffffff80,%rcx
  sub    $0xffffffffffffff80,%rdx
  movhpd 0x10(%r12,%rax,1),%xmm6
  movupd -0x20(%rsi),%xmm4
  movupd -0x10(%rsi),%xmm9
  movapd %xmm6,%xmm8
  movapd %xmm1,%xmm0
  movapd %xmm1,%xmm7
  movlpd -0x18(%rsi),%xmm9
  mulpd  %xmm1,%xmm0
  movhpd -0x70(%rsi),%xmm2
  movhpd -0x10(%rsi),%xmm4
  mulpd  %xmm6,%xmm8
  mulpd  %xmm6,%xmm7
  subpd  %xmm0,%xmm8
  addpd  %xmm7,%xmm7
  movapd %xmm8,%xmm5
  movapd %xmm8,%xmm3
  mulpd  %xmm6,%xmm5
  movapd %xmm7,%xmm0
  mulpd  %xmm1,%xmm0
  mulpd  %xmm1,%xmm3
  subpd  %xmm0,%xmm5
  movapd %xmm7,%xmm0
  mulpd  %xmm6,%xmm0
  addpd  %xmm0,%xmm3
  movupd -0x60(%rsi),%xmm0
  movhpd -0x50(%rsi),%xmm0
  unpcklpd %xmm0,%xmm2
  movupd -0x40(%rsi),%xmm0
  movhpd -0x30(%rsi),%xmm0
  unpcklpd %xmm4,%xmm0
  movupd -0x50(%rsi),%xmm4
  movlpd -0x58(%rsi),%xmm4
  unpcklpd %xmm0,%xmm2
  movupd -0x70(%rsi),%xmm0
  movlpd -0x78(%rsi),%xmm0
  unpcklpd %xmm4,%xmm0
  movupd -0x30(%rsi),%xmm4
  movlpd -0x38(%rsi),%xmm4
  unpcklpd %xmm9,%xmm4
  unpcklpd %xmm4,%xmm0
  movapd %xmm2,%xmm4
  mulpd  %xmm1,%xmm2
  movapd %xmm0,%xmm9
  mulpd  %xmm6,%xmm0
  mulpd  %xmm1,%xmm9
  movupd -0x60(%rdi),%xmm1
  mulpd  %xmm6,%xmm4
  movupd -0x20(%rdi),%xmm6
  movhpd -0x50(%rdi),%xmm1
  movhpd -0x10(%rdi),%xmm6
  addpd  %xmm2,%xmm0
  movupd -0x80(%rdi),%xmm2
  movhpd -0x70(%rdi),%xmm2
  subpd  %xmm9,%xmm4
  unpcklpd %xmm1,%xmm2
  movupd -0x40(%rdi),%xmm1
  movhpd -0x30(%rdi),%xmm1
  movapd %xmm4,%xmm10
  unpcklpd %xmm6,%xmm1
  movupd -0x50(%rdi),%xmm6
  movlpd -0x58(%rdi),%xmm6
  unpcklpd %xmm1,%xmm2
  movupd -0x70(%rdi),%xmm1
  movlpd -0x78(%rdi),%xmm1
  unpcklpd %xmm6,%xmm1
  movupd -0x30(%rdi),%xmm6
  movupd -0x10(%rdi),%xmm9
  movlpd -0x38(%rdi),%xmm6
  movlpd -0x18(%rdi),%xmm9
  unpcklpd %xmm9,%xmm6
  movapd %xmm8,%xmm9
  mulpd  %xmm2,%xmm9
  unpcklpd %xmm6,%xmm1
  movapd %xmm7,%xmm6
  mulpd  %xmm1,%xmm6
  mulpd  %xmm1,%xmm8
  movupd -0x60(%rcx),%xmm1
  mulpd  %xmm2,%xmm7
  movupd -0x80(%rcx),%xmm2
  movhpd -0x50(%rcx),%xmm1
  movhpd -0x70(%rcx),%xmm2
  subpd  %xmm6,%xmm9
  unpcklpd %xmm1,%xmm2
  movupd -0x20(%rcx),%xmm6
  movupd -0x40(%rcx),%xmm1
  movhpd -0x10(%rcx),%xmm6
  movhpd -0x30(%rcx),%xmm1
  addpd  %xmm8,%xmm7
  movupd -0x10(%rcx),%xmm8
  unpcklpd %xmm6,%xmm1
  movupd -0x50(%rcx),%xmm6
  movlpd -0x58(%rcx),%xmm6
  unpcklpd %xmm1,%xmm2
  movupd -0x70(%rcx),%xmm1
  movlpd -0x78(%rcx),%xmm1
  movlpd -0x18(%rcx),%xmm8
  unpcklpd %xmm6,%xmm1
  movupd -0x30(%rcx),%xmm6
  movlpd -0x38(%rcx),%xmm6
  unpcklpd %xmm8,%xmm6
  movapd %xmm5,%xmm8
  mulpd  %xmm2,%xmm8
  unpcklpd %xmm6,%xmm1
  movapd %xmm3,%xmm6
  mulpd  %xmm1,%xmm6
  mulpd  %xmm1,%xmm5
  movupd -0x60(%rdx),%xmm1
  mulpd  %xmm2,%xmm3
  movupd -0x20(%rdx),%xmm2
  movhpd -0x50(%rdx),%xmm1
  movhpd -0x10(%rdx),%xmm2
  subpd  %xmm6,%xmm8
  movupd -0x80(%rdx),%xmm6
  movhpd -0x70(%rdx),%xmm6
  addpd  %xmm5,%xmm3
  unpcklpd %xmm1,%xmm6
  movupd -0x40(%rdx),%xmm1
  addpd  %xmm8,%xmm10
  subpd  %xmm8,%xmm4
  movhpd -0x30(%rdx),%xmm1
  unpcklpd %xmm2,%xmm1
  movupd -0x50(%rdx),%xmm2
  movlpd -0x58(%rdx),%xmm2
  unpcklpd %xmm1,%xmm6
  movupd -0x70(%rdx),%xmm1
  movlpd -0x78(%rdx),%xmm1
  unpcklpd %xmm2,%xmm1
  movupd -0x30(%rdx),%xmm2
  movupd -0x10(%rdx),%xmm5
  movlpd -0x38(%rdx),%xmm2
  movlpd -0x18(%rdx),%xmm5
  unpcklpd %xmm5,%xmm2
  unpcklpd %xmm2,%xmm1
  movapd %xmm9,%xmm2
  addpd  %xmm6,%xmm2
  subpd  %xmm9,%xmm6
  movapd %xmm7,%xmm9
  addpd  %xmm1,%xmm9
  subpd  %xmm7,%xmm1
  movapd %xmm0,%xmm7
  addpd  %xmm3,%xmm7
  subpd  %xmm3,%xmm0
  movapd %xmm2,%xmm5
  subpd  %xmm10,%xmm2
  addpd  %xmm10,%xmm5
  movapd %xmm9,%xmm3
  addpd  %xmm7,%xmm3
  movapd %xmm5,%xmm8
  unpcklpd %xmm3,%xmm8
  unpckhpd %xmm3,%xmm5
  movapd %xmm9,%xmm3
  subpd  %xmm7,%xmm3
  movups %xmm5,0x10(%rbp,%rax,1)
  movapd %xmm2,%xmm5
  movups %xmm8,0x0(%rbp,%rax,1)
  unpckhpd %xmm3,%xmm2
  unpcklpd %xmm3,%xmm5
  movapd %xmm1,%xmm3
  movups %xmm2,0x10(%rbx,%rax,1)
  movapd %xmm6,%xmm2
  addpd  %xmm4,%xmm3
  subpd  %xmm4,%xmm1
  subpd  %xmm0,%xmm2
  addpd  %xmm6,%xmm0
  movups %xmm5,(%rbx,%rax,1)
  movapd %xmm2,%xmm5
  unpckhpd %xmm3,%xmm2
  movups %xmm2,0x10(%r11,%rax,1)
  movapd %xmm0,%xmm2
  unpcklpd %xmm3,%xmm5
  unpckhpd %xmm1,%xmm0
  unpcklpd %xmm1,%xmm2
  movups %xmm5,(%r11,%rax,1)
  movups %xmm2,(%r10,%rax,1)
  movups %xmm0,0x10(%r10,%rax,1)
  add    $0x20,%rax
  cmp    %rax,%r13
  jne    L3
  mov    -0x10(%rsp),%rcx
  and    $0xfffffffffffffffe,%rcx
L46:
  mov    %rcx,%rax
  mov    %rcx,%rdx
  add    $0x1,%rcx
  shl    $0x4,%rax
  shl    $0x6,%rdx
  movsd  (%r12,%rax,1),%xmm2
  movsd  0x8(%r12,%rax,1),%xmm1
  movsd  0x8(%r9,%rdx,1),%xmm8
  movapd %xmm2,%xmm5
  movapd %xmm1,%xmm0
  movapd %xmm2,%xmm7
  mulsd  %xmm1,%xmm0
  movapd %xmm1,%xmm4
  movapd %xmm1,%xmm3
  mulsd  %xmm2,%xmm5
  movapd %xmm2,%xmm6
  movapd %xmm1,%xmm9
  mulsd  %xmm8,%xmm9
  subsd  %xmm0,%xmm5
  movapd %xmm2,%xmm0
  mulsd  %xmm1,%xmm0
  mulsd  %xmm5,%xmm7
  mulsd  %xmm5,%xmm3
  addsd  %xmm0,%xmm0
  mulsd  %xmm0,%xmm4
  subsd  %xmm4,%xmm7
  movapd %xmm2,%xmm4
  mulsd  %xmm0,%xmm4
  mulsd  %xmm8,%xmm2
  movapd %xmm5,%xmm8
  addsd  %xmm3,%xmm4
  movsd  (%r9,%rdx,1),%xmm3
  mulsd  %xmm3,%xmm1
  mulsd  %xmm3,%xmm6
  movsd  (%r15,%rdx,1),%xmm3
  mulsd  %xmm3,%xmm8
  addsd  %xmm1,%xmm2
  movsd  0x8(%r15,%rdx,1),%xmm1
  subsd  %xmm9,%xmm6
  movapd %xmm0,%xmm9
  mulsd  %xmm3,%xmm0
  movapd %xmm5,%xmm3
  movapd %xmm4,%xmm5
  mulsd  %xmm1,%xmm3
  mulsd  %xmm1,%xmm9
  movsd  (%r14,%rdx,1),%xmm1
  addsd  %xmm3,%xmm0
  movsd  0x8(%r14,%rdx,1),%xmm3
  subsd  %xmm9,%xmm8
  movapd %xmm7,%xmm9
  mulsd  %xmm3,%xmm5
  mulsd  %xmm1,%xmm9
  mulsd  %xmm7,%xmm3
  movapd %xmm6,%xmm7
  mulsd  %xmm4,%xmm1
  movapd %xmm8,%xmm4
  subsd  %xmm5,%xmm9
  movsd  0x8(%r8,%rdx,1),%xmm5
  addsd  %xmm3,%xmm1
  movsd  (%r8,%rdx,1),%xmm3
  addsd  %xmm9,%xmm7
  subsd  %xmm9,%xmm6
  addsd  %xmm3,%xmm4
  subsd  %xmm8,%xmm3
  movapd %xmm3,%xmm10
  movapd %xmm0,%xmm3
  addsd  %xmm5,%xmm3
  subsd  %xmm0,%xmm5
  movapd %xmm4,%xmm0
  addsd  %xmm7,%xmm0
  subsd  %xmm7,%xmm4
  movapd %xmm5,%xmm8
  movapd %xmm2,%xmm5
  subsd  %xmm1,%xmm2
  addsd  %xmm1,%xmm5
  movsd  %xmm0,0x0(%rbp,%rax,1)
  movapd %xmm3,%xmm0
  movsd  %xmm4,(%rbx,%rax,1)
  addsd  %xmm5,%xmm0
  subsd  %xmm5,%xmm3
  movsd  %xmm0,0x8(%rbp,%rax,1)
  movapd %xmm10,%xmm0
  subsd  %xmm2,%xmm0
  addsd  %xmm10,%xmm2
  movsd  %xmm3,0x8(%rbx,%rax,1)
  movsd  %xmm0,(%r11,%rax,1)
  movapd %xmm8,%xmm0
  subsd  %xmm6,%xmm8
  addsd  %xmm6,%xmm0
  movsd  %xmm2,(%r10,%rax,1)
  movsd  %xmm8,0x8(%r10,%rax,1)
  movsd  %xmm0,0x8(%r11,%rax,1)
  cmp    %rcx,0x58(%rsp)
  jle    L42
  movsd  0x10(%r12,%rax,1),%xmm3
  movsd  0x18(%r12,%rax,1),%xmm2
  movsd  0x40(%r9,%rdx,1),%xmm5
  movapd %xmm3,%xmm8
  movapd %xmm2,%xmm0
  mulsd  %xmm2,%xmm0
  movapd %xmm5,%xmm4
  mulsd  %xmm3,%xmm8
  mulsd  %xmm2,%xmm5
  mulsd  %xmm3,%xmm4
  subsd  %xmm0,%xmm8
  movapd %xmm2,%xmm0
  mulsd  %xmm3,%xmm0
  movapd %xmm8,%xmm7
  movapd %xmm8,%xmm6
  mulsd  %xmm3,%xmm7
  mulsd  %xmm2,%xmm6
  addsd  %xmm0,%xmm0
  movapd %xmm0,%xmm1
  mulsd  %xmm2,%xmm1
  subsd  %xmm1,%xmm7
  movapd %xmm0,%xmm1
  mulsd  %xmm3,%xmm1
  addsd  %xmm1,%xmm6
  movsd  0x48(%r9,%rdx,1),%xmm1
  movapd %xmm1,%xmm9
  mulsd  %xmm2,%xmm9
  movsd  0x40(%r15,%rdx,1),%xmm2
  mulsd  %xmm3,%xmm1
  movsd  0x48(%r15,%rdx,1),%xmm3
  subsd  %xmm9,%xmm4
  movapd %xmm3,%xmm9
  addsd  %xmm5,%xmm1
  mulsd  %xmm8,%xmm3
  movapd %xmm2,%xmm5
  mulsd  %xmm0,%xmm2
  mulsd  %xmm0,%xmm9
  movsd  0x40(%r14,%rdx,1),%xmm0
  mulsd  %xmm8,%xmm5
  movapd %xmm0,%xmm8
  mulsd  %xmm7,%xmm8
  addsd  %xmm2,%xmm3
  movsd  0x48(%r14,%rdx,1),%xmm2
  mulsd  %xmm6,%xmm0
  subsd  %xmm9,%xmm5
  movapd %xmm2,%xmm9
  mulsd  %xmm6,%xmm9
  mulsd  %xmm7,%xmm2
  subsd  %xmm9,%xmm8
  addsd  %xmm0,%xmm2
  movsd  0x40(%r8,%rdx,1),%xmm0
  movapd %xmm8,%xmm6
  movapd %xmm0,%xmm10
  movapd %xmm0,%xmm7
  movsd  0x48(%r8,%rdx,1),%xmm0
  addsd  %xmm4,%xmm6
  addsd  %xmm5,%xmm10
  subsd  %xmm5,%xmm7
  movapd %xmm2,%xmm5
  movapd %xmm0,%xmm9
  addsd  %xmm1,%xmm5
  subsd  %xmm2,%xmm1
  movapd %xmm6,%xmm2
  addsd  %xmm3,%xmm9
  subsd  %xmm8,%xmm4
  addsd  %xmm10,%xmm2
  subsd  %xmm3,%xmm0
  subsd  %xmm6,%xmm10
  movsd  %xmm2,0x10(%rbp,%rax,1)
  movapd %xmm5,%xmm2
  addsd  %xmm9,%xmm2
  subsd  %xmm5,%xmm9
  movsd  %xmm10,0x10(%rbx,%rax,1)
  movsd  %xmm2,0x18(%rbp,%rax,1)
  movapd %xmm7,%xmm2
  subsd  %xmm1,%xmm2
  addsd  %xmm7,%xmm1
  movsd  %xmm9,0x18(%rbx,%rax,1)
  movsd  %xmm2,0x10(%r11,%rax,1)
  movapd %xmm4,%xmm2
  addsd  %xmm0,%xmm2
  subsd  %xmm4,%xmm0
  movsd  %xmm1,0x10(%r10,%rax,1)
  movsd  %xmm2,0x18(%r11,%rax,1)
  movsd  %xmm0,0x18(%r10,%rax,1)
L42:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L33:
  xor    %ecx,%ecx
  jmp    L46
```

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