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

```asm
<twiddleFFT_4>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x48,%rsp
  mov    %edi,%ebx
  mov    %edi,0x4(%rsp)
  mov    %edx,0x10(%rsp)
  mov    0x80(%rsp),%rdi
  mov    0x88(%rsp),%rax
  mov    %rax,0x8(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x38(%rsp)
  xor    %eax,%eax
  test   %edx,%edx
  jle    L60
  mov    %esi,%ebp
  mov    %ecx,%r11d
  imul   %esi,%ebx
  mov    %ebx,0x14(%rsp)
  lea    0x20(%rsp),%rax
  mov    %rax,0x18(%rsp)
  lea    -0x1(%rsi),%eax
  lea    0x24(%rsp,%rax,4),%r10
  mov    $0x0,%ebx
  jmp    L32
L27:
  mov    %edx,(%rax)
  add    0x4(%rsp),%edx
  add    $0x4,%rax
  cmp    %r10,%rax
  jne    L27
L62:
  movslq 0x20(%rsp),%rsi
  shl    $0x3,%rsi
  lea    (%rdi,%rsi,1),%r15
  movsd  (%r15),%xmm4
  mov    0x8(%rsp),%rax
  add    %rax,%rsi
  movsd  (%rsi),%xmm3
  movslq 0x28(%rsp),%rdx
  shl    $0x3,%rdx
  lea    (%rdi,%rdx,1),%r13
  movsd  0x0(%r13),%xmm2
  add    %rax,%rdx
  movsd  (%rdx),%xmm0
  movsd  0x10(%r8),%xmm6
  movsd  0x10(%r9),%xmm5
  movapd %xmm2,%xmm1
  mulsd  %xmm6,%xmm1
  movapd %xmm0,%xmm7
  mulsd  %xmm5,%xmm7
  subsd  %xmm7,%xmm1
  mulsd  %xmm6,%xmm0
  mulsd  %xmm5,%xmm2
  addsd  %xmm2,%xmm0
  movapd %xmm4,%xmm5
  addsd  %xmm1,%xmm5
  subsd  %xmm1,%xmm4
  movapd %xmm3,%xmm6
  addsd  %xmm0,%xmm6
  subsd  %xmm0,%xmm3
  movslq 0x24(%rsp),%rcx
  shl    $0x3,%rcx
  lea    (%rdi,%rcx,1),%r14
  movsd  (%r14),%xmm0
  add    %rax,%rcx
  movsd  (%rcx),%xmm2
  movsd  0x8(%r8),%xmm8
  movsd  0x8(%r9),%xmm1
  movapd %xmm0,%xmm7
  mulsd  %xmm8,%xmm7
  movapd %xmm2,%xmm9
  mulsd  %xmm1,%xmm9
  subsd  %xmm9,%xmm7
  mulsd  %xmm8,%xmm2
  mulsd  %xmm1,%xmm0
  addsd  %xmm0,%xmm2
  movslq 0x2c(%rsp),%rax
  shl    $0x3,%rax
  lea    (%rdi,%rax,1),%r12
  movsd  (%r12),%xmm8
  add    0x8(%rsp),%rax
  movsd  (%rax),%xmm1
  movsd  0x18(%r8),%xmm10
  movsd  0x18(%r9),%xmm9
  movapd %xmm8,%xmm0
  mulsd  %xmm10,%xmm0
  movapd %xmm1,%xmm11
  mulsd  %xmm9,%xmm11
  subsd  %xmm11,%xmm0
  mulsd  %xmm10,%xmm1
  mulsd  %xmm9,%xmm8
  addsd  %xmm8,%xmm1
  movapd %xmm7,%xmm8
  addsd  %xmm0,%xmm8
  subsd  %xmm7,%xmm0
  movapd %xmm2,%xmm7
  addsd  %xmm1,%xmm7
  subsd  %xmm1,%xmm2
  movapd %xmm5,%xmm1
  addsd  %xmm8,%xmm1
  movsd  %xmm1,(%r15)
  movapd %xmm4,%xmm1
  addsd  %xmm2,%xmm1
  movsd  %xmm1,(%r14)
  subsd  %xmm8,%xmm5
  movsd  %xmm5,0x0(%r13)
  subsd  %xmm2,%xmm4
  movsd  %xmm4,(%r12)
  movapd %xmm6,%xmm1
  addsd  %xmm7,%xmm1
  movsd  %xmm1,(%rsi)
  movapd %xmm3,%xmm1
  addsd  %xmm0,%xmm1
  movsd  %xmm1,(%rcx)
  subsd  %xmm7,%xmm6
  movsd  %xmm6,(%rdx)
  subsd  %xmm0,%xmm3
  movsd  %xmm3,(%rax)
  add    0x14(%rsp),%r11d
  add    $0x1,%ebx
  cmp    %ebx,0x10(%rsp)
  je     L60
L32:
  mov    0x18(%rsp),%rax
  mov    %r11d,%edx
  test   %ebp,%ebp
  jg     L27
  jmp    L62
L60:
  mov    0x38(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L41
  add    $0x48,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L41:
  call   <__stack_chk_fail@plt>
```

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;
  }
}
```