user: 下面的汇编指令对应的C源代码是什么：

```asm
<spline>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %rdi,%r14
  mov    %rsi,%rbp
  mov    %edx,%r13d
  movsd  %xmm0,0x8(%rsp)
  movq   %xmm1,%r12
  mov    %rcx,%rbx
  lea    -0x1(%rdx),%r15d
  mov    %r15d,%esi
  mov    $0x1,%edi
  mov    $0x0,%eax
  call   <vector@plt>
  mov    %rax,%rdi
  movsd  0x8(%rsp),%xmm4
  comisd D81(%rip),%xmm4
  jbe    L24
  movq   $0x0,0x8(%rax)
  movq   $0x0,0x8(%rbx)
L69:
  lea    0x8(%r14),%rdx
  mov    %r13d,%ecx
  mov    $0x2,%eax
  cmp    $0x2,%r13d
  jle    L44
  movsd  D63(%rip),%xmm6
  movsd  D70(%rip),%xmm5
  movsd  D50(%rip),%xmm4
L67:
  movsd  (%rdx),%xmm2
  movsd  0x8(%rdx),%xmm1
  subsd  %xmm2,%xmm1
  movsd  0x10(%rdx),%xmm0
  subsd  %xmm2,%xmm0
  divsd  %xmm0,%xmm1
  movapd %xmm1,%xmm3
  mulsd  -0x8(%rbx,%rax,8),%xmm3
  addsd  %xmm6,%xmm3
  movapd %xmm1,%xmm0
  subsd  %xmm5,%xmm0
  divsd  %xmm3,%xmm0
  movsd  %xmm0,(%rbx,%rax,8)
  movsd  0x0(%rbp,%rax,8),%xmm2
  movsd  0x8(%rdx),%xmm7
  movsd  0x8(%rbp,%rax,8),%xmm0
  subsd  %xmm2,%xmm0
  movsd  0x10(%rdx),%xmm8
  subsd  %xmm7,%xmm8
  divsd  %xmm8,%xmm0
  subsd  -0x8(%rbp,%rax,8),%xmm2
  subsd  (%rdx),%xmm7
  divsd  %xmm7,%xmm2
  subsd  %xmm2,%xmm0
  movsd  %xmm0,(%rdi,%rax,8)
  mulsd  %xmm4,%xmm0
  movsd  0x10(%rdx),%xmm2
  subsd  (%rdx),%xmm2
  divsd  %xmm2,%xmm0
  mulsd  -0x8(%rdi,%rax,8),%xmm1
  subsd  %xmm1,%xmm0
  divsd  %xmm3,%xmm0
  movsd  %xmm0,(%rdi,%rax,8)
  add    $0x1,%rax
  add    $0x8,%rdx
  cmp    %rcx,%rax
  jne    L67
L44:
  movq   %r12,%xmm5
  comisd D81(%rip),%xmm5
  ja     L45
  movslq %r13d,%rax
  movsd  (%r14,%rax,8),%xmm2
  subsd  -0x8(%r14,%rax,8),%xmm2
  movsd  0x0(%rbp,%rax,8),%xmm1
  subsd  -0x8(%rbp,%rax,8),%xmm1
  divsd  %xmm2,%xmm1
  movq   %r12,%xmm0
  subsd  %xmm1,%xmm0
  movsd  D2(%rip),%xmm1
  divsd  %xmm2,%xmm1
  mulsd  %xmm1,%xmm0
  movsd  D55(%rip),%xmm1
L62:
  movslq %r13d,%r13
  movapd %xmm1,%xmm2
  mulsd  -0x8(%rdi,%r13,8),%xmm2
  subsd  %xmm2,%xmm0
  mulsd  -0x8(%rbx,%r13,8),%xmm1
  addsd  D70(%rip),%xmm1
  divsd  %xmm1,%xmm0
  movsd  %xmm0,(%rbx,%r13,8)
  test   %r15d,%r15d
  jle    L79
  movslq %r15d,%rax
L52:
  movsd  (%rbx,%rax,8),%xmm0
  mulsd  0x8(%rbx,%rax,8),%xmm0
  addsd  (%rdi,%rax,8),%xmm0
  movsd  %xmm0,(%rbx,%rax,8)
  sub    $0x1,%rax
  test   %eax,%eax
  jg     L52
L79:
  mov    %r15d,%edx
  mov    $0x1,%esi
  mov    $0x0,%eax
  call   <free_vector@plt>
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L24:
  mov    D23(%rip),%rax
  mov    %rax,0x8(%rbx)
  movsd  0x10(%r14),%xmm1
  subsd  0x8(%r14),%xmm1
  movsd  0x10(%rbp),%xmm0
  subsd  0x8(%rbp),%xmm0
  divsd  %xmm1,%xmm0
  subsd  0x8(%rsp),%xmm0
  movsd  D2(%rip),%xmm2
  divsd  %xmm1,%xmm2
  mulsd  %xmm2,%xmm0
  movsd  %xmm0,0x8(%rdi)
  jmp    L69
L45:
  pxor   %xmm0,%xmm0
  movapd %xmm0,%xmm1
  jmp    L62
```

tool_calls: name: unpack_data
arguments: label: D81
type: f64[2]
name: unpack_data
arguments: label: D63
type: f64
name: unpack_data
arguments: label: D70
type: f64
name: unpack_data
arguments: label: D50
type: f64
name: unpack_data
arguments: label: D2
type: f64
name: unpack_data
arguments: label: D55
type: f64
name: unpack_data
arguments: label: D23
type: f32[2]

tool: {"D81": [9.9e29,-0.5]}

tool: D63: 2

tool: D70: 1

tool: D50: 6

tool: D2: 3

tool: D55: 0.5

tool: {"D23": [0.0,-1.75]}

assistant: ```c
void spline(x, y, n, yp1, ypn, y2) double x[], y[], yp1, ypn, y2[];
int n;
{
  int i, k;
  double p, qn, sig, un, *u, *vector();
  void free_vector();
  u = vector(1, n - 1);
  if (yp1 > 0.99e30)
    y2[1] = u[1] = 0.0;
  else {
    y2[1] = -0.5;
    u[1] = (3.0 / (x[2] - x[1])) * ((y[2] - y[1]) / (x[2] - x[1]) - yp1);
  }
  for (i = 2; i <= n - 1; i++) {
    sig = (x[i] - x[i - 1]) / (x[i + 1] - x[i - 1]);
    p = sig * y2[i - 1] + 2.0;
    y2[i] = (sig - 1.0) / p;
    u[i] = (y[i + 1] - y[i]) / (x[i + 1] - x[i]) - (y[i] - y[i - 1]) / (x[i] - x[i - 1]);
    u[i] = (6.0 * u[i] / (x[i + 1] - x[i - 1]) - sig * u[i - 1]) / p;
  }
  if (ypn > 0.99e30)
    qn = un = 0.0;
  else {
    qn = 0.5;
    un = (3.0 / (x[n] - x[n - 1])) * (ypn - (y[n] - y[n - 1]) / (x[n] - x[n - 1]));
  }
  y2[n] = (un - qn * u[n - 1]) / (qn * y2[n - 1] + 1.0);
  for (k = n - 1; k >= 1; k--)
    y2[k] = y2[k] * y2[k + 1] + u[k];
  free_vector(u, 1, n - 1);
}
```