[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]