// File: /workspace/github_c_makefile_star2_O1/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 $0x58, %rsp
movq %r8, %rbx
movq %rcx, %r15
movq %rdx, %r12
movsd (%rsi), %xmm0
subsd (%rdi), %xmm0
leaq 0x40(%rsp), %r14
movsd %xmm0, (%r14)
movsd 0x8(%rsi), %xmm0
subsd 0x8(%rdi), %xmm0
movsd %xmm0, 0x8(%r14)
movsd 0x10(%rsi), %xmm0
subsd 0x10(%rdi), %xmm0
movsd %xmm0, 0x10(%r14)
movq %rdx, %rdi
movq %rdx, %rsi
callq 0x7f86
movsd %xmm0, 0x18(%rsp)
movq %r12, %rdi
movq %r15, %rsi
callq 0x7f86
movsd %xmm0, 0x10(%rsp)
movq %r15, %rdi
movq %r15, %rsi
callq 0x7f86
movsd %xmm0, 0x8(%rsp)
movq %r12, %rdi
movq %r14, %rsi
callq 0x7f86
movapd %xmm0, 0x30(%rsp)
movq %r15, %rdi
movq %r14, %rsi
callq 0x7f86
movapd %xmm0, 0x20(%rsp)
movq %r14, %rdi
movq %r14, %rsi
callq 0x7f86
movsd 0x10(%rsp), %xmm9
movsd 0x18(%rsp), %xmm8
movsd 0x8(%rsp), %xmm7
movapd 0x30(%rsp), %xmm6
movapd 0x20(%rsp), %xmm5
movapd %xmm9, %xmm1
mulsd %xmm9, %xmm1
movapd %xmm8, %xmm3
mulsd %xmm7, %xmm3
subsd %xmm1, %xmm3
movapd %xmm6, %xmm2
mulsd %xmm7, %xmm2
movapd %xmm9, %xmm1
mulsd %xmm5, %xmm1
subsd %xmm2, %xmm1
movapd %xmm5, %xmm4
mulsd %xmm8, %xmm4
movapd %xmm9, %xmm2
mulsd %xmm6, %xmm2
subsd %xmm4, %xmm2
movapd %xmm1, %xmm4
addsd %xmm2, %xmm4
ucomisd %xmm4, %xmm3
jae 0xb2ac
xorpd %xmm3, %xmm3
ucomisd %xmm1, %xmm3
jbe 0xb2fb
movapd %xmm9, %xmm1
addsd %xmm6, %xmm1
movapd %xmm7, %xmm3
addsd %xmm5, %xmm3
ucomisd %xmm1, %xmm3
jbe 0xb3f3
subsd %xmm1, %xmm3
movapd %xmm9, %xmm2
addsd %xmm9, %xmm2
movapd %xmm8, %xmm1
subsd %xmm2, %xmm1
addsd %xmm7, %xmm1
ucomisd %xmm1, %xmm3
jae 0xb51e
divsd %xmm1, %xmm3
movsd 0xeda8(%rip), %xmm2     # 0x1a008
subsd %xmm3, %xmm2
movapd %xmm9, %xmm1
mulsd %xmm2, %xmm1
mulsd %xmm3, %xmm8
addsd %xmm1, %xmm8
addsd %xmm6, %xmm6
addsd %xmm8, %xmm6
mulsd %xmm2, %xmm7
mulsd %xmm3, %xmm9
addsd %xmm7, %xmm9
addsd %xmm5, %xmm5
addsd %xmm9, %xmm5
mulsd %xmm2, %xmm5
mulsd %xmm3, %xmm6
addsd %xmm5, %xmm6
movapd %xmm3, %xmm1
jmp 0xb55a
xorpd %xmm4, %xmm4
ucomisd %xmm1, %xmm4
jbe 0xb39e
xorpd %xmm1, %xmm1
ucomisd %xmm2, %xmm4
jbe 0xb3d2
ucomisd %xmm6, %xmm1
jbe 0xb3d2
movapd 0x12336(%rip), %xmm1    # 0x1d610
xorpd %xmm6, %xmm1
ucomisd %xmm8, %xmm1
jae 0xb587
divsd %xmm8, %xmm1
mulsd %xmm1, %xmm6
addsd %xmm6, %xmm0
jmp 0xb59c
ucomisd %xmm2, %xmm3
jbe 0xb424
movapd %xmm9, %xmm1
addsd %xmm5, %xmm1
movapd %xmm8, %xmm3
addsd %xmm6, %xmm3
ucomisd %xmm1, %xmm3
jbe 0xb535
subsd %xmm1, %xmm3
movapd %xmm9, %xmm2
addsd %xmm9, %xmm2
movapd %xmm8, %xmm1
subsd %xmm2, %xmm1
addsd %xmm7, %xmm1
ucomisd %xmm1, %xmm3
jae 0xb5a2
divsd %xmm1, %xmm3
movsd 0xecb6(%rip), %xmm1     # 0x1a008
subsd %xmm3, %xmm1
movapd %xmm9, %xmm2
mulsd %xmm3, %xmm2
mulsd %xmm1, %xmm8
addsd %xmm2, %xmm8
addsd %xmm6, %xmm6
addsd %xmm8, %xmm6
mulsd %xmm3, %xmm7
mulsd %xmm1, %xmm9
addsd %xmm7, %xmm9
addsd %xmm5, %xmm5
addsd %xmm9, %xmm5
mulsd %xmm3, %xmm5
mulsd %xmm1, %xmm6
addsd %xmm6, %xmm5
movapd %xmm3, %xmm2
jmp 0xb5d1
ucomisd %xmm2, %xmm4
jbe 0xb4bc
xorpd %xmm2, %xmm2
ucomisd %xmm2, %xmm6
jae 0xb560
movapd 0x12252(%rip), %xmm1    # 0x1d610
xorpd %xmm6, %xmm1
ucomisd %xmm8, %xmm1
jb 0xb551
jmp 0xb570
ucomisd %xmm1, %xmm5
jae 0xb59c
movapd 0x1222c(%rip), %xmm2    # 0x1d610
xorpd %xmm5, %xmm2
ucomisd %xmm7, %xmm2
jb 0xb417
jmp 0xb505
xorpd %xmm1, %xmm1
ucomisd %xmm3, %xmm1
jae 0xb505
ucomisd %xmm1, %xmm5
jae 0xb59c
movapd 0x121fd(%rip), %xmm2    # 0x1d610
xorpd %xmm5, %xmm2
divsd %xmm7, %xmm2
mulsd %xmm2, %xmm5
jmp 0xb5d1
movapd %xmm7, %xmm3
addsd %xmm5, %xmm3
subsd %xmm9, %xmm3
subsd %xmm6, %xmm3
xorpd %xmm1, %xmm1
ucomisd %xmm3, %xmm1
jae 0xb566
movapd %xmm9, %xmm2
addsd %xmm9, %xmm2
movapd %xmm8, %xmm1
subsd %xmm2, %xmm1
addsd %xmm7, %xmm1
ucomisd %xmm1, %xmm3
jae 0xb5b8
divsd %xmm1, %xmm3
movsd 0xeb98(%rip), %xmm2     # 0x1a008
subsd %xmm3, %xmm2
movapd %xmm9, %xmm1
mulsd %xmm2, %xmm1
mulsd %xmm3, %xmm8
addsd %xmm1, %xmm8
addsd %xmm6, %xmm6
addsd %xmm8, %xmm6
mulsd %xmm2, %xmm7
mulsd %xmm3, %xmm9
addsd %xmm7, %xmm9
addsd %xmm5, %xmm5
addsd %xmm9, %xmm5
mulsd %xmm2, %xmm5
mulsd %xmm3, %xmm6
addsd %xmm6, %xmm5
movapd %xmm3, %xmm1
jmp 0xb5d1
divsd %xmm3, %xmm1
divsd %xmm3, %xmm2
movapd %xmm9, %xmm3
mulsd %xmm2, %xmm3
mulsd %xmm1, %xmm8
addsd %xmm3, %xmm8
addsd %xmm6, %xmm6
addsd %xmm8, %xmm6
mulsd %xmm2, %xmm7
mulsd %xmm1, %xmm9
addsd %xmm7, %xmm9
addsd %xmm5, %xmm5
addsd %xmm9, %xmm5
mulsd %xmm2, %xmm5
mulsd %xmm1, %xmm6
addsd %xmm5, %xmm6
jmp 0xb55a
addsd %xmm5, %xmm5
addsd %xmm7, %xmm5
addsd %xmm5, %xmm0
movsd 0xeaef(%rip), %xmm2     # 0x1a008
jmp 0xb5d5
addsd %xmm6, %xmm6
addsd %xmm8, %xmm6
movsd 0xead9(%rip), %xmm1     # 0x1a008
xorpd %xmm2, %xmm2
jmp 0xb55a
xorpd %xmm2, %xmm2
ucomisd %xmm3, %xmm2
jae 0xb570
ucomisd %xmm2, %xmm6
jae 0xb560
movapd 0x120c3(%rip), %xmm1    # 0x1d610
xorpd %xmm6, %xmm1
divsd %xmm8, %xmm1
mulsd %xmm1, %xmm6
addsd %xmm6, %xmm0
jmp 0xb5d5
xorpd %xmm1, %xmm1
jmp 0xb5d5
addsd %xmm5, %xmm5
addsd %xmm7, %xmm5
jmp 0xb5ae
addsd %xmm6, %xmm6
addsd %xmm8, %xmm6
addsd %xmm6, %xmm0
movsd 0xea83(%rip), %xmm1     # 0x1a008
jmp 0xb5d5
addsd %xmm6, %xmm6
addsd %xmm8, %xmm6
addsd %xmm6, %xmm0
movsd 0xea6c(%rip), %xmm1     # 0x1a008
xorpd %xmm2, %xmm2
jmp 0xb5d5
addsd %xmm5, %xmm5
addsd %xmm7, %xmm5
xorpd %xmm1, %xmm1
movsd 0xea52(%rip), %xmm2     # 0x1a008
jmp 0xb5d1
addsd %xmm6, %xmm6
addsd %xmm8, %xmm6
movsd 0xea3f(%rip), %xmm1     # 0x1a008
xorpd %xmm2, %xmm2
movapd %xmm6, %xmm5
addsd %xmm5, %xmm0
movsd 0xea2b(%rip), %xmm3     # 0x1a008
subsd %xmm1, %xmm3
subsd %xmm2, %xmm3
movsd %xmm3, (%rbx)
movsd %xmm1, 0x8(%rbx)
movsd %xmm2, 0x10(%rbx)
xorpd %xmm1, %xmm1
maxsd %xmm0, %xmm1
movapd %xmm1, %xmm0
addq $0x58, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq