user: Please show me the C implementation that matches the assembly code listed below:

```asm
<glmComputeBarycentricCoordinates3d>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xc0,%rsp
  mov    %rdi,-0x98(%rbp)
  mov    %rsi,-0xa0(%rbp)
  mov    %rdx,-0xa8(%rbp)
  mov    %rcx,-0xb0(%rbp)
  mov    %r8,-0xb8(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0xa0(%rbp),%rdx
  mov    -0xb0(%rbp),%rcx
  lea    -0x60(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <glmMakeVector3d@plt>
  mov    -0xa8(%rbp),%rdx
  mov    -0xb0(%rbp),%rcx
  lea    -0x40(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <glmMakeVector3d@plt>
  lea    -0x60(%rbp),%rdx
  lea    -0x60(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <glmDotProduct3d@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x90(%rbp)
  lea    -0x60(%rbp),%rdx
  lea    -0x40(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <glmDotProduct3d@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x88(%rbp)
  lea    -0x40(%rbp),%rdx
  lea    -0x40(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <glmDotProduct3d@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x80(%rbp)
  mov    -0xb8(%rbp),%rdx
  mov    -0xb0(%rbp),%rcx
  lea    -0x20(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <glmMakeVector3d@plt>
  lea    -0x60(%rbp),%rdx
  lea    -0x20(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <glmDotProduct3d@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x78(%rbp)
  lea    -0x40(%rbp),%rdx
  lea    -0x20(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <glmDotProduct3d@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x70(%rbp)
  movsd  -0x90(%rbp),%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x80(%rbp),%xmm1
  movsd  -0x88(%rbp),%xmm0
  movapd %xmm0,%xmm2
  mulsd  %xmm0,%xmm2
  subsd  %xmm2,%xmm1
  movapd %xmm1,%xmm0
  movsd  %xmm0,-0x68(%rbp)
  pxor   %xmm0,%xmm0
  ucomisd -0x68(%rbp),%xmm0
  jp     L24
  pxor   %xmm0,%xmm0
  ucomisd -0x68(%rbp),%xmm0
  jne    L24
  mov    -0x98(%rbp),%rax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x98(%rbp),%rax
  add    $0x8,%rax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x98(%rbp),%rax
  add    $0x10,%rax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,(%rax)
  jmp    L14
L24:
  movsd  D11(%rip),%xmm0
  divsd  -0x68(%rbp),%xmm0
  movsd  %xmm0,-0x68(%rbp)
  movsd  -0x80(%rbp),%xmm0
  mulsd  -0x78(%rbp),%xmm0
  movsd  -0x88(%rbp),%xmm1
  mulsd  -0x70(%rbp),%xmm1
  subsd  %xmm1,%xmm0
  mulsd  -0x68(%rbp),%xmm0
  mov    -0x98(%rbp),%rax
  movsd  %xmm0,(%rax)
  movsd  -0x88(%rbp),%xmm0
  movq   D24(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x78(%rbp),%xmm1
  movsd  -0x90(%rbp),%xmm0
  mulsd  -0x70(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x98(%rbp),%rax
  add    $0x8,%rax
  mulsd  -0x68(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x98(%rbp),%rax
  movsd  (%rax),%xmm1
  movsd  D11(%rip),%xmm0
  subsd  %xmm1,%xmm0
  mov    -0x98(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm1
  mov    -0x98(%rbp),%rax
  add    $0x10,%rax
  subsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
L14:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L2
  call   <__stack_chk_fail@plt>
L2:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: label: D11
type_guessed: f64
name: extract_symbolic_data
arguments: label: D24
type_guessed: byte[8]

tool: D11: 1

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

assistant: ```c
void glmComputeBarycentricCoordinates3d(double result[3], const double v1[3], const double v2[3], const double v3[3], const double p[3]) {
  double a, b, c, u, v, D;
  double tv1[3], tv2[3], tv3[3];
  glmMakeVector3d(tv1, v3, v1);
  glmMakeVector3d(tv2, v3, v2);
  a = glmDotProduct3d(tv1, tv1);
  b = glmDotProduct3d(tv2, tv1);
  c = glmDotProduct3d(tv2, tv2);
  glmMakeVector3d(tv3, v3, p);
  u = glmDotProduct3d(tv3, tv1);
  v = glmDotProduct3d(tv3, tv2);
  D = a * c - b * b;
  if (D == 0) {
    result[0] = 0;
    result[1] = 0;
    result[2] = 0;
    return;
  }
  D = 1.0 / D;
  result[0] = (c * u - b * v) * D;
  result[1] = (-b * u + a * v) * D;
  result[2] = 1 - result[0] - result[1];
}
```