diff options
author | Torbjorn Granlund <tg@gmplib.org> | 2019-08-17 00:55:49 +0200 |
---|---|---|
committer | Torbjorn Granlund <tg@gmplib.org> | 2019-08-17 00:55:49 +0200 |
commit | 70fe57de8be2b5c4d2a1457b05e231c73843b396 (patch) | |
tree | 3660150df86e5683ce23fae8703614db47a9ca47 /tests | |
parent | 01827af231d865797fcccce94393fc1ef1aacd5d (diff) | |
download | gmp-70fe57de8be2b5c4d2a1457b05e231c73843b396.tar.gz |
Provide refmpn_gcd_22.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/refmpn.c | 40 | ||||
-rw-r--r-- | tests/tests.h | 1 |
2 files changed, 41 insertions, 0 deletions
diff --git a/tests/refmpn.c b/tests/refmpn.c index 7d2348ed9..42bb41122 100644 --- a/tests/refmpn.c +++ b/tests/refmpn.c @@ -2001,6 +2001,46 @@ refmpn_gcd_11 (mp_limb_t x, mp_limb_t y) return y; } +mp_double_limb_t +refmpn_gcd_22 (mp_limb_t x1, mp_limb_t x0, mp_limb_t y1, mp_limb_t y0) +{ + ASSERT ((x0 & 1) != 0); + ASSERT ((y0 & 1) != 0); + mp_double_limb_t g; + mp_limb_t cy; + + do + { + while ((x0 & 1) == 0) + { + x0 = (x1 << (GMP_NUMB_BITS - 1)) | (x0 >> 1); + x1 >>= 1; + } + while ((y0 & 1) == 0) + { + y0 = (y1 << (GMP_NUMB_BITS - 1)) | (y0 >> 1); + y1 >>= 1; + } + + + if (x1 < y1 || (x1 == y1 && x0 < y0)) + { + mp_limb_t t; + t = x1; x1 = y1; y1 = t; + t = x0; x0 = y0; y0 = t; + } + + cy = (x0 < y0); + x0 -= y0; + x1 -= y1 + cy; + } + while ((x1 | x0) != 0); + + g.d1 = y1; + g.d0 = y0; + return g; +} + mp_limb_t refmpn_gcd_1 (mp_srcptr xp, mp_size_t xsize, mp_limb_t y) { diff --git a/tests/tests.h b/tests/tests.h index a44d39950..882c63477 100644 --- a/tests/tests.h +++ b/tests/tests.h @@ -232,6 +232,7 @@ void refmpn_fill (mp_ptr, mp_size_t, mp_limb_t); mp_limb_t refmpn_gcd_11 (mp_limb_t, mp_limb_t); mp_limb_t refmpn_gcd_1 (mp_srcptr, mp_size_t, mp_limb_t); +mp_double_limb_t refmpn_gcd_22 (mp_limb_t, mp_limb_t, mp_limb_t, mp_limb_t); mp_limb_t refmpn_gcd (mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t); size_t refmpn_get_str (unsigned char *, int, mp_ptr, mp_size_t); |