Skip to content

Commit 3aa3411

Browse files
authored
Merge pull request #112 from jhawthorn/immediate_chain_guard
Allow chaining on immediate guard
2 parents 8d88af1 + 8a16a0d commit 3aa3411

File tree

1 file changed

+24
-2
lines changed

1 file changed

+24
-2
lines changed

yjit_codegen.c

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
945961
enum 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

Comments
 (0)