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

```asm
<ntt32_fft>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %rdx,-0x48(%rbp)
  mov    %rcx,-0x50(%rbp)
  mov    -0x40(%rbp),%rax
  shr    %rax
  mov    %rax,-0x28(%rbp)
  movq   $0x1,-0x30(%rbp)
  jmp    L32
L111:
  mov    -0x30(%rbp),%rax
  cmp    -0x28(%rbp),%rax
  jae    L21
  mov    -0x30(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    -0x30(%rbp),%rdx
  lea    0x0(,%rdx,8),%rcx
  mov    -0x38(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rax),%rax
  mov    %rax,(%rdx)
  mov    -0x28(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rax,%rdx
  mov    -0x8(%rbp),%rax
  mov    %rax,(%rdx)
L21:
  mov    -0x40(%rbp),%rax
  mov    %rax,-0x20(%rbp)
L10:
  shrq   -0x20(%rbp)
  mov    -0x20(%rbp),%rax
  xor    %rax,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  and    -0x20(%rbp),%rax
  test   %rax,%rax
  je     L10
  addq   $0x1,-0x30(%rbp)
L32:
  mov    -0x40(%rbp),%rax
  sub    $0x1,%rax
  cmp    %rax,-0x30(%rbp)
  jb     L111
  movq   $0x1,-0x30(%rbp)
  jmp    L114
L88:
  mov    -0x40(%rbp),%rax
  mov    $0x0,%edx
  divq   -0x30(%rbp)
  mov    %rax,-0x18(%rbp)
  movq   $0x0,-0x20(%rbp)
  jmp    L115
L30:
  mov    -0x20(%rbp),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x20(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    -0x20(%rbp),%rcx
  mov    -0x30(%rbp),%rdx
  add    %rcx,%rdx
  lea    0x0(,%rdx,8),%rcx
  mov    -0x38(%rbp),%rdx
  add    %rcx,%rdx
  sub    -0x8(%rbp),%rax
  mov    %rax,(%rdx)
  mov    -0x20(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rcx
  mov    -0x20(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    -0x8(%rbp),%rdx
  add    %rcx,%rdx
  mov    %rdx,(%rax)
  mov    -0x30(%rbp),%rax
  add    %rax,%rax
  add    %rax,-0x20(%rbp)
L115:
  mov    -0x20(%rbp),%rax
  cmp    -0x40(%rbp),%rax
  jb     L30
  movq   $0x1,-0x28(%rbp)
  jmp    L78
L8:
  mov    -0x28(%rbp),%rax
  imul   -0x18(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  jmp    L36
L53:
  mov    -0x20(%rbp),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    -0x48(%rbp),%rdx
  mov    -0x10(%rbp),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <ntt32_muln@plt>
  mov    %rax,-0x8(%rbp)
  mov    -0x20(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    -0x20(%rbp),%rcx
  mov    -0x30(%rbp),%rdx
  add    %rcx,%rdx
  lea    0x0(,%rdx,8),%rcx
  mov    -0x38(%rbp),%rdx
  add    %rcx,%rdx
  sub    -0x8(%rbp),%rax
  mov    %rax,(%rdx)
  mov    -0x20(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rcx
  mov    -0x20(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    -0x8(%rbp),%rdx
  add    %rcx,%rdx
  mov    %rdx,(%rax)
  mov    -0x30(%rbp),%rax
  add    %rax,%rax
  add    %rax,-0x20(%rbp)
L36:
  mov    -0x20(%rbp),%rax
  cmp    -0x40(%rbp),%rax
  jb     L53
  addq   $0x1,-0x28(%rbp)
L78:
  mov    -0x28(%rbp),%rax
  cmp    -0x30(%rbp),%rax
  jb     L8
  shlq   -0x30(%rbp)
L114:
  mov    -0x30(%rbp),%rax
  cmp    -0x40(%rbp),%rax
  jb     L88
  nop
  nop
  leave
  ret
```

assistant: ```c
void ntt32_fft(int32_t v[], size_t n, int32_t q, const int32_t w[]) {
  size_t i, j, k, l;
  int32_t x, y;
  j = n >> 1;
  for (i = 1; i < n - 1; i++) {
    if (i < j) {
      x = v[i];
      v[i] = v[j];
      v[j] = x;
    }
    k = n;
    do {
      k >>= 1;
      j ^= k;
    } while ((j & k) == 0);
  }
  for (i = 1; i < n; i <<= 1) {
    l = n / i;
    for (k = 0; k < n; k += i + i) {
      x = v[k + i];
      v[k + i] = v[k] - x;
      v[k] = v[k] + x;
    }
    for (j = 1; j < i; j++) {
      y = w[j * l];
      for (k = j; k < n; k += i + i) {
        x = ntt32_muln(v[k + i], y, q);
        v[k + i] = v[k] - x;
        v[k] = v[k] + x;
      }
    }
  }
}
```