[PATCH 4/4] mpi/generic: use longlong.h for carry handling

Jussi Kivilinna <[email protected]>
Newsgroups gmane.comp.encryption.gpg.libgcrypt.devel
Message-ID <[email protected]>
* mpi/generic/mpih-add1.c (_gcry_mpih_add_n): Use add_ssaaaa for
carry handling.
* mpi/generic/mpih-mul1.c (_gcry_mpih_mul_1): Likewise.
* mpi/generic/mpih-mul2.c (_gcry_mpih_addmul_1): Likewise.
* mpi/generic/mpih-mul3.c (_gcry_mpih_submul_1): Use add_ssaaaa
and sub_ddmmss for carry handling.
* mpi/generic/mpih-sub1.c (_gcry_mpih_sub_n): Likewise.
--

Signed-off-by: Jussi Kivilinna <[email protected]>
---
 mpi/generic/mpih-add1.c | 15 ++++++++-------
 mpi/generic/mpih-mul1.c |  7 +++----
 mpi/generic/mpih-mul2.c | 13 +++++--------
 mpi/generic/mpih-mul3.c | 14 ++++++--------
 mpi/generic/mpih-sub1.c | 16 +++++++++-------
 5 files changed, 31 insertions(+), 34 deletions(-)

diff --git a/mpi/generic/mpih-add1.c b/mpi/generic/mpih-add1.c
index 0a51f06c..4c95609b 100644
--- a/mpi/generic/mpih-add1.c
+++ b/mpi/generic/mpih-add1.c
@@ -1,5 +1,5 @@
 /* mpihelp-add_1.c  -  MPI helper functions
- * Copyright (C) 1994, 1996, 1997, 1998, 
+ * Copyright (C) 1994, 1996, 1997, 1998,
  *               2000, 2002 Free Software Foundation, Inc.
  *
  * This file is part of Libgcrypt.
@@ -48,16 +48,17 @@ _gcry_mpih_add_n (mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
   res_ptr -= j;
 
   cy = 0;
-  do 
+  do
     {
       y = s2_ptr[j];
       x = s1_ptr[j];
-      y += cy;		  /* add previous carry to one addend */
-      cy = y < cy;	  /* get out carry from that addition */
-      y += x; 		  /* add other addend */
-      cy += y < x;	  /* get out carry from that add, combine */
+      /* Add previous carry to one addend and get out carry from
+       * that addition.  */
+      add_ssaaaa (cy, y, 0, y, 0, cy);
+      /* Add other addend and get out carry from that add, combine.  */
+      add_ssaaaa (cy, y, cy, y, 0, x);
       res_ptr[j] = y;
-    } 
+    }
   while ( ++j );
 
   return cy;
diff --git a/mpi/generic/mpih-mul1.c b/mpi/generic/mpih-mul1.c
index e88be914..accae1dc 100644
--- a/mpi/generic/mpih-mul1.c
+++ b/mpi/generic/mpih-mul1.c
@@ -48,13 +48,12 @@ _gcry_mpih_mul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size,
   res_ptr -= j;
 
   cy_limb = 0;
-  do 
+  do
     {
       umul_ppmm( prod_high, prod_low, s1_ptr[j], s2_limb );
-      prod_low += cy_limb;
-      cy_limb = (prod_low < cy_limb?1:0) + prod_high;
+      add_ssaaaa( cy_limb, prod_low, prod_high, prod_low, 0, cy_limb );
       res_ptr[j] = prod_low;
-    } 
+    }
   while( ++j );
 
   return cy_limb;
diff --git a/mpi/generic/mpih-mul2.c b/mpi/generic/mpih-mul2.c
index bc925e01..931438dd 100644
--- a/mpi/generic/mpih-mul2.c
+++ b/mpi/generic/mpih-mul2.c
@@ -48,20 +48,17 @@ _gcry_mpih_addmul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
   s1_ptr -= j;
 
   cy_limb = 0;
-  do 
+  do
     {
       umul_ppmm( prod_high, prod_low, s1_ptr[j], s2_limb );
-
-      prod_low += cy_limb;
-      cy_limb = (prod_low < cy_limb?1:0) + prod_high;
+      add_ssaaaa( cy_limb, prod_low, prod_high, prod_low, 0, cy_limb );
 
       x = res_ptr[j];
-      prod_low = x + prod_low;
-      cy_limb += prod_low < x?1:0;
+      add_ssaaaa( cy_limb, prod_low, cy_limb, prod_low, 0, x );
       res_ptr[j] = prod_low;
-    } 
+    }
   while ( ++j );
-    
+
   return cy_limb;
 }
 
diff --git a/mpi/generic/mpih-mul3.c b/mpi/generic/mpih-mul3.c
index 4ecd2c6b..7372c845 100644
--- a/mpi/generic/mpih-mul3.c
+++ b/mpi/generic/mpih-mul3.c
@@ -36,7 +36,7 @@ mpi_limb_t
 _gcry_mpih_submul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
 		  mpi_size_t s1_size, mpi_limb_t s2_limb)
 {
-  mpi_limb_t cy_limb;
+  mpi_limb_t cy_limb, borrow;
   mpi_size_t j;
   mpi_limb_t prod_high, prod_low;
   mpi_limb_t x;
@@ -48,18 +48,16 @@ _gcry_mpih_submul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
   s1_ptr -= j;
 
   cy_limb = 0;
-  do 
+  do
     {
       umul_ppmm( prod_high, prod_low, s1_ptr[j], s2_limb);
-
-      prod_low += cy_limb;
-      cy_limb = (prod_low < cy_limb?1:0) + prod_high;
+      add_ssaaaa( cy_limb, prod_low, prod_high, prod_low, 0, cy_limb );
 
       x = res_ptr[j];
-      prod_low = x - prod_low;
-      cy_limb += prod_low > x?1:0;
+      sub_ddmmss( borrow, prod_low, 0, x, 0, prod_low );
+      cy_limb -= borrow;
       res_ptr[j] = prod_low;
-    } 
+    }
   while( ++j );
 
   return cy_limb;
diff --git a/mpi/generic/mpih-sub1.c b/mpi/generic/mpih-sub1.c
index b8eff0db..bb51487c 100644
--- a/mpi/generic/mpih-sub1.c
+++ b/mpi/generic/mpih-sub1.c
@@ -35,7 +35,7 @@ mpi_limb_t
 _gcry_mpih_sub_n( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
 				  mpi_ptr_t s2_ptr, mpi_size_t size)
 {
-  mpi_limb_t x, y, cy;
+  mpi_limb_t x, y, cy, borrow;
   mpi_size_t j;
 
   /* The loop counter and index J goes from -SIZE to -1.  This way
@@ -48,16 +48,18 @@ _gcry_mpih_sub_n( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
   res_ptr -= j;
 
   cy = 0;
-  do 
+  do
     {
       y = s2_ptr[j];
       x = s1_ptr[j];
-      y += cy;		  /* add previous carry to subtrahend */
-      cy = y < cy;		  /* get out carry from that addition */
-      y = x - y;		  /* main subtract */
-      cy += y > x;		  /* get out carry from the subtract, combine */
+      /* Add previous carry to subtrahend and get out carry from
+       * that addition.  */
+      add_ssaaaa (cy, y, 0, y, 0, cy);
+      /* Main subtract and get out carry from the subtract, combine.  */
+      sub_ddmmss( borrow, y, 0, x, 0, y );
+      cy -= borrow;
       res_ptr[j] = y;
-    } 
+    }
   while( ++j );
 
   return cy;
-- 
2.43.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.