user: 请将这段汇编代码片段转换成等效的C代码：

```asm
<twiddleFFT_4>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x100,%rsp
  mov    %edi,-0xd4(%rbp)
  mov    %esi,-0xd8(%rbp)
  mov    %edx,-0xdc(%rbp)
  mov    %ecx,-0xe0(%rbp)
  mov    %r8,-0xe8(%rbp)
  mov    %r9,-0xf0(%rbp)
  mov    0x10(%rbp),%rax
  mov    %rax,-0xf8(%rbp)
  mov    0x18(%rbp),%rax
  mov    %rax,-0x100(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0xe0(%rbp),%eax
  mov    %eax,-0xc4(%rbp)
  movl   $0x0,-0xcc(%rbp)
  jmp    L12
L26:
  movl   $0x0,-0xc8(%rbp)
  jmp    L6
L18:
  mov    -0xc8(%rbp),%eax
  cltq
  mov    -0xc4(%rbp),%edx
  mov    %edx,-0x20(%rbp,%rax,4)
  mov    -0xd4(%rbp),%eax
  add    %eax,-0xc4(%rbp)
  addl   $0x1,-0xc8(%rbp)
L6:
  mov    -0xc8(%rbp),%eax
  cmp    -0xd8(%rbp),%eax
  jl     L18
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0xf8(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0xc0(%rbp)
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x100(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0xb8(%rbp)
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0xf8(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0xb0(%rbp)
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x100(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0xa8(%rbp)
  mov    -0xe8(%rbp),%rax
  movsd  0x10(%rax),%xmm0
  movsd  %xmm0,-0xa0(%rbp)
  mov    -0xf0(%rbp),%rax
  movsd  0x10(%rax),%xmm0
  movsd  %xmm0,-0x98(%rbp)
  movsd  -0xa0(%rbp),%xmm0
  mulsd  -0xb0(%rbp),%xmm0
  movsd  -0x98(%rbp),%xmm1
  mulsd  -0xa8(%rbp),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x90(%rbp)
  movsd  -0xa0(%rbp),%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0xa8(%rbp),%xmm1
  movsd  -0x98(%rbp),%xmm0
  mulsd  -0xb0(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x88(%rbp)
  movsd  -0xc0(%rbp),%xmm0
  addsd  -0x90(%rbp),%xmm0
  movsd  %xmm0,-0x80(%rbp)
  movsd  -0xc0(%rbp),%xmm0
  subsd  -0x90(%rbp),%xmm0
  movsd  %xmm0,-0x78(%rbp)
  movsd  -0xb8(%rbp),%xmm0
  addsd  -0x88(%rbp),%xmm0
  movsd  %xmm0,-0x70(%rbp)
  movsd  -0xb8(%rbp),%xmm0
  subsd  -0x88(%rbp),%xmm0
  movsd  %xmm0,-0x68(%rbp)
  mov    -0x1c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0xf8(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0xb0(%rbp)
  mov    -0x1c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x100(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0xa8(%rbp)
  mov    -0xe8(%rbp),%rax
  movsd  0x8(%rax),%xmm0
  movsd  %xmm0,-0xa0(%rbp)
  mov    -0xf0(%rbp),%rax
  movsd  0x8(%rax),%xmm0
  movsd  %xmm0,-0x98(%rbp)
  movsd  -0xa0(%rbp),%xmm0
  mulsd  -0xb0(%rbp),%xmm0
  movsd  -0x98(%rbp),%xmm1
  mulsd  -0xa8(%rbp),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x60(%rbp)
  movsd  -0xa0(%rbp),%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0xa8(%rbp),%xmm1
  movsd  -0x98(%rbp),%xmm0
  mulsd  -0xb0(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x58(%rbp)
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0xf8(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0xb0(%rbp)
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x100(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0xa8(%rbp)
  mov    -0xe8(%rbp),%rax
  movsd  0x18(%rax),%xmm0
  movsd  %xmm0,-0xa0(%rbp)
  mov    -0xf0(%rbp),%rax
  movsd  0x18(%rax),%xmm0
  movsd  %xmm0,-0x98(%rbp)
  movsd  -0xa0(%rbp),%xmm0
  mulsd  -0xb0(%rbp),%xmm0
  movsd  -0x98(%rbp),%xmm1
  mulsd  -0xa8(%rbp),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x50(%rbp)
  movsd  -0xa0(%rbp),%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0xa8(%rbp),%xmm1
  movsd  -0x98(%rbp),%xmm0
  mulsd  -0xb0(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x48(%rbp)
  movsd  -0x60(%rbp),%xmm0
  addsd  -0x50(%rbp),%xmm0
  movsd  %xmm0,-0x40(%rbp)
  movsd  -0x50(%rbp),%xmm0
  subsd  -0x60(%rbp),%xmm0
  movsd  %xmm0,-0x38(%rbp)
  movsd  -0x58(%rbp),%xmm0
  addsd  -0x48(%rbp),%xmm0
  movsd  %xmm0,-0x30(%rbp)
  movsd  -0x58(%rbp),%xmm0
  subsd  -0x48(%rbp),%xmm0
  movsd  %xmm0,-0x28(%rbp)
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0xf8(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x80(%rbp),%xmm0
  addsd  -0x40(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x1c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0xf8(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x78(%rbp),%xmm0
  addsd  -0x28(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0xf8(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x80(%rbp),%xmm0
  subsd  -0x40(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0xf8(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x78(%rbp),%xmm0
  subsd  -0x28(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x100(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x70(%rbp),%xmm0
  addsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x1c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x100(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x68(%rbp),%xmm0
  addsd  -0x38(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x100(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x70(%rbp),%xmm0
  subsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x100(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x68(%rbp),%xmm0
  subsd  -0x38(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0xd4(%rbp),%eax
  imul   -0xd8(%rbp),%eax
  add    %eax,-0xe0(%rbp)
  mov    -0xe0(%rbp),%eax
  mov    %eax,-0xc4(%rbp)
  addl   $0x1,-0xcc(%rbp)
L12:
  mov    -0xcc(%rbp),%eax
  cmp    -0xdc(%rbp),%eax
  jl     L26
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L1
  call   <__stack_chk_fail@plt>
L1:
  leave
  ret
```

assistant: ```c
void twiddleFFT_4(int sofarRadix, int radix, int remainRadix, int groupOffset, double twiddleRe[], double twiddleIm[], double yRe[], double yIm[]) {
  int yIndx[4];
  int groupNo, blockNo, adr;
  double t1_re, t1_im, t2_re, t2_im;
  double m2_re, m2_im, m3_re, m3_im;
  double yr, yi, twr, twi;
  double ar0, ar1, ar2, ar3;
  double ai0, ai1, ai2, ai3;
  adr = groupOffset;
  for (groupNo = 0; groupNo < remainRadix; groupNo++) {
    for (blockNo = 0; blockNo < radix; blockNo++) {
      yIndx[blockNo] = adr;
      adr = adr + sofarRadix;
    }
    ar0 = yRe[yIndx[0]];
    ai0 = yIm[yIndx[0]];
    yr = yRe[yIndx[2]];
    yi = yIm[yIndx[2]];
    twr = twiddleRe[2];
    twi = twiddleIm[2];
    ar2 = twr * yr - twi * yi;
    ai2 = twr * yi + twi * yr;
    t1_re = ar0 + ar2;
    m2_re = ar0 - ar2;
    t1_im = ai0 + ai2;
    m2_im = ai0 - ai2;
    yr = yRe[yIndx[1]];
    yi = yIm[yIndx[1]];
    twr = twiddleRe[1];
    twi = twiddleIm[1];
    ar1 = twr * yr - twi * yi;
    ai1 = twr * yi + twi * yr;
    yr = yRe[yIndx[3]];
    yi = yIm[yIndx[3]];
    twr = twiddleRe[3];
    twi = twiddleIm[3];
    ar3 = twr * yr - twi * yi;
    ai3 = twr * yi + twi * yr;
    t2_re = ar1 + ar3;
    m3_im = ar3 - ar1;
    t2_im = ai1 + ai3;
    m3_re = ai1 - ai3;
    yRe[yIndx[0]] = t1_re + t2_re;
    yRe[yIndx[1]] = m2_re + m3_re;
    yRe[yIndx[2]] = t1_re - t2_re;
    yRe[yIndx[3]] = m2_re - m3_re;
    yIm[yIndx[0]] = t1_im + t2_im;
    yIm[yIndx[1]] = m2_im + m3_im;
    yIm[yIndx[2]] = t1_im - t2_im;
    yIm[yIndx[3]] = m2_im - m3_im;
    groupOffset = groupOffset + sofarRadix * radix;
    adr = groupOffset;
  }
}
```