diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index 05831fc..ae0b11e 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -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]; diff --git a/oscar64/InterCodeGenerator.cpp b/oscar64/InterCodeGenerator.cpp index 8700a7e..f774ef4 100644 --- a/oscar64/InterCodeGenerator.cpp +++ b/oscar64/InterCodeGenerator.cpp @@ -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))