diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 9ea1759..4607831 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -46899,6 +46899,28 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterateN(int i, int pass) return true; } } + else + { + mProc->ResetPatched(); + if (CheckForwardSumYPointer(this, mIns[i + 3].mAddress, mIns[i + 1].mAddress, mIns[i + 3], i + 7, yval, 3)) + { + mProc->ResetPatched(); + if (PatchForwardSumYPointer(this, mIns[i + 3].mAddress, mIns[i + 1].mAddress, mIns[i + 3], i + 7, yval)) + { + mIns[i + 1].CopyMode(mIns[i + 2]); + mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED; + mIns[i + 4].mType = ASMIT_NOP; mIns[i + 4].mMode = ASMIM_IMPLIED; + mIns[i + 5].mType = ASMIT_NOP; mIns[i + 5].mMode = ASMIM_IMPLIED; + mIns[i + 6].mType = ASMIT_NOP; mIns[i + 6].mMode = ASMIM_IMPLIED; + + if (mTrueJump) + mTrueJump->CheckLive(); + if (mFalseJump) + mFalseJump->CheckLive(); + return true; + } + } + } } #endif #if 1 @@ -50368,7 +50390,6 @@ void NativeCodeProcedure::Optimize(void) #endif - if (step == 2) { ResetVisited(); diff --git a/oscar64/Parser.cpp b/oscar64/Parser.cpp index 2059db2..b8ed7e6 100644 --- a/oscar64/Parser.cpp +++ b/oscar64/Parser.cpp @@ -1536,7 +1536,7 @@ Declaration * Parser::CopyConstantInitializer(int offset, Declaration* dtype, Ex uint8* Parser::ParseStringLiteral(int msize) { - int size = ustrlen(mScanner->mTokenString); + int size = mScanner->mTokenStringSize; if (size + 1 > msize) msize = size + 1; uint8* d = new uint8[msize]; @@ -1559,7 +1559,7 @@ uint8* Parser::ParseStringLiteral(int msize) // automatic string concatenation while (mScanner->mToken == TK_STRING) { - int s = ustrlen(mScanner->mTokenString); + int s = mScanner->mTokenStringSize; if (size + s + 1 > msize) msize = size + s + 1; @@ -5462,7 +5462,7 @@ Expression* Parser::ParseSimpleExpression(bool lhs, bool tid) case TK_STRING: { dec = new Declaration(mScanner->mLocation, DT_CONST_DATA); - int size = ustrlen(mScanner->mTokenString); + int size = mScanner->mTokenStringSize; dec->mSize = size + 1; dec->mVarIndex = -1; dec->mSection = mCodeSection; @@ -5490,7 +5490,7 @@ Expression* Parser::ParseSimpleExpression(bool lhs, bool tid) // automatic string concatenation while (mScanner->mToken == TK_STRING) { - int s = ustrlen(mScanner->mTokenString); + int s = mScanner->mTokenStringSize; uint8* d = new uint8[size + s + 1]; memcpy(d, dec->mData, size); int i = 0; diff --git a/oscar64/Scanner.cpp b/oscar64/Scanner.cpp index 06294c2..acd1d53 100644 --- a/oscar64/Scanner.cpp +++ b/oscar64/Scanner.cpp @@ -322,9 +322,9 @@ TokenSequence::TokenSequence(Scanner* scanner) { if (mToken == TK_STRING) { - int ssize = ustrlen(scanner->mTokenString); - uint8 * str = new uint8[ssize + 1]; - ustrcpy(str, scanner->mTokenString); + uint8 * str = new uint8[scanner->mTokenStringSize + 1]; + memcpy(str, scanner->mTokenString, scanner->mTokenStringSize + 1); + mTokenInteger = scanner->mTokenStringSize; mTokenString = str; } } @@ -487,7 +487,10 @@ void Scanner::NextToken(void) mTokenNumber = mReplay->mTokenNumber; mTokenInteger = mReplay->mTokenInteger; if (mReplay->mTokenString) - ustrcpy(mTokenString, mReplay->mTokenString); + { + mTokenStringSize = (int)mReplay->mTokenInteger; + memcpy(mTokenString, mReplay->mTokenString, mTokenStringSize + 1); + } mReplay = mReplay->mNext; } @@ -2064,7 +2067,7 @@ void Scanner::StringToken(char terminator, char mode) mTokenString[n++] = mTokenChar; } - + mTokenStringSize = n; mTokenString[n] = 0; if (mLine[mOffset] && mLine[mOffset] == terminator) diff --git a/oscar64/Scanner.h b/oscar64/Scanner.h index a7654e0..52d39df 100644 --- a/oscar64/Scanner.h +++ b/oscar64/Scanner.h @@ -259,6 +259,7 @@ public: const Ident * mTokenIdent; uint8 mTokenString[1024], mTokenChar; + int mTokenStringSize; uint8 * mTokenEmbed; int mTokenEmbedSize;