aboutsummaryrefslogtreecommitdiffstats
path: root/src/x86_64
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-11-02 14:07:46 +0100
committerBad Diode <bd@badd10de.dev>2021-11-02 14:07:46 +0100
commitfedab6bac08333ca31e69f21add7b66c575ec87c (patch)
treeee40a85250e04a632ba674b29767bf5d270731d0 /src/x86_64
parent9866fad84ada32ef4f386e8be6ca09bd3711f034 (diff)
downloadbdl-fedab6bac08333ca31e69f21add7b66c575ec87c.tar.gz
bdl-fedab6bac08333ca31e69f21add7b66c575ec87c.zip
Add compilation of `display` primitive
Diffstat (limited to 'src/x86_64')
-rw-r--r--src/x86_64/postlude.asm24
-rw-r--r--src/x86_64/prelude.asm30
2 files changed, 22 insertions, 32 deletions
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 @@
2_start_return: 2_start_return:
3 ;; return the last value in the stack 3 ;; return the last value in the stack
4 pop rdi 4 pop rdi
5 5 call display
6 ;; is nil?
7 mov rax, rdi
8 cmp rax, NIL_VAL
9 je exit
10
11 ;; is boolean?
12 mov rax, rdi
13 and rax, BOOL_MASK
14 cmp rax, BOOL_TAG
15 jne not_bool
16 call printbool
17 jmp exit
18not_bool:
19
20 ;; is fixnum?
21 mov rax, rdi
22 and rax, FIXNUM_MASK
23 cmp rax, FIXNUM_TAG
24 jne not_fixnum
25 call printdln
26 jmp exit
27not_fixnum:
28 6
29exit: 7exit:
30 ; exit syscall 8 ; 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 @@
1;; Value types.
2%define NIL_VAL 1
3%define BOOL_MASK 3
4%define BOOL_TAG 3
5%define BOOL_SHIFT 2
6%define FIXNUM_MASK 1
7%define FIXNUM_TAG 0
8%define FIXNUM_SHIFT 1
9
10printdln: 1printdln:
11 sar rdi, FIXNUM_SHIFT 2 sar rdi, FIXNUM_SHIFT
12 sub rsp, 40 3 sub rsp, 40
@@ -84,6 +75,27 @@ true_str:
84false_str: 75false_str:
85 db "false", 10 76 db "false", 10
86 77
78display:
79 ;; is nil?
80 mov rax, rdi
81 cmp rax, NIL_VAL
82 je display_end
83
84 ; ;; is boolean?
85 mov rax, rdi
86 and rax, BOOL_MASK
87 cmp rax, BOOL_TAG
88 jne not_bool
89 call printbool
90 ret
91not_bool:
92
93 ;; is fixnum?
94 mov rax, rdi
95 call printdln
96display_end:
97 ret
98
87global _start 99global _start
88_start: 100_start:
89 push NIL_VAL 101 push NIL_VAL