diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-12-18 12:07:51 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-12-18 12:07:51 +0000 |
commit | cd843108646b999e13cfbf04e51eca30b68850b3 (patch) | |
tree | eb87ffe59f0f71747be4fc76d84244c414e3e3da /compile.c | |
parent | 1f75a4e700883da8d15048fc3da6528ba53ec1e4 (diff) |
* compile.c, insnhelper.ci, insns.def, object.c, vm.c, vm.h:
optimize !@, != method invocation.
* id.c, id.h: ditto.
* bootstraptest/test_syntax.rb: add tests for above.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14299 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'compile.c')
-rw-r--r-- | compile.c | 23 |
1 files changed, 22 insertions, 1 deletions
@@ -1416,6 +1416,21 @@ insn_set_specialized_instruction(INSN *iobj, int insn_id) return COMPILE_OK; } +static int +insn_set_specialized_instruction_with_ic(INSN *iobj, int insn_id, int n) +{ + int i; + iobj->insn_id = insn_id; + iobj->operand_size = n; + + /* max of n is 4 */ + for (i=0; i<n; i++) { + iobj->operands[i] = Qnil; + } + + return COMPILE_OK; +} + static int iseq_specialized_instruction(rb_iseq_t *iseq, INSN *iobj) @@ -1435,6 +1450,9 @@ iseq_specialized_instruction(rb_iseq_t *iseq, INSN *iobj) else if (mid == idSucc) { insn_set_specialized_instruction(iobj, BIN(opt_succ)); } + else if (mid == idNot) { + insn_set_specialized_instruction_with_ic(iobj, BIN(opt_not), 1); + } } else if (argc == 1) { if (0) { @@ -1455,7 +1473,10 @@ iseq_specialized_instruction(rb_iseq_t *iseq, INSN *iobj) insn_set_specialized_instruction(iobj, BIN(opt_mod)); } else if (mid == idEq) { - insn_set_specialized_instruction(iobj, BIN(opt_eq)); + insn_set_specialized_instruction_with_ic(iobj, BIN(opt_eq), 1); + } + else if (mid == idNeq) { + insn_set_specialized_instruction_with_ic(iobj, BIN(opt_neq), 2); } else if (mid == idLT) { insn_set_specialized_instruction(iobj, BIN(opt_lt)); |