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

```asm
<bot_quat_rotate>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  add    $0xffffffffffffff80,%rsp
  mov    %rdi,-0x78(%rbp)
  mov    %rsi,-0x80(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x78(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0x78(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x68(%rbp)
  mov    -0x78(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0x78(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x60(%rbp)
  mov    -0x78(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0x78(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x58(%rbp)
  mov    -0x78(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  movq   D22(%rip),%xmm1
  xorpd  %xmm0,%xmm1
  mov    -0x78(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x50(%rbp)
  mov    -0x78(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm1
  mov    -0x78(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x48(%rbp)
  mov    -0x78(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm1
  mov    -0x78(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x40(%rbp)
  mov    -0x78(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  movq   D22(%rip),%xmm1
  xorpd  %xmm0,%xmm1
  mov    -0x78(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x38(%rbp)
  mov    -0x78(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm1
  mov    -0x78(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x30(%rbp)
  mov    -0x78(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  movq   D22(%rip),%xmm1
  xorpd  %xmm0,%xmm1
  mov    -0x78(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x28(%rbp)
  movsd  -0x38(%rbp),%xmm0
  movapd %xmm0,%xmm1
  addsd  -0x28(%rbp),%xmm1
  mov    -0x80(%rbp),%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm0,%xmm1
  movsd  -0x48(%rbp),%xmm0
  movapd %xmm0,%xmm2
  subsd  -0x58(%rbp),%xmm2
  mov    -0x80(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  movsd  -0x60(%rbp),%xmm0
  movapd %xmm0,%xmm2
  addsd  -0x40(%rbp),%xmm2
  mov    -0x80(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movapd %xmm0,%xmm1
  addsd  %xmm0,%xmm1
  mov    -0x80(%rbp),%rax
  movsd  (%rax),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x20(%rbp)
  movsd  -0x58(%rbp),%xmm0
  movapd %xmm0,%xmm1
  addsd  -0x48(%rbp),%xmm1
  mov    -0x80(%rbp),%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm0,%xmm1
  movsd  -0x50(%rbp),%xmm0
  movapd %xmm0,%xmm2
  addsd  -0x28(%rbp),%xmm2
  mov    -0x80(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  movsd  -0x30(%rbp),%xmm0
  movapd %xmm0,%xmm2
  subsd  -0x68(%rbp),%xmm2
  mov    -0x80(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movapd %xmm0,%xmm1
  addsd  %xmm0,%xmm1
  mov    -0x80(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x18(%rbp)
  movsd  -0x40(%rbp),%xmm0
  movapd %xmm0,%xmm1
  subsd  -0x60(%rbp),%xmm1
  mov    -0x80(%rbp),%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm0,%xmm1
  movsd  -0x68(%rbp),%xmm0
  movapd %xmm0,%xmm2
  addsd  -0x30(%rbp),%xmm2
  mov    -0x80(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  movsd  -0x50(%rbp),%xmm0
  movapd %xmm0,%xmm2
  addsd  -0x38(%rbp),%xmm2
  mov    -0x80(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movapd %xmm0,%xmm1
  addsd  %xmm0,%xmm1
  mov    -0x80(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  lea    -0x20(%rbp),%rcx
  mov    -0x80(%rbp),%rax
  mov    $0x18,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L8
  call   <__stack_chk_fail@plt>
L8:
  leave
  ret
```

tool_calls: name: read_data
arguments: data_tag: D22
type_guessed: f32[2]

tool: {"D22": [0.0,-0.0]}

assistant: ```c
void bot_quat_rotate(const double rot[4], double v[3]) {
  double ab = rot[0] * rot[1], ac = rot[0] * rot[2], ad = rot[0] * rot[3];
  double nbb = -rot[1] * rot[1], bc = rot[1] * rot[2], bd = rot[1] * rot[3];
  double ncc = -rot[2] * rot[2], cd = rot[2] * rot[3], ndd = -rot[3] * rot[3];
  double result[] = {2 * ((ncc + ndd) * v[0] + (bc - ad) * v[1] + (ac + bd) * v[2]) + v[0], 2 * ((ad + bc) * v[0] + (nbb + ndd) * v[1] + (cd - ab) * v[2]) + v[1], 2 * ((bd - ac) * v[0] + (ab + cd) * v[1] + (nbb + ncc) * v[2]) + v[2]};
  memcpy(v, result, 3 * sizeof(double));
}
```