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/cong_2exp.c b/third_party/gmp/mpz/cong_2exp.c
new file mode 100644
index 0000000..9de9645
--- /dev/null
+++ b/third_party/gmp/mpz/cong_2exp.c
@@ -0,0 +1,149 @@
+/* mpz_congruent_2exp_p -- test congruence of mpz mod 2^n.
+
+Copyright 2001, 2002, 2013 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"
+
+
+int
+mpz_congruent_2exp_p (mpz_srcptr a, mpz_srcptr c, mp_bitcnt_t d) __GMP_NOTHROW
+{
+  mp_size_t      i, dlimbs;
+  unsigned       dbits;
+  mp_ptr         ap, cp;
+  mp_limb_t      dmask, alimb, climb, sum;
+  mp_size_t      as, cs, asize, csize;
+
+  as = SIZ(a);
+  asize = ABS(as);
+
+  cs = SIZ(c);
+  csize = ABS(cs);
+
+  if (asize < csize)
+    {
+      MPZ_SRCPTR_SWAP (a, c);
+      MP_SIZE_T_SWAP (asize, csize);
+    }
+
+  dlimbs = d / GMP_NUMB_BITS;
+  dbits = d % GMP_NUMB_BITS;
+  dmask = (CNST_LIMB(1) << dbits) - 1;
+
+  ap = PTR(a);
+  cp = PTR(c);
+
+  if (csize == 0)
+    goto a_zeros;
+
+  if ((cs ^ as) >= 0)
+    {
+      /* same signs, direct comparison */
+
+      /* a==c for limbs in common */
+      if (mpn_cmp (ap, cp, MIN (csize, dlimbs)) != 0)
+	return 0;
+
+      /* if that's all of dlimbs, then a==c for remaining bits */
+      if (csize > dlimbs)
+	return ((ap[dlimbs]-cp[dlimbs]) & dmask) == 0;
+
+    a_zeros:
+      /* a remains, need all zero bits */
+
+      /* if d covers all of a and c, then must be exactly equal */
+      if (asize <= dlimbs)
+	return asize == csize;
+
+      /* whole limbs zero */
+      for (i = csize; i < dlimbs; i++)
+	if (ap[i] != 0)
+	  return 0;
+
+      /* partial limb zero */
+      return (ap[dlimbs] & dmask) == 0;
+    }
+  else
+    {
+      /* different signs, negated comparison */
+
+      /* common low zero limbs, stopping at first non-zeros, which must
+	 match twos complement */
+      i = 0;
+      do
+	{
+	  ASSERT (i < csize);  /* always have a non-zero limb on c */
+	  alimb = ap[i];
+	  climb = cp[i];
+	  sum = (alimb + climb) & GMP_NUMB_MASK;
+
+	  if (i >= dlimbs)
+	    return (sum & dmask) == 0;
+	  ++i;
+
+	  /* require both zero, or first non-zeros as twos-complements */
+	  if (sum != 0)
+	    return 0;
+	} while (alimb == 0);
+
+      /* further limbs matching as ones-complement */
+      for (; i < csize; ++i)
+	{
+	  alimb = ap[i];
+	  climb = cp[i];
+	  sum = alimb ^ climb ^ GMP_NUMB_MASK;
+
+	  if (i >= dlimbs)
+	    return (sum & dmask) == 0;
+
+	  if (sum != 0)
+	    return 0;
+	}
+
+      /* no more c, so require all 1 bits in a */
+
+      if (asize < dlimbs)
+	return 0;   /* not enough a */
+
+      /* whole limbs */
+      for ( ; i < dlimbs; i++)
+	if (ap[i] != GMP_NUMB_MAX)
+	  return 0;
+
+      /* if only whole limbs, no further fetches from a */
+      if (dbits == 0)
+	return 1;
+
+      /* need enough a */
+      if (asize == dlimbs)
+	return 0;
+
+      return ((ap[dlimbs]+1) & dmask) == 0;
+    }
+}