init stack vec, push rplogue
This commit is contained in:
parent
e3e0d6843f
commit
d793a3251f
|
|
@ -5,6 +5,7 @@ default rel
|
||||||
extern panic
|
extern panic
|
||||||
extern vec_extend
|
extern vec_extend
|
||||||
extern vec_get
|
extern vec_get
|
||||||
|
extern vec_init_with
|
||||||
|
|
||||||
global codegen_function
|
global codegen_function
|
||||||
|
|
||||||
|
|
@ -17,8 +18,37 @@ section .rdata
|
||||||
COLON_NL_LEN equ $ - COLON_NL
|
COLON_NL_LEN equ $ - COLON_NL
|
||||||
RET_NL db "ret", 10
|
RET_NL db "ret", 10
|
||||||
RET_NL_LEN equ $ - RET_NL
|
RET_NL_LEN equ $ - RET_NL
|
||||||
|
PROLOGUE db "push rbp", 10, "mov rbp, rsp", 10
|
||||||
|
PROLOGUE_LEN equ $ - PROLOGUE
|
||||||
|
|
||||||
section .text
|
section .text
|
||||||
|
|
||||||
|
|
||||||
|
;; rdi: ctx
|
||||||
|
;; rsi: a: *const (index, offset)
|
||||||
|
;; rdx: b: *const (index, offset)
|
||||||
|
;; define-fn: fn stackvar_cmp(a: *const (u64, u64), b: *const (u64, u64)) -> i32
|
||||||
|
stackvar_cmp:
|
||||||
|
push rbp
|
||||||
|
mov rbp, rsp
|
||||||
|
|
||||||
|
mov rax, [rdi + 0] ; a.index
|
||||||
|
mov rcx, [rsi + 0] ; b.index
|
||||||
|
cmp rax, 0
|
||||||
|
jl .less
|
||||||
|
jg .greater
|
||||||
|
xor rax, rax
|
||||||
|
jmp .done
|
||||||
|
.less:
|
||||||
|
mov rax, -1
|
||||||
|
jmp .done
|
||||||
|
.greater:
|
||||||
|
mov rax, 1
|
||||||
|
|
||||||
|
.done:
|
||||||
|
pop rbp
|
||||||
|
ret
|
||||||
|
|
||||||
;; start-structs
|
;; start-structs
|
||||||
;; struct CodegenCtx {
|
;; struct CodegenCtx {
|
||||||
;; ast: *const Ast,
|
;; ast: *const Ast,
|
||||||
|
|
@ -45,9 +75,16 @@ codegen_function:
|
||||||
mov rax, [rdi]
|
mov rax, [rdi]
|
||||||
mov [rsp + 8], rax ; ast
|
mov [rsp + 8], rax ; ast
|
||||||
mov [rsp + 16], rsi ; func_idx
|
mov [rsp + 16], rsi ; func_idx
|
||||||
|
mov [rsp + 24], 0 ; current_stack_size = 0
|
||||||
|
|
||||||
bts qword [rsp + 72], 7 ; mark rbp as used
|
lea rdi, [rsp + 32] ; stack-vars
|
||||||
bts qword [rsp + 72], 6 ; mark rsp as used
|
mov rsi, 16 ; size_of::<(u64, u64)>
|
||||||
|
mov rdx, 0 ; drop = None
|
||||||
|
mov rcx, 16 ; initial capacity
|
||||||
|
call vec_init_with
|
||||||
|
|
||||||
|
bts qword [rsp + 72], 7 ; mark rbp as used
|
||||||
|
bts qword [rsp + 72], 6 ; mark rsp as used
|
||||||
|
|
||||||
; push "section .text\n"
|
; push "section .text\n"
|
||||||
mov rdi, [rsp] ; ctx
|
mov rdi, [rsp] ; ctx
|
||||||
|
|
@ -94,7 +131,13 @@ codegen_function:
|
||||||
lea rsi, [rel COLON_NL]
|
lea rsi, [rel COLON_NL]
|
||||||
mov rdx, 2
|
mov rdx, 2
|
||||||
call vec_extend
|
call vec_extend
|
||||||
|
|
||||||
|
; push prologue
|
||||||
|
mov rdi, [rsp] ; ctx
|
||||||
|
lea rdi, [rdi + 8] ; &ctx.text
|
||||||
|
lea rsi, [rel PROLOGUE]
|
||||||
|
mov rdx, PROLOGUE_LEN
|
||||||
|
call vec_extend
|
||||||
|
|
||||||
; TODO: generate function body
|
; TODO: generate function body
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue