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