Skip to content

Commit 5f710e8

Browse files
committed
bsr cleanup #1
Signed-off-by: Davide Bettio <davide@uninstall.it>
1 parent a449a93 commit 5f710e8

File tree

1 file changed

+19
-36
lines changed

1 file changed

+19
-36
lines changed

src/libAtomVM/intn.c

Lines changed: 19 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -612,47 +612,34 @@ size_t intn_bsl(const uint32_t num[], size_t len, size_t n, uint32_t *out)
612612
return initial_zeros + i;
613613
}
614614

615-
size_t bsru(const uint32_t num[], size_t effective_bits_len, size_t n, uint32_t last_digit, uint32_t *out)
615+
void bsru(const uint32_t num[], size_t effective_bits_len, size_t n, uint32_t last_digit, uint32_t *out)
616616
{
617-
size_t digit_bit_size = sizeof(uint32_t) * 8;
618-
619-
size_t digit_right_bit_shift = n % 32;
620-
size_t left_shift_n = (32 - digit_right_bit_shift);
621-
622-
size_t len = size_round_to(effective_bits_len, digit_bit_size) / digit_bit_size;
623-
size_t counted_digits = len;
617+
size_t digit_bit_size = sizeof(uint32_t) * 8; // 32
624618

625-
///size_t new_bits_len = size_round_to(effective_bits_len - n, digit_bit_size);
619+
size_t digit_right_bit_shift = n % digit_bit_size;
620+
size_t left_shift_n = (digit_bit_size - digit_right_bit_shift);
626621

627-
////size_t new_digits_count = new_bits_len / digit_bit_size;
622+
size_t len_in_digits = size_round_to(effective_bits_len, digit_bit_size) / digit_bit_size;
628623

629-
size_t discarded = MIN(n / digit_bit_size, len);
624+
// caller makes sure that discarded < len_in_digits
625+
size_t discarded = n / digit_bit_size;
630626

631627
if (left_shift_n == 32) {
632-
memcpy(out, num + discarded, (len - discarded) * sizeof(uint32_t));
633-
return len - discarded;
628+
memcpy(out, num + discarded, (len_in_digits - discarded) * sizeof(uint32_t));
629+
return;
634630
}
635631

636632
size_t i;
637-
for (i = discarded; i < counted_digits - 1; i++) {
633+
for (i = discarded; i < len_in_digits - 1; i++) {
638634
uint32_t next_digit = num[i + 1];
639635
uint32_t digit = num[i];
640636
out[i - discarded] = (digit >> digit_right_bit_shift) | (next_digit << left_shift_n);
641637
}
642638
uint32_t maybe_last_out = (num[i] >> digit_right_bit_shift) | (last_digit << left_shift_n);
643639

644-
/*
645-
if (initial_zeros + i > new_digits_count) {
646-
abort();
647-
}
648-
*/
649-
650640
if (maybe_last_out) {
651641
out[i - discarded] = maybe_last_out;
652-
return i - discarded + 1;
653642
}
654-
655-
return i - discarded;
656643
}
657644

658645
size_t intn_bsr(const uint32_t num[], size_t len, intn_integer_sign_t num_sign, size_t n, uint32_t *out)
@@ -662,29 +649,25 @@ size_t intn_bsr(const uint32_t num[], size_t len, intn_integer_sign_t num_sign,
662649
size_t ms_digit_bits = 32 - uint32_nlz(num[counted_digits - 1]);
663650
size_t effective_bits_len = (counted_digits - 1) * digit_bit_size + ms_digit_bits;
664651

665-
if (n > effective_bits_len) {
652+
if (n >= effective_bits_len) {
666653
out[0] = (num_sign == IntNPositiveInteger) ? 0 : 1;
667654
return 1;
668655
}
669656

657+
size_t shifted_len = size_round_to(effective_bits_len - n, digit_bit_size) / digit_bit_size;
658+
670659
if (num_sign == IntNPositiveInteger) {
671-
return bsru(num, effective_bits_len, n, 0, out);
660+
bsru(num, effective_bits_len, n, 0, out);
661+
672662
} else {
673663
uint32_t tmp_buf[INTN_MAX_RES_LEN];
674-
memset(out, 0, INTN_MAX_RES_LEN * sizeof(const uint32_t));
675664
neg(num, counted_digits, tmp_buf);
676-
size_t shifted_len = bsru(tmp_buf, effective_bits_len, n, (uint32_t) -1, out);
677-
678-
size_t len = size_round_to(effective_bits_len - n, digit_bit_size) / digit_bit_size;
679-
neg_in_place(out, len);
680-
681-
fprintf(stderr, "shifted: %i, len: %i\n", (int) shifted_len, (int) len);
682-
print_num(out, len);
683-
return len;
665+
bsru(tmp_buf, effective_bits_len, n, (uint32_t) -1, out);
666+
neg_in_place(out, shifted_len);
684667
}
685-
}
686-
687668

669+
return shifted_len;
670+
}
688671

689672
/*
690673
uint32_t last_digit = 0;

0 commit comments

Comments
 (0)