summaryrefslogtreecommitdiff
path: root/mjit_c.rb
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2022-11-29 00:33:49 -0800
committerTakashi Kokubun <takashikkbn@gmail.com>2022-11-29 00:47:25 -0800
commitf19deef323609e46a732edaa983e7bfed16582c0 (patch)
tree601cc2fbbefc244c59da3a5ec0e047ef612e2505 /mjit_c.rb
parent27f34eeb5a95263f8669e6998247d83606c3763f (diff)
MJIT: Move Primitive helpers to mjit_c.rb
Diffstat (limited to 'mjit_c.rb')
-rw-r--r--mjit_c.rb44
1 files changed, 35 insertions, 9 deletions
diff --git a/mjit_c.rb b/mjit_c.rb
index ae1c9a802f..7c70e3a73f 100644
--- a/mjit_c.rb
+++ b/mjit_c.rb
@@ -9,12 +9,25 @@ module RubyVM::MJIT
Primitive.cexpr! 'rb_hash_values((VALUE)NUM2PTR(cdhash_addr))'
end
- def builtin_compiler(f, bf, index, stack_size, builtin_inline_p)
- Primitive.builtin_compile(f, bf.to_i, index, stack_size, builtin_inline_p)
+ def builtin_compiler(buf, bf_ptr, index, stack_size, builtin_inline_p)
+ bf_addr = bf_ptr.to_i
+ # Call "mjit_compile_invokebuiltin_for_#{func}" in mk_builtin_loader.rb
+ Primitive.cstmt! %{
+ RB_BUILTIN bf = (RB_BUILTIN)NUM2PTR(bf_addr);
+ bf->compiler(buf, NIL_P(index) ? -1 : NUM2LONG(index), NUM2UINT(stack_size), RTEST(builtin_inline_p));
+ return Qnil;
+ }
end
- def has_cache_for_send(cc, insn)
- Primitive.has_cache_for_send(cc.to_i, insn)
+ def has_cache_for_send(cc_ptr, insn)
+ cc_addr = cc_ptr.to_i
+ Primitive.cstmt! %{
+ extern bool rb_vm_opt_cfunc_p(CALL_CACHE cc, int insn);
+ CALL_CACHE cc = (CALL_CACHE)NUM2PTR(cc_addr);
+ bool has_cache = vm_cc_cme(cc) != NULL &&
+ !(vm_cc_cme(cc)->def->type == VM_METHOD_TYPE_CFUNC && rb_vm_opt_cfunc_p(cc, NUM2INT(insn)));
+ return RBOOL(has_cache);
+ }
end
def rb_shape_get_shape_by_id(shape_id)
@@ -57,11 +70,24 @@ module RubyVM::MJIT
}
end
- def fastpath_applied_iseq_p(ci, cc, iseq)
- _ci_addr = ci.to_i
- _cc_addr = cc.to_i
- _iseq_addr = iseq.to_i
- Primitive.cexpr! 'RBOOL(fastpath_applied_iseq_p((CALL_INFO)NUM2PTR(_ci_addr), (CALL_CACHE)NUM2PTR(_cc_addr), (rb_iseq_t *)NUM2PTR(_iseq_addr)))'
+ # Returns true if iseq can use fastpath for setup, otherwise NULL. This becomes true in the same condition
+ # as CC_SET_FASTPATH (in vm_callee_setup_arg) is called from vm_call_iseq_setup.
+ def fastpath_applied_iseq_p(ci_ptr, cc_ptr, iseq_ptr)
+ ci_addr = ci_ptr.to_i
+ cc_addr = cc_ptr.to_i
+ iseq_addr = iseq_ptr.to_i
+ Primitive.cstmt! %q{
+ extern bool rb_simple_iseq_p(const rb_iseq_t *iseq);
+ CALL_INFO ci = (CALL_INFO)NUM2PTR(ci_addr);
+ CALL_CACHE cc = (CALL_CACHE)NUM2PTR(cc_addr);
+ const rb_iseq_t *iseq = (rb_iseq_t *)NUM2PTR(iseq_addr);
+
+ bool result = iseq != NULL
+ && !(vm_ci_flag(ci) & VM_CALL_KW_SPLAT) && rb_simple_iseq_p(iseq) // Top of vm_callee_setup_arg. In this case, opt_pc is 0.
+ && vm_ci_argc(ci) == (unsigned int)ISEQ_BODY(iseq)->param.lead_num // exclude argument_arity_error (assumption: `calling->argc == ci->orig_argc` in send insns)
+ && vm_call_iseq_optimizable_p(ci, cc); // CC_SET_FASTPATH condition
+ return RBOOL(result);
+ }
end
def mjit_opts