user: Translate the below assembly code into C programming language:

```asm
<intersect_triangle>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xf0,%rsp
  mov    %rdi,-0xb8(%rbp)
  mov    %rsi,-0xc0(%rbp)
  mov    %rdx,-0xc8(%rbp)
  mov    %rcx,-0xd0(%rbp)
  mov    %r8,-0xd8(%rbp)
  mov    %r9,-0xe0(%rbp)
  mov    0x10(%rbp),%rax
  mov    %rax,-0xe8(%rbp)
  mov    0x18(%rbp),%rax
  mov    %rax,-0xf0(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0xd0(%rbp),%rax
  movsd  (%rax),%xmm0
  mov    -0xc8(%rbp),%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0xa0(%rbp)
  mov    -0xd0(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  mov    -0xc8(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x98(%rbp)
  mov    -0xd0(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  mov    -0xc8(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x90(%rbp)
  mov    -0xd8(%rbp),%rax
  movsd  (%rax),%xmm0
  mov    -0xc8(%rbp),%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x80(%rbp)
  mov    -0xd8(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  mov    -0xc8(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x78(%rbp)
  mov    -0xd8(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  mov    -0xc8(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x70(%rbp)
  mov    -0xc0(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm1
  movsd  -0x70(%rbp),%xmm0
  mulsd  %xmm1,%xmm0
  mov    -0xc0(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm2
  movsd  -0x78(%rbp),%xmm1
  mulsd  %xmm2,%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x40(%rbp)
  mov    -0xc0(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm1
  movsd  -0x80(%rbp),%xmm0
  mulsd  %xmm1,%xmm0
  mov    -0xc0(%rbp),%rax
  movsd  (%rax),%xmm2
  movsd  -0x70(%rbp),%xmm1
  mulsd  %xmm2,%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x38(%rbp)
  mov    -0xc0(%rbp),%rax
  movsd  (%rax),%xmm1
  movsd  -0x78(%rbp),%xmm0
  mulsd  %xmm1,%xmm0
  mov    -0xc0(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm2
  movsd  -0x80(%rbp),%xmm1
  mulsd  %xmm2,%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x30(%rbp)
  movsd  -0xa0(%rbp),%xmm1
  movsd  -0x40(%rbp),%xmm0
  mulsd  %xmm0,%xmm1
  movsd  -0x98(%rbp),%xmm2
  movsd  -0x38(%rbp),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  movsd  -0x90(%rbp),%xmm2
  movsd  -0x30(%rbp),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0xb0(%rbp)
  movsd  -0xb0(%rbp),%xmm0
  comisd D43(%rip),%xmm0
  jbe    L90
  movsd  D27(%rip),%xmm0
  comisd -0xb0(%rbp),%xmm0
  jbe    L90
  mov    $0x0,%eax
  jmp    L84
L90:
  movsd  D37(%rip),%xmm0
  divsd  -0xb0(%rbp),%xmm0
  movsd  %xmm0,-0xa8(%rbp)
  mov    -0xb8(%rbp),%rax
  movsd  (%rax),%xmm0
  mov    -0xc8(%rbp),%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x60(%rbp)
  mov    -0xb8(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  mov    -0xc8(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x58(%rbp)
  mov    -0xb8(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  mov    -0xc8(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x50(%rbp)
  movsd  -0x60(%rbp),%xmm1
  movsd  -0x40(%rbp),%xmm0
  mulsd  %xmm0,%xmm1
  movsd  -0x58(%rbp),%xmm2
  movsd  -0x38(%rbp),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  movsd  -0x50(%rbp),%xmm2
  movsd  -0x30(%rbp),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  mulsd  -0xa8(%rbp),%xmm0
  mov    -0xe8(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0xe8(%rbp),%rax
  movsd  (%rax),%xmm1
  pxor   %xmm0,%xmm0
  comisd %xmm1,%xmm0
  ja     L96
  mov    -0xe8(%rbp),%rax
  movsd  (%rax),%xmm0
  movsd  D37(%rip),%xmm1
  comisd %xmm1,%xmm0
  jbe    L24
L96:
  mov    $0x0,%eax
  jmp    L84
L24:
  movsd  -0x58(%rbp),%xmm1
  movsd  -0x90(%rbp),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  -0x50(%rbp),%xmm2
  movsd  -0x98(%rbp),%xmm1
  mulsd  %xmm2,%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x20(%rbp)
  movsd  -0x50(%rbp),%xmm1
  movsd  -0xa0(%rbp),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  -0x60(%rbp),%xmm2
  movsd  -0x90(%rbp),%xmm1
  mulsd  %xmm2,%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x18(%rbp)
  movsd  -0x60(%rbp),%xmm1
  movsd  -0x98(%rbp),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  -0x58(%rbp),%xmm2
  movsd  -0xa0(%rbp),%xmm1
  mulsd  %xmm2,%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  mov    -0xc0(%rbp),%rax
  movsd  (%rax),%xmm1
  movsd  -0x20(%rbp),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xc0(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm2
  movsd  -0x18(%rbp),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xc0(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm2
  movsd  -0x10(%rbp),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  mulsd  -0xa8(%rbp),%xmm0
  mov    -0xf0(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0xf0(%rbp),%rax
  movsd  (%rax),%xmm1
  pxor   %xmm0,%xmm0
  comisd %xmm1,%xmm0
  ja     L66
  mov    -0xe8(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0xf0(%rbp),%rax
  movsd  (%rax),%xmm0
  addsd  %xmm1,%xmm0
  movsd  D37(%rip),%xmm1
  comisd %xmm1,%xmm0
  jbe    L4
L66:
  mov    $0x0,%eax
  jmp    L84
L4:
  movsd  -0x80(%rbp),%xmm1
  movsd  -0x20(%rbp),%xmm0
  mulsd  %xmm0,%xmm1
  movsd  -0x78(%rbp),%xmm2
  movsd  -0x18(%rbp),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  movsd  -0x70(%rbp),%xmm2
  movsd  -0x10(%rbp),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  mulsd  -0xa8(%rbp),%xmm0
  mov    -0xe0(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    $0x1,%eax
L84:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L23
  call   <__stack_chk_fail@plt>
L23:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: tag: D43
datatype: byte[16]
name: unpack_data
arguments: tag: D27
datatype: f64
name: unpack_data
arguments: tag: D37
datatype: f64

tool: {"D43": [0x8d,0xed,0xb5,0xa0,0xf7,0xc6,0xb0,0xbe,0x8d,0xed,0xb5,0xa0,0xf7,0xc6,0xb0,0x3e]}

tool: D27: 1e-06

tool: D37: 1

assistant: ```c
int intersect_triangle(double orig[3], double dir[3], double vert0[3], double vert1[3], double vert2[3], double *t, double *u, double *v) {
  double edge1[3], edge2[3], tvec[3], pvec[3], qvec[3];
  double det, inv_det;
  {
    edge1[0] = vert1[0] - vert0[0];
    edge1[1] = vert1[1] - vert0[1];
    edge1[2] = vert1[2] - vert0[2];
  };
  {
    edge2[0] = vert2[0] - vert0[0];
    edge2[1] = vert2[1] - vert0[1];
    edge2[2] = vert2[2] - vert0[2];
  };
  {
    pvec[0] = dir[1] * edge2[2] - dir[2] * edge2[1];
    pvec[1] = dir[2] * edge2[0] - dir[0] * edge2[2];
    pvec[2] = dir[0] * edge2[1] - dir[1] * edge2[0];
  };
  det = (edge1[0] * pvec[0] + edge1[1] * pvec[1] + edge1[2] * pvec[2]);
  if (det > -0.000001 && det < 0.000001) {
    return 0;
  }
  inv_det = 1.0 / det;
  {
    tvec[0] = orig[0] - vert0[0];
    tvec[1] = orig[1] - vert0[1];
    tvec[2] = orig[2] - vert0[2];
  };
  *u = (tvec[0] * pvec[0] + tvec[1] * pvec[1] + tvec[2] * pvec[2]) * inv_det;
  if (*u < 0.0 || *u > 1.0) {
    return 0;
  }
  {
    qvec[0] = tvec[1] * edge1[2] - tvec[2] * edge1[1];
    qvec[1] = tvec[2] * edge1[0] - tvec[0] * edge1[2];
    qvec[2] = tvec[0] * edge1[1] - tvec[1] * edge1[0];
  };
  *v = (dir[0] * qvec[0] + dir[1] * qvec[1] + dir[2] * qvec[2]) * inv_det;
  if (*v < 0.0 || *u + *v > 1.0) {
    return 0;
  }
  *t = (edge2[0] * qvec[0] + edge2[1] * qvec[1] + edge2[2] * qvec[2]) * inv_det;
  return 1;
}
```