from-scratch/lang/src/codegen.asm

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