[前][次][番号順一覧][スレッド一覧]

ruby-changes:50266

From: k0kubun <ko1@a...>
Date: Mon, 12 Feb 2018 16:27:54 +0900 (JST)
Subject: [ruby-changes:50266] k0kubun:r62384 (trunk): _mjit_compile_insn_body.erb: refactor

k0kubun	2018-02-12 16:27:48 +0900 (Mon, 12 Feb 2018)

  New Revision: 62384

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=62384

  Log:
    _mjit_compile_insn_body.erb: refactor
    
    renamed from tool/ruby_vm/views/_mjit_compile_insn_line.erb.
    Basically this file should handle everything about macro on JIT.
    
    _mjit_compile_insn.erb: follow the refactoring
    
    common.mk: follow the rename

  Added files:
    trunk/tool/ruby_vm/views/_mjit_compile_insn_body.erb
  Removed files:
    trunk/tool/ruby_vm/views/_mjit_compile_insn_line.erb
  Modified files:
    trunk/common.mk
    trunk/tool/ruby_vm/views/_mjit_compile_insn.erb
Index: tool/ruby_vm/views/_mjit_compile_insn_line.erb
===================================================================
--- tool/ruby_vm/views/_mjit_compile_insn_line.erb	(revision 62383)
+++ tool/ruby_vm/views/_mjit_compile_insn_line.erb	(nonexistent)
@@ -1,52 +0,0 @@ https://github.com/ruby/ruby/blob/trunk/tool/ruby_vm/views/_mjit_compile_insn_line.erb#L0
-% # -*- mode:c; style:ruby; coding: utf-8; indent-tabs-mode: nil -*-
-% # 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.
-%
-% to_cstr = lambda do |line|
-%   normalized = line.gsub(/\t/, ' ' * 8)
-%   indented = normalized.sub(/\A(?!#)/, '    ') # avoid indenting preprocessor
-%   rstring2cstr(indented.rstrip).sub(/"\z/, '\\n"')
-% end
-%
-% # Special macro expansion for ones that can't be resolved by macro redefinition.
-% if line =~ /\A\s+DISPATCH_ORIGINAL_INSN\((?<insn_name>[^)]+)\);\s+\z/
-        fprintf(f, "            return Qundef; /* cancel JIT */\n");
-% elsif line =~ /\A\s+JUMP\((?<dest>[^)]+)\);\s+\z/
-%   # Before we `goto` next insn, we need to set return values, especially for getinlinecache
-%   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
-%
-%   dest = Regexp.last_match[:dest]
-%   if insn.name == 'opt_case_dispatch' # special case... TODO: use another macro to avoid checking name
-        {
-            struct case_dispatch_var arg;
-            arg.f = f;
-            arg.base_pos = pos + insn_len(insn);
-            arg.last_value = Qundef;
-
-            fprintf(f, "    switch (<%= dest %>) {\n");
-            st_foreach(RHASH_TBL_RAW(hash), compile_case_dispatch_each, (VALUE)&arg);
-            fprintf(f, "      case %lu:\n", else_offset);
-            fprintf(f, "        goto label_%lu;\n", arg.base_pos + else_offset);
-            fprintf(f, "    }\n");
-        }
-%   else
-        next_pos = pos + insn_len(insn) + (unsigned int)<%= dest %>;
-        fprintf(f, "            goto label_%d;\n", next_pos);
-%   end
-% elsif line =~ /\A\s+RESTORE_REGS\(\);\s+\z/ # for `leave` only
-#if OPT_CALL_THREADED_CODE
-        fprintf(f, "            rb_ec_thread_ptr(ec)->retval = val;\n");
-        fprintf(f, "            return 0;\n");
-#else
-        fprintf(f, "            return val;\n");
-#endif
-% else
-        fprintf(f, <%= to_cstr.call(line) %>);
-% end
Index: common.mk
===================================================================
--- common.mk	(revision 62383)
+++ common.mk	(revision 62384)
@@ -928,7 +928,7 @@ $(srcs_vpath)vmtc.inc: $(srcdir)/tool/ru https://github.com/ruby/ruby/blob/trunk/common.mk#L928
 $(srcs_vpath)vm.inc: $(srcdir)/tool/ruby_vm/views/vm.inc.erb
 $(srcs_vpath)mjit_compile.inc: $(srcdir)/tool/ruby_vm/views/mjit_compile.inc.erb \
   $(srcdir)/tool/ruby_vm/views/_mjit_compile_insn.erb $(srcdir)/tool/ruby_vm/views/_mjit_compile_send.erb \
-  $(srcdir)/tool/ruby_vm/views/_mjit_compile_insn_line.erb
+  $(srcdir)/tool/ruby_vm/views/_mjit_compile_insn_body.erb
 
 common-srcs: $(srcs_vpath)parse.c $(srcs_vpath)lex.c $(srcs_vpath)enc/trans/newline.c $(srcs_vpath)id.c \
 	     srcs-lib srcs-ext incs
Index: tool/ruby_vm/views/_mjit_compile_insn_body.erb
===================================================================
--- tool/ruby_vm/views/_mjit_compile_insn_body.erb	(nonexistent)
+++ tool/ruby_vm/views/_mjit_compile_insn_body.erb	(revision 62384)
@@ -0,0 +1,74 @@ https://github.com/ruby/ruby/blob/trunk/tool/ruby_vm/views/_mjit_compile_insn_body.erb#L1
+% # -*- mode:c; style:ruby; coding: utf-8; indent-tabs-mode: nil -*-
+% # 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.
+%
+% to_cstr = lambda do |line|
+%   normalized = line.gsub(/\t/, ' ' * 8)
+%   indented = normalized.sub(/\A(?!#)/, '    ') # avoid indenting preprocessor
+%   rstring2cstr(indented.rstrip).sub(/"\z/, '\\n"')
+% end
+%
+% #
+% # Expand simple macro, which doesn't require dynamic C code.
+% #
+% expand_simple_macros = lambda do |arg_expr|
+%   arg_expr.dup.tap do |expr|
+%     # For `opt_xxx`'s fallbacks.
+%     expr.gsub!(/\bDISPATCH_ORIGINAL_INSN\([^)]+\);/, 'return Qundef; /* cancel JIT */')
+%
+%     # For `leave`. We can't proceed next ISeq in the same JIT function.
+%     expr.gsub!(/^(?<indent>\s*)RESTORE_REGS\(\);\n/) do
+%       indent = Regexp.last_match[:indent]
+%       <<~RESTORE_REGS
+%         #if OPT_CALL_THREADED_CODE
+%         #{indent}rb_ec_thread_ptr(ec)->retval = val;
+%         #{indent}return 0;
+%         #else
+%         #{indent}return val;
+%         #endif
+%       RESTORE_REGS
+%     end
+%   end
+% end
+%
+% #
+% # Print a body of insn, but with macro expansion.
+% #
+% expand_simple_macros.call(insn.expr.expr).each_line do |line|
+%   #
+%   # Expand dynamic macro here (only JUMP for now)
+%   #
+%   if line =~ /\A\s+JUMP\((?<dest>[^)]+)\);\s+\z/
+%     dest = Regexp.last_match[:dest]
+%
+%     if insn.name == 'opt_case_dispatch' # special case... TODO: use another macro to avoid checking name
+        {
+            struct case_dispatch_var arg;
+            arg.f = f;
+            arg.base_pos = pos + insn_len(insn);
+            arg.last_value = Qundef;
+
+            fprintf(f, "    switch (<%= dest %>) {\n");
+            st_foreach(RHASH_TBL_RAW(hash), compile_case_dispatch_each, (VALUE)&arg);
+            fprintf(f, "      case %lu:\n", else_offset);
+            fprintf(f, "        goto label_%lu;\n", arg.base_pos + else_offset);
+            fprintf(f, "    }\n");
+        }
+%     else
+%       # Before we `goto` next insn, we need to set return values, especially for getinlinecache
+%       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
+%
+        next_pos = pos + insn_len(insn) + (unsigned int)<%= dest %>;
+        fprintf(f, "            goto label_%d;\n", next_pos);
+%     end
+%   else
+        fprintf(f, <%= to_cstr.call(line) %>);
+%   end
+% end
Index: tool/ruby_vm/views/_mjit_compile_insn.erb
===================================================================
--- tool/ruby_vm/views/_mjit_compile_insn.erb	(revision 62383)
+++ tool/ruby_vm/views/_mjit_compile_insn.erb	(revision 62384)
@@ -61,9 +61,7 @@ https://github.com/ruby/ruby/blob/trunk/tool/ruby_vm/views/_mjit_compile_insn.erb#L61
 % end
 %
 % # JIT: Print insn body in insns.def
-% insn.expr.expr.each_line do |line|
-<%= render 'mjit_compile_insn_line', locals: { line: line, insn: insn } -%>
-% end
+<%= render 'mjit_compile_insn_body', locals: { insn: insn } -%>
 %
 % # JIT: Set return values
 % unless dispatched

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]