115 lines
2.8 KiB
NASM
115 lines
2.8 KiB
NASM
default rel
|
|
|
|
%include "src/ast.inc"
|
|
|
|
extern panic
|
|
extern vec_extend
|
|
extern vec_get
|
|
|
|
global codegen_function
|
|
|
|
section .rdata
|
|
SECTION_TEXT db "section .text", 10
|
|
SECTION_TEXT_LEN equ $ - SECTION_TEXT
|
|
GLOBAL_ db "global "
|
|
GLOBAL_LEN equ $ - GLOBAL_
|
|
COLON_NL db ":", 10
|
|
COLON_NL_LEN equ $ - COLON_NL
|
|
RET_NL db "ret", 10
|
|
RET_NL_LEN equ $ - RET_NL
|
|
|
|
section .text
|
|
;; start-structs
|
|
;; struct CodegenCtx {
|
|
;; ast: *const Ast,
|
|
;; text: Vec<u8>,
|
|
;; }
|
|
;; end-structs
|
|
|
|
;; rdi: *Ctx
|
|
;; rsi: function index
|
|
;; define-fn: fn codegen_function(ast: *const CodegenCtx, func_idx: u64) -> ()
|
|
codegen_function:
|
|
push rbp
|
|
mov rbp, rsp
|
|
push rbx
|
|
|
|
; register-bitset [72..88] [a,b,c,d,di,si,sp,bp,8,9,10,11,12,13,14,15]
|
|
; stack-vars: Vec<(index, offset)> [32..72]
|
|
; current_stack_size: [24..32]
|
|
; func_idx [16..24]
|
|
; ast [8..16]
|
|
; ctx [0..8]
|
|
sub rsp, 88
|
|
mov [rsp], rdi ; ctx
|
|
mov rax, [rdi]
|
|
mov [rsp + 8], rax ; ast
|
|
mov [rsp + 16], rsi ; func_idx
|
|
|
|
bts qword [rsp + 72], 7 ; mark rbp as used
|
|
bts qword [rsp + 72], 6 ; mark rsp as used
|
|
|
|
; push "section .text\n"
|
|
mov rdi, [rsp] ; ctx
|
|
lea rdi, [rdi + 8] ; &ctx.text
|
|
lea rsi, [rel SECTION_TEXT]
|
|
mov rdx, SECTION_TEXT_LEN
|
|
call vec_extend
|
|
|
|
mov rdi, [rsp + 8] ; ast
|
|
mov rsi, [rsp + 16] ; func_idx
|
|
call vec_get
|
|
cmp byte [rax + 0], AST_FUNCTION ; AstNode.kind
|
|
mov rbx, [rax + 8] ; AstNode.data
|
|
jne .panic
|
|
|
|
; push "global {function_name}\n"
|
|
mov rdi, [rsp] ; ctx
|
|
lea rdi, [rdi + 8] ; &ctx.text
|
|
lea rsi, [rel GLOBAL_]
|
|
mov rdx, GLOBAL_LEN
|
|
call vec_extend
|
|
; get function name
|
|
mov rdi, [rsp] ; ctx
|
|
lea rdi, [rdi + 8] ; &ctx.text
|
|
mov rsi, [rbx + 0] ; AstFunction.name
|
|
mov rdx, [rbx + 8] ; AstFunction.name_len
|
|
call vec_extend
|
|
; push "\n"
|
|
mov rdi, [rsp] ; ctx
|
|
lea rdi, [rdi + 8] ; &ctx.text
|
|
lea rsi, [rel COLON_NL]
|
|
inc rsi
|
|
mov rdx, 1
|
|
call vec_extend
|
|
; push "{function_name}:\n"
|
|
mov rdi, [rsp] ; ctx
|
|
lea rdi, [rdi + 8] ; &ctx.text
|
|
mov rsi, [rbx + 0] ; AstFunction.name
|
|
mov rdx, [rbx + 8] ; AstFunction.name_len
|
|
call vec_extend
|
|
; push ":\n"
|
|
mov rdi, [rsp] ; ctx
|
|
lea rdi, [rdi + 8] ; &ctx.text
|
|
lea rsi, [rel COLON_NL]
|
|
mov rdx, 2
|
|
call vec_extend
|
|
|
|
|
|
; TODO: generate function body
|
|
|
|
; push "ret\n"
|
|
mov rdi, [rsp] ; ctx
|
|
lea rdi, [rdi + 8] ; &ctx.text
|
|
lea rsi, [rel RET_NL]
|
|
mov rdx, RET_NL_LEN
|
|
call vec_extend
|
|
|
|
add rsp, 88
|
|
pop rbx
|
|
pop rbp
|
|
ret
|
|
|
|
.panic:
|
|
call panic
|