method for pushing/poping registers before calling functions

This commit is contained in:
janis 2025-11-01 18:24:37 +01:00
parent 0436b23361
commit 9cb3331f60
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8

View file

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