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

```asm
<JGcfft>:
  endbr64
  push   %r14
  push   %r13
  lea    (%rsi,%rsi,1),%r13d
  push   %r12
  mov    %r13d,%esi
  push   %rbp
  mov    %edx,%ebp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x10,%rsp
  call   <bitreverse@plt>
  cmp    $0x2,%r13d
  jle    L11
  mov    $0x2,%r12d
  nopl   0x0(%rax)
L36:
  mov    %r12d,%r14d
  add    %r12d,%r12d
  test   %ebp,%ebp
  je     L77
  pxor   %xmm0,%xmm0
  cvtsi2sd %r14d,%xmm0
L159:
  movsd  D39(%rip),%xmm2
  divsd  %xmm0,%xmm2
  movss  D3(%rip),%xmm0
  cvtsd2ss %xmm2,%xmm2
  mulss  %xmm2,%xmm0
  movss  %xmm2,0xc(%rsp)
  call   <sin@plt>
  mov    D34(%rip),%rax
  movq   %rax,%xmm1
  call   <pow@plt>
  movss  0xc(%rsp),%xmm2
  pxor   %xmm5,%xmm5
  mulsd  D33(%rip),%xmm0
  cvtsd2ss %xmm0,%xmm5
  movaps %xmm2,%xmm0
  movss  %xmm5,0x8(%rsp)
  call   <sin@plt>
  test   %r14d,%r14d
  movss  0x8(%rsp),%xmm5
  movaps %xmm0,%xmm6
  jle    L93
  lea    0x1(%r14),%r9d
  cmp    %r14d,%r13d
  mov    %r14d,%r10d
  movslq %r12d,%rsi
  movslq %r9d,%r9
  cmovle %r13d,%r10d
  mov    %rbx,%r8
  shl    $0x2,%rsi
  movss  D69(%rip),%xmm3
  xor    %edi,%edi
  pxor   %xmm4,%xmm4
  shl    $0x2,%r9
  nopw   0x0(%rax,%rax,1)
L47:
  lea    (%r9,%r8,1),%rdx
  mov    %r8,%rax
  mov    %edi,%ecx
  nopl   0x0(%rax)
L28:
  movss  -0x4(%rdx),%xmm2
  movss  (%rdx),%xmm0
  add    %r12d,%ecx
  movaps %xmm2,%xmm1
  movaps %xmm0,%xmm7
  mulss  %xmm3,%xmm1
  mulss  %xmm4,%xmm7
  mulss  %xmm4,%xmm2
  mulss  %xmm3,%xmm0
  subss  %xmm7,%xmm1
  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
  addss  0x4(%rax),%xmm0
  add    %rsi,%rdx
  movss  %xmm1,(%rax)
  movss  %xmm0,0x4(%rax)
  add    %rsi,%rax
  cmp    %ecx,%r13d
  jg     L28
  movaps %xmm3,%xmm0
  movaps %xmm4,%xmm1
  add    $0x2,%edi
  add    $0x8,%r8
  mulss  %xmm6,%xmm1
  mulss  %xmm5,%xmm0
  subss  %xmm1,%xmm0
  movaps %xmm4,%xmm1
  mulss  %xmm5,%xmm1
  addss  %xmm3,%xmm0
  mulss  %xmm6,%xmm3
  addss  %xmm1,%xmm3
  addss  %xmm3,%xmm4
  cmp    %r10d,%edi
  jge    L93
  movaps %xmm0,%xmm3
  jmp    L47
  xchg   %ax,%ax
L93:
  cmp    %r12d,%r13d
  jg     L36
L11:
  movss  D14(%rip),%xmm1
  test   %ebp,%ebp
  je     L12
  pxor   %xmm1,%xmm1
  movsd  D47(%rip),%xmm0
  cvtsi2sd %r13d,%xmm1
  divsd  %xmm1,%xmm0
  pxor   %xmm1,%xmm1
  cvtsd2ss %xmm0,%xmm1
L12:
  movslq %r13d,%rax
  shl    $0x2,%rax
  lea    (%rbx,%rax,1),%rdx
  cmp    %rdx,%rbx
  jae    L157
  sub    $0x1,%rax
  mov    %rbx,%rdx
  mov    %rax,%rdi
  shr    $0x2,%rdi
  lea    0x1(%rdi),%rcx
  cmp    $0xb,%rax
  jbe    L122
  mov    %rcx,%rax
  movaps %xmm1,%xmm2
  shr    $0x2,%rax
  shufps $0x0,%xmm2,%xmm2
  shl    $0x4,%rax
  add    %rbx,%rax
L129:
  movups (%rdx),%xmm0
  add    $0x10,%rdx
  mulps  %xmm2,%xmm0
  movups %xmm0,-0x10(%rdx)
  cmp    %rdx,%rax
  jne    L129
  mov    %rcx,%rsi
  and    $0xfffffffffffffffc,%rsi
  lea    (%rbx,%rsi,4),%rax
  cmp    %rsi,%rcx
  je     L157
L127:
  sub    %rsi,%rcx
  mov    %rcx,%rdx
  cmp    %rsi,%rdi
  je     L136
  lea    (%rbx,%rsi,4),%rcx
  movaps %xmm1,%xmm2
  movq   (%rcx),%xmm0
  shufps $0xe0,%xmm2,%xmm2
  mulps  %xmm2,%xmm0
  movlps %xmm0,(%rcx)
  mov    %rdx,%rcx
  and    $0xfffffffffffffffe,%rcx
  lea    (%rax,%rcx,4),%rax
  cmp    %rdx,%rcx
  je     L157
L136:
  mulss  (%rax),%xmm1
  movss  %xmm1,(%rax)
L157:
  add    $0x10,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L77:
  mov    %r14d,%eax
  pxor   %xmm0,%xmm0
  neg    %eax
  cvtsi2sd %eax,%xmm0
  jmp    L159
L122:
  mov    %rbx,%rax
  xor    %esi,%esi
  jmp    L127
```

tool_calls: name: read_data
arguments: tag: D39
type_infered: byte[8]
name: read_data
arguments: tag: D3
type_infered: f32
name: read_data
arguments: tag: D34
type_infered: f64
name: read_data
arguments: tag: D33
type_infered: f32[2]
name: read_data
arguments: tag: D69
type_infered: f32
name: read_data
arguments: tag: D14
type_infered: byte[4]
name: read_data
arguments: tag: D47
type_infered: f32[2]

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

tool: D3: 0.5

tool: D34: 2

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

tool: D69: 1

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

tool: {"D47": [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;
  }
}
```