diff options
Diffstat (limited to 'vm_exec.c')
| -rw-r--r-- | vm_exec.c | 91 |
1 files changed, 49 insertions, 42 deletions
@@ -11,6 +11,11 @@ #include <math.h> +#if USE_YJIT || USE_ZJIT +// The number of instructions executed on vm_exec_core. --yjit-stats and --zjit-stats use this. +uint64_t rb_vm_insn_count = 0; +#endif + #if VM_COLLECT_USAGE_DETAILS static void vm_analysis_insn(int insn); #endif @@ -24,6 +29,12 @@ static void vm_analysis_insn(int insn); #elif defined(__GNUC__) && defined(__i386__) #define DECL_SC_REG(type, r, reg) register type reg_##r __asm__("e" reg) +#elif defined(__GNUC__) && (defined(__powerpc64__) || defined(__POWERPC__)) +#define DECL_SC_REG(type, r, reg) register type reg_##r __asm__("r" reg) + +#elif defined(__GNUC__) && defined(__aarch64__) +#define DECL_SC_REG(type, r, reg) register type reg_##r __asm__("x" reg) + #else #define DECL_SC_REG(type, r, reg) register type reg_##r #endif @@ -31,33 +42,33 @@ static void vm_analysis_insn(int insn); #if !OPT_CALL_THREADED_CODE static VALUE -vm_exec_core(rb_thread_t *th, VALUE initial) +vm_exec_core(rb_execution_context_t *ec) { - -#if OPT_STACK_CACHING -#if 0 -#elif __GNUC__ && __x86_64__ - DECL_SC_REG(VALUE, a, "12"); - DECL_SC_REG(VALUE, b, "13"); -#else - register VALUE reg_a; - register VALUE reg_b; -#endif -#endif - #if defined(__GNUC__) && defined(__i386__) - DECL_SC_REG(VALUE *, pc, "di"); + DECL_SC_REG(const VALUE *, pc, "di"); DECL_SC_REG(rb_control_frame_t *, cfp, "si"); #define USE_MACHINE_REGS 1 #elif defined(__GNUC__) && defined(__x86_64__) - DECL_SC_REG(VALUE *, pc, "14"); + DECL_SC_REG(const VALUE *, pc, "14"); DECL_SC_REG(rb_control_frame_t *, cfp, "15"); #define USE_MACHINE_REGS 1 +#elif defined(__GNUC__) && (defined(__powerpc64__) || defined(__POWERPC__)) + DECL_SC_REG(const VALUE *, pc, "14"); + DECL_SC_REG(rb_control_frame_t *, cfp, "15"); +#define USE_MACHINE_REGS 1 + +#elif defined(__GNUC__) && defined(__aarch64__) + DECL_SC_REG(const VALUE *, pc, "19"); + DECL_SC_REG(rb_control_frame_t *, cfp, "20"); +#define USE_MACHINE_REGS 1 + #else register rb_control_frame_t *reg_cfp; - VALUE *reg_pc; + const VALUE *reg_pc; +#define USE_MACHINE_REGS 0 + #endif #if USE_MACHINE_REGS @@ -65,32 +76,27 @@ vm_exec_core(rb_thread_t *th, VALUE initial) #undef RESTORE_REGS #define RESTORE_REGS() \ { \ - REG_CFP = th->cfp; \ + VM_REG_CFP = ec->cfp; \ reg_pc = reg_cfp->pc; \ } -#undef REG_PC -#define REG_PC reg_pc +#undef VM_REG_PC +#define VM_REG_PC reg_pc #undef GET_PC #define GET_PC() (reg_pc) #undef SET_PC -#define SET_PC(x) (reg_cfp->pc = REG_PC = (x)) +#define SET_PC(x) (reg_cfp->pc = VM_REG_PC = (x)) #endif #if OPT_TOKEN_THREADED_CODE || OPT_DIRECT_THREADED_CODE #include "vmtc.inc" - if (UNLIKELY(th == 0)) { - return (VALUE)insns_address_table; + if (UNLIKELY(ec == 0)) { + return (VALUE)insns_address_table; } #endif - reg_cfp = th->cfp; + reg_cfp = ec->cfp; reg_pc = reg_cfp->pc; -#if OPT_STACK_CACHING - reg_a = initial; - reg_b = 0; -#endif - first: INSN_DISPATCH(); /*****************/ @@ -106,7 +112,7 @@ vm_exec_core(rb_thread_t *th, VALUE initial) const void ** rb_vm_get_insns_address_table(void) { - return (const void **)vm_exec_core(0, 0); + return (const void **)vm_exec_core(0); } #else /* OPT_CALL_THREADED_CODE */ @@ -121,27 +127,28 @@ rb_vm_get_insns_address_table(void) } static VALUE -vm_exec_core(rb_thread_t *th, VALUE initial) +vm_exec_core(rb_execution_context_t *ec) { - register rb_control_frame_t *reg_cfp = th->cfp; + register rb_control_frame_t *reg_cfp = ec->cfp; + rb_thread_t *th; while (1) { - reg_cfp = ((rb_insn_func_t) (*GET_PC()))(th, reg_cfp); + reg_cfp = ((rb_insn_func_t) (*GET_PC()))(ec, reg_cfp); - if (UNLIKELY(reg_cfp == 0)) { - break; - } + if (UNLIKELY(reg_cfp == 0)) { + break; + } } - if (th->retval != Qundef) { - VALUE ret = th->retval; - th->retval = Qundef; - return ret; + if (!UNDEF_P((th = rb_ec_thread_ptr(ec))->retval)) { + VALUE ret = th->retval; + th->retval = Qundef; + return ret; } else { - VALUE err = th->errinfo; - th->errinfo = Qnil; - return err; + VALUE err = ec->errinfo; + ec->errinfo = Qnil; + return err; } } #endif |
