From 9cb3331f6086df6edcaafb0f27292b4dfea8f04c Mon Sep 17 00:00:00 2001 From: janis Date: Sat, 1 Nov 2025 18:24:37 +0100 Subject: [PATCH] method for pushing/poping registers before calling functions --- lang/src/codegen.asm | 89 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/lang/src/codegen.asm b/lang/src/codegen.asm index 0f507d0..58c40fb 100644 --- a/lang/src/codegen.asm +++ b/lang/src/codegen.asm @@ -820,6 +820,95 @@ codegen_push_pop_dirtied_registers: pop rbp ret +;; rdi: *text +;; rsi: &function_ctx +;; rdx: pop: bool +;; Returns the number of registers pushed/popped in rax +;; define-fn: fn codegen_push_pop_used_registers(text: *mut Vec, function_ctx: &FunctionCtx, pop: bool) -> u8 +codegen_push_pop_used_registers: + push rbp + mov rbp, rsp + push rbx + push r15 + push r14 + push r13 + + sub rsp, 32 + mov [rsp], rdi + mov [rsp + 8], rsi + + mov byte [rsp + 29 + 3], 10 ; newline + mov qword [rsp + 16], -1 + mov rax, 'push ' + mov qword [rsp + 24], rax + test rdx, rdx + jz .skip_setup_pop + mov rax, 'pop ' + mov qword [rsp + 24], rax + + mov rdi, [rsp] ; text + mov rax, [rdi + 8] ; text.len() + mov [rsp + 16], rax +.skip_setup_pop: + + ; volatile registers: + ; abcdsdpp_89abcdef + ; 00111100_11110000b0 + ; additionally, rax is never preserved by this compiler + mov bx, word [rsi + 48 + 4] ; dirtied_register_bitset + mov ax, 0b00001111_00111100 + and bx, ax + test bx, bx + jz .done + + mov r15, 16 + xor r14, r14 + xor r13, r13 ; num_regs pushed/popped +.reg_loop: + cmp r14, r15 + jge .done + bt bx, r14w + jnc .next_reg + + inc r13 ; num_regs += 1 + + mov rdi, r14 + mov rsi, 8 + lea rdx, [rsp + 29] + call get_register_name + + mov rax, -1 + cmp [rsp + 16], rax + jne .reg_pop + + mov rdi, [rsp] ; text + lea rsi, [rsp + 24] + mov rdx, 9 + call vec_extend + jmp .next_reg +.reg_pop: + + mov rdi, [rsp] ; text + mov rsi, [rsp + 16] ; text.len() + lea rdx, [rsp + 24] + mov rcx, 9 + call vec_insert_many + nop + +.next_reg: + inc r14 + jmp .reg_loop + +.done: + add rsp, 32 + mov rax, r13 + pop r13 + pop r14 + pop r15 + pop rbx + pop rbp + ret + ;; rdi: ctx ;; rsi: &function_ctx