@@ -61,11 +61,6 @@ static inline size_t pad_uint16_to_digits(uint16_t n16[], size_t n16_len)
6161 return n16_len ;
6262}
6363
64- static inline size_t size_round_to (size_t n , size_t round_to )
65- {
66- return (n + (round_to - 1 )) & ~(round_to - 1 );
67- }
68-
6964/*
7065 * Multiplication
7166 */
@@ -439,18 +434,19 @@ size_t intn_divmnu(const intn_digit_t m[], size_t m_len, const intn_digit_t n[],
439434 return padded_q_len / UINT16_IN_A_DIGIT ;
440435}
441436
442- // This function assumes no leading zeros (lenght is used in comparison)
443- // Caller must ensure this precondition
444437int intn_cmp (const intn_digit_t a [], size_t a_len , const intn_digit_t b [], size_t b_len )
445438{
446- if (a_len > b_len ) {
439+ size_t normal_a_len = intn_count_digits (a , a_len );
440+ size_t normal_b_len = intn_count_digits (b , b_len );
441+
442+ if (normal_a_len > normal_b_len ) {
447443 return 1 ;
448444 }
449- if (a_len < b_len ) {
445+ if (normal_a_len < normal_b_len ) {
450446 return -1 ;
451447 }
452448
453- for (size_t i = a_len ; i > 0 ; i -- ) {
449+ for (size_t i = normal_a_len ; i > 0 ; i -- ) {
454450 if (a [i - 1 ] > b [i - 1 ]) {
455451 return 1 ;
456452 }
@@ -791,23 +787,21 @@ size_t intn_bnot(const intn_digit_t m[], size_t m_len, intn_integer_sign_t m_sig
791787
792788size_t intn_bsl (const intn_digit_t num [], size_t len , size_t n , intn_digit_t * out )
793789{
794- size_t digit_bit_size = sizeof (uint32_t ) * 8 ;
795-
796790 size_t digit_left_bit_shift = n % 32 ;
797791 size_t right_shift_n = (32 - digit_left_bit_shift );
798792
799793 size_t counted_digits = intn_count_digits (num , len );
800794 size_t ms_digit_bits = 32 - uint32_nlz (num [counted_digits - 1 ]);
801- size_t effective_bits_len = (counted_digits - 1 ) * digit_bit_size + ms_digit_bits ;
802- size_t new_bits_len = size_round_to (effective_bits_len + n , digit_bit_size );
795+ size_t effective_bits_len = (counted_digits - 1 ) * INTN_DIGIT_BITS + ms_digit_bits ;
796+ size_t new_bits_len = size_align_up_pow2 (effective_bits_len + n , INTN_DIGIT_BITS );
803797
804- size_t new_digits_count = new_bits_len / digit_bit_size ;
798+ size_t new_digits_count = new_bits_len / INTN_DIGIT_BITS ;
805799
806800 if (new_digits_count > INTN_BSL_MAX_RES_LEN ) {
807801 return new_digits_count ;
808802 }
809803
810- size_t initial_zeros = MIN (n / digit_bit_size , INTN_BSL_MAX_RES_LEN );
804+ size_t initial_zeros = MIN (n / INTN_DIGIT_BITS , INTN_BSL_MAX_RES_LEN );
811805 memset (out , 0 , initial_zeros * sizeof (uint32_t ));
812806
813807 if (right_shift_n == 32 ) {
@@ -837,15 +831,14 @@ size_t intn_bsl(const intn_digit_t num[], size_t len, size_t n, intn_digit_t *ou
837831void bsru (
838832 const uint32_t num [], size_t effective_bits_len , size_t n , uint32_t last_digit , uint32_t * out )
839833{
840- size_t digit_bit_size = sizeof (uint32_t ) * 8 ; // 32
841-
842- size_t digit_right_bit_shift = n % digit_bit_size ;
843- size_t left_shift_n = (digit_bit_size - digit_right_bit_shift );
834+ size_t digit_right_bit_shift = n % INTN_DIGIT_BITS ;
835+ size_t left_shift_n = (INTN_DIGIT_BITS - digit_right_bit_shift );
844836
845- size_t len_in_digits = size_round_to (effective_bits_len , digit_bit_size ) / digit_bit_size ;
837+ size_t len_in_digits
838+ = size_align_up_pow2 (effective_bits_len , INTN_DIGIT_BITS ) / INTN_DIGIT_BITS ;
846839
847840 // caller makes sure that discarded < len_in_digits
848- size_t discarded = n / digit_bit_size ;
841+ size_t discarded = n / INTN_DIGIT_BITS ;
849842
850843 if (left_shift_n == 32 ) {
851844 memcpy (out , num + discarded , (len_in_digits - discarded ) * sizeof (uint32_t ));
@@ -868,17 +861,17 @@ void bsru(
868861size_t intn_bsr (
869862 const intn_digit_t num [], size_t len , intn_integer_sign_t num_sign , size_t n , intn_digit_t * out )
870863{
871- size_t digit_bit_size = sizeof (uint32_t ) * 8 ;
872864 size_t counted_digits = intn_count_digits (num , len );
873865 size_t ms_digit_bits = 32 - uint32_nlz (num [counted_digits - 1 ]);
874- size_t effective_bits_len = (counted_digits - 1 ) * digit_bit_size + ms_digit_bits ;
866+ size_t effective_bits_len = (counted_digits - 1 ) * INTN_DIGIT_BITS + ms_digit_bits ;
875867
876868 if (n >= effective_bits_len ) {
877869 out [0 ] = (num_sign == IntNPositiveInteger ) ? 0 : 1 ;
878870 return 1 ;
879871 }
880872
881- size_t shifted_len = size_round_to (effective_bits_len - n , digit_bit_size ) / digit_bit_size ;
873+ size_t shifted_len
874+ = size_align_up_pow2 (effective_bits_len - n , INTN_DIGIT_BITS ) / INTN_DIGIT_BITS ;
882875
883876 if (num_sign == IntNPositiveInteger ) {
884877 bsru (num , effective_bits_len , n , 0 , out );
0 commit comments