// File: /workspace/github_cpp_makefile_star2_O2/sundale[P]gcode/rs274ngc/interp_arc.cc
// Function: Interp::arc_data_comp_ijk(int, int, int, double, double, double, double, double, int, double, double, double*, double*, int*, double)
int Interp::arc_data_comp_ijk(int move,  //!<either G_2 (cw arc) or G_3 (ccw arc)
                              int plane, //!<active plane
                             int side,  //!<either RIGHT or LEFT
                             double tool_radius,        //!<radius of the tool
                             double current_x,  //!<first coordinate of current point
                             double current_y,  //!<second coordinate of current point
                             double end_x,      //!<first coordinate of arc end point
                             double end_y,      //!<second coordinate of arc end point
                             int ij_absolute,   //!<how to interpret i/j numbers
                             double i_number,   //!<first coordinate of center (abs or incr)
                             double j_number,   //!<second coordinate of center (abs or incr)
                             double *center_x,  //!<pointer to first coordinate of center of arc
                             double *center_y,  //!<pointer to second coordinate of center of arc
                             int *turn, //!<pointer to number of full or partial circles CCW
                             double tolerance)  //!<tolerance of differing radii
{
  double arc_radius;
  double radius2;
  double min_radius = 0.1 * tolerance;	/* smaller than this is treated as zero */
  char a = arc_axis1(plane), b = arc_axis2(plane);

  if ( ij_absolute ) {
    *center_x = (i_number);
    *center_y = (j_number);
  } else {
    *center_x = (current_x + i_number);
    *center_y = (current_y + j_number);
  }
  arc_radius = hypot((*center_x - current_x), (*center_y - current_y));
  radius2 = hypot((*center_x - end_x), (*center_y - end_y));
  CHKS(((arc_radius < min_radius) || (radius2 < min_radius)), _("Zero radius arc"));
  CHKS((fabs(arc_radius - radius2) > tolerance),
      _("Radius to end of arc differs from radius to start: "
       "start=(%c%.4f,%c%.4f) center=(%c%.4f,%c%.4f) end=(%c%.4f,%c%.4f) r1=%.4f r2=%.4f"),
       a, current_x, b, current_y, 
       a, *center_x, b, *center_y, 
       a, end_x, b, end_y, arc_radius, radius2);

  CHKS(((arc_radius <= tool_radius) && (((side == LEFT) && (move == G_3)) ||
                                       ((side == RIGHT) && (move == G_2)))),
      NCE_TOOL_RADIUS_NOT_LESS_THAN_ARC_RADIUS_WITH_COMP);

  /* This catches an arc too small for the tool, also */
  if (move == G_2)
    *turn = -1;
  else if (move == G_3)
    *turn = 1;
  else
    ERS(NCE_BUG_CODE_NOT_G2_OR_G3);
  return INTERP_OK;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x58, %rsp
movq %r9, %r13
movsd %xmm4, -0x58(%rbp)
movsd %xmm3, -0x50(%rbp)
movsd %xmm0, -0x60(%rbp)
movl %ecx, -0x2c(%rbp)
movl %edx, %r14d
movl %esi, %r15d
movq %rdi, -0x38(%rbp)
leal -0x1(%r14), %eax
cmpl $0x2, %eax
ja 0xc9f8
addl $0x57, %r14d
movl %eax, %eax
leaq 0x2197a(%rip), %rcx     # 0x2e36c
movl (%rcx,%rax,4), %r12d
jmp 0xc9ff
pushq $0x21
popq %r14
movl %r14d, %r12d
movq 0x10(%rbp), %rbx
movsd 0x215f5(%rip), %xmm0    # 0x2e000
mulsd %xmm7, %xmm0
testl %r8d, %r8d
movsd %xmm7, -0x78(%rbp)
movsd %xmm0, -0x40(%rbp)
jne 0xca26
addsd %xmm1, %xmm5
addsd %xmm2, %xmm6
movsd %xmm5, (%r13)
movsd %xmm6, (%rbx)
movsd (%r13), %xmm0
movsd %xmm1, -0x68(%rbp)
subsd %xmm1, %xmm0
movsd %xmm2, -0x70(%rbp)
subsd %xmm2, %xmm6
movapd %xmm6, %xmm1
callq 0xb2c0
movsd %xmm0, -0x48(%rbp)
movsd (%r13), %xmm0
subsd -0x50(%rbp), %xmm0
movsd (%rbx), %xmm1
subsd -0x58(%rbp), %xmm1
callq 0xb2c0
movsd -0x48(%rbp), %xmm1
movsd -0x40(%rbp), %xmm2
ucomisd %xmm1, %xmm2
ja 0xcafb
ucomisd %xmm0, %xmm2
ja 0xcafb
movapd %xmm1, %xmm2
subsd %xmm0, %xmm2
andpd 0x2158b(%rip), %xmm2    # 0x2e020
ucomisd -0x78(%rbp), %xmm2
jbe 0xcb56
leaq 0x21646(%rip), %rdi     # 0x2e0ed
movsd %xmm0, -0x40(%rbp)
callq 0xb220
movsd (%r13), %xmm2
movsd (%rbx), %xmm3
movq -0x38(%rbp), %rdi
movq %rax, %rsi
movl %r14d, %edx
movsd -0x68(%rbp), %xmm0
movl %r12d, %ecx
movsd -0x70(%rbp), %xmm1
movl %r14d, %r8d
movl %r12d, %r9d
movsd -0x50(%rbp), %xmm4
movsd -0x58(%rbp), %xmm5
movsd -0x48(%rbp), %xmm6
movsd -0x40(%rbp), %xmm7
movb $0x8, %al
pushq %r12
pushq %r14
callq 0xb8e0
popq %rax
popq %rcx
jmp 0xcb15
leaq 0x2154e(%rip), %rdi     # 0x2e050
callq 0xb220
movq -0x38(%rbp), %rdi
movq %rax, %rsi
xorl %eax, %eax
callq 0xb8e0
movq 0x30444(%rip), %rbx     # 0x3cf60
leaq 0xc6d0(%rbx), %rdi
leaq 0x21536(%rip), %rsi     # 0x2e060
pushq $0x50
popq %rdx
callq 0xb940
andw $0x0, 0xc71f(%rbx)
movl $0x1, 0xd670(%rbx)
pushq $0x5
popq %rax
addq $0x58, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movsd -0x60(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jae 0xcb71
cmpl $0x14, %r15d
je 0xcb9d
cmpl $0x1e, %r15d
jne 0xcbaa
pushq $0x1
jmp 0xcb9f
movl -0x2c(%rbp), %eax
xorl $0x2, %eax
movl %r15d, %ecx
xorl $0x1e, %ecx
orl %eax, %ecx
je 0xcb91
movl -0x2c(%rbp), %ecx
xorl $0x1, %ecx
movl %r15d, %eax
xorl $0x14, %eax
orl %ecx, %eax
jne 0xcb61
leaq 0x215d9(%rip), %rdi     # 0x2e171
jmp 0xcb02
pushq $-0x1
popq %rax
movq 0x18(%rbp), %rcx
movl %eax, (%rcx)
xorl %eax, %eax
jmp 0xcb47
leaq 0x215ef(%rip), %rdi     # 0x2e1a0
jmp 0xcb02