I was looking at how to simplify mini-gmp's mpz_cmp_si. I considered using mpz_cmpabs_ui to handle the case of both inputs negative, which made it more consice but perhaps not clearer. Then I came up with the following.
The pattern (un == 0) ? 0 : u->_mp_d[0] and variants are replaced by calls to mpz_get_ui which does the same thing, and the pattern (a > b) - (a < b) is replaced by a GMP_CMP macro. Resulting context patch below, reducing the code size by a dozen of lines. Do you think this is also an improvement in clarity? /Niels *** /tmp/extdiff.RPnb3V/gmp.afda1bbf3ee3/mini-gmp/mini-gmp.c 2016-11-22 09:18:29.455237339 +0100 --- /home/nisse/hack/gmp/mini-gmp/mini-gmp.c 2016-11-22 08:54:54.290548487 +0100 *************** see https://www.gnu.org/licenses/. */ *** 70,73 **** --- 70,75 ---- #define GMP_MAX(a, b) ((a) > (b) ? (a) : (b)) + #define GMP_CMP(a,b) (((a) > (b)) - ((a) < (b))) + #define gmp_assert_nocarry(x) do { \ mp_limb_t __cy = (x); \ *************** int *** 1778,1784 **** mpz_sgn (const mpz_t u) { ! mp_size_t usize = u->_mp_size; ! ! return (usize > 0) - (usize < 0); } --- 1780,1784 ---- mpz_sgn (const mpz_t u) { ! return GMP_CMP (u->_mp_size, 0); } *************** mpz_cmp_si (const mpz_t u, long v) *** 1795,1805 **** return 1; else /* usize == -1 */ ! { ! mp_limb_t ul = u->_mp_d[0]; ! if ((mp_limb_t)GMP_NEG_CAST (unsigned long int, v) < ul) ! return -1; ! else ! return (mp_limb_t)GMP_NEG_CAST (unsigned long int, v) > ul; ! } } --- 1795,1799 ---- return 1; else /* usize == -1 */ ! return GMP_CMP (GMP_NEG_CAST (mp_limb_t, v), u->_mp_d[0]); } *************** mpz_cmp_ui (const mpz_t u, unsigned long *** 1814,1821 **** return -1; else ! { ! mp_limb_t ul = (usize > 0) ? u->_mp_d[0] : 0; ! return (ul > v) - (ul < v); ! } } --- 1808,1812 ---- return -1; else ! return GMP_CMP (mpz_get_ui (u), v); } *************** int *** 1837,1849 **** mpz_cmpabs_ui (const mpz_t u, unsigned long v) { ! mp_size_t un = GMP_ABS (u->_mp_size); ! mp_limb_t ul; ! ! if (un > 1) return 1; ! ! ul = (un == 1) ? u->_mp_d[0] : 0; ! ! return (ul > v) - (ul < v); } --- 1828,1835 ---- mpz_cmpabs_ui (const mpz_t u, unsigned long v) { ! if (GMP_ABS (u->_mp_size) > 1) return 1; ! else ! return GMP_CMP (mpz_get_ui (u), v); } -- Niels Möller. PGP-encrypted email is preferred. Keyid 368C6677. Internet email is subject to wholesale government surveillance. _______________________________________________ gmp-devel mailing list gmp-devel@gmplib.org https://gmplib.org/mailman/listinfo/gmp-devel