1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
section .text
printdln:
sar rdi, FIXNUM_SHIFT
sub rsp, 40
mov BYTE [rsp+31], 10
test rdi, rdi
jne .L2
mov BYTE [rsp+30], 48
mov eax, 30
mov r8d, 2
.L3:
lea rsi, [rsp+rax]
mov rdx, r8
mov rdi, 1
mov rax, 1
syscall
add rsp, 40
ret
.L2:
mov r10d, 1
js .L12
.L4:
mov r8d, 1
lea r9, [rsp+31]
mov rsi, -3689348814741910323
.L5:
mov rax, rdi
mov rcx, r9
mul rsi
sub rcx, r8
shr rdx, 3
lea rax, [rdx+rdx*4]
add rax, rax
sub rdi, rax
mov rax, r8
add r8, 1
add edi, 48
mov BYTE [rcx], dil
mov rdi, rdx
test rdx, rdx
jne .L5
cmp r10d, -1
jne .L10
not r8
mov BYTE [rsp+32+r8], 45
lea r8, [rax+2]
.L10:
mov eax, 32
sub rax, r8
jmp .L3
.L12:
neg rdi
mov r10d, -1
jmp .L4
ret
printbool:
shr rdi, BOOL_SHIFT
cmp rdi, 0
je print_false
mov rsi, true_str ; addr
mov rdx, 5 ; number of bytes
jmp bool_write
print_false:
mov rsi, false_str ; addr
mov rdx, 6 ; number of bytes
bool_write:
mov rax, 1
mov rdi, 1
syscall
ret
printstring:
mov rsi, rdi
mov rax, PTR_MASK
and rsi, rax
mov rdx, [rsi]
add rsi, 8
mov rax, 1
mov rdi, 1
syscall
ret
printlambda:
mov rsi, lambda_str
mov rdx, [rsi]
add rsi, 8
mov rax, 1
mov rdi, 1
syscall
ret
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 string?
mov rax, rdi
and rax, STRING_MASK
cmp rax, STRING_TAG
jne not_string
call printstring
ret
not_string:
;; is lambda?
mov rax, rdi
and rax, LAMBDA_MASK
cmp rax, LAMBDA_TAG
jne not_lambda
call printlambda
ret
not_lambda:
;; is fixnum?
mov rax, rdi
and rax, FIXNUM_MASK
cmp rax, FIXNUM_TAG
jne display_end
call printdln
display_end:
ret
|