user: Please show me the C implementation that matches the assembly code listed below:

```asm
<interpolate_product_double>:
  endbr64
  push   %r15
  push   %r14
  mov    %edx,%r14d
  push   %r13
  mov    %ecx,%r13d
  push   %r12
  mov    %rsi,%r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x38,%rsp
  mov    %r8,(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x28(%rsp)
  xor    %eax,%eax
  call   <_mm_setzero_pd@plt>
  mov    %rax,%rbp
  xor    %eax,%eax
  call   <_mm_setzero_pd@plt>
  mov    (%rsp),%rdi
  mov    %rax,%r15
  call   <_mm_loadu_ps@plt>
  mov    %rax,%rdi
  mov    %rax,(%rsp)
  call   <_mm_cvtps_pd@plt>
  mov    (%rsp),%rdi
  mov    %rax,0x10(%rsp)
  mov    %rdi,%rsi
  call   <_mm_movehl_ps@plt>
  mov    %rax,%rdi
  call   <_mm_cvtps_pd@plt>
  mov    %rax,0x18(%rsp)
  test   %r14d,%r14d
  je     L24
  sub    $0x1,%r14d
  shr    %r14d
  lea    0x8(%rbx,%r14,8),%rax
  xor    %r14d,%r14d
  mov    %rax,0x8(%rsp)
  nopl   0x0(%rax)
L12:
  mov    %r14d,%eax
  lea    (%r12,%rax,4),%rdi
  call   <_mm_loadu_ps@plt>
  mov    %rbx,%rdi
  mov    %rax,(%rsp)
  call   <_mm_load1_ps@plt>
  mov    (%rsp),%rsi
  mov    %eax,%edi
  call   <_mm_mul_ps@plt>
  mov    %rax,%rdi
  mov    %rax,(%rsp)
  call   <_mm_cvtps_pd@plt>
  mov    %rbp,%rdi
  mov    %rax,%rsi
  call   <_mm_add_pd@plt>
  mov    (%rsp),%r8
  mov    %rax,%rbp
  mov    %r8,%rsi
  mov    %r8,%rdi
  call   <_mm_movehl_ps@plt>
  mov    %rax,%rdi
  call   <_mm_cvtps_pd@plt>
  mov    %r15,%rdi
  mov    %rax,%rsi
  call   <_mm_add_pd@plt>
  mov    %rax,%r15
  lea    (%r14,%r13,1),%eax
  lea    (%r12,%rax,4),%rdi
  mov    %rax,%r14
  call   <_mm_loadu_ps@plt>
  lea    0x4(%rbx),%rdi
  add    %r13d,%r14d
  add    $0x8,%rbx
  mov    %rax,(%rsp)
  call   <_mm_load1_ps@plt>
  mov    (%rsp),%rsi
  mov    %eax,%edi
  call   <_mm_mul_ps@plt>
  mov    %rax,%rdi
  mov    %rax,(%rsp)
  call   <_mm_cvtps_pd@plt>
  mov    %rbp,%rdi
  mov    %rax,%rsi
  call   <_mm_add_pd@plt>
  mov    (%rsp),%r8
  mov    %rax,%rbp
  mov    %r8,%rsi
  mov    %r8,%rdi
  call   <_mm_movehl_ps@plt>
  mov    %rax,%rdi
  call   <_mm_cvtps_pd@plt>
  mov    %r15,%rdi
  mov    %rax,%rsi
  call   <_mm_add_pd@plt>
  mov    %rax,%r15
  cmp    0x8(%rsp),%rbx
  jne    L12
L24:
  mov    0x10(%rsp),%rdi
  mov    %rbp,%rsi
  call   <_mm_mul_pd@plt>
  mov    0x18(%rsp),%rdi
  mov    %r15,%rsi
  mov    %rax,%rbp
  call   <_mm_mul_pd@plt>
  mov    %rbp,%rdi
  mov    %rax,%rsi
  call   <_mm_add_pd@plt>
  mov    %rax,%rsi
  mov    %rax,%rdi
  mov    %rax,%rbp
  call   <_mm_movehl_ps@plt>
  mov    %rbp,%rdi
  mov    %rax,%rsi
  call   <_mm_add_sd@plt>
  lea    0x20(%rsp),%rdi
  mov    %rax,%rsi
  call   <_mm_store_sd@plt>
  movsd  0x20(%rsp),%xmm0
  mov    0x28(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L3
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L3:
  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;
}
```