lang/src/lexer/lex_func.s
2025-05-12 10:10:23 +02:00

186 lines
3.2 KiB
ArmAsm

%include "./src/inc/lexer.s"
%include "./src/inc/expression.s"
%include "./src/inc/function_table.s"
%include "./src/inc/token.s"
%define FUNC_ERR "[FUNC_ERROR]"
section .data
err_func_args_message: db FUNC_ERR, "invalid argument", 0
extern func_call
extern func_call_prologue
extern func_call_epilogue
extern REG_RDI
section .text
global lex_func_call
extern ftable
extern strcmp
extern lex_eundefined
extern putstr
extern putendl
extern putnumberendl
extern exit
extern look_up_var
extern insert_mov
extern load_var_reg
extern load_const_reg
insert_func_with_const: ; (rdi: name*, rsi: arg*)
push rbp
mov rbp, rsp
sub rsp, 16
mov [rbp - 8], rdi ; store name
mov [rbp - 16], rsi ; store arg
mov rdi, func_call_prologue
call putendl
mov rdi, [rbp - 16]
mov rsi, REG_RDI
call load_const_reg
mov rdi, func_call
call putstr
mov rdi, [rbp - 8]
call putendl
mov rdi, func_call_epilogue
call putendl
mov rsp, rbp
pop rbp
ret
insert_func_with_var: ; (rdi: name*, rsi: arg*)
push rbp
mov rbp, rsp
sub rsp, 16
mov [rbp - 8], rdi ; store name
mov [rbp - 16], rsi ; store arg
mov rdi, func_call_prologue
call putendl
mov rdi, [rbp - 16]
mov rsi, REG_RDI
call load_var_reg
mov rdi, func_call
call putstr
mov rdi, [rbp - 8]
call putendl
mov rdi, func_call_epilogue
call putendl
mov rsp, rbp
pop rbp
ret
err_func_args:
mov rdi, err_func_args_message
call putendl
mov rdi, 1
call exit
; does not change rdi
global look_up_func
look_up_func: ; (rdi: name*)
push rbx
mov rbx, FTABLE_COUNT
xor rcx, rcx
.search_func:
cmp rcx, rbx
je .done_false
; rdi still contains name
push rcx
mov rax, FTABLE_SYM
inc rcx
imul rax, rcx
mov rsi, [ftable + rax]
call strcmp
test rax, rax
pop rcx
jz .done_true
inc rcx
jmp .search_func
.done_true:
mov rax, 1
jmp .done
.done_false:
xor rax, rax
.done:
pop rbx
ret
lex_func_call: ; rax: bool (rdi :lex *)
push rbp
mov rbp, rsp
sub rsp, 32
mov [rbp - 8], rdi ; store lex
; store expression based on lexer expression index
mov rsi, [rdi + LEX_EXPR]
mov rax, [rdi + LEX_EXPR_IDX]
imul rax, EXPR_SIZE
lea rsi, [rsi + rax]
mov [rbp - 16], rsi
mov rdi, [rsi + EXPR_TOK_CNT]
mov rax, [rsi + EXPR_TOK]
cmp qword [rax + TOK_TYPE], TOK_FUNC
jne .done
cmp rdi, 2
jne err_func_args
mov rdi, [rax + TOK_VALUE]
push rdi
call look_up_func
test rax, rax
pop rdi
jz lex_eundefined
mov [rbp - 24], rdi
mov rdi, [rbp - 16]
mov rsi, [rdi + EXPR_TOK]
lea rsi, [rsi + SIZE_TOK]
cmp qword [rsi + TOK_TYPE], TOK_CONST
je .arg_const
cmp qword [rsi + TOK_TYPE], TOK_VAR
je .arg_var
call err_func_args
.arg_const:
mov rdi, [rbp - 24]
mov rsi, [rsi + TOK_VALUE]
call insert_func_with_const
jmp .done
.arg_var:
mov rdi, [rbp - 8]
mov rsi, [rsi + TOK_VALUE]
call look_up_var
mov rsi, rax
mov rdi, [rbp - 24]
call insert_func_with_var
.done:
mov rsp, rbp
pop rbp
ret