can do very cool stuff!

This commit is contained in:
janis 2025-11-03 16:35:46 +01:00
parent 52cfc7dc54
commit 07eeed7cff
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8
2 changed files with 53 additions and 35 deletions

View file

@ -1310,7 +1310,6 @@ codegen_expr:
jmp .done jmp .done
.gen_op: .gen_op:
mov rdi, [rsp + 8] ; &function_ctx mov rdi, [rsp + 8] ; &function_ctx
mov rsi, [rsp] ; ctx mov rsi, [rsp] ; ctx
lea rsi, [rsi + 8] ; &ctx.text lea rsi, [rsi + 8] ; &ctx.text
@ -1844,25 +1843,40 @@ codegen_binary_op_rm64_rm64:
push rbx push rbx
; dst [32..48] ; dst [32..48]
sub rsp, 48 sub rsp, 56
mov [rsp], rdi ; *function_ctx mov [rsp], rdi ; *function_ctx
mov [rsp + 8], rsi ; *text mov [rsp + 8], rsi ; *text
mov [rsp + 16], rdx ; lhs mov [rsp + 16], rdx ; lhs
mov [rsp + 24], rcx ; rhs mov [rsp + 24], rcx ; rhs
mov [rsp + 32], r8 ; op mov [rsp + 32], r8 ; op
; if lhs.kind == REGISTER || lhs.kind < ADDRESS && rhs.kind == REGISTER { ; match (lhs.kind, rhs.kind) {
cmp byte [rdx + 0], OPERAND_REGISTER cmp byte [rdx + 0], OPERAND_REGISTER
je .simple sete al
cmp byte [rcx + 0], OPERAND_RBP_PVALUE
setb bl
test al, bl
jnz .simple
; (REGISTER, kind < RBP_PVALUE) => simple
cmp byte [rdx + 0], OPERAND_RBP_PVALUE cmp byte [rdx + 0], OPERAND_RBP_PVALUE
setb al setb al
cmp byte [rcx + 0], OPERAND_REGISTER cmp byte [rcx + 0], OPERAND_REGISTER
sete bl sete bl
test al, bl test al, bl
jne .simple jnz .simple
jmp .complex ; (kind < RBP_PVALUE, REGISTER) => simple
test al, al
jnz .rax_lhs
; (kind < RBP_PVALUE, _) => rax_lhs
cmp byte [rdx + 0], OPERAND_RBP_PVALUE
jb .rax_rhs
; (_, kind < RBP_PVALUE) => rax_rhs
jmp .rax_dst
; (_, _) => rax_dst
; }
.simple: .simple:
; op lhs, rhs ; { op lhs, rhs; lhs }
lea rdi, [rsp + 32] ; op lea rdi, [rsp + 32] ; op
call strlen call strlen
mov rdi, [rsp + 8] ; *text mov rdi, [rsp + 8] ; *text
@ -1898,11 +1912,9 @@ codegen_binary_op_rm64_rm64:
mov rax, [rbx] mov rax, [rbx]
mov rdx, [rbx + 8] mov rdx, [rbx + 8]
jmp .epilogue jmp .epilogue
; } else {
.complex: .rax_lhs:
; if lhs.kind < RBP_PVALUE { ; { mov rax, rhs; op lhs, rax; lhs }
cmp byte [rdx + 0], OPERAND_RBP_PVALUE
jae .check_rhs
; mov rax, rhs ; mov rax, rhs
mov rdi, [rsp + 8] ; *text mov rdi, [rsp + 8] ; *text
@ -1928,14 +1940,13 @@ codegen_binary_op_rm64_rm64:
mov rdx, [rbx + 8] mov rdx, [rbx + 8]
jmp .epilogue jmp .epilogue
.check_rhs: .rax_rhs:
; } else if rhs.kind < RBP_PVALUE { ; { mov rax, lhs; op rax, rhs; mov rhs, rax; rhs }
cmp byte [rcx + 0], OPERAND_RBP_PVALUE
jae .allocate_dst
; mov rax, lhs ; mov rax, lhs
mov rdi, [rsp + 8] ; *text mov rdi, [rsp + 8] ; *text
lea rsi, [rel OPERAND_RAX] lea rsi, [rel OPERAND_RAX]
mov rdx, [rsp + 16] ; lhs mov rdx, [rsp + 16] ; rhs
call codegen_move_dst_src call codegen_move_dst_src
; op rax, rhs ; op rax, rhs
@ -1945,15 +1956,9 @@ codegen_binary_op_rm64_rm64:
mov rcx, [rsp + 32] ; op mov rcx, [rsp + 32] ; op
call codegen_binary_op_unchecked call codegen_binary_op_unchecked
; mov rhs, rax
mov rdi, [rsp + 8] ; *text
mov rsi, [rsp + 24] ; rhs
lea rdx, [rel OPERAND_RAX]
call codegen_move_dst_src
; free lhs ; free lhs
mov rdi, [rsp] ; *function_ctx mov rdi, [rsp] ; *function_ctx
mov rsi, [rsp + 16] ; rhs mov rsi, [rsp + 16] ; lhs
call codegen_free_operand call codegen_free_operand
; ret rhs ; ret rhs
@ -1961,18 +1966,20 @@ codegen_binary_op_rm64_rm64:
mov rax, [rbx] mov rax, [rbx]
mov rdx, [rbx + 8] mov rdx, [rbx + 8]
jmp .epilogue jmp .epilogue
; } else {
.allocate_dst: .rax_dst:
; { dst = allocate_value; mov dst, lhs; mov rax, rhs; op dst, rax; dst }
; dst = allocate_value ; dst = allocate_value
mov rdi, [rsp] ; *function_ctx mov rdi, [rsp] ; *function_ctx
mov rsi, 8 ; width = 8 mov rsi, 8 ; width = 8
call codegen_allocate_value call codegen_allocate_value
mov [rsp + 32], rax ; dst mov [rsp + 40], rax ; dst
mov [rsp + 40], rdx mov [rsp + 48], rdx
; mov dst, lhs ; mov dst, lhs
mov rdi, [rsp + 8] ; *text mov rdi, [rsp + 8] ; *text
lea rsi, [rsp + 32] ; dst lea rsi, [rsp + 40] ; dst
mov rdx, [rsp + 16] ; lhs mov rdx, [rsp + 16] ; lhs
call codegen_move_dst_src call codegen_move_dst_src
@ -1984,18 +1991,29 @@ codegen_binary_op_rm64_rm64:
; op dst, rax ; op dst, rax
mov rdi, [rsp + 8] ; *text mov rdi, [rsp + 8] ; *text
lea rsi, [rsp + 32] ; dst lea rsi, [rsp + 40] ; dst
lea rdx, [rel OPERAND_RAX] ; rax lea rdx, [rel OPERAND_RAX] ; rax
mov rcx, [rsp + 32] ; op mov rcx, [rsp + 32] ; op
call codegen_binary_op_unchecked call codegen_binary_op_unchecked
; free rhs
mov rdi, [rsp] ; *function_ctx
mov rsi, [rsp + 24] ; lhs
call codegen_free_operand
; free lhs
mov rdi, [rsp] ; *function_ctx
mov rsi, [rsp + 16] ; lhs
call codegen_free_operand
; ret dst ; ret dst
mov rax, [rsp + 32] ; dst mov rax, [rsp + 32] ; dst
mov rdx, [rsp + 40] mov rdx, [rsp + 40]
; } ; }
.epilogue: .epilogue:
add rsp, 48 add rsp, 56
pop rbx pop rbx
pop rbp pop rbp
ret ret

View file

@ -93,7 +93,7 @@ fn main() {
print_ast( print_ast(
b"fn main(a: u32) -> void { b"fn main(a: u32) -> void {
return 2 * 3 + 4 * 5 + a; return 5 + &a;
}", }",
|ast| unsafe { parse_func(ast) }, |ast| unsafe { parse_func(ast) },
); );