From f19deef323609e46a732edaa983e7bfed16582c0 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Tue, 29 Nov 2022 00:33:49 -0800 Subject: MJIT: Move Primitive helpers to mjit_c.rb --- mjit_c.rb | 44 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 9 deletions(-) (limited to 'mjit_c.rb') 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 -- cgit v1.2.3