VarAction2: Resolve jumps in advance to avoid needing to track nesting

This commit is contained in:
Jonathan G Rennison
2022-06-22 02:09:13 +01:00
parent b6e099121a
commit 229613b06a
3 changed files with 48 additions and 27 deletions

View File

@@ -7584,6 +7584,8 @@ static void OptimiseVarAction2DeterministicSpriteGroupInsertJumps(DeterministicS
{
if (HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2_INSERT_JUMPS)) return;
group->dsg_flags &= ~DSGF_CHECK_INSERT_JUMP;
OptimiseVarAction2DeterministicSpriteGroupPopulateLastVarReadAnnotations(group, var_tracking);
for (int i = (int)group->adjusts.size() - 1; i >= 1; i--) {
@@ -7630,12 +7632,38 @@ static void OptimiseVarAction2DeterministicSpriteGroupInsertJumps(DeterministicS
}
}
group->adjusts.insert(group->adjusts.begin() + j + 1, current);
group->dsg_flags |= DSGF_CHECK_INSERT_JUMP;
i++;
}
}
}
}
static uint OptimiseVarAction2DeterministicSpriteResolveJumpsInner(DeterministicSpriteGroup *group, const uint start)
{
for (uint i = start + 1; i < (uint)group->adjusts.size(); i++) {
if (group->adjusts[i].operation == DSGA_OP_JZ) {
i = OptimiseVarAction2DeterministicSpriteResolveJumpsInner(group, i);
} else if (group->adjusts[i].adjust_flags & DSGAF_END_BLOCK) {
group->adjusts[start].jump = i - start;
return i;
}
}
NOT_REACHED();
}
static void OptimiseVarAction2DeterministicSpriteResolveJumps(DeterministicSpriteGroup *group)
{
if (HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2_INSERT_JUMPS)) return;
for (uint i = 0; i < (uint)group->adjusts.size(); i++) {
if (group->adjusts[i].operation == DSGA_OP_JZ) {
i = OptimiseVarAction2DeterministicSpriteResolveJumpsInner(group, i);
}
}
}
static void OptimiseVarAction2DeterministicSpriteGroup(VarAction2OptimiseState &state, const GrfSpecFeature feature, const byte varsize, DeterministicSpriteGroup *group)
{
if (unlikely(HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2))) return;
@@ -8058,6 +8086,9 @@ static void HandleVarAction2OptimisationPasses()
if (group->dsg_flags & DSGF_CHECK_EXPENSIVE_VARS) {
OptimiseVarAction2DeterministicSpriteGroupExpensiveVars(group);
}
if (group->dsg_flags & DSGF_CHECK_INSERT_JUMP) {
OptimiseVarAction2DeterministicSpriteResolveJumps(group);
}
}
}