// File: /workspace/github_cpp_makefile_star2_O1/micahcc[P]polygon_skeleton/voronoi.cpp
// Function: solveCircle(Vector const&, Vector const&, Vector const&)
Circle solveCircle(const Point& p, const Point& q, const Point& r)
{
    // find minimal point
    Circle circle;
    circle.center.x =
        0.5*(p.y*sqr(q.x) + p.y*sqr(q.y) - (p.y - q.y)*sqr(r.x) -
                (p.y - q.y)*sqr(r.y) - (sqr(p.x) + sqr(p.y))*q.y +
                (sqr(p.x) + sqr(p.y) - sqr(q.x) - sqr(q.y))*r.y) /
        (p.y*q.x - p.x*q.y - (p.y - q.y)*r.x + (p.x - q.x)*r.y);

    circle.center.y =
        -0.5*(p.x*sqr(q.x) + p.x*sqr(q.y) - (p.x - q.x)*sqr(r.x) -
                (p.x - q.x)*sqr(r.y) - (sqr(p.x) + sqr(p.y))*q.x +
                (sqr(p.x) + sqr(p.y) - sqr(q.x) - sqr(q.y))*r.x) /
        (p.y*q.x - p.x*q.y - (p.y - q.y)*r.x + (p.x - q.x)*r.y);

    circle.radius = sqrt(sqr(p.x - circle.center.x) + sqr(p.y - circle.center.y));
    return circle;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x20, %rsp
movss (%rdi), %xmm6
movss 0x4(%rdi), %xmm9
cvtss2sd %xmm9, %xmm3
movss (%rsi), %xmm0
movss %xmm0, -0x10(%rbp)
movss 0x4(%rsi), %xmm5
cvtss2sd %xmm0, %xmm10
xorps %xmm0, %xmm0
cvtss2sd %xmm5, %xmm0
movaps %xmm0, %xmm4
mulsd %xmm0, %xmm4
movapd %xmm4, %xmm11
mulsd %xmm3, %xmm11
movapd %xmm3, %xmm7
cvtss2sd %xmm6, %xmm8
movsd %xmm8, -0x20(%rbp)
mulsd %xmm8, %xmm8
mulsd %xmm3, %xmm3
addsd %xmm8, %xmm3
mulsd %xmm3, %xmm0
movsd %xmm0, -0x18(%rbp)
movapd %xmm3, %xmm8
mulsd %xmm10, %xmm3
movapd %xmm10, %xmm12
mulsd %xmm10, %xmm12
mulsd %xmm12, %xmm7
addsd %xmm11, %xmm7
movaps %xmm9, %xmm14
subss %xmm5, %xmm14
movss (%rdx), %xmm15
movss 0x4(%rdx), %xmm11
xorps %xmm10, %xmm10
cvtss2sd %xmm11, %xmm10
movaps %xmm10, %xmm13
subsd %xmm12, %xmm8
subsd %xmm4, %xmm8
mulsd %xmm8, %xmm10
cvtss2sd %xmm15, %xmm2
mulsd %xmm2, %xmm8
mulsd %xmm2, %xmm2
cvtss2sd %xmm14, %xmm1
movaps %xmm1, %xmm0
mulsd %xmm2, %xmm0
subsd %xmm0, %xmm7
mulsd %xmm13, %xmm13
mulsd %xmm13, %xmm1
subsd %xmm1, %xmm7
subsd -0x18(%rbp), %xmm7
addsd %xmm7, %xmm10
mulss %xmm6, %xmm5
movaps %xmm9, %xmm0
movss -0x10(%rbp), %xmm7
mulss %xmm7, %xmm0
subss %xmm5, %xmm0
mulss %xmm15, %xmm14
subss %xmm14, %xmm0
movaps %xmm6, %xmm1
subss %xmm7, %xmm1
mulss %xmm1, %xmm11
addss %xmm0, %xmm11
movsd -0x20(%rbp), %xmm0
mulsd %xmm0, %xmm4
mulsd %xmm0, %xmm12
addsd %xmm4, %xmm12
xorps %xmm0, %xmm0
cvtss2sd %xmm1, %xmm0
mulsd %xmm0, %xmm2
subsd %xmm2, %xmm12
mulsd %xmm0, %xmm13
subsd %xmm13, %xmm12
subsd %xmm3, %xmm12
addsd %xmm12, %xmm8
mulsd 0x80d6(%rip), %xmm10    # 0xf240
xorps %xmm0, %xmm0
cvtss2sd %xmm11, %xmm0
divsd %xmm0, %xmm10
mulsd 0x80d0(%rip), %xmm8     # 0xf250
divsd %xmm0, %xmm8
xorps %xmm2, %xmm2
cvtsd2ss %xmm10, %xmm2
xorps %xmm0, %xmm0
cvtsd2ss %xmm8, %xmm0
subss %xmm2, %xmm6
unpcklps %xmm0, %xmm2            # xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
subss %xmm0, %xmm9
xorps %xmm1, %xmm1
cvtss2sd %xmm6, %xmm1
mulsd %xmm1, %xmm1
xorps %xmm0, %xmm0
cvtss2sd %xmm9, %xmm0
mulsd %xmm0, %xmm0
addsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x71cc
sqrtsd %xmm0, %xmm0
jmp 0x71d9
movaps %xmm2, -0x10(%rbp)
callq 0x31e0
movaps -0x10(%rbp), %xmm2
xorps %xmm1, %xmm1
cvtsd2ss %xmm0, %xmm1
movaps %xmm2, %xmm0
addq $0x20, %rsp
popq %rbp
retq
nop