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"); }