// File: /workspace/github_c_makefile_star2_O3/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 0x7e36
movapd %xmm0, 0x40(%rsp)
movq %r12, %rdi
movq %r14, %rsi
callq 0x7e36
movapd %xmm0, 0x30(%rsp)
movq %r14, %rdi
movq %r14, %rsi
callq 0x7e36
movapd %xmm0, 0x20(%rsp)
movq %r12, %rdi
movq %r15, %rsi
callq 0x7e36
movapd %xmm0, 0x10(%rsp)
movq %r14, %rdi
movq %r15, %rsi
callq 0x7e36
movapd %xmm0, (%rsp)
movq %r15, %rdi
movq %r15, %rsi
callq 0x7e36
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 0xae5c
xorpd %xmm3, %xmm3
ucomisd %xmm2, %xmm3
jbe 0xaeab
movapd %xmm9, %xmm1
addsd %xmm6, %xmm1
movapd %xmm7, %xmm3
addsd %xmm5, %xmm3
ucomisd %xmm1, %xmm3
jbe 0xafa3
subsd %xmm1, %xmm3
movapd %xmm9, %xmm2
addsd %xmm9, %xmm2
movapd %xmm8, %xmm1
subsd %xmm2, %xmm1
addsd %xmm7, %xmm1
ucomisd %xmm1, %xmm3
jae 0xb0ce
divsd %xmm1, %xmm3
movsd 0xe1f8(%rip), %xmm1     # 0x19008
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 0xb10a
xorpd %xmm4, %xmm4
ucomisd %xmm2, %xmm4
jbe 0xaf4e
xorpd %xmm2, %xmm2
ucomisd %xmm1, %xmm4
jbe 0xaf82
ucomisd %xmm6, %xmm2
jbe 0xaf82
movapd 0x11796(%rip), %xmm2    # 0x1c620
xorpd %xmm6, %xmm2
ucomisd %xmm8, %xmm2
jae 0xb137
divsd %xmm8, %xmm2
mulsd %xmm2, %xmm6
addsd %xmm6, %xmm0
jmp 0xb14c
ucomisd %xmm1, %xmm3
jbe 0xafd4
movapd %xmm9, %xmm1
addsd %xmm5, %xmm1
movapd %xmm8, %xmm3
addsd %xmm6, %xmm3
ucomisd %xmm1, %xmm3
jbe 0xb0e5
subsd %xmm1, %xmm3
movapd %xmm9, %xmm2
addsd %xmm9, %xmm2
movapd %xmm8, %xmm1
subsd %xmm2, %xmm1
addsd %xmm7, %xmm1
ucomisd %xmm1, %xmm3
jae 0xb152
divsd %xmm1, %xmm3
movsd 0xe106(%rip), %xmm2     # 0x19008
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 0xb181
ucomisd %xmm1, %xmm4
jbe 0xb06c
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm6
jae 0xb110
movapd 0x116b2(%rip), %xmm2    # 0x1c620
xorpd %xmm6, %xmm2
ucomisd %xmm8, %xmm2
jb 0xb101
jmp 0xb120
ucomisd %xmm2, %xmm5
jae 0xb14c
movapd 0x1168c(%rip), %xmm1    # 0x1c620
xorpd %xmm5, %xmm1
ucomisd %xmm7, %xmm1
jb 0xafc7
jmp 0xb0b5
xorpd %xmm2, %xmm2
ucomisd %xmm3, %xmm2
jae 0xb0b5
ucomisd %xmm2, %xmm5
jae 0xb14c
movapd 0x1165d(%rip), %xmm1    # 0x1c620
xorpd %xmm5, %xmm1
divsd %xmm7, %xmm1
mulsd %xmm1, %xmm5
jmp 0xb181
movapd %xmm7, %xmm3
addsd %xmm5, %xmm3
subsd %xmm9, %xmm3
subsd %xmm6, %xmm3
xorpd %xmm2, %xmm2
ucomisd %xmm3, %xmm2
jae 0xb116
movapd %xmm9, %xmm2
addsd %xmm9, %xmm2
movapd %xmm8, %xmm1
subsd %xmm2, %xmm1
addsd %xmm7, %xmm1
ucomisd %xmm1, %xmm3
jae 0xb168
divsd %xmm1, %xmm3
movsd 0xdfe8(%rip), %xmm1     # 0x19008
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 0xb181
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 0xb10a
addsd %xmm5, %xmm5
addsd %xmm7, %xmm5
addsd %xmm5, %xmm0
movsd 0xdf3f(%rip), %xmm1     # 0x19008
jmp 0xb185
addsd %xmm6, %xmm6
addsd %xmm8, %xmm6
movsd 0xdf29(%rip), %xmm2     # 0x19008
xorpd %xmm1, %xmm1
jmp 0xb10a
xorpd %xmm1, %xmm1
ucomisd %xmm3, %xmm1
jae 0xb120
ucomisd %xmm1, %xmm6
jae 0xb110
movapd 0x11523(%rip), %xmm2    # 0x1c620
xorpd %xmm6, %xmm2
divsd %xmm8, %xmm2
mulsd %xmm2, %xmm6
addsd %xmm6, %xmm0
jmp 0xb185
xorpd %xmm2, %xmm2
jmp 0xb185
addsd %xmm5, %xmm5
addsd %xmm7, %xmm5
jmp 0xb15e
addsd %xmm6, %xmm6
addsd %xmm8, %xmm6
addsd %xmm6, %xmm0
movsd 0xded3(%rip), %xmm2     # 0x19008
jmp 0xb185
addsd %xmm6, %xmm6
addsd %xmm8, %xmm6
addsd %xmm6, %xmm0
movsd 0xdebc(%rip), %xmm2     # 0x19008
xorpd %xmm1, %xmm1
jmp 0xb185
addsd %xmm5, %xmm5
addsd %xmm7, %xmm5
xorpd %xmm2, %xmm2
movsd 0xdea2(%rip), %xmm1     # 0x19008
jmp 0xb181
addsd %xmm6, %xmm6
addsd %xmm8, %xmm6
movsd 0xde8f(%rip), %xmm2     # 0x19008
xorpd %xmm1, %xmm1
movapd %xmm6, %xmm5
addsd %xmm5, %xmm0
movsd 0xde7b(%rip), %xmm3     # 0x19008
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