user: 请从给定的汇编指令推导出C源代码：

```asm
<quat_slerp>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %rsi,-0x50(%rbp)
  movss  %xmm0,-0x54(%rbp)
  mov    -0x48(%rbp),%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x18(%rbp)
  mov    -0x48(%rbp),%rax
  movss  0x4(%rax),%xmm0
  movss  %xmm0,-0x14(%rbp)
  mov    -0x48(%rbp),%rax
  movss  0x8(%rax),%xmm0
  movss  %xmm0,-0x10(%rbp)
  mov    -0x48(%rbp),%rax
  movss  0xc(%rax),%xmm0
  movss  %xmm0,-0xc(%rbp)
  mov    -0x50(%rbp),%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x34(%rbp)
  mov    -0x50(%rbp),%rax
  movss  0x4(%rax),%xmm0
  movss  %xmm0,-0x30(%rbp)
  mov    -0x50(%rbp),%rax
  movss  0x8(%rax),%xmm0
  movss  %xmm0,-0x2c(%rbp)
  mov    -0x50(%rbp),%rax
  movss  0xc(%rax),%xmm0
  movss  %xmm0,-0x28(%rbp)
  movss  -0x18(%rbp),%xmm0
  movaps %xmm0,%xmm1
  mulss  -0x34(%rbp),%xmm1
  movss  -0x14(%rbp),%xmm0
  mulss  -0x30(%rbp),%xmm0
  addss  %xmm0,%xmm1
  movss  -0x10(%rbp),%xmm0
  mulss  -0x2c(%rbp),%xmm0
  addss  %xmm0,%xmm1
  movss  -0xc(%rbp),%xmm0
  mulss  -0x28(%rbp),%xmm0
  addss  %xmm1,%xmm0
  movss  %xmm0,-0x24(%rbp)
  pxor   %xmm0,%xmm0
  comiss -0x24(%rbp),%xmm0
  jbe    L11
  movss  -0x24(%rbp),%xmm0
  movss  D66(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  %xmm0,-0x24(%rbp)
  movss  -0x34(%rbp),%xmm0
  movss  D66(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  %xmm0,-0x34(%rbp)
  movss  -0x30(%rbp),%xmm0
  movss  D66(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  %xmm0,-0x30(%rbp)
  movss  -0x2c(%rbp),%xmm0
  movss  D66(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  %xmm0,-0x2c(%rbp)
  movss  -0x28(%rbp),%xmm0
  movss  D66(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  %xmm0,-0x28(%rbp)
L11:
  pxor   %xmm1,%xmm1
  cvtss2sd -0x24(%rbp),%xmm1
  movsd  D46(%rip),%xmm0
  subsd  %xmm1,%xmm0
  comisd D63(%rip),%xmm0
  jbe    L22
  mov    -0x24(%rbp),%eax
  movd   %eax,%xmm0
  call   <acosf@plt>
  movd   %xmm0,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  movd   %eax,%xmm0
  call   <sinf@plt>
  movd   %xmm0,%eax
  mov    %eax,-0x4(%rbp)
  pxor   %xmm2,%xmm2
  cvtss2sd -0x54(%rbp),%xmm2
  movsd  D46(%rip),%xmm0
  movapd %xmm0,%xmm1
  subsd  %xmm2,%xmm1
  pxor   %xmm0,%xmm0
  cvtss2sd -0x8(%rbp),%xmm0
  mulsd  %xmm1,%xmm0
  pxor   %xmm3,%xmm3
  cvtsd2ss %xmm0,%xmm3
  movd   %xmm3,%eax
  movd   %eax,%xmm0
  call   <sinf@plt>
  movd   %xmm0,%eax
  movd   %eax,%xmm0
  divss  -0x4(%rbp),%xmm0
  movss  %xmm0,-0x20(%rbp)
  movss  -0x54(%rbp),%xmm0
  mulss  -0x8(%rbp),%xmm0
  movd   %xmm0,%eax
  movd   %eax,%xmm0
  call   <sinf@plt>
  movd   %xmm0,%eax
  movd   %eax,%xmm0
  divss  -0x4(%rbp),%xmm0
  movss  %xmm0,-0x1c(%rbp)
  jmp    L18
L22:
  movss  D26(%rip),%xmm0
  subss  -0x54(%rbp),%xmm0
  movss  %xmm0,-0x20(%rbp)
  movss  -0x54(%rbp),%xmm0
  movss  %xmm0,-0x1c(%rbp)
L18:
  movss  -0x20(%rbp),%xmm0
  movaps %xmm0,%xmm1
  mulss  -0x18(%rbp),%xmm1
  movss  -0x1c(%rbp),%xmm0
  mulss  -0x34(%rbp),%xmm0
  addss  %xmm1,%xmm0
  mov    -0x48(%rbp),%rax
  movss  %xmm0,(%rax)
  movss  -0x20(%rbp),%xmm0
  movaps %xmm0,%xmm1
  mulss  -0x14(%rbp),%xmm1
  movss  -0x1c(%rbp),%xmm0
  mulss  -0x30(%rbp),%xmm0
  mov    -0x48(%rbp),%rax
  add    $0x4,%rax
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  movss  -0x20(%rbp),%xmm0
  movaps %xmm0,%xmm1
  mulss  -0x10(%rbp),%xmm1
  movss  -0x1c(%rbp),%xmm0
  mulss  -0x2c(%rbp),%xmm0
  mov    -0x48(%rbp),%rax
  add    $0x8,%rax
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  movss  -0x20(%rbp),%xmm0
  movaps %xmm0,%xmm1
  mulss  -0xc(%rbp),%xmm1
  movss  -0x1c(%rbp),%xmm0
  mulss  -0x28(%rbp),%xmm0
  mov    -0x48(%rbp),%rax
  add    $0xc,%rax
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  nop
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: label: D66
type_infered: byte[4]
name: retrieve_data
arguments: label: D46
type_infered: f64
name: retrieve_data
arguments: label: D63
type_infered: f64
name: retrieve_data
arguments: label: D26
type_infered: byte[4]

tool: {"D66": [0x00,0x00,0x00,0x80]}

tool: D46: 1

tool: D63: 1e-06

tool: {"D26": [0x00,0x00,0x80,0x3f]}

assistant: ```c
void quat_slerp(float *dst, float *b, float t) {
  float ax = dst[0], ay = dst[1], az = dst[2], aw = dst[3];
  float bx = b[0], by = b[1], bz = b[2], bw = b[3];
  float omega, cosom, sinom, scale0, scale1;
  cosom = ax * bx + ay * by + az * bz + aw * bw;
  if (cosom < 0.0) {
    cosom = -cosom;
    bx = -bx;
    by = -by;
    bz = -bz;
    bw = -bw;
  }
  if ((1.0 - cosom) > 0.000001) {
    omega = acosf(cosom);
    sinom = sinf(omega);
    scale0 = sinf((1.0 - t) * omega) / sinom;
    scale1 = sinf(t * omega) / sinom;
  } else {
    scale0 = 1.0 - t;
    scale1 = t;
  }
  dst[0] = scale0 * ax + scale1 * bx;
  dst[1] = scale0 * ay + scale1 * by;
  dst[2] = scale0 * az + scale1 * bz;
  dst[3] = scale0 * aw + scale1 * bw;
}
```