ruby-changes:13033
From: ko1 <ko1@a...>
Date: Mon, 7 Sep 2009 05:43:24 +0900 (JST)
Subject: [ruby-changes:13033] Ruby:r24778 (trunk): * insns.def (opt_*): add IC operands.
ko1 2009-09-07 05:42:50 +0900 (Mon, 07 Sep 2009) New Revision: 24778 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=24778 Log: * insns.def (opt_*): add IC operands. * vm_insnhelper.h (CALL_SIMPLE_METHOD): add a version which use an inline cache. USE_IC_FOR_SPECIALIZED_METHOD macro switchs the behaviour. This change also removes CALL_SIMPLE_METHOD_IC() macro. * tool/instruction.rb: fix elimination process to ignore variable "ic". Modified files: trunk/ChangeLog trunk/insns.def trunk/tool/instruction.rb trunk/vm_insnhelper.h Index: ChangeLog =================================================================== --- ChangeLog (revision 24777) +++ ChangeLog (revision 24778) @@ -1,3 +1,15 @@ +Mon Sep 7 05:38:34 2009 Koichi Sasada <ko1@a...> + + * insns.def (opt_*): add IC operands. + + * vm_insnhelper.h (CALL_SIMPLE_METHOD): add a version which + use an inline cache. USE_IC_FOR_SPECIALIZED_METHOD macro + switchs the behaviour. This change also removes + CALL_SIMPLE_METHOD_IC() macro. + + * tool/instruction.rb: fix elimination process to ignore + variable "ic". + Mon Sep 7 05:21:09 2009 Koichi Sasada <ko1@a...> * Makefile.in, common.mk: move a id.h generation rule. Index: insns.def =================================================================== --- insns.def (revision 24777) +++ insns.def (revision 24778) @@ -1287,7 +1287,7 @@ */ DEFINE_INSN opt_plus -() +(IC ic) (VALUE recv, VALUE obj) (VALUE val) { @@ -1363,7 +1363,7 @@ */ DEFINE_INSN opt_minus -() +(IC ic) (VALUE recv, VALUE obj) (VALUE val) { @@ -1412,7 +1412,7 @@ */ DEFINE_INSN opt_mult -() +(IC ic) (VALUE recv, VALUE obj) (VALUE val) { @@ -1465,7 +1465,7 @@ */ DEFINE_INSN opt_div -() +(IC ic) (VALUE recv, VALUE obj) (VALUE val) { @@ -1529,7 +1529,7 @@ */ DEFINE_INSN opt_mod -() +(IC ic) (VALUE recv, VALUE obj) (VALUE val) { @@ -1629,16 +1629,16 @@ */ DEFINE_INSN opt_neq -(IC ic1, IC ic2) +(IC ic, IC ic_eq) (VALUE recv, VALUE obj) (VALUE val) { extern VALUE rb_obj_not_equal(VALUE obj1, VALUE obj2); - const rb_method_entry_t *me = vm_method_search(idNeq, CLASS_OF(recv), ic1); + const rb_method_entry_t *me = vm_method_search(idNeq, CLASS_OF(recv), ic); val = Qundef; if (check_cfunc(me, rb_obj_not_equal)) { - val = opt_eq_func(recv, obj, ic2); + val = opt_eq_func(recv, obj, ic_eq); if (val != Qundef) { val = RTEST(val) ? Qfalse : Qtrue; @@ -1660,7 +1660,7 @@ */ DEFINE_INSN opt_lt -() +(IC ic) (VALUE recv, VALUE obj) (VALUE val) { @@ -1710,7 +1710,7 @@ */ DEFINE_INSN opt_le -() +(IC ic) (VALUE recv, VALUE obj) (VALUE val) { @@ -1740,7 +1740,7 @@ */ DEFINE_INSN opt_gt -() +(IC ic) (VALUE recv, VALUE obj) (VALUE val) { @@ -1790,7 +1790,7 @@ */ DEFINE_INSN opt_ge -() +(IC ic) (VALUE recv, VALUE obj) (VALUE val) { @@ -1819,7 +1819,7 @@ */ DEFINE_INSN opt_ltlt -() +(IC ic) (VALUE recv, VALUE obj) (VALUE val) { @@ -1853,7 +1853,7 @@ */ DEFINE_INSN opt_aref -() +(IC ic) (VALUE recv, VALUE obj) (VALUE val) { @@ -1883,7 +1883,7 @@ */ DEFINE_INSN opt_aset -() +(IC ic) (VALUE recv, VALUE obj, VALUE set) (VALUE val) { @@ -1939,7 +1939,7 @@ else { INSN_LABEL(normal_dispatch): PUSH(recv); - CALL_SIMPLE_METHOD_IC(0, idLength, recv, ic); + CALL_SIMPLE_METHOD(0, idLength, recv); } } @@ -1972,7 +1972,7 @@ else { INSN_LABEL(normal_dispatch): PUSH(recv); - CALL_SIMPLE_METHOD_IC(0, idSize, recv, ic); + CALL_SIMPLE_METHOD(0, idSize, recv); } } @@ -1983,7 +1983,7 @@ */ DEFINE_INSN opt_succ -() +(IC ic) (VALUE recv) (VALUE val) { Index: vm_insnhelper.h =================================================================== --- vm_insnhelper.h (revision 24777) +++ vm_insnhelper.h (revision 24778) @@ -184,14 +184,24 @@ #define BASIC_OP_UNREDEFINED_P(op) (LIKELY(ruby_vm_redefined_flag[op] == 0)) #define HEAP_CLASS_OF(obj) RBASIC(obj)->klass +#ifndef USE_IC_FOR_SPECIALIZED_METHOD +#define USE_IC_FOR_SPECIALIZED_METHOD 1 +#endif + +#if USE_IC_FOR_SPECIALIZED_METHOD + #define CALL_SIMPLE_METHOD(num, id, recv) do { \ VALUE klass = CLASS_OF(recv); \ - CALL_METHOD(num, 0, 0, id, rb_method_entry(klass, id), recv); \ + CALL_METHOD(num, 0, 0, id, vm_method_search(id, klass, ic), recv); \ } while (0) -#define CALL_SIMPLE_METHOD_IC(num, id, recv, ic) do { \ +#else + +#define CALL_SIMPLE_METHOD(num, id, recv) do { \ VALUE klass = CLASS_OF(recv); \ - CALL_METHOD(num, 0, 0, id, vm_method_search(id, klass, ic), recv); \ + CALL_METHOD(num, 0, 0, id, rb_method_entry(klass, id), recv); \ } while (0) +#endif + #endif /* RUBY_INSNHELPER_H */ Index: tool/instruction.rb =================================================================== --- tool/instruction.rb (revision 24777) +++ tool/instruction.rb (revision 24778) @@ -704,7 +704,7 @@ end re = /\b#{var}\b/n - if re =~ insn.body or re =~ insn.sp_inc or insn.rets.any?{|t, v| re =~ v} + if re =~ insn.body or re =~ insn.sp_inc or insn.rets.any?{|t, v| re =~ v} or re =~ 'ic' ops << " #{type} #{var} = (#{type})GET_OPERAND(#{i+1});" end n += 1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/