14 #if VM_COLLECT_USAGE_DETAILS
15 static void vm_analysis_insn(
int insn);
19 #define DECL_SC_REG(type, r, reg) register type reg_##r
21 #elif defined(__GNUC__) && defined(__x86_64__)
22 #define DECL_SC_REG(type, r, reg) register type reg_##r __asm__("r" reg)
24 #elif defined(__GNUC__) && defined(__i386__)
25 #define DECL_SC_REG(type, r, reg) register type reg_##r __asm__("e" reg)
27 #elif defined(__GNUC__) && defined(__powerpc64__)
28 #define DECL_SC_REG(type, r, reg) register type reg_##r __asm__("r" reg)
31 #define DECL_SC_REG(type, r, reg) register type reg_##r
35 #if VM_DEBUG_STACKOVERFLOW
36 NORETURN(
static void vm_stack_overflow_for_insn(
void));
38 vm_stack_overflow_for_insn(
void)
40 rb_bug(
"CHECK_VM_STACK_OVERFLOW_FOR_INSN: should not overflow here. "
41 "Please contact ruby-core/dev with your (a part of) script. "
42 "This check will be removed soon.");
46 #if !OPT_CALL_THREADED_CODE
53 #elif __GNUC__ && __x86_64__
62 #if defined(__GNUC__) && defined(__i386__)
65 #define USE_MACHINE_REGS 1
67 #elif defined(__GNUC__) && defined(__x86_64__)
70 #define USE_MACHINE_REGS 1
72 #elif defined(__GNUC__) && defined(__powerpc64__)
75 #define USE_MACHINE_REGS 1
85 #define RESTORE_REGS() \
87 VM_REG_CFP = ec->cfp; \
88 reg_pc = reg_cfp->pc; \
92 #define VM_REG_PC reg_pc
94 #define GET_PC() (reg_pc)
96 #define SET_PC(x) (reg_cfp->pc = VM_REG_PC = (x))
99 #if OPT_TOKEN_THREADED_CODE || OPT_DIRECT_THREADED_CODE
102 return (
VALUE)insns_address_table;
106 reg_pc = reg_cfp->
pc;
108 #if OPT_STACK_CACHING
121 rb_bug(
"vm_eval: unreachable");
128 return (
const void **)vm_exec_core(0, 0);
139 return (
const void **)insns_address_table;
156 if ((th = rb_ec_thread_ptr(ec))->retval !=
Qundef) {
157 VALUE ret = th->retval;