// File: marxn[P]pupp/3rdparty/gmp/mpn/toom_interpolate_8pts.c
// Function: _gmpn_toom_interpolate_8pts
void
mpn_toom_interpolate_8pts (mp_ptr pp, mp_size_t n,
			   mp_ptr r3, mp_ptr r7,
			   mp_size_t spt, mp_ptr ws)
{
  mp_limb_signed_t cy;
  mp_ptr r5, r1;
  r5 = (pp + 3 * n);			/* 3n+1 */
  r1 = (pp + 7 * n);			/* spt */

  /******************************* interpolation *****************************/

  DO_mpn_subrsh(r3+n, 2 * n + 1, pp, 2 * n, 4, ws);
  cy = DO_mpn_sublsh_n (r3, r1, spt, 12, ws);
  MPN_DECR_U (r3 + spt, 3 * n + 1 - spt, cy);

  DO_mpn_subrsh(r5+n, 2 * n + 1, pp, 2 * n, 2, ws);
  cy = DO_mpn_sublsh_n (r5, r1, spt, 6, ws);
  MPN_DECR_U (r5 + spt, 3 * n + 1 - spt, cy);

  r7[3*n] -= mpn_sub_n (r7+n, r7+n, pp, 2 * n);
  cy = mpn_sub_n (r7, r7, r1, spt);
  MPN_DECR_U (r7 + spt, 3 * n + 1 - spt, cy);

  ASSERT_NOCARRY(mpn_sub_n (r3, r3, r5, 3 * n + 1));
  ASSERT_NOCARRY(mpn_rshift(r3, r3, 3 * n + 1, 2));

  ASSERT_NOCARRY(mpn_sub_n (r5, r5, r7, 3 * n + 1));

  ASSERT_NOCARRY(mpn_sub_n (r3, r3, r5, 3 * n + 1));

  mpn_divexact_by45 (r3, r3, 3 * n + 1);

  ASSERT_NOCARRY(mpn_divexact_by3 (r5, r5, 3 * n + 1));

  ASSERT_NOCARRY(DO_mpn_sublsh2_n (r5, r3, 3 * n + 1, ws));

  /* last interpolation steps... */
  /* ... are mixed with recomposition */

  /***************************** recomposition *******************************/
  /*
    pp[] prior to operations:
     |_H r1|_L r1|____||_H r5|_M_r5|_L r5|_____|_H r8|_L r8|pp

    summation scheme for remaining operations:
     |____8|n___7|n___6|n___5|n___4|n___3|n___2|n____|n____|pp
     |_H r1|_L r1|____||_H*r5|_M r5|_L r5|_____|_H_r8|_L r8|pp
	  ||_H r3|_M r3|_L*r3|
				  ||_H_r7|_M_r7|_L_r7|
		      ||-H r3|-M r3|-L*r3|
				  ||-H*r5|-M_r5|-L_r5|
  */

  cy = mpn_add_n (pp + n, pp + n, r7, n); /* Hr8+Lr7-Lr5 */
  cy-= mpn_sub_n (pp + n, pp + n, r5, n);
  if (0 > cy)
    MPN_DECR_U (r7 + n, 2*n + 1, 1);
  else
    MPN_INCR_U (r7 + n, 2*n + 1, cy);

  cy = mpn_sub_n (pp + 2*n, r7 + n, r5 + n, n); /* Mr7-Mr5 */
  MPN_DECR_U (r7 + 2*n, n + 1, cy);

  cy = mpn_add_n (pp + 3*n, r5, r7+ 2*n, n+1); /* Hr7+Lr5 */
  r5[3*n]+= mpn_add_n (r5 + 2*n, r5 + 2*n, r3, n); /* Hr5+Lr3 */
  cy-= mpn_sub_n (pp + 3*n, pp + 3*n, r5 + 2*n, n+1); /* Hr7-Hr5+Lr5-Lr3 */
  if (UNLIKELY(0 > cy))
    MPN_DECR_U (r5 + n + 1, 2*n, 1);
  else
    MPN_INCR_U (r5 + n + 1, 2*n, cy);

  ASSERT_NOCARRY(mpn_sub_n(pp + 4*n, r5 + n, r3 + n, 2*n +1)); /* Mr5-Mr3,Hr5-Hr3 */

  cy = mpn_add_1 (pp + 6*n, r3 + n, n, pp[6*n]);
  MPN_INCR_U (r3 + 2*n, n + 1, cy);
  cy = mpn_add_n (pp + 7*n, pp + 7*n, r3 + 2*n, n);
  if (LIKELY(spt != n))
    MPN_INCR_U (pp + 8*n, spt - n, cy + r3[3*n]);
  else
    ASSERT (r3[3*n] + cy == 0);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xd0, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
movq %r9, -0x30(%rbp)
movq -0x8(%rbp), %rax
imulq $0x3, -0x10(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq %rax, -0x40(%rbp)
movq -0x8(%rbp), %rax
imulq $0x7, -0x10(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq %rax, -0x48(%rbp)
jmp 0x4b97d
movq -0x18(%rbp), %rax
movq -0x10(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq -0x8(%rbp), %rcx
movq (%rcx), %rcx
shrq $0x4, %rcx
subq %rcx, (%rax)
jae 0x4b9a7
subq $0x1, 0x8(%rax)
leaq 0x8(%rax), %rax
jb 0x4b99c
movq %rax, -0x58(%rbp)
jmp 0x4b9ad
jmp 0x4b9af
movq -0x18(%rbp), %rdi
movq -0x10(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x8(%rbp), %rsi
addq $0x8, %rsi
movq -0x10(%rbp), %rdx
shlq %rdx
subq $0x1, %rdx
movq -0x30(%rbp), %r8
movl $0x3c, %ecx
callq 0x4c0a0
movq %rax, -0x50(%rbp)
movq -0x18(%rbp), %rax
movq -0x10(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq -0x10(%rbp), %rcx
shlq %rcx
shlq $0x3, %rcx
addq %rcx, %rax
addq $-0x8, %rax
movq -0x50(%rbp), %rcx
subq %rcx, (%rax)
jae 0x4ba18
subq $0x1, 0x8(%rax)
leaq 0x8(%rax), %rax
jb 0x4ba0d
movq %rax, -0x60(%rbp)
jmp 0x4ba1e
jmp 0x4ba20
jmp 0x4ba22
movq -0x18(%rbp), %rdi
movq -0x48(%rbp), %rsi
movq -0x28(%rbp), %rdx
movq -0x30(%rbp), %r8
movl $0xc, %ecx
callq 0x4c0a0
movq %rax, -0x38(%rbp)
movq -0x18(%rbp), %rax
movq -0x28(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq -0x38(%rbp), %rcx
subq %rcx, (%rax)
jae 0x4ba63
subq $0x1, 0x8(%rax)
leaq 0x8(%rax), %rax
jb 0x4ba58
movq %rax, -0x68(%rbp)
jmp 0x4ba69
jmp 0x4ba6b
jmp 0x4ba6d
jmp 0x4ba6f
movq -0x40(%rbp), %rax
movq -0x10(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq -0x8(%rbp), %rcx
movq (%rcx), %rcx
shrq $0x2, %rcx
subq %rcx, (%rax)
jae 0x4ba99
subq $0x1, 0x8(%rax)
leaq 0x8(%rax), %rax
jb 0x4ba8e
movq %rax, -0x78(%rbp)
jmp 0x4ba9f
jmp 0x4baa1
movq -0x40(%rbp), %rdi
movq -0x10(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x8(%rbp), %rsi
addq $0x8, %rsi
movq -0x10(%rbp), %rdx
shlq %rdx
subq $0x1, %rdx
movq -0x30(%rbp), %r8
movl $0x3e, %ecx
callq 0x4c0a0
movq %rax, -0x70(%rbp)
movq -0x40(%rbp), %rax
movq -0x10(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq -0x10(%rbp), %rcx
shlq %rcx
shlq $0x3, %rcx
addq %rcx, %rax
addq $-0x8, %rax
movq -0x70(%rbp), %rcx
subq %rcx, (%rax)
jae 0x4bb0a
subq $0x1, 0x8(%rax)
leaq 0x8(%rax), %rax
jb 0x4baff
movq %rax, -0x80(%rbp)
jmp 0x4bb10
jmp 0x4bb12
jmp 0x4bb14
movq -0x40(%rbp), %rdi
movq -0x48(%rbp), %rsi
movq -0x28(%rbp), %rdx
movq -0x30(%rbp), %r8
movl $0x6, %ecx
callq 0x4c0a0
movq %rax, -0x38(%rbp)
movq -0x40(%rbp), %rax
movq -0x28(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq -0x38(%rbp), %rcx
subq %rcx, (%rax)
jae 0x4bb55
subq $0x1, 0x8(%rax)
leaq 0x8(%rax), %rax
jb 0x4bb4a
movq %rax, -0x88(%rbp)
jmp 0x4bb5e
jmp 0x4bb60
movq -0x20(%rbp), %rdi
movq -0x10(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x20(%rbp), %rsi
movq -0x10(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rsi
movq -0x8(%rbp), %rdx
movq -0x10(%rbp), %rcx
shlq %rcx
callq 0x36fe0
movq %rax, %rsi
movq -0x20(%rbp), %rax
imulq $0x3, -0x10(%rbp), %rcx
movq (%rax,%rcx,8), %rdx
subq %rsi, %rdx
movq %rdx, (%rax,%rcx,8)
movq -0x20(%rbp), %rdi
movq -0x20(%rbp), %rsi
movq -0x48(%rbp), %rdx
movq -0x28(%rbp), %rcx
callq 0x36fe0
movq %rax, -0x38(%rbp)
movq -0x20(%rbp), %rax
movq -0x28(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq -0x38(%rbp), %rcx
subq %rcx, (%rax)
jae 0x4bbe1
subq $0x1, 0x8(%rax)
leaq 0x8(%rax), %rax
jb 0x4bbd6
movq %rax, -0x90(%rbp)
jmp 0x4bbea
jmp 0x4bbec
movq -0x18(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x40(%rbp), %rdx
imulq $0x3, -0x10(%rbp), %rcx
addq $0x1, %rcx
callq 0x36fe0
movq -0x18(%rbp), %rdi
movq -0x18(%rbp), %rsi
imulq $0x3, -0x10(%rbp), %rdx
addq $0x1, %rdx
movl $0x2, %ecx
callq 0x56880
movq -0x40(%rbp), %rdi
movq -0x40(%rbp), %rsi
movq -0x20(%rbp), %rdx
imulq $0x3, -0x10(%rbp), %rcx
addq $0x1, %rcx
callq 0x36fe0
movq -0x18(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x40(%rbp), %rdx
imulq $0x3, -0x10(%rbp), %rcx
addq $0x1, %rcx
callq 0x36fe0
movq -0x18(%rbp), %rdi
movq -0x18(%rbp), %rsi
imulq $0x3, -0x10(%rbp), %rdx
addq $0x1, %rdx
movl $0x2d, %ecx
movabsq $0x4fa4fa4fa4fa4fa5, %r8 # imm = 0x4FA4FA4FA4FA4FA5
xorl %r9d, %r9d
callq 0x553a8
movq -0x40(%rbp), %rdi
movq -0x40(%rbp), %rsi
imulq $0x3, -0x10(%rbp), %rdx
addq $0x1, %rdx
movabsq $0x5555555555555555, %rcx # imm = 0x5555555555555555
xorl %eax, %eax
movl %eax, %r8d
callq 0x55430
movq -0x40(%rbp), %rdi
movq -0x18(%rbp), %rsi
imulq $0x3, -0x10(%rbp), %rdx
addq $0x1, %rdx
movq -0x30(%rbp), %r8
movl $0x2, %ecx
callq 0x4c0a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x8(%rbp), %rsi
movq -0x10(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rsi
movq -0x20(%rbp), %rdx
movq -0x10(%rbp), %rcx
callq 0x36c80
movq %rax, -0x38(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x8(%rbp), %rsi
movq -0x10(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rsi
movq -0x40(%rbp), %rdx
movq -0x10(%rbp), %rcx
callq 0x36fe0
movq %rax, %rcx
movq -0x38(%rbp), %rax
subq %rcx, %rax
movq %rax, -0x38(%rbp)
xorl %eax, %eax
cmpq -0x38(%rbp), %rax
jle 0x4bd55
jmp 0x4bd33
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
subq $0x1, (%rax)
leaq 0x8(%rax), %rax
jb 0x4bd42
movq %rax, -0x98(%rbp)
jmp 0x4bd87
jmp 0x4bd57
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq -0x38(%rbp), %rcx
addq %rcx, (%rax)
jae 0x4bd7a
addq $0x1, 0x8(%rax)
leaq 0x8(%rax), %rax
jb 0x4bd6f
movq %rax, -0xa0(%rbp)
jmp 0x4bd83
jmp 0x4bd85
jmp 0x4bd87
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
shlq %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x20(%rbp), %rsi
movq -0x10(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rsi
movq -0x40(%rbp), %rdx
movq -0x10(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdx
movq -0x10(%rbp), %rcx
callq 0x36fe0
movq %rax, -0x38(%rbp)
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
shlq %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq -0x38(%rbp), %rcx
subq %rcx, (%rax)
jae 0x4bdea
subq $0x1, 0x8(%rax)
leaq 0x8(%rax), %rax
jb 0x4bddf
movq %rax, -0xa8(%rbp)
jmp 0x4bdf3
jmp 0x4bdf5
movq -0x8(%rbp), %rdi
imulq $0x3, -0x10(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x40(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x10(%rbp), %rax
shlq %rax
shlq $0x3, %rax
addq %rax, %rdx
movq -0x10(%rbp), %rcx
addq $0x1, %rcx
callq 0x36c80
movq %rax, -0x38(%rbp)
movq -0x40(%rbp), %rdi
movq -0x10(%rbp), %rax
shlq %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x40(%rbp), %rsi
movq -0x10(%rbp), %rax
shlq %rax
shlq $0x3, %rax
addq %rax, %rsi
movq -0x18(%rbp), %rdx
movq -0x10(%rbp), %rcx
callq 0x36c80
movq %rax, %rdx
movq -0x40(%rbp), %rax
imulq $0x3, -0x10(%rbp), %rcx
addq (%rax,%rcx,8), %rdx
movq %rdx, (%rax,%rcx,8)
movq -0x8(%rbp), %rdi
imulq $0x3, -0x10(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x8(%rbp), %rsi
imulq $0x3, -0x10(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rsi
movq -0x40(%rbp), %rdx
movq -0x10(%rbp), %rax
shlq %rax
shlq $0x3, %rax
addq %rax, %rdx
movq -0x10(%rbp), %rcx
addq $0x1, %rcx
callq 0x36fe0
movq %rax, %rcx
movq -0x38(%rbp), %rax
subq %rcx, %rax
movq %rax, -0x38(%rbp)
xorl %eax, %eax
cmpq -0x38(%rbp), %rax
setg %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
setne %al
andb $0x1, %al
movzbl %al, %eax
cltq
cmpq $0x0, %rax
je 0x4bf07
jmp 0x4bee1
movq -0x40(%rbp), %rax
movq -0x10(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
addq $0x8, %rax
subq $0x1, (%rax)
leaq 0x8(%rax), %rax
jb 0x4bef4
movq %rax, -0xb0(%rbp)
jmp 0x4bf3d
jmp 0x4bf09
movq -0x40(%rbp), %rax
movq -0x10(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
addq $0x8, %rax
movq -0x38(%rbp), %rcx
addq %rcx, (%rax)
jae 0x4bf30
addq $0x1, 0x8(%rax)
leaq 0x8(%rax), %rax
jb 0x4bf25
movq %rax, -0xb8(%rbp)
jmp 0x4bf39
jmp 0x4bf3b
jmp 0x4bf3d
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
shlq $0x2, %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x40(%rbp), %rsi
movq -0x10(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rsi
movq -0x18(%rbp), %rdx
movq -0x10(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdx
movq -0x10(%rbp), %rcx
shlq %rcx
addq $0x1, %rcx
callq 0x36fe0
movq -0x8(%rbp), %rdi
imulq $0x6, -0x10(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x18(%rbp), %rsi
movq -0x10(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rsi
movq -0x10(%rbp), %rdx
movq -0x8(%rbp), %rax
imulq $0x6, -0x10(%rbp), %rcx
movq (%rax,%rcx,8), %rcx
callq 0x564f0
movq %rax, -0x38(%rbp)
movq -0x18(%rbp), %rax
movq -0x10(%rbp), %rcx
shlq %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq -0x38(%rbp), %rcx
addq %rcx, (%rax)
jae 0x4bfdd
addq $0x1, 0x8(%rax)
leaq 0x8(%rax), %rax
jb 0x4bfd2
movq %rax, -0xc0(%rbp)
jmp 0x4bfe6
jmp 0x4bfe8
movq -0x8(%rbp), %rdi
imulq $0x7, -0x10(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x8(%rbp), %rsi
imulq $0x7, -0x10(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rsi
movq -0x18(%rbp), %rdx
movq -0x10(%rbp), %rax
shlq %rax
shlq $0x3, %rax
addq %rax, %rdx
movq -0x10(%rbp), %rcx
callq 0x36c80
movq %rax, -0x38(%rbp)
movq -0x28(%rbp), %rax
cmpq -0x10(%rbp), %rax
setne %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
setne %al
andb $0x1, %al
movzbl %al, %eax
cltq
cmpq $0x0, %rax
je 0x4c08d
jmp 0x4c04c
movq -0x8(%rbp), %rax
movq -0x10(%rbp), %rcx
shlq $0x3, %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq -0x38(%rbp), %rcx
movq -0x18(%rbp), %rdx
imulq $0x3, -0x10(%rbp), %rsi
addq (%rdx,%rsi,8), %rcx
addq %rcx, (%rax)
jae 0x4c080
addq $0x1, 0x8(%rax)
leaq 0x8(%rax), %rax
jb 0x4c075
movq %rax, -0xc8(%rbp)
jmp 0x4c089
jmp 0x4c08b
jmp 0x4c093
jmp 0x4c08f
jmp 0x4c091
jmp 0x4c093
addq $0xd0, %rsp
popq %rbp
retq
nopl (%rax)