diff --git a/include/c64/iecbus.c b/include/c64/iecbus.c index a9560ff..84b0f52 100644 --- a/include/c64/iecbus.c +++ b/include/c64/iecbus.c @@ -239,12 +239,14 @@ int iec_write_bytes(const char * data, int num) int iec_read_bytes(char * data, int num) { - for(int i=0; imBase = mBase; - if (mType == DT_TYPE_STRUCT) + if (mType == DT_TYPE_STRUCT || mType == DT_TYPE_UNION) { ndec->mScope = new DeclarationScope(nullptr, mScope->mLevel); Declaration * p = mParams; diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index f6da5ef..d706537 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -6220,8 +6220,9 @@ bool InterCodeBasicBlock::PropagateVariableCopy(const GrowingInstructionPtrArray ins->mSrc[0].mMemory = ltemps[k]->mSrc[0].mMemory; ins->mSrc[0].mTemp = ltemps[k]->mSrc[0].mTemp; ins->mSrc[0].mVarIndex = ltemps[k]->mSrc[0].mVarIndex; - ins->mSrc[0].mIntConst += ltemps[k]->mSrc[0].mIntConst; + ins->mSrc[0].mIntConst = ins->mSrc[0].mIntConst * ltemps[k]->mSrc[0].mStride + ltemps[k]->mSrc[0].mIntConst; ins->mSrc[0].mLinkerObject = ltemps[k]->mSrc[0].mLinkerObject; + ins->mSrc[0].mStride = ltemps[k]->mSrc[0].mStride; changed = true; } } @@ -10608,6 +10609,7 @@ bool InterCodeBasicBlock::LoadStoreForwarding(const GrowingInstructionPtrArray& int64 offset = ins->mSrc->mIntConst - cins->mSrc[1].mIntConst; ins->mSrc[0] = cins->mSrc[0]; + ins->mSrc[0].mOperandSize = InterTypeSize[ins->mDst.mType]; ins->mSrc[0].mIntConst += offset; changed = true; } @@ -11318,7 +11320,7 @@ bool InterCodeBasicBlock::MergeCommonPathInstructions(void) if (tins->mCode != IC_BRANCH && tins->mCode != IC_JUMP && !(nins && nins->mCode == IC_BRANCH && tins->mDst.mTemp == nins->mSrc[0].mTemp)) { int fi = 0; - while (fi < mFalseJump->mInstructions.Size() && !tins->IsEqualSource(mFalseJump->mInstructions[fi])) + while (fi < mFalseJump->mInstructions.Size() && !(tins->mCode == mFalseJump->mInstructions[fi]->mCode && tins->mDst.mType == mFalseJump->mInstructions[fi]->mDst.mType && tins->IsEqualSource(mFalseJump->mInstructions[fi]))) fi++; if (fi < mFalseJump->mInstructions.Size()) @@ -15810,11 +15812,12 @@ bool InterCodeBasicBlock::PeepholeReplaceOptimization(const GrowingVariableArray mInstructions[i + 1]->mSrc[0] = io; changed = true; } - +#if 1 else if ( mInstructions[i + 0]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 0]->mOperator == IA_ADD && mInstructions[i + 1]->mCode == IC_LEA && mInstructions[i + 1]->mSrc[0].mTemp == mInstructions[i + 0]->mDst.mTemp && mInstructions[i + 1]->mSrc[0].mFinal && - mInstructions[i + 0]->mSrc[1].IsUByte() && !mInstructions[i + 0]->mSrc[0].IsUByte()) + mInstructions[i + 0]->mSrc[1].IsUByte() && !mInstructions[i + 0]->mSrc[0].IsUByte() && + mInstructions[i + 0]->mDst.mTemp != mInstructions[i + 0]->mSrc[1].mTemp) { mInstructions[i + 1]->mSrc[0] = mInstructions[i + 0]->mSrc[1]; @@ -15831,7 +15834,8 @@ bool InterCodeBasicBlock::PeepholeReplaceOptimization(const GrowingVariableArray else if ( mInstructions[i + 0]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 0]->mOperator == IA_ADD && mInstructions[i + 1]->mCode == IC_LEA && mInstructions[i + 1]->mSrc[0].mTemp == mInstructions[i + 0]->mDst.mTemp && mInstructions[i + 1]->mSrc[0].mFinal && - mInstructions[i + 0]->mSrc[0].IsUByte() && !mInstructions[i + 0]->mSrc[1].IsUByte()) + mInstructions[i + 0]->mSrc[0].IsUByte() && !mInstructions[i + 0]->mSrc[1].IsUByte() && + mInstructions[i + 0]->mDst.mTemp != mInstructions[i + 0]->mSrc[0].mTemp) { mInstructions[i + 1]->mSrc[0] = mInstructions[i + 0]->mSrc[0]; @@ -15845,6 +15849,7 @@ bool InterCodeBasicBlock::PeepholeReplaceOptimization(const GrowingVariableArray mInstructions[i + 1]->mSrc[1].mMemory = IM_INDIRECT; changed = true; } +#endif #if 1 else if ( mInstructions[i + 0]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 0]->mOperator == IA_ADD && mInstructions[i + 0]->mSrc[0].mTemp < 0 && mInstructions[i + 0]->mSrc[0].mIntConst >= 0 && mInstructions[i + 0]->mSrc[0].mIntConst <= 16 && @@ -17863,6 +17868,9 @@ void InterCodeProcedure::PeepholeOptimization(void) ResetVisited(); mEntryBlock->PeepholeOptimization(mModule->mGlobalVars); + + Disassemble("PeepholeOptimization"); + CheckFinal(); } @@ -18508,7 +18516,7 @@ void InterCodeProcedure::Close(void) { GrowingTypeArray tstack(IT_NONE); - CheckFunc = !strcmp(mIdent->mString, "nformi"); + CheckFunc = !strcmp(mIdent->mString, "main"); CheckCase = false; mEntryBlock = mBlocks[0]; diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index b33c493..a70ed93 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -6198,7 +6198,7 @@ bool NativeCodeBasicBlock::LoadLoadOpStoreIndirectValue(InterCodeProcedure* proc { if (rins1->mSrc[0].mMemory == IM_INDIRECT && rins0->mSrc[0].mMemory == IM_INDIRECT && wins->mSrc[1].mMemory == IM_INDIRECT) { - int size = InterTypeSize[wins->mSrc[0].mType]; + int size = InterTypeSize[oins->mDst.mType]; if (!wins->mSrc[0].mFinal) { @@ -6362,7 +6362,7 @@ bool NativeCodeBasicBlock::LoadUnopStoreIndirectValue(InterCodeProcedure* proc, bool NativeCodeBasicBlock::LoadOpStoreIndirectValue(InterCodeProcedure* proc, const InterInstruction* rins, const InterInstruction* oins, int oindex, const InterInstruction* wins) { - int size = InterTypeSize[wins->mSrc[0].mType]; + int size = InterTypeSize[oins->mDst.mType]; AsmInsType at = ASMIT_ADC, an = ASMIT_ADC; AsmInsMode am = oins->mSrc[oindex].mTemp < 0 ? ASMIM_IMMEDIATE : ASMIM_ZERO_PAGE, ram = ASMIM_INDIRECT_Y, wam = ASMIM_INDIRECT_Y; @@ -42373,7 +42373,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc) { mInterProc = proc; - CheckFunc = !strcmp(mInterProc->mIdent->mString, "particle_move"); + CheckFunc = !strcmp(mInterProc->mIdent->mString, "main"); int nblocks = proc->mBlocks.Size(); tblocks = new NativeCodeBasicBlock * [nblocks]; @@ -44030,8 +44030,8 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode else if (i + 1 < iblock->mInstructions.Size() && InterTypeSize[ins->mDst.mType] >= 2 && iblock->mInstructions[i + 1]->mCode == IC_BINARY_OPERATOR && - iblock->mInstructions[i + 1]->mSrc[0].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 1]->mSrc[0].mFinal && - iblock->mInstructions[i + 1]->mSrc[1].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 1]->mSrc[1].mFinal) + iblock->mInstructions[i + 1]->mSrc[0].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 1]->mSrc[0].mType == ins->mDst.mType && iblock->mInstructions[i + 1]->mSrc[0].mFinal && + iblock->mInstructions[i + 1]->mSrc[1].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 1]->mSrc[1].mType == ins->mDst.mType && iblock->mInstructions[i + 1]->mSrc[1].mFinal) { block = block->BinaryOperator(iproc, this, iblock->mInstructions[i + 1], ins, ins); i++; @@ -44040,7 +44040,7 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode InterTypeSize[ins->mDst.mType] >= 2 && InterTypeSize[ins->mDst.mType] * ins->mSrc[0].mStride <= 256 && iblock->mInstructions[i + 1]->mCode == IC_BINARY_OPERATOR && - iblock->mInstructions[i + 1]->mSrc[0].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 1]->mSrc[0].mFinal) + iblock->mInstructions[i + 1]->mSrc[0].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 1]->mSrc[0].mType == ins->mDst.mType && iblock->mInstructions[i + 1]->mSrc[0].mFinal) { block = block->BinaryOperator(iproc, this, iblock->mInstructions[i + 1], nullptr, ins); i++; @@ -44049,7 +44049,7 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode InterTypeSize[ins->mDst.mType] >= 2 && InterTypeSize[ins->mDst.mType] * ins->mSrc[0].mStride < 256 && iblock->mInstructions[i + 1]->mCode == IC_BINARY_OPERATOR && - iblock->mInstructions[i + 1]->mSrc[1].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 1]->mSrc[1].mFinal) + iblock->mInstructions[i + 1]->mSrc[1].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 1]->mSrc[1].mType == ins->mDst.mType && iblock->mInstructions[i + 1]->mSrc[1].mFinal) { block = block->BinaryOperator(iproc, this, iblock->mInstructions[i + 1], ins, nullptr); i++; @@ -44061,8 +44061,8 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode InterTypeSize[iblock->mInstructions[i + 1]->mDst.mType] * iblock->mInstructions[i + 1]->mSrc[0].mStride <= 256 && iblock->mInstructions[i + 1]->mDst.mTemp != ins->mDst.mTemp && iblock->mInstructions[i + 2]->mCode == IC_BINARY_OPERATOR && - iblock->mInstructions[i + 2]->mSrc[0].mTemp == iblock->mInstructions[i + 1]->mDst.mTemp && iblock->mInstructions[i + 2]->mSrc[0].mFinal && - iblock->mInstructions[i + 2]->mSrc[1].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 2]->mSrc[1].mFinal) + iblock->mInstructions[i + 2]->mSrc[0].mTemp == iblock->mInstructions[i + 1]->mDst.mTemp && iblock->mInstructions[i + 2]->mSrc[0].mType == iblock->mInstructions[i + 1]->mDst.mType && iblock->mInstructions[i + 2]->mSrc[0].mFinal && + iblock->mInstructions[i + 2]->mSrc[1].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 2]->mSrc[1].mType == ins->mDst.mType && iblock->mInstructions[i + 2]->mSrc[1].mFinal) { block = block->BinaryOperator(iproc, this, iblock->mInstructions[i + 2], ins, iblock->mInstructions[i + 1]); i += 2; @@ -44074,8 +44074,8 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode InterTypeSize[iblock->mInstructions[i + 1]->mDst.mType] * iblock->mInstructions[i + 1]->mSrc[0].mStride <= 256 && iblock->mInstructions[i + 1]->mDst.mTemp != ins->mDst.mTemp && iblock->mInstructions[i + 2]->mCode == IC_BINARY_OPERATOR && - iblock->mInstructions[i + 2]->mSrc[1].mTemp == iblock->mInstructions[i + 1]->mDst.mTemp && iblock->mInstructions[i + 2]->mSrc[1].mFinal && - iblock->mInstructions[i + 2]->mSrc[0].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 2]->mSrc[0].mFinal) + iblock->mInstructions[i + 2]->mSrc[1].mTemp == iblock->mInstructions[i + 1]->mDst.mTemp && iblock->mInstructions[i + 2]->mSrc[1].mType == iblock->mInstructions[i + 1]->mDst.mType && iblock->mInstructions[i + 2]->mSrc[1].mFinal && + iblock->mInstructions[i + 2]->mSrc[0].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 2]->mSrc[0].mType == ins->mDst.mType && iblock->mInstructions[i + 2]->mSrc[0].mFinal) { block = block->BinaryOperator(iproc, this, iblock->mInstructions[i + 2], iblock->mInstructions[i + 1], ins); i += 2; @@ -44083,7 +44083,7 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode else if (i + 1 < iblock->mInstructions.Size() && InterTypeSize[ins->mDst.mType] >= 2 && iblock->mInstructions[i + 1]->mCode == IC_LEA && - iblock->mInstructions[i + 1]->mSrc[1].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 1]->mSrc[1].mFinal && + iblock->mInstructions[i + 1]->mSrc[1].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 1]->mSrc[1].mType == ins->mDst.mType && iblock->mInstructions[i + 1]->mSrc[1].mFinal && !(iblock->mInstructions[i + 1]->mSrc[0].IsUByte() && iblock->mInstructions[i + 1]->mSrc[0].mTemp >= 0 && i + 2 < iblock->mInstructions.Size() &&