From 357007626ce77cd3cdb9e44568c1794e515792f6 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Wed, 1 Mar 2023 23:38:12 -0800 Subject: [PATCH] Implement opt_newarray_min --- lib/ruby_vm/mjit/insn_compiler.rb | 30 +++++++++++++++++++++++++++--- mjit_c.rb | 7 +++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/lib/ruby_vm/mjit/insn_compiler.rb b/lib/ruby_vm/mjit/insn_compiler.rb index 247cdbe260..9a86181b64 100644 --- a/lib/ruby_vm/mjit/insn_compiler.rb +++ b/lib/ruby_vm/mjit/insn_compiler.rb @@ -22,7 +22,7 @@ module RubyVM::MJIT asm.incr_counter(:mjit_insns_count) asm.comment("Insn: #{insn.name}") - # 61/101 + # 62/101 case insn.name when :nop then nop(jit, ctx, asm) when :getlocal then getlocal(jit, ctx, asm) @@ -81,7 +81,7 @@ module RubyVM::MJIT when :opt_nil_p then opt_nil_p(jit, ctx, asm) # opt_str_uminus # opt_newarray_max - # opt_newarray_min + when :opt_newarray_min then opt_newarray_min(jit, ctx, asm) when :invokesuper then invokesuper(jit, ctx, asm) # invokeblock when :leave then leave(jit, ctx, asm) @@ -725,7 +725,31 @@ module RubyVM::MJIT # opt_str_uminus # opt_newarray_max - # opt_newarray_min + + # @param jit [RubyVM::MJIT::JITState] + # @param ctx [RubyVM::MJIT::Context] + # @param asm [RubyVM::MJIT::Assembler] + def opt_newarray_min(jit, ctx, asm) + num = jit.operand(0) + + # Save the PC and SP because we may allocate + jit_prepare_routine_call(jit, ctx, asm) + + offset_magnitude = C.VALUE.size * num + values_opnd = ctx.sp_opnd(-offset_magnitude) + asm.lea(:rax, values_opnd) + + asm.mov(C_ARGS[0], EC) + asm.mov(C_ARGS[1], num) + asm.mov(C_ARGS[2], :rax) + asm.call(C.rb_vm_opt_newarray_min) + + ctx.stack_pop(num) + stack_ret = ctx.stack_push + asm.mov(stack_ret, C_RET) + + KeepCompiling + end # @param jit [RubyVM::MJIT::JITState] # @param ctx [RubyVM::MJIT::Context] diff --git a/mjit_c.rb b/mjit_c.rb index b1c573fe6e..cabc6ccbcf 100644 --- a/mjit_c.rb +++ b/mjit_c.rb @@ -254,6 +254,13 @@ module RubyVM::MJIT # :nodoc: all } end + def rb_vm_opt_newarray_min + Primitive.cstmt! %{ + extern VALUE rb_vm_opt_newarray_min(rb_execution_context_t *ec, rb_num_t num, const VALUE *ptr); + return SIZET2NUM((size_t)rb_vm_opt_newarray_min); + } + end + #======================================================================================== # # Old stuff