From 480270f4c9f60c1427a1060d9d8058103b980d94 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Sun, 24 Oct 2021 14:58:06 +0200 Subject: [PATCH] Fix array to pointer cast --- oscar64/InterCode.cpp | 7 +++++-- oscar64/InterCode.h | 2 +- oscar64/InterCodeGenerator.cpp | 5 +++++ oscar64/NativeCodeGenerator.cpp | 4 ++-- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index fc793d1..7ae4c81 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -1851,6 +1851,7 @@ InterCodeBasicBlock::InterCodeBasicBlock(void) mInPath = false; mLoopHead = false; mChecked = false; + mTraceIndex = -1; } InterCodeBasicBlock::~InterCodeBasicBlock(void) @@ -1924,15 +1925,17 @@ void InterCodeBasicBlock::GenerateTraces(bool expand) for (;;) { - if (mTrueJump && mTrueJump->mInstructions.Size() == 1 && mTrueJump->mInstructions[0]->mCode == IC_JUMP && !mTrueJump->mLoopHead) + if (mTrueJump && mTrueJump->mInstructions.Size() == 1 && mTrueJump->mInstructions[0]->mCode == IC_JUMP && !mTrueJump->mLoopHead && mTrueJump->mTraceIndex != mIndex) { + mTrueJump->mTraceIndex = mIndex; mTrueJump->mNumEntries--; mTrueJump = mTrueJump->mTrueJump; if (mTrueJump) mTrueJump->mNumEntries++; } - else if (mFalseJump && mFalseJump->mInstructions.Size() == 1 && mFalseJump->mInstructions[0]->mCode == IC_JUMP && !mFalseJump->mLoopHead) + else if (mFalseJump && mFalseJump->mInstructions.Size() == 1 && mFalseJump->mInstructions[0]->mCode == IC_JUMP && !mFalseJump->mLoopHead && mFalseJump->mTraceIndex != mIndex) { + mFalseJump->mTraceIndex = mIndex; mFalseJump->mNumEntries--; mFalseJump = mFalseJump->mTrueJump; if (mFalseJump) diff --git a/oscar64/InterCode.h b/oscar64/InterCode.h index 8ced327..e8b5c74 100644 --- a/oscar64/InterCode.h +++ b/oscar64/InterCode.h @@ -404,7 +404,7 @@ public: class InterCodeBasicBlock { public: - int mIndex, mNumEntries, mNumEntered; + int mIndex, mNumEntries, mNumEntered, mTraceIndex; InterCodeBasicBlock * mTrueJump, * mFalseJump, * mDominator; GrowingInstructionArray mInstructions; diff --git a/oscar64/InterCodeGenerator.cpp b/oscar64/InterCodeGenerator.cpp index 7920c8c..17ad296 100644 --- a/oscar64/InterCodeGenerator.cpp +++ b/oscar64/InterCodeGenerator.cpp @@ -2706,6 +2706,11 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* // no need for actual operation when casting pointer to pointer return ExValue(exp->mLeft->mDecType, vr.mTemp, vr.mReference); } + else if (exp->mLeft->mDecType->mType == DT_TYPE_POINTER && vr.mType->mType == DT_TYPE_ARRAY) + { + // no need for actual operation when casting pointer to pointer + return ExValue(exp->mLeft->mDecType, vr.mTemp, vr.mReference - 1); + } else if (exp->mLeft->mDecType->mType != DT_TYPE_VOID && vr.mType->mType == DT_TYPE_VOID) { mErrors->Error(exp->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Cannot cast void object to non void object"); diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 7dac173..92f3a73 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -7956,9 +7956,9 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(void) int apos, breg, ireg; if (FindAddressSumY(i, sreg, apos, breg, ireg)) { - if (breg != mIns[i + 0].mAddress || !(mIns[i + 0].mLive & LIVE_MEM)) + if (!(breg == sreg || ireg == sreg)|| !(mIns[i + 0].mLive & LIVE_MEM)) { - if (breg == mIns[i + 0].mAddress) + if (breg == sreg || ireg == sreg) { mIns[apos + 3].mType = ASMIT_NOP; mIns[apos + 3].mMode = ASMIM_IMPLIED;