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

```asm
<JGcfft>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x10,%rsp
  mov    %rdi,%r13
  mov    %edx,%r14d
  lea    (%rsi,%rsi,1),%ebx
  mov    %ebx,%esi
  call   <bitreverse@plt>
  cmp    $0x2,%ebx
  jle    L25
  mov    $0x2,%ebp
  jmp    L3
L114:
  mov    %r12d,%eax
  neg    %eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  jmp    L110
L102:
  movss  -0x4(%rdx),%xmm2
  movss  (%rdx),%xmm0
  movaps %xmm2,%xmm1
  mulss  %xmm3,%xmm1
  movaps %xmm0,%xmm6
  mulss  %xmm4,%xmm6
  subss  %xmm6,%xmm1
  mulss  %xmm3,%xmm0
  mulss  %xmm4,%xmm2
  addss  %xmm2,%xmm0
  movss  (%rax),%xmm2
  subss  %xmm1,%xmm2
  movss  %xmm2,-0x4(%rdx)
  movss  0x4(%rax),%xmm2
  subss  %xmm0,%xmm2
  movss  %xmm2,(%rdx)
  addss  (%rax),%xmm1
  movss  %xmm1,(%rax)
  addss  0x4(%rax),%xmm0
  movss  %xmm0,0x4(%rax)
  add    %ebp,%ecx
  add    %rsi,%rax
  add    %rsi,%rdx
  cmp    %ecx,%ebx
  jg     L102
L85:
  movss  0x8(%rsp),%xmm7
  movaps %xmm7,%xmm0
  mulss  %xmm3,%xmm0
  movaps %xmm5,%xmm1
  mulss  %xmm4,%xmm1
  subss  %xmm1,%xmm0
  addss  %xmm3,%xmm0
  mulss  %xmm4,%xmm7
  mulss  %xmm5,%xmm3
  addss  %xmm7,%xmm3
  addss  %xmm3,%xmm4
  add    $0x2,%edi
  add    $0x8,%r8
  cmp    %r12d,%edi
  jge    L17
  movaps %xmm0,%xmm3
L72:
  lea    (%r9,%r8,1),%rdx
  mov    %r8,%rax
  mov    %edi,%ecx
  cmp    %edi,%ebx
  jg     L102
  jmp    L85
L17:
  cmp    %ebp,%ebx
  jle    L25
L3:
  mov    %ebp,%r12d
  add    %ebp,%ebp
  test   %r14d,%r14d
  je     L114
  pxor   %xmm1,%xmm1
  cvtsi2sd %r12d,%xmm1
L110:
  movsd  D50(%rip),%xmm0
  divsd  %xmm1,%xmm0
  pxor   %xmm5,%xmm5
  cvtsd2ss %xmm0,%xmm5
  movss  D27(%rip),%xmm7
  movss  %xmm5,0xc(%rsp)
  mulss  %xmm5,%xmm7
  movaps %xmm7,%xmm0
  call   <sin@plt>
  mov    D33(%rip),%rax
  movq   %rax,%xmm1
  call   <pow@plt>
  mulsd  D12(%rip),%xmm0
  pxor   %xmm7,%xmm7
  cvtsd2ss %xmm0,%xmm7
  movss  %xmm7,0x8(%rsp)
  movss  0xc(%rsp),%xmm0
  call   <sin@plt>
  movaps %xmm0,%xmm5
  test   %r12d,%r12d
  jle    L17
  mov    %r13,%r8
  movslq %ebp,%rsi
  shl    $0x2,%rsi
  movslq %r12d,%rax
  mov    $0x0,%edi
  pxor   %xmm4,%xmm4
  movss  D11(%rip),%xmm3
  lea    0x4(,%rax,4),%r9
  jmp    L72
L25:
  movss  D51(%rip),%xmm1
  test   %r14d,%r14d
  je     L22
  pxor   %xmm0,%xmm0
  cvtsi2sd %ebx,%xmm0
  movsd  D43(%rip),%xmm1
  divsd  %xmm0,%xmm1
  cvtsd2ss %xmm1,%xmm1
L22:
  movslq %ebx,%rbx
  lea    0x0(%r13,%rbx,4),%rax
  cmp    %rax,%r13
  jae    L12
L88:
  add    $0x4,%r13
  movaps %xmm1,%xmm0
  mulss  -0x4(%r13),%xmm0
  movss  %xmm0,-0x4(%r13)
  cmp    %r13,%rax
  ja     L88
L12:
  add    $0x10,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
```

tool_calls: name: unpack_data
arguments: data_label: D50
datatype: byte[8]
name: unpack_data
arguments: data_label: D27
datatype: f32
name: unpack_data
arguments: data_label: D33
datatype: f64
name: unpack_data
arguments: data_label: D12
datatype: f32[2]
name: unpack_data
arguments: data_label: D11
datatype: f32
name: unpack_data
arguments: data_label: D51
datatype: byte[4]
name: unpack_data
arguments: data_label: D43
datatype: f32[2]

tool: {"D50": [0x18,0x2d,0x44,0x54,0xfb,0x21,0x19,0x40]}

tool: D27: 0.5

tool: D33: 2

tool: {"D12": [0.0,-2.0]}

tool: D11: 1

tool: {"D51": [0x00,0x00,0x00,0x40]}

tool: {"D43": [0.0,1.875]}

assistant: ```c
void JGcfft(float x[], int NC, int forward) {
  float wr, wi, wpr, wpi, theta, scale;
  int mmax, ND, m, i, j, delta;
  ND = NC << 1;
  bitreverse(x, ND);
  for (mmax = 2; mmax < ND; mmax = delta) {
    delta = mmax << 1;
    theta = (2.0 * 3.14159265358979323846264338327) / (forward ? mmax : -mmax);
    wpr = -2.0 * pow(sin(0.5 * theta), 2.0);
    wpi = sin(theta);
    wr = 1.0;
    wi = 0.0;
    for (m = 0; m < mmax; m += 2) {
      float rtemp, itemp;
      for (i = m; i < ND; i += delta) {
        j = i + mmax;
        rtemp = wr * x[j] - wi * x[j + 1];
        itemp = wr * x[j + 1] + wi * x[j];
        x[j] = x[i] - rtemp;
        x[j + 1] = x[i + 1] - itemp;
        x[i] += rtemp;
        x[i + 1] += itemp;
      }
      rtemp = wr;
      wr = wr * wpr - wi * wpi + wr;
      wi = wi * wpr + rtemp * wpi + wi;
    }
  }
  scale = forward ? 1.0 / ND : 2.0;
  {
    float *xi = x, *xe = x + ND;
    while (xi < xe)
      *xi++ *= scale;
  }
}
```