@@ -458,6 +458,17 @@ static inline intn_integer_sign_t sign_bitwise(
458
458
& IntNNegativeInteger ;
459
459
}
460
460
461
+ // normalizes -0 to 0
462
+ static inline size_t count_and_normalize_sign (const intn_digit_t num [], size_t len , intn_integer_sign_t sign , intn_integer_sign_t * out_sign ) {
463
+ size_t count = intn_count_digits (num , len );
464
+ if ((count == 0 ) && (sign == IntNNegativeInteger )) {
465
+ * out_sign = IntNPositiveInteger ;
466
+ } else {
467
+ * out_sign = sign ;
468
+ }
469
+ return count ;
470
+ }
471
+
461
472
static inline intn_digit_t digit_bor (intn_digit_t a , intn_digit_t b )
462
473
{
463
474
return a | b ;
@@ -507,9 +518,9 @@ size_t intn_bandmn(const intn_digit_t m[], size_t m_len, intn_integer_sign_t m_s
507
518
intn_integer_sign_t res_sign = sign_bitwise (m_sign , n_sign , digit_band );
508
519
509
520
cond_neg (res_sign , working_buf , count , out );
510
- * out_sign = res_sign ;
521
+ size_t res_count = count_and_normalize_sign ( out , count , res_sign , out_sign ) ;
511
522
512
- return count ;
523
+ return res_count ;
513
524
}
514
525
515
526
static inline intn_digit_t digit_bxor (intn_digit_t a , intn_digit_t b )
@@ -534,22 +545,9 @@ size_t intn_bxormn(const intn_digit_t m[], size_t m_len, intn_integer_sign_t m_s
534
545
intn_integer_sign_t res_sign = sign_bitwise (m_sign , n_sign , digit_bxor );
535
546
536
547
cond_neg (res_sign , working_buf , count , out );
537
- * out_sign = res_sign ;
538
-
539
- if (res_sign == IntNNegativeInteger ) {
540
- bool all_zeros = true;
541
- for (size_t i = 0 ; i < count ; i ++ ) {
542
- if (out [i ] != 0 ) {
543
- all_zeros = false;
544
- break ;
545
- }
546
- }
547
- if (all_zeros ) {
548
- * out_sign = IntNPositiveInteger ;
549
- }
550
- }
548
+ size_t res_count = count_and_normalize_sign (out , count , res_sign , out_sign );
551
549
552
- return count ;
550
+ return res_count ;
553
551
}
554
552
555
553
size_t intn_count_digits (const intn_digit_t * num , size_t num_len )
0 commit comments