Add libgmp 6.2.0 to third_party

Don't build it yet.  That will come in the next review.

Change-Id: Idf3266558165e5ab45f4a41c98cc8c838c8244d5
diff --git a/third_party/gmp/mpz/hamdist.c b/third_party/gmp/mpz/hamdist.c
new file mode 100644
index 0000000..1dfb7b8
--- /dev/null
+++ b/third_party/gmp/mpz/hamdist.c
@@ -0,0 +1,174 @@
+/* mpz_hamdist -- calculate hamming distance.
+
+Copyright 1994, 1996, 2001, 2002, 2009-2011 Free Software Foundation, Inc.
+
+This file is part of the GNU MP Library.
+
+The GNU MP Library is free software; you can redistribute it and/or modify
+it under the terms of either:
+
+  * the GNU Lesser General Public License as published by the Free
+    Software Foundation; either version 3 of the License, or (at your
+    option) any later version.
+
+or
+
+  * the GNU General Public License as published by the Free Software
+    Foundation; either version 2 of the License, or (at your option) any
+    later version.
+
+or both in parallel, as here.
+
+The GNU MP Library is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received copies of the GNU General Public License and the
+GNU Lesser General Public License along with the GNU MP Library.  If not,
+see https://www.gnu.org/licenses/.  */
+
+#include "gmp-impl.h"
+
+
+mp_bitcnt_t
+mpz_hamdist (mpz_srcptr u, mpz_srcptr v) __GMP_NOTHROW
+{
+  mp_srcptr      up, vp;
+  mp_size_t      usize, vsize;
+  mp_bitcnt_t    count;
+
+  usize = SIZ(u);
+  vsize = SIZ(v);
+
+  up = PTR(u);
+  vp = PTR(v);
+
+  if (usize >= 0)
+    {
+      if (vsize < 0)
+	return ~ (mp_bitcnt_t) 0;
+
+      /* positive/positive */
+
+      if (usize < vsize)
+	MPN_SRCPTR_SWAP (up,usize, vp,vsize);
+
+      count = 0;
+      if (vsize != 0)
+	count = mpn_hamdist (up, vp, vsize);
+
+      usize -= vsize;
+      if (usize != 0)
+	count += mpn_popcount (up + vsize, usize);
+
+      return count;
+    }
+  else
+    {
+      mp_limb_t  ulimb, vlimb;
+      mp_size_t  old_vsize, step;
+
+      if (vsize >= 0)
+	return ~ (mp_bitcnt_t) 0;
+
+      /* negative/negative */
+
+      usize = -usize;
+      vsize = -vsize;
+
+      /* skip common low zeros */
+      for (;;)
+	{
+	  ASSERT (usize > 0);
+	  ASSERT (vsize > 0);
+
+	  usize--;
+	  vsize--;
+
+	  ulimb = *up++;
+	  vlimb = *vp++;
+
+	  if (ulimb != 0)
+	    break;
+
+	  if (vlimb != 0)
+	    {
+	      MPN_SRCPTR_SWAP (up,usize, vp,vsize);
+	      ulimb = vlimb;
+	      vlimb = 0;
+	      break;
+	    }
+	}
+
+      /* twos complement first non-zero limbs (ulimb is non-zero, but vlimb
+	 might be zero) */
+      ulimb = -ulimb;
+      vlimb = -vlimb;
+      popc_limb (count, (ulimb ^ vlimb) & GMP_NUMB_MASK);
+
+      if (vlimb == 0)
+	{
+	  mp_bitcnt_t  twoscount;
+
+	  /* first non-zero of v */
+	  old_vsize = vsize;
+	  do
+	    {
+	      ASSERT (vsize > 0);
+	      vsize--;
+	      vlimb = *vp++;
+	    }
+	  while (vlimb == 0);
+
+	  /* part of u corresponding to skipped v zeros */
+	  step = old_vsize - vsize - 1;
+	  count += step * GMP_NUMB_BITS;
+	  step = MIN (step, usize);
+	  if (step != 0)
+	    {
+	      count -= mpn_popcount (up, step);
+	      usize -= step;
+	      up += step;
+	    }
+
+	  /* First non-zero vlimb as twos complement, xor with ones
+	     complement ulimb.  Note -v^(~0^u) == (v-1)^u. */
+	  vlimb--;
+	  if (usize != 0)
+	    {
+	      usize--;
+	      vlimb ^= *up++;
+	    }
+	  popc_limb (twoscount, vlimb);
+	  count += twoscount;
+	}
+
+      /* Overlapping part of u and v, if any.  Ones complement both, so just
+	 plain hamdist. */
+      step = MIN (usize, vsize);
+      if (step != 0)
+	{
+	  count += mpn_hamdist (up, vp, step);
+	  usize -= step;
+	  vsize -= step;
+	  up += step;
+	  vp += step;
+	}
+
+      /* Remaining high part of u or v, if any, ones complement but xor
+	 against all ones in the other, so plain popcount. */
+      if (usize != 0)
+	{
+	remaining:
+	  count += mpn_popcount (up, usize);
+	}
+      else if (vsize != 0)
+	{
+	  up = vp;
+	  usize = vsize;
+	  goto remaining;
+	}
+      return count;
+    }
+}