// File: marxn[P]pupp/3rdparty/gmp/./mini-gmp/mini-gmp.c
// Function: mpz_hamdist
mp_bitcnt_t
mpz_hamdist (const mpz_t u, const mpz_t v)
{
  mp_size_t un, vn, i;
  mp_limb_t uc, vc, ul, vl, comp;
  mp_srcptr up, vp;
  mp_bitcnt_t c;

  un = u->_mp_size;
  vn = v->_mp_size;

  if ( (un ^ vn) < 0)
    return ~(mp_bitcnt_t) 0;

  comp = - (uc = vc = (un < 0));
  if (uc)
    {
      assert (vn < 0);
      un = -un;
      vn = -vn;
    }

  up = u->_mp_d;
  vp = v->_mp_d;

  if (un < vn)
    MPN_SRCPTR_SWAP (up, un, vp, vn);

  for (i = 0, c = 0; i < vn; i++)
    {
      ul = (up[i] ^ comp) + uc;
      uc = ul < uc;

      vl = (vp[i] ^ comp) + vc;
      vc = vl < vc;

      c += gmp_popcount_limb (ul ^ vl);
    }
  assert (vc == 0);

  for (; i < un; i++)
    {
      ul = (up[i] ^ comp) + uc;
      uc = ul < uc;

      c += gmp_popcount_limb (ul ^ comp);
    }

  return c;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x80, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x10(%rbp), %rax
movslq 0x4(%rax), %rax
movq %rax, -0x20(%rbp)
movq -0x18(%rbp), %rax
movslq 0x4(%rax), %rax
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rax
xorq -0x28(%rbp), %rax
cmpq $0x0, %rax
jge 0x9eb6
movq $-0x1, -0x8(%rbp)
jmp 0xa0a7
cmpq $0x0, -0x20(%rbp)
setl %al
andb $0x1, %al
movzbl %al, %eax
movslq %eax, %rcx
movq %rcx, -0x40(%rbp)
movq %rcx, -0x38(%rbp)
xorl %eax, %eax
subq %rcx, %rax
movq %rax, -0x58(%rbp)
cmpq $0x0, -0x38(%rbp)
je 0x9f1a
cmpq $0x0, -0x28(%rbp)
jge 0x9ee7
jmp 0x9f06
leaq 0x490c(%rip), %rdi      # 0xe7fa
leaq 0x41df(%rip), %rsi      # 0xe0d4
movl $0xf25, %edx            # imm = 0xF25
leaq 0x4900(%rip), %rcx      # 0xe801
callq 0x1070
xorl %eax, %eax
subq -0x20(%rbp), %rax
movq %rax, -0x20(%rbp)
xorl %eax, %eax
subq -0x28(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x60(%rbp)
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x68(%rbp)
movq -0x20(%rbp), %rax
cmpq -0x28(%rbp), %rax
jge 0x9f76
jmp 0x9f3e
jmp 0x9f40
movq -0x60(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x68(%rbp), %rax
movq %rax, -0x60(%rbp)
movq -0x78(%rbp), %rax
movq %rax, -0x68(%rbp)
jmp 0x9f5a
movq -0x20(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x28(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x80(%rbp), %rax
movq %rax, -0x28(%rbp)
jmp 0x9f74
jmp 0x9f76
movq $0x0, -0x30(%rbp)
movq $0x0, -0x70(%rbp)
movq -0x30(%rbp), %rax
cmpq -0x28(%rbp), %rax
jge 0xa018
movq -0x60(%rbp), %rax
movq -0x30(%rbp), %rcx
movq (%rax,%rcx,8), %rax
xorq -0x58(%rbp), %rax
addq -0x38(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
cmpq -0x38(%rbp), %rax
setb %al
andb $0x1, %al
movzbl %al, %eax
cltq
movq %rax, -0x38(%rbp)
movq -0x68(%rbp), %rax
movq -0x30(%rbp), %rcx
movq (%rax,%rcx,8), %rax
xorq -0x58(%rbp), %rax
addq -0x40(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rax
cmpq -0x40(%rbp), %rax
setb %al
andb $0x1, %al
movzbl %al, %eax
cltq
movq %rax, -0x40(%rbp)
movq -0x48(%rbp), %rdi
xorq -0x50(%rbp), %rdi
callq 0x9d80
movl %eax, %eax
addq -0x70(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
jmp 0x9f86
cmpq $0x0, -0x40(%rbp)
jne 0xa021
jmp 0xa040
leaq 0x46ef(%rip), %rdi      # 0xe717
leaq 0x40a5(%rip), %rsi      # 0xe0d4
movl $0xf3a, %edx            # imm = 0xF3A
leaq 0x47c6(%rip), %rcx      # 0xe801
callq 0x1070
jmp 0xa042
movq -0x30(%rbp), %rax
cmpq -0x20(%rbp), %rax
jge 0xa09f
movq -0x60(%rbp), %rax
movq -0x30(%rbp), %rcx
movq (%rax,%rcx,8), %rax
xorq -0x58(%rbp), %rax
addq -0x38(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
cmpq -0x38(%rbp), %rax
setb %al
andb $0x1, %al
movzbl %al, %eax
cltq
movq %rax, -0x38(%rbp)
movq -0x48(%rbp), %rdi
xorq -0x58(%rbp), %rdi
callq 0x9d80
movl %eax, %eax
addq -0x70(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
jmp 0xa042
movq -0x70(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x80, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)