user: 下面的汇编指令对应的C源代码是什么：

```asm
<quat_mul>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x30(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  mov    -0x38(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x30(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm2
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  mov    -0x28(%rbp),%rax
  movss  %xmm0,(%rax)
  mov    -0x30(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  mov    -0x38(%rbp),%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x30(%rbp),%rax
  movss  (%rax),%xmm2
  mov    -0x38(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  mov    -0x28(%rbp),%rax
  add    $0x4,%rax
  subss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x30(%rbp),%rax
  movss  (%rax),%xmm1
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x30(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm2
  mov    -0x38(%rbp),%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  mov    -0x28(%rbp),%rax
  add    $0x8,%rax
  subss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x30(%rbp),%rax
  movss  (%rax),%xmm1
  mov    -0x38(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x14(%rbp)
  mov    -0x30(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  mov    -0x38(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x10(%rbp)
  mov    -0x30(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  mov    -0x38(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0xc(%rbp)
  mov    -0x28(%rbp),%rax
  movss  (%rax),%xmm1
  movss  -0x14(%rbp),%xmm0
  addss  %xmm1,%xmm0
  mov    -0x28(%rbp),%rax
  movss  %xmm0,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  movss  -0x10(%rbp),%xmm0
  mov    -0x28(%rbp),%rax
  add    $0x4,%rax
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  movss  -0xc(%rbp),%xmm0
  mov    -0x28(%rbp),%rax
  add    $0x8,%rax
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x38(%rbp),%rax
  movss  (%rax),%xmm1
  mov    -0x30(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x14(%rbp)
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  mov    -0x30(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x10(%rbp)
  mov    -0x38(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  mov    -0x30(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0xc(%rbp)
  mov    -0x28(%rbp),%rax
  movss  (%rax),%xmm1
  movss  -0x14(%rbp),%xmm0
  addss  %xmm1,%xmm0
  mov    -0x28(%rbp),%rax
  movss  %xmm0,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  movss  -0x10(%rbp),%xmm0
  mov    -0x28(%rbp),%rax
  add    $0x4,%rax
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  movss  -0xc(%rbp),%xmm0
  mov    -0x28(%rbp),%rax
  add    $0x8,%rax
  addss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x30(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm1
  mov    -0x38(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x30(%rbp),%rax
  movss  (%rax),%xmm2
  mov    -0x38(%rbp),%rax
  movss  (%rax),%xmm1
  mulss  %xmm1,%xmm2
  mov    -0x30(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm3
  mov    -0x38(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  mulss  %xmm3,%xmm1
  addss  %xmm1,%xmm2
  mov    -0x30(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm3
  mov    -0x38(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  mulss  %xmm3,%xmm1
  addss  %xmm2,%xmm1
  mov    -0x28(%rbp),%rax
  add    $0xc,%rax
  subss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L5
  call   <__stack_chk_fail@plt>
L5:
  leave
  ret
```

assistant: ```c
void quat_mul(float *r, float *p, float *q) {
  float tmp[3];
  {
    (r)[0] = (p)[1] * (q)[2] - (p)[2] * (q)[1];
    (r)[1] = (p)[2] * (q)[0] - (p)[0] * (q)[2];
    (r)[2] = (p)[0] * (q)[1] - (p)[1] * (q)[0];
  };
  {
    (tmp)[0] = (p)[0] * (q[3]);
    (tmp)[1] = (p)[1] * (q[3]);
    (tmp)[2] = (p)[2] * (q[3]);
  };
  {
    (r)[0] = (r)[0] + (tmp)[0];
    (r)[1] = (r)[1] + (tmp)[1];
    (r)[2] = (r)[2] + (tmp)[2];
  };
  {
    (tmp)[0] = (q)[0] * (p[3]);
    (tmp)[1] = (q)[1] * (p[3]);
    (tmp)[2] = (q)[2] * (p[3]);
  };
  {
    (r)[0] = (r)[0] + (tmp)[0];
    (r)[1] = (r)[1] + (tmp)[1];
    (r)[2] = (r)[2] + (tmp)[2];
  };
  r[3] = p[3] * q[3] - ((p)[0] * (q)[0] + (p)[1] * (q)[1] + (p)[2] * (q)[2]);
}
```