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

```asm
<idwt_complete>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,%r12
  mov    %rsi,%rbp
  mov    %edx,%ebx
  mov    %rcx,0x20(%rsp)
  mov    %r8,0x28(%rsp)
  mov    %r9d,%r15d
  lea    -0x1(%rdx,%rdx,1),%r13d
  lea    0x0(,%r13,8),%r14d
  mov    %r14d,%edi
  call   <malloc@plt>
  mov    %rax,0x8(%rsp)
  mov    %r14d,%edi
  call   <malloc@plt>
  mov    %rax,%r14
  mov    %r13d,%ecx
  mov    0x8(%rsp),%rdx
  mov    %ebx,%esi
  mov    %r12,%rdi
  call   <dyadup_1D_feed_odd@plt>
  mov    %r13d,%ecx
  mov    %r14,0x18(%rsp)
  mov    %r14,%rdx
  mov    %ebx,%esi
  mov    %rbp,%rdi
  call   <dyadup_1D_feed_odd@plt>
  mov    %r15d,0x14(%rsp)
  add    %r13d,%r15d
  lea    -0x1(%r15),%r12d
  lea    0x0(,%r12,8),%r14d
  mov    %r14d,%edi
  call   <malloc@plt>
  mov    %rax,%rbp
  mov    %r14d,%edi
  call   <malloc@plt>
  mov    %rax,%rbx
  mov    0x14(%rsp),%r9d
  mov    0x20(%rsp),%r8
  mov    %r12d,%ecx
  mov    %rbp,%rdx
  mov    %r13d,%esi
  mov    0x8(%rsp),%rdi
  call   <conv@plt>
  mov    0x14(%rsp),%r9d
  mov    0x28(%rsp),%r8
  mov    %r12d,%ecx
  mov    %rbx,%rdx
  mov    %r13d,%esi
  mov    0x18(%rsp),%r13
  mov    %r13,%rdi
  call   <conv@plt>
  mov    0x8(%rsp),%rdi
  call   <free@plt>
  mov    %r13,%rdi
  call   <free@plt>
  mov    %r14d,%edi
  call   <malloc@plt>
  mov    %rax,%r13
  test   %r12d,%r12d
  jle    L16
  lea    -0x2(%r15),%ecx
  mov    $0x0,%eax
L7:
  movsd  0x0(%rbp,%rax,8),%xmm0
  addsd  (%rbx,%rax,8),%xmm0
  movsd  %xmm0,0x0(%r13,%rax,8)
  mov    %rax,%rdx
  add    $0x1,%rax
  cmp    %rcx,%rdx
  jne    L7
L16:
  mov    %rbp,%rdi
  call   <free@plt>
  mov    %rbx,%rdi
  call   <free@plt>
  mov    %r12d,%eax
  sub    0x78(%rsp),%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mulsd  D6(%rip),%xmm0
  addsd  D13(%rip),%xmm0
  cvttsd2si %xmm0,%r8d
  mov    0x78(%rsp),%ecx
  mov    0x70(%rsp),%rdx
  mov    %r12d,%esi
  mov    %r13,%rdi
  call   <wkeep_1D_index@plt>
  mov    %r13,%rdi
  call   <free@plt>
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: parse_data
arguments: data_label: D6
type_infered: byte[8]
name: parse_data
arguments: data_label: D13
type_infered: f64

tool: {"D6": [0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x3f]}

tool: D13: 2

assistant: ```c
void idwt_complete(double *approx, double *detail, int sigInLength, double *lowRe, double *hiRe, int filterLen, double *sigOut, int sigOutLength) {
  int sigInLengthTemp, sigOutLengthTemp, count, ind;
  double *approxTemp, *detailTemp, *approxPre, *detailPre;
  double *sigOutPre;
  sigInLengthTemp = 2 * sigInLength - 1;
  approxTemp = malloc(sigInLengthTemp * sizeof(double));
  detailTemp = malloc(sigInLengthTemp * sizeof(double));
  dyadup_1D_feed_odd(approx, sigInLength, approxTemp, sigInLengthTemp);
  dyadup_1D_feed_odd(detail, sigInLength, detailTemp, sigInLengthTemp);
  sigOutLengthTemp = sigInLengthTemp + filterLen - 1;
  approxPre = malloc(sigOutLengthTemp * sizeof(double));
  detailPre = malloc(sigOutLengthTemp * sizeof(double));
  conv(approxTemp, sigInLengthTemp, approxPre, sigOutLengthTemp, lowRe, filterLen);
  conv(detailTemp, sigInLengthTemp, detailPre, sigOutLengthTemp, hiRe, filterLen);
  free(approxTemp);
  free(detailTemp);
  sigOutPre = malloc(sigOutLengthTemp * sizeof(double));
  for (count = 0; count < sigOutLengthTemp; count++)
    sigOutPre[count] = approxPre[count] + detailPre[count];
  free(approxPre);
  free(detailPre);
  ind = (int)(2 + (sigOutLengthTemp - sigOutLength) / 2.0);
  wkeep_1D_index(sigOutPre, sigOutLengthTemp, sigOut, sigOutLength, ind);
  free(sigOutPre);
  return;
}
```