[前][次][番号順一覧][スレッド一覧][生データ]

yarv-diff:37

From: ko1 atdot.net
Date: 1 Jul 2005 18:00:18 -0000
Subject: [yarv-diff:37] r192 - trunk

Author: ko1
Date: 2005-07-02 03:00:17 +0900 (Sat, 02 Jul 2005)
New Revision: 192

Modified:
   trunk/ChangeLog
   trunk/compile.c
   trunk/compile.h
   trunk/insns.def
   trunk/test.rb
Log:
	* compile.c : move specialized instruction point (new_insn_send)

	* insns.def : add opt_aref, opt_aset



Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2005-07-01 02:08:17 UTC (rev 191)
+++ trunk/ChangeLog	2005-07-01 18:00:17 UTC (rev 192)
@@ -4,6 +4,13 @@
 #  from Mon, 03 May 2004 01:24:19 +0900
 #
 
+2005-07-02(Sat) 02:56:31 +0900  Koichi Sasada  <ko1 atdot.net>
+
+	* compile.c : move specialized instruction point (new_insn_send)
+
+	* insns.def : add opt_aref, opt_aset
+
+
 2005-07-01(Fri) 11:04:11 +0900  Koichi Sasada  <ko1 atdot.net>
 
 	* compile.h : fix to pass VALUE type to new_insn_body

Modified: trunk/compile.c
===================================================================
--- trunk/compile.c	2005-07-01 02:08:17 UTC (rev 191)
+++ trunk/compile.c	2005-07-01 18:00:17 UTC (rev 192)
@@ -488,6 +488,52 @@
   return new_insn_core(iseqobj, line_no, insn_id, argc, operands);
 }
 
+static struct insn_object *new_insn_send(struct iseq_object *iseqobj, int line_no,
+                                         VALUE id, VALUE argc, VALUE block, VALUE flag){
+  INSN_OBJECT *iobj = 0;
+#ifdef OPT_BASIC_OPERATIONS
+  if(block == 0 && flag == I2F(0)){
+    ID mid = SYM2ID(id);
+
+    if(argc == I2F(1)){
+      if(mid == idPLUS){
+        iobj = new_insn_body(iseqobj, line_no, BIN(opt_plus), 0);
+      }
+      else if(mid == idMINUS){
+        iobj = new_insn_body(iseqobj, line_no, BIN(opt_minus), 0);
+      }
+      else if(mid == idMULT){
+        iobj = new_insn_body(iseqobj, line_no, BIN(opt_mult), 0);
+      }
+      else if(mid == idLT){
+        iobj = new_insn_body(iseqobj, line_no, BIN(opt_lt), 0);
+      }
+      else if(mid == idLTLT){
+        iobj = new_insn_body(iseqobj, line_no, BIN(opt_ltlt), 0);
+      }
+      else if(mid == idAREF){
+        iobj = new_insn_body(iseqobj, line_no, BIN(opt_aref), 0);
+      }
+    }
+    else if(argc == I2F(2)){
+      if(mid == idASET){
+        iobj = new_insn_body(iseqobj, line_no, BIN(opt_aset), 0);
+      }
+    }
+  }
+#endif
+  if(iobj == 0){
+    VALUE *operands = (VALUE *)compile_data_alloc(iseqobj, sizeof(VALUE) * 5);
+    operands[0] = id;
+    operands[1] = argc;
+    operands[2] = block;
+    operands[3] = flag;
+    operands[4] = 0;
+    iobj = new_insn_core(iseqobj, line_no, BIN(send), 5, operands);
+  }
+  return iobj;
+}
+
 static VALUE new_child_iseq(VALUE self, struct iseq_object *iseqobj,
                             NODE *node, VALUE name, VALUE parent, VALUE type){
   VALUE args[5];
@@ -2635,51 +2681,6 @@
       }
     }
 
-    
-    /* optimize */
-    /*
-      fib(32)
-      ruby:           24.95
-      yarv/dt/no opt: 16.08
-      yarv/dt/opt:     7.35
-      yarv/no opt:    16.50
-      yarv/opt:        8.00
-      */
-
-#ifdef OPT_BASIC_OPERATIONS
-    if(parent_block == 0 && flag == 0){
-      /* no block given */
-      if((argc == I2F(1)) && (type == NODE_CALL) && 1){
-        if(node->nd_mid == idPLUS){
-          ADD_INSN(ret, nd_line(node), opt_plus);
-        }
-        else if(node->nd_mid == idMINUS){
-          ADD_INSN(ret, nd_line(node), opt_minus);
-        }
-        else if(node->nd_mid == idMULT){
-          ADD_INSN(ret, nd_line(node), opt_mult);
-        }
-        else if(node->nd_mid == idLT){
-          ADD_INSN(ret, nd_line(node), opt_lt);
-        }
-        else if(node->nd_mid == idLTLT){
-          ADD_INSN(ret, nd_line(node), opt_ltlt);
-        }
-        else{
-          goto normal_call;
-        }
-
-        if(poped){
-          ADD_INSN(ret, nd_line(node), pop);
-        }
-        break;
-      }
-    }
-#endif
-
-  normal_call:
-    
-    /* */
     debugp_param("call args argc", argc);
     debugp_param("call method",    ID2SYM(node->nd_mid));
     

Modified: trunk/compile.h
===================================================================
--- trunk/compile.h	2005-07-01 02:08:17 UTC (rev 191)
+++ trunk/compile.h	2005-07-01 18:00:17 UTC (rev 192)
@@ -122,10 +122,15 @@
   ADD_LINKED_LIST(seq, (struct iseq_link_element *) \
                   new_insn_body(iseqobj, line, BIN(insn), 3, (VALUE)op1, (VALUE)op2, (VALUE)op3))
 
-#define ADD_INSN5(seq, line, insn, o1, o2, o3, o4, o5) \
+/* Specific Insn factory */
+#define ADD_SEND(seq, line, id, argc) \
+  ADD_SEND_R(seq, line, id, argc, (VALUE)Qfalse, (VALUE)I2F(0))
+
+#define ADD_SEND_R(seq, line, id, argc, block, flag) \
   ADD_LINKED_LIST(seq, (struct iseq_link_element *) \
-                  new_insn_body(iseqobj, line, BIN(insn), 5, \
-                                (VALUE)o1, (VALUE)o2, (VALUE)o3, (VALUE)o4, (VALUE)o5))
+                  new_insn_send(iseqobj, line, \
+                                (VALUE)id, (VALUE)argc, (VALUE)block, (VALUE)flag))
+
 /* add label */
 #define ADD_LABEL(seq, label) \
   ADD_LINKED_LIST(seq, (struct iseq_link_element *)label)
@@ -140,16 +145,6 @@
    rb_ary_push(tmp, (VALUE) lc | 1),                \
    rb_ary_push(iseqobj->catch_table_ary, tmp))
 
-
-/* Specific Insn factory */
-
-#define ADD_SEND(seq, line, id, argc) \
-  ADD_SEND_R(seq, line, id, argc, (VALUE)Qfalse, (VALUE)I2F(0))
-
-#define ADD_SEND_R(seq, line, id, argc, block, flag) \
-  ADD_INSN5(seq, line, send, id, argc, block, flag, 0);
-
-
 /* compile node */
 #define COMPILE(anchor, desc, node) \
   (debug_compile("== " desc "\n", \

Modified: trunk/insns.def
===================================================================
--- trunk/insns.def	2005-07-01 02:08:17 UTC (rev 191)
+++ trunk/insns.def	2005-07-01 18:00:17 UTC (rev 192)
@@ -2010,6 +2010,80 @@
 
 /**
   @c optimize
+  @e []
+  @j []
+ */
+DEFINE_INSN
+opt_aref
+()
+(VALUE recv, VALUE obj)
+(VALUE val)
+{
+  if(!SPECIAL_CONST_P(recv)){
+    if(HEAP_CLASS_OF(recv) == rb_cArray &&
+       FIXNUM_P(obj)){
+      val = rb_ary_entry(recv, FIX2LONG(obj));
+    }
+    else if(HEAP_CLASS_OF(recv) == rb_cHash){
+      val = rb_hash_aref(recv, obj);
+    }
+    else{
+      goto INSN_LABEL(normal_dispatch);
+    }
+  }
+  else{
+  INSN_LABEL(normal_dispatch):
+    /* other */
+#ifdef YARV_AOT_COMPILED
+    val = rb_funcall(recv, idAREF, 1, obj);
+#else
+    PUSH(recv); PUSH(obj);
+    tmp_id = idAREF;
+    goto LABEL_IS_SC(start_init_in_send_for_opt_1);
+#endif
+  }
+}
+
+/**
+  @c optimize
+  @e recv[obj] = set
+  @j recv[obj] = set
+ */
+DEFINE_INSN
+opt_aset
+()
+(VALUE recv, VALUE obj, VALUE set)
+(VALUE val)
+{
+  if(!SPECIAL_CONST_P(recv)){
+    if(HEAP_CLASS_OF(recv) == rb_cArray &&
+       FIXNUM_P(obj)){
+      rb_ary_store(recv, FIX2LONG(obj), set);
+      val = set;
+    }
+    else if(HEAP_CLASS_OF(recv) == rb_cHash){
+      rb_hash_aset(recv, obj, set);
+      val = set;
+    }
+    else{
+      goto INSN_LABEL(normal_dispatch);
+    }
+  }
+  else{
+  INSN_LABEL(normal_dispatch):
+    /* other */
+#ifdef YARV_AOT_COMPILED
+    val = rb_funcall(recv, idAREF, 1, obj);
+#else
+    PUSH(recv); PUSH(obj);
+    tmp_id = idAREF;
+    goto LABEL_IS_SC(start_init_in_send_for_opt_1);
+#endif
+  }
+}
+
+/**
+  @c optimize
   @e optimized regexp match
   @j KK\}b`
  */

Modified: trunk/test.rb
===================================================================
--- trunk/test.rb	2005-07-01 02:08:17 UTC (rev 191)
+++ trunk/test.rb	2005-07-01 18:00:17 UTC (rev 192)
@@ -8,181 +8,9 @@
 $line = __LINE__ + 3
 ###########################################################
 $prog =<<'__EOP__'
+a = [0]
+a[0] = 1
 
-sum = 0
-for x in [1, 2, 3]
-  sum += x
-end
-sum
-
-__END__
-10000000.times{|i|
-  "hoge" + "huga" + "hage"
-}
-
-__END__
-p
-p 1
-p 1,2
-p 1,2,3
-
-__END__
-
-[1,2] + [3,4]
-
-__END__
-def iter
-  yield 10,20
-end
-
-iter{|$a,b|
-  p $a
-  [$a, b]
-} + [$a, 2]
-
-__END__
-def iter
-  yield 10, 20, 30, 40
-end
-
-a = nil
-iter{|a, $b, @c, d|
-  [a, $b]
-} + [a, $b, @c]
-__END__
-def m
-end
-
-i=0
-while i<10000
-  i+=1
-  m; m; m; m; m; m; m; m; m; m
-end
-__END__
-
-#!/usr/bin/ruby
-# -*- mode: ruby -*-
-# $Id: matrix-ruby.code,v 1.4 2004/11/13 07:42:14 bfulgham Exp $
-# http://www.bagley.org/~doug/shootout/
-
-n = 3 #Integer(ARGV.shift || 1)
-
-size = 30
-
-def mkmatrix(rows, cols)
-    count = 1
-    mx = Array.new(rows)
-    (0 .. (rows - 1)).each do |bi|
-        row = Array.new(cols, 0)
-        (0 .. (cols - 1)).each do |j|
-            row[j] = count
-            count += 1
-        end
-        mx[bi] = row
-    end
-    mx
-end
-
-def mmult(rows, cols, m1, m2)
-    m3 = Array.new(rows)
-    (0 .. (rows - 1)).each do |bi|
-        row = Array.new(cols, 0)
-        (0 .. (cols - 1)).each do |j|
-            val = 0
-            (0 .. (cols - 1)).each do |k|
-                val += m1.at(bi).at(k) * m2.at(k).at(j)
-            end
-            row[j] = val
-        end
-        m3[bi] = row
-    end
-    m3
-end
-
-m1 = mkmatrix(size, size)
-m2 = mkmatrix(size, size)
-mm = Array.new
-n.times do
-    mm = mmult(size, size, m1, m2)
-end
-# puts "#{mm[0][0]} #{mm[2][3]} #{mm[3][2]} #{mm[4][4]}"
-
-
-
-__END__
-def ack(m, n)
-    if m == 0 then
-        n + 1
-    elsif n == 0 then
-        ack(m - 1, 1)
-    else
-        ack(m - 1, ack(m, n - 1))
-    end
-end
-
-NUM = 4
-ack(3, NUM)
-
-__END__
-
-def tak x, y, z
-  unless y < x
-    z
-  else
-    tak( tak(x-1, y, z),
-         tak(y-1, z, x),
-         tak(z-1, x, y))
-  end
-end
-
-tak(9, 6, 0)
-
-
-
-__END__
-
-def tarai( x, y, z )
-  if x <= y
-  then y
-  else tarai(tarai(x-1, y, z),
-             tarai(y-1, z, x),
-             tarai(z-1, x, y))
-  end
-end
-
-tarai(6, 3, 0)
-__END__
-p :a, :b
-p 1+2
-p(/a/ =~ 'b')
-
-
-__END__
-
-def m
-end
-
-i=0
-while i<1000000
-  i+=1
-  m; m; m; m; m; m; m; m; m; m
-end
-__END__
-def test(arg)
-a =  case arg
-  when 1
-    2
-  else
-    3
-  end
-  return a
-end
-
-p :miss
-test(0)
-p :hit
-test(1)
-
 __EOP__
 ###########################################################
 


--
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧][生データ]