Add optional static memory profile output file

This commit is contained in:
drmortalwombat 2024-10-24 13:58:14 +02:00
parent 40c407782d
commit 4fff9f7060
10 changed files with 226 additions and 10 deletions

View File

@ -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

View File

@ -424,6 +424,28 @@ protected:
size = to;
}
template<typename F>
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<typename F>
void Sort(const F & f)
{
Parition(f, 0, size);
}
__forceinline T& operator[](int n)
{
assert(n >= 0 && n < size);

View File

@ -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<SourceCount> 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;

View File

@ -61,4 +61,5 @@ public:
void CompleteTemplateExpansion(void);
bool WriteDbjFile(const char* filename);
bool WriteCszFile(const char* filename);
};

View File

@ -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;

View File

@ -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];

View File

@ -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;

View File

@ -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)
{

View File

@ -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;

View File

@ -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;