user: 下面的汇编指令对应的C源代码是什么：

```asm
<glmClosestPointOnTriangle3f>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x78,%rsp
  mov    %rdi,0x8(%rsp)
  mov    %rsi,%rbp
  mov    %rdx,%r13
  mov    %rcx,%r12
  mov    %r8,%rbx
  mov    %fs:0x28,%rax
  mov    %rax,0x68(%rsp)
  xor    %eax,%eax
  lea    0x38(%rsp),%r14
  mov    %r14,%rdi
  call   <glmComputeTriangleNormalf@plt>
  lea    0x2c(%rsp),%rdi
  mov    %rbx,%rcx
  mov    %r14,%rdx
  mov    %rbp,%rsi
  call   <glmClosestPointOnPlane3f@plt>
  mov    %r12,%rcx
  mov    %r13,%rdx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <glmIsPointInTriangle3f@plt>
  test   %rax,%rax
  jne    L41
  lea    0x2c(%rsp),%r14
  lea    0x44(%rsp),%r15
  mov    %r14,%rcx
  mov    %r13,%rdx
  mov    %rbp,%rsi
  mov    %r15,%rdi
  call   <glmClosestPointOnLineSegment3f@plt>
  lea    0x50(%rsp),%rax
  mov    %r14,%rcx
  mov    %r12,%rdx
  mov    %r13,%rsi
  mov    %rax,0x18(%rsp)
  mov    %rax,%rdi
  call   <glmClosestPointOnLineSegment3f@plt>
  lea    0x5c(%rsp),%r13
  mov    %r14,%rcx
  mov    %rbp,%rdx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <glmClosestPointOnLineSegment3f@plt>
  mov    %rbx,%rsi
  mov    %r15,%rdi
  call   <glmComputeDistance3f@plt>
  movss  %xmm0,0x14(%rsp)
  mov    %rbx,%rsi
  mov    0x18(%rsp),%rdi
  call   <glmComputeDistance3f@plt>
  movss  %xmm0,0x18(%rsp)
  mov    %rbx,%rsi
  mov    %r13,%rdi
  call   <glmComputeDistance3f@plt>
  movaps %xmm0,%xmm2
  mov    $0x2,%edx
  mov    $0x1,%esi
  mov    $0x0,%edi
  movss  0x18(%rsp),%xmm1
  movss  0x14(%rsp),%xmm0
  call   <glmMinIndex3f@plt>
  cmp    $0x1,%eax
  je     L23
  cmp    $0x2,%eax
  je     L25
  test   %eax,%eax
  je     L46
L54:
  mov    0x68(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L77
  add    $0x78,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L41:
  mov    0x8(%rsp),%rsi
  mov    %rbx,%rdi
  call   <glmCopyVector3f@plt>
  jmp    L54
L46:
  mov    %r15,%rdi
  mov    0x8(%rsp),%rsi
  call   <glmCopyVector3f@plt>
  jmp    L54
L23:
  lea    0x50(%rsp),%rdi
  mov    0x8(%rsp),%rsi
  call   <glmCopyVector3f@plt>
  jmp    L54
L25:
  lea    0x5c(%rsp),%rdi
  mov    0x8(%rsp),%rsi
  call   <glmCopyVector3f@plt>
  jmp    L54
L77:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void glmClosestPointOnTriangle3f(float result[3], const float v1[3], const float v2[3], const float v3[3], const float p[3]) {
  float temp[3];
  float normal[3];
  float d1, d2, d3;
  float t1[3], t2[3], t3[3];
  glmComputeTriangleNormalf(normal, v1, v2, v3);
  glmClosestPointOnPlane3f(temp, v1, normal, p);
  if (glmIsPointInTriangle3f(p, v1, v2, v3)) {
    glmCopyVector3f(p, result);
    return;
  }
  glmClosestPointOnLineSegment3f(t1, v1, v2, temp);
  glmClosestPointOnLineSegment3f(t2, v2, v3, temp);
  glmClosestPointOnLineSegment3f(t3, v3, v1, temp);
  d1 = glmComputeDistance3f(t1, p);
  d2 = glmComputeDistance3f(t2, p);
  d3 = glmComputeDistance3f(t3, p);
  switch (glmMinIndex3f(d1, d2, d3, 0, 1, 2)) {
  case 0:
    glmCopyVector3f(t1, result);
    return;
    break;
  case 1:
    glmCopyVector3f(t2, result);
    return;
    break;
  case 2:
    glmCopyVector3f(t3, result);
    return;
    break;
  }
}
```