can add numbers (integers)
This commit is contained in:
parent
10a45ff7f2
commit
9bd36905af
|
|
@ -117,30 +117,40 @@ extern dealloc
|
||||||
PLUS_STR db "+"
|
PLUS_STR db "+"
|
||||||
PLUS_STR_LEN equ $ - PLUS_STR
|
PLUS_STR_LEN equ $ - PLUS_STR
|
||||||
|
|
||||||
;; add $rdi and $rsi
|
;; sum list $rdi in env $rsi
|
||||||
p_add:
|
p_add:
|
||||||
|
sub rsp, 24
|
||||||
|
call eval_list
|
||||||
|
mov qword [rsp], rax ; evaled list
|
||||||
|
mov qword [rsp + 8], rsi ; env
|
||||||
|
mov qword [rsp + 16], 0 ; acc = 0
|
||||||
|
.add_loop:
|
||||||
|
mov rdi, qword [rsp] ; $rdi = evaled list
|
||||||
|
call get_cdr
|
||||||
|
mov qword [rsp], rax ; update list to cdr
|
||||||
|
call get_car
|
||||||
|
mov rdi, rax ; $rdi = car
|
||||||
call obj_tag_part
|
call obj_tag_part
|
||||||
cmp al, OBJ_NUM
|
cmp al, OBJ_NUM
|
||||||
jne .invalid
|
jne .invalid
|
||||||
call obj_addr_part
|
call obj_addr_part
|
||||||
mov rdx, qword [rax + 8] ; num1
|
mov rax, qword [rax + 8] ; num
|
||||||
mov rdi, rsi
|
add qword [rsp + 16], rax ; acc += num
|
||||||
call obj_tag_part
|
mov rdi, qword [rsp] ; $rdi = list
|
||||||
cmp al, OBJ_NUM
|
lea rsi, [rel nil]
|
||||||
jne .invalid
|
cmp rdi, rsi
|
||||||
call obj_addr_part
|
jne .add_loop
|
||||||
mov rax, qword [rax + 8] ; num2
|
.done:
|
||||||
add rax, rdx ; num1 + num2
|
mov rdi, 16
|
||||||
push rax
|
|
||||||
mov rdi, 16 ; struct { refcount: usize, value: i64 }
|
|
||||||
mov rsi, 8
|
mov rsi, 8
|
||||||
call alloc
|
call alloc
|
||||||
mov [rax], 1 ; refcount = 1
|
|
||||||
pop rdx
|
|
||||||
mov qword [rax + 8], rdx ; value = sum
|
|
||||||
mov rdi, rax
|
mov rdi, rax
|
||||||
|
mov dword [rdi], 1 ; refcount = 1
|
||||||
|
mov rax, qword [rsp + 16] ; acc
|
||||||
|
mov qword [rdi + 8], rax ; value = acc
|
||||||
mov rsi, OBJ_NUM
|
mov rsi, OBJ_NUM
|
||||||
call obj_set_tag
|
call obj_set_tag
|
||||||
|
add rsp, 24
|
||||||
ret
|
ret
|
||||||
.invalid:
|
.invalid:
|
||||||
xor rdi, rdi
|
xor rdi, rdi
|
||||||
|
|
@ -863,6 +873,8 @@ apply:
|
||||||
.apply_prim:
|
.apply_prim:
|
||||||
call obj_addr_part
|
call obj_addr_part
|
||||||
mov rax, qword [rax + 8] ; get the function pointer
|
mov rax, qword [rax + 8] ; get the function pointer
|
||||||
|
mov rdi, rsi ; $rdi = argument list
|
||||||
|
mov rsi, rdx ; $rsi = environment
|
||||||
jmp rax
|
jmp rax
|
||||||
.invalid_func:
|
.invalid_func:
|
||||||
xor rdi, rdi
|
xor rdi, rdi
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue