user: 请将以下的汇编代码转换成C语言代码：

```asm
<quat_slerp>:
  endbr64
  push   %rbx
  movaps %xmm0,%xmm1
  mov    %rdi,%rbx
  sub    $0x30,%rsp
  movups (%rsi),%xmm2
  movups (%rdi),%xmm3
  movaps D3(%rip),%xmm5
  movaps %xmm2,%xmm0
  movaps %xmm2,%xmm4
  movaps %xmm3,%xmm6
  shufps $0x55,%xmm3,%xmm6
  mulss  %xmm3,%xmm0
  shufps $0x55,%xmm2,%xmm4
  xorps  %xmm2,%xmm5
  mulss  %xmm6,%xmm4
  movaps %xmm3,%xmm6
  unpckhps %xmm3,%xmm6
  addss  %xmm4,%xmm0
  movaps %xmm2,%xmm4
  unpckhps %xmm2,%xmm4
  mulss  %xmm6,%xmm4
  movaps %xmm3,%xmm6
  shufps $0xff,%xmm3,%xmm6
  addss  %xmm4,%xmm0
  movaps %xmm2,%xmm4
  shufps $0xff,%xmm2,%xmm4
  mulss  %xmm6,%xmm4
  addss  %xmm4,%xmm0
  pxor   %xmm4,%xmm4
  comiss %xmm0,%xmm4
  jbe    L27
  xorps  D58(%rip),%xmm0
  movaps %xmm5,%xmm2
L27:
  movsd  D53(%rip),%xmm5
  pxor   %xmm4,%xmm4
  cvtss2sd %xmm0,%xmm4
  subsd  %xmm4,%xmm5
  comisd D19(%rip),%xmm5
  ja     L14
  movss  D56(%rip),%xmm0
  subss  %xmm1,%xmm0
  movaps %xmm0,%xmm4
L23:
  movaps %xmm4,%xmm0
  shufps $0x0,%xmm1,%xmm1
  shufps $0x0,%xmm0,%xmm0
  mulps  %xmm2,%xmm1
  mulps  %xmm3,%xmm0
  addps  %xmm0,%xmm1
  movups %xmm1,(%rbx)
  add    $0x30,%rsp
  pop    %rbx
  ret
  nopl   0x0(%rax,%rax,1)
L14:
  movaps %xmm3,0x20(%rsp)
  movaps %xmm2,0x10(%rsp)
  movss  %xmm1,0x8(%rsp)
  call   <acosf@plt>
  movss  %xmm0,0x4(%rsp)
  call   <sinf@plt>
  movss  0x8(%rsp),%xmm1
  movsd  D53(%rip),%xmm4
  movss  %xmm0,(%rsp)
  pxor   %xmm0,%xmm0
  movss  0x4(%rsp),%xmm5
  cvtss2sd %xmm1,%xmm0
  subsd  %xmm0,%xmm4
  pxor   %xmm0,%xmm0
  movss  %xmm1,0xc(%rsp)
  cvtss2sd %xmm5,%xmm0
  movss  %xmm5,0x8(%rsp)
  mulsd  %xmm4,%xmm0
  cvtsd2ss %xmm0,%xmm0
  call   <sinf@plt>
  movss  0x8(%rsp),%xmm5
  movss  0xc(%rsp),%xmm1
  movaps %xmm0,%xmm4
  divss  (%rsp),%xmm4
  movss  %xmm4,0x4(%rsp)
  mulss  %xmm5,%xmm1
  movaps %xmm1,%xmm0
  call   <sinf@plt>
  movss  0x4(%rsp),%xmm4
  movaps 0x10(%rsp),%xmm2
  movaps %xmm0,%xmm1
  movaps 0x20(%rsp),%xmm3
  divss  (%rsp),%xmm1
  jmp    L23
```

tool_calls: name: disassemble_data
arguments: data_label: D3
type_guessed: byte[16]
name: disassemble_data
arguments: data_label: D58
type_guessed: byte[16]
name: disassemble_data
arguments: data_label: D53
type_guessed: f64
name: disassemble_data
arguments: data_label: D19
type_guessed: f64
name: disassemble_data
arguments: data_label: D56
type_guessed: byte[4]

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

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

tool: D53: 1

tool: D19: 1e-06

tool: {"D56": [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;
}
```