diff options
author | Marco Bodrato <bodrato@mail.dm.unipi.it> | 2020-10-18 07:35:43 +0200 |
---|---|---|
committer | Marco Bodrato <bodrato@mail.dm.unipi.it> | 2020-10-18 07:35:43 +0200 |
commit | b8d780cef37d7f5d396029f1e380bfab3ab69489 (patch) | |
tree | 62b3980217d3de24323e0cd949333d4027e4dde8 /mini-gmp/mini-gmp.c | |
parent | a3257b2eb299c4b806b6d42a92b0d8c5e52367f0 (diff) | |
download | gmp-b8d780cef37d7f5d396029f1e380bfab3ab69489.tar.gz |
mini-gmp/mini-gmp.c (mpn_set_str_bits): Reduce bramches and writes.
Diffstat (limited to 'mini-gmp/mini-gmp.c')
-rw-r--r-- | mini-gmp/mini-gmp.c | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/mini-gmp/mini-gmp.c b/mini-gmp/mini-gmp.c index ab092adce..a78264533 100644 --- a/mini-gmp/mini-gmp.c +++ b/mini-gmp/mini-gmp.c @@ -1331,29 +1331,26 @@ mpn_set_str_bits (mp_ptr rp, const unsigned char *sp, size_t sn, unsigned bits) { mp_size_t rn; - size_t j; + mp_limb_t limb; unsigned shift; - for (j = sn, rn = 0, shift = 0; j-- > 0; ) + for (limb = 0, rn = 0, shift = 0; sn-- > 0; ) { - if (shift == 0) - { - rp[rn++] = sp[j]; - shift += bits; - } - else + limb |= (mp_limb_t) sp[sn] << shift; + shift += bits; + if (shift >= GMP_LIMB_BITS) { - rp[rn-1] |= (mp_limb_t) sp[j] << shift; - shift += bits; - if (shift >= GMP_LIMB_BITS) - { - shift -= GMP_LIMB_BITS; - if (shift > 0) - rp[rn++] = (mp_limb_t) sp[j] >> (bits - shift); - } + shift -= GMP_LIMB_BITS; + rp[rn++] = limb; + /* Next line is correct also if shift == 0, + bits == 8, and mp_limb_t == unsigned char. */ + limb = (unsigned int) sp[sn] >> (bits - shift); } } - rn = mpn_normalized_size (rp, rn); + if (limb != 0) + rp[rn++] = limb; + else + rn = mpn_normalized_size (rp, rn); return rn; } |