Paul.Zimmermann at inria.fr
Mon Dec 10 09:46:26 UTC 2018
> mpz_cmpabs_ui (const mpz_t u, unsigned long v)
> int ulongsize = GMP_ULONG_BITS / GMP_LIMB_BITS;
> mp_limb_t ulongrem = 0;
> mp_size_t un = GMP_ABS (u->_mp_size);
> if (GMP_ULONG_BITS % GMP_LIMB_BITS != 0)
> ulongrem = (ULONG_MAX >> GMP_LIMB_BITS * ulongsize) + 1;
is GMP_ULONG_BITS % GMP_LIMB_BITS != 0 allowed in GMP and/or asl.h?
> if (un > ulongsize && (u->_mp_d[ulongsize] >= ulongrem || un > ulongsize
> + 1))
> return 1;
> unsigned long uu = mpz_get_ui (u);
> return GMP_CMP(uu, v);
> When mp_limb_t is unsigned long, gcc -O2 compiles this code exactly as
> if (GMP_ABS (u->_mp_size) > 1)
> return 1;
> GMP_CMP(mpz_get_ui (u), v)
> The same as the current code. And it gets optimised also for uint16 or uint8.
> >> You also changed mpn_invert_3by2. Maybe a handful of (mp_limb_t) casts
> >> could be added to the original function to make it work... but your
> >> rewrite is simpler and faster. Maybe the same could be done on
> >> gmp_umul_ppmm? for speed?
> > indeed, in several places I opted for simplicity, since speed was not
> > (at first) a goal. But when running "make check" of MPFR with micro-gmp-8,
> > I now realize speed is also important!
> A attach a possible implementation of mini-gmp that should support limbs
> of "any" size. Can you test it with MPFR? Both correctness and speed...
More information about the gmp-devel