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:
parent
703aa299c8
commit
0be7ffba5a
|
|
@ -1307,52 +1307,28 @@ codegen_move_dst_src:
|
||||||
je .panic ; address can only be moved to full-sized destinations
|
je .panic ; address can only be moved to full-sized destinations
|
||||||
|
|
||||||
cmp byte [rsi + 0], OPERAND_REGISTER
|
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
|
cmp byte [rdx + 0], OPERAND_REGISTER
|
||||||
jne .xchg_rax ; if dst != register and src != register, xchg via rax
|
jne .xchg_rax
|
||||||
jmp .do_move
|
jmp .do_move
|
||||||
|
|
||||||
.xchg_rax:
|
.xchg_rax:
|
||||||
; xchg rax, [src]
|
; mov rax, [src]
|
||||||
; mov [dst], rax
|
; mov [dst], rax
|
||||||
; xchg rax, [src]
|
|
||||||
|
|
||||||
mov rdi, [rsp] ; *text
|
mov rdi, [rsp] ; *text
|
||||||
lea rsi, [rel XCHG_RAX]
|
lea rsi, [rel OPERAND_RAX]
|
||||||
mov rdx, XCHG_RAX_LEN
|
mov rdx, [rsp + 16] ; src
|
||||||
call vec_extend
|
call codegen_move_dst_src
|
||||||
|
|
||||||
mov rdi, [rsp] ; *text
|
mov rdi, [rsp] ; *text
|
||||||
mov rsi, [rsp + 16] ; src
|
mov rsi, [rsp + 8] ; src
|
||||||
call codegen_write_operand
|
lea rdx, [rel OPERAND_RAX]
|
||||||
|
call codegen_move_dst_src
|
||||||
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
|
|
||||||
jmp .epilogue
|
jmp .epilogue
|
||||||
|
|
||||||
.do_move:
|
.do_move:
|
||||||
|
|
@ -1374,12 +1350,12 @@ codegen_move_dst_src:
|
||||||
mov rsi, [rsp + 16] ; src
|
mov rsi, [rsp + 16] ; src
|
||||||
call codegen_write_operand
|
call codegen_write_operand
|
||||||
|
|
||||||
.epilogue:
|
|
||||||
mov rdi, [rsp] ; *text
|
mov rdi, [rsp] ; *text
|
||||||
lea rsi, [rel COLON_NL]
|
lea rsi, [rel COLON_NL]
|
||||||
inc rsi
|
inc rsi
|
||||||
mov rdx, 1
|
call vec_push
|
||||||
call vec_extend
|
|
||||||
|
.epilogue:
|
||||||
|
|
||||||
add rsp, 24
|
add rsp, 24
|
||||||
pop rbx
|
pop rbx
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue