@@ -942,11 +942,29 @@ gen_jz_to_target0(codeblock_t *cb, uint8_t *target0, uint8_t *target1, uint8_t s
942942 }
943943}
944944
945+ static void
946+ gen_jbe_to_target0 (codeblock_t * cb , uint8_t * target0 , uint8_t * target1 , uint8_t shape )
947+ {
948+ switch (shape )
949+ {
950+ case SHAPE_NEXT0 :
951+ case SHAPE_NEXT1 :
952+ RUBY_ASSERT (false);
953+ break ;
954+
955+ case SHAPE_DEFAULT :
956+ jbe_ptr (cb , target0 );
957+ break ;
958+ }
959+ }
960+
945961enum jcc_kinds {
946962 JCC_JNE ,
947963 JCC_JNZ ,
948964 JCC_JZ ,
949965 JCC_JE ,
966+ JCC_JBE ,
967+ JCC_JNA ,
950968};
951969
952970// Generate a jump to a stub that recompiles the current YARV instruction on failure.
@@ -965,6 +983,10 @@ jit_chain_guard(enum jcc_kinds jcc, jitstate_t *jit, const ctx_t *ctx, uint8_t d
965983 case JCC_JE :
966984 target0_gen_fn = gen_jz_to_target0 ;
967985 break ;
986+ case JCC_JBE :
987+ case JCC_JNA :
988+ target0_gen_fn = gen_jbe_to_target0 ;
989+ break ;
968990 default :
969991 RUBY_ASSERT (false && "unimplemented jump kind" );
970992 break ;
@@ -2258,9 +2280,9 @@ jit_guard_known_klass(jitstate_t *jit, ctx_t *ctx, VALUE known_klass, insn_opnd_
22582280 ADD_COMMENT (cb , "guard not immediate" );
22592281 RUBY_ASSERT (Qfalse < Qnil );
22602282 test (cb , REG0 , imm_opnd (RUBY_IMMEDIATE_MASK ));
2261- jnz_ptr ( cb , side_exit );
2283+ jit_chain_guard ( JCC_JNZ , jit , ctx , max_chain_depth , side_exit );
22622284 cmp (cb , REG0 , imm_opnd (Qnil ));
2263- jbe_ptr ( cb , side_exit );
2285+ jit_chain_guard ( JCC_JBE , jit , ctx , max_chain_depth , side_exit );
22642286
22652287 ctx_set_opnd_type (ctx , insn_opnd , TYPE_HEAP );
22662288 }
0 commit comments