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

```asm
<ffts1>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,%rbx
  mov    %rdx,%rbp
  mov    %rcx,0x8(%rsp)
  mov    %r8,0x10(%rsp)
  cmp    $0x2,%rsi
  je     L218
  mov    %rsi,%r12
  jg     L188
  test   %rsi,%rsi
  je     L145
  cmp    $0x1,%rsi
  jne    L87
  test   %rdx,%rdx
  jle    L145
L196:
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <fft2pt@plt>
  add    $0x10,%rbx
  sub    $0x1,%rbp
  jne    L196
L145:
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L188:
  cmp    $0x3,%rsi
  jne    L87
  test   %rdx,%rdx
  jle    L145
L83:
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <fft8pt@plt>
  add    $0x40,%rbx
  sub    $0x1,%rbp
  jne    L83
  jmp    L145
L218:
  test   %rdx,%rdx
  jle    L145
L177:
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <fft4pt@plt>
  add    $0x20,%rbx
  sub    $0x1,%rbp
  jne    L177
  jmp    L145
L87:
  test   %rbp,%rbp
  jle    L145
  lea    -0x1(%r12),%rcx
  movabs $0x5555555555555556,%rdx
  mov    %rcx,%rax
  imul   %rdx
  mov    %rcx,%rax
  sar    $0x3f,%rax
  sub    %rax,%rdx
  mov    %rdx,%r14
  lea    0x0(,%rdx,4),%rax
  mov    %rdx,%r13
  sub    %rax,%r13
  add    %rcx,%r13
  mov    $0x8,%eax
  mov    %r12d,%ecx
  shl    %cl,%rax
  mov    %rax,0x18(%rsp)
  mov    $0x2,%r15d
  jmp    L88
L106:
  mov    %r15,%rdx
  mov    %r12,%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <bfR2@plt>
  mov    $0x4,%r8d
  jmp    L116
L71:
  mov    %r15,%rdx
  mov    %r12,%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <bfR4@plt>
  mov    $0x8,%r8d
  jmp    L116
L36:
  mov    %r14,%r9
  mov    $0x1,%ecx
  mov    0x8(%rsp),%rdx
  mov    %r12,%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <fftrecurs@plt>
L14:
  add    0x18(%rsp),%rbx
  sub    $0x1,%rbp
  je     L145
L88:
  mov    0x10(%rsp),%rdx
  mov    %r12,%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <bitrevR2@plt>
  cmp    $0x1,%r13
  je     L106
  mov    %r15,%r8
  cmp    $0x2,%r13
  je     L71
L116:
  cmp    $0xb,%r12
  ja     L36
  mov    %r14,%r9
  mov    $0x1,%ecx
  mov    0x8(%rsp),%rdx
  mov    %r12,%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <bfstages@plt>
  jmp    L14
```

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));
    }
  }
}
```