diff --git a/autotest/bitfields.cpp b/autotest/bitfields.cpp index 02031e7..470a3ba 100644 --- a/autotest/bitfields.cpp +++ b/autotest/bitfields.cpp @@ -334,7 +334,6 @@ void test_add_word_cross(void) } int main(void) { - test_char_fit(); test_char_cross(); test_word_fit(); diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index b4c9ddd..2fc270e 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -8129,6 +8129,8 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSetsForward(const GrowingVariab vr.mMinValue = 0; break; } + vr.mMinState = IntegerValueRange::S_BOUND; + vr.mMaxState = IntegerValueRange::S_BOUND; } } } @@ -8148,20 +8150,43 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSetsForward(const GrowingVariab if (ins->mSrc[0].mIntConst > 0) { - switch (ins->mSrc[1].mType) + if (vr.mMinState == IntegerValueRange::S_BOUND && vr.mMaxState == IntegerValueRange::S_BOUND) { - case IT_INT16: - vr.mMaxValue = (short)(int64min(32767, vr.mMaxValue)) >> ins->mSrc[0].mIntConst; - vr.mMinValue = (short)(int64max(-32768, vr.mMinValue)) >> ins->mSrc[0].mIntConst; - break; - case IT_INT8: - vr.mMaxValue = (char)(int64min(127, vr.mMaxValue)) >> ins->mSrc[0].mIntConst; - vr.mMinValue = (char)(int64max(-128, vr.mMinValue)) >> ins->mSrc[0].mIntConst; - break; - case IT_INT32: - vr.mMaxValue = (int)(vr.mMaxValue) >> ins->mSrc[0].mIntConst; - vr.mMinValue = (int)(vr.mMinValue) >> ins->mSrc[0].mIntConst; - break; + switch (ins->mSrc[1].mType) + { + case IT_INT16: + vr.mMaxValue = (short)(int64min(32767, vr.mMaxValue)) >> ins->mSrc[0].mIntConst; + vr.mMinValue = (short)(int64max(-32768, vr.mMinValue)) >> ins->mSrc[0].mIntConst; + break; + case IT_INT8: + vr.mMaxValue = (char)(int64min(127, vr.mMaxValue)) >> ins->mSrc[0].mIntConst; + vr.mMinValue = (char)(int64max(-128, vr.mMinValue)) >> ins->mSrc[0].mIntConst; + break; + case IT_INT32: + vr.mMaxValue = (int)(int64min(2147483647, vr.mMaxValue)) >> ins->mSrc[0].mIntConst; + vr.mMinValue = (int)(int64max(-2147483648, vr.mMinValue)) >> ins->mSrc[0].mIntConst; + break; + } + } + else + { + switch (ins->mSrc[1].mType) + { + case IT_INT16: + vr.mMaxValue = (short) 32767 >> ins->mSrc[0].mIntConst; + vr.mMinValue = (short)-32768 >> ins->mSrc[0].mIntConst; + break; + case IT_INT8: + vr.mMaxValue = (char) 127 >> ins->mSrc[0].mIntConst; + vr.mMinValue = (char)-128 >> ins->mSrc[0].mIntConst; + break; + case IT_INT32: + vr.mMaxValue = (int) 2147483647 >> ins->mSrc[0].mIntConst; + vr.mMinValue = (int)-2147483648 >> ins->mSrc[0].mIntConst; + break; + } + vr.mMinState = IntegerValueRange::S_BOUND; + vr.mMaxState = IntegerValueRange::S_BOUND; } } } @@ -8711,7 +8736,6 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray break; #endif case IA_CMPLS: - // Why limit weak, makes no sense if (s0 < 0) { mTrueValueRange[s1].LimitMax(mInstructions[sz - 2]->mSrc[0].mIntConst - 1); @@ -21191,7 +21215,7 @@ void InterCodeProcedure::Close(void) { GrowingTypeArray tstack(IT_NONE); - CheckFunc = !strcmp(mIdent->mString, "getch"); + CheckFunc = !strcmp(mIdent->mString, "interpret_builtin"); CheckCase = false; mEntryBlock = mBlocks[0];