14#if VM_COLLECT_USAGE_DETAILS
15static void vm_analysis_insn(
int insn);
19static size_t rb_insns_counter[VM_INSTRUCTION_SIZE];
22vm_insns_counter_count_insn(
int insn)
24 rb_insns_counter[insn]++;
29vm_insns_counter_show_results_at_exit(
void)
32 ? VM_INSTRUCTION_SIZE : VM_INSTRUCTION_SIZE / 2;
35 for (
int insn = 0; insn < insn_end; insn++)
36 total += rb_insns_counter[insn];
38 for (
int insn = 0; insn < insn_end; insn++) {
39 fprintf(stderr,
"[RUBY_INSNS_COUNTER]\t%-32s%'12"PRIuSIZE" (%4.1f%%)\n",
40 insn_name(insn), rb_insns_counter[insn],
41 100.0 * rb_insns_counter[insn] / total);
45static void vm_insns_counter_count_insn(
int insn) {}
49#define DECL_SC_REG(type, r, reg) register type reg_##r
51#elif defined(__GNUC__) && defined(__x86_64__)
52#define DECL_SC_REG(type, r, reg) register type reg_##r __asm__("r" reg)
54#elif defined(__GNUC__) && defined(__i386__)
55#define DECL_SC_REG(type, r, reg) register type reg_##r __asm__("e" reg)
57#elif defined(__GNUC__) && defined(__powerpc64__)
58#define DECL_SC_REG(type, r, reg) register type reg_##r __asm__("r" reg)
60#elif defined(__GNUC__) && defined(__aarch64__)
61#define DECL_SC_REG(type, r, reg) register type reg_##r __asm__("x" reg)
64#define DECL_SC_REG(type, r, reg) register type reg_##r
68#if !OPT_CALL_THREADED_CODE
75#elif __GNUC__ && __x86_64__
84#if defined(__GNUC__) && defined(__i386__)
87#define USE_MACHINE_REGS 1
89#elif defined(__GNUC__) && defined(__x86_64__)
92#define USE_MACHINE_REGS 1
94#elif defined(__GNUC__) && defined(__powerpc64__)
97#define USE_MACHINE_REGS 1
99#elif defined(__GNUC__) && defined(__aarch64__)
102#define USE_MACHINE_REGS 1
112#define RESTORE_REGS() \
114 VM_REG_CFP = ec->cfp; \
115 reg_pc = reg_cfp->pc; \
119#define VM_REG_PC reg_pc
121#define GET_PC() (reg_pc)
123#define SET_PC(x) (reg_cfp->pc = VM_REG_PC = (x))
126#if OPT_TOKEN_THREADED_CODE || OPT_DIRECT_THREADED_CODE
129 return (
VALUE)insns_address_table;
133 reg_pc = reg_cfp->
pc;
148 rb_bug(
"vm_eval: unreachable");
155 return (
const void **)vm_exec_core(0, 0);
166 return (
const void **)insns_address_table;
183 if ((th = rb_ec_thread_ptr(ec))->retval !=
Qundef) {
184 VALUE ret = th->retval;
void rb_bug(const char *fmt,...)
void *PTR64 __attribute__((mode(DI)))
#define ISEQ_TRACE_EVENTS
Internal header for Math.
rb_event_flag_t ruby_vm_event_enabled_global_flags
rb_control_frame_t *FUNC_FASTCALL rb_insn_func_t(rb_execution_context_t *, rb_control_frame_t *)
const void ** rb_vm_get_insns_address_table(void)
#define DECL_SC_REG(type, r, reg)
#define END_INSNS_DISPATCH()