/* Store in R0 the result of evaluating the operator TOK with a register operand SRC and an immediate operand IMM. */ void gen_reg_imm (int src, int imm, int tok) { switch (tok) { case '+': jit_addi_i (JIT_R0, src, imm); break; case '-': jit_subi_i (JIT_R0, src, imm); break; case '*': jit_muli_i (JIT_R0, src, imm); break; case '/': jit_divi_i (JIT_R0, src, imm); break; case '%': jit_modi_i (JIT_R0, src, imm); break; case '&': jit_andi_i (JIT_R0, src, imm); break; case '|': jit_ori_i (JIT_R0, src, imm); break; case '^': jit_xori_i (JIT_R0, src, imm); break; case '=': jit_eqi_i (JIT_R0, src, imm); break; case '<': jit_lti_i (JIT_R0, src, imm); break; case '>': jit_gti_i (JIT_R0, src, imm); break; case LE: jit_lei_i (JIT_R0, src, imm); break; case GE: jit_gei_i (JIT_R0, src, imm); break; case NE: jit_nei_i (JIT_R0, src, imm); break; case LSH: jit_lshi_i (JIT_R0, src, imm); break; case RSH: jit_rshi_i (JIT_R0, src, imm); break; case RSHU: jit_rshi_ui (JIT_R0, src, imm); break; default: abort (); } }
mod_t generate_modi (int operand) { mod_t result; int arg; buffer = mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON, -1, 0); if (buffer == MAP_FAILED) { perror("mmap"); exit(0); } result = (mod_t)(jit_set_ip (buffer).iptr); jit_leaf (1); arg = jit_arg_i (); jit_getarg_i (JIT_R1, arg); jit_modi_i (JIT_R2, JIT_R1, operand); jit_movr_i (JIT_RET, JIT_R2); jit_ret (); jit_flush_code (buffer, jit_get_ip ().ptr); return result; }
mod_t generate_modi (int operand) { static char buffer[1024]; mod_t result; int arg; result = (mod_t)(jit_set_ip (buffer).iptr); jit_leaf (1); arg = jit_arg_i (); jit_getarg_i (JIT_R1, arg); jit_modi_i (JIT_R2, JIT_R1, operand); jit_movr_i (JIT_RET, JIT_R2); jit_ret (); jit_flush_code (buffer, jit_get_ip ().ptr); return result; }