change move_dst_src to call itself and use rax as a scratch register rather than xchging because immediate values

This commit is contained in:
janis 2025-11-01 17:51:46 +01:00
parent 703aa299c8
commit 0be7ffba5a
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8

View file

@ -1307,52 +1307,28 @@ codegen_move_dst_src:
je .panic ; address can only be moved to full-sized destinations
cmp byte [rsi + 0], OPERAND_REGISTER
je .do_move
je .do_move ; if dst == register, do move
; If dst != register and src != register, we cannot move directly into memory:
; there is no MOV m64, m64 or MOV m64, imm64 instruction.
; A smarter compiler could test for the immediate size and move most
; immediates directly into memory, but we are quite stupid!
cmp byte [rdx + 0], OPERAND_REGISTER
jne .xchg_rax ; if dst != register and src != register, xchg via rax
jne .xchg_rax
jmp .do_move
.xchg_rax:
; xchg rax, [src]
; mov rax, [src]
; mov [dst], rax
; xchg rax, [src]
mov rdi, [rsp] ; *text
lea rsi, [rel XCHG_RAX]
mov rdx, XCHG_RAX_LEN
call vec_extend
lea rsi, [rel OPERAND_RAX]
mov rdx, [rsp + 16] ; src
call codegen_move_dst_src
mov rdi, [rsp] ; *text
mov rsi, [rsp + 16] ; src
call codegen_write_operand
mov rdi, [rsp] ; *text
lea rsi, [rel COMMA_RAX]
mov rdx, COMMA_RAX_LEN
call vec_extend
mov rdi, [rsp] ; *text
lea rsi, [rel MOV_RAX_COMMA]
mov rdx, 4
call vec_extend
mov rdi, [rsp] ; *text
mov rsi, [rsp + 8] ; dst
call codegen_write_operand
mov rdi, [rsp] ; *text
lea rsi, [rel COMMA_RAX]
mov rdx, COMMA_RAX_LEN
call vec_extend
mov rdi, [rsp] ; *text
lea rsi, [rel XCHG_RAX]
mov rdx, XCHG_RAX_LEN
call vec_extend
mov rdi, [rsp] ; *text
mov rsi, [rsp + 16] ; src
call codegen_write_operand
mov rsi, [rsp + 8] ; src
lea rdx, [rel OPERAND_RAX]
call codegen_move_dst_src
jmp .epilogue
.do_move:
@ -1374,12 +1350,12 @@ codegen_move_dst_src:
mov rsi, [rsp + 16] ; src
call codegen_write_operand
.epilogue:
mov rdi, [rsp] ; *text
lea rsi, [rel COLON_NL]
inc rsi
mov rdx, 1
call vec_extend
call vec_push
.epilogue:
add rsp, 24
pop rbx