Fix enums in bitfields
This commit is contained in:
parent
e23d78eb86
commit
9de7caa68d
|
@ -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];
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in New Issue