// File: marxn[P]pupp/3rdparty/gmp/mpf/mul.c
// Function: _gmpf_mul
void
mpf_mul (mpf_ptr r, mpf_srcptr u, mpf_srcptr v)
{
  mp_srcptr up, vp;
  mp_size_t usize, vsize;
  mp_size_t sign_product;
  mp_size_t prec = r->_mp_prec;

  usize = u->_mp_size;
  vsize = v->_mp_size;
  sign_product = usize ^ vsize;

  usize = ABS (usize);
  vsize = ABS (vsize);

  up = u->_mp_d;
  vp = v->_mp_d;
  if (usize > prec)
    {
      up += usize - prec;
      usize = prec;
    }
  if (vsize > prec)
    {
      vp += vsize - prec;
      vsize = prec;
    }

  if (usize == 0 || vsize == 0)
    {
      r->_mp_size = 0;
      r->_mp_exp = 0;		/* ??? */
    }
  else
    {
      mp_size_t rsize;
      mp_limb_t cy_limb;
      mp_ptr rp, tp;
      mp_size_t adj;
      TMP_DECL;

      TMP_MARK;
      rsize = usize + vsize;
      tp = TMP_ALLOC_LIMBS (rsize);
      cy_limb = (usize >= vsize
		 ? mpn_mul (tp, up, usize, vp, vsize)
		 : mpn_mul (tp, vp, vsize, up, usize));

      adj = cy_limb == 0;
      rsize -= adj;
      prec++;
      if (rsize > prec)
	{
	  tp += rsize - prec;
	  rsize = prec;
	}
      rp = r->_mp_d;
      MPN_COPY (rp, tp, rsize);
      r->_mp_exp = u->_mp_exp + v->_mp_exp - adj;
      r->_mp_size = sign_product >= 0 ? rsize : -rsize;

      TMP_FREE;
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xa0, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x8(%rbp), %rax
movslq (%rax), %rax
movq %rax, -0x48(%rbp)
movq -0x10(%rbp), %rax
movslq 0x4(%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x18(%rbp), %rax
movslq 0x4(%rax), %rax
movq %rax, -0x38(%rbp)
movq -0x30(%rbp), %rax
xorq -0x38(%rbp), %rax
movq %rax, -0x40(%rbp)
cmpq $0x0, -0x30(%rbp)
jl 0x35f77
movq -0x30(%rbp), %rax
movq %rax, -0x80(%rbp)
jmp 0x35f81
xorl %eax, %eax
subq -0x30(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x80(%rbp), %rax
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x38(%rbp)
jl 0x35f9d
movq -0x38(%rbp), %rax
movq %rax, -0x88(%rbp)
jmp 0x35faa
xorl %eax, %eax
subq -0x38(%rbp), %rax
movq %rax, -0x88(%rbp)
movq -0x88(%rbp), %rax
movq %rax, -0x38(%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 -0x30(%rbp), %rax
cmpq -0x48(%rbp), %rax
jle 0x35ff3
movq -0x30(%rbp), %rax
subq -0x48(%rbp), %rax
shlq $0x3, %rax
addq -0x20(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x48(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x38(%rbp), %rax
cmpq -0x48(%rbp), %rax
jle 0x36019
movq -0x38(%rbp), %rax
subq -0x48(%rbp), %rax
shlq $0x3, %rax
addq -0x28(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x48(%rbp), %rax
movq %rax, -0x38(%rbp)
cmpq $0x0, -0x30(%rbp)
je 0x36027
cmpq $0x0, -0x38(%rbp)
jne 0x36043
movq -0x8(%rbp), %rax
movl $0x0, 0x4(%rax)
movq -0x8(%rbp), %rax
movq $0x0, 0x8(%rax)
jmp 0x36217
movq $0x0, -0x78(%rbp)
movq -0x30(%rbp), %rax
addq -0x38(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x50(%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 0x360a2
movq -0x50(%rbp), %rax
leaq 0xf(,%rax,8), %rcx
andq $-0x10, %rcx
movq %rsp, %rax
subq %rcx, %rax
movq %rax, %rsp
movq %rax, -0x90(%rbp)
jmp 0x360ba
movq -0x50(%rbp), %rsi
shlq $0x3, %rsi
leaq -0x78(%rbp), %rdi
callq 0x56430
movq %rax, -0x90(%rbp)
movq -0x90(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x30(%rbp), %rax
cmpq -0x38(%rbp), %rax
jl 0x360f1
movq -0x68(%rbp), %rdi
movq -0x20(%rbp), %rsi
movq -0x30(%rbp), %rdx
movq -0x28(%rbp), %rcx
movq -0x38(%rbp), %r8
callq 0x37f00
movq %rax, -0x98(%rbp)
jmp 0x36111
movq -0x68(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0x38(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x30(%rbp), %r8
callq 0x37f00
movq %rax, -0x98(%rbp)
movq -0x98(%rbp), %rax
movq %rax, -0x58(%rbp)
cmpq $0x0, -0x58(%rbp)
sete %al
andb $0x1, %al
movzbl %al, %eax
cltq
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rcx
movq -0x50(%rbp), %rax
subq %rcx, %rax
movq %rax, -0x50(%rbp)
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
movq -0x50(%rbp), %rax
cmpq -0x48(%rbp), %rax
jle 0x36170
movq -0x50(%rbp), %rax
subq -0x48(%rbp), %rax
shlq $0x3, %rax
addq -0x68(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x48(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x60(%rbp)
jmp 0x3617e
jmp 0x36180
jmp 0x36182
jmp 0x36184
jmp 0x36186
jmp 0x36188
jmp 0x3618a
movq -0x60(%rbp), %rdi
movq -0x68(%rbp), %rsi
movq -0x50(%rbp), %rdx
callq 0x554c6
jmp 0x3619d
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x18(%rbp), %rax
addq 0x8(%rax), %rcx
subq -0x70(%rbp), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x8(%rax)
cmpq $0x0, -0x40(%rbp)
jl 0x361cd
movq -0x50(%rbp), %rax
movq %rax, -0xa0(%rbp)
jmp 0x361da
xorl %eax, %eax
subq -0x50(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq -0xa0(%rbp), %rax
movl %eax, %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x4(%rax)
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 0x36213
movq -0x78(%rbp), %rdi
callq 0x564a0
jmp 0x36215
jmp 0x36217
movq %rbp, %rsp
popq %rbp
retq
nopl (%rax)