vm_invoke_block: force indirect jump

This changeset slightly speeds up on my machine.

Calculating -------------------------------------
                                       before                 after
Optcarrot Lan_Master.nes    38.33488426546287     40.89825082589147 fps
                            40.91288557922081     41.48687465359386
                            40.96591995270991     41.98499064664184
                            41.20461943032173     43.67314690779162
                            42.38344888176518     44.02777536251875
                            43.43563728880915     44.88695892714136
                            43.88082889062643     45.11226186242523
This commit is contained in:
卜部昌平 2020-05-26 11:24:15 +09:00
parent 796f9edae0
commit 973883aaa1
Notes: git 2020-06-03 16:14:17 +09:00

View File

@ -3472,18 +3472,18 @@ vm_invoke_block(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp,
struct rb_calling_info *calling, const struct rb_callinfo *ci,
bool is_lambda, VALUE block_handler)
{
auto VALUE (*func)(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp,
struct rb_calling_info *calling, const struct rb_callinfo *ci,
bool is_lambda, VALUE block_handler);
switch (vm_block_handler_type(block_handler)) {
case block_handler_type_iseq:
return vm_invoke_iseq_block(ec, reg_cfp, calling, ci, is_lambda, block_handler);
case block_handler_type_ifunc:
return vm_invoke_ifunc_block(ec, reg_cfp, calling, ci, is_lambda, block_handler);
case block_handler_type_proc:
return vm_invoke_proc_block(ec, reg_cfp, calling, ci, is_lambda, block_handler);
case block_handler_type_symbol:
return vm_invoke_symbol_block(ec, reg_cfp, calling, ci, is_lambda, block_handler);
case block_handler_type_iseq: func = vm_invoke_iseq_block; break;
case block_handler_type_ifunc: func = vm_invoke_ifunc_block; break;
case block_handler_type_proc: func = vm_invoke_proc_block; break;
case block_handler_type_symbol: func = vm_invoke_symbol_block; break;
}
VM_UNREACHABLE(vm_invoke_block: unreachable);
return Qnil;
return func(ec, reg_cfp, calling, ci, is_lambda, block_handler);
}
static VALUE