diff options
Diffstat (limited to 'vm_exec.h')
| -rw-r--r-- | vm_exec.h | 47 |
1 files changed, 30 insertions, 17 deletions
@@ -21,11 +21,7 @@ typedef rb_iseq_t *ISEQ; #define DEBUG_ENTER_INSN(insn) \ rb_vmdebug_debug_print_pre(ec, GET_CFP(), GET_PC()); -#if OPT_STACK_CACHING -#define SC_REGS() , reg_a, reg_b -#else #define SC_REGS() -#endif #define DEBUG_END_INSN() \ rb_vmdebug_debug_print_post(ec, GET_CFP() SC_REGS()); @@ -40,10 +36,6 @@ typedef rb_iseq_t *ISEQ; #define throwdebug if(0)ruby_debug_printf /* #define throwdebug ruby_debug_printf */ -#ifndef USE_INSNS_COUNTER -#define USE_INSNS_COUNTER 0 -#endif - /************************************************/ #if defined(DISPATCH_XXX) error ! @@ -80,8 +72,7 @@ error ! (reg_cfp->pc - ISEQ_BODY(reg_cfp->iseq)->iseq_encoded), \ RSTRING_PTR(rb_iseq_path(reg_cfp->iseq)), \ rb_iseq_line_no(reg_cfp->iseq, reg_pc - ISEQ_BODY(reg_cfp->iseq)->iseq_encoded)); \ - } \ - if (USE_INSNS_COUNTER) vm_insns_counter_count_insn(BIN(insn)); + } #define INSN_DISPATCH_SIG(insn) @@ -165,12 +156,6 @@ default: \ #define VM_SP_CNT(ec, sp) ((sp) - (ec)->vm_stack) -#ifdef MJIT_HEADER -#define THROW_EXCEPTION(exc) do { \ - ec->errinfo = (VALUE)(exc); \ - EC_JUMP_TAG(ec, ec->tag->state); \ -} while (0) -#else #if OPT_CALL_THREADED_CODE #define THROW_EXCEPTION(exc) do { \ ec->errinfo = (VALUE)(exc); \ @@ -179,7 +164,35 @@ default: \ #else #define THROW_EXCEPTION(exc) return (VALUE)(exc) #endif -#endif + +// Run the interpreter from the JIT +#define VM_EXEC(ec, val) do { \ + if (UNDEF_P(val)) { \ + VM_ENV_FLAGS_SET(ec->cfp->ep, VM_FRAME_FLAG_FINISH); \ + val = vm_exec(ec); \ + } \ +} while (0) + +// Run the JIT from the interpreter +#define JIT_EXEC(ec, val) do { \ + /* don't run tailcalls since that breaks FINISH */ \ + if (UNDEF_P(val) && GET_CFP() != ec->cfp) { \ + rb_zjit_func_t zjit_entry; \ + if (rb_yjit_enabled_p) { \ + rb_jit_func_t func = yjit_compile(ec); \ + if (func) { \ + val = func(ec, ec->cfp); \ + if (ec->tag->state) THROW_EXCEPTION(val); \ + } \ + } \ + else if ((zjit_entry = (rb_zjit_func_t)rb_zjit_entry)) { \ + rb_jit_func_t func = zjit_compile(ec); \ + if (func) { \ + val = zjit_entry(ec, ec->cfp, func); \ + } \ + } \ + } \ +} while (0) #define SCREG(r) (reg_##r) |
