user: What would the C source look like for the assembly code provided here?

```asm
<lib3ds_matrix_rotate_quat>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xa0,%rsp
  mov    %rdi,-0x98(%rbp)
  mov    %rsi,-0xa0(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0xa0(%rbp),%rax
  movss  (%rax),%xmm1
  mov    -0xa0(%rbp),%rax
  movss  (%rax),%xmm0
  mulss  %xmm0,%xmm1
  mov    -0xa0(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm2
  mov    -0xa0(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  mov    -0xa0(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm2
  mov    -0xa0(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  mov    -0xa0(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm2
  mov    -0xa0(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  movss  %xmm0,-0x84(%rbp)
  mov    -0x84(%rbp),%eax
  movd   %eax,%xmm0
  call   <fabs@plt>
  test   %eax,%eax
  jg     L19
  movss  D50(%rip),%xmm0
  movss  %xmm0,-0x88(%rbp)
  jmp    L15
L19:
  movss  D30(%rip),%xmm0
  divss  -0x84(%rbp),%xmm0
  movss  %xmm0,-0x88(%rbp)
L15:
  mov    -0xa0(%rbp),%rax
  movss  (%rax),%xmm0
  movss  -0x88(%rbp),%xmm1
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x80(%rbp)
  mov    -0xa0(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  movss  -0x88(%rbp),%xmm1
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x7c(%rbp)
  mov    -0xa0(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  movss  -0x88(%rbp),%xmm1
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x78(%rbp)
  mov    -0xa0(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  movss  -0x80(%rbp),%xmm1
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x74(%rbp)
  mov    -0xa0(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  movss  -0x7c(%rbp),%xmm1
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x70(%rbp)
  mov    -0xa0(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  movss  -0x78(%rbp),%xmm1
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x6c(%rbp)
  mov    -0xa0(%rbp),%rax
  movss  (%rax),%xmm0
  movss  -0x80(%rbp),%xmm1
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x68(%rbp)
  mov    -0xa0(%rbp),%rax
  movss  (%rax),%xmm0
  movss  -0x7c(%rbp),%xmm1
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x64(%rbp)
  mov    -0xa0(%rbp),%rax
  movss  (%rax),%xmm0
  movss  -0x78(%rbp),%xmm1
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x60(%rbp)
  mov    -0xa0(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  movss  -0x7c(%rbp),%xmm1
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x5c(%rbp)
  mov    -0xa0(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  movss  -0x78(%rbp),%xmm1
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x58(%rbp)
  mov    -0xa0(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  movss  -0x78(%rbp),%xmm1
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x54(%rbp)
  movss  -0x5c(%rbp),%xmm0
  movaps %xmm0,%xmm1
  addss  -0x54(%rbp),%xmm1
  movss  D50(%rip),%xmm0
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x50(%rbp)
  movss  -0x64(%rbp),%xmm0
  subss  -0x6c(%rbp),%xmm0
  movss  %xmm0,-0x40(%rbp)
  movss  -0x60(%rbp),%xmm0
  addss  -0x70(%rbp),%xmm0
  movss  %xmm0,-0x30(%rbp)
  movss  -0x64(%rbp),%xmm0
  addss  -0x6c(%rbp),%xmm0
  movss  %xmm0,-0x4c(%rbp)
  movss  -0x68(%rbp),%xmm0
  movaps %xmm0,%xmm1
  addss  -0x54(%rbp),%xmm1
  movss  D50(%rip),%xmm0
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x3c(%rbp)
  movss  -0x58(%rbp),%xmm0
  subss  -0x74(%rbp),%xmm0
  movss  %xmm0,-0x2c(%rbp)
  movss  -0x60(%rbp),%xmm0
  subss  -0x70(%rbp),%xmm0
  movss  %xmm0,-0x48(%rbp)
  movss  -0x58(%rbp),%xmm0
  addss  -0x74(%rbp),%xmm0
  movss  %xmm0,-0x38(%rbp)
  movss  -0x68(%rbp),%xmm0
  movaps %xmm0,%xmm1
  addss  -0x5c(%rbp),%xmm1
  movss  D50(%rip),%xmm0
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x28(%rbp)
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0x24(%rbp)
  movss  -0x24(%rbp),%xmm0
  movss  %xmm0,-0x34(%rbp)
  movss  -0x34(%rbp),%xmm0
  movss  %xmm0,-0x44(%rbp)
  movss  -0x44(%rbp),%xmm0
  movss  %xmm0,-0x18(%rbp)
  movss  -0x18(%rbp),%xmm0
  movss  %xmm0,-0x1c(%rbp)
  movss  -0x1c(%rbp),%xmm0
  movss  %xmm0,-0x20(%rbp)
  movss  D50(%rip),%xmm0
  movss  %xmm0,-0x14(%rbp)
  lea    -0x50(%rbp),%rdx
  mov    -0x98(%rbp),%rcx
  mov    -0x98(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <lib3ds_matrix_mult@plt>
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L21
  call   <__stack_chk_fail@plt>
L21:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_label: D50
type: byte[4]
name: unpack_data
arguments: data_label: D30
type: byte[4]

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

tool: {"D30": [0x00,0x00,0x00,0x40]}

assistant: ```c
void lib3ds_matrix_rotate_quat(float m[4][4], float q[4]) {
  float s, xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz, l;
  float R[4][4];
  l = q[0] * q[0] + q[1] * q[1] + q[2] * q[2] + q[3] * q[3];
  if (fabs(l) < (1e-5)) {
    s = 1.0f;
  } else {
    s = 2.0f / l;
  }
  xs = q[0] * s;
  ys = q[1] * s;
  zs = q[2] * s;
  wx = q[3] * xs;
  wy = q[3] * ys;
  wz = q[3] * zs;
  xx = q[0] * xs;
  xy = q[0] * ys;
  xz = q[0] * zs;
  yy = q[1] * ys;
  yz = q[1] * zs;
  zz = q[2] * zs;
  R[0][0] = 1.0f - (yy + zz);
  R[1][0] = xy - wz;
  R[2][0] = xz + wy;
  R[0][1] = xy + wz;
  R[1][1] = 1.0f - (xx + zz);
  R[2][1] = yz - wx;
  R[0][2] = xz - wy;
  R[1][2] = yz + wx;
  R[2][2] = 1.0f - (xx + yy);
  R[3][0] = R[3][1] = R[3][2] = R[0][3] = R[1][3] = R[2][3] = 0.0f;
  R[3][3] = 1.0f;
  lib3ds_matrix_mult(m, m, R);
}
```