user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<RotToAxisAng>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rsi,%rbp
  mov    %rdx,%r12
  movsd  (%rdi),%xmm5
  movsd  0x20(%rdi),%xmm3
  movsd  0x40(%rdi),%xmm2
  movapd %xmm5,%xmm0
  addsd  %xmm3,%xmm0
  addsd  %xmm2,%xmm0
  movsd  D214(%rip),%xmm4
  subsd  %xmm4,%xmm0
  mulsd  D115(%rip),%xmm0
  movapd %xmm0,%xmm1
  subsd  %xmm4,%xmm1
  andpd  D17(%rip),%xmm1
  movsd  D50(%rip),%xmm4
  comisd %xmm1,%xmm4
  ja     L71
  mov    %rdi,%rbx
  movsd  D10(%rip),%xmm1
  comisd %xmm0,%xmm1
  jb     L5
  addsd  D214(%rip),%xmm2
  comisd D50(%rip),%xmm2
  jae    L37
  addsd  D214(%rip),%xmm3
  comisd D50(%rip),%xmm3
  jb     L18
  addsd  %xmm3,%xmm3
  cvttsd2si %xmm3,%edi
  call   <sqrt@plt>
  movsd  D214(%rip),%xmm1
  divsd  %xmm0,%xmm1
  mulsd  0x8(%rbx),%xmm1
  movq   %xmm1,%r14
  movsd  D214(%rip),%xmm0
  addsd  0x20(%rbx),%xmm0
  addsd  %xmm0,%xmm0
  cvttsd2si %xmm0,%edi
  call   <sqrt@plt>
  movapd %xmm0,%xmm1
  movsd  D214(%rip),%xmm0
  addsd  0x20(%rbx),%xmm0
  movsd  D214(%rip),%xmm2
  divsd  %xmm1,%xmm2
  mulsd  %xmm0,%xmm2
  movq   %xmm2,%r13
  addsd  %xmm0,%xmm0
  cvttsd2si %xmm0,%edi
  call   <sqrt@plt>
  movapd %xmm0,%xmm1
  movsd  D214(%rip),%xmm0
  divsd  %xmm1,%xmm0
  mulsd  0x38(%rbx),%xmm0
L9:
  mov    %r14,0x0(%rbp)
  mov    %r13,0x8(%rbp)
  movsd  %xmm0,0x10(%rbp)
  mov    D66(%rip),%rax
  mov    %rax,(%r12)
L6:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L71:
  mov    $0x18,%edx
  mov    $0x0,%esi
  mov    %rbp,%rdi
  call   <memset@plt>
  movq   $0x0,(%r12)
  jmp    L6
L37:
  addsd  %xmm2,%xmm2
  cvttsd2si %xmm2,%edi
  call   <sqrt@plt>
  movsd  D214(%rip),%xmm1
  divsd  %xmm0,%xmm1
  mulsd  0x10(%rbx),%xmm1
  movq   %xmm1,%r14
  movsd  D214(%rip),%xmm0
  addsd  0x40(%rbx),%xmm0
  addsd  %xmm0,%xmm0
  cvttsd2si %xmm0,%edi
  call   <sqrt@plt>
  movsd  D214(%rip),%xmm1
  divsd  %xmm0,%xmm1
  mulsd  0x28(%rbx),%xmm1
  movq   %xmm1,%r13
  movsd  D214(%rip),%xmm0
  addsd  0x40(%rbx),%xmm0
  addsd  %xmm0,%xmm0
  cvttsd2si %xmm0,%edi
  call   <sqrt@plt>
  movapd %xmm0,%xmm2
  movsd  D214(%rip),%xmm0
  addsd  0x40(%rbx),%xmm0
  movsd  D214(%rip),%xmm1
  divsd  %xmm2,%xmm1
  mulsd  %xmm1,%xmm0
  jmp    L9
L18:
  addsd  D214(%rip),%xmm5
  addsd  %xmm5,%xmm5
  cvttsd2si %xmm5,%edi
  call   <sqrt@plt>
  movapd %xmm0,%xmm1
  movsd  D214(%rip),%xmm0
  addsd  (%rbx),%xmm0
  movsd  D214(%rip),%xmm2
  divsd  %xmm1,%xmm2
  mulsd  %xmm0,%xmm2
  movq   %xmm2,%r14
  addsd  %xmm0,%xmm0
  cvttsd2si %xmm0,%edi
  call   <sqrt@plt>
  movsd  D214(%rip),%xmm1
  divsd  %xmm0,%xmm1
  mulsd  0x18(%rbx),%xmm1
  movq   %xmm1,%r13
  movsd  D214(%rip),%xmm0
  addsd  (%rbx),%xmm0
  addsd  %xmm0,%xmm0
  cvttsd2si %xmm0,%edi
  call   <sqrt@plt>
  movapd %xmm0,%xmm1
  movsd  D214(%rip),%xmm0
  divsd  %xmm1,%xmm0
  mulsd  0x30(%rbx),%xmm0
  jmp    L9
L5:
  call   <acos@plt>
  movsd  %xmm0,(%r12)
  call   <sin@plt>
  addsd  %xmm0,%xmm0
  movsd  0x38(%rbx),%xmm1
  subsd  0x28(%rbx),%xmm1
  divsd  %xmm0,%xmm1
  movsd  %xmm1,0x0(%rbp)
  movsd  0x10(%rbx),%xmm1
  subsd  0x30(%rbx),%xmm1
  divsd  %xmm0,%xmm1
  movsd  %xmm1,0x8(%rbp)
  movsd  0x18(%rbx),%xmm1
  subsd  0x8(%rbx),%xmm1
  divsd  %xmm0,%xmm1
  movsd  %xmm1,0x10(%rbp)
  jmp    L6
```

tool_calls: name: read_data
arguments: tag: D214
type: f64
name: read_data
arguments: tag: D115
type: f32[2]
name: read_data
arguments: tag: D17
type: qword[2]
name: read_data
arguments: tag: D50
type: byte[16]
name: read_data
arguments: tag: D10
type: f32[2]
name: read_data
arguments: tag: D66
type: f64

tool: D214: 1

tool: {"D115": [0.0,1.75]}

tool: {"D17": [0x7fffffffffffffff,0x0000000000000000]}

tool: {"D50": [0x8d,0xed,0xb5,0xa0,0xf7,0xc6,0xb0,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xbf]}

tool: {"D10": [0.0,-1.875]}

tool: D66: 3.141592653589793

assistant: ```c
void RotToAxisAng(double R[3][3], double omghat[3], double *theta) {
  double tmp;
  double omg[3] = {0};
  double acosinput = (R[0][0] + R[1][1] + R[2][2] - 1.0) / 2.0;
  if (fabs(acosinput - 1.0) < 1.0E-6) {
    memset(omghat, 0, 3 * sizeof(double));
    *theta = 0.0;
  } else if (acosinput <= -1.0) {
    if ((1.0 + R[2][2]) >= 1.0E-6) {
      omg[0] = 1.0 / sqrt(2 * (1.0 + R[2][2])) * R[0][2];
      omg[1] = 1.0 / sqrt(2 * (1.0 + R[2][2])) * R[1][2];
      omg[2] = 1.0 / sqrt(2 * (1.0 + R[2][2])) * (1.0 + R[2][2]);
    } else if ((1.0 + R[1][1] >= 1.0E-6)) {
      omg[0] = 1.0 / sqrt(2 * (1.0 + R[1][1])) * R[0][1];
      omg[1] = 1.0 / sqrt(2 * (1.0 + R[1][1])) * (1.0 + R[1][1]);
      omg[2] = 1.0 / sqrt(2 * (1.0 + R[1][1])) * R[2][1];
    } else {
      omg[0] = 1.0 / sqrt(2 * (1.0 + R[0][0])) * (1.0 + R[0][0]);
      omg[1] = 1.0 / sqrt(2 * (1.0 + R[0][0])) * R[1][0];
      omg[2] = 1.0 / sqrt(2 * (1.0 + R[0][0])) * R[2][0];
    }
    omghat[0] = omg[0];
    omghat[1] = omg[1];
    omghat[2] = omg[2];
    *theta = 3.14159265358979323846;
  } else {
    *theta = acos(acosinput);
    tmp = 2.0 * sin(*theta);
    omghat[0] = (R[2][1] - R[1][2]) / tmp;
    omghat[1] = (R[0][2] - R[2][0]) / tmp;
    omghat[2] = (R[1][0] - R[0][1]) / tmp;
  }
  return;
}
```