factor out num construction
This commit is contained in:
parent
f9767b9f72
commit
6eeeca1266
|
|
@ -388,20 +388,27 @@ p_eq:
|
|||
cmovz rax, [rsi + ATOM_TRUE * 8] ; if no pair is unequal, return "t", else return nil
|
||||
ret
|
||||
|
||||
make_num:
|
||||
push rdi
|
||||
mov rdi, 16
|
||||
mov rsi, 8
|
||||
call alloc
|
||||
mov dword [rax], 1 ; refcount = 1
|
||||
pop rdi
|
||||
mov qword [rax + 8], rdi ; value = number
|
||||
mov rdi, rax
|
||||
mov rsi, OBJ_NUM
|
||||
call obj_set_tag
|
||||
ret
|
||||
|
||||
;; sum list $rdi in env $rsi
|
||||
p_add:
|
||||
sub rsp, 24
|
||||
mov qword [rsp + 8], rsi ; env
|
||||
call eval_list
|
||||
mov qword [rsp], rax ; evaled list
|
||||
mov rdi, 16
|
||||
mov rsi, 8
|
||||
call alloc
|
||||
mov rdi, rax
|
||||
mov dword [rdi], 1 ; refcount = 1
|
||||
mov qword [rdi + 8], 0 ; value = 0
|
||||
mov rsi, OBJ_NUM
|
||||
call obj_set_tag
|
||||
mov rdi, 0
|
||||
call make_num
|
||||
mov rcx, rax ; acc
|
||||
mov rdi, qword [rsp] ; $rdi = evaled list
|
||||
mov rsi, qword [rsp + 8] ; $rsi = env
|
||||
|
|
@ -415,14 +422,8 @@ p_sub:
|
|||
mov qword [rsp + 8], rsi ; env
|
||||
call eval_list
|
||||
mov qword [rsp], rax ; evaled list
|
||||
mov rdi, 16
|
||||
mov rsi, 8
|
||||
call alloc
|
||||
mov rdi, rax
|
||||
mov dword [rdi], 1 ; refcount = 1
|
||||
mov qword [rdi + 8], 0 ; value = 0
|
||||
mov rsi, OBJ_NUM
|
||||
call obj_set_tag
|
||||
mov rdi, 0
|
||||
call make_num
|
||||
mov rcx, rax ; acc
|
||||
mov rdi, qword [rsp] ; $rdi = evaled list
|
||||
mov rsi, qword [rsp + 8] ; $rsi = env
|
||||
|
|
@ -436,14 +437,8 @@ p_mul:
|
|||
mov qword [rsp + 8], rsi ; env
|
||||
call eval_list
|
||||
mov qword [rsp], rax ; evaled list
|
||||
mov rdi, 16
|
||||
mov rsi, 8
|
||||
call alloc
|
||||
mov rdi, rax
|
||||
mov dword [rdi], 1 ; refcount = 1
|
||||
mov qword [rdi + 8], 1 ; value = 1
|
||||
mov rsi, OBJ_NUM
|
||||
call obj_set_tag
|
||||
mov rdi, 1
|
||||
call make_num
|
||||
mov rcx, rax ; acc
|
||||
mov rdi, qword [rsp] ; $rdi = evaled list
|
||||
mov rsi, qword [rsp + 8] ; $rsi = env
|
||||
|
|
@ -479,17 +474,13 @@ p_rem:
|
|||
p_car:
|
||||
call eval_list
|
||||
mov rdi, rax
|
||||
call get_car
|
||||
mov rdi, rax
|
||||
call get_car
|
||||
call get_caar
|
||||
ret
|
||||
|
||||
p_cdr:
|
||||
call eval_list
|
||||
mov rdi, rax
|
||||
call get_car
|
||||
mov rdi, rax
|
||||
call get_cdr
|
||||
call get_cadr
|
||||
ret
|
||||
|
||||
p_not:
|
||||
|
|
@ -608,9 +599,7 @@ p_let_star_inner:
|
|||
mov qword [rsp], rdi ; acc-env
|
||||
mov qword [rsp + 8], rsi ; (var val)
|
||||
mov rdi, rsi
|
||||
call get_cdr
|
||||
mov rdi, rax
|
||||
call get_car
|
||||
call get_cdar
|
||||
mov rdi, rax
|
||||
mov rsi, qword [rsp] ; acc-env
|
||||
call eval
|
||||
|
|
@ -630,9 +619,7 @@ p_let:
|
|||
sub rsp, 24
|
||||
call get_car
|
||||
mov qword [rsp], rax ; bindings
|
||||
call get_cdr
|
||||
mov rdi, rax
|
||||
call get_car
|
||||
call get_cdar
|
||||
mov qword [rsp + 8], rax ; body
|
||||
mov qword [rsp + 16], rsi ; in_env
|
||||
mov rdi, qword [rsp] ; $rdi = bindings
|
||||
|
|
@ -650,9 +637,7 @@ p_let_star:
|
|||
sub rsp, 24
|
||||
call get_car
|
||||
mov qword [rsp], rax ; bindings
|
||||
call get_cdr
|
||||
mov rdi, rax
|
||||
call get_car
|
||||
call get_cdar
|
||||
mov qword [rsp + 8], rax ; body
|
||||
mov qword [rsp + 16], rsi ; in_env
|
||||
mov rdi, qword [rsp] ; $rdi = bindings
|
||||
|
|
@ -700,6 +685,8 @@ p_str_concat:
|
|||
p_str_append:
|
||||
;; return the nth element of a string
|
||||
p_str_nth:
|
||||
;; sets the nth element of a string to a char
|
||||
p_set_nth:
|
||||
;; returns a new string that is a substring from a a+b of the input string
|
||||
;; (substr "hello world" 0 5) -> "hello"
|
||||
p_str_substr:
|
||||
|
|
|
|||
Loading…
Reference in a new issue