user: Converte this assembly snippet into its equivalent C code:

```asm
<q_slerp>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,%rbx
  mov    %rsi,%r12
  movaps %xmm0,%xmm5
  movss  %xmm0,0xc(%rsp)
  pxor   %xmm0,%xmm0
  comiss %xmm5,%xmm0
  jae    L6
  mov    %rdx,%rbp
  movss  0xc(%rsp),%xmm6
  comiss D14(%rip),%xmm6
  jae    L2
  mov    (%rsi),%r13d
  mov    (%rdx),%r14d
  movss  0x4(%rsi),%xmm0
  mulss  0x4(%rdx),%xmm0
  movss  0x8(%rsi),%xmm1
  mulss  0x8(%rdx),%xmm1
  addss  %xmm1,%xmm0
  movss  0xc(%rsi),%xmm1
  mulss  0xc(%rdx),%xmm1
  addss  %xmm1,%xmm0
  movd   %r13d,%xmm1
  movd   %r14d,%xmm7
  mulss  %xmm7,%xmm1
  addss  %xmm1,%xmm0
  pxor   %xmm1,%xmm1
  mov    $0x1,%r15d
  comiss %xmm0,%xmm1
  ja     L24
L58:
  movss  D14(%rip),%xmm1
  subss  %xmm0,%xmm1
  cvtss2sd %xmm1,%xmm1
  movsd  D34(%rip),%xmm2
  comisd %xmm1,%xmm2
  jbe    L20
  movss  D14(%rip),%xmm0
  subss  0xc(%rsp),%xmm0
  movss  %xmm0,0x18(%rsp)
L70:
  movd   %r13d,%xmm0
  movss  0x18(%rsp),%xmm3
  mulss  %xmm3,%xmm0
  movd   %r14d,%xmm1
  movss  0xc(%rsp),%xmm4
  mulss  %xmm4,%xmm1
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rbx)
  movaps %xmm3,%xmm0
  mulss  0x4(%r12),%xmm0
  movaps %xmm4,%xmm1
  mulss  0x4(%rbp),%xmm1
  addss  %xmm1,%xmm0
  movss  %xmm0,0x4(%rbx)
  movaps %xmm3,%xmm0
  mulss  0x8(%r12),%xmm0
  movaps %xmm4,%xmm1
  mulss  0x8(%rbp),%xmm1
  addss  %xmm1,%xmm0
  movss  %xmm0,0x8(%rbx)
  mulss  0xc(%r12),%xmm3
  movaps %xmm3,%xmm1
  mulss  0xc(%rbp),%xmm4
  addss  %xmm4,%xmm1
  movss  %xmm1,0xc(%rbx)
  mov    %rbx,%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <q_nrm@plt>
L16:
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L6:
  movss  (%rsi),%xmm0
  movss  %xmm0,(%rdi)
  movss  0x4(%rsi),%xmm0
  movss  %xmm0,0x4(%rdi)
  movss  0x8(%rsi),%xmm0
  movss  %xmm0,0x8(%rdi)
  movss  0xc(%rsi),%xmm0
  movss  %xmm0,0xc(%rdi)
  jmp    L16
L2:
  movss  (%rdx),%xmm0
  movss  %xmm0,(%rdi)
  movss  0x4(%rdx),%xmm0
  movss  %xmm0,0x4(%rdi)
  movss  0x8(%rdx),%xmm0
  movss  %xmm0,0x8(%rdi)
  movss  0xc(%rdx),%xmm0
  movss  %xmm0,0xc(%rdi)
  jmp    L16
L24:
  xorps  D37(%rip),%xmm0
  mov    $0xffffffff,%r15d
  jmp    L58
L20:
  cvtss2sd %xmm0,%xmm0
  call   <acos@plt>
  cvtsd2ss %xmm0,%xmm0
  pxor   %xmm7,%xmm7
  cvtss2sd %xmm0,%xmm7
  movsd  %xmm7,0x10(%rsp)
  movapd %xmm7,%xmm0
  call   <sin@plt>
  pxor   %xmm2,%xmm2
  cvtsd2ss %xmm0,%xmm2
  movss  %xmm2,0x1c(%rsp)
  movss  D14(%rip),%xmm0
  subss  0xc(%rsp),%xmm0
  cvtss2sd %xmm0,%xmm0
  mulsd  0x10(%rsp),%xmm0
  call   <sin@plt>
  cvtsd2ss %xmm0,%xmm0
  divss  0x1c(%rsp),%xmm0
  movss  %xmm0,0x18(%rsp)
  pxor   %xmm0,%xmm0
  cvtss2sd 0xc(%rsp),%xmm0
  mulsd  0x10(%rsp),%xmm0
  call   <sin@plt>
  cvtsd2ss %xmm0,%xmm0
  divss  0x1c(%rsp),%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2ss %r15d,%xmm1
  mulss  %xmm1,%xmm0
  movss  %xmm0,0xc(%rsp)
  jmp    L70
```

tool_calls: name: parse_data
arguments: label: D14
type_infered: byte[4]
name: parse_data
arguments: label: D34
type_infered: byte[8]
name: parse_data
arguments: label: D37
type_infered: byte[16]

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

tool: {"D34": [0xf1,0x68,0xe3,0x88,0xb5,0xf8,0xe4,0x3e]}

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

assistant: ```c
void q_slerp(float q[4], const float a[4], const float b[4], float t) {
  float c, r, s, u, v;
  int i = +1;
  if (t <= 0.0f) {
    do {
      (q)[0] = (a)[0];
      (q)[1] = (a)[1];
      (q)[2] = (a)[2];
      (q)[3] = (a)[3];
    } while (0);
    return;
  }
  if (1.0f <= t) {
    do {
      (q)[0] = (b)[0];
      (q)[1] = (b)[1];
      (q)[2] = (b)[2];
      (q)[3] = (b)[3];
    } while (0);
    return;
  }
  c = ((a)[0] * (b)[0] + (((a) + 1)[0] * ((b) + 1)[0] + ((a) + 1)[1] * ((b) + 1)[1] + ((a) + 1)[2] * ((b) + 1)[2]));
  if (c < 0) {
    c = -c;
    i = -1;
  }
  if (1.0f - c < 1e-5) {
    u = 1.0f - t;
    v = t;
  } else {
    r = ((float)acos((double)c));
    s = ((float)sin((double)r));
    u = ((float)sin((double)(1.0f - t) * r)) / s;
    v = ((float)sin((double)(t)*r)) / s * i;
  }
  q[0] = a[0] * u + b[0] * v;
  q[1] = a[1] * u + b[1] * v;
  q[2] = a[2] * u + b[2] * v;
  q[3] = a[3] * u + b[3] * v;
  q_nrm(q, q);
}
```