From 294d20018e05dc1340e0a80be3d54ef34f8d5eab Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Wed, 6 Sep 2023 16:01:49 -0700 Subject: [PATCH 1/2] Remove function call for String#bytesize String size is stored in a consistent location, so we can eliminate the function call. --- yjit/src/codegen.rs | 15 +++++++++++++-- yjit/src/cruby.rs | 1 - 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs index 92dd239c8b9f66..2fc6f3a5f69974 100644 --- a/yjit/src/codegen.rs +++ b/yjit/src/codegen.rs @@ -4697,10 +4697,21 @@ fn jit_rb_str_bytesize( asm.comment("String#bytesize"); let recv = asm.stack_pop(1); - let ret_opnd = asm.ccall(rb_str_bytesize as *const u8, vec![recv]); + + asm.comment("get string length"); + let str_len_opnd = Opnd::mem( + std::os::raw::c_long::BITS as u8, + asm.load(recv), + RUBY_OFFSET_RSTRING_LEN as i32, + ); + + let len = asm.load(str_len_opnd); + let shifted_val = asm.lshift(len, Opnd::UImm(1 as u64)); + let out_val = asm.or(shifted_val, Opnd::UImm(RUBY_FIXNUM_FLAG as u64)); let out_opnd = asm.stack_push(Type::Fixnum); - asm.mov(out_opnd, ret_opnd); + + asm.mov(out_opnd, out_val); true } diff --git a/yjit/src/cruby.rs b/yjit/src/cruby.rs index a8234e744aeae8..274331755f2579 100644 --- a/yjit/src/cruby.rs +++ b/yjit/src/cruby.rs @@ -135,7 +135,6 @@ extern "C" { ic: ICVARC, ) -> VALUE; pub fn rb_vm_ic_hit_p(ic: IC, reg_ep: *const VALUE) -> bool; - pub fn rb_str_bytesize(str: VALUE) -> VALUE; } // Renames From 15338507061f40b3bc65b24e6f33075311076a80 Mon Sep 17 00:00:00 2001 From: Maxime Chevalier-Boisvert Date: Wed, 6 Sep 2023 23:28:56 -0400 Subject: [PATCH 2/2] Update yjit/src/codegen.rs Co-authored-by: Takashi Kokubun --- yjit/src/codegen.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs index 2fc6f3a5f69974..a99594c3abd8d3 100644 --- a/yjit/src/codegen.rs +++ b/yjit/src/codegen.rs @@ -4706,7 +4706,7 @@ fn jit_rb_str_bytesize( ); let len = asm.load(str_len_opnd); - let shifted_val = asm.lshift(len, Opnd::UImm(1 as u64)); + let shifted_val = asm.lshift(len, Opnd::UImm(1)); let out_val = asm.or(shifted_val, Opnd::UImm(RUBY_FIXNUM_FLAG as u64)); let out_opnd = asm.stack_push(Type::Fixnum);