@@ -395,7 +395,7 @@ static void cond_neg(
395
395
}
396
396
}
397
397
398
- static size_t prepare_out (const intn_digit_t m [], size_t m_len , intn_integer_sign_t m_sign ,
398
+ static size_t prepare_working_buf (const intn_digit_t m [], size_t m_len , intn_integer_sign_t m_sign ,
399
399
const intn_digit_t n [], size_t n_len , intn_integer_sign_t n_sign , const intn_digit_t * b [],
400
400
size_t * b_len , intn_integer_sign_t * b_sign , intn_digit_t out [])
401
401
{
@@ -420,18 +420,13 @@ static size_t prepare_out(const intn_digit_t m[], size_t m_len, intn_integer_sig
420
420
}
421
421
422
422
cond_neg (longest_sign , longest , longest_len , out );
423
- if (longest_sign == IntNPositiveInteger ) {
424
- out [longest_len ] = 0 ;
425
- } else {
426
- out [longest_len ] = UINT32_MAX ;
427
- }
428
- return longest_len + 1 ;
423
+ return longest_len ;
429
424
}
430
425
431
- static inline uint32_t bit_op ( uint32_t a , uint32_t b ) { return a | b ; }
426
+ typedef intn_digit_t ( * bit_op_t )( intn_digit_t a , intn_digit_t b );
432
427
433
- static inline size_t neg_and_bitwise (const intn_digit_t b [], size_t b_len ,
434
- intn_integer_sign_t b_sign , intn_digit_t out [], size_t out_len )
428
+ static inline void signed_bitwise (const intn_digit_t b [], size_t b_len , intn_integer_sign_t b_sign ,
429
+ intn_digit_t out [], size_t out_len , bit_op_t bit_op )
435
430
{
436
431
if (b_sign == IntNPositiveInteger ) {
437
432
for (size_t i = 0 ; i < b_len ; i ++ ) {
@@ -454,31 +449,40 @@ static inline size_t neg_and_bitwise(const intn_digit_t b[], size_t b_len,
454
449
out [i ] = bit_op (out [i ], UINT32_MAX );
455
450
}
456
451
}
457
- return out_len ;
452
+ }
453
+
454
+ static inline intn_integer_sign_t sign_bitwise (
455
+ intn_integer_sign_t m_sign , intn_integer_sign_t n_sign , bit_op_t bit_op )
456
+ {
457
+ return (intn_integer_sign_t ) bit_op ((unsigned int ) m_sign , (unsigned int ) n_sign )
458
+ & IntNNegativeInteger ;
459
+ }
460
+
461
+ static inline intn_digit_t digit_bor (intn_digit_t a , intn_digit_t b )
462
+ {
463
+ return a | b ;
458
464
}
459
465
460
466
size_t intn_bormn (const intn_digit_t m [], size_t m_len , intn_integer_sign_t m_sign ,
461
467
const intn_digit_t n [], size_t n_len , intn_integer_sign_t n_sign , intn_digit_t out [],
462
468
intn_integer_sign_t * out_sign )
463
469
{
464
- intn_digit_t working_buf [INTN_MAX_IN_LEN + 1 ];
470
+ intn_digit_t working_buf [INTN_MAX_IN_LEN ];
465
471
466
472
const intn_digit_t * b ;
467
473
size_t b_len ;
468
474
intn_integer_sign_t b_sign ;
469
475
470
476
size_t count
471
- = prepare_out (m , m_len , m_sign , n , n_len , n_sign , & b , & b_len , & b_sign , working_buf );
477
+ = prepare_working_buf (m , m_len , m_sign , n , n_len , n_sign , & b , & b_len , & b_sign , working_buf );
472
478
473
- neg_and_bitwise (b , b_len , b_sign , working_buf , count );
479
+ signed_bitwise (b , b_len , b_sign , working_buf , count , digit_bor );
480
+ intn_integer_sign_t res_sign = sign_bitwise (m_sign , n_sign , digit_bor );
474
481
475
- * out_sign = (intn_integer_sign_t ) ((unsigned int ) m_sign | (unsigned int ) n_sign )
476
- & IntNNegativeInteger ;
477
-
478
- size_t ret_count = count ; // MAX(count, count2);
479
- cond_neg (* out_sign , working_buf , ret_count , out );
482
+ cond_neg (res_sign , working_buf , count , out );
483
+ * out_sign = res_sign ;
480
484
481
- return ret_count ;
485
+ return count ;
482
486
}
483
487
484
488
size_t intn_count_digits (const intn_digit_t * num , size_t num_len )
0 commit comments