user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<mdct_butterfly_generic>:
  endbr64
  movslq %edx,%rax
  sar    %edx
  mov    %rsi,%r9
  movslq %edx,%rdx
  lea    -0x40(%rsi,%rax,8),%rsi
  lea    -0x40(%r9,%rdx,8),%rax
  movslq %ecx,%rdx
  mov    %rdx,%r10
  lea    0x0(,%rdx,8),%r8
  shl    $0x4,%rdx
  shl    $0x5,%r10
  add    %rdi,%rdx
  nopw   0x0(%rax,%rax,1)
L5:
  movsd  0x30(%rax),%xmm4
  movsd  0x30(%rsi),%xmm3
  sub    $0x40,%rax
  sub    $0x40,%rsi
  movsd  0x78(%rsi),%xmm2
  movapd %xmm3,%xmm1
  addsd  %xmm4,%xmm3
  movapd %xmm2,%xmm0
  subsd  0x78(%rax),%xmm0
  subsd  %xmm4,%xmm1
  movsd  %xmm3,0x70(%rsi)
  addsd  0x78(%rax),%xmm2
  movsd  %xmm2,0x78(%rsi)
  movsd  0x8(%rdi),%xmm2
  movsd  (%rdi),%xmm3
  movsd  0x60(%rax),%xmm4
  mulsd  %xmm1,%xmm3
  mulsd  %xmm0,%xmm2
  addsd  %xmm3,%xmm2
  movsd  %xmm2,0x70(%rax)
  mulsd  0x8(%rdi),%xmm1
  mulsd  (%rdi),%xmm0
  subsd  %xmm1,%xmm0
  movsd  %xmm0,0x78(%rax)
  movsd  0x60(%rsi),%xmm3
  movsd  0x68(%rsi),%xmm2
  movapd %xmm3,%xmm1
  addsd  %xmm4,%xmm3
  movapd %xmm2,%xmm0
  subsd  0x68(%rax),%xmm0
  subsd  %xmm4,%xmm1
  movsd  %xmm3,0x60(%rsi)
  addsd  0x68(%rax),%xmm2
  movsd  %xmm2,0x68(%rsi)
  movsd  (%rdi,%r8,1),%xmm3
  movsd  0x50(%rax),%xmm4
  movsd  0x8(%rdi,%r8,1),%xmm2
  mulsd  %xmm1,%xmm3
  mulsd  %xmm0,%xmm2
  addsd  %xmm3,%xmm2
  movsd  %xmm2,0x60(%rax)
  mulsd  0x8(%rdi,%r8,1),%xmm1
  mulsd  (%rdi,%r8,1),%xmm0
  add    %r10,%rdi
  subsd  %xmm1,%xmm0
  movsd  %xmm0,0x68(%rax)
  movsd  0x50(%rsi),%xmm3
  movsd  0x58(%rsi),%xmm2
  movapd %xmm3,%xmm1
  addsd  %xmm4,%xmm3
  movapd %xmm2,%xmm0
  subsd  0x58(%rax),%xmm0
  subsd  %xmm4,%xmm1
  movsd  %xmm3,0x50(%rsi)
  addsd  0x58(%rax),%xmm2
  movsd  %xmm2,0x58(%rsi)
  movsd  0x8(%rdx),%xmm2
  movsd  (%rdx),%xmm3
  movsd  0x40(%rax),%xmm4
  mulsd  %xmm1,%xmm3
  mulsd  %xmm0,%xmm2
  addsd  %xmm3,%xmm2
  movsd  %xmm2,0x50(%rax)
  mulsd  0x8(%rdx),%xmm1
  mulsd  (%rdx),%xmm0
  subsd  %xmm1,%xmm0
  movsd  %xmm0,0x58(%rax)
  movsd  0x40(%rsi),%xmm3
  movsd  0x48(%rsi),%xmm2
  movapd %xmm3,%xmm1
  addsd  %xmm4,%xmm3
  movapd %xmm2,%xmm0
  subsd  0x48(%rax),%xmm0
  subsd  %xmm4,%xmm1
  movsd  %xmm3,0x40(%rsi)
  addsd  0x48(%rax),%xmm2
  movsd  %xmm2,0x48(%rsi)
  movsd  0x8(%rdx,%r8,1),%xmm2
  movsd  (%rdx,%r8,1),%xmm3
  mulsd  %xmm0,%xmm2
  mulsd  %xmm1,%xmm3
  addsd  %xmm3,%xmm2
  movsd  %xmm2,0x40(%rax)
  mulsd  (%rdx,%r8,1),%xmm0
  mulsd  0x8(%rdx,%r8,1),%xmm1
  add    %r10,%rdx
  subsd  %xmm1,%xmm0
  movsd  %xmm0,0x48(%rax)
  cmp    %rax,%r9
  jbe    L5
  ret
```

assistant: ```c
void mdct_butterfly_generic(double *trig, double *x, int points, int trigint) {
  double *x1 = x + points - 8;
  double *x2 = x + (points >> 1) - 8;
  double r0;
  double r1;
  do {
    r0 = x1[6] - x2[6];
    r1 = x1[7] - x2[7];
    x1[6] += x2[6];
    x1[7] += x2[7];
    x2[6] = (r1 * trig[1] + r0 * trig[0]);
    x2[7] = (r1 * trig[0] - r0 * trig[1]);
    trig += trigint;
    r0 = x1[4] - x2[4];
    r1 = x1[5] - x2[5];
    x1[4] += x2[4];
    x1[5] += x2[5];
    x2[4] = (r1 * trig[1] + r0 * trig[0]);
    x2[5] = (r1 * trig[0] - r0 * trig[1]);
    trig += trigint;
    r0 = x1[2] - x2[2];
    r1 = x1[3] - x2[3];
    x1[2] += x2[2];
    x1[3] += x2[3];
    x2[2] = (r1 * trig[1] + r0 * trig[0]);
    x2[3] = (r1 * trig[0] - r0 * trig[1]);
    trig += trigint;
    r0 = x1[0] - x2[0];
    r1 = x1[1] - x2[1];
    x1[0] += x2[0];
    x1[1] += x2[1];
    x2[0] = (r1 * trig[1] + r0 * trig[0]);
    x2[1] = (r1 * trig[0] - r0 * trig[1]);
    trig += trigint;
    x1 -= 8;
    x2 -= 8;
  } while (x2 >= x);
}
```