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

yarv-diff:48

From: ko1 atdot.net
Date: 3 Jul 2005 22:16:00 -0000
Subject: [yarv-diff:48] r203 - in trunk: . benchmark test

Author: ko1
Date: 2005-07-04 07:15:59 +0900 (Mon, 04 Jul 2005)
New Revision: 203

Modified:
   trunk/ChangeLog
   trunk/benchmark/bm_so_random.rb
   trunk/benchmark/bmx_temp.rb
   trunk/compile.c
   trunk/insns.def
   trunk/test.rb
   trunk/test/test_bin.rb
   trunk/yarvcore.c
   trunk/yarvcore.h
Log:
	* yarvcore.h. yarvcore.c : add idDIV, idMOD, idEq, idLength

	* compile.c, insns.def : add specialized insn for above method id

	* test/test_bin.rb : add tests for above



Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2005-07-03 13:32:33 UTC (rev 202)
+++ trunk/ChangeLog	2005-07-03 22:15:59 UTC (rev 203)
@@ -4,6 +4,15 @@
 #  from Mon, 03 May 2004 01:24:19 +0900
 #
 
+2005-07-04(Mon) 04:02:15 +0900  Koichi Sasada  <ko1 atdot.net>
+
+	* yarvcore.h. yarvcore.c : add idDIV, idMOD, idEq, idLength
+
+	* compile.c, insns.def : add specialized insn for above method id
+
+	* test/test_bin.rb : add tests for above
+
+
 2005-07-03(Sun) 20:31:09 +0900  Koichi Sasada  <ko1 atdot.net>
 
 	* yarvcore.c, yarvcore.h : remove cYarvThrowObject (unused)

Modified: trunk/benchmark/bm_so_random.rb
===================================================================
--- trunk/benchmark/bm_so_random.rb	2005-07-03 13:32:33 UTC (rev 202)
+++ trunk/benchmark/bm_so_random.rb	2005-07-03 22:15:59 UTC (rev 203)
@@ -1,8 +1,8 @@
 # from http://www.bagley.org/~doug/shootout/bench/random/random.ruby
 
-IM = 139968
-IA = 3877
-IC = 29573
+IM = 139968.0
+IA = 3877.0
+IC = 29573.0
 
 $last = 42.0
 

Modified: trunk/benchmark/bmx_temp.rb
===================================================================
--- trunk/benchmark/bmx_temp.rb	2005-07-03 13:32:33 UTC (rev 202)
+++ trunk/benchmark/bmx_temp.rb	2005-07-03 22:15:59 UTC (rev 203)
@@ -1,8 +1,11 @@
 def m
 end
 
+a = 'a'
+b = 'a'
+
 i=0
-while i<1000000
+while i<10000000
   i+=1
-  m; m; m; m; m; m; m; m; m; m
+  a==b
 end

Modified: trunk/compile.c
===================================================================
--- trunk/compile.c	2005-07-03 13:32:33 UTC (rev 202)
+++ trunk/compile.c	2005-07-03 22:15:59 UTC (rev 203)
@@ -534,7 +534,9 @@
     ID mid = SYM2ID(id);
 
     if(argc == I2F(1)){
-      if(mid == idPLUS){
+      if(0){
+      }
+      else if(mid == idPLUS){
         iobj = new_insn_body(iseqobj, line_no, BIN(opt_plus), 0);
       }
       else if(mid == idMINUS){
@@ -543,6 +545,15 @@
       else if(mid == idMULT){
         iobj = new_insn_body(iseqobj, line_no, BIN(opt_mult), 0);
       }
+      else if(mid == idDIV){
+        iobj = new_insn_body(iseqobj, line_no, BIN(opt_div), 0);
+      }
+      else if(mid == idMOD){
+        iobj = new_insn_body(iseqobj, line_no, BIN(opt_mod), 0);
+      }
+      else if(mid == idEq){
+        iobj = new_insn_body(iseqobj, line_no, BIN(opt_eq), 0);
+      }
       else if(mid == idLT){
         iobj = new_insn_body(iseqobj, line_no, BIN(opt_lt), 0);
       }
@@ -553,6 +564,11 @@
         iobj = new_insn_body(iseqobj, line_no, BIN(opt_aref), 0);
       }
     }
+    else if(argc == I2F(0)){
+      if(mid == idLength){
+        iobj = new_insn_body(iseqobj, line_no, BIN(opt_length), 0);
+      }
+    }
     else if(argc == I2F(2)){
       if(mid == idASET){
         iobj = new_insn_body(iseqobj, line_no, BIN(opt_aset), 0);

Modified: trunk/insns.def
===================================================================
--- trunk/insns.def	2005-07-03 13:32:33 UTC (rev 202)
+++ trunk/insns.def	2005-07-03 22:15:59 UTC (rev 203)
@@ -1146,16 +1146,20 @@
 #if CURRENT_INSN_send || CURRENT_INSN_send_SC_xx_ax
   if(0){
     if(0){
+      LABEL_IS_SC(start_init_in_send_for_opt_0):
+      num  = 0;
+      recv = TOPN(0);
+    }
+    else if(0){
       LABEL_IS_SC(start_init_in_send_for_opt_1):
-      num       = 1;
-      recv      = TOPN(1);
+      num  = 1;
+      recv = TOPN(1);
     }
     else if (0){
       LABEL_IS_SC(start_init_in_send_for_opt_2):
-      num       = 2;
-      recv      = TOPN(2);
+      num  = 2;
+      recv = TOPN(2);
     }
-    
     id        = tmp_id;
     // flag      = 0;
     klass     = CLASS_OF(recv);
@@ -1840,7 +1844,7 @@
   else if(!SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj)){
     if(0){
     }
-#if 0
+#if 1
     else if(HEAP_CLASS_OF(recv) == rb_cFloat &&
             HEAP_CLASS_OF(obj)  == rb_cFloat &&
             BASIC_OP_UNREDEFINED(FLOAT_PLUS)){
@@ -1855,6 +1859,11 @@
       val = rb_str_plus(recv, obj);
     }
 #endif
+#if 1
+    else if(HEAP_CLASS_OF(recv) == rb_cArray){
+      val = rb_ary_plus(recv, obj);
+    }
+#endif
     else{
       goto INSN_LABEL(normal_dispatch);
     }
@@ -1930,7 +1939,23 @@
       val = rb_big_mul(rb_int2big(a), rb_int2big(b));
     }
   }
+  else if(!SPECIAL_CONST_P(recv) &&
+          !SPECIAL_CONST_P(obj)){
+    if(0){
+    }
+#if 1
+    else if(HEAP_CLASS_OF(recv) == rb_cFloat &&
+            HEAP_CLASS_OF(obj)  == rb_cFloat){
+      val = rb_float_new(RFLOAT(recv)->value * RFLOAT(obj)->value);
+    }
+#endif
+    else{
+      goto INSN_LABEL(normal_dispatch);
+    }
+  }
   else{
+  INSN_LABEL(normal_dispatch):
+    
     /* other */
 #ifdef YARV_AOT_COMPILED
     val = rb_funcall(recv, idMULT, 1, obj);
@@ -1944,6 +1969,238 @@
 
 /**
   @c optimize
+  @e optimized X/Y.
+  @j K X/YB
+ */
+DEFINE_INSN
+opt_div
+()
+(VALUE recv, VALUE obj)
+(VALUE val)
+{
+  if(FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED(FIXNUM_MULT)){
+    long x, y, div;
+
+    x = FIX2LONG(recv);
+    y = FIX2LONG(obj);
+    {
+      /* copied from numeric.c#fixdivmod */
+      long mod;
+      if (y == 0) rb_num_zerodiv();
+      if (y < 0) {
+        if (x < 0)
+          div = -x / -y;
+        else
+          div = - (x / -y);
+      }
+      else {
+        if (x < 0)
+          div = - (-x / y);
+        else
+          div = x / y;
+      }
+      mod = x - div*y;
+      if ((mod < 0 && y > 0) || (mod > 0 && y < 0)) {
+        mod += y;
+        div -= 1;
+      }
+    }
+    val = LONG2FIX(div);
+  }
+  else if(!SPECIAL_CONST_P(recv) &&
+          !SPECIAL_CONST_P(obj)){
+    if(0){
+    }
+#if 1
+    else if(HEAP_CLASS_OF(recv) == rb_cFloat &&
+            HEAP_CLASS_OF(obj)  == rb_cFloat){
+      val = rb_float_new(RFLOAT(recv)->value / RFLOAT(obj)->value);
+    }
+#endif
+    else{
+      goto INSN_LABEL(normal_dispatch);
+    }
+  }
+  else{
+  INSN_LABEL(normal_dispatch):
+    
+    /* other */
+#ifdef YARV_AOT_COMPILED
+    val = rb_funcall(recv, idDIV, 1, obj);
+#else
+    PUSH(recv); PUSH(obj);
+    tmp_id = idDIV;
+    goto LABEL_IS_SC(start_init_in_send_for_opt_1);
+#endif
+  }
+}
+
+/**
+  @c optimize
+  @e optimized X%Y.
+  @j K X%YB
+ */
+DEFINE_INSN
+opt_mod
+()
+(VALUE recv, VALUE obj)
+(VALUE val)
+{
+  if(FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED(FIXNUM_MULT)){
+    long x, y, mod;
+
+    x = FIX2LONG(recv);
+    y = FIX2LONG(obj);
+    {
+      /* copied from numeric.c#fixdivmod */
+      long div;
+      
+      if (y == 0) rb_num_zerodiv();
+      if (y < 0) {
+        if (x < 0)
+          div = -x / -y;
+        else
+          div = - (x / -y);
+      }
+      else {
+        if (x < 0)
+          div = - (-x / y);
+        else
+          div = x / y;
+      }
+      mod = x - div*y;
+      if ((mod < 0 && y > 0) || (mod > 0 && y < 0)) {
+        mod += y;
+        div -= 1;
+      }
+    }
+    val = LONG2FIX(mod);
+  }
+  else if(!SPECIAL_CONST_P(recv) &&
+          !SPECIAL_CONST_P(obj)){
+    if(0){
+    }
+#if 1
+    else if(HEAP_CLASS_OF(recv) == rb_cFloat &&
+            HEAP_CLASS_OF(obj)  == rb_cFloat){
+      double x = RFLOAT(recv)->value;
+      double y = RFLOAT(obj)->value;
+      double div, mod;
+      
+      /* copied from numeric.c#flodivmod */
+#ifdef HAVE_FMOD
+      mod = fmod(x, y);
+#else
+      {
+        double z;
+
+        modf(x/y, &z);
+        mod = x - z * y;
+      }
+#endif
+      div = (x - mod) / y;
+      if (y*mod < 0) {
+        mod += y;
+        div -= 1.0;
+      }
+      val = rb_float_new(mod);
+    }
+#endif
+    else{
+      goto INSN_LABEL(normal_dispatch);
+    }
+  }
+  else{
+  INSN_LABEL(normal_dispatch):
+    
+    /* other */
+#ifdef YARV_AOT_COMPILED
+    val = rb_funcall(recv, idMOD, 1, obj);
+#else
+    PUSH(recv); PUSH(obj);
+    tmp_id = idMOD;
+    goto LABEL_IS_SC(start_init_in_send_for_opt_1);
+#endif
+  }
+}
+
+/**
+  @c optimize
+  @e optimized X==Y.
+  @j K X==YB
+ */
+DEFINE_INSN
+opt_eq
+()
+(VALUE recv, VALUE obj)
+(VALUE val)
+{
+  if(FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED(FIXNUM_LT)){
+    long a = FIX2LONG(recv), b = FIX2LONG(obj);
+    
+    if (a == b){
+      val = Qtrue;
+    }
+    else{
+      val = Qfalse;
+    }
+  }
+  else if(!SPECIAL_CONST_P(recv) &&
+          !SPECIAL_CONST_P(obj)){
+    if(0){
+    }
+    else if(HEAP_CLASS_OF(recv) == rb_cFloat &&
+            HEAP_CLASS_OF(recv) == rb_cFloat){
+      double a = RFLOAT(recv)->value;
+      double b = RFLOAT(obj)->value;
+
+      if(isnan(a) || isnan(b)){
+        val = Qfalse;
+      }
+      else if(a == b){
+        val = Qtrue;
+      }
+      else{
+        val = Qfalse;
+      }
+    }
+    else if(HEAP_CLASS_OF(recv) == rb_cString &&
+            HEAP_CLASS_OF(obj)  == rb_cString){
+      
+      VALUE str1 = recv;
+      VALUE str2 = obj;
+      if (str1 == str2){
+        val = Qtrue;
+      }
+      else if(RSTRING(str1)->len == RSTRING(str2)->len &&
+         rb_memcmp(RSTRING(str1)->ptr, RSTRING(str2)->ptr,
+                   RSTRING(str1)->len) == 0){
+        val = Qtrue;
+      }
+      else{
+        val = Qfalse;
+      }
+    }
+    else{
+      goto INSN_LABEL(normal_dispatch);
+    }
+  }
+  else{
+  INSN_LABEL(normal_dispatch):
+    /* other */
+#ifdef YARV_AOT_COMPILED
+    val = rb_funcall(recv, idEq, 1, obj);
+#else
+    PUSH(recv); PUSH(obj);
+    tmp_id = idEq;
+    goto LABEL_IS_SC(start_init_in_send_for_opt_1);
+#endif
+  }
+}
+
+
+/**
+  @c optimize
   @e optimized X<Y.
   @j K X<YB
  */
@@ -2094,6 +2351,42 @@
 
 /**
   @c optimize
+  @e optimized length
+  @j optimized length
+ */
+DEFINE_INSN
+opt_length
+()
+(VALUE recv)
+(VALUE val)
+{
+  if(!SPECIAL_CONST_P(recv)){
+    if(HEAP_CLASS_OF(recv) == rb_cArray){
+      val = LONG2NUM(RARRAY(recv)->len);
+    }
+    else if(HEAP_CLASS_OF(recv) == rb_cString){
+      val = LONG2NUM(RSTRING(recv)->len);
+    }
+    else if(HEAP_CLASS_OF(recv) == rb_cHash){
+      val = INT2FIX(RHASH(recv)->tbl->num_entries);
+    }
+    else{
+      goto INSN_LABEL(normal_dispatch);
+    }
+  }
+  else{
+  INSN_LABEL(normal_dispatch):
+    /* other */
+#ifdef YARV_AOT_COMPILED
+    val = rb_funcall(recv, idLength, 0);
+#else
+    val = rb_funcall(recv, idLength, 0);
+#endif
+  }
+}
+
+/**
+  @c optimize
   @e optimized regexp match
   @j KK\}b`
  */

Modified: trunk/test/test_bin.rb
===================================================================
--- trunk/test/test_bin.rb	2005-07-03 13:32:33 UTC (rev 202)
+++ trunk/test/test_bin.rb	2005-07-03 22:15:59 UTC (rev 203)
@@ -314,6 +314,69 @@
     }
   end
 
+  def test_div
+    ae %q{
+      3/2
+    }
+    ae %q{
+      3.0/2.0
+    }
+    ae %q{
+      class C
+        def /(a)
+          a * 100
+        end
+      end
+      C.new/3
+    } do
+      remove_const :C
+    end
+  end
+
+  def test_length
+    ae %q{
+      [].length
+    }
+    ae %q{
+      [1, 2].length
+    }
+    ae %q{
+      {}.length
+    }
+    ae %q{
+      {:a => 1, :b => 2}.length
+    }
+    ae %q{
+      class C
+        def length
+          'hoge'
+        end
+      end
+      C.new.length
+    } do
+      remove_const :C
+    end
+  end
+
+  def test_mod
+    ae %q{
+      3%2
+    }
+    ae %q{
+      3.0%2.0
+    }
+    ae %q{
+      class C
+        def % (a)
+          a * 100
+        end
+      end
+      C.new%3
+    } do
+      remove_const :C
+    end
+  end
+
   def test_aref_aset
     ae %q{
       a = []

Modified: trunk/test.rb
===================================================================
--- trunk/test.rb	2005-07-03 13:32:33 UTC (rev 202)
+++ trunk/test.rb	2005-07-03 22:15:59 UTC (rev 203)
@@ -9,6 +9,46 @@
 ###########################################################
 $prog =<<'__EOP__'
 
+a = 'abc'
+
+
+__END__
+class C
+  def length
+    30
+  end
+end
+
+a = C.new
+a.length + a.length
+__END__
+10000000.times{
+  a.length + a.length
+}
+
+
+__END__
+require 'stringio'
+input = StringIO.new
+
+data = 'hogehuga'
+
+5000.times{|i|
+  input.write data
+}
+input.seek 0
+
+nl = nw = nc = 0
+while true
+  data = (input.read(4096) or break) << (input.gets || "")
+
+  nc += data.length
+  nl += data.count("\n")
+  ((data.strip! || data).tr!("\n", " ") || data).squeeze!
+  nw += data.count(" ") + 1
+end
+
+
 __EOP__
 ###########################################################
 

Modified: trunk/yarvcore.c
===================================================================
--- trunk/yarvcore.c	2005-07-03 13:32:33 UTC (rev 202)
+++ trunk/yarvcore.c	2005-07-03 22:15:59 UTC (rev 203)
@@ -27,8 +27,11 @@
 ID idPLUS;
 ID idMINUS;
 ID idMULT;
+ID idDIV;
+ID idMOD;
 ID idLT;
 ID idLTLT;
+ID idEq;
 ID idEqq;
 ID idBackquote;
 ID idEqTilde;
@@ -40,8 +43,8 @@
 ID idIntern;
 ID idMethodMissing;
 ID idEach;
+ID idLength;
 
-
 #define MARK_UNLESS_NULL(ptr) if(ptr){rb_gc_mark(ptr);}
 #define FREE_UNLESS_NULL(ptr) if(ptr){ruby_xfree(ptr);}
 
@@ -748,23 +751,27 @@
   idPLUS = rb_intern("+");
   idMINUS= rb_intern("-");
   idMULT = rb_intern("*");
+  idDIV  = rb_intern("/");
+  idMOD  = rb_intern("%");
   idLT   = rb_intern("<");
   idLTLT = rb_intern("<<");
+  idEq   = rb_intern("==");
   idEqq  = rb_intern("===");
-  idBackquote      = rb_intern("`");
+  idBackquote = rb_intern("`");
+  idEqTilde   = rb_intern("=~");
   
   idAREF = rb_intern("[]");
   idASET = rb_intern("[]=");
 
+  idEach   = rb_intern("each");
+  idLength = rb_intern("length");
   idIntern = rb_intern("intern");
   idMethodMissing = rb_intern("method_missing");
-  
-  idEqTilde        = rb_intern("=~");
+
   idThrowState     = rb_intern("#__ThrowState__");
   idThrowBackDFP   = rb_intern("#__ThrowBackDFP__");
   idThrowObject    = rb_intern("#__ThrowObject__");
 
-  idEach           = rb_intern("each");
   
   constant_pool_pool = rb_ary_new();
   rb_global_variable(&constant_pool_pool);

Modified: trunk/yarvcore.h
===================================================================
--- trunk/yarvcore.h	2005-07-03 13:32:33 UTC (rev 202)
+++ trunk/yarvcore.h	2005-07-03 22:15:59 UTC (rev 203)
@@ -25,8 +25,11 @@
 extern ID idPLUS;
 extern ID idMINUS;
 extern ID idMULT;
+extern ID idDIV;
+extern ID idMOD;
 extern ID idLT;
 extern ID idLTLT;
+extern ID idEq;
 extern ID idEqq;
 extern ID idBackquote;
 extern ID idEqTilde;
@@ -38,6 +41,7 @@
 extern ID idIntern;
 extern ID idMethodMissing;
 extern ID idEach;
+extern ID idLength;
 
 extern unsigned long yarvGlobalStateVersion;
 


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

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