Add optional static memory profile output file
This commit is contained in:
parent
40c407782d
commit
4fff9f7060
|
@ -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)
|
* -Oz : enable auto placement of global variables in zero page (part of O3)
|
||||||
* -Op : optimize constant parameters
|
* -Op : optimize constant parameters
|
||||||
* -g : create source level debug info and add source line numbers to asm listing
|
* -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
|
* -tf : target format, may be prg, crt or bin
|
||||||
* -tm : target machine
|
* -tm : target machine
|
||||||
* -d64 : create a d64 disk image
|
* -d64 : create a d64 disk image
|
||||||
|
|
|
@ -424,6 +424,28 @@ protected:
|
||||||
size = to;
|
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:
|
public:
|
||||||
ExpandingArray(void)
|
ExpandingArray(void)
|
||||||
{
|
{
|
||||||
|
@ -596,6 +618,12 @@ public:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename F>
|
||||||
|
void Sort(const F & f)
|
||||||
|
{
|
||||||
|
Parition(f, 0, size);
|
||||||
|
}
|
||||||
|
|
||||||
__forceinline T& operator[](int n)
|
__forceinline T& operator[](int n)
|
||||||
{
|
{
|
||||||
assert(n >= 0 && n < size);
|
assert(n >= 0 && n < size);
|
||||||
|
|
|
@ -1270,7 +1270,7 @@ bool Compiler::WriteErrorFile(const char* targetPath)
|
||||||
|
|
||||||
bool Compiler::WriteOutputFile(const char* targetPath, DiskImage * d64)
|
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];
|
char basePath[200];
|
||||||
|
|
||||||
strcpy_s(basePath, targetPath);
|
strcpy_s(basePath, targetPath);
|
||||||
|
@ -1293,6 +1293,7 @@ bool Compiler::WriteOutputFile(const char* targetPath, DiskImage * d64)
|
||||||
strcpy_s(intPath, prgPath);
|
strcpy_s(intPath, prgPath);
|
||||||
strcpy_s(bcsPath, prgPath);
|
strcpy_s(bcsPath, prgPath);
|
||||||
strcpy_s(dbjPath, prgPath);
|
strcpy_s(dbjPath, prgPath);
|
||||||
|
strcpy_s(cszPath, prgPath);
|
||||||
|
|
||||||
strcat_s(mapPath, "map");
|
strcat_s(mapPath, "map");
|
||||||
strcat_s(asmPath, "asm");
|
strcat_s(asmPath, "asm");
|
||||||
|
@ -1300,6 +1301,7 @@ bool Compiler::WriteOutputFile(const char* targetPath, DiskImage * d64)
|
||||||
strcat_s(intPath, "int");
|
strcat_s(intPath, "int");
|
||||||
strcat_s(bcsPath, "bcs");
|
strcat_s(bcsPath, "bcs");
|
||||||
strcat_s(dbjPath, "dbj");
|
strcat_s(dbjPath, "dbj");
|
||||||
|
strcat_s(cszPath, "csz");
|
||||||
|
|
||||||
if (mCompilerOptions & COPT_TARGET_PRG)
|
if (mCompilerOptions & COPT_TARGET_PRG)
|
||||||
{
|
{
|
||||||
|
@ -1382,6 +1384,9 @@ bool Compiler::WriteOutputFile(const char* targetPath, DiskImage * d64)
|
||||||
if (mCompilerOptions & COPT_DEBUGINFO)
|
if (mCompilerOptions & COPT_DEBUGINFO)
|
||||||
WriteDbjFile(dbjPath);
|
WriteDbjFile(dbjPath);
|
||||||
|
|
||||||
|
if (mCompilerOptions & COPT_PROFILEINFO)
|
||||||
|
WriteCszFile(cszPath);
|
||||||
|
|
||||||
if (!(mCompilerOptions & COPT_NATIVE))
|
if (!(mCompilerOptions & COPT_NATIVE))
|
||||||
{
|
{
|
||||||
if (mCompilerOptions & COPT_VERBOSE)
|
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)
|
bool Compiler::WriteDbjFile(const char* filename)
|
||||||
{
|
{
|
||||||
FILE* file;
|
FILE* file;
|
||||||
|
|
|
@ -61,4 +61,5 @@ public:
|
||||||
void CompleteTemplateExpansion(void);
|
void CompleteTemplateExpansion(void);
|
||||||
|
|
||||||
bool WriteDbjFile(const char* filename);
|
bool WriteDbjFile(const char* filename);
|
||||||
|
bool WriteCszFile(const char* filename);
|
||||||
};
|
};
|
||||||
|
|
|
@ -41,6 +41,8 @@ static const uint64 COPT_CPLUSPLUS = 1ULL << 52;
|
||||||
static const uint64 COPT_PETSCII = 1ULL << 53;
|
static const uint64 COPT_PETSCII = 1ULL << 53;
|
||||||
static const uint64 COPT_ERROR_FILES = 1ULL << 54;
|
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;
|
static const uint64 COPT_DEFAULT = COPT_OPTIMIZE_BASIC | COPT_OPTIMIZE_INLINE | COPT_OPTIMIZE_CONST_EXPRESSIONS;
|
||||||
|
|
|
@ -11472,9 +11472,10 @@ bool InterCodeBasicBlock::SimplifyIntegerNumeric(const GrowingInstructionPtrArra
|
||||||
|
|
||||||
if (pins->mSrc[0].mTemp < 0 && ins->mSrc[1].mIntConst + pins->mSrc[0].mIntConst >= 0)
|
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]);
|
ins->mSrc[1].ForwardTemp(pins->mSrc[1]);
|
||||||
pins->mSrc[1].mFinal = false;
|
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;
|
changed = true;
|
||||||
}
|
}
|
||||||
#if 1
|
#if 1
|
||||||
|
@ -17036,6 +17037,7 @@ bool InterCodeBasicBlock::CheapInlining(int & numTemps)
|
||||||
{
|
{
|
||||||
int k = FindStore(this, i, nins->mSrc[0]);
|
int k = FindStore(this, i, nins->mSrc[0]);
|
||||||
InterInstruction* pins = mInstructions[k]->Clone();
|
InterInstruction* pins = mInstructions[k]->Clone();
|
||||||
|
pins->mLocation.mFrom = &(ins->mLocation);
|
||||||
mInstructions[k]->mRemove = true;
|
mInstructions[k]->mRemove = true;
|
||||||
|
|
||||||
if (pins->mSrc[0].mTemp < 0)
|
if (pins->mSrc[0].mTemp < 0)
|
||||||
|
@ -17058,6 +17060,7 @@ bool InterCodeBasicBlock::CheapInlining(int & numTemps)
|
||||||
case IC_STORE:
|
case IC_STORE:
|
||||||
{
|
{
|
||||||
InterInstruction* pins = nins->Clone();
|
InterInstruction* pins = nins->Clone();
|
||||||
|
pins->mLocation.mFrom = &(ins->mLocation);
|
||||||
if (pins->mSrc[0].mTemp >= 0)
|
if (pins->mSrc[0].mTemp >= 0)
|
||||||
pins->mSrc[0].mTemp = tmap[pins->mSrc[0].mTemp];
|
pins->mSrc[0].mTemp = tmap[pins->mSrc[0].mTemp];
|
||||||
if (pins->mSrc[1].mTemp >= 0)
|
if (pins->mSrc[1].mTemp >= 0)
|
||||||
|
@ -17069,6 +17072,7 @@ bool InterCodeBasicBlock::CheapInlining(int & numTemps)
|
||||||
case IC_CALL_NATIVE:
|
case IC_CALL_NATIVE:
|
||||||
{
|
{
|
||||||
InterInstruction* pins = nins->Clone();
|
InterInstruction* pins = nins->Clone();
|
||||||
|
pins->mLocation.mFrom = &(ins->mLocation);
|
||||||
if (pins->mDst.mTemp >= 0)
|
if (pins->mDst.mTemp >= 0)
|
||||||
pins->mDst.mTemp = ntemps;
|
pins->mDst.mTemp = ntemps;
|
||||||
mInstructions.Insert(i, pins);
|
mInstructions.Insert(i, pins);
|
||||||
|
@ -17081,6 +17085,7 @@ bool InterCodeBasicBlock::CheapInlining(int & numTemps)
|
||||||
if (ins->mDst.mTemp >= 0)
|
if (ins->mDst.mTemp >= 0)
|
||||||
{
|
{
|
||||||
InterInstruction* pins = nins->Clone();
|
InterInstruction* pins = nins->Clone();
|
||||||
|
pins->mLocation.mFrom = &(ins->mLocation);
|
||||||
if (pins->mSrc[0].mTemp < 0)
|
if (pins->mSrc[0].mTemp < 0)
|
||||||
{
|
{
|
||||||
pins->mCode = IC_CONSTANT;
|
pins->mCode = IC_CONSTANT;
|
||||||
|
@ -17103,6 +17108,7 @@ bool InterCodeBasicBlock::CheapInlining(int & numTemps)
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
InterInstruction* pins = nins->Clone();
|
InterInstruction* pins = nins->Clone();
|
||||||
|
pins->mLocation.mFrom = &(ins->mLocation);
|
||||||
for (int k = 0; k < pins->mNumOperands; k++)
|
for (int k = 0; k < pins->mNumOperands; k++)
|
||||||
if (pins->mSrc[k].mTemp >= 0)
|
if (pins->mSrc[k].mTemp >= 0)
|
||||||
pins->mSrc[k].mTemp = tmap[pins->mSrc[k].mTemp];
|
pins->mSrc[k].mTemp = tmap[pins->mSrc[k].mTemp];
|
||||||
|
@ -22737,7 +22743,10 @@ void InterCodeProcedure::SimplifyIntegerNumeric(FastNumberSet& activeSet)
|
||||||
mEntryBlock->RemapActiveTemporaries(activeSet);
|
mEntryBlock->RemapActiveTemporaries(activeSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DisassembleDebug("PreSimplifyIntegerNumeric");
|
||||||
|
|
||||||
ResetVisited();
|
ResetVisited();
|
||||||
|
|
||||||
} while (mEntryBlock->SimplifyIntegerNumeric(silvalues, silvused));
|
} while (mEntryBlock->SimplifyIntegerNumeric(silvalues, silvused));
|
||||||
|
|
||||||
assert(silvused == mTemporaries.Size());
|
assert(silvused == mTemporaries.Size());
|
||||||
|
@ -22904,7 +22913,7 @@ void InterCodeProcedure::Close(void)
|
||||||
{
|
{
|
||||||
GrowingTypeArray tstack(IT_NONE);
|
GrowingTypeArray tstack(IT_NONE);
|
||||||
|
|
||||||
CheckFunc = !strcmp(mIdent->mString, "room_prepare_castle");
|
CheckFunc = !strcmp(mIdent->mString, "room_show");
|
||||||
CheckCase = false;
|
CheckCase = false;
|
||||||
|
|
||||||
mEntryBlock = mBlocks[0];
|
mEntryBlock = mBlocks[0];
|
||||||
|
|
|
@ -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[1].mMemory = IM_INDIRECT;
|
||||||
wins->mSrc[0].mType = InterTypeOf(vr.mType);;
|
wins->mSrc[0].mType = InterTypeOf(vr.mType);;
|
||||||
wins->mSrc[0].mTemp = vr.mTemp;
|
wins->mSrc[0].mTemp = vr.mTemp;
|
||||||
|
|
|
@ -5131,9 +5131,8 @@ void NativeCodeBasicBlock::PutLocation(const Location& location, bool weak)
|
||||||
{
|
{
|
||||||
int sz = mCodeLocations.Size();
|
int sz = mCodeLocations.Size();
|
||||||
if (sz > 0 &&
|
if (sz > 0 &&
|
||||||
(weak ||
|
mCodeLocations[sz - 1].mLocation.mFileName == location.mFileName &&
|
||||||
(mCodeLocations[sz - 1].mLocation.mFileName == location.mFileName &&
|
mCodeLocations[sz - 1].mLocation.mLine == location.mLine)
|
||||||
mCodeLocations[sz - 1].mLocation.mLine == location.mLine)))
|
|
||||||
{
|
{
|
||||||
mCodeLocations[sz - 1].mEnd = this->mCode.Size();
|
mCodeLocations[sz - 1].mEnd = this->mCode.Size();
|
||||||
if (mCodeLocations[sz - 1].mWeak)
|
if (mCodeLocations[sz - 1].mWeak)
|
||||||
|
@ -19930,6 +19929,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
fblock->mTrueJump = mTrueJump;
|
fblock->mTrueJump = mTrueJump;
|
||||||
fblock->mFalseJump = mFalseJump;
|
fblock->mFalseJump = mFalseJump;
|
||||||
fblock->mBranch = mBranch;
|
fblock->mBranch = mBranch;
|
||||||
|
fblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
mIns[i + 0].mType = ASMIT_NOP;
|
mIns[i + 0].mType = ASMIT_NOP;
|
||||||
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||||
|
@ -19951,6 +19951,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
mTrueJump = fblock;
|
mTrueJump = fblock;
|
||||||
mFalseJump = iblock;
|
mFalseJump = iblock;
|
||||||
mBranch = ASMIT_BNE;
|
mBranch = ASMIT_BNE;
|
||||||
|
mBranchIns = mIns[i + 3].mIns;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19973,6 +19974,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
fblock->mTrueJump = mTrueJump;
|
fblock->mTrueJump = mTrueJump;
|
||||||
fblock->mFalseJump = mFalseJump;
|
fblock->mFalseJump = mFalseJump;
|
||||||
fblock->mBranch = mBranch;
|
fblock->mBranch = mBranch;
|
||||||
|
fblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
|
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
|
||||||
mIns[i + 1].mType = ASMIT_NOP;
|
mIns[i + 1].mType = ASMIT_NOP;
|
||||||
|
@ -19990,6 +19992,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
mTrueJump = fblock;
|
mTrueJump = fblock;
|
||||||
mFalseJump = iblock;
|
mFalseJump = iblock;
|
||||||
mBranch = ASMIT_BNE;
|
mBranch = ASMIT_BNE;
|
||||||
|
mBranchIns = mIns[i + 3].mIns;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20012,6 +20015,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
fblock->mTrueJump = mTrueJump;
|
fblock->mTrueJump = mTrueJump;
|
||||||
fblock->mFalseJump = mFalseJump;
|
fblock->mFalseJump = mFalseJump;
|
||||||
fblock->mBranch = mBranch;
|
fblock->mBranch = mBranch;
|
||||||
|
fblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
|
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
|
||||||
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].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;
|
mTrueJump = fblock;
|
||||||
mFalseJump = iblock;
|
mFalseJump = iblock;
|
||||||
mBranch = ASMIT_BNE;
|
mBranch = ASMIT_BNE;
|
||||||
|
mBranchIns = mIns[i + 2].mIns;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20051,6 +20056,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
fblock->mTrueJump = mTrueJump;
|
fblock->mTrueJump = mTrueJump;
|
||||||
fblock->mFalseJump = mFalseJump;
|
fblock->mFalseJump = mFalseJump;
|
||||||
fblock->mBranch = mBranch;
|
fblock->mBranch = mBranch;
|
||||||
|
fblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
fblock->mIns.Push(mIns[i + 1]);
|
fblock->mIns.Push(mIns[i + 1]);
|
||||||
fblock->mIns[0].mType = ASMIT_DEC;
|
fblock->mIns[0].mType = ASMIT_DEC;
|
||||||
|
@ -20071,6 +20077,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
mTrueJump = fblock;
|
mTrueJump = fblock;
|
||||||
mFalseJump = iblock;
|
mFalseJump = iblock;
|
||||||
mBranch = ASMIT_BNE;
|
mBranch = ASMIT_BNE;
|
||||||
|
mBranchIns = mIns[i + 3].mIns;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20092,6 +20099,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
fblock->mTrueJump = mTrueJump;
|
fblock->mTrueJump = mTrueJump;
|
||||||
fblock->mFalseJump = mFalseJump;
|
fblock->mFalseJump = mFalseJump;
|
||||||
fblock->mBranch = mBranch;
|
fblock->mBranch = mBranch;
|
||||||
|
fblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||||
mIns[i + 1].mType = ASMIT_NOP;
|
mIns[i + 1].mType = ASMIT_NOP;
|
||||||
|
@ -20114,6 +20122,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
mTrueJump = fblock;
|
mTrueJump = fblock;
|
||||||
mFalseJump = iblock;
|
mFalseJump = iblock;
|
||||||
mBranch = ASMIT_BNE;
|
mBranch = ASMIT_BNE;
|
||||||
|
mBranchIns = mIns[i + 3].mIns;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20135,6 +20144,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
fblock->mTrueJump = mTrueJump;
|
fblock->mTrueJump = mTrueJump;
|
||||||
fblock->mFalseJump = mFalseJump;
|
fblock->mFalseJump = mFalseJump;
|
||||||
fblock->mBranch = mBranch;
|
fblock->mBranch = mBranch;
|
||||||
|
fblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||||
mIns[i + 1].mType = ASMIT_NOP;
|
mIns[i + 1].mType = ASMIT_NOP;
|
||||||
|
@ -20157,6 +20167,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
mTrueJump = fblock;
|
mTrueJump = fblock;
|
||||||
mFalseJump = iblock;
|
mFalseJump = iblock;
|
||||||
mBranch = ASMIT_BNE;
|
mBranch = ASMIT_BNE;
|
||||||
|
mBranchIns = mIns[i + 3].mIns;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20177,6 +20188,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
fblock->mTrueJump = mTrueJump;
|
fblock->mTrueJump = mTrueJump;
|
||||||
fblock->mFalseJump = mFalseJump;
|
fblock->mFalseJump = mFalseJump;
|
||||||
fblock->mBranch = mBranch;
|
fblock->mBranch = mBranch;
|
||||||
|
fblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
mIns[i + 0].mType = ASMIT_NOP;
|
mIns[i + 0].mType = ASMIT_NOP;
|
||||||
mIns[i + 1].mType = ASMIT_NOP;
|
mIns[i + 1].mType = ASMIT_NOP;
|
||||||
|
@ -20197,6 +20209,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
mTrueJump = fblock;
|
mTrueJump = fblock;
|
||||||
mFalseJump = iblock;
|
mFalseJump = iblock;
|
||||||
mBranch = ASMIT_BNE;
|
mBranch = ASMIT_BNE;
|
||||||
|
mBranchIns = mIns[i + 3].mIns;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20218,6 +20231,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
fblock->mTrueJump = mTrueJump;
|
fblock->mTrueJump = mTrueJump;
|
||||||
fblock->mFalseJump = mFalseJump;
|
fblock->mFalseJump = mFalseJump;
|
||||||
fblock->mBranch = mBranch;
|
fblock->mBranch = mBranch;
|
||||||
|
fblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||||
mIns[i + 1].mType = ASMIT_NOP;
|
mIns[i + 1].mType = ASMIT_NOP;
|
||||||
|
@ -20240,6 +20254,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
mTrueJump = fblock;
|
mTrueJump = fblock;
|
||||||
mFalseJump = iblock;
|
mFalseJump = iblock;
|
||||||
mBranch = ASMIT_BNE;
|
mBranch = ASMIT_BNE;
|
||||||
|
mBranchIns = mIns[i + 3].mIns;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20266,6 +20281,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
rblock->mTrueJump = mTrueJump;
|
rblock->mTrueJump = mTrueJump;
|
||||||
rblock->mFalseJump = mFalseJump;
|
rblock->mFalseJump = mFalseJump;
|
||||||
rblock->mBranch = mBranch;
|
rblock->mBranch = mBranch;
|
||||||
|
rblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
for (int j = i + 6; j < mIns.Size(); j++)
|
for (int j = i + 6; j < mIns.Size(); j++)
|
||||||
rblock->mIns.Push(mIns[j]);
|
rblock->mIns.Push(mIns[j]);
|
||||||
|
@ -20275,6 +20291,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
mTrueJump = neblock;
|
mTrueJump = neblock;
|
||||||
mFalseJump = eblock;
|
mFalseJump = eblock;
|
||||||
mBranch = ASMIT_BNE;
|
mBranch = ASMIT_BNE;
|
||||||
|
mBranchIns = mIns[i + 0].mIns;
|
||||||
|
|
||||||
if (veq != 0)
|
if (veq != 0)
|
||||||
eblock->mIns.Push(NativeCodeInstruction(mIns[i].mIns, ASMIT_LDA, ASMIM_IMMEDIATE, veq));
|
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->mTrueJump = mTrueJump;
|
||||||
rblock->mFalseJump = mFalseJump;
|
rblock->mFalseJump = mFalseJump;
|
||||||
rblock->mBranch = mBranch;
|
rblock->mBranch = mBranch;
|
||||||
|
rblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
const InterInstruction* iins = mIns[i].mIns;
|
const InterInstruction* iins = mIns[i].mIns;
|
||||||
|
|
||||||
|
@ -20312,6 +20330,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
mTrueJump = iblock;
|
mTrueJump = iblock;
|
||||||
mFalseJump = rblock;
|
mFalseJump = rblock;
|
||||||
mBranch = ASMIT_BCS;
|
mBranch = ASMIT_BCS;
|
||||||
|
mBranchIns = iins;
|
||||||
|
|
||||||
iblock->mIns.Push(NativeCodeInstruction(iins, ASMIT_INY));
|
iblock->mIns.Push(NativeCodeInstruction(iins, ASMIT_INY));
|
||||||
|
|
||||||
|
@ -20336,6 +20355,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
rblock->mTrueJump = mTrueJump;
|
rblock->mTrueJump = mTrueJump;
|
||||||
rblock->mFalseJump = mFalseJump;
|
rblock->mFalseJump = mFalseJump;
|
||||||
rblock->mBranch = mBranch;
|
rblock->mBranch = mBranch;
|
||||||
|
rblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
for (int j = i + 4; j < mIns.Size(); j++)
|
for (int j = i + 4; j < mIns.Size(); j++)
|
||||||
rblock->mIns.Push(mIns[j]);
|
rblock->mIns.Push(mIns[j]);
|
||||||
|
@ -20345,6 +20365,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
mTrueJump = neblock;
|
mTrueJump = neblock;
|
||||||
mFalseJump = eblock;
|
mFalseJump = eblock;
|
||||||
mBranch = ASMIT_BNE;
|
mBranch = ASMIT_BNE;
|
||||||
|
mBranchIns = mIns[i + 0].mIns;
|
||||||
|
|
||||||
neblock->mIns.Push(NativeCodeInstruction(mIns[i].mIns, ASMIT_LDA, ASMIM_IMMEDIATE, 1));
|
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->mTrueJump = mTrueJump;
|
||||||
rblock->mFalseJump = mFalseJump;
|
rblock->mFalseJump = mFalseJump;
|
||||||
rblock->mBranch = mBranch;
|
rblock->mBranch = mBranch;
|
||||||
|
rblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
for (int j = i + 5; j < mIns.Size(); j++)
|
for (int j = i + 5; j < mIns.Size(); j++)
|
||||||
rblock->mIns.Push(mIns[j]);
|
rblock->mIns.Push(mIns[j]);
|
||||||
|
@ -20386,6 +20408,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
mTrueJump = neblock;
|
mTrueJump = neblock;
|
||||||
mFalseJump = eblock;
|
mFalseJump = eblock;
|
||||||
mBranch = ASMIT_BNE;
|
mBranch = ASMIT_BNE;
|
||||||
|
mBranchIns = mIns[i + 0].mIns;
|
||||||
|
|
||||||
if (veq != 0)
|
if (veq != 0)
|
||||||
eblock->mIns.Push(NativeCodeInstruction(mIns[i].mIns, ASMIT_LDA, ASMIM_IMMEDIATE, veq));
|
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->mTrueJump = mTrueJump;
|
||||||
rblock->mFalseJump = mFalseJump;
|
rblock->mFalseJump = mFalseJump;
|
||||||
rblock->mBranch = mBranch;
|
rblock->mBranch = mBranch;
|
||||||
|
rblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
for (int j = i + 5; j < mIns.Size(); j++)
|
for (int j = i + 5; j < mIns.Size(); j++)
|
||||||
rblock->mIns.Push(mIns[j]);
|
rblock->mIns.Push(mIns[j]);
|
||||||
|
@ -20424,6 +20448,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
mTrueJump = neblock;
|
mTrueJump = neblock;
|
||||||
mFalseJump = eblock;
|
mFalseJump = eblock;
|
||||||
mBranch = ASMIT_BNE;
|
mBranch = ASMIT_BNE;
|
||||||
|
mBranchIns = mIns[i + 0].mIns;
|
||||||
|
|
||||||
if (veq != 0)
|
if (veq != 0)
|
||||||
eblock->mIns.Push(NativeCodeInstruction(mIns[i].mIns, ASMIT_LDA, ASMIM_IMMEDIATE, veq));
|
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->mTrueJump = mTrueJump;
|
||||||
rblock->mFalseJump = mFalseJump;
|
rblock->mFalseJump = mFalseJump;
|
||||||
rblock->mBranch = mBranch;
|
rblock->mBranch = mBranch;
|
||||||
|
rblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
for (int j = i + 5; j < mIns.Size(); j++)
|
for (int j = i + 5; j < mIns.Size(); j++)
|
||||||
rblock->mIns.Push(mIns[j]);
|
rblock->mIns.Push(mIns[j]);
|
||||||
|
@ -20460,6 +20486,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
mTrueJump = neblock;
|
mTrueJump = neblock;
|
||||||
mFalseJump = eblock;
|
mFalseJump = eblock;
|
||||||
mBranch = ASMIT_BNE;
|
mBranch = ASMIT_BNE;
|
||||||
|
mBranchIns = mIns[i + 0].mIns;
|
||||||
|
|
||||||
neblock->mIns.Push(NativeCodeInstruction(mIns[i].mIns, ASMIT_LDA, ASMIM_IMMEDIATE, 0xff));
|
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->mTrueJump = mTrueJump;
|
||||||
fblock->mFalseJump = mFalseJump;
|
fblock->mFalseJump = mFalseJump;
|
||||||
fblock->mBranch = mBranch;
|
fblock->mBranch = mBranch;
|
||||||
|
fblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
|
const InterInstruction* iins = mIns[0].mIns;
|
||||||
|
|
||||||
for (int j = i + 3; j < mIns.Size(); j++)
|
for (int j = i + 3; j < mIns.Size(); j++)
|
||||||
fblock->mIns.Push(mIns[j]);
|
fblock->mIns.Push(mIns[j]);
|
||||||
|
@ -20622,6 +20652,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
mTrueJump = fblock;
|
mTrueJump = fblock;
|
||||||
mFalseJump = iblock;
|
mFalseJump = iblock;
|
||||||
mBranch = ASMIT_BCC;
|
mBranch = ASMIT_BCC;
|
||||||
|
mBranchIns = iins;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_IMMEDIATE && mIns[i + 0].mAddress == 0 &&
|
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->mTrueJump = mTrueJump;
|
||||||
fblock->mFalseJump = mFalseJump;
|
fblock->mFalseJump = mFalseJump;
|
||||||
fblock->mBranch = mBranch;
|
fblock->mBranch = mBranch;
|
||||||
|
fblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
|
const InterInstruction* iins = mIns[0].mIns;
|
||||||
|
|
||||||
for (int j = i + 3; j < mIns.Size(); j++)
|
for (int j = i + 3; j < mIns.Size(); j++)
|
||||||
fblock->mIns.Push(mIns[j]);
|
fblock->mIns.Push(mIns[j]);
|
||||||
|
@ -20650,6 +20684,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
mTrueJump = fblock;
|
mTrueJump = fblock;
|
||||||
mFalseJump = iblock;
|
mFalseJump = iblock;
|
||||||
mBranch = ASMIT_BCC;
|
mBranch = ASMIT_BCC;
|
||||||
|
mBranchIns = iins;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (mIns[i + 0].mType == ASMIT_LDA &&
|
else if (mIns[i + 0].mType == ASMIT_LDA &&
|
||||||
|
@ -20666,6 +20701,9 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
fblock->mTrueJump = mTrueJump;
|
fblock->mTrueJump = mTrueJump;
|
||||||
fblock->mFalseJump = mFalseJump;
|
fblock->mFalseJump = mFalseJump;
|
||||||
fblock->mBranch = mBranch;
|
fblock->mBranch = mBranch;
|
||||||
|
fblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
|
const InterInstruction* iins = mIns[0].mIns;
|
||||||
|
|
||||||
for (int j = i + 3; j < mIns.Size(); j++)
|
for (int j = i + 3; j < mIns.Size(); j++)
|
||||||
fblock->mIns.Push(mIns[j]);
|
fblock->mIns.Push(mIns[j]);
|
||||||
|
@ -20678,6 +20716,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
mTrueJump = fblock;
|
mTrueJump = fblock;
|
||||||
mFalseJump = iblock;
|
mFalseJump = iblock;
|
||||||
mBranch = ASMIT_BCS;
|
mBranch = ASMIT_BCS;
|
||||||
|
mBranchIns = iins;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (mIns[i + 0].mType == ASMIT_TXA &&
|
else if (mIns[i + 0].mType == ASMIT_TXA &&
|
||||||
|
@ -20693,6 +20732,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
fblock->mTrueJump = mTrueJump;
|
fblock->mTrueJump = mTrueJump;
|
||||||
fblock->mFalseJump = mFalseJump;
|
fblock->mFalseJump = mFalseJump;
|
||||||
fblock->mBranch = mBranch;
|
fblock->mBranch = mBranch;
|
||||||
|
fblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
const InterInstruction* iins(mIns[i].mIns);
|
const InterInstruction* iins(mIns[i].mIns);
|
||||||
|
|
||||||
|
@ -20707,6 +20747,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
mTrueJump = fblock;
|
mTrueJump = fblock;
|
||||||
mFalseJump = iblock;
|
mFalseJump = iblock;
|
||||||
mBranch = ASMIT_BCC;
|
mBranch = ASMIT_BCC;
|
||||||
|
mBranchIns = iins;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (mIns[i + 0].mType == ASMIT_TYA &&
|
else if (mIns[i + 0].mType == ASMIT_TYA &&
|
||||||
|
@ -20722,6 +20763,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
fblock->mTrueJump = mTrueJump;
|
fblock->mTrueJump = mTrueJump;
|
||||||
fblock->mFalseJump = mFalseJump;
|
fblock->mFalseJump = mFalseJump;
|
||||||
fblock->mBranch = mBranch;
|
fblock->mBranch = mBranch;
|
||||||
|
fblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
const InterInstruction* iins(mIns[i].mIns);
|
const InterInstruction* iins(mIns[i].mIns);
|
||||||
|
|
||||||
|
@ -20738,6 +20780,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
mTrueJump = fblock;
|
mTrueJump = fblock;
|
||||||
mFalseJump = iblock;
|
mFalseJump = iblock;
|
||||||
mBranch = ASMIT_BCC;
|
mBranch = ASMIT_BCC;
|
||||||
|
mBranchIns = iins;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (mIns[i + 0].mType == ASMIT_TXA &&
|
else if (mIns[i + 0].mType == ASMIT_TXA &&
|
||||||
|
@ -20753,6 +20796,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
fblock->mTrueJump = mTrueJump;
|
fblock->mTrueJump = mTrueJump;
|
||||||
fblock->mFalseJump = mFalseJump;
|
fblock->mFalseJump = mFalseJump;
|
||||||
fblock->mBranch = mBranch;
|
fblock->mBranch = mBranch;
|
||||||
|
fblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
const InterInstruction* iins(mIns[i].mIns);
|
const InterInstruction* iins(mIns[i].mIns);
|
||||||
|
|
||||||
|
@ -20769,6 +20813,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
mTrueJump = fblock;
|
mTrueJump = fblock;
|
||||||
mFalseJump = iblock;
|
mFalseJump = iblock;
|
||||||
mBranch = ASMIT_BCC;
|
mBranch = ASMIT_BCC;
|
||||||
|
mBranchIns = iins;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (mIns[i + 0].mType == ASMIT_TYA &&
|
else if (mIns[i + 0].mType == ASMIT_TYA &&
|
||||||
|
@ -20784,6 +20829,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
fblock->mTrueJump = mTrueJump;
|
fblock->mTrueJump = mTrueJump;
|
||||||
fblock->mFalseJump = mFalseJump;
|
fblock->mFalseJump = mFalseJump;
|
||||||
fblock->mBranch = mBranch;
|
fblock->mBranch = mBranch;
|
||||||
|
fblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
const InterInstruction* iins(mIns[i].mIns);
|
const InterInstruction* iins(mIns[i].mIns);
|
||||||
|
|
||||||
|
@ -20798,6 +20844,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
mTrueJump = fblock;
|
mTrueJump = fblock;
|
||||||
mFalseJump = iblock;
|
mFalseJump = iblock;
|
||||||
mBranch = ASMIT_BCC;
|
mBranch = ASMIT_BCC;
|
||||||
|
mBranchIns = iins;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (mIns[i + 0].mType == ASMIT_LDA &&
|
else if (mIns[i + 0].mType == ASMIT_LDA &&
|
||||||
|
@ -20814,6 +20861,9 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
fblock->mTrueJump = mTrueJump;
|
fblock->mTrueJump = mTrueJump;
|
||||||
fblock->mFalseJump = mFalseJump;
|
fblock->mFalseJump = mFalseJump;
|
||||||
fblock->mBranch = mBranch;
|
fblock->mBranch = mBranch;
|
||||||
|
fblock->mBranchIns = mBranchIns;
|
||||||
|
|
||||||
|
const InterInstruction* iins(mIns[i].mIns);
|
||||||
|
|
||||||
for (int j = i + 3; j < mIns.Size(); j++)
|
for (int j = i + 3; j < mIns.Size(); j++)
|
||||||
fblock->mIns.Push(mIns[j]);
|
fblock->mIns.Push(mIns[j]);
|
||||||
|
@ -20826,6 +20876,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
mTrueJump = fblock;
|
mTrueJump = fblock;
|
||||||
mFalseJump = iblock;
|
mFalseJump = iblock;
|
||||||
mBranch = ASMIT_BCS;
|
mBranch = ASMIT_BCS;
|
||||||
|
mBranchIns = iins;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51575,7 +51626,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc)
|
||||||
mInterProc = proc;
|
mInterProc = proc;
|
||||||
mInterProc->mLinkerObject->mNativeProc = this;
|
mInterProc->mLinkerObject->mNativeProc = this;
|
||||||
|
|
||||||
CheckFunc = !strcmp(mInterProc->mIdent->mString, "room_prep_chest");
|
CheckFunc = !strcmp(mInterProc->mIdent->mString, "floor_prepare");
|
||||||
|
|
||||||
int nblocks = proc->mBlocks.Size();
|
int nblocks = proc->mBlocks.Size();
|
||||||
tblocks = new NativeCodeBasicBlock * [nblocks];
|
tblocks = new NativeCodeBasicBlock * [nblocks];
|
||||||
|
@ -52126,7 +52177,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc)
|
||||||
|
|
||||||
void NativeCodeProcedure::Assemble(void)
|
void NativeCodeProcedure::Assemble(void)
|
||||||
{
|
{
|
||||||
CheckFunc = !strcmp(mInterProc->mIdent->mString, "a");
|
CheckFunc = !strcmp(mInterProc->mIdent->mString, "floor_prepare");
|
||||||
|
|
||||||
if (mInterProc->mCompilerOptions & COPT_OPTIMIZE_MERGE_CALLS)
|
if (mInterProc->mCompilerOptions & COPT_OPTIMIZE_MERGE_CALLS)
|
||||||
{
|
{
|
||||||
|
@ -52189,7 +52240,7 @@ void NativeCodeProcedure::Assemble(void)
|
||||||
mInterProc->mLinkerObject->AddReference(rl);
|
mInterProc->mLinkerObject->AddReference(rl);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mGenerator->mCompilerOptions & COPT_DEBUGINFO)
|
if (mGenerator->mCompilerOptions & (COPT_DEBUGINFO | COPT_PROFILEINFO))
|
||||||
{
|
{
|
||||||
if (mCodeLocations.Size() > 0)
|
if (mCodeLocations.Size() > 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -9917,6 +9917,7 @@ Expression* Parser::ParseStatement(void)
|
||||||
{
|
{
|
||||||
Declaration* iterVarDec = new Declaration(mScanner->mLocation, DT_VARIABLE);
|
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->mBase = containerExp->mDecType->mBase->BuildPointer(mScanner->mLocation);
|
||||||
iterVarDec->mVarIndex = mLocalIndex++;
|
iterVarDec->mVarIndex = mLocalIndex++;
|
||||||
iterVarDec->mSize = iterVarDec->mBase->mSize;
|
iterVarDec->mSize = iterVarDec->mBase->mSize;
|
||||||
iterVarDec->mFlags |= DTF_DEFINED;
|
iterVarDec->mFlags |= DTF_DEFINED;
|
||||||
|
@ -10158,6 +10159,15 @@ Expression* Parser::ParseStatement(void)
|
||||||
int stride = (endValue - startValue) / numLoops;
|
int stride = (endValue - startValue) / numLoops;
|
||||||
int remain = (endValue - startValue) - numIterations * 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);
|
Expression* unrollBody = new Expression(mScanner->mLocation, EX_SEQUENCE);
|
||||||
unrollBody->mLeft = bodyExp;
|
unrollBody->mLeft = bodyExp;
|
||||||
Expression* bexp = unrollBody;
|
Expression* bexp = unrollBody;
|
||||||
|
|
|
@ -297,6 +297,10 @@ int main2(int argc, const char** argv)
|
||||||
{
|
{
|
||||||
compiler->mCompilerOptions |= COPT_DEBUGINFO;
|
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')
|
else if (arg[1] == 'v')
|
||||||
{
|
{
|
||||||
compiler->mCompilerOptions |= COPT_VERBOSE;
|
compiler->mCompilerOptions |= COPT_VERBOSE;
|
||||||
|
|
Loading…
Reference in New Issue