method for pushing/poping registers before calling functions
This commit is contained in:
parent
0436b23361
commit
9cb3331f60
|
|
@ -820,6 +820,95 @@ codegen_push_pop_dirtied_registers:
|
||||||
pop rbp
|
pop rbp
|
||||||
ret
|
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
|
;; rdi: ctx
|
||||||
;; rsi: &function_ctx
|
;; rsi: &function_ctx
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue