mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00

in MJIT implementation. This allows us to drop cfp->bp by just modifying vm_base_ptr in the future. No performance impact: $ benchmark-driver benchmark.yml --rbenv='before::before --disable-gems --jit;bp_::after --disable-gems --jit;vm_env_ptr::ruby-svn --disable-gems --jit' -v --output=all --repeat-count=12 before: ruby 2.7.0dev (2019-03-24 trunk 67341) +JIT [x86_64-linux] bp_: ruby 2.7.0dev (2019-03-24 trunk 67342) +JIT [x86_64-linux] vm_env_ptr: ruby 2.7.0dev (2019-03-25 trunk 67343) +JIT [x86_64-linux] last_commit=Prefer using vm_base_ptr rather than cfp->bp Calculating ------------------------------------- before bp_ vm_env_ptr Optcarrot Lan_Master.nes 77.15059205092646 70.18873044267853 69.62171387083328 fps 78.75767783870441 77.49867689173411 75.43496867709587 79.60102690369321 77.78037687683523 79.36688927929428 80.25144236638835 78.74729849101701 80.42363742291455 82.22375417165489 80.44265482494045 80.90287243299306 82.29166786292619 80.51740049420938 81.81153053252902 83.35386925305345 80.91054205210609 81.93562989125176 83.39770634366975 81.34550754145043 82.24544621470430 83.88523450309972 81.60698516017347 82.76801860263230 84.17553130135879 82.69615943446324 83.02530407910871 84.42132328119858 83.00969158037691 83.19968539409922 84.60731429793329 83.32703363300098 83.81352746019631 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67344 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
86 lines
3.5 KiB
Text
86 lines
3.5 KiB
Text
% # -*- C -*-
|
|
% # Copyright (c) 2018 Takashi Kokubun. All rights reserved.
|
|
% #
|
|
% # This file is a part of the programming language Ruby. Permission is hereby
|
|
% # granted, to either redistribute and/or modify this file, provided that the
|
|
% # conditions mentioned in the file COPYING are met. Consult the file for
|
|
% # details.
|
|
fprintf(f, "{\n");
|
|
{
|
|
MAYBE_UNUSED(int pc_moved_p) = FALSE;
|
|
% # compiler: Prepare operands which may be used by `insn.call_attribute`
|
|
% insn.opes.each_with_index do |ope, i|
|
|
MAYBE_UNUSED(<%= ope.fetch(:decl) %>) = (<%= ope.fetch(:type) %>)operands[<%= i %>];
|
|
% end
|
|
%
|
|
% # JIT: Declare stack_size to be used in some macro of _mjit_compile_insn_body.erb
|
|
if (status->local_stack_p) {
|
|
fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
|
|
}
|
|
%
|
|
% # JIT: Declare variables for operands, popped values and return values
|
|
% insn.declarations.each do |decl|
|
|
fprintf(f, " <%= decl %>;\n");
|
|
% end
|
|
|
|
% # JIT: Set const expressions for `RubyVM::OperandsUnifications` insn
|
|
% insn.preamble.each do |amble|
|
|
fprintf(f, "<%= amble.expr.sub(/const \S+\s+/, '') %>\n");
|
|
% end
|
|
%
|
|
% # JIT: Initialize operands
|
|
% insn.opes.each_with_index do |ope, i|
|
|
fprintf(f, " <%= ope.fetch(:name) %> = (<%= ope.fetch(:type) %>)0x%"PRIxVALUE";", operands[<%= i %>]);
|
|
% case ope.fetch(:type)
|
|
% when 'ID'
|
|
comment_id(f, (ID)operands[<%= i %>]);
|
|
% when 'CALL_INFO'
|
|
comment_id(f, ((CALL_INFO)operands[<%= i %>])->mid);
|
|
% when 'VALUE'
|
|
if (SYMBOL_P((VALUE)operands[<%= i %>])) comment_id(f, SYM2ID((VALUE)operands[<%= i %>]));
|
|
% end
|
|
fprintf(f, "\n");
|
|
% end
|
|
%
|
|
% # JIT: Initialize popped values
|
|
% insn.pops.reverse_each.with_index.reverse_each do |pop, i|
|
|
fprintf(f, " <%= pop.fetch(:name) %> = stack[%d];\n", b->stack_size - <%= i + 1 %>);
|
|
% end
|
|
%
|
|
% # JIT: move sp and pc if necessary
|
|
<%= render 'mjit_compile_pc_and_sp', locals: { insn: insn } -%>
|
|
%
|
|
% # JIT: Print insn body in insns.def
|
|
<%= render 'mjit_compile_insn_body', locals: { insn: insn } -%>
|
|
%
|
|
% # JIT: Set return values
|
|
% insn.rets.reverse_each.with_index do |ret, i|
|
|
% # TOPN(n) = ...
|
|
fprintf(f, " stack[%d] = <%= ret.fetch(:name) %>;\n", b->stack_size + (int)<%= insn.call_attribute('sp_inc') %> - <%= i + 1 %>);
|
|
% end
|
|
%
|
|
% # JIT: We should evaluate ISeq modified for TracePoint if it's enabled. Note: This is slow.
|
|
% unless insn.always_leaf?
|
|
fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
|
|
fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)<%= insn.call_attribute('sp_inc') %>);
|
|
if (!pc_moved_p) {
|
|
fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
|
|
}
|
|
fprintf(f, " goto cancel;\n");
|
|
fprintf(f, " }\n");
|
|
% end
|
|
%
|
|
% # compiler: Move JIT compiler's internal stack pointer
|
|
b->stack_size += <%= insn.call_attribute('sp_inc') %>;
|
|
}
|
|
fprintf(f, "}\n");
|
|
%
|
|
% # compiler: If insn has conditional JUMP, the branch which is not targeted by JUMP should be compiled too.
|
|
% if insn.expr.expr =~ /if\s+\([^{}]+\)\s+\{[^{}]+JUMP\([^)]+\);[^{}]+\}/
|
|
compile_insns(f, body, b->stack_size, pos + insn_len(insn), status);
|
|
% end
|
|
%
|
|
% # compiler: If insn returns (leave) or does longjmp (throw), the branch should no longer be compiled. TODO: create attr for it?
|
|
% if insn.expr.expr =~ /\sTHROW_EXCEPTION\([^)]+\);/ || insn.expr.expr =~ /\bvm_pop_frame\(/
|
|
b->finish_p = TRUE;
|
|
% end
|