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

```asm
<cftfsub>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x8,%rsp
  cmp    $0x8,%edi
  jg     L254
  mov    $0x2,%r12d
  je     L27
L124:
  lea    0x8(%r12),%eax
  cltq
  lea    -0x20(%rbx,%rax,4),%rdx
L249:
  xor    %eax,%eax
  nopl   0x0(%rax)
L141:
  movq   (%rbx),%xmm0
  add    $0x2,%eax
  add    $0x8,%rbx
  add    $0x8,%rdx
  movq   -0x8(%rdx),%xmm2
  movaps %xmm0,%xmm1
  addss  %xmm2,%xmm1
  subps  %xmm2,%xmm0
  movss  %xmm1,-0x8(%rbx)
  movss  -0x4(%rdx),%xmm1
  addss  -0x4(%rbx),%xmm1
  movss  %xmm1,-0x4(%rbx)
  movlps %xmm0,-0x8(%rdx)
  cmp    %r12d,%eax
  jl     L141
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopw   0x0(%rax,%rax,1)
L254:
  mov    %edi,%ebp
  mov    %rdx,%r13
  call   <cft1st@plt>
  cmp    $0x20,%ebp
  jle    L57
  mov    $0x8,%esi
  mov    $0x20,%r12d
  jmp    L127
  nopl   0x0(%rax,%rax,1)
L116:
  mov    %eax,%r12d
L127:
  mov    %r13,%rcx
  mov    %rbx,%rdx
  mov    %ebp,%edi
  call   <cftmdl@plt>
  lea    0x0(,%r12,4),%eax
  mov    %r12d,%esi
  cmp    %ebp,%eax
  jl     L116
  je     L43
  test   %r12d,%r12d
  jle    L5
  movslq %r12d,%rax
  lea    0x20(%rbx),%r8
  lea    (%rbx,%rax,4),%rdx
  lea    0x20(,%rax,4),%rcx
  cmp    %r8,%rdx
  jb     L249
  cmp    $0x8,%r12d
  jle    L249
  lea    -0x1(%r12),%esi
  mov    %rbx,%rax
  lea    -0x1c(%rbx,%rcx,1),%rcx
  mov    %esi,%edi
  shr    $0x3,%esi
  sub    $0x1,%esi
  shr    %edi
  shl    $0x5,%rsi
  add    %r8,%rsi
  nopw   0x0(%rax,%rax,1)
L276:
  movups (%rax),%xmm3
  movups (%rdx),%xmm6
  add    $0x20,%rax
  add    $0x20,%rdx
  movups -0x10(%rax),%xmm2
  movups -0x10(%rdx),%xmm5
  add    $0x20,%rcx
  movaps %xmm3,%xmm0
  movaps %xmm6,%xmm1
  movups -0xc(%rax),%xmm7
  movups -0x20(%rcx),%xmm4
  shufps $0x88,%xmm2,%xmm0
  shufps $0x88,%xmm5,%xmm1
  addps  %xmm1,%xmm0
  movups -0x1c(%rax),%xmm1
  subps  %xmm6,%xmm3
  subps  %xmm5,%xmm2
  shufps $0x88,%xmm7,%xmm1
  movups -0x10(%rcx),%xmm7
  shufps $0x88,%xmm7,%xmm4
  addps  %xmm4,%xmm1
  movaps %xmm0,%xmm4
  unpcklps %xmm1,%xmm4
  unpckhps %xmm1,%xmm0
  movups %xmm4,-0x20(%rax)
  movups %xmm0,-0x10(%rax)
  movups %xmm3,-0x20(%rdx)
  movups %xmm2,-0x10(%rdx)
  cmp    %rsi,%rax
  jne    L276
  mov    %edi,%eax
  and    $0xfffffffc,%eax
  add    %eax,%eax
  lea    (%r12,%rax,1),%edx
  movslq %eax,%rdi
  movslq %edx,%rdx
  lea    0x0(,%rdi,4),%rcx
  lea    0x4(%rbx,%rdi,4),%rdi
  shl    $0x2,%rdx
  lea    (%rbx,%rcx,1),%r8
  lea    (%rbx,%rdx,1),%rsi
  movq   (%r8),%xmm0
  movq   (%rsi),%xmm2
  movaps %xmm2,%xmm1
  addss  %xmm0,%xmm1
  subps  %xmm2,%xmm0
  movss  %xmm1,(%r8)
  movss  (%rdi),%xmm1
  addss  0x4(%rbx,%rdx,1),%xmm1
  lea    0x2(%rax),%edx
  movss  %xmm1,(%rdi)
  movlps %xmm0,(%rsi)
  cmp    %r12d,%edx
  jge    L5
  add    %r12d,%edx
  lea    0x8(%rbx,%rcx,1),%r8
  lea    0x3(%rax),%esi
  movslq %edx,%rdx
  movq   (%r8),%xmm0
  movslq %esi,%rsi
  shl    $0x2,%rdx
  lea    (%rbx,%rsi,4),%rsi
  lea    (%rbx,%rdx,1),%rdi
  movq   (%rdi),%xmm2
  movaps %xmm2,%xmm1
  addss  %xmm0,%xmm1
  subps  %xmm2,%xmm0
  movss  %xmm1,(%r8)
  movss  (%rsi),%xmm1
  addss  0x4(%rbx,%rdx,1),%xmm1
  lea    0x4(%rax),%edx
  movss  %xmm1,(%rsi)
  movlps %xmm0,(%rdi)
  cmp    %edx,%r12d
  jle    L5
  add    %r12d,%edx
  lea    0x10(%rbx,%rcx,1),%r8
  lea    0x5(%rax),%esi
  movslq %edx,%rdx
  movq   (%r8),%xmm0
  movslq %esi,%rsi
  shl    $0x2,%rdx
  lea    (%rbx,%rsi,4),%rsi
  lea    (%rbx,%rdx,1),%rdi
  movq   (%rdi),%xmm2
  movaps %xmm2,%xmm1
  addss  %xmm0,%xmm1
  subps  %xmm2,%xmm0
  movss  %xmm1,(%r8)
  movss  (%rsi),%xmm1
  addss  0x4(%rbx,%rdx,1),%xmm1
  lea    0x6(%rax),%edx
  movss  %xmm1,(%rsi)
  movlps %xmm0,(%rdi)
  cmp    %edx,%r12d
  jle    L5
  add    %r12d,%edx
  lea    0x18(%rbx,%rcx,1),%rsi
  add    $0x7,%eax
  movslq %edx,%rdx
  movq   (%rsi),%xmm0
  cltq
  shl    $0x2,%rdx
  lea    (%rbx,%rax,4),%rax
  lea    (%rbx,%rdx,1),%rcx
  movaps %xmm0,%xmm1
  movq   (%rcx),%xmm2
  addss  %xmm2,%xmm1
  subps  %xmm2,%xmm0
  movss  %xmm1,(%rsi)
  movss  (%rax),%xmm1
  addss  0x4(%rbx,%rdx,1),%xmm1
  movss  %xmm1,(%rax)
  movlps %xmm0,(%rcx)
L5:
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L27:
  lea    0x18(%rsi),%rsi
  mov    $0x10,%r11d
  mov    $0x8,%eax
  mov    $0x2,%r12d
L197:
  sub    %r11,%rsi
  xor    %edx,%edx
  lea    (%rsi,%rax,1),%rcx
  add    %rcx,%rax
  nopl   0x0(%rax)
L70:
  movq   (%rbx,%rdx,4),%xmm0
  add    $0x8,%rsi
  add    $0x8,%rcx
  add    $0x8,%rax
  movq   -0x8(%rsi),%xmm1
  movq   -0x8(%rax),%xmm5
  movaps %xmm0,%xmm2
  addps  %xmm1,%xmm2
  subps  %xmm1,%xmm0
  movq   -0x8(%rcx),%xmm1
  movaps %xmm1,%xmm3
  addps  %xmm5,%xmm1
  subps  %xmm5,%xmm3
  movaps %xmm0,%xmm4
  shufps $0xe1,%xmm3,%xmm3
  addps  %xmm3,%xmm4
  subps  %xmm3,%xmm0
  movaps %xmm2,%xmm3
  addps  %xmm1,%xmm3
  subps  %xmm1,%xmm2
  movaps %xmm4,%xmm1
  movlps %xmm3,(%rbx,%rdx,4)
  movss  %xmm0,%xmm1
  add    $0x2,%rdx
  movss  %xmm4,%xmm0
  movlps %xmm2,-0x8(%rcx)
  movlps %xmm1,-0x8(%rsi)
  movlps %xmm0,-0x8(%rax)
  cmp    %edx,%r12d
  jg     L70
  jmp    L5
  nopl   0x0(%rax)
L43:
  test   %r12d,%r12d
  jle    L5
L93:
  movslq %r12d,%r10
  lea    0x20(%rbx),%rbp
  lea    (%r10,%r10,2),%r8
  lea    0x0(,%r10,4),%rax
  shl    $0x2,%r8
  lea    0x20(,%r10,4),%r15
  lea    0x0(,%r10,8),%r11
  lea    0x20(%r8),%r9
  lea    0x20(%r11),%r13
  cmp    %rax,%r9
  lea    (%rbx,%rax,1),%rcx
  setle  %dil
  cmp    %r15,%r8
  lea    (%rcx,%rax,1),%rdx
  setge  %r14b
  lea    (%rdx,%rax,1),%rsi
  or     %r14d,%edi
  cmp    %r13,%rax
  setge  %r14b
  cmp    %r15,%r11
  setge  %r15b
  or     %r15d,%r14d
  and    %r14d,%edi
  cmp    %rbp,%rcx
  setae  %r14b
  and    %r14d,%edi
  cmp    %r11,%r9
  setle  %r9b
  cmp    %r13,%r8
  setge  %r13b
  or     %r13d,%r9d
  and    %r9d,%edi
  cmp    %rbp,%rdx
  setae  %r9b
  test   %r9b,%dil
  je     L197
  cmp    %rbp,%rsi
  jb     L197
  lea    -0x1(%r12),%edi
  mov    $0x1,%eax
  shr    %edi
  add    $0x1,%edi
  test   %r12d,%r12d
  cmovle %eax,%edi
  cmp    $0x6,%r12d
  jle    L49
  mov    %edi,%r9d
  xor    %eax,%eax
  shr    $0x2,%r9d
  shl    $0x5,%r9
  nopl   0x0(%rax)
L44:
  movups (%rbx,%rax,1),%xmm4
  movups 0x10(%rbx,%rax,1),%xmm5
  movups (%rcx,%rax,1),%xmm3
  movups 0x10(%rdx,%rax,1),%xmm7
  movaps %xmm4,%xmm0
  shufps $0xdd,%xmm5,%xmm4
  shufps $0x88,%xmm5,%xmm0
  movups 0x10(%rcx,%rax,1),%xmm5
  movaps %xmm3,%xmm6
  shufps $0x88,%xmm5,%xmm6
  movaps %xmm6,%xmm1
  shufps $0xdd,%xmm5,%xmm3
  movaps %xmm0,%xmm5
  addps  %xmm0,%xmm1
  movups (%rdx,%rax,1),%xmm0
  movaps %xmm3,%xmm2
  subps  %xmm6,%xmm5
  addps  %xmm4,%xmm2
  subps  %xmm3,%xmm4
  movups (%rsi,%rax,1),%xmm3
  movaps %xmm0,%xmm6
  shufps $0xdd,%xmm7,%xmm0
  shufps $0x88,%xmm7,%xmm6
  movups 0x10(%rsi,%rax,1),%xmm7
  movaps %xmm3,%xmm9
  movaps %xmm6,%xmm8
  shufps $0x88,%xmm7,%xmm9
  shufps $0xdd,%xmm7,%xmm3
  movaps %xmm0,%xmm7
  subps  %xmm3,%xmm0
  addps  %xmm9,%xmm8
  addps  %xmm3,%xmm7
  movaps %xmm1,%xmm3
  subps  %xmm9,%xmm6
  movaps %xmm2,%xmm9
  addps  %xmm8,%xmm3
  addps  %xmm7,%xmm9
  subps  %xmm7,%xmm2
  subps  %xmm8,%xmm1
  movaps %xmm3,%xmm10
  unpckhps %xmm9,%xmm3
  movups %xmm3,0x10(%rbx,%rax,1)
  unpcklps %xmm9,%xmm10
  movaps %xmm1,%xmm3
  unpckhps %xmm2,%xmm1
  movups %xmm10,(%rbx,%rax,1)
  unpcklps %xmm2,%xmm3
  movaps %xmm4,%xmm2
  subps  %xmm6,%xmm4
  movups %xmm1,0x10(%rdx,%rax,1)
  movaps %xmm5,%xmm1
  addps  %xmm6,%xmm2
  subps  %xmm0,%xmm1
  addps  %xmm5,%xmm0
  movups %xmm3,(%rdx,%rax,1)
  movaps %xmm1,%xmm3
  unpckhps %xmm2,%xmm1
  unpcklps %xmm2,%xmm3
  movaps %xmm0,%xmm2
  unpckhps %xmm4,%xmm0
  movups %xmm1,0x10(%rcx,%rax,1)
  unpcklps %xmm4,%xmm2
  movups %xmm3,(%rcx,%rax,1)
  movups %xmm2,(%rsi,%rax,1)
  movups %xmm0,0x10(%rsi,%rax,1)
  add    $0x20,%rax
  cmp    %rax,%r9
  jne    L44
  mov    %edi,%eax
  and    $0xfffffffc,%eax
  test   $0x3,%dil
  je     L5
L165:
  lea    (%r10,%rax,2),%rdx
  lea    0x0(,%rax,8),%rsi
  add    %rax,%r10
  sub    %eax,%edi
  lea    (%rbx,%rdx,4),%rdx
  lea    (%rbx,%rsi,1),%rcx
  add    %rsi,%r8
  movq   (%rdx),%xmm1
  movq   (%rcx),%xmm0
  lea    (%rbx,%r10,8),%rax
  add    %rbx,%r8
  movq   (%r8),%xmm5
  movaps %xmm1,%xmm3
  addps  %xmm0,%xmm3
  subps  %xmm1,%xmm0
  movq   (%rax),%xmm1
  movaps %xmm1,%xmm4
  addps  %xmm5,%xmm1
  subps  %xmm5,%xmm4
  movaps %xmm0,%xmm2
  shufps $0xe1,%xmm4,%xmm4
  addps  %xmm4,%xmm0
  subps  %xmm4,%xmm2
  movaps %xmm3,%xmm4
  addps  %xmm1,%xmm4
  subps  %xmm1,%xmm3
  movaps %xmm0,%xmm1
  movss  %xmm2,%xmm1
  movss  %xmm0,%xmm2
  movlps %xmm4,(%rcx)
  movlps %xmm3,(%rax)
  movlps %xmm1,(%rdx)
  movlps %xmm2,(%r8)
  cmp    $0x1,%edi
  je     L5
  movq   0x8(%rcx),%xmm0
  movq   0x8(%rdx),%xmm1
  movq   0x8(%rax),%xmm5
  movaps %xmm0,%xmm2
  movaps %xmm1,%xmm4
  subps  %xmm1,%xmm2
  movq   0x8(%r8),%xmm1
  addps  %xmm0,%xmm4
  movaps %xmm5,%xmm0
  subps  %xmm1,%xmm0
  addps  %xmm5,%xmm1
  movaps %xmm2,%xmm3
  shufps $0xe1,%xmm0,%xmm0
  subps  %xmm0,%xmm3
  addps  %xmm2,%xmm0
  movaps %xmm1,%xmm2
  addps  %xmm4,%xmm2
  subps  %xmm1,%xmm4
  movaps %xmm0,%xmm1
  movss  %xmm3,%xmm1
  movss  %xmm0,%xmm3
  movlps %xmm2,0x8(%rcx)
  movlps %xmm4,0x8(%rax)
  movlps %xmm1,0x8(%rdx)
  movlps %xmm3,0x8(%r8)
  cmp    $0x2,%edi
  je     L5
  movq   0x10(%rcx),%xmm0
  movq   0x10(%rdx),%xmm1
  movq   0x10(%r8),%xmm5
  movaps %xmm0,%xmm3
  subps  %xmm1,%xmm0
  addps  %xmm1,%xmm3
  movq   0x10(%rax),%xmm1
  movaps %xmm1,%xmm4
  addps  %xmm5,%xmm1
  movaps %xmm0,%xmm2
  subps  %xmm5,%xmm4
  shufps $0xe1,%xmm4,%xmm4
  addps  %xmm4,%xmm0
  subps  %xmm4,%xmm2
  movaps %xmm3,%xmm4
  addps  %xmm1,%xmm4
  subps  %xmm1,%xmm3
  movaps %xmm0,%xmm1
  movss  %xmm2,%xmm1
  movss  %xmm0,%xmm2
  movlps %xmm4,0x10(%rcx)
  movlps %xmm3,0x10(%rax)
  movlps %xmm1,0x10(%rdx)
  movlps %xmm2,0x10(%r8)
  jmp    L5
L57:
  mov    $0x8,%r12d
  jne    L124
  jmp    L93
L49:
  xor    %eax,%eax
  jmp    L165
```

assistant: ```c
void cftfsub(int n, float *a, float *w) {
  int j, j1, j2, j3, l;
  float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
  l = 2;
  if (n > 8) {
    cft1st(n, a, w);
    l = 8;
    while ((l << 2) < n) {
      cftmdl(n, l, a, w);
      l <<= 2;
    }
  }
  if ((l << 2) == n) {
    for (j = 0; j < l; j += 2) {
      j1 = j + l;
      j2 = j1 + l;
      j3 = j2 + l;
      x0r = a[j] + a[j1];
      x0i = a[j + 1] + a[j1 + 1];
      x1r = a[j] - a[j1];
      x1i = a[j + 1] - a[j1 + 1];
      x2r = a[j2] + a[j3];
      x2i = a[j2 + 1] + a[j3 + 1];
      x3r = a[j2] - a[j3];
      x3i = a[j2 + 1] - a[j3 + 1];
      a[j] = x0r + x2r;
      a[j + 1] = x0i + x2i;
      a[j2] = x0r - x2r;
      a[j2 + 1] = x0i - x2i;
      a[j1] = x1r - x3i;
      a[j1 + 1] = x1i + x3r;
      a[j3] = x1r + x3i;
      a[j3 + 1] = x1i - x3r;
    }
  } else {
    for (j = 0; j < l; j += 2) {
      j1 = j + l;
      x0r = a[j] - a[j1];
      x0i = a[j + 1] - a[j1 + 1];
      a[j] += a[j1];
      a[j + 1] += a[j1 + 1];
      a[j1] = x0r;
      a[j1 + 1] = x0i;
    }
  }
}
```