// File: hzeller[P]gcode-multi-shell-extrude/third_party/clipper.cpp
// Function: ClipperLib::IntersectPoint(ClipperLib::TEdge&, ClipperLib::TEdge&, ClipperLib::IntPoint&, bool)
bool IntersectPoint(TEdge &Edge1, TEdge &Edge2,
  IntPoint &ip, bool UseFullInt64Range)
{
#ifdef use_xyz  
  ip.Z = 0;
#endif
  double b1, b2;
  //nb: with very large coordinate values, it's possible for SlopesEqual() to 
  //return false but for the edge.Dx value be equal due to double precision rounding.
  if (SlopesEqual(Edge1, Edge2, UseFullInt64Range) || Edge1.Dx == Edge2.Dx)
  {
    if (Edge2.Bot.Y > Edge1.Bot.Y) ip = Edge2.Bot;
    else ip = Edge1.Bot;
    return false;
  }
  else if (Edge1.Delta.X == 0)
  {
    ip.X = Edge1.Bot.X;
    if (IsHorizontal(Edge2))
      ip.Y = Edge2.Bot.Y;
    else
    {
      b2 = Edge2.Bot.Y - (Edge2.Bot.X / Edge2.Dx);
      ip.Y = Round(ip.X / Edge2.Dx + b2);
    }
  }
  else if (Edge2.Delta.X == 0)
  {
    ip.X = Edge2.Bot.X;
    if (IsHorizontal(Edge1))
      ip.Y = Edge1.Bot.Y;
    else
    {
      b1 = Edge1.Bot.Y - (Edge1.Bot.X / Edge1.Dx);
      ip.Y = Round(ip.X / Edge1.Dx + b1);
    }
  } 
  else 
  {
    b1 = Edge1.Bot.X - Edge1.Bot.Y * Edge1.Dx;
    b2 = Edge2.Bot.X - Edge2.Bot.Y * Edge2.Dx;
    double q = (b2-b1) / (Edge1.Dx - Edge2.Dx);
    ip.Y = Round(q);
    if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx))
      ip.X = Round(Edge1.Dx * q + b1);
    else 
      ip.X = Round(Edge2.Dx * q + b2);
  }

  if (ip.Y < Edge1.Top.Y || ip.Y < Edge2.Top.Y) 
  {
    if (Edge1.Top.Y > Edge2.Top.Y)
      ip.Y = Edge1.Top.Y;
    else
      ip.Y = Edge2.Top.Y;
    if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx))
      ip.X = TopX(Edge1, ip.Y);
    else
      ip.X = TopX(Edge2, ip.Y);
  } 
  return true;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movb %cl, %al
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
andb $0x1, %al
movb %al, -0x21(%rbp)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
movb -0x21(%rbp), %al
andb $0x1, %al
movzbl %al, %edx
callq 0x118c0
testb $0x1, %al
jne 0x11b3a
movq -0x10(%rbp), %rax
movsd 0x40(%rax), %xmm0
movq -0x18(%rbp), %rax
ucomisd 0x40(%rax), %xmm0
jne 0x11b83
jp 0x11b83
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x10(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jle 0x11b64
movq -0x18(%rbp), %rcx
movq -0x20(%rbp), %rax
movq (%rcx), %rdx
movq %rdx, (%rax)
movq 0x8(%rcx), %rcx
movq %rcx, 0x8(%rax)
jmp 0x11b7a
movq -0x10(%rbp), %rcx
movq -0x20(%rbp), %rax
movq (%rcx), %rdx
movq %rdx, (%rax)
movq 0x8(%rcx), %rcx
movq %rcx, 0x8(%rax)
movb $0x0, -0x1(%rbp)
jmp 0x11ead
movq -0x10(%rbp), %rax
cmpq $0x0, 0x30(%rax)
jne 0x11c12
movq -0x10(%rbp), %rax
movq (%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, (%rax)
movq -0x18(%rbp), %rdi
callq 0x20510
testb $0x1, %al
jne 0x11baf
jmp 0x11bc1
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x8(%rax)
jmp 0x11c0d
movq -0x18(%rbp), %rax
cvtsi2sdq 0x8(%rax), %xmm0
movq -0x18(%rbp), %rax
cvtsi2sdq (%rax), %xmm1
movq -0x18(%rbp), %rax
divsd 0x40(%rax), %xmm1
subsd %xmm1, %xmm0
movsd %xmm0, -0x38(%rbp)
movq -0x20(%rbp), %rax
cvtsi2sdq (%rax), %xmm0
movq -0x18(%rbp), %rax
divsd 0x40(%rax), %xmm0
addsd -0x38(%rbp), %xmm0
callq 0x20530
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x8(%rax)
jmp 0x11de3
movq -0x18(%rbp), %rax
cmpq $0x0, 0x30(%rax)
jne 0x11ca1
movq -0x18(%rbp), %rax
movq (%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rdi
callq 0x20510
testb $0x1, %al
jne 0x11c3e
jmp 0x11c50
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x8(%rax)
jmp 0x11c9c
movq -0x10(%rbp), %rax
cvtsi2sdq 0x8(%rax), %xmm0
movq -0x10(%rbp), %rax
cvtsi2sdq (%rax), %xmm1
movq -0x10(%rbp), %rax
divsd 0x40(%rax), %xmm1
subsd %xmm1, %xmm0
movsd %xmm0, -0x30(%rbp)
movq -0x20(%rbp), %rax
cvtsi2sdq (%rax), %xmm0
movq -0x10(%rbp), %rax
divsd 0x40(%rax), %xmm0
addsd -0x30(%rbp), %xmm0
callq 0x20530
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x8(%rax)
jmp 0x11de1
movq -0x10(%rbp), %rax
cvtsi2sdq (%rax), %xmm1
movq -0x10(%rbp), %rax
cvtsi2sdq 0x8(%rax), %xmm0
movq -0x10(%rbp), %rax
movsd 0x40(%rax), %xmm2
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x30(%rbp)
movq -0x18(%rbp), %rax
cvtsi2sdq (%rax), %xmm1
movq -0x18(%rbp), %rax
cvtsi2sdq 0x8(%rax), %xmm0
movq -0x18(%rbp), %rax
movsd 0x40(%rax), %xmm2
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x38(%rbp)
movsd -0x38(%rbp), %xmm0
subsd -0x30(%rbp), %xmm0
movq -0x10(%rbp), %rax
movsd 0x40(%rax), %xmm1
movq -0x18(%rbp), %rax
subsd 0x40(%rax), %xmm1
divsd %xmm1, %xmm0
movsd %xmm0, -0x40(%rbp)
movsd -0x40(%rbp), %xmm0
callq 0x20530
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movsd 0x40(%rax), %xmm1
movaps 0x1a145(%rip), %xmm0    # 0x2beb0
pand %xmm0, %xmm1
movq -0x18(%rbp), %rax
movsd 0x40(%rax), %xmm0
movaps 0x1a131(%rip), %xmm2    # 0x2beb0
pand %xmm2, %xmm0
ucomisd %xmm1, %xmm0
jbe 0x11db5
movq -0x10(%rbp), %rax
movsd 0x40(%rax), %xmm0
movsd -0x40(%rbp), %xmm2
movsd -0x30(%rbp), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
callq 0x20530
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, (%rax)
jmp 0x11ddf
movq -0x18(%rbp), %rax
movsd 0x40(%rax), %xmm0
movsd -0x40(%rbp), %xmm2
movsd -0x38(%rbp), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
callq 0x20530
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, (%rax)
jmp 0x11de1
jmp 0x11de3
jmp 0x11de5
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x10(%rbp), %rcx
cmpq 0x28(%rcx), %rax
jl 0x11e0d
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x18(%rbp), %rcx
cmpq 0x28(%rcx), %rax
jge 0x11ea9
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq -0x18(%rbp), %rcx
cmpq 0x28(%rcx), %rax
jle 0x11e31
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x8(%rax)
jmp 0x11e41
movq -0x18(%rbp), %rax
movq 0x28(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movsd 0x40(%rax), %xmm1
movaps 0x1a05f(%rip), %xmm0    # 0x2beb0
pand %xmm0, %xmm1
movq -0x18(%rbp), %rax
movsd 0x40(%rax), %xmm0
movaps 0x1a04b(%rip), %xmm2    # 0x2beb0
pand %xmm2, %xmm0
ucomisd %xmm1, %xmm0
jbe 0x11e8c
movq -0x10(%rbp), %rdi
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x20580
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, (%rax)
jmp 0x11ea7
movq -0x18(%rbp), %rdi
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x20580
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, (%rax)
jmp 0x11ea9
movb $0x1, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x40, %rsp
popq %rbp
retq
nopl (%rax,%rax)