diff options
author | Marco Bodrato <bodrato@mail.dm.unipi.it> | 2015-05-18 08:31:36 +0200 |
---|---|---|
committer | Marco Bodrato <bodrato@mail.dm.unipi.it> | 2015-05-18 08:31:36 +0200 |
commit | 5d2b3278df4d79b586209e236583156a84eb611a (patch) | |
tree | a1a4ef2f418f1f54e3c48621b9b96b7b8aaf7805 /gmp-h.in | |
parent | 0b4da807b8c638dd9f6db2bff446626b76355482 (diff) | |
download | gmp-5d2b3278df4d79b586209e236583156a84eb611a.tar.gz |
gmp-h.in (mpn_neg): Niels' code using mpn_neg.
Diffstat (limited to 'gmp-h.in')
-rw-r--r-- | gmp-h.in | 22 |
1 files changed, 14 insertions, 8 deletions
@@ -2191,14 +2191,20 @@ __GMP_EXTERN_INLINE mp_limb_t mpn_neg (mp_ptr __gmp_rp, mp_srcptr __gmp_up, mp_size_t __gmp_n) { - mp_limb_t __gmp_ul, __gmp_cy; - __gmp_cy = 0; - do { - __gmp_ul = *__gmp_up++; - *__gmp_rp++ = -__gmp_ul - __gmp_cy; - __gmp_cy |= __gmp_ul != 0; - } while (--__gmp_n != 0); - return __gmp_cy; + while (*__gmp_up == 0) /* Low zero limbs are unchanged by negation. */ + { + *__gmp_rp = 0; + if (!--__gmp_n) /* All zero */ + return 0; + ++__gmp_up; ++__gmp_rp; + } + + *__gmp_rp = (- *__gmp_up) & GMP_NUMB_MASK; + + if (--__gmp_n) /* Higher limbs get complemented. */ + mpn_com (++__gmp_rp, ++__gmp_up, __gmp_n); + + return 1; } #endif |