diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | acinclude.m4 | 2 | ||||
-rw-r--r-- | tests/devel/try.c | 30 | ||||
-rw-r--r-- | tests/refmpn.c | 32 | ||||
-rw-r--r-- | tests/tests.h | 6 |
5 files changed, 71 insertions, 9 deletions
@@ -1,3 +1,13 @@ +2009-12-08 Marco Bodrato <bodrato@mail.dm.unipi.it> + + * tests/devel/try.c: Test mpn_addlsh2_n and mpn_{add,sub}lsh_n; + mpn_rsblsh_n now tests all shift values. + * tests/refmpn.c (refmpn_addlsh_n, refmpn_sublsh_n): New functions. + (refmpn_addlsh1_n): Use generic refmpn_addlsh_n. + (refmpn_sublsh1_n): Use generic refmpn_sublsh_n. + (refmpn_addlsh2_n): New function. + * tests/tests.h: Declare new functions. + 2009-12-06 Torbjorn Granlund <tege@gmplib.org> * tune/tuneup.c (tune_mulmod_bnm1): Up min_size to 12. diff --git a/acinclude.m4 b/acinclude.m4 index 6ee769682..da1b327ea 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -112,7 +112,7 @@ dnl Expand to the right way to #include gmp-h.in. This must be used dnl instead of gmp.h, since that file isn't generated until the end of the dnl configure. dnl -dnl Dummy values for GMP_LIMB_BITS and GMP_LIMB_BITS are enough +dnl Dummy value for GMP_LIMB_BITS is enough dnl for all current configure-time uses of gmp.h. define(GMP_INCLUDE_GMP_H, diff --git a/tests/devel/try.c b/tests/devel/try.c index ef09e151c..516915f53 100644 --- a/tests/devel/try.c +++ b/tests/devel/try.c @@ -592,7 +592,10 @@ validate_sqrtrem (void) #define TYPE_COM_N 28 #define TYPE_ADDLSH1_N 30 +#define TYPE_ADDLSH2_N 48 +#define TYPE_ADDLSH_N 49 #define TYPE_SUBLSH1_N 31 +#define TYPE_SUBLSH_N 130 #define TYPE_RSBLSH1_N 34 #define TYPE_RSBLSH2_N 46 #define TYPE_RSBLSH_N 47 @@ -894,10 +897,23 @@ param_init (void) COPY (TYPE_ADD_N); REFERENCE (refmpn_addlsh1_n); + p = ¶m[TYPE_ADDLSH2_N]; + COPY (TYPE_ADD_N); + REFERENCE (refmpn_addlsh2_n); + + p = ¶m[TYPE_ADDLSH_N]; + COPY (TYPE_ADD_N); + p->shift = 1; + REFERENCE (refmpn_addlsh_n); + p = ¶m[TYPE_SUBLSH1_N]; COPY (TYPE_ADD_N); REFERENCE (refmpn_sublsh1_n); + p = ¶m[TYPE_SUBLSH_N]; + COPY (TYPE_ADDLSH_N); + REFERENCE (refmpn_sublsh_n); + p = ¶m[TYPE_RSBLSH1_N]; COPY (TYPE_ADD_N); REFERENCE (refmpn_rsblsh1_n); @@ -907,7 +923,7 @@ param_init (void) REFERENCE (refmpn_rsblsh2_n); p = ¶m[TYPE_RSBLSH_N]; - COPY (TYPE_ADD_N); + COPY (TYPE_ADDLSH_N); REFERENCE (refmpn_rsblsh_n); p = ¶m[TYPE_RSH1ADD_N]; @@ -1446,9 +1462,18 @@ const struct choice_t choice_array[] = { #if HAVE_NATIVE_mpn_addlsh1_n { TRY(mpn_addlsh1_n), TYPE_ADDLSH1_N }, #endif +#if HAVE_NATIVE_mpn_addlsh2_n + { TRY(mpn_addlsh2_n), TYPE_ADDLSH2_N }, +#endif +#if HAVE_NATIVE_mpn_addlsh_n + { TRY(mpn_addlsh_n), TYPE_ADDLSH_N }, +#endif #if HAVE_NATIVE_mpn_sublsh1_n { TRY(mpn_sublsh1_n), TYPE_SUBLSH1_N }, #endif +#if HAVE_NATIVE_mpn_sublsh_n + { TRY(mpn_sublsh_n), TYPE_SUBLSH_N }, +#endif #if HAVE_NATIVE_mpn_rsblsh1_n { TRY(mpn_rsblsh1_n), TYPE_RSBLSH1_N }, #endif @@ -2020,6 +2045,7 @@ call (struct each_t *e, tryfun_t function) case TYPE_ADD_N: case TYPE_SUB_N: case TYPE_ADDLSH1_N: + case TYPE_ADDLSH2_N: case TYPE_SUBLSH1_N: case TYPE_RSBLSH1_N: case TYPE_RSBLSH2_N: @@ -2028,6 +2054,8 @@ call (struct each_t *e, tryfun_t function) e->retval = CALLING_CONVENTIONS (function) (e->d[0].p, e->s[0].p, e->s[1].p, size); break; + case TYPE_ADDLSH_N: + case TYPE_SUBLSH_N: case TYPE_RSBLSH_N: e->retval = CALLING_CONVENTIONS (function) (e->d[0].p, e->s[0].p, e->s[1].p, size, shift); diff --git a/tests/refmpn.c b/tests/refmpn.c index 5d0cc4572..b2444f208 100644 --- a/tests/refmpn.c +++ b/tests/refmpn.c @@ -611,43 +611,63 @@ refmpn_sub_n (mp_ptr rp, mp_srcptr s1p, mp_srcptr s2p, mp_size_t size) } mp_limb_t -refmpn_addlsh1_n (mp_ptr rp, mp_srcptr up, mp_srcptr vp, mp_size_t n) +refmpn_addlsh_n (mp_ptr rp, mp_srcptr up, mp_srcptr vp, + mp_size_t n, unsigned int s) { mp_limb_t cy; mp_ptr tp; ASSERT (refmpn_overlap_fullonly_two_p (rp, up, vp, n)); ASSERT (n >= 1); + ASSERT (0 < s && s < GMP_NUMB_BITS); ASSERT_MPN (up, n); ASSERT_MPN (vp, n); tp = refmpn_malloc_limbs (n); - cy = refmpn_lshift (tp, vp, n, 1); + cy = refmpn_lshift (tp, vp, n, s); cy += refmpn_add_n (rp, up, tp, n); free (tp); return cy; } mp_limb_t -refmpn_sublsh1_n (mp_ptr rp, mp_srcptr up, mp_srcptr vp, mp_size_t n) +refmpn_addlsh1_n (mp_ptr rp, mp_srcptr up, mp_srcptr vp, mp_size_t n) +{ + return refmpn_addlsh_n (rp, up, vp, n, 1); +} +mp_limb_t +refmpn_addlsh2_n (mp_ptr rp, mp_srcptr up, mp_srcptr vp, mp_size_t n) +{ + return refmpn_addlsh_n (rp, up, vp, n, 2); +} + +mp_limb_t +refmpn_sublsh_n (mp_ptr rp, mp_srcptr up, mp_srcptr vp, + mp_size_t n, unsigned int s) { mp_limb_t cy; mp_ptr tp; ASSERT (refmpn_overlap_fullonly_two_p (rp, up, vp, n)); ASSERT (n >= 1); + ASSERT (0 < s && s < GMP_NUMB_BITS); ASSERT_MPN (up, n); ASSERT_MPN (vp, n); tp = refmpn_malloc_limbs (n); - cy = mpn_lshift (tp, vp, n, 1); + cy = mpn_lshift (tp, vp, n, s); cy += mpn_sub_n (rp, up, tp, n); free (tp); return cy; } +mp_limb_t +refmpn_sublsh1_n (mp_ptr rp, mp_srcptr up, mp_srcptr vp, mp_size_t n) +{ + return refmpn_sublsh_n (rp, up, vp, n, 1); +} mp_limb_signed_t refmpn_rsblsh_n (mp_ptr rp, mp_srcptr up, mp_srcptr vp, - mp_size_t n, unsigned int s) + mp_size_t n, unsigned int s) { mp_limb_signed_t cy; mp_ptr tp; @@ -664,13 +684,11 @@ refmpn_rsblsh_n (mp_ptr rp, mp_srcptr up, mp_srcptr vp, free (tp); return cy; } - mp_limb_signed_t refmpn_rsblsh1_n (mp_ptr rp, mp_srcptr up, mp_srcptr vp, mp_size_t n) { return refmpn_rsblsh_n (rp, up, vp, n, 1); } - mp_limb_signed_t refmpn_rsblsh2_n (mp_ptr rp, mp_srcptr up, mp_srcptr vp, mp_size_t n) { diff --git a/tests/tests.h b/tests/tests.h index 1faa13eb6..04b7d090f 100644 --- a/tests/tests.h +++ b/tests/tests.h @@ -183,6 +183,10 @@ mp_limb_t refmpn_add_nc __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp, mp_size_t size, mp_limb_t carry)); mp_limb_t refmpn_addlsh1_n __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp, mp_size_t size)); +mp_limb_t refmpn_addlsh2_n __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp, + mp_size_t size)); +mp_limb_t refmpn_addlsh_n __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp, + mp_size_t size, unsigned int)); mp_limb_t refmpn_addmul_1 __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_size_t size, mp_limb_t multiplier)); mp_limb_t refmpn_addmul_1c __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_size_t size, @@ -369,6 +373,8 @@ mp_limb_t refmpn_sub_nc __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp, mp_size_t size, mp_limb_t carry)); mp_limb_t refmpn_sublsh1_n __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp, mp_size_t size)); +mp_limb_t refmpn_sublsh_n __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_srcptr yp, + mp_size_t size, unsigned int)); mp_limb_t refmpn_submul_1 __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_size_t size, mp_limb_t multiplier)); mp_limb_t refmpn_submul_1c __GMP_PROTO ((mp_ptr wp, mp_srcptr xp, mp_size_t size, |