user: 请将以下的汇编代码转换成C语言代码：

```asm
<cfftf1>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %edi,-0x64(%rbp)
  mov    %rsi,-0x70(%rbp)
  mov    %rdx,-0x78(%rbp)
  mov    %rcx,-0x80(%rbp)
  mov    %r8,-0x88(%rbp)
  mov    %r9d,-0x68(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x88(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  mov    %eax,-0x3c(%rbp)
  movl   $0x0,-0x44(%rbp)
  movl   $0x1,-0x48(%rbp)
  movl   $0x0,-0x40(%rbp)
  movl   $0x2,-0x4c(%rbp)
  jmp    L143
L37:
  mov    -0x4c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x88(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x38(%rbp)
  mov    -0x38(%rbp),%eax
  imul   -0x48(%rbp),%eax
  mov    %eax,-0x34(%rbp)
  mov    -0x64(%rbp),%eax
  cltd
  idivl  -0x34(%rbp)
  mov    %eax,-0x30(%rbp)
  mov    -0x30(%rbp),%eax
  add    %eax,%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0x2c(%rbp),%eax
  imul   -0x48(%rbp),%eax
  mov    %eax,-0x28(%rbp)
  cmpl   $0x0,-0x44(%rbp)
  je     L125
  mov    -0x78(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x70(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  jmp    L87
L125:
  mov    -0x70(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x78(%rbp),%rax
  mov    %rax,-0x10(%rbp)
L87:
  cmpl   $0x5,-0x38(%rbp)
  je     L165
  cmpl   $0x5,-0x38(%rbp)
  jg     L206
  cmpl   $0x4,-0x38(%rbp)
  je     L170
  cmpl   $0x4,-0x38(%rbp)
  jg     L206
  cmpl   $0x2,-0x38(%rbp)
  je     L2
  cmpl   $0x3,-0x38(%rbp)
  je     L174
  jmp    L206
L170:
  mov    -0x40(%rbp),%edx
  mov    -0x2c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x24(%rbp),%edx
  mov    -0x2c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x80(%rbp),%rax
  lea    (%rdx,%rax,1),%r8
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x80(%rbp),%rax
  lea    (%rdx,%rax,1),%r9
  mov    -0x40(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x80(%rbp),%rax
  lea    (%rdx,%rax,1),%r10
  mov    -0x10(%rbp),%rcx
  mov    -0x18(%rbp),%rdx
  mov    -0x48(%rbp),%esi
  mov    -0x2c(%rbp),%eax
  mov    -0x68(%rbp),%edi
  push   %rdi
  push   %r8
  mov    %r10,%r8
  mov    %eax,%edi
  call   <passf4@plt>
  add    $0x10,%rsp
  cmpl   $0x0,-0x44(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0x44(%rbp)
  jmp    L82
L2:
  mov    -0x40(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x80(%rbp),%rax
  lea    (%rdx,%rax,1),%r8
  mov    -0x68(%rbp),%edi
  mov    -0x10(%rbp),%rcx
  mov    -0x18(%rbp),%rdx
  mov    -0x48(%rbp),%esi
  mov    -0x2c(%rbp),%eax
  mov    %edi,%r9d
  mov    %eax,%edi
  call   <passf2@plt>
  cmpl   $0x0,-0x44(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0x44(%rbp)
  jmp    L82
L174:
  mov    -0x40(%rbp),%edx
  mov    -0x2c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x80(%rbp),%rax
  lea    (%rdx,%rax,1),%r9
  mov    -0x40(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x80(%rbp),%rax
  lea    (%rdx,%rax,1),%r8
  mov    -0x10(%rbp),%rcx
  mov    -0x18(%rbp),%rdx
  mov    -0x48(%rbp),%esi
  mov    -0x2c(%rbp),%eax
  sub    $0x8,%rsp
  mov    -0x68(%rbp),%edi
  push   %rdi
  mov    %eax,%edi
  call   <passf3@plt>
  add    $0x10,%rsp
  cmpl   $0x0,-0x44(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0x44(%rbp)
  jmp    L82
L165:
  mov    -0x40(%rbp),%edx
  mov    -0x2c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x24(%rbp),%edx
  mov    -0x2c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x20(%rbp),%edx
  mov    -0x2c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x1c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x80(%rbp),%rax
  lea    (%rdx,%rax,1),%r9
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x80(%rbp),%rax
  lea    (%rdx,%rax,1),%r8
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x80(%rbp),%rax
  lea    (%rdx,%rax,1),%r11
  mov    -0x40(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x80(%rbp),%rax
  lea    (%rdx,%rax,1),%r10
  mov    -0x10(%rbp),%rcx
  mov    -0x18(%rbp),%rdx
  mov    -0x48(%rbp),%esi
  mov    -0x2c(%rbp),%eax
  sub    $0x8,%rsp
  mov    -0x68(%rbp),%edi
  push   %rdi
  push   %r9
  push   %r8
  mov    %r11,%r9
  mov    %r10,%r8
  mov    %eax,%edi
  call   <passf5@plt>
  add    $0x20,%rsp
  cmpl   $0x0,-0x44(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0x44(%rbp)
  jmp    L82
L206:
  mov    -0x40(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x80(%rbp),%rax
  lea    (%rdx,%rax,1),%r8
  mov    -0x18(%rbp),%r9
  mov    -0x28(%rbp),%r10d
  mov    -0x48(%rbp),%ecx
  mov    -0x38(%rbp),%edx
  mov    -0x2c(%rbp),%esi
  lea    -0x54(%rbp),%rax
  sub    $0x8,%rsp
  mov    -0x68(%rbp),%edi
  push   %rdi
  push   %r8
  push   -0x10(%rbp)
  mov    %r10d,%r8d
  mov    %rax,%rdi
  call   <passf@plt>
  add    $0x20,%rsp
  mov    -0x54(%rbp),%eax
  test   %eax,%eax
  je     L82
  cmpl   $0x0,-0x44(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0x44(%rbp)
L82:
  mov    -0x34(%rbp),%eax
  mov    %eax,-0x48(%rbp)
  mov    -0x38(%rbp),%eax
  sub    $0x1,%eax
  imul   -0x2c(%rbp),%eax
  add    %eax,-0x40(%rbp)
  addl   $0x1,-0x4c(%rbp)
L143:
  mov    -0x3c(%rbp),%eax
  add    $0x1,%eax
  cmp    %eax,-0x4c(%rbp)
  jle    L37
  cmpl   $0x0,-0x44(%rbp)
  je     L53
  movl   $0x0,-0x50(%rbp)
  jmp    L123
L162:
  mov    -0x50(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x78(%rbp),%rax
  add    %rax,%rdx
  mov    -0x50(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rcx
  mov    -0x70(%rbp),%rax
  add    %rcx,%rax
  movss  (%rdx),%xmm0
  movss  %xmm0,(%rax)
  addl   $0x1,-0x50(%rbp)
L123:
  mov    -0x64(%rbp),%eax
  add    %eax,%eax
  cmp    %eax,-0x50(%rbp)
  jl     L162
  jmp    L4
L53:
  nop
L4:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L153
  call   <__stack_chk_fail@plt>
L153:
  leave
  ret
```

assistant: ```c
void cfftf1(int n, float c[], float ch[], const float wa[], const int ifac[13 + 2], int isign) {
  int idot, i;
  int k1, l1, l2;
  int na, nf, ip, iw, ix2, ix3, ix4, nac, ido, idl1;
  float *cinput, *coutput;
  nf = ifac[1];
  na = 0;
  l1 = 1;
  iw = 0;
  for (k1 = 2; k1 <= nf + 1; k1++) {
    ip = ifac[k1];
    l2 = ip * l1;
    ido = n / l2;
    idot = ido + ido;
    idl1 = idot * l1;
    if (na) {
      cinput = ch;
      coutput = c;
    } else {
      cinput = c;
      coutput = ch;
    }
    switch (ip) {
    case 4:
      ix2 = iw + idot;
      ix3 = ix2 + idot;
      passf4(idot, l1, cinput, coutput, &wa[iw], &wa[ix2], &wa[ix3], isign);
      na = !na;
      break;
    case 2:
      passf2(idot, l1, cinput, coutput, &wa[iw], isign);
      na = !na;
      break;
    case 3:
      ix2 = iw + idot;
      passf3(idot, l1, cinput, coutput, &wa[iw], &wa[ix2], isign);
      na = !na;
      break;
    case 5:
      ix2 = iw + idot;
      ix3 = ix2 + idot;
      ix4 = ix3 + idot;
      passf5(idot, l1, cinput, coutput, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign);
      na = !na;
      break;
    default:
      passf(&nac, idot, ip, l1, idl1, cinput, coutput, &wa[iw], isign);
      if (nac != 0)
        na = !na;
    }
    l1 = l2;
    iw += (ip - 1) * idot;
  }
  if (na == 0)
    return;
  for (i = 0; i < 2 * n; i++)
    c[i] = ch[i];
}
```