diff options
author | Bad Diode <bd@badd10de.dev> | 2021-11-02 14:07:46 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-11-02 14:07:46 +0100 |
commit | fedab6bac08333ca31e69f21add7b66c575ec87c (patch) | |
tree | ee40a85250e04a632ba674b29767bf5d270731d0 /src/x86_64 | |
parent | 9866fad84ada32ef4f386e8be6ca09bd3711f034 (diff) | |
download | bdl-fedab6bac08333ca31e69f21add7b66c575ec87c.tar.gz bdl-fedab6bac08333ca31e69f21add7b66c575ec87c.zip |
Add compilation of `display` primitive
Diffstat (limited to 'src/x86_64')
-rw-r--r-- | src/x86_64/postlude.asm | 24 | ||||
-rw-r--r-- | src/x86_64/prelude.asm | 30 |
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 | ||
18 | not_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 | ||
27 | not_fixnum: | ||
28 | 6 | ||
29 | exit: | 7 | exit: |
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 | |||
10 | printdln: | 1 | printdln: |
11 | sar rdi, FIXNUM_SHIFT | 2 | sar rdi, FIXNUM_SHIFT |
12 | sub rsp, 40 | 3 | sub rsp, 40 |
@@ -84,6 +75,27 @@ true_str: | |||
84 | false_str: | 75 | false_str: |
85 | db "false", 10 | 76 | db "false", 10 |
86 | 77 | ||
78 | display: | ||
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 | ||
91 | not_bool: | ||
92 | |||
93 | ;; is fixnum? | ||
94 | mov rax, rdi | ||
95 | call printdln | ||
96 | display_end: | ||
97 | ret | ||
98 | |||
87 | global _start | 99 | global _start |
88 | _start: | 100 | _start: |
89 | push NIL_VAL | 101 | push NIL_VAL |