Skip to content

Commit eacdc62

Browse files
committed
term: use boxed integer sign bit
Negative boxed integers have 3rd bit set (b1s00). Also introduce new defines: - TERM_BOXED_NEGATIVE_INTEGER - TERM_BOXED_INTEGER_SIGN_BIT - TERM_BOXED_INTEGER_SIGN_BIT_POS Signed-off-by: Davide Bettio <davide@uninstall.it>
1 parent f43de27 commit eacdc62

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

src/libAtomVM/memory.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,10 @@ static void memory_scan_and_copy(HeapFragment *old_fragment, term *mem_start, co
614614
TRACE("- Found boxed pos int.\n");
615615
break;
616616

617+
case TERM_BOXED_NEGATIVE_INTEGER:
618+
TRACE("- Found boxed pos int.\n");
619+
break;
620+
617621
case TERM_BOXED_REF:
618622
TRACE("- Found ref.\n");
619623
break;
@@ -735,6 +739,10 @@ static void memory_scan_and_rewrite(size_t count, term *terms, const term *old_s
735739
ptr += term_get_size_from_boxed_header(t);
736740
break;
737741

742+
case TERM_BOXED_NEGATIVE_INTEGER:
743+
ptr += term_get_size_from_boxed_header(t);
744+
break;
745+
738746
case TERM_BOXED_REF:
739747
ptr += term_get_size_from_boxed_header(t);
740748
break;

src/libAtomVM/term.h

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,17 @@
4747
extern "C" {
4848
#endif
4949

50+
#define TERM_BOXED_INTEGER_SIGN_BIT_POS 2 // 3rd bit
51+
#define TERM_BOXED_INTEGER_SIGN_BIT (1 << TERM_BOXED_INTEGER_SIGN_BIT_POS)
5052
#define TERM_BOXED_VALUE_TAG 0x2
5153
#define TERM_INTEGER_TAG 0xF
5254
#define TERM_CATCH_TAG 0x1B
5355

5456
#define TERM_BOXED_TAG_MASK 0x3F
5557
#define TERM_BOXED_TUPLE 0x0
5658
#define TERM_BOXED_BIN_MATCH_STATE 0x4
57-
#define TERM_BOXED_POSITIVE_INTEGER 0x8
59+
#define TERM_BOXED_POSITIVE_INTEGER 0x8 // b1000 (b1s00)
60+
#define TERM_BOXED_NEGATIVE_INTEGER (TERM_BOXED_POSITIVE_INTEGER | TERM_BOXED_INTEGER_SIGN_BIT)
5861
#define TERM_BOXED_REF 0x10
5962
#define TERM_BOXED_FUN 0x14
6063
#define TERM_BOXED_FLOAT 0x18
@@ -443,7 +446,8 @@ static inline bool term_is_boxed_integer(term t)
443446
{
444447
if (term_is_boxed(t)) {
445448
const term *boxed_value = term_to_const_term_ptr(t);
446-
if ((boxed_value[0] & TERM_BOXED_TAG_MASK) == TERM_BOXED_POSITIVE_INTEGER) {
449+
if (((boxed_value[0] & TERM_BOXED_TAG_MASK) | TERM_BOXED_INTEGER_SIGN_BIT)
450+
== TERM_BOXED_NEGATIVE_INTEGER) {
447451
return true;
448452
}
449453
}
@@ -819,16 +823,18 @@ static inline avm_int64_t term_maybe_unbox_int64(term maybe_boxed_int)
819823

820824
static inline term term_make_boxed_int(avm_int_t value, Heap *heap)
821825
{
826+
avm_uint_t sign = (((avm_uint_t) value) >> (TERM_BITS - 1)) << TERM_BOXED_INTEGER_SIGN_BIT_POS;
822827
term *boxed_int = memory_heap_alloc(heap, 1 + BOXED_TERMS_REQUIRED_FOR_INT);
823-
boxed_int[0] = (BOXED_TERMS_REQUIRED_FOR_INT << 6) | TERM_BOXED_POSITIVE_INTEGER; // OR sign bit
828+
boxed_int[0] = (BOXED_TERMS_REQUIRED_FOR_INT << 6) | TERM_BOXED_POSITIVE_INTEGER | sign;
824829
boxed_int[1] = value;
825830
return ((term) boxed_int) | TERM_BOXED_VALUE_TAG;
826831
}
827832

828833
static inline term term_make_boxed_int64(avm_int64_t large_int64, Heap *heap)
829834
{
835+
avm_uint64_t sign = (((avm_uint64_t) large_int64) >> 63) << TERM_BOXED_INTEGER_SIGN_BIT_POS;
830836
term *boxed_int = memory_heap_alloc(heap, 1 + BOXED_TERMS_REQUIRED_FOR_INT64);
831-
boxed_int[0] = (BOXED_TERMS_REQUIRED_FOR_INT64 << 6) | TERM_BOXED_POSITIVE_INTEGER; // OR sign bit
837+
boxed_int[0] = (BOXED_TERMS_REQUIRED_FOR_INT64 << 6) | TERM_BOXED_POSITIVE_INTEGER | sign;
832838
#if BOXED_TERMS_REQUIRED_FOR_INT64 == 1
833839
boxed_int[1] = large_int64;
834840
#elif BOXED_TERMS_REQUIRED_FOR_INT64 == 2

0 commit comments

Comments
 (0)