From 34f2ab1f3c389e7d802128706008db2d8445fc3f Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Thu, 2 Mar 2023 23:21:28 -0800 Subject: [PATCH] Optimize Integer#/ --- lib/ruby_vm/mjit/insn_compiler.rb | 31 ++++++++++++++++++++++++++----- mjit_c.rb | 4 ++++ 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/lib/ruby_vm/mjit/insn_compiler.rb b/lib/ruby_vm/mjit/insn_compiler.rb index 625f01b13c..e68c68e3a9 100644 --- a/lib/ruby_vm/mjit/insn_compiler.rb +++ b/lib/ruby_vm/mjit/insn_compiler.rb @@ -1694,8 +1694,9 @@ module RubyVM::MJIT asm.mov(:rax, Qfalse) asm.mov(:rcx, Qtrue) asm.cmovz(:rax, :rcx) - asm.mov(ctx.stack_push, :rax) + stack_ret = ctx.stack_push + asm.mov(stack_ret, :rax) true end @@ -1738,13 +1739,11 @@ module RubyVM::MJIT def jit_rb_int_mul(jit, ctx, asm, argc) return false if argc != 1 return false unless two_fixnums_on_stack?(jit) - asm.comment('rb_int_mul') side_exit = side_exit(jit, ctx) guard_two_fixnums(jit, ctx, asm, side_exit) - jit_prepare_routine_call(jit, ctx, asm) - + asm.comment('rb_int_mul') y_opnd = ctx.stack_pop x_opnd = ctx.stack_pop asm.mov(C_ARGS[0], x_opnd) @@ -1753,7 +1752,29 @@ module RubyVM::MJIT ret_opnd = ctx.stack_push asm.mov(ret_opnd, C_RET) + true + end + def jit_rb_int_div(jit, ctx, asm, argc) + return false if argc != 1 + return false unless two_fixnums_on_stack?(jit) + + side_exit = side_exit(jit, ctx) + guard_two_fixnums(jit, ctx, asm, side_exit) + + asm.comment('rb_int_div') + y_opnd = ctx.stack_pop + x_opnd = ctx.stack_pop + asm.mov(:rax, y_opnd) + asm.cmp(:rax, C.to_value(0)) + asm.je(side_exit) + + asm.mov(C_ARGS[0], x_opnd) + asm.mov(C_ARGS[1], :rax) + asm.call(C.rb_fix_div_fix) + + ret_opnd = ctx.stack_push + asm.mov(ret_opnd, C_RET) true end @@ -1774,7 +1795,6 @@ module RubyVM::MJIT ret_opnd = ctx.stack_push asm.mov(ret_opnd, C_RET) - true end @@ -1789,6 +1809,7 @@ module RubyVM::MJIT register_cfunc_method(Integer, :==, :jit_rb_int_equal) register_cfunc_method(Integer, :===, :jit_rb_int_equal) register_cfunc_method(Integer, :*, :jit_rb_int_mul) + register_cfunc_method(Integer, :/, :jit_rb_int_div) register_cfunc_method(Array, :<<, :jit_rb_ary_push) end diff --git a/mjit_c.rb b/mjit_c.rb index d1c01d4069..aab9515257 100644 --- a/mjit_c.rb +++ b/mjit_c.rb @@ -289,6 +289,10 @@ module RubyVM::MJIT # :nodoc: all Primitive.cexpr! 'SIZET2NUM((size_t)rb_fix_mul_fix)' end + def rb_fix_div_fix + Primitive.cexpr! 'SIZET2NUM((size_t)rb_fix_div_fix)' + end + def rb_ary_push Primitive.cexpr! 'SIZET2NUM((size_t)rb_ary_push)' end