mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* 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". git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@24778 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
cea5aeb795
commit
b82db5251c
4 changed files with 45 additions and 23 deletions
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,15 @@
|
||||||
|
Mon Sep 7 05:38:34 2009 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
|
* 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@atdot.net>
|
Mon Sep 7 05:21:09 2009 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
* Makefile.in, common.mk: move a id.h generation rule.
|
* Makefile.in, common.mk: move a id.h generation rule.
|
||||||
|
|
36
insns.def
36
insns.def
|
@ -1287,7 +1287,7 @@ opt_checkenv
|
||||||
*/
|
*/
|
||||||
DEFINE_INSN
|
DEFINE_INSN
|
||||||
opt_plus
|
opt_plus
|
||||||
()
|
(IC ic)
|
||||||
(VALUE recv, VALUE obj)
|
(VALUE recv, VALUE obj)
|
||||||
(VALUE val)
|
(VALUE val)
|
||||||
{
|
{
|
||||||
|
@ -1363,7 +1363,7 @@ opt_plus
|
||||||
*/
|
*/
|
||||||
DEFINE_INSN
|
DEFINE_INSN
|
||||||
opt_minus
|
opt_minus
|
||||||
()
|
(IC ic)
|
||||||
(VALUE recv, VALUE obj)
|
(VALUE recv, VALUE obj)
|
||||||
(VALUE val)
|
(VALUE val)
|
||||||
{
|
{
|
||||||
|
@ -1412,7 +1412,7 @@ opt_minus
|
||||||
*/
|
*/
|
||||||
DEFINE_INSN
|
DEFINE_INSN
|
||||||
opt_mult
|
opt_mult
|
||||||
()
|
(IC ic)
|
||||||
(VALUE recv, VALUE obj)
|
(VALUE recv, VALUE obj)
|
||||||
(VALUE val)
|
(VALUE val)
|
||||||
{
|
{
|
||||||
|
@ -1465,7 +1465,7 @@ opt_mult
|
||||||
*/
|
*/
|
||||||
DEFINE_INSN
|
DEFINE_INSN
|
||||||
opt_div
|
opt_div
|
||||||
()
|
(IC ic)
|
||||||
(VALUE recv, VALUE obj)
|
(VALUE recv, VALUE obj)
|
||||||
(VALUE val)
|
(VALUE val)
|
||||||
{
|
{
|
||||||
|
@ -1529,7 +1529,7 @@ opt_div
|
||||||
*/
|
*/
|
||||||
DEFINE_INSN
|
DEFINE_INSN
|
||||||
opt_mod
|
opt_mod
|
||||||
()
|
(IC ic)
|
||||||
(VALUE recv, VALUE obj)
|
(VALUE recv, VALUE obj)
|
||||||
(VALUE val)
|
(VALUE val)
|
||||||
{
|
{
|
||||||
|
@ -1629,16 +1629,16 @@ opt_eq
|
||||||
*/
|
*/
|
||||||
DEFINE_INSN
|
DEFINE_INSN
|
||||||
opt_neq
|
opt_neq
|
||||||
(IC ic1, IC ic2)
|
(IC ic, IC ic_eq)
|
||||||
(VALUE recv, VALUE obj)
|
(VALUE recv, VALUE obj)
|
||||||
(VALUE val)
|
(VALUE val)
|
||||||
{
|
{
|
||||||
extern VALUE rb_obj_not_equal(VALUE obj1, VALUE obj2);
|
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;
|
val = Qundef;
|
||||||
|
|
||||||
if (check_cfunc(me, rb_obj_not_equal)) {
|
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) {
|
if (val != Qundef) {
|
||||||
val = RTEST(val) ? Qfalse : Qtrue;
|
val = RTEST(val) ? Qfalse : Qtrue;
|
||||||
|
@ -1660,7 +1660,7 @@ opt_neq
|
||||||
*/
|
*/
|
||||||
DEFINE_INSN
|
DEFINE_INSN
|
||||||
opt_lt
|
opt_lt
|
||||||
()
|
(IC ic)
|
||||||
(VALUE recv, VALUE obj)
|
(VALUE recv, VALUE obj)
|
||||||
(VALUE val)
|
(VALUE val)
|
||||||
{
|
{
|
||||||
|
@ -1710,7 +1710,7 @@ opt_lt
|
||||||
*/
|
*/
|
||||||
DEFINE_INSN
|
DEFINE_INSN
|
||||||
opt_le
|
opt_le
|
||||||
()
|
(IC ic)
|
||||||
(VALUE recv, VALUE obj)
|
(VALUE recv, VALUE obj)
|
||||||
(VALUE val)
|
(VALUE val)
|
||||||
{
|
{
|
||||||
|
@ -1740,7 +1740,7 @@ opt_le
|
||||||
*/
|
*/
|
||||||
DEFINE_INSN
|
DEFINE_INSN
|
||||||
opt_gt
|
opt_gt
|
||||||
()
|
(IC ic)
|
||||||
(VALUE recv, VALUE obj)
|
(VALUE recv, VALUE obj)
|
||||||
(VALUE val)
|
(VALUE val)
|
||||||
{
|
{
|
||||||
|
@ -1790,7 +1790,7 @@ opt_gt
|
||||||
*/
|
*/
|
||||||
DEFINE_INSN
|
DEFINE_INSN
|
||||||
opt_ge
|
opt_ge
|
||||||
()
|
(IC ic)
|
||||||
(VALUE recv, VALUE obj)
|
(VALUE recv, VALUE obj)
|
||||||
(VALUE val)
|
(VALUE val)
|
||||||
{
|
{
|
||||||
|
@ -1819,7 +1819,7 @@ opt_ge
|
||||||
*/
|
*/
|
||||||
DEFINE_INSN
|
DEFINE_INSN
|
||||||
opt_ltlt
|
opt_ltlt
|
||||||
()
|
(IC ic)
|
||||||
(VALUE recv, VALUE obj)
|
(VALUE recv, VALUE obj)
|
||||||
(VALUE val)
|
(VALUE val)
|
||||||
{
|
{
|
||||||
|
@ -1853,7 +1853,7 @@ opt_ltlt
|
||||||
*/
|
*/
|
||||||
DEFINE_INSN
|
DEFINE_INSN
|
||||||
opt_aref
|
opt_aref
|
||||||
()
|
(IC ic)
|
||||||
(VALUE recv, VALUE obj)
|
(VALUE recv, VALUE obj)
|
||||||
(VALUE val)
|
(VALUE val)
|
||||||
{
|
{
|
||||||
|
@ -1883,7 +1883,7 @@ opt_aref
|
||||||
*/
|
*/
|
||||||
DEFINE_INSN
|
DEFINE_INSN
|
||||||
opt_aset
|
opt_aset
|
||||||
()
|
(IC ic)
|
||||||
(VALUE recv, VALUE obj, VALUE set)
|
(VALUE recv, VALUE obj, VALUE set)
|
||||||
(VALUE val)
|
(VALUE val)
|
||||||
{
|
{
|
||||||
|
@ -1939,7 +1939,7 @@ opt_length
|
||||||
else {
|
else {
|
||||||
INSN_LABEL(normal_dispatch):
|
INSN_LABEL(normal_dispatch):
|
||||||
PUSH(recv);
|
PUSH(recv);
|
||||||
CALL_SIMPLE_METHOD_IC(0, idLength, recv, ic);
|
CALL_SIMPLE_METHOD(0, idLength, recv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1972,7 +1972,7 @@ opt_size
|
||||||
else {
|
else {
|
||||||
INSN_LABEL(normal_dispatch):
|
INSN_LABEL(normal_dispatch):
|
||||||
PUSH(recv);
|
PUSH(recv);
|
||||||
CALL_SIMPLE_METHOD_IC(0, idSize, recv, ic);
|
CALL_SIMPLE_METHOD(0, idSize, recv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1983,7 +1983,7 @@ opt_size
|
||||||
*/
|
*/
|
||||||
DEFINE_INSN
|
DEFINE_INSN
|
||||||
opt_succ
|
opt_succ
|
||||||
()
|
(IC ic)
|
||||||
(VALUE recv)
|
(VALUE recv)
|
||||||
(VALUE val)
|
(VALUE val)
|
||||||
{
|
{
|
||||||
|
|
|
@ -704,7 +704,7 @@ class RubyVM
|
||||||
end
|
end
|
||||||
|
|
||||||
re = /\b#{var}\b/n
|
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});"
|
ops << " #{type} #{var} = (#{type})GET_OPERAND(#{i+1});"
|
||||||
end
|
end
|
||||||
n += 1
|
n += 1
|
||||||
|
|
|
@ -184,14 +184,24 @@ extern VALUE ruby_vm_const_missing_count;
|
||||||
#define BASIC_OP_UNREDEFINED_P(op) (LIKELY(ruby_vm_redefined_flag[op] == 0))
|
#define BASIC_OP_UNREDEFINED_P(op) (LIKELY(ruby_vm_redefined_flag[op] == 0))
|
||||||
#define HEAP_CLASS_OF(obj) RBASIC(obj)->klass
|
#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, vm_method_search(id, klass, ic), recv); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
#define CALL_SIMPLE_METHOD(num, id, recv) do { \
|
#define CALL_SIMPLE_METHOD(num, id, recv) do { \
|
||||||
VALUE klass = CLASS_OF(recv); \
|
VALUE klass = CLASS_OF(recv); \
|
||||||
CALL_METHOD(num, 0, 0, id, rb_method_entry(klass, id), recv); \
|
CALL_METHOD(num, 0, 0, id, rb_method_entry(klass, id), recv); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define CALL_SIMPLE_METHOD_IC(num, id, recv, ic) do { \
|
#endif
|
||||||
VALUE klass = CLASS_OF(recv); \
|
|
||||||
CALL_METHOD(num, 0, 0, id, vm_method_search(id, klass, ic), recv); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#endif /* RUBY_INSNHELPER_H */
|
#endif /* RUBY_INSNHELPER_H */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue