user: Demonstrate the C code that generates the assembly output below:

```asm
<quat_slerp>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,%rbx
  movss  %xmm0,0x4(%rsp)
  mov    (%rdi),%ebp
  movss  0x4(%rdi),%xmm7
  movss  %xmm7,0x10(%rsp)
  mov    0x8(%rdi),%r12d
  movss  0xc(%rdi),%xmm5
  movss  %xmm5,0x14(%rsp)
  mov    (%rsi),%r15d
  mov    0x4(%rsi),%r14d
  mov    0x8(%rsi),%r13d
  movss  0xc(%rsi),%xmm6
  movss  %xmm6,0x8(%rsp)
  movd   %ebp,%xmm0
  movd   %r15d,%xmm2
  mulss  %xmm2,%xmm0
  movd   %r14d,%xmm1
  mulss  %xmm7,%xmm1
  addss  %xmm1,%xmm0
  movd   %r12d,%xmm1
  movd   %r13d,%xmm2
  mulss  %xmm2,%xmm1
  addss  %xmm1,%xmm0
  mulss  %xmm6,%xmm5
  addss  %xmm5,%xmm0
  pxor   %xmm1,%xmm1
  comiss %xmm0,%xmm1
  ja     L29
L20:
  pxor   %xmm2,%xmm2
  cvtss2sd %xmm0,%xmm2
  movsd  D20(%rip),%xmm1
  subsd  %xmm2,%xmm1
  comisd D21(%rip),%xmm1
  ja     L28
  movss  D8(%rip),%xmm0
  subss  0x4(%rsp),%xmm0
  movss  %xmm0,0xc(%rsp)
L21:
  movd   %ebp,%xmm0
  movss  0xc(%rsp),%xmm3
  mulss  %xmm3,%xmm0
  movd   %r15d,%xmm1
  movss  0x4(%rsp),%xmm4
  mulss  %xmm4,%xmm1
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rbx)
  movss  0x10(%rsp),%xmm0
  mulss  %xmm3,%xmm0
  movd   %r14d,%xmm1
  mulss  %xmm4,%xmm1
  addss  %xmm1,%xmm0
  movss  %xmm0,0x4(%rbx)
  movd   %r12d,%xmm0
  mulss  %xmm3,%xmm0
  movd   %r13d,%xmm1
  mulss  %xmm4,%xmm1
  addss  %xmm1,%xmm0
  movss  %xmm0,0x8(%rbx)
  mulss  0x14(%rsp),%xmm3
  movaps %xmm3,%xmm0
  movss  0x8(%rsp),%xmm1
  mulss  %xmm4,%xmm1
  addss  %xmm1,%xmm0
  movss  %xmm0,0xc(%rbx)
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L29:
  movss  D4(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movd   %r15d,%xmm5
  xorps  %xmm1,%xmm5
  movd   %xmm5,%r15d
  movd   %r14d,%xmm7
  xorps  %xmm1,%xmm7
  movd   %xmm7,%r14d
  xorps  %xmm1,%xmm2
  movd   %xmm2,%r13d
  xorps  %xmm1,%xmm6
  movss  %xmm6,0x8(%rsp)
  jmp    L20
L28:
  call   <acosf@plt>
  movss  %xmm0,0x18(%rsp)
  call   <sinf@plt>
  movss  %xmm0,0x1c(%rsp)
  pxor   %xmm1,%xmm1
  cvtss2sd 0x4(%rsp),%xmm1
  movsd  D20(%rip),%xmm0
  subsd  %xmm1,%xmm0
  pxor   %xmm1,%xmm1
  cvtss2sd 0x18(%rsp),%xmm1
  mulsd  %xmm1,%xmm0
  cvtsd2ss %xmm0,%xmm0
  call   <sinf@plt>
  movaps %xmm0,%xmm7
  divss  0x1c(%rsp),%xmm7
  movss  %xmm7,0xc(%rsp)
  movss  0x4(%rsp),%xmm0
  mulss  0x18(%rsp),%xmm0
  call   <sinf@plt>
  divss  0x1c(%rsp),%xmm0
  movss  %xmm0,0x4(%rsp)
  jmp    L21
```

tool_calls: name: retrieve_data
arguments: label: D20
type_infered: f64
name: retrieve_data
arguments: label: D21
type_infered: f64
name: retrieve_data
arguments: label: D8
type_infered: byte[4]
name: retrieve_data
arguments: label: D4
type_infered: byte[4]

tool: D20: 1

tool: D21: 1e-06

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

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

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;
}
```