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