user: Translate the below assembly code into C programming language:

```asm
<lib3ds_quat_slerp>:
  endbr64
  push   %r14
  movaps %xmm0,%xmm2
  pxor   %xmm3,%xmm3
  push   %r12
  mov    %rdx,%r12
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x28,%rsp
  movss  (%rsi),%xmm0
  movss  0x4(%rsi),%xmm1
  mulss  (%rdx),%xmm0
  mulss  0x4(%rdx),%xmm1
  addss  %xmm1,%xmm0
  movss  0x8(%rsi),%xmm1
  mulss  0x8(%rdx),%xmm1
  addss  %xmm1,%xmm0
  movss  0xc(%rsi),%xmm1
  mulss  0xc(%rdx),%xmm1
  addss  %xmm1,%xmm0
  pxor   %xmm1,%xmm1
  comiss %xmm0,%xmm1
  cvtss2sd %xmm0,%xmm3
  ja     L54
  movss  D7(%rip),%xmm1
  movd   %xmm1,%r14d
L25:
  movapd %xmm3,%xmm0
  movss  %xmm1,0x14(%rsp)
  movss  %xmm2,0x8(%rsp)
  call   <acos@plt>
  movsd  %xmm0,(%rsp)
  cvtsd2ss %xmm0,%xmm0
  call   <sin@plt>
  movsd  %xmm0,0x18(%rsp)
  call   <fabs@plt>
  movss  0x8(%rsp),%xmm2
  movss  0x14(%rsp),%xmm1
  test   %eax,%eax
  subss  %xmm2,%xmm1
  jg     L46
  cvtss2sd %xmm1,%xmm1
  cvtss2sd %xmm2,%xmm2
L59:
  lea    0x4(%r12),%rdx
  movd   %r14d,%xmm5
  pxor   %xmm0,%xmm0
  mov    %rbx,%rax
  sub    %rdx,%rax
  cvtss2sd %xmm5,%xmm0
  mulsd  %xmm2,%xmm0
  cmp    $0x8,%rax
  jbe    L12
  lea    0x4(%rbp),%rdx
  mov    %rbx,%rax
  sub    %rdx,%rax
  cmp    $0x8,%rax
  jbe    L12
  movups (%r12),%xmm5
  movapd %xmm0,%xmm4
  movups 0x0(%rbp),%xmm0
  unpcklpd %xmm1,%xmm1
  unpcklpd %xmm4,%xmm4
  cvtps2pd %xmm0,%xmm3
  cvtps2pd %xmm5,%xmm2
  mulpd  %xmm1,%xmm3
  mulpd  %xmm4,%xmm2
  addpd  %xmm2,%xmm3
  pxor   %xmm2,%xmm2
  movhlps %xmm0,%xmm2
  cvtps2pd %xmm2,%xmm0
  mulpd  %xmm1,%xmm0
  pxor   %xmm1,%xmm1
  movhlps %xmm5,%xmm1
  cvtps2pd %xmm1,%xmm1
  mulpd  %xmm4,%xmm1
  addpd  %xmm1,%xmm0
  cvtpd2ps %xmm3,%xmm1
  cvtpd2ps %xmm0,%xmm0
  movlhps %xmm0,%xmm1
  movups %xmm1,(%rbx)
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r14
  ret
  cs nopw 0x0(%rax,%rax,1)
L46:
  pxor   %xmm0,%xmm0
  movss  %xmm2,0x14(%rsp)
  cvtss2sd %xmm1,%xmm0
  mulsd  (%rsp),%xmm0
  cvtsd2ss %xmm0,%xmm0
  call   <sin@plt>
  movss  0x14(%rsp),%xmm2
  movapd %xmm0,%xmm1
  pxor   %xmm0,%xmm0
  divsd  0x18(%rsp),%xmm1
  movsd  %xmm1,0x8(%rsp)
  cvtss2sd %xmm2,%xmm2
  mulsd  (%rsp),%xmm2
  cvtsd2ss %xmm2,%xmm0
  call   <sin@plt>
  movsd  0x8(%rsp),%xmm1
  movapd %xmm0,%xmm2
  divsd  0x18(%rsp),%xmm2
  jmp    L59
  nopl   (%rax)
L54:
  movss  D10(%rip),%xmm6
  xorpd  D23(%rip),%xmm3
  movss  D7(%rip),%xmm1
  movd   %xmm6,%r14d
  jmp    L25
  nopw   0x0(%rax,%rax,1)
L12:
  pxor   %xmm2,%xmm2
  pxor   %xmm3,%xmm3
  cvtss2sd 0x0(%rbp),%xmm2
  cvtss2sd (%r12),%xmm3
  mulsd  %xmm1,%xmm2
  mulsd  %xmm0,%xmm3
  addsd  %xmm3,%xmm2
  pxor   %xmm3,%xmm3
  cvtsd2ss %xmm2,%xmm2
  movss  %xmm2,(%rbx)
  pxor   %xmm2,%xmm2
  cvtss2sd 0x4(%rbp),%xmm2
  cvtss2sd 0x4(%r12),%xmm3
  mulsd  %xmm1,%xmm2
  mulsd  %xmm0,%xmm3
  addsd  %xmm3,%xmm2
  pxor   %xmm3,%xmm3
  cvtsd2ss %xmm2,%xmm2
  movss  %xmm2,0x4(%rbx)
  pxor   %xmm2,%xmm2
  cvtss2sd 0x8(%rbp),%xmm2
  cvtss2sd 0x8(%r12),%xmm3
  mulsd  %xmm1,%xmm2
  mulsd  %xmm0,%xmm3
  addsd  %xmm3,%xmm2
  cvtsd2ss %xmm2,%xmm2
  movss  %xmm2,0x8(%rbx)
  pxor   %xmm2,%xmm2
  cvtss2sd 0xc(%r12),%xmm2
  mulsd  %xmm2,%xmm0
  pxor   %xmm2,%xmm2
  cvtss2sd 0xc(%rbp),%xmm2
  mulsd  %xmm2,%xmm1
  addsd  %xmm1,%xmm0
  cvtsd2ss %xmm0,%xmm0
  movss  %xmm0,0xc(%rbx)
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r14
  ret
```

tool_calls: name: extract_symbolic_data
arguments: label: D7
type: byte[4]
name: extract_symbolic_data
arguments: label: D10
type: byte[4]
name: extract_symbolic_data
arguments: label: D23
type: byte[16]

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

tool: {"D10": [0x00,0x00,0x80,0xbf]}

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

assistant: ```c
void lib3ds_quat_slerp(float c[4], float a[4], float b[4], float t) {
  double l;
  double om, sinom;
  double sp, sq;
  float flip = 1.0f;
  int i;
  l = a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
  if (l < 0) {
    flip = -1.0f;
    l = -l;
  }
  om = acos(l);
  sinom = sin(om);
  if (fabs(sinom) > (1e-5)) {
    sp = sin((1.0f - t) * om) / sinom;
    sq = sin(t * om) / sinom;
  } else {
    sp = 1.0f - t;
    sq = t;
  }
  sq *= flip;
  for (i = 0; i < 4; ++i) {
    c[i] = (float)(sp * a[i] + sq * b[i]);
  }
}
```