Fix enums in bitfields

This commit is contained in:
drmortalwombat 2025-02-05 10:57:58 +01:00
parent e23d78eb86
commit 9de7caa68d
2 changed files with 9 additions and 4 deletions

View File

@ -19884,7 +19884,6 @@ bool InterCodeBasicBlock::PeepholeReplaceOptimization(const GrowingVariableArray
mInstructions[i + 1]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 1]->mOperator == IA_SHR && mInstructions[i + 1]->mSrc[0].mTemp < 0 &&
mInstructions[i + 1]->mSrc[1].mTemp == mInstructions[i + 0]->mDst.mTemp && mInstructions[i + 1]->mSrc[1].mFinal)
{
int64 shift = mInstructions[i + 0]->mSrc[0].mIntConst;
if (shift & 7)
{
@ -20418,7 +20417,7 @@ bool InterCodeBasicBlock::PeepholeReplaceOptimization(const GrowingVariableArray
mInstructions[i + 1]->mSrc[0].mTemp < 0 &&
mInstructions[i + 1]->mSrc[1].mTemp == mInstructions[i + 0]->mDst.mTemp && mInstructions[i + 1]->mSrc[1].mFinal &&
mInstructions[i + 2]->mCode == IC_RELATIONAL_OPERATOR &&
mInstructions[i + 2]->mSrc[1].mTemp == mInstructions[i + 1]->mDst.mTemp && mInstructions[i + 2]->mSrc[0].mFinal &&
mInstructions[i + 2]->mSrc[1].mTemp == mInstructions[i + 1]->mDst.mTemp && mInstructions[i + 2]->mSrc[1].mFinal &&
mInstructions[i + 2]->mSrc[0].mTemp < 0)
{
mInstructions[i + 0]->mSrc[0].mIntConst &= ~((1 << mInstructions[i + 1]->mSrc[0].mIntConst) - 1);
@ -23227,7 +23226,7 @@ void InterCodeProcedure::Close(void)
{
GrowingTypeArray tstack(IT_NONE);
CheckFunc = !strcmp(mIdent->mString, "player_move");
CheckFunc = !strcmp(mIdent->mString, "equipment_navigate");
CheckCase = false;
mEntryBlock = mBlocks[0];

View File

@ -72,7 +72,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::Dereference(InterCodeProcedure*
ins->mSrc[0].mStride = v.mReference == 1 ? v.mType->mStripe : 1;
if (v.mReference == 1 && v.mType->mType == DT_TYPE_ENUM)
if (v.mReference == 1 && v.mType->mType == DT_TYPE_ENUM && !v.mBits)
{
ins->mDst.mRange.LimitMin(v.mType->mMinValue);
ins->mDst.mRange.LimitMax(v.mType->mMaxValue);
@ -128,6 +128,12 @@ InterCodeGenerator::ExValue InterCodeGenerator::Dereference(InterCodeProcedure*
srins->mNumOperands = 2;
block->Append(srins);
if (v.mType->mType == DT_TYPE_ENUM)
{
srins->mDst.mRange.LimitMin(v.mType->mMinValue);
srins->mDst.mRange.LimitMax(v.mType->mMaxValue);
}
// Promote unsigned bitfields that fit into a signed int to signed int
Declaration* vtype = v.mType;
if (vtype->mSize == 2 && v.mBits < 16 && !(vtype->mFlags & DTF_SIGNED))