// File: marxn[P]pupp/3rdparty/gmp/mpf/sub.c
// Function: _gmpf_sub
void
mpf_sub (mpf_ptr r, mpf_srcptr u, mpf_srcptr v)
{
  mp_srcptr up, vp;
  mp_ptr rp, tp;
  mp_size_t usize, vsize, rsize;
  mp_size_t prec;
  mp_exp_t exp;
  mp_size_t ediff;
  int negate;
  TMP_DECL;

  usize = SIZ (u);
  vsize = SIZ (v);

  /* Handle special cases that don't work in generic code below.  */
  if (usize == 0)
    {
      mpf_neg (r, v);
      return;
    }
  if (vsize == 0)
    {
      if (r != u)
        mpf_set (r, u);
      return;
    }

  /* If signs of U and V are different, perform addition.  */
  if ((usize ^ vsize) < 0)
    {
      __mpf_struct v_negated;
      v_negated._mp_size = -vsize;
      v_negated._mp_exp = EXP (v);
      v_negated._mp_d = PTR (v);
      mpf_add (r, u, &v_negated);
      return;
    }

  TMP_MARK;

  /* Signs are now known to be the same.  */
  negate = usize < 0;

  /* Make U be the operand with the largest exponent.  */
  if (EXP (u) < EXP (v))
    {
      mpf_srcptr t;
      t = u; u = v; v = t;
      negate ^= 1;
      usize = SIZ (u);
      vsize = SIZ (v);
    }

  usize = ABS (usize);
  vsize = ABS (vsize);
  up = PTR (u);
  vp = PTR (v);
  rp = PTR (r);
  prec = PREC (r) + 1;
  exp = EXP (u);
  ediff = exp - EXP (v);

  /* If ediff is 0 or 1, we might have a situation where the operands are
     extremely close.  We need to scan the operands from the most significant
     end ignore the initial parts that are equal.  */
  if (ediff <= 1)
    {
      if (ediff == 0)
	{
	  /* Skip leading limbs in U and V that are equal.  */
	      /* This loop normally exits immediately.  Optimize for that.  */
	      while (up[usize - 1] == vp[vsize - 1])
		{
		  usize--;
		  vsize--;
		  exp--;

		  if (usize == 0)
		    {
                      /* u cancels high limbs of v, result is rest of v */
		      negate ^= 1;
                    cancellation:
                      /* strip high zeros before truncating to prec */
                      while (vsize != 0 && vp[vsize - 1] == 0)
                        {
                          vsize--;
                          exp--;
                        }
		      if (vsize > prec)
			{
			  vp += vsize - prec;
			  vsize = prec;
			}
                      MPN_COPY_INCR (rp, vp, vsize);
                      rsize = vsize;
                      goto done;
		    }
		  if (vsize == 0)
		    {
                      vp = up;
                      vsize = usize;
                      goto cancellation;
		    }
		}

	  if (up[usize - 1] < vp[vsize - 1])
	    {
	      /* For simplicity, swap U and V.  Note that since the loop above
		 wouldn't have exited unless up[usize - 1] and vp[vsize - 1]
		 were non-equal, this if-statement catches all cases where U
		 is smaller than V.  */
	      MPN_SRCPTR_SWAP (up,usize, vp,vsize);
	      negate ^= 1;
	      /* negating ediff not necessary since it is 0.  */
	    }

	  /* Check for
	     x+1 00000000 ...
	      x  ffffffff ... */
	  if (up[usize - 1] != vp[vsize - 1] + 1)
	    goto general_case;
	  usize--;
	  vsize--;
	  exp--;
	}
      else /* ediff == 1 */
	{
	  /* Check for
	     1 00000000 ...
	     0 ffffffff ... */

	  if (up[usize - 1] != 1 || vp[vsize - 1] != GMP_NUMB_MAX
	      || (usize >= 2 && up[usize - 2] != 0))
	    goto general_case;

	  usize--;
	  exp--;
	}

      /* Skip sequences of 00000000/ffffffff */
      while (vsize != 0 && usize != 0 && up[usize - 1] == 0
	     && vp[vsize - 1] == GMP_NUMB_MAX)
	{
	  usize--;
	  vsize--;
	  exp--;
	}

      if (usize == 0)
	{
	  while (vsize != 0 && vp[vsize - 1] == GMP_NUMB_MAX)
	    {
	      vsize--;
	      exp--;
	    }
	}
      else if (usize > prec - 1)
	{
	  up += usize - (prec - 1);
	  usize = prec - 1;
	}
      if (vsize > prec - 1)
	{
	  vp += vsize - (prec - 1);
	  vsize = prec - 1;
	}

      tp = TMP_ALLOC_LIMBS (prec);
      {
	mp_limb_t cy_limb;
	if (vsize == 0)
	  {
	    MPN_COPY (tp, up, usize);
	    tp[usize] = 1;
	    rsize = usize + 1;
	    exp++;
	    goto normalized;
	  }
	if (usize == 0)
	  {
	    cy_limb = mpn_neg (tp, vp, vsize);
	    rsize = vsize;
	  }
	else if (usize >= vsize)
	  {
	    /* uuuu     */
	    /* vv       */
	    mp_size_t size;
	    size = usize - vsize;
	    MPN_COPY (tp, up, size);
	    cy_limb = mpn_sub_n (tp + size, up + size, vp, vsize);
	    rsize = usize;
	  }
	else /* (usize < vsize) */
	  {
	    /* uuuu     */
	    /* vvvvvvv  */
	    mp_size_t size;
	    size = vsize - usize;
	    cy_limb = mpn_neg (tp, vp, size);
	    cy_limb = mpn_sub_nc (tp + size, up, vp + size, usize, cy_limb);
	    rsize = vsize;
	  }
	if (cy_limb == 0)
	  {
	    tp[rsize] = 1;
	    rsize++;
	    exp++;
	    goto normalized;
	  }
	goto normalize;
      }
    }

general_case:
  /* If U extends beyond PREC, ignore the part that does.  */
  if (usize > prec)
    {
      up += usize - prec;
      usize = prec;
    }

  /* If V extends beyond PREC, ignore the part that does.
     Note that this may make vsize negative.  */
  if (vsize + ediff > prec)
    {
      vp += vsize + ediff - prec;
      vsize = prec - ediff;
    }

  if (ediff >= prec)
    {
      /* V completely cancelled.  */
      if (rp != up)
	MPN_COPY (rp, up, usize);
      rsize = usize;
    }
  else
    {
      /* Allocate temp space for the result.  Allocate
	 just vsize + ediff later???  */
      tp = TMP_ALLOC_LIMBS (prec);

      /* Locate the least significant non-zero limb in (the needed
	 parts of) U and V, to simplify the code below.  */
      for (;;)
	{
	  if (vsize == 0)
	    {
	      MPN_COPY (rp, up, usize);
	      rsize = usize;
	      goto done;
	    }
	  if (vp[0] != 0)
	    break;
	  vp++, vsize--;
	}
      for (;;)
	{
	  if (usize == 0)
	    {
	      MPN_COPY (rp, vp, vsize);
	      rsize = vsize;
	      negate ^= 1;
	      goto done;
	    }
	  if (up[0] != 0)
	    break;
	  up++, usize--;
	}

      /* uuuu     |  uuuu     |  uuuu     |  uuuu     |  uuuu    */
      /* vvvvvvv  |  vv       |    vvvvv  |    v      |       vv */

      if (usize > ediff)
	{
	  /* U and V partially overlaps.  */
	  if (ediff == 0)
	    {
	      /* Have to compare the leading limbs of u and v
		 to determine whether to compute u - v or v - u.  */
	      if (usize >= vsize)
		{
		  /* uuuu     */
		  /* vv       */
		  mp_size_t size;
		  size = usize - vsize;
		  MPN_COPY (tp, up, size);
		  mpn_sub_n (tp + size, up + size, vp, vsize);
		  rsize = usize;
		}
	      else /* (usize < vsize) */
		{
		  /* uuuu     */
		  /* vvvvvvv  */
		  mp_size_t size;
		  size = vsize - usize;
		  ASSERT_CARRY (mpn_neg (tp, vp, size));
		  mpn_sub_nc (tp + size, up, vp + size, usize, CNST_LIMB (1));
		  rsize = vsize;
		}
	    }
	  else
	    {
	      if (vsize + ediff <= usize)
		{
		  /* uuuu     */
		  /*   v      */
		  mp_size_t size;
		  size = usize - ediff - vsize;
		  MPN_COPY (tp, up, size);
		  mpn_sub (tp + size, up + size, usize - size, vp, vsize);
		  rsize = usize;
		}
	      else
		{
		  /* uuuu     */
		  /*   vvvvv  */
		  mp_size_t size;
		  rsize = vsize + ediff;
		  size = rsize - usize;
		  ASSERT_CARRY (mpn_neg (tp, vp, size));
		  mpn_sub (tp + size, up, usize, vp + size, usize - ediff);
		  /* Should we use sub_nc then sub_1? */
		  MPN_DECR_U (tp + size, usize, CNST_LIMB (1));
		}
	    }
	}
      else
	{
	  /* uuuu     */
	  /*      vv  */
	  mp_size_t size, i;
	  size = vsize + ediff - usize;
	  ASSERT_CARRY (mpn_neg (tp, vp, vsize));
	  for (i = vsize; i < size; i++)
	    tp[i] = GMP_NUMB_MAX;
	  mpn_sub_1 (tp + size, up, usize, (mp_limb_t) 1);
	  rsize = size + usize;
	}

    normalize:
      /* Full normalize.  Optimize later.  */
      while (rsize != 0 && tp[rsize - 1] == 0)
	{
	  rsize--;
	  exp--;
	}
    normalized:
      MPN_COPY (rp, tp, rsize);
    }

 done:
  TMP_FREE;
  if (rsize == 0) {
    SIZ (r) = 0;
    EXP (r) = 0;
  } else {
    SIZ (r) = negate ? -rsize : rsize;
    EXP (r) = exp;
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x130, %rsp            # imm = 0x130
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x10(%rbp), %rax
movslq 0x4(%rax), %rax
movq %rax, -0x40(%rbp)
movq -0x18(%rbp), %rax
movslq 0x4(%rax), %rax
movq %rax, -0x48(%rbp)
cmpq $0x0, -0x40(%rbp)
jne 0x35238
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x369e0
jmp 0x35f13
cmpq $0x0, -0x48(%rbp)
jne 0x3525b
movq -0x8(%rbp), %rax
cmpq -0x10(%rbp), %rax
je 0x35256
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x336c0
jmp 0x35f13
movq -0x40(%rbp), %rax
xorq -0x48(%rbp), %rax
cmpq $0x0, %rax
jge 0x352a9
xorl %eax, %eax
subq -0x48(%rbp), %rax
movl %eax, -0x8c(%rbp)
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x88(%rbp)
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x80(%rbp)
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
leaq -0x90(%rbp), %rdx
callq 0x34c50
jmp 0x35f13
movq $0x0, -0x78(%rbp)
cmpq $0x0, -0x40(%rbp)
setl %al
andb $0x1, %al
movzbl %al, %eax
movl %eax, -0x6c(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x18(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jge 0x35312
movq -0x10(%rbp), %rax
movq %rax, -0x98(%rbp)
movq -0x18(%rbp), %rax
movq %rax, -0x10(%rbp)
movq -0x98(%rbp), %rax
movq %rax, -0x18(%rbp)
movl -0x6c(%rbp), %eax
xorl $0x1, %eax
movl %eax, -0x6c(%rbp)
movq -0x10(%rbp), %rax
movslq 0x4(%rax), %rax
movq %rax, -0x40(%rbp)
movq -0x18(%rbp), %rax
movslq 0x4(%rax), %rax
movq %rax, -0x48(%rbp)
cmpq $0x0, -0x40(%rbp)
jl 0x35326
movq -0x40(%rbp), %rax
movq %rax, -0x100(%rbp)
jmp 0x35333
xorl %eax, %eax
subq -0x40(%rbp), %rax
movq %rax, -0x100(%rbp)
movq -0x100(%rbp), %rax
movq %rax, -0x40(%rbp)
cmpq $0x0, -0x48(%rbp)
jl 0x35352
movq -0x48(%rbp), %rax
movq %rax, -0x108(%rbp)
jmp 0x3535f
xorl %eax, %eax
subq -0x48(%rbp), %rax
movq %rax, -0x108(%rbp)
movq -0x108(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x20(%rbp)
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x28(%rbp)
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rax
movl (%rax), %eax
addl $0x1, %eax
cltq
movq %rax, -0x58(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rax
movq -0x18(%rbp), %rcx
subq 0x8(%rcx), %rax
movq %rax, -0x68(%rbp)
cmpq $0x1, -0x68(%rbp)
jg 0x35984
cmpq $0x0, -0x68(%rbp)
jne 0x355b2
jmp 0x353d1
movq -0x20(%rbp), %rax
movq -0x40(%rbp), %rcx
subq $0x1, %rcx
movq (%rax,%rcx,8), %rax
movq -0x28(%rbp), %rcx
movq -0x48(%rbp), %rdx
subq $0x1, %rdx
cmpq (%rcx,%rdx,8), %rax
jne 0x354ef
movq -0x40(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x40(%rbp)
movq -0x48(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x48(%rbp)
movq -0x60(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x60(%rbp)
cmpq $0x0, -0x40(%rbp)
jne 0x354ce
movl -0x6c(%rbp), %eax
xorl $0x1, %eax
movl %eax, -0x6c(%rbp)
jmp 0x35431
xorl %eax, %eax
cmpq $0x0, -0x48(%rbp)
movb %al, -0x109(%rbp)
je 0x3545a
movq -0x28(%rbp), %rax
movq -0x48(%rbp), %rcx
subq $0x1, %rcx
cmpq $0x0, (%rax,%rcx,8)
sete %al
movb %al, -0x109(%rbp)
movb -0x109(%rbp), %al
testb $0x1, %al
jne 0x35466
jmp 0x35480
movq -0x48(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x48(%rbp)
movq -0x60(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x60(%rbp)
jmp 0x35431
movq -0x48(%rbp), %rax
cmpq -0x58(%rbp), %rax
jle 0x354a6
movq -0x48(%rbp), %rax
subq -0x58(%rbp), %rax
shlq $0x3, %rax
addq -0x28(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x58(%rbp), %rax
movq %rax, -0x48(%rbp)
jmp 0x354a8
jmp 0x354aa
jmp 0x354ac
jmp 0x354ae
jmp 0x354b0
movq -0x30(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0x48(%rbp), %rdx
callq 0x554c6
movq -0x48(%rbp), %rax
movq %rax, -0x50(%rbp)
jmp 0x35e8a
cmpq $0x0, -0x48(%rbp)
jne 0x354ea
movq -0x20(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x40(%rbp), %rax
movq %rax, -0x48(%rbp)
jmp 0x3542f
jmp 0x353d1
movq -0x20(%rbp), %rax
movq -0x40(%rbp), %rcx
subq $0x1, %rcx
movq (%rax,%rcx,8), %rax
movq -0x28(%rbp), %rcx
movq -0x48(%rbp), %rdx
subq $0x1, %rdx
cmpq (%rcx,%rdx,8), %rax
jae 0x3555e
jmp 0x35513
jmp 0x35515
movq -0x20(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq -0x28(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0xa0(%rbp), %rax
movq %rax, -0x28(%rbp)
jmp 0x35535
movq -0x40(%rbp), %rax
movq %rax, -0xa8(%rbp)
movq -0x48(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0xa8(%rbp), %rax
movq %rax, -0x48(%rbp)
jmp 0x35555
movl -0x6c(%rbp), %eax
xorl $0x1, %eax
movl %eax, -0x6c(%rbp)
movq -0x20(%rbp), %rax
movq -0x40(%rbp), %rcx
subq $0x1, %rcx
movq (%rax,%rcx,8), %rax
movq -0x28(%rbp), %rcx
movq -0x48(%rbp), %rdx
subq $0x1, %rdx
movq (%rcx,%rdx,8), %rcx
addq $0x1, %rcx
cmpq %rcx, %rax
je 0x3558c
jmp 0x35986
movq -0x40(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x40(%rbp)
movq -0x48(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x48(%rbp)
movq -0x60(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x60(%rbp)
jmp 0x3560f
movq -0x20(%rbp), %rax
movq -0x40(%rbp), %rcx
subq $0x1, %rcx
cmpq $0x1, (%rax,%rcx,8)
jne 0x355f2
movq -0x28(%rbp), %rax
movq -0x48(%rbp), %rcx
subq $0x1, %rcx
cmpq $-0x1, (%rax,%rcx,8)
jne 0x355f2
cmpq $0x2, -0x40(%rbp)
jl 0x355f7
movq -0x20(%rbp), %rax
movq -0x40(%rbp), %rcx
subq $0x2, %rcx
cmpq $0x0, (%rax,%rcx,8)
je 0x355f7
jmp 0x35986
movq -0x40(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x40(%rbp)
movq -0x60(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x60(%rbp)
jmp 0x35611
xorl %eax, %eax
cmpq $0x0, -0x48(%rbp)
movb %al, -0x10a(%rbp)
je 0x35664
xorl %eax, %eax
cmpq $0x0, -0x40(%rbp)
movb %al, -0x10a(%rbp)
je 0x35664
movq -0x20(%rbp), %rcx
movq -0x40(%rbp), %rdx
subq $0x1, %rdx
xorl %eax, %eax
cmpq $0x0, (%rcx,%rdx,8)
movb %al, -0x10a(%rbp)
jne 0x35664
movq -0x28(%rbp), %rax
movq -0x48(%rbp), %rcx
subq $0x1, %rcx
cmpq $-0x1, (%rax,%rcx,8)
sete %al
movb %al, -0x10a(%rbp)
movb -0x10a(%rbp), %al
testb $0x1, %al
jne 0x35670
jmp 0x35699
movq -0x40(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x40(%rbp)
movq -0x48(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x48(%rbp)
movq -0x60(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x60(%rbp)
jmp 0x35611
cmpq $0x0, -0x40(%rbp)
jne 0x356f3
jmp 0x356a2
xorl %eax, %eax
cmpq $0x0, -0x48(%rbp)
movb %al, -0x10b(%rbp)
je 0x356cb
movq -0x28(%rbp), %rax
movq -0x48(%rbp), %rcx
subq $0x1, %rcx
cmpq $-0x1, (%rax,%rcx,8)
sete %al
movb %al, -0x10b(%rbp)
movb -0x10b(%rbp), %al
testb $0x1, %al
jne 0x356d7
jmp 0x356f1
movq -0x48(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x48(%rbp)
movq -0x60(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x60(%rbp)
jmp 0x356a2
jmp 0x3572d
movq -0x40(%rbp), %rax
movq -0x58(%rbp), %rcx
subq $0x1, %rcx
cmpq %rcx, %rax
jle 0x3572b
movq -0x40(%rbp), %rax
movq -0x58(%rbp), %rcx
subq $0x1, %rcx
subq %rcx, %rax
shlq $0x3, %rax
addq -0x20(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x58(%rbp), %rax
subq $0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0x3572d
movq -0x48(%rbp), %rax
movq -0x58(%rbp), %rcx
subq $0x1, %rcx
cmpq %rcx, %rax
jle 0x35765
movq -0x48(%rbp), %rax
movq -0x58(%rbp), %rcx
subq $0x1, %rcx
subq %rcx, %rax
shlq $0x3, %rax
addq -0x28(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x58(%rbp), %rax
subq $0x1, %rax
movq %rax, -0x48(%rbp)
movq -0x58(%rbp), %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 0x357b0
movq -0x58(%rbp), %rax
leaq 0xf(,%rax,8), %rcx
andq $-0x10, %rcx
movq %rsp, %rax
subq %rcx, %rax
movq %rax, %rsp
movq %rax, -0x118(%rbp)
jmp 0x357c8
movq -0x58(%rbp), %rsi
shlq $0x3, %rsi
leaq -0x78(%rbp), %rdi
callq 0x56430
movq %rax, -0x118(%rbp)
movq -0x118(%rbp), %rax
movq %rax, -0x38(%rbp)
cmpq $0x0, -0x48(%rbp)
jne 0x3582a
jmp 0x357dc
jmp 0x357de
jmp 0x357e0
jmp 0x357e2
jmp 0x357e4
jmp 0x357e6
jmp 0x357e8
jmp 0x357ea
movq -0x38(%rbp), %rdi
movq -0x20(%rbp), %rsi
movq -0x40(%rbp), %rdx
callq 0x554c6
jmp 0x357fd
movq -0x38(%rbp), %rax
movq -0x40(%rbp), %rcx
movq $0x1, (%rax,%rcx,8)
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x50(%rbp)
movq -0x60(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x60(%rbp)
jmp 0x35e63
cmpq $0x0, -0x40(%rbp)
jne 0x35856
movq -0x38(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0x48(%rbp), %rdx
callq 0x370c0
movq %rax, -0xb0(%rbp)
movq -0x48(%rbp), %rax
movq %rax, -0x50(%rbp)
jmp 0x35948
movq -0x40(%rbp), %rax
cmpq -0x48(%rbp), %rax
jl 0x358d5
movq -0x40(%rbp), %rax
subq -0x48(%rbp), %rax
movq %rax, -0xb8(%rbp)
jmp 0x35871
jmp 0x35873
jmp 0x35875
jmp 0x35877
jmp 0x35879
jmp 0x3587b
jmp 0x3587d
movq -0x38(%rbp), %rdi
movq -0x20(%rbp), %rsi
movq -0xb8(%rbp), %rdx
callq 0x554c6
jmp 0x35893
movq -0x38(%rbp), %rdi
movq -0xb8(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x20(%rbp), %rsi
movq -0xb8(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rsi
movq -0x28(%rbp), %rdx
movq -0x48(%rbp), %rcx
callq 0x36fe0
movq %rax, -0xb0(%rbp)
movq -0x40(%rbp), %rax
movq %rax, -0x50(%rbp)
jmp 0x35946
movq -0x48(%rbp), %rax
subq -0x40(%rbp), %rax
movq %rax, -0xc0(%rbp)
movq -0x38(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0xc0(%rbp), %rdx
callq 0x370c0
movq %rax, -0xb0(%rbp)
movq -0x38(%rbp), %rdi
movq -0xc0(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x20(%rbp), %rsi
movq -0x28(%rbp), %rdx
movq -0xc0(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdx
movq -0x40(%rbp), %rcx
movq -0xb0(%rbp), %r8
callq 0x36fc0
movq %rax, -0xb0(%rbp)
movq -0x48(%rbp), %rax
movq %rax, -0x50(%rbp)
jmp 0x35948
cmpq $0x0, -0xb0(%rbp)
jne 0x3597f
movq -0x38(%rbp), %rax
movq -0x50(%rbp), %rcx
movq $0x1, (%rax,%rcx,8)
movq -0x50(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x50(%rbp)
movq -0x60(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x60(%rbp)
jmp 0x35e63
jmp 0x35e10
jmp 0x35986
movq -0x40(%rbp), %rax
cmpq -0x58(%rbp), %rax
jle 0x359ac
movq -0x40(%rbp), %rax
subq -0x58(%rbp), %rax
shlq $0x3, %rax
addq -0x20(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x58(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x48(%rbp), %rax
addq -0x68(%rbp), %rax
cmpq -0x58(%rbp), %rax
jle 0x359de
movq -0x48(%rbp), %rax
addq -0x68(%rbp), %rax
subq -0x58(%rbp), %rax
shlq $0x3, %rax
addq -0x28(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x58(%rbp), %rax
subq -0x68(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x68(%rbp), %rax
cmpq -0x58(%rbp), %rax
jl 0x35a24
movq -0x30(%rbp), %rax
cmpq -0x20(%rbp), %rax
je 0x35a17
jmp 0x359f4
jmp 0x359f6
jmp 0x359f8
jmp 0x359fa
jmp 0x359fc
jmp 0x359fe
jmp 0x35a00
jmp 0x35a02
movq -0x30(%rbp), %rdi
movq -0x20(%rbp), %rsi
movq -0x40(%rbp), %rdx
callq 0x554c6
jmp 0x35a15
jmp 0x35a17
movq -0x40(%rbp), %rax
movq %rax, -0x50(%rbp)
jmp 0x35e88
movq -0x58(%rbp), %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 0x35a6f
movq -0x58(%rbp), %rax
leaq 0xf(,%rax,8), %rcx
andq $-0x10, %rcx
movq %rsp, %rax
subq %rcx, %rax
movq %rax, %rsp
movq %rax, -0x120(%rbp)
jmp 0x35a87
movq -0x58(%rbp), %rsi
shlq $0x3, %rsi
leaq -0x78(%rbp), %rdi
callq 0x56430
movq %rax, -0x120(%rbp)
movq -0x120(%rbp), %rax
movq %rax, -0x38(%rbp)
cmpq $0x0, -0x48(%rbp)
jne 0x35ac9
jmp 0x35a9b
jmp 0x35a9d
jmp 0x35a9f
jmp 0x35aa1
jmp 0x35aa3
jmp 0x35aa5
jmp 0x35aa7
jmp 0x35aa9
movq -0x30(%rbp), %rdi
movq -0x20(%rbp), %rsi
movq -0x40(%rbp), %rdx
callq 0x554c6
jmp 0x35abc
movq -0x40(%rbp), %rax
movq %rax, -0x50(%rbp)
jmp 0x35e8a
movq -0x28(%rbp), %rax
cmpq $0x0, (%rax)
je 0x35ad5
jmp 0x35aef
movq -0x28(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x28(%rbp)
movq -0x48(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x48(%rbp)
jmp 0x35a92
jmp 0x35af1
cmpq $0x0, -0x40(%rbp)
jne 0x35b31
jmp 0x35afa
jmp 0x35afc
jmp 0x35afe
jmp 0x35b00
jmp 0x35b02
jmp 0x35b04
jmp 0x35b06
jmp 0x35b08
movq -0x30(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0x48(%rbp), %rdx
callq 0x554c6
jmp 0x35b1b
movq -0x48(%rbp), %rax
movq %rax, -0x50(%rbp)
movl -0x6c(%rbp), %eax
xorl $0x1, %eax
movl %eax, -0x6c(%rbp)
jmp 0x35e8a
movq -0x20(%rbp), %rax
cmpq $0x0, (%rax)
je 0x35b3d
jmp 0x35b57
movq -0x20(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x20(%rbp)
movq -0x40(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0x35af1
movq -0x40(%rbp), %rax
cmpq -0x68(%rbp), %rax
jle 0x35d75
cmpq $0x0, -0x68(%rbp)
jne 0x35c4f
movq -0x40(%rbp), %rax
cmpq -0x48(%rbp), %rax
jl 0x35be8
movq -0x40(%rbp), %rax
subq -0x48(%rbp), %rax
movq %rax, -0xc8(%rbp)
jmp 0x35b8b
jmp 0x35b8d
jmp 0x35b8f
jmp 0x35b91
jmp 0x35b93
jmp 0x35b95
jmp 0x35b97
movq -0x38(%rbp), %rdi
movq -0x20(%rbp), %rsi
movq -0xc8(%rbp), %rdx
callq 0x554c6
jmp 0x35bad
movq -0x38(%rbp), %rdi
movq -0xc8(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x20(%rbp), %rsi
movq -0xc8(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rsi
movq -0x28(%rbp), %rdx
movq -0x48(%rbp), %rcx
callq 0x36fe0
movq -0x40(%rbp), %rax
movq %rax, -0x50(%rbp)
jmp 0x35c4a
movq -0x48(%rbp), %rax
subq -0x40(%rbp), %rax
movq %rax, -0xd0(%rbp)
movq -0x38(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0xd0(%rbp), %rdx
callq 0x370c0
movq -0x38(%rbp), %rdi
movq -0xd0(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x20(%rbp), %rsi
movq -0x28(%rbp), %rdx
movq -0xd0(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdx
movq -0x40(%rbp), %rcx
movl $0x1, %r8d
callq 0x36fc0
movq -0x48(%rbp), %rax
movq %rax, -0x50(%rbp)
jmp 0x35d70
movq -0x48(%rbp), %rax
addq -0x68(%rbp), %rax
cmpq -0x40(%rbp), %rax
jg 0x35ce1
movq -0x40(%rbp), %rax
subq -0x68(%rbp), %rax
subq -0x48(%rbp), %rax
movq %rax, -0xd8(%rbp)
jmp 0x35c76
jmp 0x35c78
jmp 0x35c7a
jmp 0x35c7c
jmp 0x35c7e
jmp 0x35c80
jmp 0x35c82
movq -0x38(%rbp), %rdi
movq -0x20(%rbp), %rsi
movq -0xd8(%rbp), %rdx
callq 0x554c6
jmp 0x35c98
movq -0x38(%rbp), %rdi
movq -0xd8(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x20(%rbp), %rsi
movq -0xd8(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rsi
movq -0x40(%rbp), %rdx
subq -0xd8(%rbp), %rdx
movq -0x28(%rbp), %rcx
movq -0x48(%rbp), %r8
callq 0x36d60
movq -0x40(%rbp), %rax
movq %rax, -0x50(%rbp)
jmp 0x35d6e
movq -0x48(%rbp), %rax
addq -0x68(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rax
subq -0x40(%rbp), %rax
movq %rax, -0xe0(%rbp)
movq -0x38(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0xe0(%rbp), %rdx
callq 0x370c0
movq -0x38(%rbp), %rdi
movq -0xe0(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x20(%rbp), %rsi
movq -0x40(%rbp), %rdx
movq -0x28(%rbp), %rcx
movq -0xe0(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rcx
movq -0x40(%rbp), %r8
subq -0x68(%rbp), %r8
callq 0x36d60
movq -0x38(%rbp), %rax
movq -0xe0(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
subq $0x1, (%rax)
leaq 0x8(%rax), %rax
jb 0x35d5b
movq %rax, -0xe8(%rbp)
jmp 0x35d6e
jmp 0x35d70
jmp 0x35e0e
movq -0x48(%rbp), %rax
addq -0x68(%rbp), %rax
subq -0x40(%rbp), %rax
movq %rax, -0xf0(%rbp)
movq -0x38(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0x48(%rbp), %rdx
callq 0x370c0
movq -0x48(%rbp), %rax
movq %rax, -0xf8(%rbp)
movq -0xf8(%rbp), %rax
cmpq -0xf0(%rbp), %rax
jge 0x35ddb
movq -0x38(%rbp), %rax
movq -0xf8(%rbp), %rcx
movq $-0x1, (%rax,%rcx,8)
movq -0xf8(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xf8(%rbp)
jmp 0x35da4
movq -0x38(%rbp), %rdi
movq -0xf0(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rdi
movq -0x20(%rbp), %rsi
movq -0x40(%rbp), %rdx
movl $0x1, %ecx
callq 0x36e60
movq -0xf0(%rbp), %rax
addq -0x40(%rbp), %rax
movq %rax, -0x50(%rbp)
jmp 0x35e10
jmp 0x35e12
xorl %eax, %eax
cmpq $0x0, -0x50(%rbp)
movb %al, -0x121(%rbp)
je 0x35e3b
movq -0x38(%rbp), %rax
movq -0x50(%rbp), %rcx
subq $0x1, %rcx
cmpq $0x0, (%rax,%rcx,8)
sete %al
movb %al, -0x121(%rbp)
movb -0x121(%rbp), %al
testb $0x1, %al
jne 0x35e47
jmp 0x35e61
movq -0x50(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x50(%rbp)
movq -0x60(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x60(%rbp)
jmp 0x35e12
jmp 0x35e63
jmp 0x35e65
jmp 0x35e67
jmp 0x35e69
jmp 0x35e6b
jmp 0x35e6d
jmp 0x35e6f
jmp 0x35e71
jmp 0x35e73
movq -0x30(%rbp), %rdi
movq -0x38(%rbp), %rsi
movq -0x50(%rbp), %rdx
callq 0x554c6
jmp 0x35e86
jmp 0x35e88
jmp 0x35e8a
jmp 0x35e8c
cmpq $0x0, -0x78(%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 0x35eb5
movq -0x78(%rbp), %rdi
callq 0x564a0
jmp 0x35eb7
cmpq $0x0, -0x50(%rbp)
jne 0x35ed7
movq -0x8(%rbp), %rax
movl $0x0, 0x4(%rax)
movq -0x8(%rbp), %rax
movq $0x0, 0x8(%rax)
jmp 0x35f13
cmpl $0x0, -0x6c(%rbp)
je 0x35eec
xorl %eax, %eax
subq -0x50(%rbp), %rax
movq %rax, -0x130(%rbp)
jmp 0x35ef7
movq -0x50(%rbp), %rax
movq %rax, -0x130(%rbp)
movq -0x130(%rbp), %rax
movl %eax, %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x4(%rax)
movq -0x60(%rbp), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x8(%rax)
movq %rbp, %rsp
popq %rbp
retq
nopl (%rax,%rax)