user: What would the C source look like for the assembly code provided here:

```asm
<dft_cmp_double>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %edi,-0x14(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %ecx,-0x18(%rbp)
  movsd  %xmm0,-0x30(%rbp)
  mov    %r8d,-0x34(%rbp)
  cmpq   $0x0,-0x20(%rbp)
  je     L36
  cmpq   $0x0,-0x28(%rbp)
  jne    L39
L36:
  mov    -0x14(%rbp),%eax
  mov    %eax,%esi
  lea    D25(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movsd  D63(%rip),%xmm0
  jmp    L18
L39:
  cmpl   $0x2000,-0x18(%rbp)
  je     L73
  mov    -0x14(%rbp),%eax
  mov    %eax,%esi
  lea    D91(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movsd  D63(%rip),%xmm0
  jmp    L18
L73:
  mov    -0x20(%rbp),%rax
  lea    D101(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <dft_magnitude@plt>
  mov    -0x28(%rbp),%rax
  lea    D81(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <dft_magnitude@plt>
  lea    D81(%rip),%rax
  mov    %rax,%rsi
  lea    D101(%rip),%rax
  mov    %rax,%rdi
  call   <calc_max_spectral_difference@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x8(%rbp)
  movsd  -0x8(%rbp),%xmm0
  comisd -0x30(%rbp),%xmm0
  jbe    L68
  movsd  -0x30(%rbp),%xmm0
  mov    -0x8(%rbp),%rdx
  mov    -0x14(%rbp),%eax
  movapd %xmm0,%xmm1
  movq   %rdx,%xmm0
  mov    %eax,%esi
  lea    D88(%rip),%rax
  mov    %rax,%rdi
  mov    $0x2,%eax
  call   <printf@plt>
  mov    -0x18(%rbp),%edx
  mov    -0x28(%rbp),%rcx
  mov    -0x20(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <oct_save_double@plt>
  cmpl   $0x0,-0x34(%rbp)
  je     L68
  mov    $0x1,%edi
  call   <exit@plt>
L68:
  movsd  D5(%rip),%xmm0
  comisd -0x8(%rbp),%xmm0
  jbe    L79
  movsd  D5(%rip),%xmm0
  movsd  %xmm0,-0x8(%rbp)
L79:
  movsd  -0x8(%rbp),%xmm0
L18:
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  leave
  ret
```

tool_calls: name: read_data
arguments: data_tag: D25
type_guessed: string
name: read_data
arguments: data_tag: D63
type_guessed: byte[8]
name: read_data
arguments: data_tag: D91
type_guessed: string
name: read_data
arguments: data_tag: D88
type_guessed: string
name: read_data
arguments: data_tag: D5
type_guessed: byte[8]

tool: D25: Error (line %d) : dft_cmp_double : Bad input arrays.


tool: {"D63": [0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f]}

tool: D91: Error (line %d) : dft_cmp_double : Bad input array length.


tool: D88: 

Line %d: Actual SNR (% 4.1f) > target SNR (% 4.1f).



tool: {"D5": [0x00,0x00,0x00,0x00,0x00,0x40,0x7f,0xc0]}

assistant: ```c
double dft_cmp_double(int linenum, const double *orig, const double *test, int len, double target_snr, int allow_exit) {
  static double orig_spec[((8192) / 2)];
  static double test_spec[((8192) / 2)];
  double snr;
  if (!orig || !test) {
    printf("Error (line %d) : dft_cmp_double : Bad input arrays.\n", linenum);
    return 1;
  };
  if (len != (8192)) {
    printf("Error (line %d) : dft_cmp_double : Bad input array length.\n", linenum);
    return 1;
  };
  dft_magnitude(orig, orig_spec);
  dft_magnitude(test, test_spec);
  snr = calc_max_spectral_difference(orig_spec, test_spec);
  if (snr > target_snr) {
    printf("\n\nLine %d: Actual SNR (% 4.1f) > target SNR (% 4.1f).\n\n", linenum, snr, target_snr);
    oct_save_double(orig, test, len);
    if (allow_exit)
      exit(1);
  };
  if (snr < -500.0)
    snr = -500.0;
  return snr;
}
```