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]->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)
|
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;
|
int64 shift = mInstructions[i + 0]->mSrc[0].mIntConst;
|
||||||
if (shift & 7)
|
if (shift & 7)
|
||||||
{
|
{
|
||||||
|
@ -20418,7 +20417,7 @@ bool InterCodeBasicBlock::PeepholeReplaceOptimization(const GrowingVariableArray
|
||||||
mInstructions[i + 1]->mSrc[0].mTemp < 0 &&
|
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 + 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]->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 + 2]->mSrc[0].mTemp < 0)
|
||||||
{
|
{
|
||||||
mInstructions[i + 0]->mSrc[0].mIntConst &= ~((1 << mInstructions[i + 1]->mSrc[0].mIntConst) - 1);
|
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);
|
GrowingTypeArray tstack(IT_NONE);
|
||||||
|
|
||||||
CheckFunc = !strcmp(mIdent->mString, "player_move");
|
CheckFunc = !strcmp(mIdent->mString, "equipment_navigate");
|
||||||
CheckCase = false;
|
CheckCase = false;
|
||||||
|
|
||||||
mEntryBlock = mBlocks[0];
|
mEntryBlock = mBlocks[0];
|
||||||
|
|
|
@ -72,7 +72,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::Dereference(InterCodeProcedure*
|
||||||
ins->mSrc[0].mStride = v.mReference == 1 ? v.mType->mStripe : 1;
|
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.LimitMin(v.mType->mMinValue);
|
||||||
ins->mDst.mRange.LimitMax(v.mType->mMaxValue);
|
ins->mDst.mRange.LimitMax(v.mType->mMaxValue);
|
||||||
|
@ -128,6 +128,12 @@ InterCodeGenerator::ExValue InterCodeGenerator::Dereference(InterCodeProcedure*
|
||||||
srins->mNumOperands = 2;
|
srins->mNumOperands = 2;
|
||||||
block->Append(srins);
|
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
|
// Promote unsigned bitfields that fit into a signed int to signed int
|
||||||
Declaration* vtype = v.mType;
|
Declaration* vtype = v.mType;
|
||||||
if (vtype->mSize == 2 && v.mBits < 16 && !(vtype->mFlags & DTF_SIGNED))
|
if (vtype->mSize == 2 && v.mBits < 16 && !(vtype->mFlags & DTF_SIGNED))
|
||||||
|
|
Loading…
Reference in New Issue