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

ruby-changes:62202

From: =E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3 <ko1@a...>
Date: Mon, 13 Jul 2020 08:56:47 +0900 (JST)
Subject: [ruby-changes:62202] 7e536b3be2 (master): builtin.h: avoid copy&paste

https://git.ruby-lang.org/ruby.git/commit/?id=7e536b3be2

From 7e536b3be26ae48738a036a58be8dfa380bd21da Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3?=
 <shyouhei@r...>
Date: Sun, 12 Jul 2020 14:53:54 +0900
Subject: builtin.h: avoid copy&paste

Instead of doubling the invokebuiltin logic here and there, use the same
insns.def definition for both MJIT/non-JIT situations.

diff --git a/builtin.h b/builtin.h
index be7bb16..0da200f 100644
--- a/builtin.h
+++ b/builtin.h
@@ -80,20 +80,4 @@ struct builtin_binary { https://github.com/ruby/ruby/blob/trunk/builtin.h#L80
     size_t bin_size;
 };
 
-// mjit
-
-RBIMPL_ATTR_MAYBE_UNUSED()
-static void
-mjit_invokebuiltin_default_compiler(FILE *f, const struct rb_builtin_function *bf, long index)
-{
-    if (index >= 0) {
-        fprintf(f, "val = vm_invoke_builtin(ec, GET_CFP(), %p, STACK_ADDR_FROM_TOP(%d));\n",
-                (const void *)bf, bf->argc);
-    }
-    else {
-        fprintf(f, "val = vm_invoke_builtin_delegate(ec, GET_CFP(), %p, %ld);\n",
-                (const void *)bf, index);
-    }
-}
-
 #endif // BUILTIN_H_INCLUDED
diff --git a/tool/ruby_vm/views/_mjit_compile_insn_body.erb b/tool/ruby_vm/views/_mjit_compile_insn_body.erb
index eb0f848..bc77b02 100644
--- a/tool/ruby_vm/views/_mjit_compile_insn_body.erb
+++ b/tool/ruby_vm/views/_mjit_compile_insn_body.erb
@@ -63,10 +63,6 @@ https://github.com/ruby/ruby/blob/trunk/tool/ruby_vm/views/_mjit_compile_insn_body.erb#L63
             fprintf(f, "        goto label_%lu;\n", arg.base_pos + else_offset);
             fprintf(f, "    }\n");
         }
-%     elsif insn.name == 'invokebuiltin' || insn.name == 'opt_invokebuiltin_delegate'
-        {
-<%=   render 'mjit_compile_invokebuiltin', locals: { insn: insn } -%>
-        }
 %     else
 %       # Before we `goto` next insn, we need to set return values, especially for getinlinecache
 %       insn.rets.reverse_each.with_index do |ret, i|
diff --git a/tool/ruby_vm/views/_mjit_compile_invokebuiltin.erb b/tool/ruby_vm/views/_mjit_compile_invokebuiltin.erb
index f935f79..a95a8a7 100644
--- a/tool/ruby_vm/views/_mjit_compile_invokebuiltin.erb
+++ b/tool/ruby_vm/views/_mjit_compile_invokebuiltin.erb
@@ -6,18 +6,24 @@ https://github.com/ruby/ruby/blob/trunk/tool/ruby_vm/views/_mjit_compile_invokebuiltin.erb#L6
 % # conditions mentioned  in the  file COPYING  are met.   Consult the  file for
 % # details.
 %
-    /* <%= insn.name %> */
-    const struct rb_builtin_function *bf = (const void *)operands[0];
-%
-% if insn.name == 'invokebuiltin' then
-    const rb_num_t index = -1;
-% else
-    const rb_num_t index = (rb_num_t)operands[1];
+% insn.opes.each_with_index do |ope, i|
+        <%= ope.fetch(:decl) %> = (<%= ope.fetch(:type) %>)operands[<%= i %>];
 % end
-%
-    if (bf->compiler) {
-        bf->compiler(f, index);
-    }
-    else {
-        mjit_invokebuiltin_default_compiler(f, bf, index);
-    }
+        rb_snum_t sp_inc = <%= insn.call_attribute('sp_inc') %>;
+        unsigned sp = b->stack_size + (unsigned)sp_inc;
+        VM_ASSERT(sp_inc >= 0);
+        VM_ASSERT(sp_inc < UINT_MAX - b->stack_size);
+
+        if (bf->compiler) {
+            fprintf(f, "{\n");
+            fprintf(f, "    VALUE val;\n");
+            bf->compiler(f, <%=
+                insn.name == 'invokebuiltin' ? '-1' : '(rb_num_t)operands[1]'
+            %>);
+            fprintf(f, "    stack[%u] = val;\n", sp - 1);
+            fprintf(f, "}\n");
+% if insn.name != 'opt_invokebuiltin_delegate_leave'
+            b->stack_size = sp;
+            break;
+% end
+        }
diff --git a/tool/ruby_vm/views/mjit_compile.inc.erb b/tool/ruby_vm/views/mjit_compile.inc.erb
index e3be549..6836d59 100644
--- a/tool/ruby_vm/views/mjit_compile.inc.erb
+++ b/tool/ruby_vm/views/mjit_compile.inc.erb
@@ -63,15 +63,15 @@ switch (insn) { https://github.com/ruby/ruby/blob/trunk/tool/ruby_vm/views/mjit_compile.inc.erb#L63
       }
 %   when 'getinstancevariable', 'setinstancevariable'
 <%=   render 'mjit_compile_ivar', locals: { insn: insn } -%>
+%   when 'invokebuiltin', 'opt_invokebuiltin_delegate'
+    {
+<%=   render 'mjit_compile_invokebuiltin', locals: { insn: insn } -%>
+    }
 %   when 'leave', 'opt_invokebuiltin_delegate_leave'
     {
 %     # opt_invokebuiltin_delegate_leave also implements leave insn. We need to handle it here for inlining.
 %     if insn.name == 'opt_invokebuiltin_delegate_leave'
-      fprintf(f, "{\n");
-      fprintf(f, "    VALUE val;\n");
 <%=   render 'mjit_compile_invokebuiltin', locals: { insn: insn } -%>
-      fprintf(f, "    stack[0] = val;\n");
-      fprintf(f, "}\n");
 %     else
       if (b->stack_size != 1) {
           if (mjit_opts.warnings || mjit_opts.verbose)
-- 
cgit v0.10.2


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

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