summaryrefslogtreecommitdiff
path: root/tests/refmpn.c
diff options
context:
space:
mode:
authorTorbjorn Granlund <tege@gmplib.org>2008-09-08 20:40:35 +0200
committerTorbjorn Granlund <tege@gmplib.org>2008-09-08 20:40:35 +0200
commitc104387fe6eb47607d9148c5f41a1f638290a84b (patch)
tree6642faae3843ce08697b6e4acc20a6c12d2da3e7 /tests/refmpn.c
parent0cfec534ae489a35e8442e472d0111fc3b255a8e (diff)
downloadgmp-c104387fe6eb47607d9148c5f41a1f638290a84b.tar.gz
Add support, testing, and timing of mpn_mul_3 and mpn_mul_4.
* gmp-impl.h (mpn_mul_3, mpn_mul_4): Declare. * tests/tests.h (refmpn_mul_3, refmpn_mul_4): Declare. * tests/try.c (param_init): Set things up for mpn_mul_3 and mpn_mul_4. (choice_array): Likewise. (call): Likewise. * mpn/Makefile.am (nodist_EXTRA_libmpn_la_SOURCES): Add mul_3.c and mul_4. * mpn/asm-defs.m4: Define mul_3 and mul_4. * tests/refmpn.c (refmpn_mul_N): New function. (refmpn_mul_2): Remove old definition, call refmpn_mul_N. (refmpn_mul_3, refmpn_mul_4): New functions. * tune/common.c (speed_mpn_mul_3, speed_mpn_mul_4): New functions. * tune/speed.h (speed_mpn_mul_3, speed_mpn_mul_4): Declare. * tune/speed.c (routine): New entries for mpn_mul_2 and mpn_mul_3.
Diffstat (limited to 'tests/refmpn.c')
-rw-r--r--tests/refmpn.c38
1 files changed, 29 insertions, 9 deletions
diff --git a/tests/refmpn.c b/tests/refmpn.c
index bcb887c38..b2ceaa481 100644
--- a/tests/refmpn.c
+++ b/tests/refmpn.c
@@ -1,8 +1,8 @@
/* Reference mpn functions, designed to be simple, portable and independent
of the normal gmp code. Speed isn't a consideration.
-Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free
-Software Foundation, Inc.
+Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+2007, 2008 Free Software Foundation, Inc.
This file is part of the GNU MP Library.
@@ -790,15 +790,17 @@ refmpn_mul_1 (mp_ptr rp, mp_srcptr sp, mp_size_t size, mp_limb_t multiplier)
mp_limb_t
-refmpn_mul_2 (mp_ptr dst, mp_srcptr src, mp_size_t size, mp_srcptr mult)
+refmpn_mul_N (mp_ptr dst, mp_srcptr src, mp_size_t size,
+ mp_srcptr mult, mp_size_t msize)
{
mp_ptr src_copy;
- mp_limb_t c;
+ mp_limb_t ret;
+ mp_size_t i;
ASSERT (refmpn_overlap_fullonly_p (dst, src, size));
- ASSERT (! refmpn_overlap_p (dst, size+1, mult, (mp_size_t) 2));
- ASSERT (size >= 1);
- ASSERT_MPN (mult, 2);
+ ASSERT (! refmpn_overlap_p (dst, size+msize-1, mult, msize));
+ ASSERT (size >= msize);
+ ASSERT_MPN (mult, msize);
/* in case dst==src */
src_copy = refmpn_malloc_limbs (size);
@@ -806,11 +808,29 @@ refmpn_mul_2 (mp_ptr dst, mp_srcptr src, mp_size_t size, mp_srcptr mult)
src = src_copy;
dst[size] = refmpn_mul_1 (dst, src, size, mult[0]);
- c = refmpn_addmul_1 (dst+1, src, size, mult[1]);
+ for (i = 1; i < msize-1; i++)
+ dst[size+i] = refmpn_addmul_1 (dst+i, src, size, mult[i]);
+ ret = refmpn_addmul_1 (dst+i, src, size, mult[i]);
+
free (src_copy);
- return c;
+ return ret;
}
+mp_limb_t
+refmpn_mul_2 (mp_ptr rp, mp_srcptr sp, mp_size_t size, mp_srcptr mult)
+{
+ return refmpn_mul_N (rp, sp, size, mult, (mp_size_t) 2);
+}
+mp_limb_t
+refmpn_mul_3 (mp_ptr rp, mp_srcptr sp, mp_size_t size, mp_srcptr mult)
+{
+ return refmpn_mul_N (rp, sp, size, mult, (mp_size_t) 3);
+}
+mp_limb_t
+refmpn_mul_4 (mp_ptr rp, mp_srcptr sp, mp_size_t size, mp_srcptr mult)
+{
+ return refmpn_mul_N (rp, sp, size, mult, (mp_size_t) 4);
+}
#define AORSMUL_1C(operation_n) \
{ \