[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