// File: marxn[P]pupp/3rdparty/gmp/mpn/mul.c
// Function: _gmpn_mul
mp_limb_t
mpn_mul (mp_ptr prodp,
	 mp_srcptr up, mp_size_t un,
	 mp_srcptr vp, mp_size_t vn)
{
  ASSERT (un >= vn);
  ASSERT (vn >= 1);
  ASSERT (! MPN_OVERLAP_P (prodp, un+vn, up, un));
  ASSERT (! MPN_OVERLAP_P (prodp, un+vn, vp, vn));

  if (un == vn)
    {
      if (up == vp)
	mpn_sqr (prodp, up, un);
      else
	mpn_mul_n (prodp, up, vp, un);
    }
  else if (vn < MUL_TOOM22_THRESHOLD)
    { /* plain schoolbook multiplication */

      /* Unless un is very large, or else if have an applicable mpn_mul_N,
	 perform basecase multiply directly.  */
      if (un <= MUL_BASECASE_MAX_UN
#if HAVE_NATIVE_mpn_mul_2
	  || vn <= 2
#else
	  || vn == 1
#endif
	  )
	mpn_mul_basecase (prodp, up, un, vp, vn);
      else
	{
	  /* We have un >> MUL_BASECASE_MAX_UN > vn.  For better memory
	     locality, split up[] into MUL_BASECASE_MAX_UN pieces and multiply
	     these pieces with the vp[] operand.  After each such partial
	     multiplication (but the last) we copy the most significant vn
	     limbs into a temporary buffer since that part would otherwise be
	     overwritten by the next multiplication.  After the next
	     multiplication, we add it back.  This illustrates the situation:

                                                    -->vn<--
                                                      |  |<------- un ------->|
                                                         _____________________|
                                                        X                    /|
                                                      /XX__________________/  |
                                    _____________________                     |
                                   X                    /                     |
                                 /XX__________________/                       |
               _____________________                                          |
              /                    /                                          |
            /____________________/                                            |
	    ==================================================================

	    The parts marked with X are the parts whose sums are copied into
	    the temporary buffer.  */

	  mp_limb_t tp[MUL_TOOM22_THRESHOLD_LIMIT];
	  mp_limb_t cy;
	  ASSERT (MUL_TOOM22_THRESHOLD <= MUL_TOOM22_THRESHOLD_LIMIT);

	  mpn_mul_basecase (prodp, up, MUL_BASECASE_MAX_UN, vp, vn);
	  prodp += MUL_BASECASE_MAX_UN;
	  MPN_COPY (tp, prodp, vn);		/* preserve high triangle */
	  up += MUL_BASECASE_MAX_UN;
	  un -= MUL_BASECASE_MAX_UN;
	  while (un > MUL_BASECASE_MAX_UN)
	    {
	      mpn_mul_basecase (prodp, up, MUL_BASECASE_MAX_UN, vp, vn);
	      cy = mpn_add_n (prodp, prodp, tp, vn); /* add back preserved triangle */
	      mpn_incr_u (prodp + vn, cy);
	      prodp += MUL_BASECASE_MAX_UN;
	      MPN_COPY (tp, prodp, vn);		/* preserve high triangle */
	      up += MUL_BASECASE_MAX_UN;
	      un -= MUL_BASECASE_MAX_UN;
	    }
	  if (un > vn)
	    {
	      mpn_mul_basecase (prodp, up, un, vp, vn);
	    }
	  else
	    {
	      ASSERT (un > 0);
	      mpn_mul_basecase (prodp, vp, vn, up, un);
	    }
	  cy = mpn_add_n (prodp, prodp, tp, vn); /* add back preserved triangle */
	  mpn_incr_u (prodp + vn, cy);
	}
    }
  else if (BELOW_THRESHOLD (vn, MUL_TOOM33_THRESHOLD))
    {
      /* Use ToomX2 variants */
      mp_ptr scratch;
      TMP_SDECL; TMP_SMARK;

#define ITCH_TOOMX2 (9 * vn / 2 + GMP_NUMB_BITS * 2)
      scratch = TMP_SALLOC_LIMBS (ITCH_TOOMX2);
      ASSERT (mpn_toom22_mul_itch ((5*vn-1)/4, vn) <= ITCH_TOOMX2); /* 5vn/2+ */
      ASSERT (mpn_toom32_mul_itch ((7*vn-1)/4, vn) <= ITCH_TOOMX2); /* 7vn/6+ */
      ASSERT (mpn_toom42_mul_itch (3 * vn - 1, vn) <= ITCH_TOOMX2); /* 9vn/2+ */
#undef ITCH_TOOMX2

      /* FIXME: This condition (repeated in the loop below) leaves from a vn*vn
	 square to a (3vn-1)*vn rectangle.  Leaving such a rectangle is hardly
	 wise; we would get better balance by slightly moving the bound.  We
	 will sometimes end up with un < vn, like in the X3 arm below.  */
      if (un >= 3 * vn)
	{
	  mp_limb_t cy;
	  mp_ptr ws;

	  /* The maximum ws usage is for the mpn_mul result.  */
	  ws = TMP_SALLOC_LIMBS (4 * vn);

	  mpn_toom42_mul (prodp, up, 2 * vn, vp, vn, scratch);
	  un -= 2 * vn;
	  up += 2 * vn;
	  prodp += 2 * vn;

	  while (un >= 3 * vn)
	    {
	      mpn_toom42_mul (ws, up, 2 * vn, vp, vn, scratch);
	      un -= 2 * vn;
	      up += 2 * vn;
	      cy = mpn_add_n (prodp, prodp, ws, vn);
	      MPN_COPY (prodp + vn, ws + vn, 2 * vn);
	      mpn_incr_u (prodp + vn, cy);
	      prodp += 2 * vn;
	    }

	  /* vn <= un < 3vn */

	  if (4 * un < 5 * vn)
	    mpn_toom22_mul (ws, up, un, vp, vn, scratch);
	  else if (4 * un < 7 * vn)
	    mpn_toom32_mul (ws, up, un, vp, vn, scratch);
	  else
	    mpn_toom42_mul (ws, up, un, vp, vn, scratch);

	  cy = mpn_add_n (prodp, prodp, ws, vn);
	  MPN_COPY (prodp + vn, ws + vn, un);
	  mpn_incr_u (prodp + vn, cy);
	}
      else
	{
	  if (4 * un < 5 * vn)
	    mpn_toom22_mul (prodp, up, un, vp, vn, scratch);
	  else if (4 * un < 7 * vn)
	    mpn_toom32_mul (prodp, up, un, vp, vn, scratch);
	  else
	    mpn_toom42_mul (prodp, up, un, vp, vn, scratch);
	}
      TMP_SFREE;
    }
  else if (BELOW_THRESHOLD ((un + vn) >> 1, MUL_FFT_THRESHOLD) ||
	   BELOW_THRESHOLD (3 * vn, MUL_FFT_THRESHOLD))
    {
      /* Handle the largest operands that are not in the FFT range.  The 2nd
	 condition makes very unbalanced operands avoid the FFT code (except
	 perhaps as coefficient products of the Toom code.  */

      if (BELOW_THRESHOLD (vn, MUL_TOOM44_THRESHOLD) || !TOOM44_OK (un, vn))
	{
	  /* Use ToomX3 variants */
	  mp_ptr scratch;
	  TMP_DECL; TMP_MARK;

#define ITCH_TOOMX3 (4 * vn + GMP_NUMB_BITS)
	  scratch = TMP_ALLOC_LIMBS (ITCH_TOOMX3);
	  ASSERT (mpn_toom33_mul_itch ((7*vn-1)/6, vn) <= ITCH_TOOMX3); /* 7vn/2+ */
	  ASSERT (mpn_toom43_mul_itch ((3*vn-1)/2, vn) <= ITCH_TOOMX3); /* 9vn/4+ */
	  ASSERT (mpn_toom32_mul_itch ((7*vn-1)/4, vn) <= ITCH_TOOMX3); /* 7vn/6+ */
	  ASSERT (mpn_toom53_mul_itch ((11*vn-1)/6, vn) <= ITCH_TOOMX3); /* 11vn/3+ */
	  ASSERT (mpn_toom42_mul_itch ((5*vn-1)/2, vn) <= ITCH_TOOMX3); /* 15vn/4+ */
	  ASSERT (mpn_toom63_mul_itch ((5*vn-1)/2, vn) <= ITCH_TOOMX3); /* 15vn/4+ */
#undef ITCH_TOOMX3

	  if (2 * un >= 5 * vn)
	    {
	      mp_limb_t cy;
	      mp_ptr ws;

	      /* The maximum ws usage is for the mpn_mul result.  */
	      ws = TMP_ALLOC_LIMBS (7 * vn >> 1);

	      if (BELOW_THRESHOLD (vn, MUL_TOOM42_TO_TOOM63_THRESHOLD))
		mpn_toom42_mul (prodp, up, 2 * vn, vp, vn, scratch);
	      else
		mpn_toom63_mul (prodp, up, 2 * vn, vp, vn, scratch);
	      un -= 2 * vn;
	      up += 2 * vn;
	      prodp += 2 * vn;

	      while (2 * un >= 5 * vn)	/* un >= 2.5vn */
		{
		  if (BELOW_THRESHOLD (vn, MUL_TOOM42_TO_TOOM63_THRESHOLD))
		    mpn_toom42_mul (ws, up, 2 * vn, vp, vn, scratch);
		  else
		    mpn_toom63_mul (ws, up, 2 * vn, vp, vn, scratch);
		  un -= 2 * vn;
		  up += 2 * vn;
		  cy = mpn_add_n (prodp, prodp, ws, vn);
		  MPN_COPY (prodp + vn, ws + vn, 2 * vn);
		  mpn_incr_u (prodp + vn, cy);
		  prodp += 2 * vn;
		}

	      /* vn / 2 <= un < 2.5vn */

	      if (un < vn)
		mpn_mul (ws, vp, vn, up, un);
	      else
		mpn_mul (ws, up, un, vp, vn);

	      cy = mpn_add_n (prodp, prodp, ws, vn);
	      MPN_COPY (prodp + vn, ws + vn, un);
	      mpn_incr_u (prodp + vn, cy);
	    }
	  else
	    {
	      if (6 * un < 7 * vn)
		mpn_toom33_mul (prodp, up, un, vp, vn, scratch);
	      else if (2 * un < 3 * vn)
		{
		  if (BELOW_THRESHOLD (vn, MUL_TOOM32_TO_TOOM43_THRESHOLD))
		    mpn_toom32_mul (prodp, up, un, vp, vn, scratch);
		  else
		    mpn_toom43_mul (prodp, up, un, vp, vn, scratch);
		}
	      else if (6 * un < 11 * vn)
		{
		  if (4 * un < 7 * vn)
		    {
		      if (BELOW_THRESHOLD (vn, MUL_TOOM32_TO_TOOM53_THRESHOLD))
			mpn_toom32_mul (prodp, up, un, vp, vn, scratch);
		      else
			mpn_toom53_mul (prodp, up, un, vp, vn, scratch);
		    }
		  else
		    {
		      if (BELOW_THRESHOLD (vn, MUL_TOOM42_TO_TOOM53_THRESHOLD))
			mpn_toom42_mul (prodp, up, un, vp, vn, scratch);
		      else
			mpn_toom53_mul (prodp, up, un, vp, vn, scratch);
		    }
		}
	      else
		{
		  if (BELOW_THRESHOLD (vn, MUL_TOOM42_TO_TOOM63_THRESHOLD))
		    mpn_toom42_mul (prodp, up, un, vp, vn, scratch);
		  else
		    mpn_toom63_mul (prodp, up, un, vp, vn, scratch);
		}
	    }
	  TMP_FREE;
	}
      else
	{
	  mp_ptr scratch;
	  TMP_DECL; TMP_MARK;

	  if (BELOW_THRESHOLD (vn, MUL_TOOM6H_THRESHOLD))
	    {
	      scratch = TMP_SALLOC_LIMBS (mpn_toom44_mul_itch (un, vn));
	      mpn_toom44_mul (prodp, up, un, vp, vn, scratch);
	    }
	  else if (BELOW_THRESHOLD (vn, MUL_TOOM8H_THRESHOLD))
	    {
	      scratch = TMP_SALLOC_LIMBS (mpn_toom6h_mul_itch (un, vn));
	      mpn_toom6h_mul (prodp, up, un, vp, vn, scratch);
	    }
	  else
	    {
	      scratch = TMP_ALLOC_LIMBS (mpn_toom8h_mul_itch (un, vn));
	      mpn_toom8h_mul (prodp, up, un, vp, vn, scratch);
	    }
	  TMP_FREE;
	}
    }
  else
    {
      if (un >= 8 * vn)
	{
	  mp_limb_t cy;
	  mp_ptr ws;
	  TMP_DECL; TMP_MARK;

	  /* The maximum ws usage is for the mpn_mul result.  */
	  ws = TMP_BALLOC_LIMBS (9 * vn >> 1);

	  mpn_fft_mul (prodp, up, 3 * vn, vp, vn);
	  un -= 3 * vn;
	  up += 3 * vn;
	  prodp += 3 * vn;

	  while (2 * un >= 7 * vn)	/* un >= 3.5vn  */
	    {
	      mpn_fft_mul (ws, up, 3 * vn, vp, vn);
	      un -= 3 * vn;
	      up += 3 * vn;
	      cy = mpn_add_n (prodp, prodp, ws, vn);
	      MPN_COPY (prodp + vn, ws + vn, 3 * vn);
	      mpn_incr_u (prodp + vn, cy);
	      prodp += 3 * vn;
	    }

	  /* vn / 2 <= un < 3.5vn */

	  if (un < vn)
	    mpn_mul (ws, vp, vn, up, un);
	  else
	    mpn_mul (ws, up, un, vp, vn);

	  cy = mpn_add_n (prodp, prodp, ws, vn);
	  MPN_COPY (prodp + vn, ws + vn, un);
	  mpn_incr_u (prodp + vn, cy);

	  TMP_FREE;
	}
      else
	mpn_fft_mul (prodp, up, un, vp, vn);
    }

  return prodp[un + vn - 1];	/* historic */
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x1d0, %rsp            # imm = 0x1D0
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
jmp 0x37f21
jmp 0x37f23
jmp 0x37f25
jmp 0x37f27
jmp 0x37f29
jmp 0x37f2b
jmp 0x37f2d
movq -0x18(%rbp), %rax
cmpq -0x28(%rbp), %rax
jne 0x37f6e
movq -0x10(%rbp), %rax
cmpq -0x20(%rbp), %rax
jne 0x37f54
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
callq 0x392b0
jmp 0x37f69
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x18(%rbp), %rcx
callq 0x39000
jmp 0x38f4b
cmpq $0x1c, -0x28(%rbp)
jge 0x38178
cmpq $0x1f4, -0x18(%rbp)     # imm = 0x1F4
jle 0x37f8a
cmpq $0x2, -0x28(%rbp)
jg 0x37fa8
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
callq 0x394e0
jmp 0x38173
jmp 0x37faa
jmp 0x37fac
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movl $0x1f4, %edx            # imm = 0x1F4
callq 0x394e0
movq -0x8(%rbp), %rax
addq $0xfa0, %rax            # imm = 0xFA0
movq %rax, -0x8(%rbp)
jmp 0x37fd6
jmp 0x37fd8
jmp 0x37fda
jmp 0x37fdc
jmp 0x37fde
jmp 0x37fe0
jmp 0x37fe2
leaq -0x110(%rbp), %rdi
movq -0x8(%rbp), %rsi
movq -0x28(%rbp), %rdx
callq 0x554c6
jmp 0x37ff8
movq -0x10(%rbp), %rax
addq $0xfa0, %rax            # imm = 0xFA0
movq %rax, -0x10(%rbp)
movq -0x18(%rbp), %rax
subq $0x1f4, %rax            # imm = 0x1F4
movq %rax, -0x18(%rbp)
cmpq $0x1f4, -0x18(%rbp)     # imm = 0x1F4
jle 0x380df
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movl $0x1f4, %edx            # imm = 0x1F4
callq 0x394e0
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rsi
leaq -0x110(%rbp), %rdx
movq -0x28(%rbp), %rcx
callq 0x36c80
movq %rax, -0x118(%rbp)
movq -0x8(%rbp), %rax
movq -0x28(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq -0x118(%rbp), %rcx
addq %rcx, (%rax)
jae 0x38081
addq $0x1, 0x8(%rax)
leaq 0x8(%rax), %rax
jb 0x38076
movq %rax, -0x120(%rbp)
jmp 0x3808a
jmp 0x3808c
movq -0x8(%rbp), %rax
addq $0xfa0, %rax            # imm = 0xFA0
movq %rax, -0x8(%rbp)
jmp 0x3809c
jmp 0x3809e
jmp 0x380a0
jmp 0x380a2
jmp 0x380a4
jmp 0x380a6
jmp 0x380a8
leaq -0x110(%rbp), %rdi
movq -0x8(%rbp), %rsi
movq -0x28(%rbp), %rdx
callq 0x554c6
jmp 0x380be
movq -0x10(%rbp), %rax
addq $0xfa0, %rax            # imm = 0xFA0
movq %rax, -0x10(%rbp)
movq -0x18(%rbp), %rax
subq $0x1f4, %rax            # imm = 0x1F4
movq %rax, -0x18(%rbp)
jmp 0x38014
movq -0x18(%rbp), %rax
cmpq -0x28(%rbp), %rax
jle 0x38104
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
callq 0x394e0
jmp 0x38121
jmp 0x38106
jmp 0x38108
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rsi
movq -0x28(%rbp), %rdx
movq -0x10(%rbp), %rcx
movq -0x18(%rbp), %r8
callq 0x394e0
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rsi
leaq -0x110(%rbp), %rdx
movq -0x28(%rbp), %rcx
callq 0x36c80
movq %rax, -0x118(%rbp)
movq -0x8(%rbp), %rax
movq -0x28(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq -0x118(%rbp), %rcx
addq %rcx, (%rax)
jae 0x38166
addq $0x1, 0x8(%rax)
leaq 0x8(%rax), %rax
jb 0x3815b
movq %rax, -0x128(%rbp)
jmp 0x3816f
jmp 0x38171
jmp 0x38173
jmp 0x38f49
cmpq $0x51, -0x28(%rbp)
jge 0x384fd
movq -0x28(%rbp), %rax
leaq (%rax,%rax,8), %rax
movq %rax, %rcx
shrq $0x3f, %rcx
addq %rcx, %rax
andq $-0x2, %rax
leaq 0x40f(,%rax,4), %rcx
andq $-0x10, %rcx
movq %rsp, %rax
subq %rcx, %rax
movq %rax, %rsp
movq %rax, -0x130(%rbp)
jmp 0x381b7
jmp 0x381b9
jmp 0x381bb
jmp 0x381bd
jmp 0x381bf
movq -0x18(%rbp), %rax
imulq $0x3, -0x28(%rbp), %rcx
cmpq %rcx, %rax
jl 0x3846c
movq -0x28(%rbp), %rcx
shlq $0x5, %rcx
movq %rsp, %rax
subq %rcx, %rax
movq %rax, %rsp
movq %rax, -0x140(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x28(%rbp), %rdx
shlq %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x130(%rbp), %r9
callq 0x3f9d0
movq -0x28(%rbp), %rcx
shlq %rcx
movq -0x18(%rbp), %rax
subq %rcx, %rax
movq %rax, -0x18(%rbp)
movq -0x28(%rbp), %rax
shlq %rax
shlq $0x3, %rax
addq -0x10(%rbp), %rax
movq %rax, -0x10(%rbp)
movq -0x28(%rbp), %rax
shlq %rax
shlq $0x3, %rax
addq -0x8(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x18(%rbp), %rax
imulq $0x3, -0x28(%rbp), %rcx
cmpq %rcx, %rax
jl 0x38348
movq -0x140(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x28(%rbp), %rdx
shlq %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x130(%rbp), %r9
callq 0x3f9d0
movq -0x28(%rbp), %rcx
shlq %rcx
movq -0x18(%rbp), %rax
subq %rcx, %rax
movq %rax, -0x18(%rbp)
movq -0x28(%rbp), %rax
shlq %rax
shlq $0x3, %rax
addq -0x10(%rbp), %rax
movq %rax, -0x10(%rbp)
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rsi
movq -0x140(%rbp), %rdx
movq -0x28(%rbp), %rcx
callq 0x36c80
movq %rax, -0x138(%rbp)
jmp 0x382c2
jmp 0x382c4
jmp 0x382c6
jmp 0x382c8
jmp 0x382ca
jmp 0x382cc
jmp 0x382ce
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x140(%rbp), %rsi
movq -0x28(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rsi
movq -0x28(%rbp), %rdx
shlq %rdx
callq 0x554c6
jmp 0x382fd
jmp 0x382ff
movq -0x8(%rbp), %rax
movq -0x28(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq -0x138(%rbp), %rcx
addq %rcx, (%rax)
jae 0x38325
addq $0x1, 0x8(%rax)
leaq 0x8(%rax), %rax
jb 0x3831a
movq %rax, -0x148(%rbp)
jmp 0x3832e
jmp 0x38330
movq -0x28(%rbp), %rax
shlq %rax
shlq $0x3, %rax
addq -0x8(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x38244
movq -0x18(%rbp), %rax
shlq $0x2, %rax
imulq $0x5, -0x28(%rbp), %rcx
cmpq %rcx, %rax
jge 0x3837f
movq -0x140(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x130(%rbp), %r9
callq 0x3e800
jmp 0x383db
movq -0x18(%rbp), %rax
shlq $0x2, %rax
imulq $0x7, -0x28(%rbp), %rcx
cmpq %rcx, %rax
jge 0x383b6
movq -0x140(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x130(%rbp), %r9
callq 0x3efa0
jmp 0x383d9
movq -0x140(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x130(%rbp), %r9
callq 0x3f9d0
jmp 0x383db
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rsi
movq -0x140(%rbp), %rdx
movq -0x28(%rbp), %rcx
callq 0x36c80
movq %rax, -0x138(%rbp)
jmp 0x383fc
jmp 0x383fe
jmp 0x38400
jmp 0x38402
jmp 0x38404
jmp 0x38406
jmp 0x38408
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x140(%rbp), %rsi
movq -0x28(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rsi
movq -0x18(%rbp), %rdx
callq 0x554c6
jmp 0x38434
jmp 0x38436
movq -0x8(%rbp), %rax
movq -0x28(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq -0x138(%rbp), %rcx
addq %rcx, (%rax)
jae 0x3845c
addq $0x1, 0x8(%rax)
leaq 0x8(%rax), %rax
jb 0x38451
movq %rax, -0x150(%rbp)
jmp 0x38465
jmp 0x38467
jmp 0x384f8
movq -0x18(%rbp), %rax
shlq $0x2, %rax
imulq $0x5, -0x28(%rbp), %rcx
cmpq %rcx, %rax
jge 0x384a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x130(%rbp), %r9
callq 0x3e800
jmp 0x384f6
movq -0x18(%rbp), %rax
shlq $0x2, %rax
imulq $0x7, -0x28(%rbp), %rcx
cmpq %rcx, %rax
jge 0x384d4
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x130(%rbp), %r9
callq 0x3efa0
jmp 0x384f4
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x130(%rbp), %r9
callq 0x3f9d0
jmp 0x384f6
jmp 0x384f8
jmp 0x38f47
movq -0x18(%rbp), %rax
addq -0x28(%rbp), %rax
sarq %rax
cmpq $0x2d00, %rax           # imm = 0x2D00
jl 0x38521
imulq $0x3, -0x28(%rbp), %rax
cmpq $0x2d00, %rax           # imm = 0x2D00
jge 0x38ca4
cmpq $0xf2, -0x28(%rbp)
jl 0x38545
imulq $0x3, -0x18(%rbp), %rax
addq $0xc, %rax
movq -0x28(%rbp), %rcx
shlq $0x2, %rcx
cmpq %rcx, %rax
jl 0x38b00
movq $0x0, -0x160(%rbp)
movq -0x28(%rbp), %rax
shlq $0x2, %rax
addq $0x40, %rax
shlq $0x3, %rax
cmpq $0x7f00, %rax           # imm = 0x7F00
setbe %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
setne %al
andb $0x1, %al
movzbl %al, %eax
cltq
cmpq $0x0, %rax
je 0x385a3
movq -0x28(%rbp), %rcx
shlq $0x5, %rcx
negq %rcx
movq %rsp, %rax
leaq -0x200(%rax,%rcx), %rax
movq %rax, %rsp
movq %rax, -0x1c0(%rbp)
jmp 0x385c6
movq -0x28(%rbp), %rsi
shlq $0x2, %rsi
addq $0x40, %rsi
shlq $0x3, %rsi
leaq -0x160(%rbp), %rdi
callq 0x56430
movq %rax, -0x1c0(%rbp)
movq -0x1c0(%rbp), %rax
movq %rax, -0x158(%rbp)
jmp 0x385d6
jmp 0x385d8
jmp 0x385da
jmp 0x385dc
jmp 0x385de
jmp 0x385e0
jmp 0x385e2
jmp 0x385e4
jmp 0x385e6
jmp 0x385e8
jmp 0x385ea
movq -0x18(%rbp), %rax
shlq %rax
imulq $0x5, -0x28(%rbp), %rcx
cmpq %rcx, %rax
jl 0x3891e
imulq $0x7, -0x28(%rbp), %rax
sarq %rax
shlq $0x3, %rax
cmpq $0x7f00, %rax           # imm = 0x7F00
setbe %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
setne %al
andb $0x1, %al
movzbl %al, %eax
cltq
cmpq $0x0, %rax
je 0x38659
movq -0x28(%rbp), %rax
leaq (%rax,%rax,8), %rcx
leaq (%rcx,%rcx,2), %rcx
addq %rax, %rcx
andq $-0x8, %rcx
addq $0xf, %rcx
andq $-0x10, %rcx
movq %rsp, %rax
subq %rcx, %rax
movq %rax, %rsp
movq %rax, -0x1c8(%rbp)
jmp 0x38678
imulq $0x7, -0x28(%rbp), %rsi
sarq %rsi
shlq $0x3, %rsi
leaq -0x160(%rbp), %rdi
callq 0x56430
movq %rax, -0x1c8(%rbp)
movq -0x1c8(%rbp), %rax
movq %rax, -0x170(%rbp)
cmpq $0xaf, -0x28(%rbp)
jge 0x386b5
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x28(%rbp), %rdx
shlq %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x158(%rbp), %r9
callq 0x3f9d0
jmp 0x386d8
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x28(%rbp), %rdx
shlq %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x158(%rbp), %r9
callq 0x41e80
movq -0x28(%rbp), %rcx
shlq %rcx
movq -0x18(%rbp), %rax
subq %rcx, %rax
movq %rax, -0x18(%rbp)
movq -0x28(%rbp), %rax
shlq %rax
shlq $0x3, %rax
addq -0x10(%rbp), %rax
movq %rax, -0x10(%rbp)
movq -0x28(%rbp), %rax
shlq %rax
shlq $0x3, %rax
addq -0x8(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x18(%rbp), %rax
shlq %rax
imulq $0x5, -0x28(%rbp), %rcx
cmpq %rcx, %rax
jl 0x38849
cmpq $0xaf, -0x28(%rbp)
jge 0x38757
movq -0x170(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x28(%rbp), %rdx
shlq %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x158(%rbp), %r9
callq 0x3f9d0
jmp 0x3877d
movq -0x170(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x28(%rbp), %rdx
shlq %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x158(%rbp), %r9
callq 0x41e80
movq -0x28(%rbp), %rcx
shlq %rcx
movq -0x18(%rbp), %rax
subq %rcx, %rax
movq %rax, -0x18(%rbp)
movq -0x28(%rbp), %rax
shlq %rax
shlq $0x3, %rax
addq -0x10(%rbp), %rax
movq %rax, -0x10(%rbp)
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rsi
movq -0x170(%rbp), %rdx
movq -0x28(%rbp), %rcx
callq 0x36c80
movq %rax, -0x168(%rbp)
jmp 0x387c3
jmp 0x387c5
jmp 0x387c7
jmp 0x387c9
jmp 0x387cb
jmp 0x387cd
jmp 0x387cf
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x170(%rbp), %rsi
movq -0x28(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rsi
movq -0x28(%rbp), %rdx
shlq %rdx
callq 0x554c6
jmp 0x387fe
jmp 0x38800
movq -0x8(%rbp), %rax
movq -0x28(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq -0x168(%rbp), %rcx
addq %rcx, (%rax)
jae 0x38826
addq $0x1, 0x8(%rax)
leaq 0x8(%rax), %rax
jb 0x3881b
movq %rax, -0x178(%rbp)
jmp 0x3882f
jmp 0x38831
movq -0x28(%rbp), %rax
shlq %rax
shlq $0x3, %rax
addq -0x8(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x38710
movq -0x18(%rbp), %rax
cmpq -0x28(%rbp), %rax
jge 0x38871
movq -0x170(%rbp), %rdi
movq -0x20(%rbp), %rsi
movq -0x28(%rbp), %rdx
movq -0x10(%rbp), %rcx
movq -0x18(%rbp), %r8
callq 0x37f00
jmp 0x3888d
movq -0x170(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
callq 0x37f00
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rsi
movq -0x170(%rbp), %rdx
movq -0x28(%rbp), %rcx
callq 0x36c80
movq %rax, -0x168(%rbp)
jmp 0x388ae
jmp 0x388b0
jmp 0x388b2
jmp 0x388b4
jmp 0x388b6
jmp 0x388b8
jmp 0x388ba
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x170(%rbp), %rsi
movq -0x28(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rsi
movq -0x18(%rbp), %rdx
callq 0x554c6
jmp 0x388e6
jmp 0x388e8
movq -0x8(%rbp), %rax
movq -0x28(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq -0x168(%rbp), %rcx
addq %rcx, (%rax)
jae 0x3890e
addq $0x1, 0x8(%rax)
leaq 0x8(%rax), %rax
jb 0x38903
movq %rax, -0x180(%rbp)
jmp 0x38917
jmp 0x38919
jmp 0x38ac8
imulq $0x6, -0x18(%rbp), %rax
imulq $0x7, -0x28(%rbp), %rcx
cmpq %rcx, %rax
jge 0x38952
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x158(%rbp), %r9
callq 0x40340
jmp 0x38ac6
movq -0x18(%rbp), %rax
shlq %rax
imulq $0x3, -0x28(%rbp), %rcx
cmpq %rcx, %rax
jge 0x389b1
cmpq $0x61, -0x28(%rbp)
jge 0x3898c
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x158(%rbp), %r9
callq 0x3efa0
jmp 0x389ac
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x158(%rbp), %r9
callq 0x40ba0
jmp 0x38ac4
imulq $0x6, -0x18(%rbp), %rax
imulq $0xb, -0x28(%rbp), %rcx
cmpq %rcx, %rax
jge 0x38a74
movq -0x18(%rbp), %rax
shlq $0x2, %rax
imulq $0x7, -0x28(%rbp), %rcx
cmpq %rcx, %rax
jge 0x38a24
cmpq $0x99, -0x28(%rbp)
jge 0x38a02
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x158(%rbp), %r9
callq 0x3efa0
jmp 0x38a22
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x158(%rbp), %r9
callq 0x412a0
jmp 0x38a72
cmpq $0xa1, -0x28(%rbp)
jge 0x38a50
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x158(%rbp), %r9
callq 0x3f9d0
jmp 0x38a70
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x158(%rbp), %r9
callq 0x412a0
jmp 0x38a72
jmp 0x38ac2
cmpq $0xaf, -0x28(%rbp)
jge 0x38aa0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x158(%rbp), %r9
callq 0x3f9d0
jmp 0x38ac0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x158(%rbp), %r9
callq 0x41e80
jmp 0x38ac2
jmp 0x38ac4
jmp 0x38ac6
jmp 0x38ac8
jmp 0x38aca
cmpq $0x0, -0x160(%rbp)
setne %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
setne %al
andb $0x1, %al
movzbl %al, %eax
cltq
cmpq $0x0, %rax
je 0x38af9
movq -0x160(%rbp), %rdi
callq 0x564a0
jmp 0x38afb
jmp 0x38c9f
movq $0x0, -0x190(%rbp)
cmpq $0x159, -0x28(%rbp)     # imm = 0x159
jge 0x38b5e
movq -0x18(%rbp), %rax
leaq (%rax,%rax,2), %rax
leaq 0x20f(,%rax,8), %rcx
andq $-0x10, %rcx
movq %rsp, %rax
subq %rcx, %rax
movq %rax, %rsp
movq %rax, -0x188(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x188(%rbp), %r9
callq 0x42930
jmp 0x38c6a
cmpq $0x1e2, -0x28(%rbp)     # imm = 0x1E2
jge 0x38bb6
movq -0x18(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x38f70
leaq 0xf(,%rax,8), %rcx
andq $-0x10, %rcx
movq %rsp, %rax
subq %rcx, %rax
movq %rax, %rsp
movq %rax, -0x188(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x188(%rbp), %r9
callq 0x434c0
jmp 0x38c68
movq -0x18(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x38fb0
shlq $0x3, %rax
cmpq $0x7f00, %rax           # imm = 0x7F00
setbe %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
setne %al
andb $0x1, %al
movzbl %al, %eax
cltq
cmpq $0x0, %rax
je 0x38c13
movq -0x18(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x38fb0
leaq 0xf(,%rax,8), %rcx
andq $-0x10, %rcx
movq %rsp, %rax
subq %rcx, %rax
movq %rax, %rsp
movq %rax, -0x1d0(%rbp)
jmp 0x38c3a
movq -0x18(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x38fb0
movq %rax, %rsi
shlq $0x3, %rsi
leaq -0x190(%rbp), %rdi
callq 0x56430
movq %rax, -0x1d0(%rbp)
movq -0x1d0(%rbp), %rax
movq %rax, -0x188(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x188(%rbp), %r9
callq 0x44d70
jmp 0x38c6a
jmp 0x38c6c
cmpq $0x0, -0x190(%rbp)
setne %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
setne %al
andb $0x1, %al
movzbl %al, %eax
cltq
cmpq $0x0, %rax
je 0x38c9b
movq -0x190(%rbp), %rdi
callq 0x564a0
jmp 0x38c9d
jmp 0x38c9f
jmp 0x38f45
movq -0x18(%rbp), %rax
movq -0x28(%rbp), %rcx
shlq $0x3, %rcx
cmpq %rcx, %rax
jl 0x38f2a
movq $0x0, -0x1a8(%rbp)
imulq $0x9, -0x28(%rbp), %rsi
sarq %rsi
shlq $0x3, %rsi
leaq -0x1a8(%rbp), %rdi
callq 0x56430
movq %rax, -0x1a0(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
imulq $0x3, -0x28(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
callq 0x3a1c0
imulq $0x3, -0x28(%rbp), %rcx
movq -0x18(%rbp), %rax
subq %rcx, %rax
movq %rax, -0x18(%rbp)
imulq $0x3, -0x28(%rbp), %rax
shlq $0x3, %rax
addq -0x10(%rbp), %rax
movq %rax, -0x10(%rbp)
imulq $0x3, -0x28(%rbp), %rax
shlq $0x3, %rax
addq -0x8(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x18(%rbp), %rax
shlq %rax
imulq $0x7, -0x28(%rbp), %rcx
cmpq %rcx, %rax
jl 0x38e25
movq -0x1a0(%rbp), %rdi
movq -0x10(%rbp), %rsi
imulq $0x3, -0x28(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
callq 0x3a1c0
imulq $0x3, -0x28(%rbp), %rcx
movq -0x18(%rbp), %rax
subq %rcx, %rax
movq %rax, -0x18(%rbp)
imulq $0x3, -0x28(%rbp), %rax
shlq $0x3, %rax
addq -0x10(%rbp), %rax
movq %rax, -0x10(%rbp)
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rsi
movq -0x1a0(%rbp), %rdx
movq -0x28(%rbp), %rcx
callq 0x36c80
movq %rax, -0x198(%rbp)
jmp 0x38da3
jmp 0x38da5
jmp 0x38da7
jmp 0x38da9
jmp 0x38dab
jmp 0x38dad
jmp 0x38daf
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x1a0(%rbp), %rsi
movq -0x28(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rsi
imulq $0x3, -0x28(%rbp), %rdx
callq 0x554c6
jmp 0x38ddc
jmp 0x38dde
movq -0x8(%rbp), %rax
movq -0x28(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq -0x198(%rbp), %rcx
addq %rcx, (%rax)
jae 0x38e04
addq $0x1, 0x8(%rax)
leaq 0x8(%rax), %rax
jb 0x38df9
movq %rax, -0x1b0(%rbp)
jmp 0x38e0d
jmp 0x38e0f
imulq $0x3, -0x28(%rbp), %rax
shlq $0x3, %rax
addq -0x8(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x38d2f
movq -0x18(%rbp), %rax
cmpq -0x28(%rbp), %rax
jge 0x38e4d
movq -0x1a0(%rbp), %rdi
movq -0x20(%rbp), %rsi
movq -0x28(%rbp), %rdx
movq -0x10(%rbp), %rcx
movq -0x18(%rbp), %r8
callq 0x37f00
jmp 0x38e69
movq -0x1a0(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
callq 0x37f00
movq -0x8(%rbp), %rdi
movq -0x8(%rbp), %rsi
movq -0x1a0(%rbp), %rdx
movq -0x28(%rbp), %rcx
callq 0x36c80
movq %rax, -0x198(%rbp)
jmp 0x38e8a
jmp 0x38e8c
jmp 0x38e8e
jmp 0x38e90
jmp 0x38e92
jmp 0x38e94
jmp 0x38e96
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x1a0(%rbp), %rsi
movq -0x28(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rsi
movq -0x18(%rbp), %rdx
callq 0x554c6
jmp 0x38ec2
jmp 0x38ec4
movq -0x8(%rbp), %rax
movq -0x28(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq -0x198(%rbp), %rcx
addq %rcx, (%rax)
jae 0x38eea
addq $0x1, 0x8(%rax)
leaq 0x8(%rax), %rax
jb 0x38edf
movq %rax, -0x1b8(%rbp)
jmp 0x38ef3
jmp 0x38ef5
jmp 0x38ef7
cmpq $0x0, -0x1a8(%rbp)
setne %al
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
setne %al
andb $0x1, %al
movzbl %al, %eax
cltq
cmpq $0x0, %rax
je 0x38f26
movq -0x1a8(%rbp), %rdi
callq 0x564a0
jmp 0x38f28
jmp 0x38f43
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
callq 0x3a1c0
jmp 0x38f45
jmp 0x38f47
jmp 0x38f49
jmp 0x38f4b
movq -0x8(%rbp), %rax
movq -0x18(%rbp), %rcx
addq -0x28(%rbp), %rcx
subq $0x1, %rcx
movq (%rax,%rcx,8), %rax
movq %rbp, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)