diff options
author | Marco Bodrato <bodrato@mail.dm.unipi.it> | 2019-11-19 15:22:19 +0100 |
---|---|---|
committer | Marco Bodrato <bodrato@mail.dm.unipi.it> | 2019-11-19 15:22:19 +0100 |
commit | 14509aa477876e818aa609ddd9c999bdd02b9bce (patch) | |
tree | 659e5bf9d449c2a991a1f417722558e69e8a034a /mini-gmp/mini-gmp.c | |
parent | 15c40a6593383660a52b61462cd3b95592e69294 (diff) | |
download | gmp-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.c | 13 |
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. */ |