can add numbers (integers)

This commit is contained in:
janis 2026-06-09 01:03:51 +02:00
parent 10a45ff7f2
commit 9bd36905af
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8

View file

@ -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