// File: hzeller[P]gcode-multi-shell-extrude/third_party/clipper.cpp
// Function: ClipperLib::Clipper::AddLocalMinPoly(ClipperLib::TEdge*, ClipperLib::TEdge*, ClipperLib::IntPoint const&)
OutPt* Clipper::AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt)
{
  OutPt* result;
  TEdge *e, *prevE;
  if (IsHorizontal(*e2) || ( e1->Dx > e2->Dx ))
  {
    result = AddOutPt(e1, Pt);
    e2->OutIdx = e1->OutIdx;
    e1->Side = esLeft;
    e2->Side = esRight;
    e = e1;
    if (e->PrevInAEL == e2)
      prevE = e2->PrevInAEL; 
    else
      prevE = e->PrevInAEL;
  } else
  {
    result = AddOutPt(e2, Pt);
    e1->OutIdx = e2->OutIdx;
    e1->Side = esRight;
    e2->Side = esLeft;
    e = e2;
    if (e->PrevInAEL == e1)
        prevE = e1->PrevInAEL;
    else
        prevE = e->PrevInAEL;
  }

  if (prevE && prevE->OutIdx >= 0 &&
      (TopX(*prevE, Pt.Y) == TopX(*e, Pt.Y)) &&
      SlopesEqual(*e, *prevE, m_UseFullRange) &&
      (e->WindDelta != 0) && (prevE->WindDelta != 0))
  {
    OutPt* outPt = AddOutPt(prevE, Pt);
    AddJoin(result, outPt, e->Top);
  }
  return result;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x18(%rbp), %rdi
callq 0x20510
testb $0x1, %al
jne 0x17421
movq -0x10(%rbp), %rax
movsd 0x40(%rax), %xmm0
movq -0x18(%rbp), %rax
ucomisd 0x40(%rax), %xmm0
jbe 0x17495
movq -0x58(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x175e0
movq %rax, -0x28(%rbp)
movq -0x10(%rbp), %rax
movl 0x5c(%rax), %ecx
movq -0x18(%rbp), %rax
movl %ecx, 0x5c(%rax)
movq -0x10(%rbp), %rax
movl $0x1, 0x4c(%rax)
movq -0x18(%rbp), %rax
movl $0x2, 0x4c(%rax)
movq -0x10(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rax
movq 0x80(%rax), %rax
cmpq -0x18(%rbp), %rax
jne 0x17484
movq -0x18(%rbp), %rax
movq 0x80(%rax), %rax
movq %rax, -0x38(%rbp)
jmp 0x17493
movq -0x30(%rbp), %rax
movq 0x80(%rax), %rax
movq %rax, -0x38(%rbp)
jmp 0x17509
movq -0x58(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x175e0
movq %rax, -0x28(%rbp)
movq -0x18(%rbp), %rax
movl 0x5c(%rax), %ecx
movq -0x10(%rbp), %rax
movl %ecx, 0x5c(%rax)
movq -0x10(%rbp), %rax
movl $0x2, 0x4c(%rax)
movq -0x18(%rbp), %rax
movl $0x1, 0x4c(%rax)
movq -0x18(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rax
movq 0x80(%rax), %rax
cmpq -0x10(%rbp), %rax
jne 0x174f8
movq -0x10(%rbp), %rax
movq 0x80(%rax), %rax
movq %rax, -0x38(%rbp)
jmp 0x17507
movq -0x30(%rbp), %rax
movq 0x80(%rax), %rax
movq %rax, -0x38(%rbp)
jmp 0x17509
cmpq $0x0, -0x38(%rbp)
je 0x175d1
movq -0x38(%rbp), %rax
cmpl $0x0, 0x5c(%rax)
jl 0x175d1
movq -0x38(%rbp), %rdi
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x20580
movq %rax, -0x60(%rbp)
movq -0x30(%rbp), %rdi
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x20580
movq %rax, %rcx
movq -0x60(%rbp), %rax
cmpq %rcx, %rax
jne 0x175d1
movq -0x58(%rbp), %rax
movq -0x30(%rbp), %rdi
movq -0x38(%rbp), %rsi
movq (%rax), %rcx
movq -0x18(%rcx), %rcx
movb 0x18(%rax,%rcx), %al
andb $0x1, %al
movzbl %al, %edx
callq 0x118c0
testb $0x1, %al
jne 0x1757b
jmp 0x175d1
movq -0x30(%rbp), %rax
cmpl $0x0, 0x50(%rax)
je 0x175d1
movq -0x38(%rbp), %rax
cmpl $0x0, 0x50(%rax)
je 0x175d1
movq -0x58(%rbp), %rdi
movq -0x38(%rbp), %rsi
movq -0x20(%rbp), %rdx
callq 0x175e0
movq -0x58(%rbp), %rdi
movq %rax, -0x40(%rbp)
movq -0x28(%rbp), %rsi
movq -0x40(%rbp), %rdx
movq -0x30(%rbp), %rax
movq 0x20(%rax), %rcx
movq %rcx, -0x50(%rbp)
movq 0x28(%rax), %rax
movq %rax, -0x48(%rbp)
movq -0x50(%rbp), %rcx
movq -0x48(%rbp), %r8
callq 0x17850
movq -0x28(%rbp), %rax
addq $0x60, %rsp
popq %rbp
retq
nopl (%rax,%rax)