Marco Bodrato <bodr...@mail.dm.unipi.it> writes:

> The loop in mpz_import uses another strategy, a temporary limb.
> This reduces the number of write operations into memory.

And it postpones writing the top limb. Another simplification I tried
failed because it sometimes wrote an extra zero limb.

> static mp_size_t
> mpn_set_str_bits (mp_ptr rp, const unsigned char *sp, size_t sn,
>                 unsigned bits)
> {
>   mp_size_t rn;
>   mp_limb_t limb;
>   unsigned shift;
>
>   for (limb = 0, rn = 0, shift = 0; sn-- > 0; )
>     {
>       limb |= (mp_limb_t) sp[sn] << shift;
>       shift += bits;
>       if (shift >= GMP_LIMB_BITS)
>       {
>         rp[rn++] = limb;
>         shift -= GMP_LIMB_BITS;
>         limb = sp[sn];
>         if (GMP_LIMB_BITS > CHAR_BIT || shift > 0)
>           limb >>= bits - shift;
>         else
>           limb = 0;

Do we really need to support bits == GMP_LIMB_BITS here? If not, the
above 5 lines could be simplified to just

  limb = sp[sn] >> (bits - shift);

Hmm, at this point, we always have shift < bits, right? So if we write
it as

  limb = (sp[sn] >> 1) >> (bits - 1 - shift);
  
it should be safe in all cases. 

Regards,
/Niels

-- 
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

Reply via email to