@@ -1642,9 +1642,6 @@ gen_defined(jitstate_t* jit, ctx_t* ctx)
1642
1642
static codegen_status_t
1643
1643
gen_checktype (jitstate_t * jit , ctx_t * ctx )
1644
1644
{
1645
- // TODO: could we specialize on the type we detect
1646
- uint8_t * side_exit = yjit_side_exit (jit , ctx );
1647
-
1648
1645
enum ruby_value_type type_val = (enum ruby_value_type )jit_get_arg (jit , 0 );
1649
1646
// Only three types are emitted by compile.c
1650
1647
if (type_val == T_STRING || type_val == T_ARRAY || type_val == T_HASH ) {
@@ -1669,28 +1666,31 @@ gen_checktype(jitstate_t* jit, ctx_t* ctx)
1669
1666
}
1670
1667
1671
1668
mov (cb , REG0 , val );
1669
+ mov (cb , REG1 , imm_opnd (Qfalse ));
1670
+
1671
+ uint32_t ret = cb_new_label (cb , "ret" );
1672
1672
1673
1673
if (!val_type .is_heap ) {
1674
1674
// if (SPECIAL_CONST_P(val)) {
1675
- // Bail if receiver is not a heap object
1675
+ // Return Qfalse via REG1 if not on heap
1676
1676
test (cb , REG0 , imm_opnd (RUBY_IMMEDIATE_MASK ));
1677
- jnz_ptr (cb , side_exit );
1678
- cmp (cb , REG0 , imm_opnd (Qfalse ));
1679
- je_ptr (cb , side_exit );
1677
+ jnz_label (cb , ret );
1680
1678
cmp (cb , REG0 , imm_opnd (Qnil ));
1681
- je_ptr (cb , side_exit );
1679
+ jbe_label (cb , ret );
1682
1680
}
1683
1681
1684
1682
// Check type on object
1685
1683
mov (cb , REG0 , mem_opnd (64 , REG0 , offsetof(struct RBasic , flags )));
1686
1684
and (cb , REG0 , imm_opnd (RUBY_T_MASK ));
1687
1685
cmp (cb , REG0 , imm_opnd (type_val ));
1688
1686
mov (cb , REG0 , imm_opnd (Qtrue ));
1689
- mov ( cb , REG1 , imm_opnd ( Qfalse ));
1690
- cmovne (cb , REG0 , REG1 );
1687
+ // REG1 contains Qfalse from above
1688
+ cmove (cb , REG1 , REG0 );
1691
1689
1690
+ cb_write_label (cb , ret );
1692
1691
stack_ret = ctx_stack_push (ctx , TYPE_IMM );
1693
- mov (cb , stack_ret , REG0 );
1692
+ mov (cb , stack_ret , REG1 );
1693
+ cb_link_labels (cb );
1694
1694
1695
1695
return YJIT_KEEP_COMPILING ;
1696
1696
} else {
0 commit comments