diff --git a/README.md b/README.md index 4d8cd9b..0fce479 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,7 @@ The compiler is command line driven, and creates an executable .prg file. * -Oz : enable auto placement of global variables in zero page (part of O3) * -Op : optimize constant parameters * -g : create source level debug info and add source line numbers to asm listing +* -gp : create source level debug info and add source line numbers to asm listing and static profile data * -tf : target format, may be prg, crt or bin * -tm : target machine * -d64 : create a d64 disk image diff --git a/oscar64/Array.h b/oscar64/Array.h index 9c2153b..b81992c 100644 --- a/oscar64/Array.h +++ b/oscar64/Array.h @@ -424,6 +424,28 @@ protected: size = to; } + template + void Parition(const F & f, int l, int r) + { + if (r > l + 1) + { + int pi = l; + T p(array[pi]); + + for (int i = l + 1; i < r; i++) + { + if (f(array[i], p)) + { + array[pi++] = array[i]; + array[i] = array[pi]; + } + } + array[pi] = p; + + Parition(f, l, pi); + Parition(f, pi + 1, r); + } + } public: ExpandingArray(void) { @@ -596,6 +618,12 @@ public: return false; } + template + void Sort(const F & f) + { + Parition(f, 0, size); + } + __forceinline T& operator[](int n) { assert(n >= 0 && n < size); diff --git a/oscar64/Compiler.cpp b/oscar64/Compiler.cpp index 0aa69a8..ddffc9e 100644 --- a/oscar64/Compiler.cpp +++ b/oscar64/Compiler.cpp @@ -1270,7 +1270,7 @@ bool Compiler::WriteErrorFile(const char* targetPath) bool Compiler::WriteOutputFile(const char* targetPath, DiskImage * d64) { - char prgPath[200], mapPath[200], asmPath[200], lblPath[200], intPath[200], bcsPath[200], dbjPath[200]; + char prgPath[200], mapPath[200], asmPath[200], lblPath[200], intPath[200], bcsPath[200], dbjPath[200], cszPath[200]; char basePath[200]; strcpy_s(basePath, targetPath); @@ -1293,6 +1293,7 @@ bool Compiler::WriteOutputFile(const char* targetPath, DiskImage * d64) strcpy_s(intPath, prgPath); strcpy_s(bcsPath, prgPath); strcpy_s(dbjPath, prgPath); + strcpy_s(cszPath, prgPath); strcat_s(mapPath, "map"); strcat_s(asmPath, "asm"); @@ -1300,6 +1301,7 @@ bool Compiler::WriteOutputFile(const char* targetPath, DiskImage * d64) strcat_s(intPath, "int"); strcat_s(bcsPath, "bcs"); strcat_s(dbjPath, "dbj"); + strcat_s(cszPath, "csz"); if (mCompilerOptions & COPT_TARGET_PRG) { @@ -1382,6 +1384,9 @@ bool Compiler::WriteOutputFile(const char* targetPath, DiskImage * d64) if (mCompilerOptions & COPT_DEBUGINFO) WriteDbjFile(dbjPath); + if (mCompilerOptions & COPT_PROFILEINFO) + WriteCszFile(cszPath); + if (!(mCompilerOptions & COPT_NATIVE)) { if (mCompilerOptions & COPT_VERBOSE) @@ -1448,6 +1453,111 @@ static void DumpReferences(FILE* file, Declaration* dec) } +bool Compiler::WriteCszFile(const char* filename) +{ + FILE* file; + fopen_s(&file, filename, "wb"); + if (file) + { + for (int i = 0; i < mInterCodeModule->mProcedures.Size(); i++) + { + InterCodeProcedure* p(mInterCodeModule->mProcedures[i]); + if (p->mLinkerObject && p->mIdent && p->mDeclaration) + { + LinkerObject* lo = p->mLinkerObject; + + struct SourceCount + { + const char* mFileName; + int mLine, mAddress; + int mBytes; + }; + + ExpandingArray ea; + + for (int j = 0; j < lo->mCodeLocations.Size(); j++) + { + const CodeLocation& co(lo->mCodeLocations[j]); + const Location* ls = &(co.mLocation); + while (ls->mFrom) + ls = ls->mFrom; + + int k = 0; + while (k < ea.Size() && (ea[k].mFileName != ls->mFileName || ea[k].mLine != ls->mLine)) + k++; + if (k == ea.Size()) + { + SourceCount sc; + sc.mFileName = ls->mFileName; + sc.mLine = ls->mLine; + sc.mBytes = 0; + sc.mAddress = co.mStart + lo->mAddress; + ea.Push(sc); + } + + ea[k].mBytes += co.mEnd - co.mStart; + } + + if (ea.Size()) + { + ea.Sort([](const SourceCount& l, const SourceCount& r)->bool { + return l.mFileName == r.mFileName ? l.mLine < r.mLine : l.mAddress < r.mAddress; + }); + + FILE* fsrc; + fopen_s(&fsrc, ea[0].mFileName, "r"); + if (fsrc) + { + fprintf(file, "<%s, %s>\n", p->mDeclaration->mQualIdent->mString, ea[0].mFileName); +#if 0 + for (int i = 0; i < ea.Size(); i++) + { + fprintf(file, "%s:%d : %d\n", ea[i].mFileName, ea[i].mLine, ea[i].mBytes); + } +#endif + int k = 0, l = 1; + char line[1024]; + while (k < ea.Size() && fgets(line, 1024, fsrc)) + { + size_t ll = strlen(line); + while (ll > 0 && (line[ll - 1] == '\r' || line[ll - 1] == '\n')) + ll--; + line[ll] = 0; + + if (l < ea[k].mLine) + { + if (k > 0) + fprintf(file, "%5d,---- ( ) : %s\n", l, line); + } + else + { + int ks = k, sum = 0; + do { + sum += ea[ks].mBytes; + ks++; + } while (ks < ea.Size() && ea[ks].mFileName != ea[0].mFileName); + + fprintf(file, "%5d,%04x (%3d) : %s\n", l, ea[k].mAddress, ea[k].mBytes, line); + + k = ks; + } + l++; + } + + fclose(fsrc); + fprintf(file, "\n"); + } + } + } + } + + fclose(file); + return true; + } + else + return false; +} + bool Compiler::WriteDbjFile(const char* filename) { FILE* file; diff --git a/oscar64/Compiler.h b/oscar64/Compiler.h index 3672991..7286e25 100644 --- a/oscar64/Compiler.h +++ b/oscar64/Compiler.h @@ -61,4 +61,5 @@ public: void CompleteTemplateExpansion(void); bool WriteDbjFile(const char* filename); + bool WriteCszFile(const char* filename); }; diff --git a/oscar64/CompilerTypes.h b/oscar64/CompilerTypes.h index 5bc2fb4..4d93c9b 100644 --- a/oscar64/CompilerTypes.h +++ b/oscar64/CompilerTypes.h @@ -41,6 +41,8 @@ static const uint64 COPT_CPLUSPLUS = 1ULL << 52; static const uint64 COPT_PETSCII = 1ULL << 53; static const uint64 COPT_ERROR_FILES = 1ULL << 54; +static const uint64 COPT_PROFILEINFO = 1ULL << 55; + static const uint64 COPT_DEFAULT = COPT_OPTIMIZE_BASIC | COPT_OPTIMIZE_INLINE | COPT_OPTIMIZE_CONST_EXPRESSIONS; diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index 72238a9..97b595c 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -11472,9 +11472,10 @@ bool InterCodeBasicBlock::SimplifyIntegerNumeric(const GrowingInstructionPtrArra if (pins->mSrc[0].mTemp < 0 && ins->mSrc[1].mIntConst + pins->mSrc[0].mIntConst >= 0) { + ins->mSrc[1].mMemory = pins->mSrc[1].mMemory; ins->mSrc[1].ForwardTemp(pins->mSrc[1]); pins->mSrc[1].mFinal = false; - ins->mSrc[1].mIntConst += pins->mSrc[0].mIntConst; + ins->mSrc[1].mIntConst += pins->mSrc[0].mIntConst + pins->mSrc[1].mIntConst; changed = true; } #if 1 @@ -17036,6 +17037,7 @@ bool InterCodeBasicBlock::CheapInlining(int & numTemps) { int k = FindStore(this, i, nins->mSrc[0]); InterInstruction* pins = mInstructions[k]->Clone(); + pins->mLocation.mFrom = &(ins->mLocation); mInstructions[k]->mRemove = true; if (pins->mSrc[0].mTemp < 0) @@ -17058,6 +17060,7 @@ bool InterCodeBasicBlock::CheapInlining(int & numTemps) case IC_STORE: { InterInstruction* pins = nins->Clone(); + pins->mLocation.mFrom = &(ins->mLocation); if (pins->mSrc[0].mTemp >= 0) pins->mSrc[0].mTemp = tmap[pins->mSrc[0].mTemp]; if (pins->mSrc[1].mTemp >= 0) @@ -17069,6 +17072,7 @@ bool InterCodeBasicBlock::CheapInlining(int & numTemps) case IC_CALL_NATIVE: { InterInstruction* pins = nins->Clone(); + pins->mLocation.mFrom = &(ins->mLocation); if (pins->mDst.mTemp >= 0) pins->mDst.mTemp = ntemps; mInstructions.Insert(i, pins); @@ -17081,6 +17085,7 @@ bool InterCodeBasicBlock::CheapInlining(int & numTemps) if (ins->mDst.mTemp >= 0) { InterInstruction* pins = nins->Clone(); + pins->mLocation.mFrom = &(ins->mLocation); if (pins->mSrc[0].mTemp < 0) { pins->mCode = IC_CONSTANT; @@ -17103,6 +17108,7 @@ bool InterCodeBasicBlock::CheapInlining(int & numTemps) default: { InterInstruction* pins = nins->Clone(); + pins->mLocation.mFrom = &(ins->mLocation); for (int k = 0; k < pins->mNumOperands; k++) if (pins->mSrc[k].mTemp >= 0) pins->mSrc[k].mTemp = tmap[pins->mSrc[k].mTemp]; @@ -22737,7 +22743,10 @@ void InterCodeProcedure::SimplifyIntegerNumeric(FastNumberSet& activeSet) mEntryBlock->RemapActiveTemporaries(activeSet); } + DisassembleDebug("PreSimplifyIntegerNumeric"); + ResetVisited(); + } while (mEntryBlock->SimplifyIntegerNumeric(silvalues, silvused)); assert(silvused == mTemporaries.Size()); @@ -22904,7 +22913,7 @@ void InterCodeProcedure::Close(void) { GrowingTypeArray tstack(IT_NONE); - CheckFunc = !strcmp(mIdent->mString, "room_prepare_castle"); + CheckFunc = !strcmp(mIdent->mString, "room_show"); CheckCase = false; mEntryBlock = mBlocks[0]; diff --git a/oscar64/InterCodeGenerator.cpp b/oscar64/InterCodeGenerator.cpp index 32c1d4c..cbd078d 100644 --- a/oscar64/InterCodeGenerator.cpp +++ b/oscar64/InterCodeGenerator.cpp @@ -4093,7 +4093,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* } - InterInstruction* wins = new InterInstruction(texp->mLocation, IC_STORE); + InterInstruction* wins = new InterInstruction(MapLocation(exp, inlineMapper), IC_STORE); wins->mSrc[1].mMemory = IM_INDIRECT; wins->mSrc[0].mType = InterTypeOf(vr.mType);; wins->mSrc[0].mTemp = vr.mTemp; diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index c6fef74..0cb6851 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -5131,9 +5131,8 @@ void NativeCodeBasicBlock::PutLocation(const Location& location, bool weak) { int sz = mCodeLocations.Size(); if (sz > 0 && - (weak || - (mCodeLocations[sz - 1].mLocation.mFileName == location.mFileName && - mCodeLocations[sz - 1].mLocation.mLine == location.mLine))) + mCodeLocations[sz - 1].mLocation.mFileName == location.mFileName && + mCodeLocations[sz - 1].mLocation.mLine == location.mLine) { mCodeLocations[sz - 1].mEnd = this->mCode.Size(); if (mCodeLocations[sz - 1].mWeak) @@ -19930,6 +19929,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) fblock->mTrueJump = mTrueJump; fblock->mFalseJump = mFalseJump; fblock->mBranch = mBranch; + fblock->mBranchIns = mBranchIns; mIns[i + 0].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED; @@ -19951,6 +19951,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = fblock; mFalseJump = iblock; mBranch = ASMIT_BNE; + mBranchIns = mIns[i + 3].mIns; break; } @@ -19973,6 +19974,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) fblock->mTrueJump = mTrueJump; fblock->mFalseJump = mFalseJump; fblock->mBranch = mBranch; + fblock->mBranchIns = mBranchIns; mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED; mIns[i + 1].mType = ASMIT_NOP; @@ -19990,6 +19992,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = fblock; mFalseJump = iblock; mBranch = ASMIT_BNE; + mBranchIns = mIns[i + 3].mIns; break; } @@ -20012,6 +20015,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) fblock->mTrueJump = mTrueJump; fblock->mFalseJump = mFalseJump; fblock->mBranch = mBranch; + fblock->mBranchIns = mBranchIns; mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED; @@ -20028,6 +20032,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = fblock; mFalseJump = iblock; mBranch = ASMIT_BNE; + mBranchIns = mIns[i + 2].mIns; break; } @@ -20051,6 +20056,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) fblock->mTrueJump = mTrueJump; fblock->mFalseJump = mFalseJump; fblock->mBranch = mBranch; + fblock->mBranchIns = mBranchIns; fblock->mIns.Push(mIns[i + 1]); fblock->mIns[0].mType = ASMIT_DEC; @@ -20071,6 +20077,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = fblock; mFalseJump = iblock; mBranch = ASMIT_BNE; + mBranchIns = mIns[i + 3].mIns; break; } @@ -20092,6 +20099,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) fblock->mTrueJump = mTrueJump; fblock->mFalseJump = mFalseJump; fblock->mBranch = mBranch; + fblock->mBranchIns = mBranchIns; mIns[i + 0].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED; mIns[i + 1].mType = ASMIT_NOP; @@ -20114,6 +20122,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = fblock; mFalseJump = iblock; mBranch = ASMIT_BNE; + mBranchIns = mIns[i + 3].mIns; break; } @@ -20135,6 +20144,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) fblock->mTrueJump = mTrueJump; fblock->mFalseJump = mFalseJump; fblock->mBranch = mBranch; + fblock->mBranchIns = mBranchIns; mIns[i + 0].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED; mIns[i + 1].mType = ASMIT_NOP; @@ -20157,6 +20167,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = fblock; mFalseJump = iblock; mBranch = ASMIT_BNE; + mBranchIns = mIns[i + 3].mIns; break; } @@ -20177,6 +20188,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) fblock->mTrueJump = mTrueJump; fblock->mFalseJump = mFalseJump; fblock->mBranch = mBranch; + fblock->mBranchIns = mBranchIns; mIns[i + 0].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; @@ -20197,6 +20209,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = fblock; mFalseJump = iblock; mBranch = ASMIT_BNE; + mBranchIns = mIns[i + 3].mIns; break; } @@ -20218,6 +20231,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) fblock->mTrueJump = mTrueJump; fblock->mFalseJump = mFalseJump; fblock->mBranch = mBranch; + fblock->mBranchIns = mBranchIns; mIns[i + 0].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED; mIns[i + 1].mType = ASMIT_NOP; @@ -20240,6 +20254,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = fblock; mFalseJump = iblock; mBranch = ASMIT_BNE; + mBranchIns = mIns[i + 3].mIns; break; } @@ -20266,6 +20281,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) rblock->mTrueJump = mTrueJump; rblock->mFalseJump = mFalseJump; rblock->mBranch = mBranch; + rblock->mBranchIns = mBranchIns; for (int j = i + 6; j < mIns.Size(); j++) rblock->mIns.Push(mIns[j]); @@ -20275,6 +20291,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = neblock; mFalseJump = eblock; mBranch = ASMIT_BNE; + mBranchIns = mIns[i + 0].mIns; if (veq != 0) eblock->mIns.Push(NativeCodeInstruction(mIns[i].mIns, ASMIT_LDA, ASMIM_IMMEDIATE, veq)); @@ -20301,6 +20318,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) rblock->mTrueJump = mTrueJump; rblock->mFalseJump = mFalseJump; rblock->mBranch = mBranch; + rblock->mBranchIns = mBranchIns; const InterInstruction* iins = mIns[i].mIns; @@ -20312,6 +20330,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = iblock; mFalseJump = rblock; mBranch = ASMIT_BCS; + mBranchIns = iins; iblock->mIns.Push(NativeCodeInstruction(iins, ASMIT_INY)); @@ -20336,6 +20355,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) rblock->mTrueJump = mTrueJump; rblock->mFalseJump = mFalseJump; rblock->mBranch = mBranch; + rblock->mBranchIns = mBranchIns; for (int j = i + 4; j < mIns.Size(); j++) rblock->mIns.Push(mIns[j]); @@ -20345,6 +20365,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = neblock; mFalseJump = eblock; mBranch = ASMIT_BNE; + mBranchIns = mIns[i + 0].mIns; neblock->mIns.Push(NativeCodeInstruction(mIns[i].mIns, ASMIT_LDA, ASMIM_IMMEDIATE, 1)); @@ -20372,6 +20393,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) rblock->mTrueJump = mTrueJump; rblock->mFalseJump = mFalseJump; rblock->mBranch = mBranch; + rblock->mBranchIns = mBranchIns; for (int j = i + 5; j < mIns.Size(); j++) rblock->mIns.Push(mIns[j]); @@ -20386,6 +20408,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = neblock; mFalseJump = eblock; mBranch = ASMIT_BNE; + mBranchIns = mIns[i + 0].mIns; if (veq != 0) eblock->mIns.Push(NativeCodeInstruction(mIns[i].mIns, ASMIT_LDA, ASMIM_IMMEDIATE, veq)); @@ -20415,6 +20438,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) rblock->mTrueJump = mTrueJump; rblock->mFalseJump = mFalseJump; rblock->mBranch = mBranch; + rblock->mBranchIns = mBranchIns; for (int j = i + 5; j < mIns.Size(); j++) rblock->mIns.Push(mIns[j]); @@ -20424,6 +20448,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = neblock; mFalseJump = eblock; mBranch = ASMIT_BNE; + mBranchIns = mIns[i + 0].mIns; if (veq != 0) eblock->mIns.Push(NativeCodeInstruction(mIns[i].mIns, ASMIT_LDA, ASMIM_IMMEDIATE, veq)); @@ -20451,6 +20476,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) rblock->mTrueJump = mTrueJump; rblock->mFalseJump = mFalseJump; rblock->mBranch = mBranch; + rblock->mBranchIns = mBranchIns; for (int j = i + 5; j < mIns.Size(); j++) rblock->mIns.Push(mIns[j]); @@ -20460,6 +20486,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = neblock; mFalseJump = eblock; mBranch = ASMIT_BNE; + mBranchIns = mIns[i + 0].mIns; neblock->mIns.Push(NativeCodeInstruction(mIns[i].mIns, ASMIT_LDA, ASMIM_IMMEDIATE, 0xff)); @@ -20610,6 +20637,9 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) fblock->mTrueJump = mTrueJump; fblock->mFalseJump = mFalseJump; fblock->mBranch = mBranch; + fblock->mBranchIns = mBranchIns; + + const InterInstruction* iins = mIns[0].mIns; for (int j = i + 3; j < mIns.Size(); j++) fblock->mIns.Push(mIns[j]); @@ -20622,6 +20652,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = fblock; mFalseJump = iblock; mBranch = ASMIT_BCC; + mBranchIns = iins; break; } else if (mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_IMMEDIATE && mIns[i + 0].mAddress == 0 && @@ -20638,6 +20669,9 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) fblock->mTrueJump = mTrueJump; fblock->mFalseJump = mFalseJump; fblock->mBranch = mBranch; + fblock->mBranchIns = mBranchIns; + + const InterInstruction* iins = mIns[0].mIns; for (int j = i + 3; j < mIns.Size(); j++) fblock->mIns.Push(mIns[j]); @@ -20650,6 +20684,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = fblock; mFalseJump = iblock; mBranch = ASMIT_BCC; + mBranchIns = iins; break; } else if (mIns[i + 0].mType == ASMIT_LDA && @@ -20666,6 +20701,9 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) fblock->mTrueJump = mTrueJump; fblock->mFalseJump = mFalseJump; fblock->mBranch = mBranch; + fblock->mBranchIns = mBranchIns; + + const InterInstruction* iins = mIns[0].mIns; for (int j = i + 3; j < mIns.Size(); j++) fblock->mIns.Push(mIns[j]); @@ -20678,6 +20716,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = fblock; mFalseJump = iblock; mBranch = ASMIT_BCS; + mBranchIns = iins; break; } else if (mIns[i + 0].mType == ASMIT_TXA && @@ -20693,6 +20732,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) fblock->mTrueJump = mTrueJump; fblock->mFalseJump = mFalseJump; fblock->mBranch = mBranch; + fblock->mBranchIns = mBranchIns; const InterInstruction* iins(mIns[i].mIns); @@ -20707,6 +20747,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = fblock; mFalseJump = iblock; mBranch = ASMIT_BCC; + mBranchIns = iins; break; } else if (mIns[i + 0].mType == ASMIT_TYA && @@ -20722,6 +20763,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) fblock->mTrueJump = mTrueJump; fblock->mFalseJump = mFalseJump; fblock->mBranch = mBranch; + fblock->mBranchIns = mBranchIns; const InterInstruction* iins(mIns[i].mIns); @@ -20738,6 +20780,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = fblock; mFalseJump = iblock; mBranch = ASMIT_BCC; + mBranchIns = iins; break; } else if (mIns[i + 0].mType == ASMIT_TXA && @@ -20753,6 +20796,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) fblock->mTrueJump = mTrueJump; fblock->mFalseJump = mFalseJump; fblock->mBranch = mBranch; + fblock->mBranchIns = mBranchIns; const InterInstruction* iins(mIns[i].mIns); @@ -20769,6 +20813,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = fblock; mFalseJump = iblock; mBranch = ASMIT_BCC; + mBranchIns = iins; break; } else if (mIns[i + 0].mType == ASMIT_TYA && @@ -20784,6 +20829,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) fblock->mTrueJump = mTrueJump; fblock->mFalseJump = mFalseJump; fblock->mBranch = mBranch; + fblock->mBranchIns = mBranchIns; const InterInstruction* iins(mIns[i].mIns); @@ -20798,6 +20844,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = fblock; mFalseJump = iblock; mBranch = ASMIT_BCC; + mBranchIns = iins; break; } else if (mIns[i + 0].mType == ASMIT_LDA && @@ -20814,6 +20861,9 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) fblock->mTrueJump = mTrueJump; fblock->mFalseJump = mFalseJump; fblock->mBranch = mBranch; + fblock->mBranchIns = mBranchIns; + + const InterInstruction* iins(mIns[i].mIns); for (int j = i + 3; j < mIns.Size(); j++) fblock->mIns.Push(mIns[j]); @@ -20826,6 +20876,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mTrueJump = fblock; mFalseJump = iblock; mBranch = ASMIT_BCS; + mBranchIns = iins; break; } @@ -51575,7 +51626,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc) mInterProc = proc; mInterProc->mLinkerObject->mNativeProc = this; - CheckFunc = !strcmp(mInterProc->mIdent->mString, "room_prep_chest"); + CheckFunc = !strcmp(mInterProc->mIdent->mString, "floor_prepare"); int nblocks = proc->mBlocks.Size(); tblocks = new NativeCodeBasicBlock * [nblocks]; @@ -52126,7 +52177,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc) void NativeCodeProcedure::Assemble(void) { - CheckFunc = !strcmp(mInterProc->mIdent->mString, "a"); + CheckFunc = !strcmp(mInterProc->mIdent->mString, "floor_prepare"); if (mInterProc->mCompilerOptions & COPT_OPTIMIZE_MERGE_CALLS) { @@ -52189,7 +52240,7 @@ void NativeCodeProcedure::Assemble(void) mInterProc->mLinkerObject->AddReference(rl); } - if (mGenerator->mCompilerOptions & COPT_DEBUGINFO) + if (mGenerator->mCompilerOptions & (COPT_DEBUGINFO | COPT_PROFILEINFO)) { if (mCodeLocations.Size() > 0) { diff --git a/oscar64/Parser.cpp b/oscar64/Parser.cpp index 23896f5..0fd1bc6 100644 --- a/oscar64/Parser.cpp +++ b/oscar64/Parser.cpp @@ -9917,6 +9917,7 @@ Expression* Parser::ParseStatement(void) { Declaration* iterVarDec = new Declaration(mScanner->mLocation, DT_VARIABLE); iterVarDec->mBase = containerExp->mDecType->mBase->BuildPointer(mScanner->mLocation); + iterVarDec->mBase = containerExp->mDecType->mBase->BuildPointer(mScanner->mLocation); iterVarDec->mVarIndex = mLocalIndex++; iterVarDec->mSize = iterVarDec->mBase->mSize; iterVarDec->mFlags |= DTF_DEFINED; @@ -10158,6 +10159,15 @@ Expression* Parser::ParseStatement(void) int stride = (endValue - startValue) / numLoops; int remain = (endValue - startValue) - numIterations * numLoops; + // Switch from 3 to 4 to avoid cost of two remains + if (numLoops == 3 && remain == 2 && !((endValue - startValue) & 3)) + { + numLoops = 4; + numIterations = (endValue - startValue) / numLoops; + stride = (endValue - startValue) / numLoops; + remain = (endValue - startValue) - numIterations * numLoops; + } + Expression* unrollBody = new Expression(mScanner->mLocation, EX_SEQUENCE); unrollBody->mLeft = bodyExp; Expression* bexp = unrollBody; diff --git a/oscar64/oscar64.cpp b/oscar64/oscar64.cpp index 9db69dd..a6a9537 100644 --- a/oscar64/oscar64.cpp +++ b/oscar64/oscar64.cpp @@ -297,6 +297,10 @@ int main2(int argc, const char** argv) { compiler->mCompilerOptions |= COPT_DEBUGINFO; } + else if (arg[1] == 'g' && arg[2] == 'p' && !arg[3]) + { + compiler->mCompilerOptions |= COPT_DEBUGINFO | COPT_PROFILEINFO; + } else if (arg[1] == 'v') { compiler->mCompilerOptions |= COPT_VERBOSE;