aboutsummaryrefslogtreecommitdiffstats
path: root/src/x86_64/prelude.asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/x86_64/prelude.asm')
-rw-r--r--src/x86_64/prelude.asm125
1 files changed, 79 insertions, 46 deletions
diff --git a/src/x86_64/prelude.asm b/src/x86_64/prelude.asm
index 788b8e9..c314ba4 100644
--- a/src/x86_64/prelude.asm
+++ b/src/x86_64/prelude.asm
@@ -1,56 +1,89 @@
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
1printdln: 10printdln:
2 sub rsp, 40 11 sar rdi, FIXNUM_SHIFT
3 mov BYTE [rsp+31], 10 12 sub rsp, 40
4 test rdi, rdi 13 mov BYTE [rsp+31], 10
5 jne .L2 14 test rdi, rdi
6 mov BYTE [rsp+30], 48 15 jne .L2
7 mov eax, 30 16 mov BYTE [rsp+30], 48
8 mov r8d, 2 17 mov eax, 30
18 mov r8d, 2
9.L3: 19.L3:
10 lea rsi, [rsp+rax] 20 lea rsi, [rsp+rax]
11 mov rdx, r8 21 mov rdx, r8
12 ;; write syscall (Linux) 22 mov rdi, 1
13 mov rdi, 1 23 mov rax, 1
14 mov rax, 1 24 syscall
15 syscall 25 add rsp, 40
16 add rsp, 40 26 ret
17 ret
18.L2: 27.L2:
19 mov r10d, 1 28 mov r10d, 1
20 js .L12 29 js .L12
21.L4: 30.L4:
22 mov r8d, 1 31 mov r8d, 1
23 lea r9, [rsp+31] 32 lea r9, [rsp+31]
24 mov rsi, -3689348814741910323 33 mov rsi, -3689348814741910323
25.L5: 34.L5:
26 mov rax, rdi 35 mov rax, rdi
27 mov rcx, r9 36 mov rcx, r9
28 mul rsi 37 mul rsi
29 sub rcx, r8 38 sub rcx, r8
30 shr rdx, 3 39 shr rdx, 3
31 lea rax, [rdx+rdx*4] 40 lea rax, [rdx+rdx*4]
32 add rax, rax 41 add rax, rax
33 sub rdi, rax 42 sub rdi, rax
34 mov rax, r8 43 mov rax, r8
35 add r8, 1 44 add r8, 1
36 add edi, 48 45 add edi, 48
37 mov BYTE [rcx], dil 46 mov BYTE [rcx], dil
38 mov rdi, rdx 47 mov rdi, rdx
39 test rdx, rdx 48 test rdx, rdx
40 jne .L5 49 jne .L5
41 cmp r10d, -1 50 cmp r10d, -1
42 jne .L10 51 jne .L10
43 not r8 52 not r8
44 mov BYTE [rsp+32+r8], 45 53 mov BYTE [rsp+32+r8], 45
45 lea r8, [rax+2] 54 lea r8, [rax+2]
46.L10: 55.L10:
47 mov eax, 32 56 mov eax, 32
48 sub rax, r8 57 sub rax, r8
49 jmp .L3 58 jmp .L3
50.L12: 59.L12:
51 neg rdi 60 neg rdi
52 mov r10d, -1 61 mov r10d, -1
53 jmp .L4 62 jmp .L4
63 ret
64
65printbool:
66 shr rdi, BOOL_SHIFT
67 cmp rdi, 0
68 je print_false
69 mov rsi, true_str ; addr
70 mov rdx, 5 ; number of bytes
71 jmp bool_write
72print_false:
73 mov rsi, false_str ; addr
74 mov rdx, 6 ; number of bytes
75
76bool_write:
77 mov rax, 1
78 mov rdi, 1
79 syscall
80 ret
81
82true_str:
83 db "true", 10
84false_str:
85 db "false", 10
54 86
55global _start 87global _start
56_start: 88_start:
89 push NIL_VAL