From fedab6bac08333ca31e69f21add7b66c575ec87c Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 2 Nov 2021 14:07:46 +0100 Subject: Add compilation of `display` primitive --- src/x86_64/postlude.asm | 24 +----------------------- src/x86_64/prelude.asm | 30 +++++++++++++++++++++--------- 2 files changed, 22 insertions(+), 32 deletions(-) (limited to 'src/x86_64') diff --git a/src/x86_64/postlude.asm b/src/x86_64/postlude.asm index 5c8e56f..3355286 100644 --- a/src/x86_64/postlude.asm +++ b/src/x86_64/postlude.asm @@ -2,29 +2,7 @@ _start_return: ;; return the last value in the stack pop rdi - - ;; is nil? - mov rax, rdi - cmp rax, NIL_VAL - je exit - - ;; is boolean? - mov rax, rdi - and rax, BOOL_MASK - cmp rax, BOOL_TAG - jne not_bool - call printbool - jmp exit -not_bool: - - ;; is fixnum? - mov rax, rdi - and rax, FIXNUM_MASK - cmp rax, FIXNUM_TAG - jne not_fixnum - call printdln - jmp exit -not_fixnum: + call display exit: ; exit syscall diff --git a/src/x86_64/prelude.asm b/src/x86_64/prelude.asm index c314ba4..6bb6627 100644 --- a/src/x86_64/prelude.asm +++ b/src/x86_64/prelude.asm @@ -1,12 +1,3 @@ -;; Value types. -%define NIL_VAL 1 -%define BOOL_MASK 3 -%define BOOL_TAG 3 -%define BOOL_SHIFT 2 -%define FIXNUM_MASK 1 -%define FIXNUM_TAG 0 -%define FIXNUM_SHIFT 1 - printdln: sar rdi, FIXNUM_SHIFT sub rsp, 40 @@ -84,6 +75,27 @@ true_str: false_str: db "false", 10 +display: + ;; is nil? + mov rax, rdi + cmp rax, NIL_VAL + je display_end + + ; ;; is boolean? + mov rax, rdi + and rax, BOOL_MASK + cmp rax, BOOL_TAG + jne not_bool + call printbool + ret +not_bool: + + ;; is fixnum? + mov rax, rdi + call printdln +display_end: + ret + global _start _start: push NIL_VAL -- cgit v1.2.1