// File: /workspace/github_c_makefile_star2_O2/mohuangrui[P]ArtraCFD/computational_geometry.c
// Function: PointTriangleDistance
Real PointTriangleDistance(const Real p[restrict], const Real v0[restrict], const Real e01[restrict],
        const Real e02[restrict], Real para[restrict])
{
    const RealVec D = {v0[X] - p[X], v0[Y] - p[Y], v0[Z] - p[Z]};
    const Real a = Dot(e01, e01);
    const Real b = Dot(e01, e02);
    const Real c = Dot(e02, e02);
    const Real d = Dot(e01, D);
    const Real e = Dot(e02, D);
    const Real f = Dot(D, D);
    const Real det = a * c - b * b;
    const Real zero = 0.0;
    const Real one = 1.0;
    Real s = b * e - c * d;
    Real t = b * d - a * e;
    Real distSquare = zero;
    if (s + t <= det) {
        if (s < zero) {
            if (t < zero) {
                /* region 4 */;
                if (d < zero) {
                    t = zero;
                    if (-d >= a) {
                        s = one;
                        distSquare = a + 2.0 * d + f;
                    } else {
                        s = -d / a;
                        distSquare = d * s + f;
                    }
                } else {
                    s = zero;
                    if (e >= zero) {
                        t = zero;
                        distSquare = f;
                    } else {
                        if (-e >= c) {
                            t = one;
                            distSquare = c + 2.0 * e + f;
                        } else {
                            t = -e / c;
                            distSquare = e * t + f;
                        }
                    }
                }
            } else {
                /* region 3 */
                s = zero;
                if (e >= zero) {
                    t = zero;
                    distSquare = f;
                } else {
                    if (-e >= c) {
                        t = one;
                        distSquare = c + 2.0 * e + f;
                    } else {
                        t = -e / c;
                        distSquare = e * t + f;
                    }
                }
            }
        } else {
            if (t < zero) {
                /* region 5 */;
                t = zero;
                if (d >= zero) {
                    s = zero;
                    distSquare = f;
                } else {
                    if (-d >= a) {
                        s = one;
                        distSquare = a + 2.0 * d + f;
                    } else {
                        s = -d / a;
                        distSquare = d * s + f;
                    }
                }
            } else {
                /* region 0 */
                s = s / det;
                t = t / det;
                distSquare = s * (a * s + b * t + 2.0 * d) + t * (b * s + c * t + 2.0 * e) + f;
            }
        }
    } else {
        if (s < zero) {
            /* region 2 */
            const Real tmp0 = b + d;
            const Real tmp1 = c + e;
            if (tmp1 > tmp0) {
                const Real numer = tmp1 - tmp0;
                const Real denom = a - 2.0 * b + c;
                if (numer >= denom) {
                    s = one;
                    t = zero;
                    distSquare = a + 2.0 * d + f;
                } else {
                    s = numer / denom;
                    t = one - s;
                    distSquare = s * (a * s + b * t + 2.0 * d) + t * (b * s + c * t + 2.0 * e) + f;
                }
            } else {
                s = zero;
                if (tmp1 <= zero) {
                    t = one;
                    distSquare = c + 2.0 * e + f;
                } else {
                    if (e >= zero) {
                        t = zero;
                        distSquare = f;
                    } else {
                        t = -e / c;
                        distSquare = e * t + f;
                    }
                }
            }
        } else {
            if (t < zero) {
                /* region 6 */;
                const Real tmp0 = b + e;
                const Real tmp1 = a + d;
                if (tmp1 > tmp0) {
                    const Real numer = tmp1 - tmp0;
                    const Real denom = a - 2.0 * b + c;
                    if (numer >= denom) {
                        t = one;
                        s = zero;
                        distSquare = c + 2.0 * e + f;
                    } else {
                        t = numer / denom;
                        s = one - t;
                        distSquare = s * (a * s + b * t + 2.0 * d) + t * (b * s + c * t + 2.0 * e) + f;
                    }
                } else {
                    t = zero;
                    if (tmp1 <= zero) {
                        s = one;
                        distSquare = a + 2.0 * d + f;
                    } else {
                        if (d >= zero) {
                            s = zero;
                            distSquare = f;
                        } else {
                            s = -d / a;
                            distSquare = d * s + f;
                        }
                    }
                }
            } else {
                /* region 1 */
                const Real numer = c + e - b - d;
                if (numer <= zero) {
                    s = zero;
                    t = one;
                    distSquare = c + 2.0 * e + f;
                } else {
                    const Real denom = a - 2.0 * b + c;
                    if (numer >= denom) {
                        s = one;
                        t = zero;
                        distSquare = a + 2.0 * d + f;
                    } else {
                        s = numer / denom;
                        t = one - s;
                        distSquare = s * (a * s + b * t + 2.0 * d) + t * (b * s + c * t + 2.0 * e) + f;
                    }
                }
            }
        }
    }
    para[0] = one - s - t;
    para[1] = s;
    para[2] = t;
    /* account for numerical round-off error */
    if (zero > distSquare) {
        distSquare = zero;
    }
    return distSquare;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x68, %rsp
movq %r8, %rbx
movq %rcx, %r14
movq %rdx, %r12
movupd (%rsi), %xmm0
movupd (%rdi), %xmm1
subpd %xmm1, %xmm0
leaq 0x50(%rsp), %r15
movapd %xmm0, (%r15)
movsd 0x10(%rsi), %xmm0
subsd 0x10(%rdi), %xmm0
movsd %xmm0, 0x10(%r15)
movq %rdx, %rdi
movq %rdx, %rsi
callq 0x76cc
movapd %xmm0, 0x40(%rsp)
movq %r12, %rdi
movq %r14, %rsi
callq 0x76cc
movapd %xmm0, 0x30(%rsp)
movq %r14, %rdi
movq %r14, %rsi
callq 0x76cc
movapd %xmm0, 0x20(%rsp)
movq %r12, %rdi
movq %r15, %rsi
callq 0x76cc
movapd %xmm0, 0x10(%rsp)
movq %r14, %rdi
movq %r15, %rsi
callq 0x76cc
movapd %xmm0, (%rsp)
movq %r15, %rdi
movq %r15, %rsi
callq 0x76cc
movapd 0x30(%rsp), %xmm9
movapd 0x40(%rsp), %xmm8
movapd 0x20(%rsp), %xmm7
movapd 0x10(%rsp), %xmm6
movapd (%rsp), %xmm5
movapd %xmm9, %xmm1
mulsd %xmm9, %xmm1
movapd %xmm8, %xmm3
mulsd %xmm7, %xmm3
subsd %xmm1, %xmm3
movapd %xmm8, %xmm1
unpcklpd %xmm7, %xmm1            # xmm1 = xmm1[0],xmm7[0]
movapd %xmm5, %xmm2
unpcklpd %xmm6, %xmm2            # xmm2 = xmm2[0],xmm6[0]
mulpd %xmm1, %xmm2
movapd %xmm9, %xmm4
unpcklpd %xmm9, %xmm4            # xmm4 = xmm4[0],xmm9[0]
movapd %xmm6, %xmm1
unpcklpd %xmm5, %xmm1            # xmm1 = xmm1[0],xmm5[0]
mulpd %xmm4, %xmm1
subpd %xmm2, %xmm1
movapd %xmm1, %xmm2
unpckhpd %xmm1, %xmm2            # xmm2 = xmm2[1],xmm1[1]
movapd %xmm2, %xmm4
addsd %xmm1, %xmm4
ucomisd %xmm4, %xmm3
jae 0xa5ea
xorpd %xmm3, %xmm3
ucomisd %xmm2, %xmm3
jbe 0xa639
movapd %xmm9, %xmm1
addsd %xmm6, %xmm1
movapd %xmm7, %xmm3
addsd %xmm5, %xmm3
ucomisd %xmm1, %xmm3
jbe 0xa731
subsd %xmm1, %xmm3
movapd %xmm9, %xmm2
addsd %xmm9, %xmm2
movapd %xmm8, %xmm1
subsd %xmm2, %xmm1
addsd %xmm7, %xmm1
ucomisd %xmm1, %xmm3
jae 0xa85c
divsd %xmm1, %xmm3
movsd 0xda6a(%rip), %xmm1     # 0x18008
subsd %xmm3, %xmm1
movapd %xmm9, %xmm2
mulsd %xmm1, %xmm2
mulsd %xmm3, %xmm8
addsd %xmm2, %xmm8
addsd %xmm6, %xmm6
addsd %xmm8, %xmm6
mulsd %xmm1, %xmm7
mulsd %xmm3, %xmm9
addsd %xmm7, %xmm9
addsd %xmm5, %xmm5
addsd %xmm9, %xmm5
mulsd %xmm1, %xmm5
mulsd %xmm3, %xmm6
addsd %xmm5, %xmm6
movapd %xmm3, %xmm2
jmp 0xa898
xorpd %xmm4, %xmm4
ucomisd %xmm2, %xmm4
jbe 0xa6dc
xorpd %xmm2, %xmm2
ucomisd %xmm1, %xmm4
jbe 0xa710
ucomisd %xmm6, %xmm2
jbe 0xa710
movapd 0x10ef8(%rip), %xmm2    # 0x1b510
xorpd %xmm6, %xmm2
ucomisd %xmm8, %xmm2
jae 0xa8c5
divsd %xmm8, %xmm2
mulsd %xmm2, %xmm6
addsd %xmm6, %xmm0
jmp 0xa8da
ucomisd %xmm1, %xmm3
jbe 0xa762
movapd %xmm9, %xmm1
addsd %xmm5, %xmm1
movapd %xmm8, %xmm3
addsd %xmm6, %xmm3
ucomisd %xmm1, %xmm3
jbe 0xa873
subsd %xmm1, %xmm3
movapd %xmm9, %xmm2
addsd %xmm9, %xmm2
movapd %xmm8, %xmm1
subsd %xmm2, %xmm1
addsd %xmm7, %xmm1
ucomisd %xmm1, %xmm3
jae 0xa8e0
divsd %xmm1, %xmm3
movsd 0xd978(%rip), %xmm2     # 0x18008
subsd %xmm3, %xmm2
movapd %xmm9, %xmm1
mulsd %xmm3, %xmm1
mulsd %xmm2, %xmm8
addsd %xmm1, %xmm8
addsd %xmm6, %xmm6
addsd %xmm8, %xmm6
mulsd %xmm3, %xmm7
mulsd %xmm2, %xmm9
addsd %xmm7, %xmm9
addsd %xmm5, %xmm5
addsd %xmm9, %xmm5
mulsd %xmm3, %xmm5
mulsd %xmm2, %xmm6
addsd %xmm6, %xmm5
movapd %xmm3, %xmm1
jmp 0xa90f
ucomisd %xmm1, %xmm4
jbe 0xa7fa
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm6
jae 0xa89e
movapd 0x10e14(%rip), %xmm2    # 0x1b510
xorpd %xmm6, %xmm2
ucomisd %xmm8, %xmm2
jb 0xa88f
jmp 0xa8ae
ucomisd %xmm2, %xmm5
jae 0xa8da
movapd 0x10dee(%rip), %xmm1    # 0x1b510
xorpd %xmm5, %xmm1
ucomisd %xmm7, %xmm1
jb 0xa755
jmp 0xa843
xorpd %xmm2, %xmm2
ucomisd %xmm3, %xmm2
jae 0xa843
ucomisd %xmm2, %xmm5
jae 0xa8da
movapd 0x10dbf(%rip), %xmm1    # 0x1b510
xorpd %xmm5, %xmm1
divsd %xmm7, %xmm1
mulsd %xmm1, %xmm5
jmp 0xa90f
movapd %xmm7, %xmm3
addsd %xmm5, %xmm3
subsd %xmm9, %xmm3
subsd %xmm6, %xmm3
xorpd %xmm2, %xmm2
ucomisd %xmm3, %xmm2
jae 0xa8a4
movapd %xmm9, %xmm2
addsd %xmm9, %xmm2
movapd %xmm8, %xmm1
subsd %xmm2, %xmm1
addsd %xmm7, %xmm1
ucomisd %xmm1, %xmm3
jae 0xa8f6
divsd %xmm1, %xmm3
movsd 0xd85a(%rip), %xmm1     # 0x18008
subsd %xmm3, %xmm1
movapd %xmm9, %xmm2
mulsd %xmm1, %xmm2
mulsd %xmm3, %xmm8
addsd %xmm2, %xmm8
addsd %xmm6, %xmm6
addsd %xmm8, %xmm6
mulsd %xmm1, %xmm7
mulsd %xmm3, %xmm9
addsd %xmm7, %xmm9
addsd %xmm5, %xmm5
addsd %xmm9, %xmm5
mulsd %xmm1, %xmm5
mulsd %xmm3, %xmm6
addsd %xmm6, %xmm5
movapd %xmm3, %xmm2
jmp 0xa90f
divsd %xmm3, %xmm2
divsd %xmm3, %xmm1
movapd %xmm9, %xmm3
mulsd %xmm1, %xmm3
mulsd %xmm2, %xmm8
addsd %xmm3, %xmm8
addsd %xmm6, %xmm6
addsd %xmm8, %xmm6
mulsd %xmm1, %xmm7
mulsd %xmm2, %xmm9
addsd %xmm7, %xmm9
addsd %xmm5, %xmm5
addsd %xmm9, %xmm5
mulsd %xmm1, %xmm5
mulsd %xmm2, %xmm6
addsd %xmm5, %xmm6
jmp 0xa898
addsd %xmm5, %xmm5
addsd %xmm7, %xmm5
addsd %xmm5, %xmm0
movsd 0xd7b1(%rip), %xmm1     # 0x18008
jmp 0xa913
addsd %xmm6, %xmm6
addsd %xmm8, %xmm6
movsd 0xd79b(%rip), %xmm2     # 0x18008
xorpd %xmm1, %xmm1
jmp 0xa898
xorpd %xmm1, %xmm1
ucomisd %xmm3, %xmm1
jae 0xa8ae
ucomisd %xmm1, %xmm6
jae 0xa89e
movapd 0x10c85(%rip), %xmm2    # 0x1b510
xorpd %xmm6, %xmm2
divsd %xmm8, %xmm2
mulsd %xmm2, %xmm6
addsd %xmm6, %xmm0
jmp 0xa913
xorpd %xmm2, %xmm2
jmp 0xa913
addsd %xmm5, %xmm5
addsd %xmm7, %xmm5
jmp 0xa8ec
addsd %xmm6, %xmm6
addsd %xmm8, %xmm6
addsd %xmm6, %xmm0
movsd 0xd745(%rip), %xmm2     # 0x18008
jmp 0xa913
addsd %xmm6, %xmm6
addsd %xmm8, %xmm6
addsd %xmm6, %xmm0
movsd 0xd72e(%rip), %xmm2     # 0x18008
xorpd %xmm1, %xmm1
jmp 0xa913
addsd %xmm5, %xmm5
addsd %xmm7, %xmm5
xorpd %xmm2, %xmm2
movsd 0xd714(%rip), %xmm1     # 0x18008
jmp 0xa90f
addsd %xmm6, %xmm6
addsd %xmm8, %xmm6
movsd 0xd701(%rip), %xmm2     # 0x18008
xorpd %xmm1, %xmm1
movapd %xmm6, %xmm5
addsd %xmm5, %xmm0
movsd 0xd6ed(%rip), %xmm3     # 0x18008
subsd %xmm2, %xmm3
subsd %xmm1, %xmm3
movsd %xmm3, (%rbx)
movsd %xmm2, 0x8(%rbx)
movsd %xmm1, 0x10(%rbx)
xorpd %xmm1, %xmm1
maxsd %xmm0, %xmm1
movapd %xmm1, %xmm0
addq $0x68, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq