VarAction2: Add checks for vars 7B, 7C when getting previous single load
This commit is contained in:
@@ -5707,6 +5707,7 @@ static bool IsFeatureUsableForDSE(GrfSpecFeature feature)
|
|||||||
|
|
||||||
static const DeterministicSpriteGroupAdjust *GetVarAction2PreviousSingleLoadAdjust(const std::vector<DeterministicSpriteGroupAdjust> &adjusts, int start_index)
|
static const DeterministicSpriteGroupAdjust *GetVarAction2PreviousSingleLoadAdjust(const std::vector<DeterministicSpriteGroupAdjust> &adjusts, int start_index)
|
||||||
{
|
{
|
||||||
|
bool passed_store_perm = false;
|
||||||
for (int i = start_index; i >= 0; i--) {
|
for (int i = start_index; i >= 0; i--) {
|
||||||
const DeterministicSpriteGroupAdjust &prev = adjusts[i];
|
const DeterministicSpriteGroupAdjust &prev = adjusts[i];
|
||||||
if (prev.variable == 0x7E) {
|
if (prev.variable == 0x7E) {
|
||||||
@@ -5714,6 +5715,14 @@ static const DeterministicSpriteGroupAdjust *GetVarAction2PreviousSingleLoadAdju
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (prev.operation == DSGA_OP_RST) {
|
if (prev.operation == DSGA_OP_RST) {
|
||||||
|
if (prev.variable == 0x7B) {
|
||||||
|
/* Can't use this previous load as it depends on the last value */
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
if (prev.variable == 0x7C && passed_store_perm) {
|
||||||
|
/* If we passed a store perm then a load from permanent storage is not a valid previous load as we may have clobbered it */
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
return &prev;
|
return &prev;
|
||||||
} else if (prev.operation == DSGA_OP_STO) {
|
} else if (prev.operation == DSGA_OP_STO) {
|
||||||
if (prev.type == DSGA_TYPE_NONE && prev.variable == 0x1A && prev.shift_num == 0 && prev.and_mask < 0x100) {
|
if (prev.type == DSGA_TYPE_NONE && prev.variable == 0x1A && prev.shift_num == 0 && prev.and_mask < 0x100) {
|
||||||
@@ -5725,6 +5734,7 @@ static const DeterministicSpriteGroupAdjust *GetVarAction2PreviousSingleLoadAdju
|
|||||||
}
|
}
|
||||||
} else if (prev.operation == DSGA_OP_STOP) {
|
} else if (prev.operation == DSGA_OP_STOP) {
|
||||||
/* Permanent storage store */
|
/* Permanent storage store */
|
||||||
|
passed_store_perm = true;
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user