user: Converte this assembly snippet into its equivalent C code:

```asm
<fft>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %rdi,%r14
  mov    %rsi,%r13
  mov    %rdx,%rbp
  mov    %rcx,%r12
  mov    %r8,%rcx
  mov    $0x0,%eax
  jmp    L87
L13:
  add    $0x1,%rax
  cmp    $0x40,%rax
  je     L75
L87:
  mov    (%rcx,%rax,4),%edx
  cmp    %eax,%edx
  jle    L13
  movsd  (%r14,%rax,8),%xmm1
  movsd  0x0(%r13,%rax,8),%xmm0
  movslq %edx,%rdx
  movsd  (%r14,%rdx,8),%xmm2
  movsd  %xmm2,(%r14,%rax,8)
  movslq (%rcx,%rax,4),%rdx
  movsd  0x0(%r13,%rdx,8),%xmm2
  movsd  %xmm2,0x0(%r13,%rax,8)
  movslq (%rcx,%rax,4),%rdx
  movsd  %xmm1,(%r14,%rdx,8)
  movslq (%rcx,%rax,4),%rdx
  movsd  %xmm0,0x0(%r13,%rdx,8)
  jmp    L13
L75:
  mov    $0x1,%ebx
  mov    %r14,(%rsp)
  mov    %r13,0x8(%rsp)
  jmp    L2
L8:
  mov    %ecx,%ebx
  add    $0x1,%ebx
L2:
  mov    %ebx,%esi
  mov    $0x2,%edi
  call   <myPow@plt>
  cmp    $0x40,%eax
  jg     L16
  mov    %ebx,%esi
  mov    $0x2,%edi
  call   <myPow@plt>
  mov    %eax,%r14d
  mov    %eax,%r15d
  sar    %r15d
  movslq %eax,%r13
  shl    $0x3,%r13
  mov    (%rsp),%r11
  mov    0x8(%rsp),%r10
  mov    %r15d,%r8d
  shl    $0x6,%r8d
  mov    $0x0,%r9d
  movslq %r15d,%rdi
  mov    %ebx,%ecx
L93:
  test   %r15d,%r15d
  jle    L61
  mov    %r10,%rdx
  mov    %r11,%rax
  mov    $0x0,%esi
L84:
  movsd  (%rax,%rdi,8),%xmm0
  mov    %esi,%ebx
  sar    %cl,%ebx
  movslq %ebx,%rbx
  movsd  0x0(%rbp,%rbx,8),%xmm2
  movsd  (%rdx,%rdi,8),%xmm3
  movsd  (%r12,%rbx,8),%xmm4
  movapd %xmm0,%xmm1
  mulsd  %xmm2,%xmm1
  movapd %xmm3,%xmm5
  mulsd  %xmm4,%xmm5
  subsd  %xmm5,%xmm1
  mulsd  %xmm4,%xmm0
  mulsd  %xmm3,%xmm2
  addsd  %xmm2,%xmm0
  movsd  (%rax),%xmm2
  subsd  %xmm1,%xmm2
  movsd  %xmm2,(%rax,%rdi,8)
  movsd  (%rdx),%xmm2
  subsd  %xmm0,%xmm2
  movsd  %xmm2,(%rdx,%rdi,8)
  addsd  (%rax),%xmm1
  movsd  %xmm1,(%rax)
  addsd  (%rdx),%xmm0
  movsd  %xmm0,(%rdx)
  add    $0x40,%esi
  add    $0x8,%rax
  add    $0x8,%rdx
  cmp    %r8d,%esi
  jne    L84
L61:
  add    %r14d,%r9d
  add    %r13,%r11
  add    %r13,%r10
  cmp    $0x3f,%r9d
  jle    L93
  jmp    L8
L16:
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
void fft(double *dataA, double *dataB, double *wA, double *wB, int *bitRLocations) {
  int loop = 0;
  int innerLoop = 0;
  int butterflySize = 0;
  int butterflySizeHalf = 0;
  int currButterfly = 0;
  int pos1, pos2;
  int tfLocation = 0;
  double swapA;
  double swapB;
  for (loop = 0; loop < 64; loop++) {
    if (bitRLocations[loop] > loop) {
      swapA = dataA[loop];
      swapB = dataB[loop];
      dataA[loop] = dataA[bitRLocations[loop]];
      dataB[loop] = dataB[bitRLocations[loop]];
      dataA[bitRLocations[loop]] = swapA;
      dataB[bitRLocations[loop]] = swapB;
    }
  }
  for (loop = 1; myPow(2, loop) <= 64; loop += 1) {
    butterflySize = myPow(2, loop);
    for (innerLoop = 0; innerLoop < 64; innerLoop += butterflySize) {
      butterflySizeHalf = butterflySize >> 1;
      for (currButterfly = 0; currButterfly < butterflySizeHalf; currButterfly += 1) {
        pos1 = innerLoop + currButterfly;
        pos2 = pos1 + butterflySizeHalf;
        tfLocation = currButterfly * 64 >> loop;
        swapA = dataA[pos2] * wA[tfLocation] - dataB[pos2] * wB[tfLocation];
        swapB = dataA[pos2] * wB[tfLocation] + dataB[pos2] * wA[tfLocation];
        dataA[pos2] = dataA[pos1] - swapA;
        dataB[pos2] = dataB[pos1] - swapB;
        dataA[pos1] = dataA[pos1] + swapA;
        dataB[pos1] = dataB[pos1] + swapB;
      }
    }
  }
}
```