user: What would the C source look like for the assembly code provided here?

```asm
<ffts1>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %rcx,-0x30(%rbp)
  mov    %r8,-0x38(%rbp)
  cmpq   $0x3,-0x20(%rbp)
  je     L26
  cmpq   $0x3,-0x20(%rbp)
  jg     L169
  cmpq   $0x2,-0x20(%rbp)
  je     L58
  cmpq   $0x2,-0x20(%rbp)
  jg     L169
  cmpq   $0x0,-0x20(%rbp)
  je     L82
  cmpq   $0x1,-0x20(%rbp)
  jne    L100
  jmp    L107
L128:
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fft2pt@plt>
  mov    -0x20(%rbp),%rax
  mov    $0x8,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  add    %rax,-0x18(%rbp)
  subq   $0x1,-0x28(%rbp)
L107:
  cmpq   $0x0,-0x28(%rbp)
  jg     L128
  jmp    L51
L30:
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fft4pt@plt>
  mov    -0x20(%rbp),%rax
  mov    $0x8,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  add    %rax,-0x18(%rbp)
  subq   $0x1,-0x28(%rbp)
L58:
  cmpq   $0x0,-0x28(%rbp)
  jg     L30
  jmp    L51
L15:
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fft8pt@plt>
  mov    -0x20(%rbp),%rax
  mov    $0x8,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  add    %rax,-0x18(%rbp)
  subq   $0x1,-0x28(%rbp)
L26:
  cmpq   $0x0,-0x28(%rbp)
  jg     L15
  jmp    L51
L100:
  jmp    L169
L170:
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <bitrevR2@plt>
  mov    -0x20(%rbp),%rax
  lea    -0x1(%rax),%rcx
  movabs $0x5555555555555556,%rdx
  mov    %rcx,%rax
  imul   %rdx
  sar    $0x3f,%rcx
  mov    %rdx,%rax
  sub    %rcx,%rax
  mov    %rax,-0x8(%rbp)
  movq   $0x2,-0x10(%rbp)
  mov    -0x20(%rbp),%rax
  lea    -0x1(%rax),%rdx
  mov    -0x8(%rbp),%rax
  mov    %rax,%rsi
  lea    0x0(,%rax,4),%rcx
  mov    %rsi,%rax
  sub    %rcx,%rax
  add    %rdx,%rax
  cmp    $0x1,%rax
  jne    L73
  mov    -0x10(%rbp),%rdx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <bfR2@plt>
  shlq   -0x10(%rbp)
L73:
  mov    -0x20(%rbp),%rax
  lea    -0x1(%rax),%rdx
  mov    -0x8(%rbp),%rax
  mov    %rax,%rsi
  lea    0x0(,%rax,4),%rcx
  mov    %rsi,%rax
  sub    %rcx,%rax
  add    %rdx,%rax
  cmp    $0x2,%rax
  jne    L18
  mov    -0x10(%rbp),%rdx
  mov    -0x20(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <bfR4@plt>
  shlq   $0x2,-0x10(%rbp)
L18:
  mov    -0x20(%rbp),%rax
  cmp    $0xb,%rax
  ja     L193
  mov    -0x8(%rbp),%rdi
  mov    -0x10(%rbp),%rcx
  mov    -0x30(%rbp),%rdx
  mov    -0x20(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  mov    %rdi,%r9
  mov    %rcx,%r8
  mov    $0x1,%ecx
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <bfstages@plt>
  jmp    L36
L193:
  mov    -0x8(%rbp),%rdi
  mov    -0x10(%rbp),%rcx
  mov    -0x30(%rbp),%rdx
  mov    -0x20(%rbp),%rsi
  mov    -0x18(%rbp),%rax
  mov    %rdi,%r9
  mov    %rcx,%r8
  mov    $0x1,%ecx
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <fftrecurs@plt>
L36:
  mov    -0x20(%rbp),%rax
  mov    $0x8,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  add    %rax,-0x18(%rbp)
  subq   $0x1,-0x28(%rbp)
L169:
  cmpq   $0x0,-0x28(%rbp)
  jg     L170
  jmp    L51
L82:
  nop
L51:
  nop
  leave
  ret
```

assistant: ```c
void ffts1(float *ioptr, long M, long Rows, float *Utbl, short *BRLow) {
  long StageCnt;
  long NDiffU;
  switch (M) {
  case 0:
    break;
  case 1:
    for (; Rows > 0; Rows--) {
      fft2pt(ioptr);
      ioptr += 2 * ((unsigned long)1 << (M));
    }
    break;
  case 2:
    for (; Rows > 0; Rows--) {
      fft4pt(ioptr);
      ioptr += 2 * ((unsigned long)1 << (M));
    }
    break;
  case 3:
    for (; Rows > 0; Rows--) {
      fft8pt(ioptr);
      ioptr += 2 * ((unsigned long)1 << (M));
    }
    break;
  default:
    for (; Rows > 0; Rows--) {
      bitrevR2(ioptr, M, BRLow);
      StageCnt = (M - 1) / 3;
      NDiffU = 2;
      if ((M - 1 - (StageCnt * 3)) == 1) {
        bfR2(ioptr, M, NDiffU);
        NDiffU *= 2;
      }
      if ((M - 1 - (StageCnt * 3)) == 2) {
        bfR4(ioptr, M, NDiffU);
        NDiffU *= 4;
      }
      if (M <= (11 - (sizeof(float) / 8)))
        bfstages(ioptr, M, Utbl, 1, NDiffU, StageCnt);
      else {
        fftrecurs(ioptr, M, Utbl, 1, NDiffU, StageCnt);
      }
      ioptr += 2 * ((unsigned long)1 << (M));
    }
  }
}
```