user: Translate the below assembly code into C programming language:

```asm
<mdct_butterfly_first>:
  endbr64
  mov    %rdi,%rcx
  mov    %rsi,%rdi
  movslq %edx,%rax
  lea    -0x40(%rsi,%rax,8),%rsi
  sar    %edx
  movslq %edx,%rdx
  lea    -0x40(%rdi,%rdx,8),%rax
L8:
  movsd  0x30(%rsi),%xmm3
  movsd  0x30(%rax),%xmm4
  movapd %xmm3,%xmm1
  subsd  %xmm4,%xmm1
  movsd  0x38(%rsi),%xmm2
  movapd %xmm2,%xmm0
  subsd  0x38(%rax),%xmm0
  addsd  %xmm4,%xmm3
  movsd  %xmm3,0x30(%rsi)
  addsd  0x38(%rax),%xmm2
  movsd  %xmm2,0x38(%rsi)
  movapd %xmm0,%xmm2
  mulsd  0x8(%rcx),%xmm2
  movapd %xmm1,%xmm3
  mulsd  (%rcx),%xmm3
  addsd  %xmm3,%xmm2
  movsd  %xmm2,0x30(%rax)
  mulsd  (%rcx),%xmm0
  mulsd  0x8(%rcx),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,0x38(%rax)
  movsd  0x20(%rsi),%xmm3
  movsd  0x20(%rax),%xmm4
  movapd %xmm3,%xmm1
  subsd  %xmm4,%xmm1
  movsd  0x28(%rsi),%xmm2
  movapd %xmm2,%xmm0
  subsd  0x28(%rax),%xmm0
  addsd  %xmm4,%xmm3
  movsd  %xmm3,0x20(%rsi)
  addsd  0x28(%rax),%xmm2
  movsd  %xmm2,0x28(%rsi)
  movapd %xmm0,%xmm2
  mulsd  0x28(%rcx),%xmm2
  movapd %xmm1,%xmm3
  mulsd  0x20(%rcx),%xmm3
  addsd  %xmm3,%xmm2
  movsd  %xmm2,0x20(%rax)
  mulsd  0x20(%rcx),%xmm0
  mulsd  0x28(%rcx),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,0x28(%rax)
  movsd  0x10(%rsi),%xmm3
  movsd  0x10(%rax),%xmm4
  movapd %xmm3,%xmm1
  subsd  %xmm4,%xmm1
  movsd  0x18(%rsi),%xmm2
  movapd %xmm2,%xmm0
  subsd  0x18(%rax),%xmm0
  addsd  %xmm4,%xmm3
  movsd  %xmm3,0x10(%rsi)
  addsd  0x18(%rax),%xmm2
  movsd  %xmm2,0x18(%rsi)
  movapd %xmm0,%xmm2
  mulsd  0x48(%rcx),%xmm2
  movapd %xmm1,%xmm3
  mulsd  0x40(%rcx),%xmm3
  addsd  %xmm3,%xmm2
  movsd  %xmm2,0x10(%rax)
  mulsd  0x40(%rcx),%xmm0
  mulsd  0x48(%rcx),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,0x18(%rax)
  movsd  (%rsi),%xmm3
  movsd  (%rax),%xmm4
  movapd %xmm3,%xmm1
  subsd  %xmm4,%xmm1
  movsd  0x8(%rsi),%xmm2
  movapd %xmm2,%xmm0
  subsd  0x8(%rax),%xmm0
  addsd  %xmm4,%xmm3
  movsd  %xmm3,(%rsi)
  addsd  0x8(%rax),%xmm2
  movsd  %xmm2,0x8(%rsi)
  movapd %xmm0,%xmm2
  mulsd  0x68(%rcx),%xmm2
  movapd %xmm1,%xmm3
  mulsd  0x60(%rcx),%xmm3
  addsd  %xmm3,%xmm2
  movsd  %xmm2,(%rax)
  mulsd  0x60(%rcx),%xmm0
  mulsd  0x68(%rcx),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,0x8(%rax)
  sub    $0x40,%rsi
  sub    $0x40,%rax
  sub    $0xffffffffffffff80,%rcx
  cmp    %rax,%rdi
  jbe    L8
  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);
}
```