From c635ae8136c8beaa41e71c1490e2547507aa7fb7 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Sun, 10 Apr 2022 12:28:39 +0200 Subject: [PATCH] Optimize const and/or sequences --- oscar64/InterCode.cpp | 38 ++++++++++++++++++++++++++++++++++++++ oscar64/Parser.cpp | 22 ++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index 6c60550..ab6195d 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -8859,6 +8859,44 @@ void InterCodeBasicBlock::PeepholeOptimization(void) mInstructions[i + 0]->mSrc[0].mIntConst = ~((1LL << shift) - 1); changed = true; } +#if 1 + else if ( + mInstructions[i + 0]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 0]->mOperator == IA_OR && mInstructions[i + 0]->mSrc[0].mTemp < 0 && + mInstructions[i + 1]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 1]->mOperator == IA_AND && 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 ior = mInstructions[i + 0]->mSrc[0].mIntConst & mInstructions[i + 1]->mSrc[0].mIntConst; + int64 iand = mInstructions[i + 1]->mSrc[0].mIntConst; + + mInstructions[i + 0]->mOperator = IA_AND; + mInstructions[i + 0]->mSrc[0].mIntConst = iand; + mInstructions[i + 1]->mOperator = IA_OR; + mInstructions[i + 1]->mSrc[0].mIntConst = ior; + changed = true; + } +#endif +#if 1 + else if ( + mInstructions[i + 0]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 0]->mOperator == IA_AND && mInstructions[i + 0]->mSrc[0].mTemp < 0 && + mInstructions[i + 1]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 1]->mOperator == IA_AND && 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 + 0]->mSrc[0].mIntConst &= mInstructions[i + 1]->mSrc[0].mIntConst; + mInstructions[i + 0]->mDst = mInstructions[i + 1]->mDst; + mInstructions[i + 1]->mCode = IC_NONE; + changed = true; + } + else if ( + mInstructions[i + 0]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 0]->mOperator == IA_OR && mInstructions[i + 0]->mSrc[0].mTemp < 0 && + mInstructions[i + 1]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 1]->mOperator == IA_OR && 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 + 0]->mSrc[0].mIntConst |= mInstructions[i + 1]->mSrc[0].mIntConst; + mInstructions[i + 0]->mDst = mInstructions[i + 1]->mDst; + mInstructions[i + 1]->mCode = IC_NONE; + changed = true; + } +#endif #if 1 else if ( mInstructions[i + 0]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 0]->mOperator == IA_SHR && mInstructions[i + 0]->mSrc[0].mTemp < 0 && diff --git a/oscar64/Parser.cpp b/oscar64/Parser.cpp index 1e3732d..c5aa060 100644 --- a/oscar64/Parser.cpp +++ b/oscar64/Parser.cpp @@ -3434,6 +3434,28 @@ void Parser::ParsePragma(void) ConsumeToken(TK_CLOSE_PARENTHESIS); } + else if (!strcmp(mScanner->mTokenIdent->mString, "bss")) + { + mScanner->NextToken(); + ConsumeToken(TK_OPEN_PARENTHESIS); + + if (mScanner->mToken == TK_IDENT) + { + const Ident* sectionIdent = mScanner->mTokenIdent; + mScanner->NextToken(); + LinkerSection* lsec = mCompilationUnits->mLinker->FindSection(sectionIdent); + if (lsec) + { + mBSSection = lsec; + } + else + mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Section not defined"); + } + else + mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Section name expected"); + + ConsumeToken(TK_CLOSE_PARENTHESIS); + } else if (!strcmp(mScanner->mTokenIdent->mString, "align")) { mScanner->NextToken();