diff options
Diffstat (limited to 'src/x86_64/prelude.asm')
-rw-r--r-- | src/x86_64/prelude.asm | 30 |
1 files changed, 21 insertions, 9 deletions
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 |