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
|
||||
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
|
||||
|
|
|
|||
Loading…
Reference in a new issue