summaryrefslogtreecommitdiff
path: root/lib/ruby_vm/mjit
diff options
context:
space:
mode:
authorTakashi Kokubun <[email protected]>2023-03-03 23:55:38 -0800
committerTakashi Kokubun <[email protected]>2023-03-05 23:28:59 -0800
commit9ee724408c1da10c7323c07405d5e01182aeb0bd (patch)
tree15ad4a682eb0d8bc77f639e75dcb0e2601f0d30d /lib/ruby_vm/mjit
parent9556b6368f93f60b2e46d2a6e030321413a9d8d0 (diff)
Optimize #nil?
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/7448
Diffstat (limited to 'lib/ruby_vm/mjit')
-rw-r--r--lib/ruby_vm/mjit/insn_compiler.rb28
1 files changed, 26 insertions, 2 deletions
diff --git a/lib/ruby_vm/mjit/insn_compiler.rb b/lib/ruby_vm/mjit/insn_compiler.rb
index 4e2069adf3..f1367b9ce6 100644
--- a/lib/ruby_vm/mjit/insn_compiler.rb
+++ b/lib/ruby_vm/mjit/insn_compiler.rb
@@ -2075,6 +2075,30 @@ module RubyVM::MJIT
# @param jit [RubyVM::MJIT::JITState]
# @param ctx [RubyVM::MJIT::Context]
# @param asm [RubyVM::MJIT::Assembler]
+ def jit_rb_true(jit, ctx, asm, argc, _known_recv_class)
+ return false if argc != 0
+ asm.comment('nil? == true');
+ ctx.stack_pop(1)
+ stack_ret = ctx.stack_push
+ asm.mov(stack_ret, Qtrue)
+ true
+ end
+
+ # @param jit [RubyVM::MJIT::JITState]
+ # @param ctx [RubyVM::MJIT::Context]
+ # @param asm [RubyVM::MJIT::Assembler]
+ def jit_rb_false(jit, ctx, asm, argc, _known_recv_class)
+ return false if argc != 0
+ asm.comment('nil? == false');
+ ctx.stack_pop(1)
+ stack_ret = ctx.stack_push
+ asm.mov(stack_ret, Qfalse)
+ true
+ end
+
+ # @param jit [RubyVM::MJIT::JITState]
+ # @param ctx [RubyVM::MJIT::Context]
+ # @param asm [RubyVM::MJIT::Assembler]
def jit_rb_obj_not(jit, ctx, asm, argc, _known_recv_class)
return false if argc != 0
asm.comment('rb_obj_not')
@@ -2255,8 +2279,8 @@ module RubyVM::MJIT
# Specialization for C methods. See register_cfunc_method for details.
register_cfunc_method(BasicObject, :!, :jit_rb_obj_not)
- #register_cfunc_method(NilClass, :nil?, :jit_rb_true)
- #register_cfunc_method(Kernel, :nil?, :jit_rb_false)
+ register_cfunc_method(NilClass, :nil?, :jit_rb_true)
+ register_cfunc_method(Kernel, :nil?, :jit_rb_false)
#register_cfunc_method(Kernel, :is_a?, :jit_rb_kernel_is_a)
#register_cfunc_method(Kernel, :kind_of?, :jit_rb_kernel_is_a)
#register_cfunc_method(Kernel, :instance_of?, :jit_rb_kernel_instance_of)