summaryrefslogtreecommitdiff
path: root/gmp-h.in
diff options
context:
space:
mode:
authorMarco Bodrato <bodrato@mail.dm.unipi.it>2015-05-18 08:31:36 +0200
committerMarco Bodrato <bodrato@mail.dm.unipi.it>2015-05-18 08:31:36 +0200
commit5d2b3278df4d79b586209e236583156a84eb611a (patch)
treea1a4ef2f418f1f54e3c48621b9b96b7b8aaf7805 /gmp-h.in
parent0b4da807b8c638dd9f6db2bff446626b76355482 (diff)
downloadgmp-5d2b3278df4d79b586209e236583156a84eb611a.tar.gz
gmp-h.in (mpn_neg): Niels' code using mpn_neg.
Diffstat (limited to 'gmp-h.in')
-rw-r--r--gmp-h.in22
1 files changed, 14 insertions, 8 deletions
diff --git a/gmp-h.in b/gmp-h.in
index 09d9e3933..0de897df0 100644
--- a/gmp-h.in
+++ b/gmp-h.in
@@ -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