summaryrefslogtreecommitdiff
path: root/tests/refmpn.c
diff options
context:
space:
mode:
authorKevin Ryde <user42@zip.com.au>2004-03-03 21:13:48 +0100
committerKevin Ryde <user42@zip.com.au>2004-03-03 21:13:48 +0100
commit7e1609cee5f2a47ebd615ca812223274a68c2d01 (patch)
treef82ba433cd357bb59bdae8a7022bab6b89220952 /tests/refmpn.c
parent4b5ef11fb92993a46af5b1ff9a3a367974a367ba (diff)
downloadgmp-7e1609cee5f2a47ebd615ca812223274a68c2d01.tar.gz
* tests/refmpn.c, tests/tests.h (refmpn_copy_extend,
refmpn_lshift_or_copy_any, refmpn_rshift_or_copy_any): New functions.
Diffstat (limited to 'tests/refmpn.c')
-rw-r--r--tests/refmpn.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/tests/refmpn.c b/tests/refmpn.c
index 659556836..7042474dd 100644
--- a/tests/refmpn.c
+++ b/tests/refmpn.c
@@ -320,6 +320,25 @@ refmpn_copyd (mp_ptr rp, mp_srcptr sp, mp_size_t size)
rp[i] = sp[i];
}
+/* Copy {xp,xsize} to {wp,wsize}. If x is shorter, then pad w with low
+ zeros to wsize. If x is longer, then copy just the high wsize limbs. */
+void
+refmpn_copy_extend (mp_ptr wp, mp_size_t wsize, mp_srcptr xp, mp_size_t xsize)
+{
+ ASSERT (wsize >= 0);
+ ASSERT (xsize >= 0);
+
+ /* high part of x if x bigger than w */
+ if (xsize > wsize)
+ {
+ xp += xsize - wsize;
+ xsize = wsize;
+ }
+
+ refmpn_copy (wp + wsize-xsize, xp, xsize);
+ refmpn_zero (wp, wsize-xsize);
+}
+
void
refmpn_com_n (mp_ptr rp, mp_srcptr sp, mp_size_t size)
{
@@ -997,6 +1016,7 @@ refmpn_lshift (mp_ptr rp, mp_srcptr sp, mp_size_t size, unsigned shift)
}
+/* accepting shift==0 and doing a plain copyi or copyd in that case */
mp_limb_t
refmpn_rshift_or_copy (mp_ptr rp, mp_srcptr sp, mp_size_t size, unsigned shift)
{
@@ -1010,7 +1030,6 @@ refmpn_rshift_or_copy (mp_ptr rp, mp_srcptr sp, mp_size_t size, unsigned shift)
return refmpn_rshift (rp, sp, size, shift);
}
}
-
mp_limb_t
refmpn_lshift_or_copy (mp_ptr rp, mp_srcptr sp, mp_size_t size, unsigned shift)
{
@@ -1025,6 +1044,19 @@ refmpn_lshift_or_copy (mp_ptr rp, mp_srcptr sp, mp_size_t size, unsigned shift)
}
}
+/* accepting size==0 too */
+mp_limb_t
+refmpn_rshift_or_copy_any (mp_ptr rp, mp_srcptr sp, mp_size_t size,
+ unsigned shift)
+{
+ return (size == 0 ? 0 : refmpn_rshift_or_copy (rp, sp, size, shift));
+}
+mp_limb_t
+refmpn_lshift_or_copy_any (mp_ptr rp, mp_srcptr sp, mp_size_t size,
+ unsigned shift)
+{
+ return (size == 0 ? 0 : refmpn_lshift_or_copy (rp, sp, size, shift));
+}
/* Divide h,l by d, return quotient, store remainder to *rp.
Operates on full limbs, not nails.