@@ -2545,7 +2545,7 @@ fn gen_guard_type(jit: &mut JITState, asm: &mut Assembler, val: lir::Opnd, guard
25452545
25462546 asm. cmp ( klass, Opnd :: Value ( expected_class) ) ;
25472547 asm. jne ( jit, side_exit) ;
2548- } else if let Some ( builtin_type ) = guard_type. builtin_type_equivalent ( ) {
2548+ } else if guard_type. is_subtype ( types :: TypedTData ) {
25492549 let side = side_exit ( jit, state, GuardType ( guard_type) ) ;
25502550
25512551 // Check special constant
@@ -2556,13 +2556,15 @@ fn gen_guard_type(jit: &mut JITState, asm: &mut Assembler, val: lir::Opnd, guard
25562556 asm. cmp ( val, Qfalse . into ( ) ) ;
25572557 asm. je ( jit, side. clone ( ) ) ;
25582558
2559- // Mask and check the builtin type
2559+ // Check the builtin type and RUBY_TYPED_FL_IS_TYPED_DATA with mask and compare
25602560 let val = asm. load_mem ( val) ;
25612561 let flags = asm. load ( Opnd :: mem ( VALUE_BITS , val, RUBY_OFFSET_RBASIC_FLAGS ) ) ;
2562- let tag = asm. and ( flags, Opnd :: UImm ( RUBY_T_MASK as u64 ) ) ;
2563- asm. cmp ( tag, Opnd :: UImm ( builtin_type as u64 ) ) ;
2562+ let mask = RUBY_T_MASK . to_usize ( ) | RUBY_TYPED_FL_IS_TYPED_DATA . to_usize ( ) ;
2563+ let expected = RUBY_T_DATA . to_usize ( ) | RUBY_TYPED_FL_IS_TYPED_DATA . to_usize ( ) ;
2564+ let masked = asm. and ( flags, mask. into ( ) ) ;
2565+ asm. cmp ( masked, expected. into ( ) ) ;
25642566 asm. jne ( jit, side) ;
2565- } else if guard_type. is_subtype ( types :: TypedTData ) {
2567+ } else if let Some ( builtin_type ) = guard_type. builtin_type_equivalent ( ) {
25662568 let side = side_exit ( jit, state, GuardType ( guard_type) ) ;
25672569
25682570 // Check special constant
@@ -2573,13 +2575,11 @@ fn gen_guard_type(jit: &mut JITState, asm: &mut Assembler, val: lir::Opnd, guard
25732575 asm. cmp ( val, Qfalse . into ( ) ) ;
25742576 asm. je ( jit, side. clone ( ) ) ;
25752577
2576- // Check the builtin type and RUBY_TYPED_FL_IS_TYPED_DATA with mask and compare
2578+ // Mask and check the builtin type
25772579 let val = asm. load_mem ( val) ;
25782580 let flags = asm. load ( Opnd :: mem ( VALUE_BITS , val, RUBY_OFFSET_RBASIC_FLAGS ) ) ;
2579- let mask = RUBY_T_MASK . to_usize ( ) | RUBY_TYPED_FL_IS_TYPED_DATA . to_usize ( ) ;
2580- let expected = RUBY_T_DATA . to_usize ( ) | RUBY_TYPED_FL_IS_TYPED_DATA . to_usize ( ) ;
2581- let masked = asm. and ( flags, mask. into ( ) ) ;
2582- asm. cmp ( masked, expected. into ( ) ) ;
2581+ let tag = asm. and ( flags, Opnd :: UImm ( RUBY_T_MASK as u64 ) ) ;
2582+ asm. cmp ( tag, Opnd :: UImm ( builtin_type as u64 ) ) ;
25832583 asm. jne ( jit, side) ;
25842584 } else if guard_type. bit_equal ( types:: HeapBasicObject ) {
25852585 let side_exit = side_exit ( jit, state, GuardType ( guard_type) ) ;
0 commit comments