From 7b3b52e6307ceda963bd1a6c481baeb720c2beb3 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Thu, 4 Nov 2021 12:55:25 +0100 Subject: Change heap register to `r15` from `rsi` to avoid conflicts --- src/compiler.h | 120 +++++++++++++++++++++++++------------------------ src/x86_64/prelude.asm | 4 +- 2 files changed, 64 insertions(+), 60 deletions(-) diff --git a/src/compiler.h b/src/compiler.h index 070f24a..5e1bf7d 100644 --- a/src/compiler.h +++ b/src/compiler.h @@ -8,21 +8,21 @@ #define HEAP_SIZE MB(32) // Immediate constants. -#define NIL_VAL 47 -#define BOOL_MASK 127 -#define BOOL_TAG 31 -#define BOOL_SHIFT 7 +#define NIL_VAL 47LU +#define BOOL_MASK 127LU +#define BOOL_TAG 31LU +#define BOOL_SHIFT 7LU #define TRUE_VAL ((1 << BOOL_SHIFT) | BOOL_TAG) #define FALSE_VAL ((0 << BOOL_SHIFT) | BOOL_TAG) -#define FIXNUM_MASK 3 -#define FIXNUM_TAG 0 -#define FIXNUM_SHIFT 2 +#define FIXNUM_MASK 3LU +#define FIXNUM_TAG 0LU +#define FIXNUM_SHIFT 2LU // Heap allocated objects. -#define STRING_MASK 7 -#define STRING_TAG 3 -#define PAIR_MASK 7 -#define PAIR_TAG 1 +#define STRING_MASK 7LU +#define STRING_TAG 3LU +#define PAIR_MASK 7LU +#define PAIR_TAG 1LU void compile_object(Object *obj); void compile_fixnum(Object *obj); @@ -69,7 +69,7 @@ void compile_boolean(Object *obj) { printf(" ;; --> compile_boolean\n"); int is_true = obj->type == OBJ_TYPE_TRUE; - printf(" mov rax, %d\n", (is_true << BOOL_SHIFT) | BOOL_TAG); + printf(" mov rax, %zu\n", (is_true << BOOL_SHIFT) | BOOL_TAG); printf(" push rax\n"); printf(" ;; <-- compile_boolean\n"); } @@ -77,7 +77,7 @@ compile_boolean(Object *obj) { void compile_nil(void) { printf(" ;; --> compile_nil\n"); - printf(" mov rax, %d\n", NIL_VAL); + printf(" mov rax, NIL_VAL\n"); printf(" push rax\n"); printf(" ;; <-- compile_nil\n"); } @@ -109,25 +109,25 @@ compile_type_predicate(OpType op, Object* args) { printf(" pop rax\n"); switch (op) { case OP_IS_NIL: { - printf(" cmp rax, %d\n", NIL_VAL); + printf(" cmp rax, NIL_VAL\n"); } break; case OP_IS_ZERO: { printf(" cmp rax, 0\n"); } break; case OP_IS_BOOL: { - printf(" and rax, %d\n", BOOL_MASK); - printf(" cmp rax, %d\n", BOOL_TAG); + printf(" and rax, BOOL_MASK\n"); + printf(" cmp rax, BOOL_TAG\n"); } break; case OP_IS_FIXNUM: { - printf(" and rax, %d\n", FIXNUM_MASK); - printf(" cmp rax, %d\n", FIXNUM_TAG); + printf(" and rax, FIXNUM_MASK\n"); + printf(" cmp rax, FIXNUM_TAG\n"); } break; default: break; } printf(" mov rax, 0\n"); printf(" sete al\n"); - printf(" shl rax, %d\n", BOOL_SHIFT); - printf(" or rax, %d\n", BOOL_TAG); + printf(" shl rax, BOOL_SHIFT\n"); + printf(" or rax, BOOL_TAG\n"); printf(" push rax\n"); printf(" ;; <-- compile_type_predicate\n"); } @@ -137,11 +137,11 @@ compile_not(Object* args) { printf(" ;; --> compile_not\n"); compile_object(args->head); printf(" pop rax\n"); - printf(" cmp rax, %d\n", FALSE_VAL); + printf(" cmp rax, FALSE_VAL\n"); printf(" mov rax, 0\n"); printf(" sete al\n"); - printf(" shl rax, %d\n", BOOL_SHIFT); - printf(" or rax, %d\n", BOOL_TAG); + printf(" shl rax, BOOL_SHIFT\n"); + printf(" or rax, BOOL_TAG\n"); printf(" push rax\n"); printf(" ;; <-- compile_not\n"); } @@ -155,14 +155,14 @@ compile_and(Object *args) { compile_object(args->head); args = args->tail; printf(" pop rax\n"); - printf(" cmp rax, %d\n", FALSE_VAL); + printf(" cmp rax, FALSE_VAL\n"); printf(" je %s\n", lab_false); } - printf(" mov rax, %d\n", TRUE_VAL); + printf(" mov rax, TRUE_VAL\n"); printf(" push rax\n"); printf(" jmp %s\n", lab_exit); printf("%s:\n", lab_false); - printf(" mov rax, %d\n", FALSE_VAL); + printf(" mov rax, FALSE_VAL\n"); printf(" push rax\n"); printf("%s:\n", lab_exit); free(lab_false); @@ -179,14 +179,14 @@ compile_or(Object *args) { compile_object(args->head); args = args->tail; printf(" pop rax\n"); - printf(" cmp rax, %d\n", FALSE_VAL); + printf(" cmp rax, FALSE_VAL\n"); printf(" jne %s\n", lab_true); } - printf(" mov rax, %d\n", FALSE_VAL); + printf(" mov rax, FALSE_VAL\n"); printf(" push rax\n"); printf(" jmp %s\n", lab_exit); printf("%s:\n", lab_true); - printf(" mov rax, %d\n", TRUE_VAL); + printf(" mov rax, TRUE_VAL\n"); printf(" push rax\n"); printf("%s:\n", lab_exit); free(lab_true); @@ -224,11 +224,11 @@ compile_cmp_list(OpType op, Object* args) { printf(" push rcx\n"); } printf(" pop rcx\n"); - printf(" mov rax, %d\n", TRUE_VAL); + printf(" mov rax, TRUE_VAL\n"); printf(" push rax\n"); printf(" jmp %s\n", lab_exit); printf("%s:\n", lab_false); - printf(" mov rax, %d\n", FALSE_VAL); + printf(" mov rax, FALSE_VAL\n"); printf(" push rax\n"); printf("%s:\n", lab_exit); free(lab_false); @@ -250,25 +250,25 @@ compile_arithmetic_list(OpType op, Object* args) { case OP_ADD: { printf(" add rax, rcx\n"); } break; case OP_SUB: { printf(" sub rax, rcx\n"); } break; case OP_MUL: { - printf(" sar rax, %d\n", FIXNUM_SHIFT); - printf(" sar rcx, %d\n", FIXNUM_SHIFT); + printf(" sar rax, FIXNUM_SHIFT\n"); + printf(" sar rcx, FIXNUM_SHIFT\n"); printf(" mul rcx\n"); - printf(" shl rax, %d\n", FIXNUM_SHIFT); + printf(" shl rax, FIXNUM_SHIFT\n"); } break; case OP_DIV: { - printf(" sar rax, %d\n", FIXNUM_SHIFT); - printf(" sar rcx, %d\n", FIXNUM_SHIFT); + printf(" sar rax, FIXNUM_SHIFT\n"); + printf(" sar rcx, FIXNUM_SHIFT\n"); printf(" mov rdx, 0\n"); printf(" div rcx\n"); - printf(" shl rax, %d\n", FIXNUM_SHIFT); + printf(" shl rax, FIXNUM_SHIFT\n"); } break; case OP_MOD: { - printf(" sar rax, %d\n", FIXNUM_SHIFT); - printf(" sar rcx, %d\n", FIXNUM_SHIFT); + printf(" sar rax, FIXNUM_SHIFT\n"); + printf(" sar rcx, FIXNUM_SHIFT\n"); printf(" mov rdx, 0\n"); printf(" div rcx\n"); printf(" mov rax, rdx\n"); - printf(" shl rax, %d\n", FIXNUM_SHIFT); + printf(" shl rax, FIXNUM_SHIFT\n"); } break; default: break; } @@ -285,25 +285,25 @@ compile_cons(Object *obj) { compile_object(obj->tail->head); printf(" pop rdx\n"); printf(" pop rax\n"); - printf(" mov [rsi], rax\n"); - printf(" mov [rsi + 8], rdx\n"); + printf(" mov [r15], rax\n"); + printf(" mov [r15 + 8], rdx\n"); // Push memory address of cons cell. - printf(" mov rax, rsi\n"); - printf(" or rax, %ld\n", PAIR_TAG); + printf(" mov rax, r15\n"); + printf(" or rax, %zu\n", PAIR_TAG); printf(" push rax\n"); // Bump allocation register. - printf(" add rsi, 16\n"); + printf(" add r15, 16\n"); printf(" ;; <-- compile_cons\n"); } void compile_car(Object *obj) { - printf(" ;; <-- compile_car\n"); + printf(" ;; --> compile_car\n"); compile_object(obj->head); printf(" pop rax\n"); - printf(" and eax, %ld\n", ~PAIR_MASK); + printf(" and rax, %zu\n", ~PAIR_MASK); printf(" mov rdx, [rax]\n"); printf(" push rdx\n"); printf(" ;; <-- compile_car\n"); @@ -311,10 +311,10 @@ compile_car(Object *obj) { void compile_cdr(Object *obj) { - printf(" ;; <-- compile_cdr\n"); + printf(" ;; --> compile_cdr\n"); compile_object(obj->head); printf(" pop rax\n"); - printf(" and eax, %ld\n", ~PAIR_MASK); + printf(" and rax, %zu\n", ~PAIR_MASK); printf(" mov rdx, [rax + 8]\n"); printf(" push rdx\n"); printf(" ;; <-- compile_cdr\n"); @@ -379,7 +379,7 @@ compile_if(Object *obj) { char *lab_false = generate_label(); compile_object(obj->condition); printf(" pop rax\n"); - printf(" cmp rax, %d\n", FALSE_VAL); + printf(" cmp rax, FALSE_VAL\n"); printf(" je %s\n", lab_false); compile_object(obj->expr_true); if (obj->expr_false != NULL) { @@ -410,14 +410,18 @@ compile_object(Object *obj) { void compile(Root *roots) { - printf("%%define NIL_VAL %d\n", NIL_VAL); - printf("%%define BOOL_MASK %d\n", BOOL_MASK); - printf("%%define BOOL_TAG %d\n", BOOL_TAG); - printf("%%define BOOL_SHIFT %d\n", BOOL_SHIFT); - printf("%%define FIXNUM_MASK %d\n", FIXNUM_MASK); - printf("%%define FIXNUM_TAG %d\n", FIXNUM_TAG); - printf("%%define FIXNUM_SHIFT %d\n", FIXNUM_SHIFT); - printf("%%define HEAP_SIZE %ld\n", HEAP_SIZE); + printf("%%define NIL_VAL %zu\n", NIL_VAL); + printf("%%define BOOL_MASK %zu\n", BOOL_MASK); + printf("%%define BOOL_TAG %zu\n", BOOL_TAG); + printf("%%define BOOL_SHIFT %zu\n", BOOL_SHIFT); + printf("%%define FIXNUM_MASK %zu\n", FIXNUM_MASK); + printf("%%define FIXNUM_TAG %zu\n", FIXNUM_TAG); + printf("%%define FIXNUM_SHIFT %zu\n", FIXNUM_SHIFT); + printf("%%define PAIR_MASK %zu\n", PAIR_MASK); + printf("%%define PAIR_TAG %zu\n", PAIR_TAG); + printf("%%define STRING_MASK %zu\n", STRING_MASK); + printf("%%define STRING_TAG %zu\n", STRING_TAG); + printf("%%define HEAP_SIZE %zu\n", HEAP_SIZE); printf("\n"); emit_file(PRELUDE_FILE); for (size_t i = 0; i < array_size(roots); i++) { diff --git a/src/x86_64/prelude.asm b/src/x86_64/prelude.asm index e57e820..3ad33f7 100644 --- a/src/x86_64/prelude.asm +++ b/src/x86_64/prelude.asm @@ -82,7 +82,7 @@ display: cmp rax, NIL_VAL je display_end - ; ;; is boolean? + ;; is boolean? mov rax, rdi and rax, BOOL_MASK cmp rax, BOOL_TAG @@ -100,7 +100,7 @@ display_end: global _start _start: ;; point `rdi` to the start of the heap. - mov rsi, bdl_heap + mov r15, bdl_heap ;; make sure the last element in the stack is the nil value. push NIL_VAL -- cgit v1.2.1