Skip to content

Commit bac1ad9

Browse files
committed
intn: band
Signed-off-by: Davide Bettio <davide@uninstall.it>
1 parent 6ee55f1 commit bac1ad9

File tree

1 file changed

+15
-17
lines changed

1 file changed

+15
-17
lines changed

src/libAtomVM/intn.c

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,17 @@ static inline intn_integer_sign_t sign_bitwise(
458458
& IntNNegativeInteger;
459459
}
460460

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+
461472
static inline intn_digit_t digit_bor(intn_digit_t a, intn_digit_t b)
462473
{
463474
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
507518
intn_integer_sign_t res_sign = sign_bitwise(m_sign, n_sign, digit_band);
508519

509520
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);
511522

512-
return count;
523+
return res_count;
513524
}
514525

515526
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
534545
intn_integer_sign_t res_sign = sign_bitwise(m_sign, n_sign, digit_bxor);
535546

536547
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);
551549

552-
return count;
550+
return res_count;
553551
}
554552

555553
size_t intn_count_digits(const intn_digit_t *num, size_t num_len)

0 commit comments

Comments
 (0)