35 lines
1.0 KiB
C
35 lines
1.0 KiB
C
void emit_expr(FILE *file, Ast *n) {
|
|
switch (n->kind) {
|
|
case AST_INT: {
|
|
fprintf(file, " mov rax, %lu\n", n->u);
|
|
} break;
|
|
case AST_BINARY: {
|
|
emit_expr(file, n->l);
|
|
fprintf(file, " push rax\n");
|
|
emit_expr(file, n->r);
|
|
fprintf(file, " pop rcx\n");
|
|
|
|
if (n->op == TOK_PLUS) {
|
|
fprintf(file, " add rax, rcx\n");
|
|
} else if (n->op == TOK_STAR) {
|
|
fprintf(file, " imul rax, rcx\n");
|
|
} else if (n->op == TOK_MINUS) {
|
|
fprintf(file, " mov rdx, rax\n");
|
|
fprintf(file, " mov rax, rcx\n");
|
|
fprintf(file, " sub rax, rdx\n");
|
|
} else {
|
|
panicf("error");
|
|
}
|
|
} break;
|
|
default: panicf("error");
|
|
}
|
|
}
|
|
|
|
void emit_program(FILE *file, Ast *n) {
|
|
fprintf(file, ".intel_syntax noprefix\n");
|
|
fprintf(file, ".global main\n");
|
|
fprintf(file, "main:\n");
|
|
emit_expr(file, n);
|
|
fprintf(file, " ret\n");
|
|
}
|