Micro-GMP
Niels Möller
nisse at lysator.liu.se
Mon Dec 10 21:07:53 UTC 2018
"Marco Bodrato" <bodrato at mail.dm.unipi.it> writes:
> The attached file is the result of "hg diff" compared with the *current*
> development version
I recommend adding -p to the diff flags.
> This code inherits some ideas from the micro- code you published, but I
> reorganised it completely. Basically (except for mpz_cmpabs_ui, already
> described) it is a collection of alternatives implementations. But only in
> some cases they completely substitute the general code, often they handle
> only some special cases.
Cool. I have some comments and questions.
First, how would this be configured? Adding an
#ifndef GMP_LIMB_BITS
around the mp_limb_t typedef in mini-gmp.h, and around the related
defines in mini-gmp.c? Then one could do
#define GMP_LIMB_BITS 8
typedef uint8_t mp_limb_t;
#include "mini-gmp.c"
One could aim to support any GMP_LIMB_BITS between, say, 3 and the size
of unsigned long long. For unusual sizes one would need to combine with
asl.h or something similar.
I think it makes sense with special code for umul_ppmm for this case,
since it's the most performance critical part of all operations with
more than O(n) complexity. One could consider using unsigned long long
or unsigned __int128 where avaiable as well.
For the various _ui and _si functions, I think performance is less
important. For mini-gmp, I think it would make some sense to have a
non-trivial implementation only for mpz_set_ui and mpz_get_ui, and
implement all other _ui and _si functions in terms of that.
In particular, we'd get simplifications to mpz_abs_{add,sub}_ui,
mpz_mul_ui, and mpz_div_qr_ui.
> Is the proposed code too complex to belong to mini-gmp?
I think it is acceptable only if we can do it with only very few
functions needing special handling of mp_limb_t != unsigned long.
And we obviously need test coverage for it.
BTW, please use parentheses in expressions like
assert ((r0 & GMP_LIMB_MAX >> GMP_LIMB_BITS - shift) == 0);
And I think we should always require that arithmetic on mp_limb_t is mod
(GMP_LIMB_MAX + 1), so that & GMP_LIMB_MAX usually is redundant (with
possible exception for contexts where we might have unsigned int rather
than mp_limb_t, due to type promotion).
Regards,
/Niels
--
Niels Möller. PGP-encrypted email is preferred. Keyid 368C6677.
Internet email is subject to wholesale government surveillance.
More information about the gmp-devel
mailing list