From 74681f70d9a557add1d8727b840716ecc69fc277 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Mon, 6 Jun 2022 23:13:09 +0100 Subject: [PATCH] VarAction2: Replace inverted OR of bools with AND where this makes sense --- src/newgrf.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 4d60cbfa7d..a6ea96a0b3 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -6105,6 +6105,25 @@ static void OptimiseVarAction2Adjust(VarAction2OptimiseState &state, const GrfSp state.inference = VA2AIF_SIGNED_NON_NEGATIVE | VA2AIF_ONE_OR_ZERO | VA2AIF_SINGLE_LOAD; break; } + if (prev.operation == DSGA_OP_OR && (prev.type == DSGA_TYPE_EQ || prev.type == DSGA_TYPE_NEQ) && group->adjusts.size() >= 3) { + DeterministicSpriteGroupAdjust &prev2 = group->adjusts[group->adjusts.size() - 3]; + bool found = false; + if (prev2.operation == DSGA_OP_SLT || prev2.operation == DSGA_OP_SGE || prev2.operation == DSGA_OP_SLE || prev2.operation == DSGA_OP_SGT) { + prev2.operation = (DeterministicSpriteGroupAdjustOperation)(prev2.operation ^ 1); + found = true; + } else if (prev2.operation == DSGA_OP_RST && (prev2.type == DSGA_TYPE_EQ || prev2.type == DSGA_TYPE_NEQ) ) { + prev2.type = (prev2.type == DSGA_TYPE_EQ) ? DSGA_TYPE_NEQ : DSGA_TYPE_EQ; + found = true; + } + if (found) { + prev.type = (prev.type == DSGA_TYPE_EQ) ? DSGA_TYPE_NEQ : DSGA_TYPE_EQ; + prev.operation = DSGA_OP_AND; + prev.adjust_flags = DSGAF_SKIP_ON_ZERO; + group->adjusts.pop_back(); + state.inference = VA2AIF_SIGNED_NON_NEGATIVE | VA2AIF_ONE_OR_ZERO; + break; + } + } } if (prev.operation == DSGA_OP_OR && prev.type == DSGA_TYPE_NONE && prev.variable == 0x1A && prev.shift_num == 0 && prev.and_mask == adjust.and_mask) { prev.operation = DSGA_OP_AND;