user: Please show me the C implementation that matches the assembly code listed below:

```asm
<dfct>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %edi,-0x34(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    -0x34(%rbp),%eax
  sar    %eax
  mov    %eax,-0x20(%rbp)
  movl   $0x0,-0x24(%rbp)
  jmp    L28
L69:
  mov    -0x34(%rbp),%eax
  sub    -0x24(%rbp),%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm1
  mov    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  addss  %xmm1,%xmm0
  movss  %xmm0,-0x10(%rbp)
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  mov    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm1
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  subss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movss  -0x10(%rbp),%xmm0
  movss  %xmm0,(%rax)
  addl   $0x1,-0x24(%rbp)
L28:
  mov    -0x24(%rbp),%eax
  cmp    -0x20(%rbp),%eax
  jl     L69
  mov    -0x34(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x1c(%rbp)
  jmp    L51
L76:
  mov    -0x40(%rbp),%rdx
  mov    -0x20(%rbp),%eax
  mov    $0x1,%esi
  mov    %eax,%edi
  call   <ddct@plt>
  cmpl   $0x2,-0x20(%rbp)
  jle    L16
  mov    -0x40(%rbp),%rdx
  mov    -0x20(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <bitrv1@plt>
L16:
  mov    -0x20(%rbp),%eax
  sar    %eax
  mov    %eax,-0x14(%rbp)
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x18(%rbp)
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rax,%rdx
  mov    -0x40(%rbp),%rax
  movss  (%rax),%xmm0
  movss  %xmm0,(%rdx)
  movss  -0x1c(%rbp),%xmm0
  subss  -0x18(%rbp),%xmm0
  mov    -0x40(%rbp),%rax
  movss  %xmm0,(%rax)
  movss  -0x1c(%rbp),%xmm0
  addss  -0x18(%rbp),%xmm0
  movss  %xmm0,-0x1c(%rbp)
  movl   $0x1,-0x24(%rbp)
  jmp    L1
L74:
  mov    -0x20(%rbp),%eax
  sub    -0x24(%rbp),%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x20(%rbp),%edx
  mov    -0xc(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x10(%rbp)
  mov    -0x20(%rbp),%edx
  mov    -0x24(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x18(%rbp)
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x8(%rbp)
  mov    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x4(%rbp)
  mov    -0x20(%rbp),%edx
  mov    -0x24(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movss  -0x8(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%edx
  mov    -0xc(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movss  -0x4(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movss  -0x10(%rbp),%xmm0
  subss  -0x18(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movss  -0x10(%rbp),%xmm0
  addss  -0x18(%rbp),%xmm0
  movss  %xmm0,(%rax)
  addl   $0x1,-0x24(%rbp)
L1:
  mov    -0x24(%rbp),%eax
  cmp    -0x14(%rbp),%eax
  jl     L74
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x10(%rbp)
  mov    -0x20(%rbp),%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rax,%rdx
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rcx
  mov    -0x40(%rbp),%rax
  add    %rcx,%rax
  movss  (%rdx),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x20(%rbp),%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movss  -0x10(%rbp),%xmm0
  movss  %xmm0,(%rax)
  mov    -0x14(%rbp),%eax
  mov    %eax,-0x20(%rbp)
L51:
  cmpl   $0x1,-0x20(%rbp)
  jg     L76
  mov    -0x40(%rbp),%rax
  movss  0x4(%rax),%xmm0
  movss  %xmm0,-0x18(%rbp)
  mov    -0x40(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    -0x40(%rbp),%rax
  movss  (%rax),%xmm0
  movss  %xmm0,(%rdx)
  movss  -0x1c(%rbp),%xmm0
  addss  -0x18(%rbp),%xmm0
  mov    -0x40(%rbp),%rax
  movss  %xmm0,(%rax)
  mov    -0x34(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movss  -0x1c(%rbp),%xmm0
  subss  -0x18(%rbp),%xmm0
  movss  %xmm0,(%rax)
  cmpl   $0x2,-0x34(%rbp)
  jle    L39
  mov    -0x40(%rbp),%rdx
  mov    -0x34(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <bitrv1@plt>
L39:
  nop
  leave
  ret
```

assistant: ```c
void dfct(int n, float *a) {
  void ddct(int n, int isgn, float *a);
  void bitrv1(int n, float *a);
  int j, k, m, mh;
  float xr, xi, yr, yi, an;
  m = n >> 1;
  for (j = 0; j < m; j++) {
    k = n - j;
    xr = a[j] + a[k];
    a[j] -= a[k];
    a[k] = xr;
  }
  an = a[n];
  while (m >= 2) {
    ddct(m, 1, a);
    if (m > 2) {
      bitrv1(m, a);
    }
    mh = m >> 1;
    xi = a[m];
    a[m] = a[0];
    a[0] = an - xi;
    an += xi;
    for (j = 1; j < mh; j++) {
      k = m - j;
      xr = a[m + k];
      xi = a[m + j];
      yr = a[j];
      yi = a[k];
      a[m + j] = yr;
      a[m + k] = yi;
      a[j] = xr - xi;
      a[k] = xr + xi;
    }
    xr = a[mh];
    a[mh] = a[m + mh];
    a[m + mh] = xr;
    m = mh;
  }
  xi = a[1];
  a[1] = a[0];
  a[0] = an + xi;
  a[n] = an - xi;
  if (n > 2) {
    bitrv1(n, a);
  }
}
```