static inline void JIT_visit(ASTNode *node, int regs[], int reg) { switch(node->type) { case AST_BINARY_OP: { ASTBinaryOp *binary_op = (ASTBinaryOp*)node; int a_reg = alloc_reg(regs); JIT_visit(binary_op->lhs, regs, a_reg); int b_reg = alloc_reg(regs); JIT_visit(binary_op->rhs, regs, b_reg); switch(binary_op->op) { case '+': jit_addr_i(reg, a_reg, b_reg); break; case '-': jit_subr_i(reg, a_reg, b_reg); break; case '*': jit_mulr_i(reg, a_reg, b_reg); break; case '/': jit_divr_i(reg, a_reg, b_reg); break; } free_reg(regs, a_reg); free_reg(regs, b_reg); break; } case AST_INT: { jit_movi_i(reg, ((ASTInt*)node)->value); break; } } }
/* Store in R0 the result of evaluating the operator TOK with two register operands SRC1 and SRC2. */ void gen_reg_reg (int src1, int src2, int tok) { switch (tok) { case '+': jit_addr_i (JIT_R0, src1, src2); break; case '-': jit_subr_i (JIT_R0, src1, src2); break; case '*': jit_mulr_i (JIT_R0, src1, src2); break; case '/': jit_divr_i (JIT_R0, src1, src2); break; case '%': jit_modr_i (JIT_R0, src1, src2); break; case '&': jit_andr_i (JIT_R0, src1, src2); break; case '|': jit_orr_i (JIT_R0, src1, src2); break; case '^': jit_xorr_i (JIT_R0, src1, src2); break; case '=': jit_eqr_i (JIT_R0, src1, src2); break; case '<': jit_ltr_i (JIT_R0, src1, src2); break; case '>': jit_gtr_i (JIT_R0, src1, src2); break; case LE: jit_ler_i (JIT_R0, src1, src2); break; case GE: jit_ger_i (JIT_R0, src1, src2); break; case NE: jit_ner_i (JIT_R0, src1, src2); break; case LSH: jit_lshr_i (JIT_R0, src1, src2); break; case RSH: jit_rshr_i (JIT_R0, src1, src2); break; case RSHU: jit_rshr_ui (JIT_R0, src1, src2); break; default: abort (); } }
int main() { pifii myFunction= (pifii) (jit_set_ip(codeBuffer).iptr); int ofs; /* offset of the argument */ jit_leaf(2); ofs = jit_arg_i(); jit_getarg_i(JIT_R0, ofs); ofs = jit_arg_i(); jit_getarg_i(JIT_R1, ofs); jit_addr_i(JIT_RET, JIT_R0, JIT_R1); jit_ret(); jit_flush_code(codeBuffer, jit_get_ip().ptr); /* call the generated code, passing its size as argument */ #ifdef LIGHTNING_DISASSEMBLE disassemble(stderr, codeBuffer, jit_get_ip().ptr); #endif #ifndef LIGHTNING_CROSS printf("%d + %d = %d\n", 5, 4, myFunction(5, 4)); #endif return 0; }