user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<cinterp>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  movsd  %xmm0,-0x78(%rbp)
  movsd  %xmm1,-0x80(%rbp)
  movsd  %xmm2,-0x88(%rbp)
  movsd  %xmm3,-0x90(%rbp)
  movsd  %xmm4,-0x98(%rbp)
  movsd  %xmm5,-0xa0(%rbp)
  movsd  %xmm6,-0xa8(%rbp)
  mov    %rdi,-0xb0(%rbp)
  mov    %rsi,-0xb8(%rbp)
  movsd  -0x88(%rbp),%xmm0
  subsd  -0x80(%rbp),%xmm0
  movsd  %xmm0,-0x70(%rbp)
  movsd  -0x78(%rbp),%xmm0
  subsd  -0x80(%rbp),%xmm0
  divsd  -0x70(%rbp),%xmm0
  movsd  %xmm0,-0x68(%rbp)
  movsd  -0x90(%rbp),%xmm0
  movsd  %xmm0,-0x60(%rbp)
  movsd  -0x98(%rbp),%xmm0
  mulsd  -0x70(%rbp),%xmm0
  movsd  %xmm0,-0x58(%rbp)
  movsd  -0xa0(%rbp),%xmm0
  movsd  %xmm0,-0x50(%rbp)
  movsd  -0xa8(%rbp),%xmm0
  mulsd  -0x70(%rbp),%xmm0
  movsd  %xmm0,-0x48(%rbp)
  movsd  -0x60(%rbp),%xmm0
  movsd  %xmm0,-0x40(%rbp)
  movsd  -0x58(%rbp),%xmm0
  movsd  %xmm0,-0x38(%rbp)
  movsd  -0x40(%rbp),%xmm0
  movapd %xmm0,%xmm1
  addsd  -0x38(%rbp),%xmm1
  movsd  -0x50(%rbp),%xmm0
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x30(%rbp)
  movsd  -0x48(%rbp),%xmm0
  subsd  -0x38(%rbp),%xmm0
  movsd  %xmm0,-0x28(%rbp)
  movsd  -0x30(%rbp),%xmm1
  movsd  D2(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  subsd  -0x28(%rbp),%xmm0
  movsd  %xmm0,-0x20(%rbp)
  movsd  -0x30(%rbp),%xmm0
  movapd %xmm0,%xmm1
  addsd  %xmm0,%xmm1
  movsd  -0x28(%rbp),%xmm0
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x18(%rbp)
  movsd  -0x18(%rbp),%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm0
  mulsd  -0x68(%rbp),%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm0
  addsd  -0x20(%rbp),%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm0
  mulsd  -0x68(%rbp),%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm0
  addsd  -0x38(%rbp),%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm0
  mulsd  -0x68(%rbp),%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm0
  addsd  -0x40(%rbp),%xmm0
  movsd  %xmm0,-0x10(%rbp)
  mov    -0xb0(%rbp),%rax
  movsd  -0x10(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  movsd  -0x18(%rbp),%xmm1
  movsd  D2(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
  movsd  -0x8(%rbp),%xmm0
  mulsd  -0x68(%rbp),%xmm0
  movsd  %xmm0,-0x8(%rbp)
  movsd  -0x20(%rbp),%xmm0
  addsd  %xmm0,%xmm0
  movsd  -0x8(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
  movsd  -0x8(%rbp),%xmm0
  mulsd  -0x68(%rbp),%xmm0
  movsd  %xmm0,-0x8(%rbp)
  movsd  -0x8(%rbp),%xmm0
  addsd  -0x38(%rbp),%xmm0
  movsd  %xmm0,-0x8(%rbp)
  mov    -0xb0(%rbp),%rax
  movsd  -0x10(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  movsd  -0x8(%rbp),%xmm0
  divsd  -0x70(%rbp),%xmm0
  mov    -0xb8(%rbp),%rax
  movsd  %xmm0,(%rax)
  nop
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: tag: D2
type: byte[8]

tool: {"D2": [0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x40]}

assistant: ```c
void cinterp(double val, double x0, double x1, double f0, double f0p, double f1, double f1p, double *fv, double *fvp) {
  double inc, yval, f, fp, a0, b0, a1, b1, a2, a3;
  double c0, c1, cc0, cc1;
  inc = x1 - x0;
  yval = (val - x0) / inc;
  b0 = f0;
  b1 = f0p * inc;
  c0 = f1;
  c1 = f1p * inc;
  a0 = b0;
  a1 = b1;
  cc0 = c0 - (a0 + a1);
  cc1 = c1 - a1;
  a2 = 3 * cc0 - cc1;
  a3 = cc1 - 2 * cc0;
  f = a3;
  f *= yval;
  f += a2;
  f *= yval;
  f += a1;
  f *= yval;
  f += a0;
  *fv = f;
  fp = 3 * a3;
  fp *= yval;
  fp += 2 * a2;
  fp *= yval;
  fp += a1;
  *fv = f;
  *fvp = fp / inc;
}
```