JIT: tweak to avoid register reload on some branches
This commit is contained in:
parent
fac3c6fbc6
commit
7efff33831
|
@ -1153,12 +1153,15 @@ static int finish_branch_with_true(mz_jit_state *jitter, Branch_Info *for_branch
|
||||||
static int finish_branch_with_false(mz_jit_state *jitter, Branch_Info *for_branch)
|
static int finish_branch_with_false(mz_jit_state *jitter, Branch_Info *for_branch)
|
||||||
{
|
{
|
||||||
GC_CAN_IGNORE jit_insn *ref;
|
GC_CAN_IGNORE jit_insn *ref;
|
||||||
|
int reg_valid;
|
||||||
|
|
||||||
scheme_prepare_branch_jump(jitter, for_branch);
|
scheme_prepare_branch_jump(jitter, for_branch);
|
||||||
CHECK_LIMIT();
|
CHECK_LIMIT();
|
||||||
|
|
||||||
__START_SHORT_JUMPS__(for_branch->branch_short);
|
__START_SHORT_JUMPS__(for_branch->branch_short);
|
||||||
|
reg_valid = mz_CURRENT_REG_STATUS_VALID();
|
||||||
ref = jit_jmpi(jit_forward());
|
ref = jit_jmpi(jit_forward());
|
||||||
|
mz_SET_REG_STATUS_VALID(reg_valid);
|
||||||
add_branch(for_branch, ref, BRANCH_ADDR_FALSE, BRANCH_ADDR_UCBRANCH);
|
add_branch(for_branch, ref, BRANCH_ADDR_FALSE, BRANCH_ADDR_UCBRANCH);
|
||||||
__END_SHORT_JUMPS__(for_branch->branch_short);
|
__END_SHORT_JUMPS__(for_branch->branch_short);
|
||||||
|
|
||||||
|
@ -1170,8 +1173,12 @@ void scheme_branch_for_true(mz_jit_state *jitter, Branch_Info *for_branch)
|
||||||
{
|
{
|
||||||
if (for_branch->true_needs_jump) {
|
if (for_branch->true_needs_jump) {
|
||||||
GC_CAN_IGNORE jit_insn *ref;
|
GC_CAN_IGNORE jit_insn *ref;
|
||||||
|
int reg_valid;
|
||||||
|
|
||||||
|
reg_valid = mz_CURRENT_REG_STATUS_VALID();
|
||||||
ref = jit_jmpi(jit_forward());
|
ref = jit_jmpi(jit_forward());
|
||||||
|
mz_SET_REG_STATUS_VALID(reg_valid);
|
||||||
|
|
||||||
add_branch(for_branch, ref, BRANCH_ADDR_TRUE, BRANCH_ADDR_UCBRANCH);
|
add_branch(for_branch, ref, BRANCH_ADDR_TRUE, BRANCH_ADDR_UCBRANCH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1179,13 +1186,17 @@ void scheme_branch_for_true(mz_jit_state *jitter, Branch_Info *for_branch)
|
||||||
static int finish_branch(mz_jit_state *jitter, int target, Branch_Info *for_branch)
|
static int finish_branch(mz_jit_state *jitter, int target, Branch_Info *for_branch)
|
||||||
{
|
{
|
||||||
GC_CAN_IGNORE jit_insn *ref;
|
GC_CAN_IGNORE jit_insn *ref;
|
||||||
|
int reg_valid;
|
||||||
|
|
||||||
scheme_prepare_branch_jump(jitter, for_branch);
|
scheme_prepare_branch_jump(jitter, for_branch);
|
||||||
CHECK_LIMIT();
|
CHECK_LIMIT();
|
||||||
|
|
||||||
__START_SHORT_JUMPS__(for_branch->branch_short);
|
__START_SHORT_JUMPS__(for_branch->branch_short);
|
||||||
|
|
||||||
|
reg_valid = mz_CURRENT_REG_STATUS_VALID();
|
||||||
ref = jit_beqi_p(jit_forward(), target, scheme_false);
|
ref = jit_beqi_p(jit_forward(), target, scheme_false);
|
||||||
|
mz_SET_REG_STATUS_VALID(reg_valid);
|
||||||
|
|
||||||
add_branch(for_branch, ref, BRANCH_ADDR_FALSE, BRANCH_ADDR_BRANCH);
|
add_branch(for_branch, ref, BRANCH_ADDR_FALSE, BRANCH_ADDR_BRANCH);
|
||||||
|
|
||||||
scheme_branch_for_true(jitter, for_branch);
|
scheme_branch_for_true(jitter, for_branch);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user