var decl/ varref codegen
This commit is contained in:
parent
6ebc6afb2b
commit
6dff42cfa5
|
|
@ -8,6 +8,7 @@ extern vec_extend
|
||||||
extern vec_get
|
extern vec_get
|
||||||
extern vec_push
|
extern vec_push
|
||||||
extern vec_insert_sorted
|
extern vec_insert_sorted
|
||||||
|
extern vec_binary_search_by
|
||||||
extern vec_insert_many
|
extern vec_insert_many
|
||||||
extern vec_init_with
|
extern vec_init_with
|
||||||
extern int_to_str2
|
extern int_to_str2
|
||||||
|
|
@ -969,6 +970,7 @@ codegen_expr:
|
||||||
sub rsp, 80
|
sub rsp, 80
|
||||||
mov [rsp], rdi ; ctx
|
mov [rsp], rdi ; ctx
|
||||||
mov [rsp + 8], rsi ; &function_ctx
|
mov [rsp + 8], rsi ; &function_ctx
|
||||||
|
mov [rsp + 16], rdx ; expr index
|
||||||
|
|
||||||
mov rdi, [rdi] ; ast
|
mov rdi, [rdi] ; ast
|
||||||
mov rsi, rdx ; statement index
|
mov rsi, rdx ; statement index
|
||||||
|
|
@ -1241,12 +1243,13 @@ codegen_expr:
|
||||||
lea rdx, [rsp + 64] ; scratch value
|
lea rdx, [rsp + 64] ; scratch value
|
||||||
call codegen_move_dst_src
|
call codegen_move_dst_src
|
||||||
|
|
||||||
.after_unspill_rdx:
|
; free scratch
|
||||||
; free [scratch, rhs, lhs]
|
|
||||||
mov rdi, [rsp + 8] ; &function_ctx
|
mov rdi, [rsp + 8] ; &function_ctx
|
||||||
lea rsi, [rsp + 64] ; scratch value
|
lea rsi, [rsp + 64] ; scratch value
|
||||||
call codegen_free_operand
|
call codegen_free_operand
|
||||||
|
|
||||||
|
.after_unspill_rdx:
|
||||||
|
; free [rhs, lhs]
|
||||||
mov rdi, [rsp + 8] ; &function_ctx
|
mov rdi, [rsp + 8] ; &function_ctx
|
||||||
lea rsi, [rsp + 48] ; right operand
|
lea rsi, [rsp + 48] ; right operand
|
||||||
call codegen_free_operand
|
call codegen_free_operand
|
||||||
|
|
@ -1286,9 +1289,70 @@ codegen_expr:
|
||||||
jmp .done
|
jmp .done
|
||||||
|
|
||||||
.var_decl:
|
.var_decl:
|
||||||
|
; allocate place for variable
|
||||||
|
mov rdi, [rsp + 8] ; &function_ctx
|
||||||
|
mov rsi, 8 ; size_of::<u64>
|
||||||
|
call codegen_allocate_place
|
||||||
|
mov [rsp + 64], rax ; Operand
|
||||||
|
mov [rsp + 72], rdx ; Operand.value
|
||||||
|
neg rdx
|
||||||
|
mov [rsp + 24], rdx ; &(_, offset)
|
||||||
|
|
||||||
|
mov rdi, [rsp + 8] ; &function_ctx
|
||||||
|
lea rdi, [rsp + 8] ; stack_vars
|
||||||
|
lea rsi, [rsp + 16] ; &(index, offset)
|
||||||
|
mov rdx, stackvar_cmp
|
||||||
|
mov rcx, 0
|
||||||
|
call vec_insert_sorted
|
||||||
|
|
||||||
|
mov rax, [rsp + 64] ; Operand
|
||||||
|
mov rdx, [rsp + 72] ; Operand.value
|
||||||
|
jmp .done
|
||||||
|
|
||||||
.var_ref:
|
.var_ref:
|
||||||
.assignment:
|
mov rax, [rax + 8] ; AstNode.data
|
||||||
|
mov rax, [rax] ; variable index
|
||||||
|
|
||||||
|
mov [rsp + 16], rax
|
||||||
|
mov qword [rsp + 24], 0
|
||||||
|
; lookup variable in stack_vars
|
||||||
|
|
||||||
|
mov rdi, [rsp + 8] ; &function_ctx
|
||||||
|
lea rdi, [rdi + 8] ; stack_vars
|
||||||
|
lea rsi, [rsp + 16] ; &(index, offset)
|
||||||
|
mov rdx, stackvar_cmp
|
||||||
|
mov rcx, 0
|
||||||
|
call vec_binary_search_by
|
||||||
|
cmp rdx, 1
|
||||||
|
je .panic ; variable not found
|
||||||
|
|
||||||
|
mov rdi, [rsp + 8] ; &function_ctx
|
||||||
|
lea rdi, [rdi + 8] ; stack_vars
|
||||||
|
mov rsi, rax ; index
|
||||||
|
call vec_get
|
||||||
|
mov rdx, [rax + 8] ; offset
|
||||||
|
neg rdx
|
||||||
|
mov rax, qword [rel OPERAND_RBP_OFFSET]
|
||||||
|
mov [rsp + 16], rax
|
||||||
|
mov [rsp + 24], rdx
|
||||||
|
|
||||||
|
; allocate value (?)
|
||||||
|
mov rdi, [rsp + 8] ; &function_ctx
|
||||||
|
mov rsi, 8 ; width = size_of::<* const()>
|
||||||
|
call codegen_allocate_value
|
||||||
|
mov [rsp + 32], rax ; dst
|
||||||
|
mov [rsp + 40], rdx
|
||||||
|
|
||||||
|
; lea dst, [rbp - offset]
|
||||||
|
mov rdi, [rsp] ; ctx
|
||||||
|
lea rsi, [rdi + 8] ; &ctx.text
|
||||||
|
mov rdi, [rsp + 8] ; &function_ctx
|
||||||
|
lea rdx, [rsp + 32] ; dst
|
||||||
|
lea rcx, [rsp + 16] ; src
|
||||||
|
mov r8, 'lea '
|
||||||
|
call codegen_binary_op_rm64_rm64
|
||||||
.place_to_value:
|
.place_to_value:
|
||||||
|
.assignment:
|
||||||
.value_to_place:
|
.value_to_place:
|
||||||
.deref:
|
.deref:
|
||||||
.address_of:
|
.address_of:
|
||||||
|
|
@ -1875,4 +1939,7 @@ section .rdata
|
||||||
; Operand { kind: REGISTER, register: 0, width: 8, len: 0, padding: 0, value: 0 }
|
; Operand { kind: REGISTER, register: 0, width: 8, len: 0, padding: 0, value: 0 }
|
||||||
align 8
|
align 8
|
||||||
OPERAND_RAX dq 0x0000_8001, 0
|
OPERAND_RAX dq 0x0000_8001, 0
|
||||||
|
align 8
|
||||||
OPERAND_RDX dq 0x0000_8301, 0
|
OPERAND_RDX dq 0x0000_8301, 0
|
||||||
|
align 8
|
||||||
|
OPERAND_RBP_OFFSET dq 0x0000_8002, 0
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue