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

```asm
<arGetRot>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  movsd  %xmm0,-0x38(%rbp)
  movsd  %xmm1,-0x40(%rbp)
  movsd  %xmm2,-0x48(%rbp)
  mov    %rdi,-0x50(%rbp)
  mov    -0x38(%rbp),%rax
  movq   %rax,%xmm0
  call   <sin@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x38(%rbp),%rax
  movq   %rax,%xmm0
  call   <cos@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x40(%rbp),%rax
  movq   %rax,%xmm0
  call   <sin@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x40(%rbp),%rax
  movq   %rax,%xmm0
  call   <cos@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x48(%rbp),%rax
  movq   %rax,%xmm0
  call   <sin@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x48(%rbp),%rax
  movq   %rax,%xmm0
  call   <cos@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x8(%rbp)
  movsd  -0x28(%rbp),%xmm0
  mulsd  %xmm0,%xmm0
  mulsd  -0x18(%rbp),%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x8(%rbp),%xmm1
  movsd  -0x30(%rbp),%xmm0
  mulsd  %xmm0,%xmm0
  mulsd  -0x8(%rbp),%xmm0
  addsd  %xmm0,%xmm1
  movsd  -0x30(%rbp),%xmm0
  mulsd  -0x28(%rbp),%xmm0
  mulsd  -0x18(%rbp),%xmm0
  mulsd  -0x10(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  movsd  -0x30(%rbp),%xmm1
  mulsd  -0x28(%rbp),%xmm1
  mulsd  -0x10(%rbp),%xmm1
  subsd  %xmm1,%xmm0
  mov    -0x50(%rbp),%rax
  movsd  %xmm0,(%rax)
  movsd  -0x28(%rbp),%xmm0
  movq   D0(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  mulsd  -0x28(%rbp),%xmm0
  mulsd  -0x18(%rbp),%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x10(%rbp),%xmm1
  movsd  -0x30(%rbp),%xmm0
  mulsd  %xmm0,%xmm0
  mulsd  -0x10(%rbp),%xmm0
  subsd  %xmm0,%xmm1
  movsd  -0x30(%rbp),%xmm0
  mulsd  -0x28(%rbp),%xmm0
  mulsd  -0x18(%rbp),%xmm0
  mulsd  -0x8(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  movsd  -0x30(%rbp),%xmm1
  mulsd  -0x28(%rbp),%xmm1
  mulsd  -0x8(%rbp),%xmm1
  subsd  %xmm1,%xmm0
  mov    -0x50(%rbp),%rax
  movsd  %xmm0,0x8(%rax)
  movsd  -0x28(%rbp),%xmm0
  mulsd  -0x20(%rbp),%xmm0
  mov    -0x50(%rbp),%rax
  movsd  %xmm0,0x10(%rax)
  movsd  -0x30(%rbp),%xmm0
  mulsd  -0x28(%rbp),%xmm0
  mulsd  -0x18(%rbp),%xmm0
  mulsd  -0x8(%rbp),%xmm0
  movsd  -0x30(%rbp),%xmm1
  mulsd  -0x28(%rbp),%xmm1
  movapd %xmm1,%xmm2
  mulsd  -0x8(%rbp),%xmm2
  movapd %xmm0,%xmm1
  subsd  %xmm2,%xmm1
  movsd  -0x30(%rbp),%xmm0
  mulsd  %xmm0,%xmm0
  mulsd  -0x18(%rbp),%xmm0
  mulsd  -0x10(%rbp),%xmm0
  addsd  %xmm0,%xmm1
  movsd  -0x28(%rbp),%xmm0
  mulsd  %xmm0,%xmm0
  mulsd  -0x10(%rbp),%xmm0
  mov    -0x50(%rbp),%rax
  add    $0x18,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  movsd  -0x30(%rbp),%xmm0
  movq   D0(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  mulsd  -0x28(%rbp),%xmm0
  mulsd  -0x18(%rbp),%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x10(%rbp),%xmm1
  movsd  -0x30(%rbp),%xmm0
  mulsd  -0x28(%rbp),%xmm0
  mulsd  -0x10(%rbp),%xmm0
  addsd  %xmm0,%xmm1
  movsd  -0x30(%rbp),%xmm0
  mulsd  %xmm0,%xmm0
  mulsd  -0x18(%rbp),%xmm0
  mulsd  -0x8(%rbp),%xmm0
  addsd  %xmm0,%xmm1
  movsd  -0x28(%rbp),%xmm0
  mulsd  %xmm0,%xmm0
  mulsd  -0x8(%rbp),%xmm0
  mov    -0x50(%rbp),%rax
  add    $0x18,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x8(%rax)
  mov    -0x50(%rbp),%rax
  add    $0x18,%rax
  movsd  -0x30(%rbp),%xmm0
  mulsd  -0x20(%rbp),%xmm0
  movsd  %xmm0,0x10(%rax)
  movsd  -0x28(%rbp),%xmm0
  movq   D0(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  mulsd  -0x20(%rbp),%xmm0
  mulsd  -0x8(%rbp),%xmm0
  movsd  -0x30(%rbp),%xmm1
  mulsd  -0x20(%rbp),%xmm1
  mulsd  -0x10(%rbp),%xmm1
  mov    -0x50(%rbp),%rax
  add    $0x30,%rax
  subsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  movsd  -0x28(%rbp),%xmm0
  mulsd  -0x20(%rbp),%xmm0
  mulsd  -0x10(%rbp),%xmm0
  movsd  -0x30(%rbp),%xmm1
  mulsd  -0x20(%rbp),%xmm1
  mulsd  -0x8(%rbp),%xmm1
  mov    -0x50(%rbp),%rax
  add    $0x30,%rax
  subsd  %xmm1,%xmm0
  movsd  %xmm0,0x8(%rax)
  mov    -0x50(%rbp),%rax
  add    $0x30,%rax
  movsd  -0x18(%rbp),%xmm0
  movsd  %xmm0,0x10(%rax)
  mov    $0x0,%eax
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_tag: D0
type: byte[8]

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

assistant: ```c
int arGetRot(double a, double b, double c, double rot[3][3]) {
  double sina, sinb, sinc;
  double cosa, cosb, cosc;
  sina = sin(a);
  cosa = cos(a);
  sinb = sin(b);
  cosb = cos(b);
  sinc = sin(c);
  cosc = cos(c);
  rot[0][0] = cosa * cosa * cosb * cosc + sina * sina * cosc + sina * cosa * cosb * sinc - sina * cosa * sinc;
  rot[0][1] = -cosa * cosa * cosb * sinc - sina * sina * sinc + sina * cosa * cosb * cosc - sina * cosa * cosc;
  rot[0][2] = cosa * sinb;
  rot[1][0] = sina * cosa * cosb * cosc - sina * cosa * cosc + sina * sina * cosb * sinc + cosa * cosa * sinc;
  rot[1][1] = -sina * cosa * cosb * sinc + sina * cosa * sinc + sina * sina * cosb * cosc + cosa * cosa * cosc;
  rot[1][2] = sina * sinb;
  rot[2][0] = -cosa * sinb * cosc - sina * sinb * sinc;
  rot[2][1] = cosa * sinb * sinc - sina * sinb * cosc;
  rot[2][2] = cosb;
  return 0;
}
```