ruby-changes:74149
From: Nobuyoshi <ko1@a...>
Date: Fri, 21 Oct 2022 04:43:57 +0900 (JST)
Subject: [ruby-changes:74149] 245ad2b38a (master): YJIT: incorporate ruby_special_consts
https://git.ruby-lang.org/ruby.git/commit/?id=245ad2b38a From 245ad2b38a4a1a13297cb7adfb79834db48aedd3 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada <nobu@r...> Date: Thu, 20 Oct 2022 23:19:22 +0900 Subject: YJIT: incorporate ruby_special_consts --- yjit/bindgen/src/main.rs | 3 +++ yjit/src/codegen.rs | 4 +--- yjit/src/cruby.rs | 31 +++++++++++++------------------ yjit/src/cruby_bindings.inc.rs | 11 +++++++++++ 4 files changed, 28 insertions(+), 21 deletions(-) diff --git a/yjit/bindgen/src/main.rs b/yjit/bindgen/src/main.rs index 7bdfdade77..f7ebb88577 100644 --- a/yjit/bindgen/src/main.rs +++ b/yjit/bindgen/src/main.rs @@ -66,6 +66,9 @@ fn main() { https://github.com/ruby/ruby/blob/trunk/yjit/bindgen/src/main.rs#L66 // From include/ruby/internal/config.h .allowlist_var("USE_RVARGC") + // From include/ruby/internal/special_consts.h + .allowlist_type("ruby_special_consts") + // From include/ruby/internal/intern/string.h .allowlist_function("rb_utf8_str_new") .allowlist_function("rb_str_buf_append") diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs index 196baf9689..5d144458e8 100644 --- a/yjit/src/codegen.rs +++ b/yjit/src/codegen.rs @@ -3296,8 +3296,7 @@ fn gen_branchunless( https://github.com/ruby/ruby/blob/trunk/yjit/src/codegen.rs#L3296 gen_direct_jump(jit, ctx, target, asm); } else { // Test if any bit (outside of the Qnil bit) is on - // RUBY_Qfalse /* ...0000 0000 */ - // RUBY_Qnil /* ...0000 1000 */ + // See RB_TEST() let not_qnil = !Qnil.as_i64(); asm.test(val_opnd, not_qnil.into()); @@ -3368,7 +3367,6 @@ fn gen_branchnil( https://github.com/ruby/ruby/blob/trunk/yjit/src/codegen.rs#L3367 gen_direct_jump(jit, ctx, target, asm); } else { // Test if the value is Qnil - // RUBY_Qnil /* ...0000 1000 */ asm.cmp(val_opnd, Opnd::UImm(Qnil.into())); // Generate the branch instructions gen_branch( diff --git a/yjit/src/cruby.rs b/yjit/src/cruby.rs index 81db0deab3..d8dbdb4019 100644 --- a/yjit/src/cruby.rs +++ b/yjit/src/cruby.rs @@ -322,7 +322,8 @@ impl VALUE { https://github.com/ruby/ruby/blob/trunk/yjit/src/cruby.rs#L322 /// Return true if the number is an immediate integer, flonum or static symbol fn immediate_p(self) -> bool { let VALUE(cval) = self; - (cval & 7) != 0 + let mask = RUBY_IMMEDIATE_MASK as usize; + (cval & mask) != 0 } /// Return true if the value is a Ruby immediate integer, flonum, static symbol, nil or false @@ -333,19 +334,23 @@ impl VALUE { https://github.com/ruby/ruby/blob/trunk/yjit/src/cruby.rs#L334 /// Return true if the value is a Ruby Fixnum (immediate-size integer) pub fn fixnum_p(self) -> bool { let VALUE(cval) = self; - (cval & 1) == 1 + let flag = RUBY_FIXNUM_FLAG as usize; + (cval & flag) == flag } /// Return true if the value is an immediate Ruby floating-point number (flonum) pub fn flonum_p(self) -> bool { let VALUE(cval) = self; - (cval & 3) == 2 + let mask = RUBY_FLONUM_MASK as usize; + let flag = RUBY_FLONUM_FLAG as usize; + (cval & mask) == flag } /// Return true for a static (non-heap) Ruby symbol pub fn static_sym_p(self) -> bool { let VALUE(cval) = self; - (cval & 0xff) == RUBY_SYMBOL_FLAG + let flag = RUBY_SYMBOL_FLAG as usize; + (cval & 0xff) == flag } /// Returns true or false depending on whether the value is nil @@ -595,13 +600,13 @@ where https://github.com/ruby/ruby/blob/trunk/yjit/src/cruby.rs#L600 // Non-idiomatic capitalization for consistency with CRuby code #[allow(non_upper_case_globals)] -pub const Qfalse: VALUE = VALUE(0); +pub const Qfalse: VALUE = VALUE(RUBY_Qfalse as usize); #[allow(non_upper_case_globals)] -pub const Qnil: VALUE = VALUE(4); +pub const Qnil: VALUE = VALUE(RUBY_Qnil as usize); #[allow(non_upper_case_globals)] -pub const Qtrue: VALUE = VALUE(20); +pub const Qtrue: VALUE = VALUE(RUBY_Qtrue as usize); #[allow(non_upper_case_globals)] -pub const Qundef: VALUE = VALUE(0x24); +pub const Qundef: VALUE = VALUE(RUBY_Qundef as usize); #[allow(unused)] mod manual_defs { @@ -615,16 +620,6 @@ mod manual_defs { https://github.com/ruby/ruby/blob/trunk/yjit/src/cruby.rs#L620 pub const RUBY_FIXNUM_MIN: isize = RUBY_LONG_MIN / 2; pub const RUBY_FIXNUM_MAX: isize = RUBY_LONG_MAX / 2; - pub const RUBY_FIXNUM_FLAG: usize = 0x1; - - // All these are defined in include/ruby/internal/special_consts.h, - // in the same enum as RUBY_Qfalse, etc. - // Do we want to switch to using Ruby's definition of Qnil, Qfalse, etc? - pub const RUBY_SYMBOL_FLAG: usize = 0x0c; - pub const RUBY_FLONUM_FLAG: usize = 0x2; - pub const RUBY_FLONUM_MASK: usize = 0x3; - pub const RUBY_SPECIAL_SHIFT: usize = 8; - pub const RUBY_IMMEDIATE_MASK: usize = 0x7; // From vm_callinfo.h - uses calculation that seems to confuse bindgen pub const VM_CALL_ARGS_SPLAT: u32 = 1 << VM_CALL_ARGS_SPLAT_bit; diff --git a/yjit/src/cruby_bindings.inc.rs b/yjit/src/cruby_bindings.inc.rs index 00bade6b70..ab5db31f93 100644 --- a/yjit/src/cruby_bindings.inc.rs +++ b/yjit/src/cruby_bindings.inc.rs @@ -152,6 +152,17 @@ extern "C" { https://github.com/ruby/ruby/blob/trunk/yjit/src/cruby_bindings.inc.rs#L152 extern "C" { pub fn rb_method_basic_definition_p(klass: VALUE, mid: ID) -> ::std::os::raw::c_int; } +pub const RUBY_Qfalse: ruby_special_consts = 0; +pub const RUBY_Qnil: ruby_special_consts = 4; +pub const RUBY_Qtrue: ruby_special_consts = 20; +pub const RUBY_Qundef: ruby_special_consts = 36; +pub const RUBY_IMMEDIATE_MASK: ruby_special_consts = 7; +pub const RUBY_FIXNUM_FLAG: ruby_special_consts = 1; +pub const RUBY_FLONUM_MASK: ruby_special_consts = 3; +pub const RUBY_FLONUM_FLAG: ruby_special_consts = 2; +pub const RUBY_SYMBOL_FLAG: ruby_special_consts = 12; +pub const RUBY_SPECIAL_SHIFT: ruby_special_consts = 8; +pub type ruby_special_consts = u32; #[repr(C)] pub struct RBasic { pub flags: VALUE, -- cgit v1.2.3 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/