diff options
author | Torbjorn Granlund <tege@gmplib.org> | 2008-09-08 20:40:35 +0200 |
---|---|---|
committer | Torbjorn Granlund <tege@gmplib.org> | 2008-09-08 20:40:35 +0200 |
commit | c104387fe6eb47607d9148c5f41a1f638290a84b (patch) | |
tree | 6642faae3843ce08697b6e4acc20a6c12d2da3e7 /tests/refmpn.c | |
parent | 0cfec534ae489a35e8442e472d0111fc3b255a8e (diff) | |
download | gmp-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.c | 38 |
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) \ { \ |