diff options
Diffstat (limited to 'tool/ruby_vm/views')
-rw-r--r-- | tool/ruby_vm/views/_comptime_insn_stack_increase.erb (renamed from tool/ruby_vm/views/_insn_stack_increase.erb) | 22 | ||||
-rw-r--r-- | tool/ruby_vm/views/_mjit_compile_insn.erb | 4 | ||||
-rw-r--r-- | tool/ruby_vm/views/_mjit_compile_send.erb | 5 | ||||
-rw-r--r-- | tool/ruby_vm/views/insns_info.inc.erb | 2 | ||||
-rw-r--r-- | tool/ruby_vm/views/mjit_compile.inc.erb | 4 |
5 files changed, 24 insertions, 13 deletions
diff --git a/tool/ruby_vm/views/_insn_stack_increase.erb b/tool/ruby_vm/views/_comptime_insn_stack_increase.erb index 315d695cf1..b633ab4d32 100644 --- a/tool/ruby_vm/views/_insn_stack_increase.erb +++ b/tool/ruby_vm/views/_comptime_insn_stack_increase.erb @@ -6,11 +6,11 @@ %# conditions mentioned in the file COPYING are met. Consult the file for %# details. %# -PUREFUNC(MAYBE_UNUSED(static int insn_stack_increase(int depth, int insn, const VALUE *opes))); -PUREFUNC(static rb_snum_t insn_stack_increase_dispatch(enum ruby_vminsn_type insn, const VALUE *opes)); +PUREFUNC(MAYBE_UNUSED(static int comptime_insn_stack_increase(int depth, int insn, const VALUE *opes))); +PUREFUNC(static rb_snum_t comptime_insn_stack_increase_dispatch(enum ruby_vminsn_type insn, const VALUE *opes)); rb_snum_t -insn_stack_increase_dispatch(enum ruby_vminsn_type insn, const VALUE *opes) +comptime_insn_stack_increase_dispatch(enum ruby_vminsn_type insn, const VALUE *opes) { static const signed char t[] = { % RubyVM::Instructions.each_slice 8 do |a| @@ -34,9 +34,19 @@ insn_stack_increase_dispatch(enum ruby_vminsn_type insn, const VALUE *opes) UNREACHABLE; % RubyVM::Instructions.each do |i| % next unless i.has_attribute?('sp_inc') +% attr_function = +% if i.has_attribute?('comptime_sp_inc') +% "attr_comptime_sp_inc_#{i.name}" +% else +% "attr_sp_inc_#{i.name}" +% end case <%= i.bin %>: - return attr_sp_inc_<%= i.name %>(<%= + return <%= attr_function %>(<%= i.opes.map.with_index do |v, j| + if v[:type] == 'CALL_DATA' && i.has_attribute?('comptime_sp_inc') + v = v.dup + v[:type] = 'CALL_INFO' + end i.cast_from_VALUE v, "opes[#{j}]" end.join(", ") %>); @@ -45,8 +55,8 @@ insn_stack_increase_dispatch(enum ruby_vminsn_type insn, const VALUE *opes) } int -insn_stack_increase(int depth, int insn, const VALUE *opes) +comptime_insn_stack_increase(int depth, int insn, const VALUE *opes) { enum ruby_vminsn_type itype = (enum ruby_vminsn_type)insn; - return depth + (int)insn_stack_increase_dispatch(itype, opes); + return depth + (int)comptime_insn_stack_increase_dispatch(itype, opes); } diff --git a/tool/ruby_vm/views/_mjit_compile_insn.erb b/tool/ruby_vm/views/_mjit_compile_insn.erb index 4488876da3..b2dea03e38 100644 --- a/tool/ruby_vm/views/_mjit_compile_insn.erb +++ b/tool/ruby_vm/views/_mjit_compile_insn.erb @@ -34,8 +34,8 @@ % case ope.fetch(:type) % when 'ID' comment_id(f, (ID)operands[<%= i %>]); -% when 'CALL_INFO' - comment_id(f, ((CALL_INFO)operands[<%= i %>])->mid); +% when 'CALL_DATA' + comment_id(f, ((CALL_DATA)operands[<%= i %>])->ci.mid); % when 'VALUE' if (SYMBOL_P((VALUE)operands[<%= i %>])) comment_id(f, SYM2ID((VALUE)operands[<%= i %>])); % end diff --git a/tool/ruby_vm/views/_mjit_compile_send.erb b/tool/ruby_vm/views/_mjit_compile_send.erb index da7e96581b..95e7846820 100644 --- a/tool/ruby_vm/views/_mjit_compile_send.erb +++ b/tool/ruby_vm/views/_mjit_compile_send.erb @@ -14,10 +14,11 @@ MAYBE_UNUSED(<%= ope.fetch(:decl) %>) = (<%= ope.fetch(:type) %>)operands[<%= i %>]; % end % # compiler: Use copied cc to avoid race condition - CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries); + CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body); % if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) { const rb_iseq_t *iseq; + const CALL_INFO ci = &cd->ci; unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`. % if insn.name == 'send' argc += ((ci->flag & VM_CALL_ARGS_BLOCKARG) ? 1 : 0); // simulate `vm_caller_setup_arg_block`'s `--reg_cfp->sp` @@ -58,7 +59,7 @@ fprintf(f, " {\n"); fprintf(f, " struct rb_calling_info calling;\n"); % if insn.name == 'send' - fprintf(f, " calling.block_handler = vm_caller_setup_arg_block(ec, reg_cfp, (CALL_INFO)0x%"PRIxVALUE", (rb_iseq_t *)0x%"PRIxVALUE", FALSE);\n", operands[0], operands[2]); + fprintf(f, " calling.block_handler = vm_caller_setup_arg_block(ec, reg_cfp, (CALL_INFO)0x%"PRIxVALUE", (rb_iseq_t *)0x%"PRIxVALUE", FALSE);\n", (VALUE)ci, (VALUE)blockiseq); % else fprintf(f, " calling.block_handler = VM_BLOCK_HANDLER_NONE;\n"); % end diff --git a/tool/ruby_vm/views/insns_info.inc.erb b/tool/ruby_vm/views/insns_info.inc.erb index e5793a2a70..2ca5aca7cf 100644 --- a/tool/ruby_vm/views/insns_info.inc.erb +++ b/tool/ruby_vm/views/insns_info.inc.erb @@ -18,5 +18,5 @@ <%= render 'leaf_helpers' %> <%= render 'sp_inc_helpers' %> <%= render 'attributes' %> -<%= render 'insn_stack_increase' %> +<%= render 'comptime_insn_stack_increase' %> <%= render 'insn_sp_pc_dependency' %> diff --git a/tool/ruby_vm/views/mjit_compile.inc.erb b/tool/ruby_vm/views/mjit_compile.inc.erb index d9092a756d..95e71183d9 100644 --- a/tool/ruby_vm/views/mjit_compile.inc.erb +++ b/tool/ruby_vm/views/mjit_compile.inc.erb @@ -56,8 +56,8 @@ switch (insn) { <%= render 'mjit_compile_send', locals: { insn: insn } -%> % when *send_compatible_opt_insns % # To avoid cancel, just emit `opt_send_without_block` instead of `opt_*` insn if call cache is populated. -% cc_index = insn.opes.index { |o| o.fetch(:type) == 'CALL_CACHE' } - if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[<%= cc_index %>] - body->cc_entries))) { +% cd_index = insn.opes.index { |o| o.fetch(:type) == 'CALL_DATA' } + if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[<%= cd_index %>], body))) { <%= render 'mjit_compile_send', locals: { insn: opt_send_without_block } -%> <%= render 'mjit_compile_insn', locals: { insn: opt_send_without_block } -%> break; |