summaryrefslogtreecommitdiff
path: root/vm_exec.c
diff options
context:
space:
mode:
Diffstat (limited to 'vm_exec.c')
-rw-r--r--vm_exec.c91
1 files changed, 49 insertions, 42 deletions
diff --git a/vm_exec.c b/vm_exec.c
index c914a8bcca..bd8c170d76 100644
--- a/vm_exec.c
+++ b/vm_exec.c
@@ -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