From d793a3251f84fc0e4aa26fe309b449357a580550 Mon Sep 17 00:00:00 2001 From: janis Date: Fri, 31 Oct 2025 16:11:33 +0100 Subject: [PATCH] init stack vec, push rplogue --- lang/src/codegen.asm | 49 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/lang/src/codegen.asm b/lang/src/codegen.asm index bd6e401..6c9d9d8 100644 --- a/lang/src/codegen.asm +++ b/lang/src/codegen.asm @@ -5,6 +5,7 @@ default rel extern panic extern vec_extend extern vec_get +extern vec_init_with global codegen_function @@ -17,8 +18,37 @@ section .rdata COLON_NL_LEN equ $ - COLON_NL RET_NL db "ret", 10 RET_NL_LEN equ $ - RET_NL + PROLOGUE db "push rbp", 10, "mov rbp, rsp", 10 + PROLOGUE_LEN equ $ - PROLOGUE section .text + + +;; rdi: ctx +;; rsi: a: *const (index, offset) +;; rdx: b: *const (index, offset) +;; define-fn: fn stackvar_cmp(a: *const (u64, u64), b: *const (u64, u64)) -> i32 +stackvar_cmp: + push rbp + mov rbp, rsp + + mov rax, [rdi + 0] ; a.index + mov rcx, [rsi + 0] ; b.index + cmp rax, 0 + jl .less + jg .greater + xor rax, rax + jmp .done +.less: + mov rax, -1 + jmp .done +.greater: + mov rax, 1 + +.done: + pop rbp + ret + ;; start-structs ;; struct CodegenCtx { ;; ast: *const Ast, @@ -45,9 +75,16 @@ codegen_function: mov rax, [rdi] mov [rsp + 8], rax ; ast mov [rsp + 16], rsi ; func_idx + mov [rsp + 24], 0 ; current_stack_size = 0 - bts qword [rsp + 72], 7 ; mark rbp as used - bts qword [rsp + 72], 6 ; mark rsp as used + lea rdi, [rsp + 32] ; stack-vars + mov rsi, 16 ; size_of::<(u64, u64)> + mov rdx, 0 ; drop = None + mov rcx, 16 ; initial capacity + call vec_init_with + + bts qword [rsp + 72], 7 ; mark rbp as used + bts qword [rsp + 72], 6 ; mark rsp as used ; push "section .text\n" mov rdi, [rsp] ; ctx @@ -94,7 +131,13 @@ codegen_function: lea rsi, [rel COLON_NL] mov rdx, 2 call vec_extend - + + ; push prologue + mov rdi, [rsp] ; ctx + lea rdi, [rdi + 8] ; &ctx.text + lea rsi, [rel PROLOGUE] + mov rdx, PROLOGUE_LEN + call vec_extend ; TODO: generate function body