summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorTorbjorn Granlund <tg@gmplib.org>2019-08-17 00:55:49 +0200
committerTorbjorn Granlund <tg@gmplib.org>2019-08-17 00:55:49 +0200
commit70fe57de8be2b5c4d2a1457b05e231c73843b396 (patch)
tree3660150df86e5683ce23fae8703614db47a9ca47 /tests
parent01827af231d865797fcccce94393fc1ef1aacd5d (diff)
downloadgmp-70fe57de8be2b5c4d2a1457b05e231c73843b396.tar.gz
Provide refmpn_gcd_22.
Diffstat (limited to 'tests')
-rw-r--r--tests/refmpn.c40
-rw-r--r--tests/tests.h1
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);