// File: /workspace/github_cpp_makefile_star2_O3/ingowald[P]closestSurfacePointQueries/src/distanceQueries.cpp
// Function: bvhlib::GeneralTriangleMesh<float, int, false>::testPrimAndUpdateIfCloser(bvhlib::QueryResult&, ospcommon::vec_t<float, 3, 1> const&, unsigned long)
void GeneralTriangleMesh<coord_t,index_t,has_strides>
  ::testPrimAndUpdateIfCloser(QueryResult &result,
                              const vec3fa &queryPoint,
                              const size_t primID)
  {
    const Triangle tri = getTriangle(primID);

    const vec3fa e0 = tri.v1-tri.v0;
    const vec3fa e1 = tri.v2-tri.v1;
    const vec3fa e2 = tri.v0-tri.v2;
    const vec3fa N  = cross(e2,e0);

    const vec3fa Na = cross(N,e1);
    const vec3fa Nb = cross(N,e2);
    const vec3fa Nc = cross(N,e0);
    
    const float a = dot(queryPoint-tri.v1,Na);
    const float b = dot(queryPoint-tri.v2,Nb);
    const float c = dot(queryPoint-tri.v0,Nc);
      
    vec3fa closestPoint;
    float closestDist;
    if (std::min(std::min(a,b),c) >= 0.f)
      closestPoint = projectToPlane(closestDist,queryPoint,N,tri.v0);
    else {
      closestDist = std::numeric_limits<float>::infinity();
      if (a <= 0.f) 
        checkEdge(closestPoint,closestDist,queryPoint,tri.v1,e1);
      if (b <= 0.f) 
        checkEdge(closestPoint,closestDist,queryPoint,tri.v2,e2);
      if (c <= 0.f) 
        checkEdge(closestPoint,closestDist,queryPoint,tri.v0,e0);
    }
      
    if (closestDist >= result.distance) return;
      
    result.distance = closestDist;
    result.point    = closestPoint;
    result.primID   = primID;
  }

// Assembly:
subq $0xc8, %rsp
movq 0x68(%rdi), %rax
movslq (%rax,%rcx,4), %r9
movq 0x70(%rdi), %rax
movslq (%rax,%rcx,4), %r10
movq 0x78(%rdi), %rax
movslq (%rax,%rcx,4), %rax
movq 0x48(%rdi), %r8
movq 0x50(%rdi), %r11
movss (%r8,%r9,4), %xmm12
movss (%r11,%r9,4), %xmm15
movaps %xmm15, -0x50(%rsp)
movq 0x58(%rdi), %rdi
movss (%rdi,%r9,4), %xmm4
movss (%r8,%r10,4), %xmm2
movss (%r11,%r10,4), %xmm0
movss (%rdi,%r10,4), %xmm3
movss (%r11,%rax,4), %xmm8
movss (%rdi,%rax,4), %xmm14
movaps %xmm0, %xmm1
subss %xmm15, %xmm1
movaps %xmm3, %xmm10
subss %xmm4, %xmm10
movaps %xmm4, %xmm9
movaps %xmm4, -0x80(%rsp)
unpcklps %xmm8, %xmm15           # xmm15 = xmm15[0],xmm8[0],xmm15[1],xmm8[1]
movaps %xmm8, 0x10(%rsp)
movaps %xmm0, 0x30(%rsp)
unpcklps %xmm0, %xmm8            # xmm8 = xmm8[0],xmm0[0],xmm8[1],xmm0[1]
subps %xmm8, %xmm15
unpcklps %xmm14, %xmm9           # xmm9 = xmm9[0],xmm14[0],xmm9[1],xmm14[1]
movaps %xmm14, (%rsp)
movaps %xmm3, 0x20(%rsp)
unpcklps %xmm3, %xmm14           # xmm14 = xmm14[0],xmm3[0],xmm14[1],xmm3[1]
subps %xmm14, %xmm9
movaps %xmm1, %xmm0
mulss %xmm9, %xmm0
movaps %xmm15, %xmm11
mulss %xmm10, %xmm11
subss %xmm0, %xmm11
movaps %xmm2, %xmm13
movaps %xmm12, -0x40(%rsp)
subss %xmm12, %xmm13
movss (%r8,%rax,4), %xmm4
unpcklps %xmm4, %xmm12           # xmm12 = xmm12[0],xmm4[0],xmm12[1],xmm4[1]
movaps %xmm4, -0x10(%rsp)
movaps %xmm2, 0x40(%rsp)
unpcklps %xmm2, %xmm4            # xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
subps %xmm4, %xmm12
movaps %xmm10, %xmm0
mulss %xmm12, %xmm0
movaps %xmm9, %xmm7
mulss %xmm13, %xmm7
subss %xmm0, %xmm7
movaps %xmm13, %xmm0
mulss %xmm15, %xmm0
movaps %xmm12, %xmm6
mulss %xmm1, %xmm6
subss %xmm0, %xmm6
movaps %xmm6, %xmm0
shufps $0x0, %xmm6, %xmm0      # xmm0 = xmm0[0,0],xmm6[0,0]
movaps %xmm15, %xmm3
mulps %xmm0, %xmm3
movaps %xmm7, %xmm2
shufps $0x0, %xmm7, %xmm2      # xmm2 = xmm2[0,0],xmm7[0,0]
movaps %xmm12, %xmm5
mulps %xmm2, %xmm5
mulps %xmm9, %xmm2
subps %xmm3, %xmm2
movaps %xmm11, %xmm3
shufps $0x0, %xmm11, %xmm3     # xmm3 = xmm3[0,0],xmm11[0,0]
movaps %xmm9, 0x70(%rsp)
mulps %xmm3, %xmm9
movaps %xmm12, 0x60(%rsp)
mulps %xmm12, %xmm0
subps %xmm9, %xmm0
movaps %xmm15, 0x80(%rsp)
mulps %xmm15, %xmm3
subps %xmm5, %xmm3
movaps %xmm1, %xmm9
mulss %xmm6, %xmm9
movaps %xmm7, %xmm5
mulss %xmm10, %xmm5
subss %xmm9, %xmm5
movaps %xmm10, 0xa0(%rsp)
mulss %xmm11, %xmm10
movaps %xmm6, %xmm9
mulss %xmm13, %xmm9
subss %xmm10, %xmm9
movaps %xmm13, 0x90(%rsp)
movaps %xmm13, %xmm10
mulss %xmm7, %xmm10
movaps %xmm11, %xmm13
movaps %xmm1, 0xb0(%rsp)
mulss %xmm1, %xmm13
subss %xmm10, %xmm13
movss (%rdx), %xmm1
movaps %xmm1, %xmm15
shufps $0x0, %xmm1, %xmm15     # xmm15 = xmm15[0,0],xmm1[0,0]
subps %xmm4, %xmm15
movss 0x4(%rdx), %xmm12
movaps %xmm12, %xmm4
shufps $0x0, %xmm12, %xmm4     # xmm4 = xmm4[0,0],xmm12[0,0]
subps %xmm8, %xmm4
movss 0x8(%rdx), %xmm10
movaps %xmm10, %xmm8
shufps $0x0, %xmm10, %xmm8     # xmm8 = xmm8[0,0],xmm10[0,0]
subps %xmm14, %xmm8
movaps %xmm4, -0x30(%rsp)
mulps %xmm4, %xmm0
movaps %xmm15, -0x20(%rsp)
mulps %xmm15, %xmm2
addps %xmm0, %xmm2
mulps %xmm8, %xmm3
addps %xmm2, %xmm3
movaps %xmm1, %xmm0
subss -0x40(%rsp), %xmm0
movaps %xmm12, -0x60(%rsp)
subss -0x50(%rsp), %xmm12
mulss %xmm12, %xmm9
movaps %xmm0, 0x50(%rsp)
mulss %xmm0, %xmm5
addss %xmm9, %xmm5
movaps %xmm10, -0x70(%rsp)
movaps %xmm10, %xmm14
subss -0x80(%rsp), %xmm14
mulss %xmm14, %xmm13
addss %xmm5, %xmm13
movaps %xmm3, %xmm0
shufps $0x55, %xmm3, %xmm0     # xmm0 = xmm0[1,1],xmm3[1,1]
movaps %xmm3, %xmm2
minss %xmm0, %xmm2
movaps %xmm13, %xmm5
minss %xmm2, %xmm5
xorps %xmm2, %xmm2
ucomiss %xmm2, %xmm5
jae 0x59e3
movaps %xmm12, %xmm11
ucomiss %xmm0, %xmm2
jae 0x5aaf
movss 0x3c82(%rip), %xmm15    # 0x964c
movaps 0x80(%rsp), %xmm4
movaps 0x70(%rsp), %xmm10
movaps 0x60(%rsp), %xmm12
jmp 0x5bd7
movaps %xmm7, %xmm0
mulss %xmm7, %xmm0
movaps %xmm1, %xmm3
movaps %xmm11, %xmm1
mulss %xmm11, %xmm1
addss %xmm0, %xmm1
movaps %xmm6, %xmm0
mulss %xmm6, %xmm0
addss %xmm1, %xmm0
movaps %xmm3, %xmm1
ucomiss %xmm2, %xmm0
movaps -0x40(%rsp), %xmm3
movaps -0x50(%rsp), %xmm4
jne 0x5a19
jnp 0x5a6b
mulss %xmm7, %xmm12
movaps 0x50(%rsp), %xmm2
mulss %xmm11, %xmm2
addss %xmm12, %xmm2
mulss %xmm6, %xmm14
addss %xmm2, %xmm14
divss %xmm0, %xmm14
mulss %xmm14, %xmm11
mulss %xmm14, %xmm7
mulss %xmm6, %xmm14
movaps %xmm1, %xmm3
subss %xmm11, %xmm3
movaps -0x60(%rsp), %xmm4
subss %xmm7, %xmm4
movaps -0x70(%rsp), %xmm0
subss %xmm14, %xmm0
movaps %xmm0, -0x80(%rsp)
movaps %xmm3, %xmm0
subss %xmm1, %xmm0
movaps %xmm4, %xmm1
subss -0x60(%rsp), %xmm1
movaps -0x80(%rsp), %xmm9
movaps %xmm9, %xmm2
subss -0x70(%rsp), %xmm2
mulss %xmm1, %xmm1
mulss %xmm0, %xmm0
addss %xmm1, %xmm0
mulss %xmm2, %xmm2
addss %xmm0, %xmm2
sqrtss %xmm2, %xmm15
movaps %xmm3, %xmm6
movaps %xmm4, %xmm7
jmp 0x5ddc
movaps 0x80(%rsp), %xmm4
movaps %xmm4, %xmm0
shufps $0x55, %xmm4, %xmm0     # xmm0 = xmm0[1,1],xmm4[1,1]
movaps %xmm0, %xmm5
mulss %xmm0, %xmm5
movaps 0x60(%rsp), %xmm12
movaps %xmm12, %xmm2
shufps $0x55, %xmm12, %xmm2    # xmm2 = xmm2[1,1],xmm12[1,1]
movaps %xmm2, %xmm7
mulss %xmm2, %xmm7
addss %xmm5, %xmm7
movaps 0x70(%rsp), %xmm10
movaps %xmm10, %xmm5
shufps $0x55, %xmm10, %xmm5    # xmm5 = xmm5[1,1],xmm10[1,1]
movaps %xmm5, %xmm6
mulss %xmm5, %xmm6
addss %xmm7, %xmm6
xorps %xmm7, %xmm7
ucomiss %xmm7, %xmm6
jne 0x5b15
jp 0x5b15
movaps 0x40(%rsp), %xmm6
movaps 0x30(%rsp), %xmm7
movaps 0x20(%rsp), %xmm9
jmp 0x5b8e
movaps %xmm4, %xmm9
mulps -0x30(%rsp), %xmm9
shufps $0x55, %xmm9, %xmm9     # xmm9 = xmm9[1,1,1,1]
movaps -0x20(%rsp), %xmm15
shufps $0x55, %xmm15, %xmm15   # xmm15 = xmm15[1,1,1,1]
mulss %xmm2, %xmm15
addss %xmm9, %xmm15
movaps %xmm8, %xmm9
shufps $0x55, %xmm8, %xmm9     # xmm9 = xmm9[1,1],xmm8[1,1]
mulss %xmm5, %xmm9
addss %xmm15, %xmm9
divss %xmm6, %xmm9
minss 0x3af6(%rip), %xmm9     # 0x9650
maxss %xmm7, %xmm9
mulss %xmm9, %xmm2
mulss %xmm9, %xmm0
mulss %xmm5, %xmm9
movaps 0x40(%rsp), %xmm6
addss %xmm2, %xmm6
movaps 0x30(%rsp), %xmm7
addss %xmm0, %xmm7
movaps 0x20(%rsp), %xmm0
addss %xmm9, %xmm0
movaps %xmm0, %xmm9
movaps %xmm6, %xmm0
subss %xmm1, %xmm0
movaps %xmm7, %xmm2
subss -0x60(%rsp), %xmm2
movaps %xmm9, %xmm5
subss -0x70(%rsp), %xmm5
mulss %xmm2, %xmm2
mulss %xmm0, %xmm0
addss %xmm2, %xmm0
mulss %xmm5, %xmm5
addss %xmm0, %xmm5
xorps %xmm15, %xmm15
sqrtss %xmm5, %xmm15
movss 0x3a7f(%rip), %xmm0     # 0x964c
ucomiss %xmm0, %xmm15
jne 0x5bd7
movaps %xmm0, %xmm15
xorps %xmm0, %xmm0
ucomiss %xmm3, %xmm0
jae 0x5be7
movaps %xmm1, %xmm5
jmp 0x5cd9
movaps %xmm4, %xmm2
mulss %xmm4, %xmm2
movaps %xmm12, %xmm3
mulss %xmm12, %xmm3
addss %xmm2, %xmm3
movaps %xmm10, %xmm2
mulss %xmm10, %xmm2
addss %xmm3, %xmm2
movaps %xmm1, %xmm5
ucomiss %xmm0, %xmm2
jne 0x5c24
jp 0x5c24
movaps 0x10(%rsp), %xmm4
movaps (%rsp), %xmm8
movaps -0x10(%rsp), %xmm10
jmp 0x5c8e
movaps -0x30(%rsp), %xmm1
mulss %xmm4, %xmm1
movaps -0x20(%rsp), %xmm3
mulss %xmm12, %xmm3
addss %xmm1, %xmm3
mulss %xmm10, %xmm8
addss %xmm3, %xmm8
divss %xmm2, %xmm8
minss 0x39fd(%rip), %xmm8     # 0x9650
xorps %xmm2, %xmm2
maxss %xmm2, %xmm8
mulss %xmm8, %xmm12
mulss %xmm8, %xmm4
mulss %xmm10, %xmm8
movaps -0x10(%rsp), %xmm10
addss %xmm12, %xmm10
movaps %xmm4, %xmm1
movaps 0x10(%rsp), %xmm4
addss %xmm1, %xmm4
movaps (%rsp), %xmm1
addss %xmm8, %xmm1
movaps %xmm1, %xmm8
movaps %xmm10, %xmm1
subss %xmm5, %xmm1
movaps %xmm4, %xmm2
subss -0x60(%rsp), %xmm2
movaps %xmm8, %xmm3
subss -0x70(%rsp), %xmm3
mulss %xmm2, %xmm2
mulss %xmm1, %xmm1
addss %xmm2, %xmm1
mulss %xmm3, %xmm3
addss %xmm1, %xmm3
xorps %xmm1, %xmm1
sqrtss %xmm3, %xmm1
ucomiss %xmm1, %xmm15
jbe 0x5cd9
movaps %xmm1, %xmm15
movaps %xmm10, %xmm6
movaps %xmm4, %xmm7
movaps %xmm8, %xmm9
ucomiss %xmm13, %xmm0
jb 0x5ddc
movaps 0xb0(%rsp), %xmm2
movaps %xmm2, %xmm0
mulss %xmm2, %xmm0
movaps 0x90(%rsp), %xmm4
movaps %xmm4, %xmm1
mulss %xmm4, %xmm1
addss %xmm0, %xmm1
movaps 0xa0(%rsp), %xmm3
movaps %xmm3, %xmm0
mulss %xmm3, %xmm0
addss %xmm1, %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jne 0x5d2e
jp 0x5d2e
movaps -0x40(%rsp), %xmm3
movaps -0x50(%rsp), %xmm4
jmp 0x5d90
mulss %xmm2, %xmm11
movaps 0x50(%rsp), %xmm8
mulss %xmm4, %xmm8
addss %xmm11, %xmm8
mulss %xmm3, %xmm14
addss %xmm8, %xmm14
divss %xmm0, %xmm14
minss 0x38f5(%rip), %xmm14    # 0x9650
maxss %xmm1, %xmm14
mulss %xmm14, %xmm4
mulss %xmm14, %xmm2
mulss %xmm3, %xmm14
movaps -0x40(%rsp), %xmm3
addss %xmm4, %xmm3
movaps -0x50(%rsp), %xmm4
addss %xmm2, %xmm4
movaps -0x80(%rsp), %xmm0
addss %xmm14, %xmm0
movaps %xmm0, -0x80(%rsp)
movaps %xmm3, %xmm0
subss %xmm5, %xmm0
movaps %xmm4, %xmm1
subss -0x60(%rsp), %xmm1
movaps -0x80(%rsp), %xmm2
subss -0x70(%rsp), %xmm2
mulss %xmm1, %xmm1
mulss %xmm0, %xmm0
addss %xmm1, %xmm0
mulss %xmm2, %xmm2
addss %xmm0, %xmm2
xorps %xmm0, %xmm0
sqrtss %xmm2, %xmm0
ucomiss %xmm0, %xmm15
jbe 0x5ddc
movaps %xmm0, %xmm15
movaps %xmm3, %xmm6
movaps %xmm4, %xmm7
movaps -0x80(%rsp), %xmm9
ucomiss 0x10(%rsi), %xmm15
jae 0x5dfb
movss %xmm15, 0x10(%rsi)
movss %xmm6, (%rsi)
movss %xmm7, 0x4(%rsi)
movss %xmm9, 0x8(%rsi)
movl %ecx, 0x14(%rsi)
addq $0xc8, %rsp
retq
nop