Problems with __gmpn_add_nc and __gmpn_sub_nc

Torbjorn Granlund tege at swox.com
Tue May 16 00:43:16 CEST 2006


Torbjorn Granlund <tege at swox.com> writes:

  I cannot reproduce this.
  
I realized what is wrong, and actually also could reproduce it on
an GNU/Linux system.

The following patch should help, please try it:

Index: mpn/generic/addsub_n.c
===================================================================
RCS file: /home/cvsfiles/gmp42/mpn/generic/addsub_n.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -p -2 -r1.1 -r1.2
*** mpn/generic/addsub_n.c	14 Mar 2006 15:57:54 -0000	1.1
--- mpn/generic/addsub_n.c	15 May 2006 22:38:42 -0000	1.2
***************
*** 1,5 ****
  /* mpn_addsub_n -- Add and Subtract two limb vectors of equal, non-zero length.
  
! Copyright 1999, 2000, 2001 Free Software Foundation, Inc.
  
  This file is part of the GNU MP Library.
--- 1,5 ----
  /* mpn_addsub_n -- Add and Subtract two limb vectors of equal, non-zero length.
  
! Copyright 1999, 2000, 2001, 2006 Free Software Foundation, Inc.
  
  This file is part of the GNU MP Library.
*************** mpn_addsub_n (mp_ptr r1p, mp_ptr r2p, mp
*** 59,63 ****
  	{
  	  this_n = MIN (n - off, PART_SIZE);
! #if HAVE_NATIVE_mpn_add_nc || !HAVE_NATIVE_mpn_add_n
  	  acyo = mpn_add_nc (r1p + off, s1p + off, s2p + off, this_n, acyo);
  #else
--- 59,63 ----
  	{
  	  this_n = MIN (n - off, PART_SIZE);
! #if HAVE_NATIVE_mpn_add_nc
  	  acyo = mpn_add_nc (r1p + off, s1p + off, s2p + off, this_n, acyo);
  #else
*************** mpn_addsub_n (mp_ptr r1p, mp_ptr r2p, mp
*** 65,69 ****
  	  acyo = acyn + mpn_add_1 (r1p + off, r1p + off, this_n, acyo);
  #endif
! #if HAVE_NATIVE_mpn_sub_nc || !HAVE_NATIVE_mpn_sub_n
  	  scyo = mpn_sub_nc (r2p + off, s1p + off, s2p + off, this_n, scyo);
  #else
--- 65,69 ----
  	  acyo = acyn + mpn_add_1 (r1p + off, r1p + off, this_n, acyo);
  #endif
! #if HAVE_NATIVE_mpn_sub_nc
  	  scyo = mpn_sub_nc (r2p + off, s1p + off, s2p + off, this_n, scyo);
  #else
*************** mpn_addsub_n (mp_ptr r1p, mp_ptr r2p, mp
*** 82,86 ****
  	{
  	  this_n = MIN (n - off, PART_SIZE);
! #if HAVE_NATIVE_mpn_sub_nc || !HAVE_NATIVE_mpn_sub_n
  	  scyo = mpn_sub_nc (r2p + off, s1p + off, s2p + off, this_n, scyo);
  #else
--- 82,86 ----
  	{
  	  this_n = MIN (n - off, PART_SIZE);
! #if HAVE_NATIVE_mpn_sub_nc
  	  scyo = mpn_sub_nc (r2p + off, s1p + off, s2p + off, this_n, scyo);
  #else
*************** mpn_addsub_n (mp_ptr r1p, mp_ptr r2p, mp
*** 88,92 ****
  	  scyo = scyn + mpn_sub_1 (r2p + off, r2p + off, this_n, scyo);
  #endif
! #if HAVE_NATIVE_mpn_add_nc || !HAVE_NATIVE_mpn_add_n
  	  acyo = mpn_add_nc (r1p + off, s1p + off, s2p + off, this_n, acyo);
  #else
--- 88,92 ----
  	  scyo = scyn + mpn_sub_1 (r2p + off, r2p + off, this_n, scyo);
  #endif
! #if HAVE_NATIVE_mpn_add_nc
  	  acyo = mpn_add_nc (r1p + off, s1p + off, s2p + off, this_n, acyo);
  #else
*************** mpn_addsub_n (mp_ptr r1p, mp_ptr r2p, mp
*** 98,102 ****
    else
      {
!       /* r1 and r2 are identical to s1 and s2 (r1==s1 and r2=s2 or vice versa)
  	 Need temporary storage.  */
        mp_limb_t tp[PART_SIZE];
--- 98,102 ----
    else
      {
!       /* r1 and r2 are identical to s1 and s2 (r1==s1 and r2==s2 or vice versa)
  	 Need temporary storage.  */
        mp_limb_t tp[PART_SIZE];
*************** mpn_addsub_n (mp_ptr r1p, mp_ptr r2p, mp
*** 106,110 ****
  	{
  	  this_n = MIN (n - off, PART_SIZE);
! #if HAVE_NATIVE_mpn_add_nc || !HAVE_NATIVE_mpn_add_n
  	  acyo = mpn_add_nc (tp, s1p + off, s2p + off, this_n, acyo);
  #else
--- 106,110 ----
  	{
  	  this_n = MIN (n - off, PART_SIZE);
! #if HAVE_NATIVE_mpn_add_nc
  	  acyo = mpn_add_nc (tp, s1p + off, s2p + off, this_n, acyo);
  #else
*************** mpn_addsub_n (mp_ptr r1p, mp_ptr r2p, mp
*** 112,116 ****
  	  acyo = acyn + mpn_add_1 (tp, tp, this_n, acyo);
  #endif
! #if HAVE_NATIVE_mpn_sub_nc || !HAVE_NATIVE_mpn_sub_n
  	  scyo = mpn_sub_nc (r2p + off, s1p + off, s2p + off, this_n, scyo);
  #else
--- 112,116 ----
  	  acyo = acyn + mpn_add_1 (tp, tp, this_n, acyo);
  #endif
! #if HAVE_NATIVE_mpn_sub_nc
  	  scyo = mpn_sub_nc (r2p + off, s1p + off, s2p + off, this_n, scyo);
  #else

-- 
Torbjörn


More information about the gmp-discuss mailing list