user: What is the c source code of the assembly code below?

```asm
<iffts1>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  mov    %edx,-0x20(%rbp)
  mov    %rcx,-0x28(%rbp)
  mov    %r8,-0x30(%rbp)
  mov    -0x1c(%rbp),%eax
  mov    $0x1,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  test   %rax,%rax
  js     L184
  pxor   %xmm0,%xmm0
  cvtsi2sd %rax,%xmm0
  jmp    L183
L184:
  mov    %rax,%rdx
  shr    %rdx
  and    $0x1,%eax
  or     %rax,%rdx
  pxor   %xmm0,%xmm0
  cvtsi2sd %rdx,%xmm0
  addsd  %xmm0,%xmm0
L183:
  movsd  D3(%rip),%xmm1
  divsd  %xmm0,%xmm1
  pxor   %xmm0,%xmm0
  cvtsd2ss %xmm1,%xmm0
  movss  %xmm0,-0x8(%rbp)
  cmpl   $0x3,-0x1c(%rbp)
  je     L189
  cmpl   $0x3,-0x1c(%rbp)
  jg     L134
  cmpl   $0x2,-0x1c(%rbp)
  je     L192
  cmpl   $0x2,-0x1c(%rbp)
  jg     L134
  cmpl   $0x0,-0x1c(%rbp)
  je     L154
  cmpl   $0x1,-0x1c(%rbp)
  jne    L80
  jmp    L55
L144:
  mov    -0x8(%rbp),%edx
  mov    -0x18(%rbp),%rax
  movd   %edx,%xmm0
  mov    %rax,%rdi
  call   <ifft2pt@plt>
  mov    -0x1c(%rbp),%eax
  mov    $0x8,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  add    %rax,-0x18(%rbp)
  subl   $0x1,-0x20(%rbp)
L55:
  cmpl   $0x0,-0x20(%rbp)
  jg     L144
  jmp    L13
L140:
  mov    -0x8(%rbp),%edx
  mov    -0x18(%rbp),%rax
  movd   %edx,%xmm0
  mov    %rax,%rdi
  call   <ifft4pt@plt>
  mov    -0x1c(%rbp),%eax
  mov    $0x8,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  add    %rax,-0x18(%rbp)
  subl   $0x1,-0x20(%rbp)
L192:
  cmpl   $0x0,-0x20(%rbp)
  jg     L140
  jmp    L13
L98:
  mov    -0x8(%rbp),%edx
  mov    -0x18(%rbp),%rax
  movd   %edx,%xmm0
  mov    %rax,%rdi
  call   <ifft8pt@plt>
  mov    -0x1c(%rbp),%eax
  mov    $0x8,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  add    %rax,-0x18(%rbp)
  subl   $0x1,-0x20(%rbp)
L189:
  cmpl   $0x0,-0x20(%rbp)
  jg     L98
  jmp    L13
L80:
  jmp    L134
L109:
  mov    -0x8(%rbp),%esi
  mov    -0x30(%rbp),%rdx
  mov    -0x1c(%rbp),%ecx
  mov    -0x18(%rbp),%rax
  movd   %esi,%xmm0
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <scbitrevR2@plt>
  mov    -0x1c(%rbp),%eax
  sub    $0x1,%eax
  movslq %eax,%rdx
  imul   $0x55555556,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0x4(%rbp)
  movl   $0x2,-0xc(%rbp)
  mov    -0x1c(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    -0x4(%rbp),%eax
  mov    %eax,%esi
  lea    0x0(,%rax,4),%ecx
  mov    %esi,%eax
  sub    %ecx,%eax
  add    %edx,%eax
  cmp    $0x1,%eax
  jne    L63
  mov    -0xc(%rbp),%edx
  mov    -0x1c(%rbp),%ecx
  mov    -0x18(%rbp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <ibfR2@plt>
  shll   -0xc(%rbp)
L63:
  mov    -0x1c(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    -0x4(%rbp),%eax
  mov    %eax,%esi
  lea    0x0(,%rax,4),%ecx
  mov    %esi,%eax
  sub    %ecx,%eax
  add    %edx,%eax
  cmp    $0x2,%eax
  jne    L94
  mov    -0xc(%rbp),%edx
  mov    -0x1c(%rbp),%ecx
  mov    -0x18(%rbp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <ibfR4@plt>
  shll   $0x2,-0xc(%rbp)
L94:
  mov    -0x1c(%rbp),%eax
  cmp    $0xb,%eax
  ja     L173
  mov    -0x4(%rbp),%edi
  mov    -0xc(%rbp),%ecx
  mov    -0x28(%rbp),%rdx
  mov    -0x1c(%rbp),%esi
  mov    -0x18(%rbp),%rax
  mov    %edi,%r9d
  mov    %ecx,%r8d
  mov    $0x1,%ecx
  mov    %rax,%rdi
  call   <ibfstages@plt>
  jmp    L139
L173:
  mov    -0x4(%rbp),%edi
  mov    -0xc(%rbp),%ecx
  mov    -0x28(%rbp),%rdx
  mov    -0x1c(%rbp),%esi
  mov    -0x18(%rbp),%rax
  mov    %edi,%r9d
  mov    %ecx,%r8d
  mov    $0x1,%ecx
  mov    %rax,%rdi
  call   <ifftrecurs@plt>
L139:
  mov    -0x1c(%rbp),%eax
  mov    $0x8,%edx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  add    %rax,-0x18(%rbp)
  subl   $0x1,-0x20(%rbp)
L134:
  cmpl   $0x0,-0x20(%rbp)
  jg     L109
  jmp    L13
L154:
  nop
L13:
  nop
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_tag: D3
type_infered: f64

tool: D3: 1

assistant: ```c
void iffts1(float *ioptr, int M, int Rows, float *Utbl, short *BRLow) {
  int StageCnt;
  int NDiffU;
  const float scale = 1.0 / ((unsigned long)1 << (M));
  switch (M) {
  case 0:
    break;
  case 1:
    for (; Rows > 0; Rows--) {
      ifft2pt(ioptr, scale);
      ioptr += 2 * ((unsigned long)1 << (M));
    }
    break;
  case 2:
    for (; Rows > 0; Rows--) {
      ifft4pt(ioptr, scale);
      ioptr += 2 * ((unsigned long)1 << (M));
    }
    break;
  case 3:
    for (; Rows > 0; Rows--) {
      ifft8pt(ioptr, scale);
      ioptr += 2 * ((unsigned long)1 << (M));
    }
    break;
  default:
    for (; Rows > 0; Rows--) {
      scbitrevR2(ioptr, M, BRLow, scale);
      StageCnt = (M - 1) / 3;
      NDiffU = 2;
      if ((M - 1 - (StageCnt * 3)) == 1) {
        ibfR2(ioptr, M, NDiffU);
        NDiffU *= 2;
      }
      if ((M - 1 - (StageCnt * 3)) == 2) {
        ibfR4(ioptr, M, NDiffU);
        NDiffU *= 4;
      }
      if (M <= (11 - (sizeof(float) / 8)))
        ibfstages(ioptr, M, Utbl, 1, NDiffU, StageCnt);
      else {
        ifftrecurs(ioptr, M, Utbl, 1, NDiffU, StageCnt);
      }
      ioptr += 2 * ((unsigned long)1 << (M));
    }
  }
}
```