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

```asm
<interpolate_product_double>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,%r15
  mov    %rsi,%r14
  mov    %edx,%ebx
  mov    %ecx,0xc(%rsp)
  mov    %r8,%rbp
  mov    %fs:0x28,%rax
  mov    %rax,0x28(%rsp)
  xor    %eax,%eax
  call   <_mm_setzero_pd@plt>
  mov    %rax,%r13
  mov    $0x0,%eax
  call   <_mm_setzero_pd@plt>
  mov    %rax,(%rsp)
  mov    %rbp,%rdi
  call   <_mm_loadu_ps@plt>
  mov    %rax,%rbp
  mov    %rax,%rdi
  call   <_mm_cvtps_pd@plt>
  mov    %rax,0x10(%rsp)
  mov    %rbp,%rsi
  mov    %rbp,%rdi
  call   <_mm_movehl_ps@plt>
  mov    %rax,%rdi
  call   <_mm_cvtps_pd@plt>
  mov    %rax,0x18(%rsp)
  test   %ebx,%ebx
  je     L15
  mov    %r15,%r12
  sub    $0x1,%ebx
  shr    %ebx
  mov    %ebx,%ebx
  lea    0x8(%r15,%rbx,8),%r15
  mov    $0x0,%ebx
L17:
  mov    %ebx,%eax
  lea    (%r14,%rax,4),%rdi
  call   <_mm_loadu_ps@plt>
  mov    %rax,%rbp
  mov    %r12,%rdi
  call   <_mm_load1_ps@plt>
  mov    %eax,%edi
  mov    %rbp,%rsi
  call   <_mm_mul_ps@plt>
  mov    %rax,%rbp
  mov    %rax,%rdi
  call   <_mm_cvtps_pd@plt>
  mov    %rax,%rsi
  mov    %r13,%rdi
  call   <_mm_add_pd@plt>
  mov    %rax,%r13
  mov    %rbp,%rsi
  mov    %rbp,%rdi
  call   <_mm_movehl_ps@plt>
  mov    %rax,%rdi
  call   <_mm_cvtps_pd@plt>
  mov    %rax,%rsi
  mov    (%rsp),%rdi
  call   <_mm_add_pd@plt>
  mov    %rax,(%rsp)
  add    0xc(%rsp),%ebx
  mov    %ebx,%eax
  lea    (%r14,%rax,4),%rdi
  call   <_mm_loadu_ps@plt>
  mov    %rax,%rbp
  lea    0x4(%r12),%rdi
  call   <_mm_load1_ps@plt>
  mov    %eax,%edi
  mov    %rbp,%rsi
  call   <_mm_mul_ps@plt>
  mov    %rax,%rbp
  mov    %rax,%rdi
  call   <_mm_cvtps_pd@plt>
  mov    %rax,%rsi
  mov    %r13,%rdi
  call   <_mm_add_pd@plt>
  mov    %rax,%r13
  mov    %rbp,%rsi
  mov    %rbp,%rdi
  call   <_mm_movehl_ps@plt>
  mov    %rax,%rdi
  call   <_mm_cvtps_pd@plt>
  mov    %rax,%rsi
  mov    (%rsp),%rdi
  call   <_mm_add_pd@plt>
  mov    %rax,(%rsp)
  add    0xc(%rsp),%ebx
  add    $0x8,%r12
  cmp    %r15,%r12
  jne    L17
L15:
  mov    %r13,%rsi
  mov    0x10(%rsp),%rdi
  call   <_mm_mul_pd@plt>
  mov    %rax,%rbx
  mov    (%rsp),%rsi
  mov    0x18(%rsp),%rdi
  call   <_mm_mul_pd@plt>
  mov    %rax,%rsi
  mov    %rbx,%rdi
  call   <_mm_add_pd@plt>
  mov    %rax,%rbx
  mov    %rax,%rsi
  mov    %rax,%rdi
  call   <_mm_movehl_ps@plt>
  mov    %rax,%rsi
  mov    %rbx,%rdi
  call   <_mm_add_sd@plt>
  mov    %rax,%rsi
  lea    0x20(%rsp),%rdi
  call   <_mm_store_sd@plt>
  movsd  0x20(%rsp),%xmm0
  mov    0x28(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L13
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L13:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
double interpolate_product_double(const float *a, const float *b, unsigned int len, const unsigned int oversample, float *frac) {
  int i;
  double ret;
  __m128d sum;
  __m128d sum1 = _mm_setzero_pd();
  __m128d sum2 = _mm_setzero_pd();
  __m128 f = _mm_loadu_ps(frac);
  __m128d f1 = _mm_cvtps_pd(f);
  __m128d f2 = _mm_cvtps_pd(_mm_movehl_ps(f, f));
  __m128 t;
  for (i = 0; i < len; i += 2) {
    t = _mm_mul_ps(_mm_load1_ps(a + i), _mm_loadu_ps(b + i * oversample));
    sum1 = _mm_add_pd(sum1, _mm_cvtps_pd(t));
    sum2 = _mm_add_pd(sum2, _mm_cvtps_pd(_mm_movehl_ps(t, t)));
    t = _mm_mul_ps(_mm_load1_ps(a + i + 1), _mm_loadu_ps(b + (i + 1) * oversample));
    sum1 = _mm_add_pd(sum1, _mm_cvtps_pd(t));
    sum2 = _mm_add_pd(sum2, _mm_cvtps_pd(_mm_movehl_ps(t, t)));
  }
  sum1 = _mm_mul_pd(f1, sum1);
  sum2 = _mm_mul_pd(f2, sum2);
  sum = _mm_add_pd(sum1, sum2);
  sum = _mm_add_sd(sum, (__m128d)_mm_movehl_ps((__m128)sum, (__m128)sum));
  _mm_store_sd(&ret, sum);
  return ret;
}
```