@@ -70,6 +70,9 @@ typedef enum
7070
7171typedef uint32_t intn_digit_t ;
7272
73+ // Uncomment this for debug
74+ // void print_num(const intn_digit_t num[], int len);
75+
7376int intn_cmp (const intn_digit_t a [], size_t a_len , const intn_digit_t b [], size_t b_len );
7477
7578size_t intn_addmnu (
@@ -90,14 +93,34 @@ size_t intn_submn(const intn_digit_t m[], size_t m_len, intn_integer_sign_t m_si
9093
9194size_t intn_sub_int64 (int64_t num1 , int64_t num2 , intn_digit_t * out , intn_integer_sign_t * out_sign );
9295
96+ static inline intn_integer_sign_t intn_muldiv_sign (intn_integer_sign_t s1 , intn_integer_sign_t s2 )
97+ {
98+ return (intn_integer_sign_t ) ((unsigned int ) s1 ^ (unsigned int ) s2 ) & IntNNegativeInteger ;
99+ }
100+
93101void intn_mulmnu (
94- const intn_digit_t u [], size_t m , const intn_digit_t v [], size_t n , intn_digit_t w []);
102+ const intn_digit_t m [], size_t m_len , const intn_digit_t n [], size_t n_len , intn_digit_t out []);
103+
104+ static inline void intn_mulmn (const intn_digit_t m [], size_t m_len , intn_integer_sign_t m_sign ,
105+ const intn_digit_t n [], size_t n_len , intn_integer_sign_t n_sign , intn_digit_t out [],
106+ intn_integer_sign_t * out_sign )
107+ {
108+ * out_sign = intn_muldiv_sign (m_sign , n_sign );
109+ intn_mulmnu (m , m_len , n , n_len , out );
110+ }
111+
95112void intn_mul_int64 (int64_t num1 , int64_t num2 , intn_digit_t * out , intn_integer_sign_t * out_sign );
96113
97114size_t intn_divmnu (const intn_digit_t m [], size_t m_len , const intn_digit_t n [], size_t n_len ,
98115 intn_digit_t q_out [], intn_digit_t r_out [], size_t * r_out_len );
99116
100- void print_num (const uint32_t num [], int len );
117+ static inline size_t intn_divmn (const intn_digit_t m [], size_t m_len , intn_integer_sign_t m_sign ,
118+ const intn_digit_t n [], size_t n_len , intn_integer_sign_t n_sign , intn_digit_t q_out [],
119+ intn_integer_sign_t * qout_sign , intn_digit_t r_out [], size_t * r_out_len )
120+ {
121+ * qout_sign = intn_muldiv_sign (m_sign , n_sign );
122+ return intn_divmnu (m , m_len , n , n_len , q_out , r_out , r_out_len );
123+ }
101124
102125size_t intn_bormn (const intn_digit_t m [], size_t m_len , intn_integer_sign_t m_sign ,
103126 const intn_digit_t n [], size_t n_len , intn_integer_sign_t n_sign , intn_digit_t out [],
@@ -114,10 +137,10 @@ size_t intn_bxormn(const intn_digit_t m[], size_t m_len, intn_integer_sign_t m_s
114137size_t intn_bnot (const intn_digit_t m [], size_t m_len , intn_integer_sign_t m_sign ,
115138 intn_digit_t out [], intn_integer_sign_t * out_sign );
116139
117- size_t intn_bsl (const intn_digit_t num [], size_t len , size_t n , uint32_t * out );
140+ size_t intn_bsl (const intn_digit_t num [], size_t len , size_t n , intn_digit_t * out );
118141
119142size_t intn_bsr (
120- const intn_digit_t num [], size_t len , intn_integer_sign_t num_sign , size_t n , uint32_t * out );
143+ const intn_digit_t num [], size_t len , intn_integer_sign_t num_sign , size_t n , intn_digit_t * out );
121144
122145size_t intn_count_digits (const intn_digit_t * num , size_t num_len );
123146
@@ -149,7 +172,7 @@ static inline void intn_copy(
149172 memset (out + num_len , 0 , (extend_to - num_len ) * sizeof (intn_digit_t ));
150173}
151174
152- static inline void intn_u64_to_digits (uint64_t absu64 , uint32_t out [])
175+ static inline void intn_u64_to_digits (uint64_t absu64 , intn_digit_t out [])
153176{
154177#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
155178 memcpy (out , & absu64 , sizeof (absu64 ));
@@ -162,7 +185,7 @@ static inline void intn_u64_to_digits(uint64_t absu64, uint32_t out[])
162185#endif
163186}
164187
165- static inline void int64_to_intn_2 (int64_t i64 , uint32_t out [], intn_integer_sign_t * out_sign )
188+ static inline void int64_to_intn_2 (int64_t i64 , intn_digit_t out [], intn_integer_sign_t * out_sign )
166189{
167190 bool is_negative ;
168191 uint64_t absu64 = int64_safe_unsigned_abs_set_flag (i64 , & is_negative );
@@ -212,9 +235,4 @@ static inline bool intn_fits_int64(const intn_digit_t num[], size_t len, intn_in
212235 return false;
213236}
214237
215- static inline intn_integer_sign_t intn_muldiv_sign (intn_integer_sign_t s1 , intn_integer_sign_t s2 )
216- {
217- return (intn_integer_sign_t ) ((unsigned int ) s1 ^ (unsigned int ) s2 ) & IntNNegativeInteger ;
218- }
219-
220238#endif
0 commit comments