Skip to content

Commit 3340548

Browse files
committed
reorder gen_guard_type, more specific go first
1 parent 8b14d2a commit 3340548

1 file changed

Lines changed: 10 additions & 10 deletions

File tree

zjit/src/codegen.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)