summaryrefslogtreecommitdiff
path: root/mini-gmp/mini-gmp.c
diff options
context:
space:
mode:
authorMarco Bodrato <bodrato@mail.dm.unipi.it>2019-11-19 15:22:19 +0100
committerMarco Bodrato <bodrato@mail.dm.unipi.it>2019-11-19 15:22:19 +0100
commit14509aa477876e818aa609ddd9c999bdd02b9bce (patch)
tree659e5bf9d449c2a991a1f417722558e69e8a034a /mini-gmp/mini-gmp.c
parent15c40a6593383660a52b61462cd3b95592e69294 (diff)
downloadgmp-14509aa477876e818aa609ddd9c999bdd02b9bce.tar.gz
mini-gmp/mini-gmp.c (mpn_invert_3by2): Add a new shortcut.
Diffstat (limited to 'mini-gmp/mini-gmp.c')
-rw-r--r--mini-gmp/mini-gmp.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/mini-gmp/mini-gmp.c b/mini-gmp/mini-gmp.c
index 041adda13..c27235d44 100644
--- a/mini-gmp/mini-gmp.c
+++ b/mini-gmp/mini-gmp.c
@@ -782,7 +782,17 @@ mpn_invert_3by2 (mp_limb_t u1, mp_limb_t u0)
(((unsigned long) u1 << GMP_LIMB_BITS_MUL_3 / 3) + u0);
}
else {
- mp_limb_t r, p, m, ql;
+ mp_limb_t r, m;
+
+ if (GMP_ULONG_BITS >= GMP_LIMB_BITS * 2)
+ {
+ /* Set m to the 2/1 inverse of u1. */
+ m = ~((unsigned long) u1 << GMP_LIMB_BITS_MUL_3 / 3) / u1;
+ r = ~(m * u1);
+ }
+ else
+ {
+ mp_limb_t p, ql;
unsigned ul, uh, qh;
assert (u1 >= GMP_LIMB_HIGHBIT);
@@ -855,6 +865,7 @@ mpn_invert_3by2 (mp_limb_t u1, mp_limb_t u0)
m++;
r -= u1;
}
+ }
/* Now m is the 2/1 inverse of u1. If u0 > 0, adjust it to become a
3/2 inverse. */