Skip to content

Commit 017a3bb

Browse files
committed
all the other bitwise
Signed-off-by: Davide Bettio <davide@uninstall.it>
1 parent c3600cf commit 017a3bb

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

src/libAtomVM/intn.c

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,73 @@ size_t intn_bormn(const intn_digit_t m[], size_t m_len, intn_integer_sign_t m_si
485485
return count;
486486
}
487487

488+
static inline intn_digit_t digit_band(intn_digit_t a, intn_digit_t b)
489+
{
490+
return a & b;
491+
}
492+
493+
size_t intn_bandmn(const intn_digit_t m[], size_t m_len, intn_integer_sign_t m_sign,
494+
const intn_digit_t n[], size_t n_len, intn_integer_sign_t n_sign, intn_digit_t out[],
495+
intn_integer_sign_t *out_sign)
496+
{
497+
intn_digit_t working_buf[INTN_MAX_IN_LEN];
498+
499+
const intn_digit_t *b;
500+
size_t b_len;
501+
intn_integer_sign_t b_sign;
502+
503+
size_t count
504+
= prepare_working_buf(m, m_len, m_sign, n, n_len, n_sign, &b, &b_len, &b_sign, working_buf);
505+
506+
signed_bitwise(b, b_len, b_sign, working_buf, count, digit_bor);
507+
intn_integer_sign_t res_sign = sign_bitwise(m_sign, n_sign, digit_band);
508+
509+
cond_neg(res_sign, working_buf, count, out);
510+
*out_sign = res_sign;
511+
512+
return count;
513+
}
514+
515+
static inline intn_digit_t digit_bxor(intn_digit_t a, intn_digit_t b)
516+
{
517+
return a ^ b;
518+
}
519+
520+
size_t intn_bxormn(const intn_digit_t m[], size_t m_len, intn_integer_sign_t m_sign,
521+
const intn_digit_t n[], size_t n_len, intn_integer_sign_t n_sign, intn_digit_t out[],
522+
intn_integer_sign_t *out_sign)
523+
{
524+
intn_digit_t working_buf[INTN_MAX_IN_LEN];
525+
526+
const intn_digit_t *b;
527+
size_t b_len;
528+
intn_integer_sign_t b_sign;
529+
530+
size_t count
531+
= prepare_working_buf(m, m_len, m_sign, n, n_len, n_sign, &b, &b_len, &b_sign, working_buf);
532+
533+
signed_bitwise(b, b_len, b_sign, working_buf, count, digit_bor);
534+
intn_integer_sign_t res_sign = sign_bitwise(m_sign, n_sign, digit_bxor);
535+
536+
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+
}
551+
552+
return count;
553+
}
554+
488555
size_t intn_count_digits(const intn_digit_t *num, size_t num_len)
489556
{
490557
int i;

src/libAtomVM/intn.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,14 @@ size_t intn_bormn(const intn_digit_t m[], size_t m_len, intn_integer_sign_t m_si
7777
const intn_digit_t n[], size_t n_len, intn_integer_sign_t n_sign, intn_digit_t out[],
7878
intn_integer_sign_t *out_sign);
7979

80+
size_t intn_bandmn(const intn_digit_t m[], size_t m_len, intn_integer_sign_t m_sign,
81+
const intn_digit_t n[], size_t n_len, intn_integer_sign_t n_sign, intn_digit_t out[],
82+
intn_integer_sign_t *out_sign);
83+
84+
size_t intn_bxormn(const intn_digit_t m[], size_t m_len, intn_integer_sign_t m_sign,
85+
const intn_digit_t n[], size_t n_len, intn_integer_sign_t n_sign, intn_digit_t out[],
86+
intn_integer_sign_t *out_sign);
87+
8088
size_t intn_count_digits(const intn_digit_t *num, size_t num_len);
8189

8290
char *intn_to_string(const intn_digit_t *num, size_t len, intn_integer_sign_t num_sign, int base,

0 commit comments

Comments
 (0)