ruby-changes:52626
From: k0kubun <ko1@a...>
Date: Wed, 26 Sep 2018 02:19:58 +0900 (JST)
Subject: [ruby-changes:52626] k0kubun:r64838 (trunk): Revert "Revert r64824 to fix build failure on AppVeyor"
k0kubun 2018-09-26 02:19:51 +0900 (Wed, 26 Sep 2018) New Revision: 64838 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=64838 Log: Revert "Revert r64824 to fix build failure on AppVeyor" This reverts commit r64829. I'll prepare another temporary fix, but I'll separately commit that to make it easier to revert that later. Modified files: trunk/compile.c trunk/defs/id.def trunk/insns.def trunk/test/ruby/test_jit.rb trunk/test/ruby/test_optimization.rb trunk/tool/transform_mjit_header.rb trunk/vm.c trunk/vm_core.h trunk/vm_insnhelper.c Index: vm_core.h =================================================================== --- vm_core.h (revision 64837) +++ vm_core.h (revision 64838) @@ -531,6 +531,8 @@ enum ruby_basic_operators { https://github.com/ruby/ruby/blob/trunk/vm_core.h#L531 BOP_MAX, BOP_MIN, BOP_CALL, + BOP_AND, + BOP_OR, BOP_LAST_ }; Index: vm.c =================================================================== --- vm.c (revision 64837) +++ vm.c (revision 64838) @@ -1610,6 +1610,8 @@ vm_init_redefined_flag(void) https://github.com/ruby/ruby/blob/trunk/vm.c#L1610 OP(Max, MAX), (C(Array)); OP(Min, MIN), (C(Array)); OP(Call, CALL), (C(Proc)); + OP(And, AND), (C(Integer)); + OP(Or, OR), (C(Integer)); #undef C #undef OP } Index: compile.c =================================================================== --- compile.c (revision 64837) +++ compile.c (revision 64838) @@ -3245,6 +3245,8 @@ iseq_specialized_instruction(rb_iseq_t * https://github.com/ruby/ruby/blob/trunk/compile.c#L3245 case idGE: SP_INSN(ge); return COMPILE_OK; case idLTLT: SP_INSN(ltlt); return COMPILE_OK; case idAREF: SP_INSN(aref); return COMPILE_OK; + case idAnd: SP_INSN(and); return COMPILE_OK; + case idOr: SP_INSN(or); return COMPILE_OK; } break; case 2: Index: tool/transform_mjit_header.rb =================================================================== --- tool/transform_mjit_header.rb (revision 64837) +++ tool/transform_mjit_header.rb (revision 64838) @@ -52,6 +52,8 @@ module MJITHeader https://github.com/ruby/ruby/blob/trunk/tool/transform_mjit_header.rb#L52 'vm_opt_gt', 'vm_opt_ge', 'vm_opt_ltlt', + 'vm_opt_and', + 'vm_opt_or', 'vm_opt_aref', 'vm_opt_aset', 'vm_opt_aref_with', Index: test/ruby/test_jit.rb =================================================================== --- test/ruby/test_jit.rb (revision 64837) +++ test/ruby/test_jit.rb (revision 64838) @@ -478,6 +478,14 @@ class TestJIT < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_jit.rb#L478 assert_compile_once('[1] << 2', result_inspect: '[1, 2]', insns: %i[opt_ltlt]) end + def test_compile_insn_opt_and + assert_compile_once('1 & 3', result_inspect: '1', insns: %i[opt_and]) + end + + def test_compile_insn_opt_or + assert_compile_once('1 | 3', result_inspect: '3', insns: %i[opt_or]) + end + def test_compile_insn_opt_aref skip_on_mswin # optimized call (optimized JIT) -> send call Index: test/ruby/test_optimization.rb =================================================================== --- test/ruby/test_optimization.rb (revision 64837) +++ test/ruby/test_optimization.rb (revision 64838) @@ -187,6 +187,16 @@ class TestRubyOptimization < Test::Unit: https://github.com/ruby/ruby/blob/trunk/test/ruby/test_optimization.rb#L187 assert_redefine_method('String', '<<', 'assert_equal "b", "a" << "b"') end + def test_fixnum_and + assert_equal 1, 1&3 + assert_redefine_method('Integer', '&', 'assert_equal 3, 1&3') + end + + def test_fixnum_or + assert_equal 3, 1|3 + assert_redefine_method('Integer', '|', 'assert_equal 1, 3|1') + end + def test_array_plus assert_equal [1,2], [1]+[2] assert_redefine_method('Array', '+', 'assert_equal [2], [1]+[2]') Index: defs/id.def =================================================================== --- defs/id.def (revision 64837) +++ defs/id.def (revision 64838) @@ -97,6 +97,8 @@ token_ops = %[\ https://github.com/ruby/ruby/blob/trunk/defs/id.def#L97 Eqq === EQQ Neq != NEQ Not ! + And & + Or | Backquote ` EqTilde =~ MATCH NeqTilde !~ NMATCH Index: vm_insnhelper.c =================================================================== --- vm_insnhelper.c (revision 64837) +++ vm_insnhelper.c (revision 64838) @@ -3653,6 +3653,30 @@ vm_opt_ltlt(VALUE recv, VALUE obj) https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.c#L3653 } static VALUE +vm_opt_and(VALUE recv, VALUE obj) +{ + if (FIXNUM_2_P(recv, obj) && + BASIC_OP_UNREDEFINED_P(BOP_AND, INTEGER_REDEFINED_OP_FLAG)) { + return LONG2NUM(FIX2LONG(recv) & FIX2LONG(obj)); + } + else { + return Qundef; + } +} + +static VALUE +vm_opt_or(VALUE recv, VALUE obj) +{ + if (FIXNUM_2_P(recv, obj) && + BASIC_OP_UNREDEFINED_P(BOP_OR, INTEGER_REDEFINED_OP_FLAG)) { + return LONG2NUM(FIX2LONG(recv) | FIX2LONG(obj)); + } + else { + return Qundef; + } +} + +static VALUE vm_opt_aref(VALUE recv, VALUE obj) { if (SPECIAL_CONST_P(recv)) { Index: insns.def =================================================================== --- insns.def (revision 64837) +++ insns.def (revision 64838) @@ -1216,6 +1216,34 @@ opt_ltlt https://github.com/ruby/ruby/blob/trunk/insns.def#L1216 } } +/* optimized X&Y. */ +DEFINE_INSN +opt_and +(CALL_INFO ci, CALL_CACHE cc) +(VALUE recv, VALUE obj) +(VALUE val) +{ + val = vm_opt_and(recv, obj); + + if (val == Qundef) { + CALL_SIMPLE_METHOD(); + } +} + +/* optimized X|Y. */ +DEFINE_INSN +opt_or +(CALL_INFO ci, CALL_CACHE cc) +(VALUE recv, VALUE obj) +(VALUE val) +{ + val = vm_opt_or(recv, obj); + + if (val == Qundef) { + CALL_SIMPLE_METHOD(); + } +} + /* [] */ DEFINE_INSN opt_aref -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/