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