From 3c7c983300670b29e6c7feb3b8c23421c53af01b Mon Sep 17 00:00:00 2001 From: mame Date: Thu, 17 Mar 2016 12:47:31 +0000 Subject: * compile.c (NODE_CALL): add optimization shortcut for Array#max/min. Now `[x, y].max` is optimized so that a temporal array object is not created in some condition. * insns.def (opt_newarray_max, opt_newarray_min): added. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54153 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- insns.def | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) (limited to 'insns.def') diff --git a/insns.def b/insns.def index 98871bf9a6..5b08d0625a 100644 --- a/insns.def +++ b/insns.def @@ -986,6 +986,74 @@ opt_str_freeze } } +DEFINE_INSN +opt_newarray_max +(rb_num_t num) +(...) +(VALUE val) // inc += 1 - num; +{ +#define id_cmp idCmp + if (BASIC_OP_UNREDEFINED_P(BOP_MAX, ARRAY_REDEFINED_OP_FLAG)) { + if (num == 0) { + val = Qnil; + } + else { + struct cmp_opt_data cmp_opt = { 0, 0 }; + VALUE result = Qundef; + rb_num_t i = num - 1; + result = TOPN(i); + while (i-- > 0) { + const VALUE v = TOPN(i); + if (result == Qundef || OPTIMIZED_CMP(v, result, cmp_opt) > 0) { + result = v; + } + } + val = result == Qundef ? Qnil : result; + } + POPN(num); + } + else { + VALUE ary = rb_ary_new4((long)num, STACK_ADDR_FROM_TOP(num)); + val = rb_funcall(ary, idMax, 0); + POPN(num); + } +#undef id_cmp +} + +DEFINE_INSN +opt_newarray_min +(rb_num_t num) +(...) +(VALUE val) // inc += 1 - num; +{ +#define id_cmp idCmp + if (BASIC_OP_UNREDEFINED_P(BOP_MIN, ARRAY_REDEFINED_OP_FLAG)) { + if (num == 0) { + val = Qnil; + } + else { + struct cmp_opt_data cmp_opt = { 0, 0 }; + VALUE result = Qundef; + rb_num_t i = num - 1; + result = TOPN(i); + while (i-- > 0) { + const VALUE v = TOPN(i); + if (result == Qundef || OPTIMIZED_CMP(v, result, cmp_opt) < 0) { + result = v; + } + } + val = result == Qundef ? Qnil : result; + } + POPN(num); + } + else { + VALUE ary = rb_ary_new4((long)num, STACK_ADDR_FROM_TOP(num)); + val = rb_funcall(ary, idMin, 0); + POPN(num); + } +#undef id_cmp +} + /** @c optimize @e Invoke method without block -- cgit v1.2.3