From 7735c1f5fe4eabd97fe63d7113fc12fc25c877b7 Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 22 Aug 2017 04:22:01 +0000 Subject: tool/instruction.rb: move logics to templates git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59636 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- template/insns.inc.tmpl | 6 +++-- template/insns_info.inc.tmpl | 58 +++++++++++++++++++++++++++----------------- template/minsns.inc.tmpl | 6 ++--- template/optinsn.inc.tmpl | 44 +++++++++++++++++++++++++-------- template/optunifs.inc.tmpl | 37 +++++++++++++++++++++++++--- template/vm.inc.tmpl | 16 +++++++----- template/vmtc.inc.tmpl | 4 ++- 7 files changed, 124 insertions(+), 47 deletions(-) (limited to 'template') diff --git a/template/insns.inc.tmpl b/template/insns.inc.tmpl index 13b6cb9638..112732dce5 100644 --- a/template/insns.inc.tmpl +++ b/template/insns.inc.tmpl @@ -14,8 +14,10 @@ #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) \ diff --git a/template/insns_info.inc.tmpl b/template/insns_info.inc.tmpl index c7f0094a7a..ffbe51860e 100644 --- a/template/insns_info.inc.tmpl +++ b/template/insns_info.inc.tmpl @@ -9,29 +9,39 @@ 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_push_num_info); 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, VALUE *opes) 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 diff --git a/template/minsns.inc.tmpl b/template/minsns.inc.tmpl index 54b192898f..f32b28cb7f 100644 --- a/template/minsns.inc.tmpl +++ b/template/minsns.inc.tmpl @@ -9,6 +9,6 @@ or tool/insns2vm.rb */ -<%= defs %> - - +% @insns.each_with_index do |insn, i| + rb_define_const(mYarvInsns, "I<%=insn.name%>", INT2FIX(<%=i%>)); +% end diff --git a/template/optinsn.inc.tmpl b/template/optinsn.inc.tmpl index 3c4f732290..186ec46982 100644 --- a/template/optinsn.inc.tmpl +++ b/template/optinsn.inc.tmpl @@ -13,18 +13,42 @@ */ 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; } diff --git a/template/optunifs.inc.tmpl b/template/optunifs.inc.tmpl index 63ac4d85ca..3ac5872346 100644 --- a/template/optunifs.inc.tmpl +++ b/template/optunifs.inc.tmpl @@ -27,9 +27,40 @@ 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 diff --git a/template/vm.inc.tmpl b/template/vm.inc.tmpl index 11c6d1bcf5..14b6ba3f10 100644 --- a/template/vm.inc.tmpl +++ b/template/vm.inc.tmpl @@ -11,19 +11,23 @@ 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 diff --git a/template/vmtc.inc.tmpl b/template/vmtc.inc.tmpl index 3d9935dcaa..3c313113a5 100644 --- a/template/vmtc.inc.tmpl +++ b/template/vmtc.inc.tmpl @@ -13,7 +13,9 @@ */ 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); -- cgit v1.2.3