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

```asm
<mdct_butterfly_first>:
  endbr64
  movslq %edx,%rax
  sar    %edx
  mov    %rdi,%rcx
  mov    %rsi,%rdi
  movslq %edx,%rdx
  lea    -0x40(%rsi,%rax,8),%rsi
  lea    -0x40(%rdi,%rdx,8),%rax
  nopl   0x0(%rax)
L0:
  movsd  0x30(%rax),%xmm4
  sub    $0x40,%rax
  sub    $0x40,%rsi
  sub    $0xffffffffffffff80,%rcx
  movsd  0x70(%rsi),%xmm3
  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  -0x78(%rcx),%xmm2
  movsd  -0x80(%rcx),%xmm3
  movsd  0x60(%rax),%xmm4
  mulsd  %xmm1,%xmm3
  mulsd  %xmm0,%xmm2
  addsd  %xmm3,%xmm2
  movsd  %xmm2,0x70(%rax)
  mulsd  -0x78(%rcx),%xmm1
  mulsd  -0x80(%rcx),%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  -0x58(%rcx),%xmm2
  movsd  -0x60(%rcx),%xmm3
  movsd  0x50(%rax),%xmm4
  mulsd  %xmm1,%xmm3
  mulsd  %xmm0,%xmm2
  addsd  %xmm3,%xmm2
  movsd  %xmm2,0x60(%rax)
  mulsd  -0x58(%rcx),%xmm1
  mulsd  -0x60(%rcx),%xmm0
  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  -0x38(%rcx),%xmm2
  movsd  -0x40(%rcx),%xmm3
  movsd  0x40(%rax),%xmm4
  mulsd  %xmm1,%xmm3
  mulsd  %xmm0,%xmm2
  addsd  %xmm3,%xmm2
  movsd  %xmm2,0x50(%rax)
  mulsd  -0x38(%rcx),%xmm1
  mulsd  -0x40(%rcx),%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  -0x18(%rcx),%xmm2
  movsd  -0x20(%rcx),%xmm3
  mulsd  %xmm0,%xmm2
  mulsd  %xmm1,%xmm3
  addsd  %xmm3,%xmm2
  movsd  %xmm2,0x40(%rax)
  mulsd  -0x20(%rcx),%xmm0
  mulsd  -0x18(%rcx),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,0x48(%rax)
  cmp    %rax,%rdi
  jbe    L0
  ret
```

assistant: ```c
void mdct_butterfly_first(double *trig, double *x, int points) {
  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]);
    r0 = x1[4] - x2[4];
    r1 = x1[5] - x2[5];
    x1[4] += x2[4];
    x1[5] += x2[5];
    x2[4] = (r1 * trig[5] + r0 * trig[4]);
    x2[5] = (r1 * trig[4] - r0 * trig[5]);
    r0 = x1[2] - x2[2];
    r1 = x1[3] - x2[3];
    x1[2] += x2[2];
    x1[3] += x2[3];
    x2[2] = (r1 * trig[9] + r0 * trig[8]);
    x2[3] = (r1 * trig[8] - r0 * trig[9]);
    r0 = x1[0] - x2[0];
    r1 = x1[1] - x2[1];
    x1[0] += x2[0];
    x1[1] += x2[1];
    x2[0] = (r1 * trig[13] + r0 * trig[12]);
    x2[1] = (r1 * trig[12] - r0 * trig[13]);
    x1 -= 8;
    x2 -= 8;
    trig += 16;
  } while (x2 >= x);
}
```