Why do we call mpn_mul, mpn_mul_n, and mpn_sqr in the bnm1 functions'
basecases?

I'd say we should call mpn_mul_basecase and mpn_sqr_basecase instead,
for a few cycles less overhead.

It seems MUL_TOOM22_THRESHOLD > MULMOD_BNM1_THRESHOLD and
SQR_TOOM2_THRESHOLD > SQRMOD_BNM1_THRESHOLD for all machines.

Possible patch:

diff -Nrc2 gmp-main.ede4cbbb7737/mpn/generic/mulmod_bnm1.c 
gmp-main/mpn/generic/mulmod_bnm1.c
*** gmp-main.ede4cbbb7737/mpn/generic/mulmod_bnm1.c     Thu Aug 29 18:03:29 2013
--- gmp-main/mpn/generic/mulmod_bnm1.c  Thu Aug 29 18:03:29 2013
***************
*** 42,46 ****
    ASSERT (0 < rn);
  
!   mpn_mul_n (tp, ap, bp, rn);
    cy = mpn_add_n (rp, tp, tp + rn, rn);
    /* If cy == 1, then the value of rp is at most B^rn - 2, so there can
--- 42,46 ----
    ASSERT (0 < rn);
  
!   mpn_mul_basecase (tp, ap, rn, bp, rn);
    cy = mpn_add_n (rp, tp, tp + rn, rn);
    /* If cy == 1, then the value of rp is at most B^rn - 2, so there can
***************
*** 62,66 ****
    ASSERT (0 < rn);
  
!   mpn_mul_n (tp, ap, bp, rn + 1);
    ASSERT (tp[2*rn+1] == 0);
    ASSERT (tp[2*rn] < GMP_NUMB_MAX);
--- 62,66 ----
    ASSERT (0 < rn);
  
!   mpn_mul_basecase (tp, ap, rn + 1, bp, rn + 1);
    ASSERT (tp[2*rn+1] == 0);
    ASSERT (tp[2*rn] < GMP_NUMB_MAX);
***************
*** 100,109 ****
          if (UNLIKELY (an + bn <= rn))
            {
!             mpn_mul (rp, ap, an, bp, bn);
            }
          else
            {
              mp_limb_t cy;
!             mpn_mul (tp, ap, an, bp, bn);
              cy = mpn_add (rp, tp, rn, tp + rn, an + bn - rn);
              MPN_INCR_U (rp, rn, cy);
--- 100,109 ----
          if (UNLIKELY (an + bn <= rn))
            {
!             mpn_mul_basecase (rp, ap, an, bp, bn);
            }
          else
            {
              mp_limb_t cy;
!             mpn_mul_basecase (tp, ap, an, bp, bn);
              cy = mpn_add (rp, tp, rn, tp + rn, an + bn - rn);
              MPN_INCR_U (rp, rn, cy);
diff -Nrc2 gmp-main.ede4cbbb7737/mpn/generic/sqrmod_bnm1.c 
gmp-main/mpn/generic/sqrmod_bnm1.c
*** gmp-main.ede4cbbb7737/mpn/generic/sqrmod_bnm1.c     Thu Aug 29 18:03:29 2013
--- gmp-main/mpn/generic/sqrmod_bnm1.c  Thu Aug 29 18:03:29 2013
***************
*** 41,45 ****
    ASSERT (0 < rn);
  
!   mpn_sqr (tp, ap, rn);
    cy = mpn_add_n (rp, tp, tp + rn, rn);
    /* If cy == 1, then the value of rp is at most B^rn - 2, so there can
--- 41,45 ----
    ASSERT (0 < rn);
  
!   mpn_sqr_basecase (tp, ap, rn);
    cy = mpn_add_n (rp, tp, tp + rn, rn);
    /* If cy == 1, then the value of rp is at most B^rn - 2, so there can
***************
*** 60,64 ****
    ASSERT (0 < rn);
  
!   mpn_sqr (tp, ap, rn + 1);
    ASSERT (tp[2*rn+1] == 0);
    ASSERT (tp[2*rn] < GMP_NUMB_MAX);
--- 60,64 ----
    ASSERT (0 < rn);
  
!   mpn_sqr_basecase (tp, ap, rn + 1);
    ASSERT (tp[2*rn+1] == 0);
    ASSERT (tp[2*rn] < GMP_NUMB_MAX);
***************
*** 95,104 ****
          if (UNLIKELY (2*an <= rn))
            {
!             mpn_sqr (rp, ap, an);
            }
          else
            {
              mp_limb_t cy;
!             mpn_sqr (tp, ap, an);
              cy = mpn_add (rp, tp, rn, tp + rn, 2*an - rn);
              MPN_INCR_U (rp, rn, cy);
--- 95,104 ----
          if (UNLIKELY (2*an <= rn))
            {
!             mpn_sqr_basecase (rp, ap, an);
            }
          else
            {
              mp_limb_t cy;
!             mpn_sqr_basecase (tp, ap, an);
              cy = mpn_add (rp, tp, rn, tp + rn, 2*an - rn);
              MPN_INCR_U (rp, rn, cy);

-- 
Torbjörn
_______________________________________________
gmp-devel mailing list
gmp-devel@gmplib.org
http://gmplib.org/mailman/listinfo/gmp-devel

Reply via email to