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

ruby-changes:47520

From: nobu <ko1@a...>
Date: Tue, 22 Aug 2017 13:22:07 +0900 (JST)
Subject: [ruby-changes:47520] nobu:r59636 (trunk): tool/instruction.rb: move logics to templates

nobu	2017-08-22 13:22:01 +0900 (Tue, 22 Aug 2017)

  New Revision: 59636

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

  Log:
    tool/instruction.rb: move logics to templates

  Modified files:
    trunk/template/insns.inc.tmpl
    trunk/template/insns_info.inc.tmpl
    trunk/template/minsns.inc.tmpl
    trunk/template/optinsn.inc.tmpl
    trunk/template/optunifs.inc.tmpl
    trunk/template/vm.inc.tmpl
    trunk/template/vmtc.inc.tmpl
    trunk/tool/instruction.rb
Index: template/insns_info.inc.tmpl
===================================================================
--- template/insns_info.inc.tmpl	(revision 59635)
+++ template/insns_info.inc.tmpl	(revision 59636)
@@ -9,29 +9,39 @@ https://github.com/ruby/ruby/blob/trunk/template/insns_info.inc.tmpl#L9
   or tool/insns2vm.rb
  */
 
-<%= insn_type_chars %>
+% TYPE_CHARS.each do |t, c|
+#define <%=t%> '<%=c%>'
+% end
 
 static const char *const insn_name_info[] = {
-<%= insn_names %>
+% @insns.each do |insn|
+    "<%= insn.name %>",
+% end
 };
 
 ASSERT_VM_INSTRUCTION_SIZE(insn_name_info);
 
 static const char *const insn_operand_info[] = {
-<%= operands_info %>
+% @insns.each do |insn|
+    "<% insn.opes.each {|type, _| %><%=TYPE_CHARS.fetch(op2typesig(type))%><%}%>",
+% end
 };
 
 ASSERT_VM_INSTRUCTION_SIZE(insn_operand_info);
 
 static const int insn_len_info[] = {
-<%= operands_num_info %>
+% @insns.each do |insn|
+    <%= insn.opes.size + 1 %>,
+% end
 };
 
 ASSERT_VM_INSTRUCTION_SIZE(insn_len_info);
 
 #ifdef USE_INSN_RET_NUM
 static const int insn_stack_push_num_info[] = {
-<%= stack_num_info %>
+% @insns.each do |insn|
+    <%= insn.rets.size %>,
+% end
 };
 
 ASSERT_VM_INSTRUCTION_SIZE(insn_stack_push_num_info);
@@ -41,12 +51,16 @@ ASSERT_VM_INSTRUCTION_SIZE(insn_stack_pu https://github.com/ruby/ruby/blob/trunk/template/insns_info.inc.tmpl#L51
 static int
 insn_stack_increase(int depth, int insn, VALUE *opes)
 {
-  switch(insn){
-<%= stack_increase %>
-  default:
-    rb_bug("insn_sp_increase: unreachable");
-  }
-  return 0;
+    switch (insn) {
+% @insns.each do |insn|
+      case BIN(<%= insn.name %>): {
+	<%= insn.sp_increase_c_expr %>
+      }
+% end
+      default:
+	rb_bug("insn_sp_increase: unreachable");
+    }
+    return 0;
 }
 #endif
 
@@ -55,37 +69,37 @@ insn_stack_increase(int depth, int insn, https://github.com/ruby/ruby/blob/trunk/template/insns_info.inc.tmpl#L69
 static int
 insn_len(VALUE insn)
 {
-  return insn_len_info[(int)insn];
+    return insn_len_info[(int)insn];
 }
 
 static const char *
 insn_name(VALUE insn)
 {
-  return insn_name_info[(int)insn];
+    return insn_name_info[(int)insn];
 }
 
 static const char *
 insn_op_types(VALUE insn)
 {
-  return insn_operand_info[(int)insn];
+    return insn_operand_info[(int)insn];
 }
 
 static int
 insn_op_type(VALUE insn, long pos)
 {
-  int len = insn_len(insn) - 1;
-  if(pos < len){
-    return insn_operand_info[(int)insn][pos];
-  }
-  else{
-    return 0;
-  }
+    int len = insn_len(insn) - 1;
+    if (pos < len) {
+	return insn_operand_info[(int)insn][pos];
+    }
+    else{
+	return 0;
+    }
 }
 
 #ifdef USE_INSN_RET_NUM
 static int
 insn_ret_num(VALUE insn)
 {
-  return insn_stack_push_num_info[(int)insn];
+    return insn_stack_push_num_info[(int)insn];
 }
 #endif
Index: template/optunifs.inc.tmpl
===================================================================
--- template/optunifs.inc.tmpl	(revision 59635)
+++ template/optunifs.inc.tmpl	(revision 59636)
@@ -27,9 +27,40 @@ https://github.com/ruby/ruby/blob/trunk/template/optunifs.inc.tmpl#L27
     UNIFIED_insn_nameB, ...};
  */
 
-<%= unif_insns_each %>
-<%= unif_insns      %>
-<%= unif_insns_data %>
+% unif_insns_data = @insns.find_all {|insn| !insn.is_sc}.map do |insn|
+%   size = insn.unifs.size
+%   if size > 0
+%     name = "UNIFIED_#{insn.name}"
+%     insn.unifs.sort_by{|unif| -unif[1].size}.each_with_index do |(uni_insn, uni_insns), i|
+%       uni_insns = uni_insns[1..-1]
+static const int <%=name%>_<%=i%>[] = {
+    BIN(<%=uni_insn.name%>), <%=uni_insns.size + 2%>,
+    <% uni_insns.map{|e| -%>
+BIN(<%=e.name%>),<% -%>
+% }
+
+};
+%     end
+
+static const int *const <%=name%>[] = {(int *)<%=size+1%>,
+%     size.times do |e|
+    <%=name%>_<%=e%>,
+%     end
+};
+%     name
+%   end
+% end
+
+static const int *const *const unified_insns_data[] = {<%#-%>
+% unif_insns_data.each_with_index do |insn, i|
+%   if (i%8).zero?
+
+   <% -%>
+%   end
+ <%=insn || "0"%>,<%#-%>
+% end
+
+};
 
 #undef GET_INSN_NAME
 
Index: template/minsns.inc.tmpl
===================================================================
--- template/minsns.inc.tmpl	(revision 59635)
+++ template/minsns.inc.tmpl	(revision 59636)
@@ -9,6 +9,6 @@ https://github.com/ruby/ruby/blob/trunk/template/minsns.inc.tmpl#L9
   or tool/insns2vm.rb
  */
 
-<%= defs %>
-
-
+% @insns.each_with_index do |insn, i|
+    rb_define_const(mYarvInsns, "I<%=insn.name%>", INT2FIX(<%=i%>));
+% end
Index: template/vmtc.inc.tmpl
===================================================================
--- template/vmtc.inc.tmpl	(revision 59635)
+++ template/vmtc.inc.tmpl	(revision 59636)
@@ -13,7 +13,9 @@ https://github.com/ruby/ruby/blob/trunk/template/vmtc.inc.tmpl#L13
  */
 
 static const void *const insns_address_table[] = {
-<%= insns_table %>
+% @insns.each do |insn|
+    LABEL_PTR(<%=insn.name%>),
+% end
 };
 
 ASSERT_VM_INSTRUCTION_SIZE(insns_address_table);
Index: template/vm.inc.tmpl
===================================================================
--- template/vm.inc.tmpl	(revision 59635)
+++ template/vm.inc.tmpl	(revision 59636)
@@ -11,19 +11,23 @@ https://github.com/ruby/ruby/blob/trunk/template/vm.inc.tmpl#L11
   If you want to fix something, you must edit 'insns.def'
  */
 
-<%=
-line = 15
-vm_body.gsub(/\n|__CURRENT_LINE__|__CURRENT_FILE__/){
-  e = $&
+
+% line = _erbout.count("\n") + 1
+% @insns.each do |insn|
+<%
+line += 1
+make_insn_def(insn).split(/(__CURRENT_LINE__|__CURRENT_FILE__)/).each {|e|
+  %><%=
   case e
   when '__CURRENT_LINE__'
     line.to_s
   when '__CURRENT_FILE__'
     "vm.inc"
   else
-    line += 1
+    line += e.count("\n")
     e
   end
+  %><%
 }
 %>
-
+% end
Index: template/optinsn.inc.tmpl
===================================================================
--- template/optinsn.inc.tmpl	(revision 59635)
+++ template/optinsn.inc.tmpl	(revision 59636)
@@ -13,18 +13,42 @@ https://github.com/ruby/ruby/blob/trunk/template/optinsn.inc.tmpl#L13
  */
 
 static INSN *
-insn_operands_unification(INSN *insnobj){
+insn_operands_unification(INSN *insnobj)
+{
 #ifdef OPT_OPERANDS_UNIFICATION
-  /* optimize rule */
-  switch(insnobj->insn_id){
+    /* optimize rule */
+    switch(insnobj->insn_id){
+%     opt_insns_map.each do |originsn, optinsns|
+      case BIN(<%=originsn.name%>):
+%       optinsns.each {|opti|
+	if (
+%         opti.defopes.each_with_index {|opinfo, i|
+%           next if opinfo[1] == '*'
+	    insnobj->operands[<%=i%>] == <%=val_as_type(opinfo)%> &&
+%         }
+	    1) {
+%         idx = 0
+%         opti.defopes.each_with_index {|opinfo, n|
+%           if opinfo[1] == '*'
+%             if idx != n
+	    insnobj->operands[<%=idx%>] = insnobj->operands[<%=n%>];
+%             end
+%             idx += 1
+%           end
+% 	  }
+	    insnobj->insn_id = BIN(<%=opti.name%>);
+	    insnobj->operand_size = <%=idx%>;
+	    break;
+	}
+%       }
+	break;
+%     end
 
-<%= rule %>
-
-  default:
-    /* do nothing */;
-    break;
-  }
+      default:
+	/* do nothing */;
+	break;
+    }
 #endif
-  return insnobj;
+    return insnobj;
 }
 
Index: template/insns.inc.tmpl
===================================================================
--- template/insns.inc.tmpl	(revision 59635)
+++ template/insns.inc.tmpl	(revision 59636)
@@ -14,8 +14,10 @@ https://github.com/ruby/ruby/blob/trunk/template/insns.inc.tmpl#L14
 #define BIN(n) YARVINSN_##n
 
 enum ruby_vminsn_type {
-<%= insns %>
-  VM_INSTRUCTION_SIZE            = <%= @insns.size %>
+% @insns.each do |insn|
+    BIN(<%=insn.name%>),
+% end
+    VM_INSTRUCTION_SIZE
 };
 
 #define ASSERT_VM_INSTRUCTION_SIZE(array) \
Index: tool/instruction.rb
===================================================================
--- tool/instruction.rb	(revision 59635)
+++ tool/instruction.rb	(revision 59636)
@@ -648,6 +648,10 @@ class RubyVM https://github.com/ruby/ruby/blob/trunk/tool/instruction.rb#L648
       @insns.use_const?
     end
 
+    def template(name)
+      ERB.new(vpath.read("template/#{name}"), nil, '%-')
+    end
+
     def build_string
       @lines = []
       yield
@@ -676,13 +680,7 @@ class RubyVM https://github.com/ruby/ruby/blob/trunk/tool/instruction.rb#L680
   class VmBodyGenerator < SourceCodeGenerator
     # vm.inc
     def generate
-      vm_body = ''
-      @insns.each{|insn|
-        vm_body << "\n"
-        vm_body << make_insn_def(insn)
-      }
-      src = vpath.read('template/vm.inc.tmpl')
-      ERB.new(src).result(binding)
+      template('vm.inc.tmpl').result(binding)
     end
 
     def generate_from_insnname insnname
@@ -912,20 +910,7 @@ class RubyVM https://github.com/ruby/ruby/blob/trunk/tool/instruction.rb#L910
   # vmtc.inc
   class VmTCIncGenerator < SourceCodeGenerator
     def generate
-
-      insns_table = build_string do
-        @insns.each{|insn|
-          commit "  LABEL_PTR(#{insn.name}),"
-        }
-      end
-
-      insn_end_table = build_string do
-        @insns.each{|insn|
-          commit "  ELABEL_PTR(#{insn.name}),\n"
-        }
-      end
-
-      ERB.new(vpath.read('template/vmtc.inc.tmpl')).result(binding)
+      template('vmtc.inc.tmpl').result(binding)
     end
   end
 
@@ -933,7 +918,7 @@ class RubyVM https://github.com/ruby/ruby/blob/trunk/tool/instruction.rb#L918
   # insns_info.inc
   class InsnsInfoIncGenerator < SourceCodeGenerator
     def generate
-      insns_info_inc
+      template('insns_info.inc.tmpl').result(binding)
     end
 
     ###
@@ -988,52 +973,14 @@ class RubyVM https://github.com/ruby/ruby/blob/trunk/tool/instruction.rb#L973
       'TS_FUNCPTR'   => 'F',
     }
 
-    # insns_info.inc
-    def insns_info_inc
-      # insn_type_chars
-      insn_type_chars = TYPE_CHARS.map{|t, c|
-        "#define #{t} '#{c}'"
-      }.join("\n")
-
-      # insn_names
-      insn_names = ''
-      @insns.each{|insn|
-        insn_names << "  \"#{insn.name}\",\n"
-      }
-
-      # operands info
-      operands_info = ''
-      operands_num_info = ''
-
-      @insns.each{|insn|
-        opes = insn.opes
-        operands_info << '  '
-        ot = opes.map{|type, var|
-          TYPE_CHARS.fetch(op2typesig(type))
-        }
-        operands_info << "\"#{ot.join}\"" << ",\n"
-
-        num = opes.size + 1
-        operands_num_info << "  #{num},\n"
-      }
-
-      # stack num
-      stack_num_info = ''
-      @insns.each{|insn|
-        num = insn.rets.size
-        stack_num_info << "  #{num},\n"
-      }
-
-      # stack increase
-      stack_increase = ''
-      @insns.each{|insn|
-        stack_increase << <<-EOS
-        case BIN(#{insn.name}):{
-          #{insn.sp_increase_c_expr}
-        }
-        EOS
-      }
-      ERB.new(vpath.read('template/insns_info.inc.tmpl')).result(binding)
+    def max_length(array)
+      max = 0
+      array.each do |i|
+        if (n = i.length) > max
+          max = n
+        end
+      end
+      max
     end
   end
 
@@ -1041,15 +988,7 @@ class RubyVM https://github.com/ruby/ruby/blob/trunk/tool/instruction.rb#L988
   # insns.inc
   class InsnsIncGenerator < SourceCodeGenerator
     def generate
-      i=0
-      insns = build_string do
-        @insns.each{|insn|
-          commit "  %-30s = %d," % ["BIN(#{insn.name})", i]
-          i+=1
-        }
-      end
-
-      ERB.new(vpath.read('template/insns.inc.tmpl')).result(binding)
+      template('insns.inc.tmpl').result(binding)
     end
   end
 
@@ -1057,15 +996,7 @@ class RubyVM https://github.com/ruby/ruby/blob/trunk/tool/instruction.rb#L996
   # minsns.inc
   class MInsnsIncGenerator < SourceCodeGenerator
     def generate
-      i=0
-      defs = build_string do
-        @insns.each{|insn|
-          commit "  rb_define_const(mYarvInsns, %-30s, INT2FIX(%d));" %
-                 ["\"I#{insn.name}\"", i]
-          i+=1
-        }
-      end
-      ERB.new(vpath.read('template/minsns.inc.tmpl')).result(binding)
+      template('minsns.inc.tmpl').result(binding)
     end
   end
 
@@ -1103,8 +1034,7 @@ class RubyVM https://github.com/ruby/ruby/blob/trunk/tool/instruction.rb#L1034
 
     # optinsn.inc
     def optinsn_inc
-      rule = ''
-      opt_insns_map = Hash.new{|h, k| h[k] = []}
+      opt_insns_map = Hash.new{[]}
 
       @insns.each{|insn|
         next if insn.defopes.size == 0
@@ -1112,46 +1042,17 @@ class RubyVM https://github.com/ruby/ruby/blob/trunk/tool/instruction.rb#L1042
         next if /^UNIFIED/ =~ insn.name.to_s
 
         originsn = insn.orig
-        opt_insns_map[originsn] << insn
+        opt_insns_map[originsn] <<= insn
       }
 
-      rule = build_string do
-        opt_insns_map.each{|originsn, optinsns|
-          commit "case BIN(#{originsn.name}):"
-
-          optinsns.sort_by{|opti|
-            opti.defopes.find_all{|e| e[1] == '*'}.size
-          }.each{|opti|
-            commit "  if("
-            i = 0
-            commit "    " + opti.defopes.map{|opinfo|
-              i += 1
-              next if opinfo[1] == '*'
-              "insnobj->operands[#{i-1}] == #{val_as_type(opinfo)}"
-            }.compact.join('&&  ')
-            commit "  ){"
-            idx = 0
-            n = 0
-            opti.defopes.each{|opinfo|
-              if opinfo[1] == '*'
-                if idx != n
-                  commit "    insnobj->operands[#{idx}] = insnobj->operands[#{n}];"
-                end
-                idx += 1
-              else
-                # skip
-              end
-              n += 1
-            }
-            commit "    insnobj->insn_id = BIN(#{opti.name});"
-            commit "    insnobj->operand_size = #{idx};"
-            commit "    break;\n  }\n"
-          }
-          commit "  break;";
+      opt_insns_map.each_value do |optinsns|
+        sorted = optinsns.sort_by {|opti|
+          opti.defopes.find_all{|e| e[1] == '*'}.size
         }
+        optinsns.replace(sorted)
       end
 
-      ERB.new(vpath.read('template/optinsn.inc.tmpl')).result(binding)
+      template('optinsn.inc.tmpl').result(binding)
     end
   end
 
@@ -1159,36 +1060,7 @@ class RubyVM https://github.com/ruby/ruby/blob/trunk/tool/instruction.rb#L1060
   # optunifs.inc
   class OptUnifsIncGenerator < SourceCodeGenerator
     def generate
-      unif_insns_each = ''
-      unif_insns      = ''
-      unif_insns_data = []
-
-      insns = @insns.find_all{|insn| !insn.is_sc}
-      insns.each{|insn|
-        size = insn.unifs.size
-        if size > 0
-          insn.unifs.sort_by{|unif| -unif[1].size}.each_with_index{|unif, i|
-
-          uni_insn, uni_insns = *unif
-          uni_insns = uni_insns[1..-1]
-          unif_insns_each << "static const int UNIFIED_#{insn.name}_#{i}[] = {" +
-                             "  BIN(#{uni_insn.name}), #{uni_insns.size + 2},\n  " +
-                             uni_insns.map{|e| "BIN(#{e.name})"}.join(", ") + "};\n"
-          }
-        else
-
-        end
-        if size > 0
-          unif_insns << "static const int *const UNIFIED_#{insn.name}[] = {(int *)#{size+1},\n"
-          unif_insns << (0...size).map{|e| "  UNIFIED_#{insn.name}_#{e}"}.join(",\n") + "};\n"
-          unif_insns_data << "  UNIFIED_#{insn.name}"
-        else
-          unif_insns_data << "  0"
-        end
-      }
-      unif_insns_data = "static const int *const *const unified_insns_data[] = {\n" +
-                        unif_insns_data.join(",\n") + "};\n"
-      ERB.new(vpath.read('template/optunifs.inc.tmpl')).result(binding)
+      template('optunifs.inc.tmpl').result(binding)
     end
   end
 
@@ -1212,7 +1084,7 @@ class RubyVM https://github.com/ruby/ruby/blob/trunk/tool/instruction.rb#L1084
         "  SCS_#{InstructionsLoader.complement_name(insn.nextsc).upcase}" +
         (verbose? ? " /* #{insn.name} */" : '')
       }.join(",\n")
-      ERB.new(vpath.read('template/opt_sc.inc.tmpl')).result(binding)
+      template('opt_sc.inc.tmpl').result(binding)
     end
   end
 
@@ -1224,7 +1096,7 @@ class RubyVM https://github.com/ruby/ruby/blob/trunk/tool/instruction.rb#L1096
       @insns.each_with_index{|insn, i|
         insn_id2no << "        :#{insn.name} => #{i},\n"
       }
-      ERB.new(vpath.read('template/yasmdata.rb.tmpl')).result(binding)
+      template('yasmdata.rb').result(binding)
     end
   end
 
@@ -1251,8 +1123,8 @@ class RubyVM https://github.com/ruby/ruby/blob/trunk/tool/instruction.rb#L1123
 
         d << "*** #{insn.name}\n"
         d << "\n"
-        d << insn.comm[lang] + "\n\n"
-        d << ":instruction sequence: 0x%02x #{seq}\n" % i
+        d << insn.comm[lang] << "\n\n"
+        d << ":instruction sequence: 0x%02x " % i << seq << "\n"
         d << ":stack: #{before} => #{after}\n\n"
         i+=1
       }
@@ -1261,12 +1133,12 @@ class RubyVM https://github.com/ruby/ruby/blob/trunk/tool/instruction.rb#L1133
 
     def desc_ja
       d = desc :j
-      ERB.new(vpath.read('template/yarvarch.ja')).result(binding)
+      template('yarvarch.ja').result(binding)
     end
 
     def desc_en
       d = desc :e
-      ERB.new(vpath.read('template/yarvarch.en')).result(binding)
+      template('yarvarch.en').result(binding)
     end
   end
 

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

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