Skip to content

Commit c3600cf

Browse files
committed
WIP intn bor
Signed-off-by: Davide Bettio <davide@uninstall.it>
1 parent 2ac8813 commit c3600cf

File tree

2 files changed

+28
-24
lines changed

2 files changed

+28
-24
lines changed

src/libAtomVM/intn.c

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ static void cond_neg(
395395
}
396396
}
397397

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,
399399
const intn_digit_t n[], size_t n_len, intn_integer_sign_t n_sign, const intn_digit_t *b[],
400400
size_t *b_len, intn_integer_sign_t *b_sign, intn_digit_t out[])
401401
{
@@ -420,18 +420,13 @@ static size_t prepare_out(const intn_digit_t m[], size_t m_len, intn_integer_sig
420420
}
421421

422422
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;
429424
}
430425

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);
432427

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)
435430
{
436431
if (b_sign == IntNPositiveInteger) {
437432
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,
454449
out[i] = bit_op(out[i], UINT32_MAX);
455450
}
456451
}
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;
458464
}
459465

460466
size_t intn_bormn(const intn_digit_t m[], size_t m_len, intn_integer_sign_t m_sign,
461467
const intn_digit_t n[], size_t n_len, intn_integer_sign_t n_sign, intn_digit_t out[],
462468
intn_integer_sign_t *out_sign)
463469
{
464-
intn_digit_t working_buf[INTN_MAX_IN_LEN + 1];
470+
intn_digit_t working_buf[INTN_MAX_IN_LEN];
465471

466472
const intn_digit_t *b;
467473
size_t b_len;
468474
intn_integer_sign_t b_sign;
469475

470476
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);
472478

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);
474481

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;
480484

481-
return ret_count;
485+
return count;
482486
}
483487

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

src/libAtomVM/intn.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ void intn_mul_int64(int64_t num1, int64_t num2, intn_digit_t *out, intn_integer_
7373

7474
void print_num(const uint32_t num[], int len);
7575

76+
size_t intn_bormn(const intn_digit_t m[], size_t m_len, intn_integer_sign_t m_sign,
77+
const intn_digit_t n[], size_t n_len, intn_integer_sign_t n_sign, intn_digit_t out[],
78+
intn_integer_sign_t *out_sign);
79+
7680
size_t intn_count_digits(const intn_digit_t *num, size_t num_len);
7781

7882
char *intn_to_string(const intn_digit_t *num, size_t len, intn_integer_sign_t num_sign, int base,
@@ -91,10 +95,6 @@ int intn_to_integer_bytes(const intn_digit_t in[], size_t in_len, intn_integer_s
9195

9296
size_t intn_required_unsigned_integer_bytes(const intn_digit_t in[], size_t in_len);
9397

94-
size_t intn_bormn(const intn_digit_t m[], size_t m_len, intn_integer_sign_t m_sign,
95-
const intn_digit_t n[], size_t n_len, intn_integer_sign_t n_sign, intn_digit_t out[],
96-
intn_integer_sign_t *out_sign);
97-
9898
static inline void intn_copy(
9999
const intn_digit_t *num, size_t num_len, intn_digit_t *out, size_t extend_to)
100100
{

0 commit comments

Comments
 (0)