Optimizations for global variables
This commit is contained in:
parent
fa223b90ad
commit
29bd0c8d2d
|
@ -24,6 +24,9 @@ rem @echo off
|
|||
@call :test strcmptest2.c
|
||||
@if %errorlevel% neq 0 goto :error
|
||||
|
||||
@call :test memmovetest.c
|
||||
@if %errorlevel% neq 0 goto :error
|
||||
|
||||
@call :test arraytest.c
|
||||
@if %errorlevel% neq 0 goto :error
|
||||
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
|
||||
unsigned b[4096];
|
||||
|
||||
void testfwd(unsigned sz)
|
||||
{
|
||||
for(unsigned i=0; i<4096; i++)
|
||||
b[i] = i;
|
||||
|
||||
memmove(b + 100, b + 101, 2 * sz);
|
||||
|
||||
for(unsigned i=0; i<100; i++)
|
||||
assert(b[i] == i);
|
||||
for(unsigned i=100; i<100 + sz; i++)
|
||||
assert(b[i] == i + 1);
|
||||
for(unsigned i=100 + sz; i<4096; i++)
|
||||
assert(b[i] == i);
|
||||
}
|
||||
|
||||
void testback(unsigned sz)
|
||||
{
|
||||
for(unsigned i=0; i<4096; i++)
|
||||
b[i] = i;
|
||||
|
||||
memmove(b + 101, b + 100, 2 * sz);
|
||||
|
||||
for(unsigned i=0; i<101; i++)
|
||||
assert(b[i] == i);
|
||||
for(unsigned i=101; i<101 + sz; i++)
|
||||
assert(b[i] == i - 1);
|
||||
for(unsigned i=101 + sz; i<4096; i++)
|
||||
assert(b[i] == i);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
for(unsigned i=1; i<2048; i *= 2)
|
||||
{
|
||||
testfwd(i - 1);
|
||||
testfwd(i);
|
||||
testback(i);
|
||||
testback(i - 1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -218,19 +218,25 @@ void * memcpy(void * dst, const void * src, int size)
|
|||
#pragma native(memcpy)
|
||||
|
||||
void * memmove(void * dst, const void * src, int size)
|
||||
{
|
||||
int sz = size;
|
||||
if (sz > 0)
|
||||
{
|
||||
char * d = dst, * s = src;
|
||||
if (d < s)
|
||||
{
|
||||
while (size--)
|
||||
do {
|
||||
*d++ = *s++;
|
||||
} while (--sz);
|
||||
}
|
||||
else if (d > s)
|
||||
{
|
||||
d += size;
|
||||
s += size;
|
||||
while (size--)
|
||||
d += sz;
|
||||
s += sz;
|
||||
do {
|
||||
*--d = *--s;
|
||||
} while (--sz);
|
||||
}
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
|
|
@ -2308,6 +2308,20 @@ bool InterOperand::IsUnsigned(void) const
|
|||
}
|
||||
|
||||
|
||||
void InterOperand::ForwardMem(const InterOperand& op)
|
||||
{
|
||||
mIntConst = op.mIntConst;
|
||||
mFloatConst = op.mFloatConst;
|
||||
mVarIndex = op.mVarIndex;
|
||||
mOperandSize = op.mOperandSize;
|
||||
mLinkerObject = op.mLinkerObject;
|
||||
mMemory = op.mMemory;
|
||||
mTemp = op.mTemp;
|
||||
mType = op.mType;
|
||||
mRange = op.mRange;
|
||||
mFinal = false;
|
||||
}
|
||||
|
||||
void InterOperand::Forward(const InterOperand& op)
|
||||
{
|
||||
mTemp = op.mTemp;
|
||||
|
@ -3066,7 +3080,7 @@ void InterInstruction::CollectSimpleLocals(FastNumberSet& complexLocals, FastNum
|
|||
case IC_LOAD:
|
||||
if (mSrc[0].mMemory == IM_LOCAL && mSrc[0].mTemp < 0)
|
||||
{
|
||||
if (localTypes[mSrc[0].mVarIndex] == IT_NONE || localTypes[mSrc[0].mVarIndex] == mDst.mType)
|
||||
if ((localTypes[mSrc[0].mVarIndex] == IT_NONE || localTypes[mSrc[0].mVarIndex] == mDst.mType) && mSrc[0].mIntConst == 0)
|
||||
{
|
||||
localTypes[mSrc[0].mVarIndex] = mDst.mType;
|
||||
simpleLocals += mSrc[0].mVarIndex;
|
||||
|
@ -3076,7 +3090,7 @@ void InterInstruction::CollectSimpleLocals(FastNumberSet& complexLocals, FastNum
|
|||
}
|
||||
else if ((mSrc[0].mMemory == IM_PARAM || mSrc[0].mMemory == IM_FPARAM) && mSrc[0].mTemp < 0)
|
||||
{
|
||||
if (paramTypes[mSrc[0].mVarIndex] == IT_NONE || paramTypes[mSrc[0].mVarIndex] == mDst.mType)
|
||||
if ((paramTypes[mSrc[0].mVarIndex] == IT_NONE || paramTypes[mSrc[0].mVarIndex] == mDst.mType) && mSrc[0].mIntConst == 0)
|
||||
{
|
||||
paramTypes[mSrc[0].mVarIndex] = mDst.mType;
|
||||
simpleParams += mSrc[0].mVarIndex;
|
||||
|
@ -3088,7 +3102,7 @@ void InterInstruction::CollectSimpleLocals(FastNumberSet& complexLocals, FastNum
|
|||
case IC_STORE:
|
||||
if (mSrc[1].mMemory == IM_LOCAL && mSrc[1].mTemp < 0)
|
||||
{
|
||||
if (localTypes[mSrc[1].mVarIndex] == IT_NONE || localTypes[mSrc[1].mVarIndex] == mSrc[0].mType)
|
||||
if ((localTypes[mSrc[1].mVarIndex] == IT_NONE || localTypes[mSrc[1].mVarIndex] == mSrc[0].mType) && mSrc[1].mIntConst == 0)
|
||||
{
|
||||
localTypes[mSrc[1].mVarIndex] = mSrc[0].mType;
|
||||
simpleLocals += mSrc[1].mVarIndex;
|
||||
|
@ -3098,7 +3112,7 @@ void InterInstruction::CollectSimpleLocals(FastNumberSet& complexLocals, FastNum
|
|||
}
|
||||
else if ((mSrc[1].mMemory == IM_PARAM || mSrc[1].mMemory == IM_FPARAM) && mSrc[1].mTemp < 0)
|
||||
{
|
||||
if (paramTypes[mSrc[1].mVarIndex] == IT_NONE || paramTypes[mSrc[1].mVarIndex] == mSrc[0].mType)
|
||||
if ((paramTypes[mSrc[1].mVarIndex] == IT_NONE || paramTypes[mSrc[1].mVarIndex] == mSrc[0].mType) && mSrc[1].mIntConst == 0)
|
||||
{
|
||||
paramTypes[mSrc[1].mVarIndex] = mSrc[0].mType;
|
||||
simpleParams += mSrc[1].mVarIndex;
|
||||
|
@ -4779,6 +4793,29 @@ void InterCodeBasicBlock::SimplifyIntegerRangeRelops(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
if (sz >= 1 && mInstructions[sz - 1]->mCode == IC_BRANCH && mInstructions[sz - 1]->mSrc[0].mTemp < 0)
|
||||
{
|
||||
InterInstruction* bins = mInstructions[sz - 1];
|
||||
|
||||
if (bins->mSrc[0].mIntConst)
|
||||
{
|
||||
mFalseJump->mNumEntries--;
|
||||
mFalseJump = nullptr;
|
||||
bins->mCode = IC_JUMP;
|
||||
bins->mSrc[0].mTemp = -1;
|
||||
bins->mNumOperands = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
mTrueJump->mNumEntries--;
|
||||
mTrueJump = mFalseJump;
|
||||
mFalseJump = nullptr;
|
||||
bins->mCode = IC_JUMP;
|
||||
bins->mSrc[0].mTemp = -1;
|
||||
bins->mNumOperands = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (sz >= 2 && mInstructions[sz - 1]->mCode == IC_BRANCH && mInstructions[sz - 2]->mCode == IC_CONSTANT && mInstructions[sz - 2]->mDst.mTemp == mInstructions[sz - 1]->mSrc[0].mTemp)
|
||||
{
|
||||
InterInstruction* bins = mInstructions[sz - 1];
|
||||
|
@ -4802,6 +4839,7 @@ void InterCodeBasicBlock::SimplifyIntegerRangeRelops(void)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
#if 1
|
||||
for (int i = 0; i < sz; i++)
|
||||
{
|
||||
|
@ -5572,6 +5610,24 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(void)
|
|||
mTrueValueRange = mLocalValueRange;
|
||||
mFalseValueRange = mLocalValueRange;
|
||||
|
||||
if (sz >= 1)
|
||||
{
|
||||
if (mInstructions[sz - 1]->mCode == IC_BRANCH && mInstructions[sz - 1]->mSrc[0].mTemp >= 0 && mInstructions[sz - 1]->mSrc[0].mType == IT_BOOL)
|
||||
{
|
||||
int s = mInstructions[sz - 1]->mSrc[0].mTemp;
|
||||
|
||||
mTrueValueRange[s].mMinState = IntegerValueRange::S_BOUND;
|
||||
mTrueValueRange[s].mMinValue = 1;
|
||||
mTrueValueRange[s].mMaxState = IntegerValueRange::S_BOUND;
|
||||
mTrueValueRange[s].mMaxValue = 1;
|
||||
|
||||
mFalseValueRange[s].mMinState = IntegerValueRange::S_BOUND;
|
||||
mFalseValueRange[s].mMinValue = 0;
|
||||
mFalseValueRange[s].mMaxState = IntegerValueRange::S_BOUND;
|
||||
mFalseValueRange[s].mMaxValue = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (sz >= 2)
|
||||
{
|
||||
if (mInstructions[sz - 1]->mCode == IC_BRANCH && mInstructions[sz - 2]->mCode == IC_RELATIONAL_OPERATOR &&
|
||||
|
@ -5699,12 +5755,16 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(void)
|
|||
}
|
||||
break;
|
||||
case IA_CMPGU:
|
||||
if (s1 >= 0)
|
||||
{
|
||||
mTrueValueRange[s1].LimitMin(1);
|
||||
if (s0 < 0)
|
||||
{
|
||||
mTrueValueRange[s1].LimitMin(mInstructions[sz - 2]->mSrc[0].mIntConst + 1);
|
||||
mFalseValueRange[s1].LimitMax(mInstructions[sz - 2]->mSrc[0].mIntConst);
|
||||
mFalseValueRange[s1].LimitMin(0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case IA_CMPGEU:
|
||||
if (s0 < 0)
|
||||
|
@ -6595,6 +6655,18 @@ bool InterCodeBasicBlock::SimplifyIntegerNumeric(const GrowingInstructionPtrArra
|
|||
}
|
||||
#endif
|
||||
}
|
||||
else if (ins->mSrc[1].mTemp >= 0 && ins->mSrc[0].mTemp < 0 && ltvalue[ins->mSrc[1].mTemp])
|
||||
{
|
||||
InterInstruction* pins = ltvalue[ins->mSrc[1].mTemp];
|
||||
|
||||
if (pins->mCode == IC_LEA && pins->mSrc[1].mTemp < 0)
|
||||
{
|
||||
ins->mSrc[1].ForwardMem(pins->mSrc[1]);
|
||||
ins->mSrc[1].mIntConst += ins->mSrc[0].mIntConst;
|
||||
ins->mSrc[0].Forward(pins->mSrc[0]);
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
|
@ -7089,8 +7161,10 @@ static int Find(GrowingIntArray& table, int i)
|
|||
return j;
|
||||
}
|
||||
|
||||
void InterCodeBasicBlock::LoadStoreForwarding(const GrowingInstructionPtrArray& tvalue)
|
||||
bool InterCodeBasicBlock::LoadStoreForwarding(const GrowingInstructionPtrArray& tvalue)
|
||||
{
|
||||
bool changed = false;
|
||||
|
||||
if (!mVisited)
|
||||
{
|
||||
if (!mLoopHead)
|
||||
|
@ -7115,10 +7189,12 @@ void InterCodeBasicBlock::LoadStoreForwarding(const GrowingInstructionPtrArray&
|
|||
|
||||
if (mNumEntered < mNumEntries)
|
||||
{
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
mLoadStoreInstructions.SetSize(0);
|
||||
|
||||
mVisited = true;
|
||||
|
||||
|
@ -7144,6 +7220,7 @@ void InterCodeBasicBlock::LoadStoreForwarding(const GrowingInstructionPtrArray&
|
|||
ins->mCode = IC_LOAD_TEMPORARY;
|
||||
ins->mSrc[0] = lins->mDst;
|
||||
ins->mNumOperands = 1;
|
||||
changed = true;
|
||||
}
|
||||
else if (lins->mCode == IC_STORE)
|
||||
{
|
||||
|
@ -7151,12 +7228,14 @@ void InterCodeBasicBlock::LoadStoreForwarding(const GrowingInstructionPtrArray&
|
|||
{
|
||||
ins->mCode = IC_CONSTANT;
|
||||
ins->mConst = lins->mSrc[0];
|
||||
changed = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
ins->mCode = IC_LOAD_TEMPORARY;
|
||||
ins->mSrc[0] = lins->mSrc[0];
|
||||
ins->mNumOperands = 1;
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -7175,9 +7254,11 @@ void InterCodeBasicBlock::LoadStoreForwarding(const GrowingInstructionPtrArray&
|
|||
{
|
||||
ins->mCode = IC_NONE;
|
||||
ins->mNumOperands = 0;
|
||||
changed = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
j = 0;
|
||||
while (j < mLoadStoreInstructions.Size())
|
||||
{
|
||||
if (!CollidingMem(ins->mSrc[1], mLoadStoreInstructions[j]))
|
||||
|
@ -7203,6 +7284,7 @@ void InterCodeBasicBlock::LoadStoreForwarding(const GrowingInstructionPtrArray&
|
|||
ins->mCode = IC_LOAD_TEMPORARY;
|
||||
ins->mSrc[0] = lins->mDst;
|
||||
ins->mNumOperands = 1;
|
||||
changed = true;
|
||||
}
|
||||
else
|
||||
nins = ins;
|
||||
|
@ -7236,9 +7318,13 @@ void InterCodeBasicBlock::LoadStoreForwarding(const GrowingInstructionPtrArray&
|
|||
mLoadStoreInstructions.Push(nins);
|
||||
}
|
||||
|
||||
if (mTrueJump) mTrueJump->LoadStoreForwarding(mLoadStoreInstructions);
|
||||
if (mFalseJump) mFalseJump->LoadStoreForwarding(mLoadStoreInstructions);
|
||||
if (mTrueJump && mTrueJump->LoadStoreForwarding(mLoadStoreInstructions))
|
||||
changed = true;
|
||||
if (mFalseJump && mFalseJump->LoadStoreForwarding(mLoadStoreInstructions))
|
||||
changed = true;
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
|
||||
|
@ -10598,17 +10684,20 @@ void InterCodeProcedure::Close(void)
|
|||
|
||||
DisassembleDebug("Copy forwarding");
|
||||
|
||||
|
||||
do {
|
||||
GrowingInstructionPtrArray gipa(nullptr);
|
||||
ResetVisited();
|
||||
mEntryBlock->LoadStoreForwarding(gipa);
|
||||
changed = mEntryBlock->LoadStoreForwarding(gipa);
|
||||
|
||||
DisassembleDebug("Load/Store forwardingX");
|
||||
|
||||
RemoveUnusedStoreInstructions(paramMemory);
|
||||
|
||||
TempForwarding();
|
||||
RemoveUnusedInstructions();
|
||||
|
||||
DisassembleDebug("Load/Store forwarding");
|
||||
} while (changed);
|
||||
|
||||
FastNumberSet activeSet(numTemps);
|
||||
|
||||
|
|
|
@ -253,6 +253,7 @@ public:
|
|||
IntegerValueRange mRange;
|
||||
|
||||
void Forward(const InterOperand& op);
|
||||
void ForwardMem(const InterOperand& op);
|
||||
|
||||
InterOperand(void);
|
||||
|
||||
|
@ -408,7 +409,7 @@ public:
|
|||
GrowingIntArray mEntryRenameTable;
|
||||
GrowingIntArray mExitRenameTable;
|
||||
|
||||
void LoadStoreForwarding(const GrowingInstructionPtrArray& tvalue);
|
||||
bool LoadStoreForwarding(const GrowingInstructionPtrArray& tvalue);
|
||||
|
||||
void LocalRenameRegister(const GrowingIntArray& renameTable, int& num);
|
||||
void BuildGlobalRenameRegisterTable(const GrowingIntArray& renameTable, GrowingIntArray& globalRenameTable);
|
||||
|
|
|
@ -1047,7 +1047,11 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration*
|
|||
else
|
||||
{
|
||||
if (vl.mType->mType == DT_TYPE_POINTER && (vr.mType->mType == DT_TYPE_ARRAY || vr.mType->mType == DT_TYPE_FUNCTION))
|
||||
{
|
||||
vr = Dereference(proc, block, vr, 1);
|
||||
vr.mReference = 0;
|
||||
vr.mType = vl.mType;
|
||||
}
|
||||
else
|
||||
vr = Dereference(proc, block, vr);
|
||||
|
||||
|
|
|
@ -958,6 +958,11 @@ bool NativeCodeInstruction::ChangesAddress(void) const
|
|||
return false;
|
||||
}
|
||||
|
||||
bool NativeCodeInstruction::IsSimpleJSR(void) const
|
||||
{
|
||||
return mType == ASMIT_JSR && mMode == ASMIM_ABSOLUTE && !(mLinkerObject && (mLinkerObject->mFlags & LOBJF_INLINE));
|
||||
}
|
||||
|
||||
bool NativeCodeInstruction::IsShift(void) const
|
||||
{
|
||||
return mType == ASMIT_ASL || mType == ASMIT_LSR || mType == ASMIT_ROL || mType == ASMIT_ROR;
|
||||
|
@ -1087,6 +1092,28 @@ bool NativeCodeInstruction::MayBeChangedOnAddress(const NativeCodeInstruction& i
|
|||
return false;
|
||||
}
|
||||
|
||||
bool NativeCodeInstruction::UsesMemoryOf(const NativeCodeInstruction& ins) const
|
||||
{
|
||||
if (ins.mMode == ASMIM_ZERO_PAGE)
|
||||
return UsesZeroPage(ins.mAddress);
|
||||
else if (UsesAddress())
|
||||
{
|
||||
if (ins.mMode == ASMIM_ABSOLUTE && mMode == ASMIM_ABSOLUTE)
|
||||
return mLinkerObject == ins.mLinkerObject && mAddress == ins.mAddress;
|
||||
else if (
|
||||
(ins.mMode == ASMIM_ABSOLUTE || ins.mMode == ASMIM_ABSOLUTE_X || ins.mMode == ASMIM_ABSOLUTE_Y) &&
|
||||
(mMode == ASMIM_ABSOLUTE || mMode == ASMIM_ABSOLUTE_X || mMode == ASMIM_ABSOLUTE_Y))
|
||||
return mLinkerObject == ins.mLinkerObject;
|
||||
else if (ins.mMode == ASMIM_INDIRECT_Y || mMode == ASMIM_INDIRECT_Y)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
bool NativeCodeInstruction::SameEffectiveAddress(const NativeCodeInstruction& ins) const
|
||||
{
|
||||
|
@ -3547,10 +3574,18 @@ static AsmInsType TransposeBranchCondition(AsmInsType code)
|
|||
int NativeCodeBasicBlock::PutJump(NativeCodeProcedure* proc, NativeCodeBasicBlock* target, int offset)
|
||||
{
|
||||
if (target->mIns.Size() == 1 && target->mIns[0].mType == ASMIT_RTS)
|
||||
{
|
||||
if (mIns.Size() > 0 && mIns.Last().IsSimpleJSR())
|
||||
{
|
||||
this->mCode[this->mCode.Size() - 3] = 0x4c;
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
PutByte(0x60);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
#if 1
|
||||
else if (offset >= -126 && offset <= 129)
|
||||
{
|
||||
|
@ -3601,7 +3636,12 @@ int NativeCodeBasicBlock::BranchByteSize(int from, int to)
|
|||
int NativeCodeBasicBlock::JumpByteSize(NativeCodeBasicBlock* target, int offset)
|
||||
{
|
||||
if (target->mIns.Size() == 1 && target->mIns[0].mType == ASMIT_RTS)
|
||||
{
|
||||
if (mIns.Size() > 0 && mIns.Last().IsSimpleJSR())
|
||||
return 0;
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
#if 1
|
||||
else if (offset >= -126 && offset <= 129)
|
||||
{
|
||||
|
@ -11088,20 +11128,10 @@ bool NativeCodeBasicBlock::AlternateXYUsage(void)
|
|||
}
|
||||
else if (ins.ChangesXReg())
|
||||
{
|
||||
if (currXPos != -1)
|
||||
{
|
||||
predXEnd = start;
|
||||
predXPos = currXPos;
|
||||
}
|
||||
currXPos = -1;
|
||||
}
|
||||
else if (ins.ChangesYReg())
|
||||
{
|
||||
if (currYPos != -1)
|
||||
{
|
||||
predYEnd = start;
|
||||
predYPos = currYPos;
|
||||
}
|
||||
currYPos = -1;
|
||||
}
|
||||
else
|
||||
|
@ -11129,6 +11159,77 @@ bool NativeCodeBasicBlock::AlternateXYUsage(void)
|
|||
return changed;
|
||||
}
|
||||
|
||||
bool NativeCodeBasicBlock::Split16BitLoopCount(NativeCodeProcedure* proc)
|
||||
{
|
||||
bool changed = false;
|
||||
|
||||
if (!mVisited)
|
||||
{
|
||||
mVisited = true;
|
||||
|
||||
#if 1
|
||||
int sz = mIns.Size();
|
||||
if (sz >= 8 && mBranch == ASMIT_BNE)
|
||||
{
|
||||
if (mIns[sz - 8].mType == ASMIT_CLC &&
|
||||
mIns[sz - 7].mType == ASMIT_LDA &&
|
||||
mIns[sz - 6].mType == ASMIT_ADC && mIns[sz - 6].mMode == ASMIM_IMMEDIATE && mIns[sz - 6].mAddress == 0xff &&
|
||||
mIns[sz - 5].mType == ASMIT_STA && mIns[sz - 5].SameEffectiveAddress(mIns[sz - 7]) &&
|
||||
|
||||
mIns[sz - 4].mType == ASMIT_LDA &&
|
||||
mIns[sz - 3].mType == ASMIT_ADC && mIns[sz - 3].mMode == ASMIM_IMMEDIATE && mIns[sz - 3].mAddress == 0xff &&
|
||||
mIns[sz - 2].mType == ASMIT_STA && mIns[sz - 2].SameEffectiveAddress(mIns[sz - 4]) &&
|
||||
|
||||
mIns[sz - 1].mType == ASMIT_ORA && mIns[sz - 1].SameEffectiveAddress(mIns[sz - 7]) &&
|
||||
|
||||
HasAsmInstructionMode(ASMIT_DEC, mIns[sz - 5].mMode) &&
|
||||
HasAsmInstructionMode(ASMIT_DEC, mIns[sz - 2].mMode) &&
|
||||
|
||||
!(mIns[sz - 1].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C)))
|
||||
{
|
||||
changed = true;
|
||||
|
||||
NativeCodeBasicBlock* hblock = proc->AllocateBlock();
|
||||
NativeCodeBasicBlock* dblock = proc->AllocateBlock();
|
||||
NativeCodeBasicBlock* zblock = proc->AllocateBlock();
|
||||
|
||||
zblock->mTrueJump = mTrueJump;
|
||||
zblock->mFalseJump = mFalseJump;
|
||||
zblock->mBranch = ASMIT_BNE;
|
||||
|
||||
dblock->mTrueJump = mTrueJump;
|
||||
dblock->mFalseJump = zblock;
|
||||
dblock->mBranch = ASMIT_BNE;
|
||||
|
||||
hblock->mTrueJump = dblock;
|
||||
hblock->mBranch = ASMIT_JMP;
|
||||
mTrueJump = dblock;
|
||||
mFalseJump = hblock;
|
||||
|
||||
NativeCodeInstruction ilow(mIns[sz - 7]);
|
||||
NativeCodeInstruction ihigh(mIns[sz - 4]);
|
||||
|
||||
mIns.SetSize(sz - 8);
|
||||
|
||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ilow.mMode, ilow.mAddress, ilow.mLinkerObject));
|
||||
|
||||
hblock->mIns.Push(NativeCodeInstruction(ASMIT_DEC, ihigh.mMode, ihigh.mAddress, ihigh.mLinkerObject));
|
||||
|
||||
dblock->mIns.Push(NativeCodeInstruction(ASMIT_DEC, ilow.mMode, ilow.mAddress, ilow.mLinkerObject));
|
||||
|
||||
zblock->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ihigh.mMode, ihigh.mAddress, ihigh.mLinkerObject));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (mTrueJump && mTrueJump->Split16BitLoopCount(proc))
|
||||
changed = true;
|
||||
if (mFalseJump && mFalseJump->Split16BitLoopCount(proc))
|
||||
changed = true;
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||
{
|
||||
bool changed = false;
|
||||
|
@ -11180,6 +11281,47 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
|||
mBranch = ASMIT_BNE;
|
||||
break;
|
||||
}
|
||||
if (mIns[i + 0].mType == ASMIT_CLC &&
|
||||
mIns[i + 1].mType == ASMIT_LDA &&
|
||||
mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 0xff &&
|
||||
mIns[i + 3].mType == ASMIT_STA && mIns[i + 1].SameEffectiveAddress(mIns[i + 3]) &&
|
||||
mIns[i + 4].mType == ASMIT_LDA &&
|
||||
mIns[i + 5].mType == ASMIT_ADC && mIns[i + 5].mMode == ASMIM_IMMEDIATE && mIns[i + 5].mAddress == 0xff &&
|
||||
mIns[i + 6].mType == ASMIT_STA && mIns[i + 4].SameEffectiveAddress(mIns[i + 6]) &&
|
||||
HasAsmInstructionMode(ASMIT_DEC, mIns[i + 3].mMode) &&
|
||||
HasAsmInstructionMode(ASMIT_DEC, mIns[i + 6].mMode) &&
|
||||
!(mIns[i + 6].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C | LIVE_CPU_REG_Z)))
|
||||
{
|
||||
changed = true;
|
||||
|
||||
NativeCodeBasicBlock* iblock = proc->AllocateBlock();
|
||||
NativeCodeBasicBlock* fblock = proc->AllocateBlock();
|
||||
|
||||
fblock->mTrueJump = mTrueJump;
|
||||
fblock->mFalseJump = mFalseJump;
|
||||
fblock->mBranch = mBranch;
|
||||
|
||||
fblock->mIns.Push(mIns[i + 1]);
|
||||
fblock->mIns[0].mType = ASMIT_DEC;
|
||||
|
||||
mIns[i + 0].mType = ASMIT_NOP;
|
||||
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
|
||||
mIns[i + 3].mType = ASMIT_LDA; mIns[i + 3].mLive |= LIVE_CPU_REG_Z;
|
||||
|
||||
for (int j = i + 7; j < mIns.Size(); j++)
|
||||
fblock->mIns.Push(mIns[j]);
|
||||
iblock->mIns.Push(mIns[i + 6]);
|
||||
mIns.SetSize(i + 4);
|
||||
iblock->mIns[0].mType = ASMIT_DEC;
|
||||
iblock->mTrueJump = fblock;
|
||||
iblock->mBranch = ASMIT_JMP;
|
||||
|
||||
mTrueJump = fblock;
|
||||
mFalseJump = iblock;
|
||||
mBranch = ASMIT_BNE;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
@ -11949,6 +12091,28 @@ NativeCodeBasicBlock * NativeCodeBasicBlock::SplitMatchingTails(NativeCodeProced
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
NativeCodeBasicBlock* NativeCodeBasicBlock::AddDominatorBlock(NativeCodeProcedure* proc, NativeCodeBasicBlock* pblock)
|
||||
{
|
||||
if (pblock->mFalseJump)
|
||||
{
|
||||
NativeCodeBasicBlock* tblock = proc->AllocateBlock();
|
||||
tblock->mBranch = ASMIT_JMP;
|
||||
tblock->mTrueJump = this;
|
||||
tblock->mEntryBlocks.Push(pblock);
|
||||
|
||||
mEntryBlocks[mEntryBlocks.IndexOf(pblock)] = tblock;
|
||||
|
||||
if (pblock->mTrueJump == this)
|
||||
pblock->mTrueJump = tblock;
|
||||
if (pblock->mFalseJump == this)
|
||||
pblock->mFalseJump = tblock;
|
||||
|
||||
return tblock;
|
||||
}
|
||||
else
|
||||
return pblock;
|
||||
}
|
||||
|
||||
bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool loops)
|
||||
{
|
||||
bool changed = false;
|
||||
|
@ -12020,7 +12184,7 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool
|
|||
NativeCodeBasicBlock* pblock = mEntryBlocks[0], * lblock = mEntryBlocks[1];
|
||||
int ps = pblock->mIns.Size(), ls = lblock->mIns.Size();
|
||||
|
||||
if (ps >= 2 && ls >= 2 && !pblock->mFalseJump)
|
||||
if (ls >= 2)
|
||||
{
|
||||
if (mIns[0].mType == ASMIT_LDY && mIns[0].mMode == ASMIM_ZERO_PAGE && !(mIns[0].mLive & LIVE_CPU_REG_A))
|
||||
{
|
||||
|
@ -12030,6 +12194,8 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool
|
|||
lblock->mIns[ls - 2].mType = ASMIT_LDY; lblock->mIns[ls - 2].mLive |= LIVE_CPU_REG_Y;
|
||||
lblock->mIns[ls - 1].mType = ASMIT_CPY; lblock->mIns[ls - 1].mLive |= LIVE_CPU_REG_Y;
|
||||
|
||||
pblock = AddDominatorBlock(proc, pblock);
|
||||
|
||||
pblock->mIns.Push(mIns[0]);
|
||||
mIns.Remove(0);
|
||||
|
||||
|
@ -12040,6 +12206,8 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool
|
|||
{
|
||||
lblock->mIns[ls - 1].mType = ASMIT_LDY; lblock->mIns[ls - 1].mLive |= LIVE_CPU_REG_Y;
|
||||
|
||||
pblock = AddDominatorBlock(proc, pblock);
|
||||
|
||||
pblock->mIns.Push(mIns[0]);
|
||||
mIns.Remove(0);
|
||||
|
||||
|
@ -12054,6 +12222,8 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool
|
|||
lblock->mIns[ls - 2].mType = ASMIT_LDX; lblock->mIns[ls - 2].mLive |= LIVE_CPU_REG_X;
|
||||
lblock->mIns[ls - 1].mType = ASMIT_CPX; lblock->mIns[ls - 1].mLive |= LIVE_CPU_REG_X;
|
||||
|
||||
pblock = AddDominatorBlock(proc, pblock);
|
||||
|
||||
pblock->mIns.Push(mIns[0]);
|
||||
mIns.Remove(0);
|
||||
|
||||
|
@ -12065,6 +12235,8 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool
|
|||
if (lblock->mIns[ls - 2].mType == ASMIT_LDA && lblock->mIns[ls - 2].mMode == ASMIM_ZERO_PAGE && lblock->mIns[ls - 2].mAddress == mIns[0].mAddress &&
|
||||
lblock->mIns[ls - 1].mType == ASMIT_CMP)
|
||||
{
|
||||
pblock = AddDominatorBlock(proc, pblock);
|
||||
|
||||
pblock->mIns.Push(mIns[0]);
|
||||
mIns.Remove(0);
|
||||
|
||||
|
@ -14611,7 +14783,7 @@ bool NativeCodeBasicBlock::MoveLoadAddImmStoreUp(int at)
|
|||
|
||||
if (mIns[j].ChangesZeroPage(mIns[at + 1].mAddress))
|
||||
return false;
|
||||
if (mIns[j].UsesZeroPage(mIns[at + 3].mAddress))
|
||||
if (mIns[j].UsesMemoryOf(mIns[at + 3]))
|
||||
return false;
|
||||
if (mIns[j].ChangesCarry())
|
||||
return false;
|
||||
|
@ -15781,6 +15953,9 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoopInvariant(NativeCodeProcedure* proc
|
|||
if (!prevBlock)
|
||||
return OptimizeSimpleLoopInvariant(proc);
|
||||
|
||||
for (int i = 0; i < mIns.Size(); i++)
|
||||
mIns[i].mLive |= LIVE_CPU_REG_Y;
|
||||
|
||||
prevBlock->mIns.Push(mIns[ai]);
|
||||
mIns.Remove(ai);
|
||||
|
||||
|
@ -18073,7 +18248,8 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
|
|||
mIns[i + 0].mType == ASMIT_CLC &&
|
||||
mIns[i + 1].mType == ASMIT_LDA && mIns[i + 1].mMode == ASMIM_ZERO_PAGE &&
|
||||
mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE &&
|
||||
mIns[i + 3].mType == ASMIT_STA && mIns[i + 3].mMode == ASMIM_ZERO_PAGE && (mIns[i + 3].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z)) == 0)
|
||||
mIns[i + 3].mType == ASMIT_STA && (mIns[i + 3].mMode == ASMIM_ZERO_PAGE || mIns[i + 3].mMode == ASMIM_ABSOLUTE) &&
|
||||
(mIns[i + 3].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z)) == 0)
|
||||
{
|
||||
if (MoveLoadAddImmStoreUp(i))
|
||||
changed = true;
|
||||
|
@ -18413,31 +18589,46 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
|
|||
{
|
||||
if (mIns[i].mType == ASMIT_TXA && mIns[i + 1].mType == ASMIT_TAY)
|
||||
{
|
||||
int j = i + 2;
|
||||
int j = i + 2, k = i, n = i;
|
||||
while (j < mIns.Size() && !mIns[j].ChangesXReg() && !mIns[j].ChangesYReg())
|
||||
{
|
||||
if (mIns[j].mMode == ASMIM_ABSOLUTE_Y)
|
||||
{
|
||||
assert(HasAsmInstructionMode(mIns[j].mType, ASMIM_ABSOLUTE_X));
|
||||
mIns[j].mMode = ASMIM_ABSOLUTE_X;
|
||||
n = j;
|
||||
changed = true;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
|
||||
while (k < n)
|
||||
{
|
||||
mIns[k].mLive |= LIVE_CPU_REG_X;
|
||||
k++;
|
||||
}
|
||||
}
|
||||
else if (mIns[i].mType == ASMIT_TYA && mIns[i + 1].mType == ASMIT_TAX)
|
||||
{
|
||||
int j = i + 2;
|
||||
int j = i + 2, k = i, n = i;
|
||||
|
||||
while (j < mIns.Size() && !mIns[j].ChangesXReg() && !mIns[j].ChangesYReg())
|
||||
{
|
||||
if (mIns[j].mMode == ASMIM_ABSOLUTE_X)
|
||||
{
|
||||
assert(HasAsmInstructionMode(mIns[j].mType, ASMIM_ABSOLUTE_Y));
|
||||
mIns[j].mMode = ASMIM_ABSOLUTE_Y;
|
||||
n = j;
|
||||
changed = true;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
|
||||
while (k < n)
|
||||
{
|
||||
mIns[k].mLive |= LIVE_CPU_REG_Y;
|
||||
k++;
|
||||
}
|
||||
}
|
||||
}
|
||||
CheckLive();
|
||||
|
@ -20313,6 +20504,46 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
|
|||
mIns[i + 2].mAddress += 2;
|
||||
progress = true;
|
||||
}
|
||||
else if (
|
||||
mIns[i + 0].mType == ASMIT_CLC &&
|
||||
mIns[i + 1].mType == ASMIT_ADC && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 1 &&
|
||||
mIns[i + 2].mType == ASMIT_TAY && !(mIns[i + 2].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C)))
|
||||
{
|
||||
mIns[i + 0].mType = ASMIT_TAY; mIns[i + 0].mMode = ASMIM_IMPLIED; mIns[i + 0].mLive |= LIVE_CPU_REG_Y;
|
||||
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||
mIns[i + 2].mType = ASMIT_INY; mIns[i + 2].mMode = ASMIM_IMPLIED;
|
||||
progress = true;
|
||||
}
|
||||
else if (
|
||||
mIns[i + 0].mType == ASMIT_SEC &&
|
||||
mIns[i + 1].mType == ASMIT_SBC && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 1 &&
|
||||
mIns[i + 2].mType == ASMIT_TAY && !(mIns[i + 2].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C)))
|
||||
{
|
||||
mIns[i + 0].mType = ASMIT_TAY; mIns[i + 0].mMode = ASMIM_IMPLIED; mIns[i + 0].mLive |= LIVE_CPU_REG_Y;
|
||||
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||
mIns[i + 2].mType = ASMIT_DEY; mIns[i + 2].mMode = ASMIM_IMPLIED;
|
||||
progress = true;
|
||||
}
|
||||
else if (
|
||||
mIns[i + 0].mType == ASMIT_CLC &&
|
||||
mIns[i + 1].mType == ASMIT_ADC && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 1 &&
|
||||
mIns[i + 2].mType == ASMIT_TAX && !(mIns[i + 2].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C)))
|
||||
{
|
||||
mIns[i + 0].mType = ASMIT_TAX; mIns[i + 0].mMode = ASMIM_IMPLIED; mIns[i + 0].mLive |= LIVE_CPU_REG_X;
|
||||
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||
mIns[i + 2].mType = ASMIT_INX; mIns[i + 2].mMode = ASMIM_IMPLIED;
|
||||
progress = true;
|
||||
}
|
||||
else if (
|
||||
mIns[i + 0].mType == ASMIT_SEC &&
|
||||
mIns[i + 1].mType == ASMIT_SBC && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 1 &&
|
||||
mIns[i + 2].mType == ASMIT_TAX && !(mIns[i + 2].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C)))
|
||||
{
|
||||
mIns[i + 0].mType = ASMIT_TAX; mIns[i + 0].mMode = ASMIM_IMPLIED; mIns[i + 0].mLive |= LIVE_CPU_REG_X;
|
||||
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||
mIns[i + 2].mType = ASMIT_DEX; mIns[i + 2].mMode = ASMIM_IMPLIED;
|
||||
progress = true;
|
||||
}
|
||||
|
||||
if (
|
||||
mIns[i + 0].mType == ASMIT_LDY && mIns[i + 0].mMode == ASMIM_IMMEDIATE && mIns[i + 0].mAddress <= 1 &&
|
||||
|
@ -21751,6 +21982,24 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
|
|||
}
|
||||
}
|
||||
|
||||
else if (sz >= 2 &&
|
||||
mIns[sz - 2].mType == ASMIT_LDA && mIns[sz - 2].mMode == ASMIM_IMMEDIATE && mIns[sz - 2].mAddress == 0 &&
|
||||
mIns[sz - 1].mType == ASMIT_SBC && mIns[sz - 1].mMode == ASMIM_IMMEDIATE && mIns[sz - 1].mAddress == 0 && !(mIns[sz - 1].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C)))
|
||||
{
|
||||
if (mBranch == ASMIT_BNE)
|
||||
{
|
||||
mBranch = ASMIT_BCC;
|
||||
mIns.SetSize(sz - 2);
|
||||
changed = true;
|
||||
}
|
||||
else if (mBranch == ASMIT_BEQ)
|
||||
{
|
||||
mBranch = ASMIT_BCS;
|
||||
mIns.SetSize(sz - 2);
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (sz >= 1 &&
|
||||
mIns[sz - 1].mType == ASMIT_AND && mIns[sz - 1].mMode == ASMIM_IMMEDIATE && mIns[sz - 1].mAddress == 0x80 && !(mIns[sz - 1].mLive & LIVE_CPU_REG_A) &&
|
||||
(mBranch == ASMIT_BEQ || mBranch == ASMIT_BNE))
|
||||
|
@ -21997,6 +22246,16 @@ void NativeCodeBasicBlock::BuildPlacement(GrowingArray<NativeCodeBasicBlock*>& p
|
|||
mFalseJump->BuildPlacement(placement);
|
||||
mTrueJump->BuildPlacement(placement);
|
||||
}
|
||||
else if (mTrueJump->mCode.Size() < 32 && (mTrueJump->mTrueJump && mTrueJump->mTrueJump->mPlaced) || (mTrueJump->mFalseJump && mTrueJump->mFalseJump->mPlaced))
|
||||
{
|
||||
mTrueJump->BuildPlacement(placement);
|
||||
mFalseJump->BuildPlacement(placement);
|
||||
}
|
||||
else if (mFalseJump->mCode.Size() < 32 && (mFalseJump->mTrueJump && mFalseJump->mTrueJump->mPlaced) || (mFalseJump->mFalseJump && mFalseJump->mFalseJump->mPlaced))
|
||||
{
|
||||
mFalseJump->BuildPlacement(placement);
|
||||
mTrueJump->BuildPlacement(placement);
|
||||
}
|
||||
else if (
|
||||
!mTrueJump->mFalseJump && mTrueJump->mTrueJump && mTrueJump->mTrueJump->mPlaced && mTrueJump->mCode.Size() < 120 ||
|
||||
mTrueJump->mFalseJump && mTrueJump->mTrueJump && mTrueJump->mFalseJump->mPlaced && mTrueJump->mTrueJump->mPlaced && mTrueJump->mCode.Size() < 120)
|
||||
|
@ -22116,6 +22375,8 @@ void NativeCodeBasicBlock::CopyCode(NativeCodeProcedure * proc, uint8* target)
|
|||
{
|
||||
if (mTrueJump->mPlace != mPlace + 1)
|
||||
end += PutJump(proc, mTrueJump, mTrueJump->mOffset - end);
|
||||
else if (mTrueJump->mIns.Size() == 1 && mTrueJump->mIns[0].mType == ASMIT_RTS && mIns.Size() > 0 && mIns.Last().IsSimpleJSR())
|
||||
this->mCode[this->mCode.Size() - 3] = 0x4c;
|
||||
}
|
||||
|
||||
assert(end == next);
|
||||
|
@ -22700,6 +22961,12 @@ void NativeCodeProcedure::Optimize(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
if (step == 4)
|
||||
{
|
||||
ResetVisited();
|
||||
mEntryBlock->Split16BitLoopCount(this);
|
||||
}
|
||||
|
||||
ResetVisited();
|
||||
ResetEntryBlocks();
|
||||
mEntryBlock->CountEntries(nullptr);
|
||||
|
@ -23209,7 +23476,7 @@ void NativeCodeProcedure::CompileInterBlock(InterCodeProcedure* iproc, InterCode
|
|||
iblock->mInstructions[i + 1]->mCode == IC_BINARY_OPERATOR && iblock->mInstructions[i + 1]->mOperator == IA_SAR &&
|
||||
iblock->mInstructions[i + 1]->mSrc[1].mTemp == ins->mDst.mTemp && iblock->mInstructions[i + 1]->mSrc[1].mFinal &&
|
||||
iblock->mInstructions[i + 1]->mSrc[0].mTemp < 0 && iblock->mInstructions[i + 1]->mSrc[0].mIntConst <= 4 &&
|
||||
ins->mSrc[0].mIntConst == (1 << (iblock->mInstructions[i + 1]->mSrc[0].mIntConst - 1)))
|
||||
ins->mSrc[0].mIntConst == (1LL << (iblock->mInstructions[i + 1]->mSrc[0].mIntConst - 1)))
|
||||
{
|
||||
block->AddAsrSignedByte(iproc, ins, iblock->mInstructions[i + 1]);
|
||||
i ++;
|
||||
|
|
|
@ -111,13 +111,16 @@ public:
|
|||
bool UsesZeroPage(int address) const;
|
||||
bool ReferencesZeroPage(int address) const;
|
||||
|
||||
|
||||
bool ChangesGlobalMemory(void) const;
|
||||
bool UsesMemoryOf(const NativeCodeInstruction& ins) const;
|
||||
bool SameEffectiveAddress(const NativeCodeInstruction& ins) const;
|
||||
bool MayBeChangedOnAddress(const NativeCodeInstruction& ins) const;
|
||||
bool MayBeSameAddress(const NativeCodeInstruction& ins, bool sameXY = false) const;
|
||||
bool IsSame(const NativeCodeInstruction& ins) const;
|
||||
bool IsCommutative(void) const;
|
||||
bool IsShift(void) const;
|
||||
bool IsSimpleJSR(void) const;
|
||||
|
||||
bool ReplaceYRegWithXReg(void);
|
||||
bool ReplaceXRegWithYReg(void);
|
||||
|
@ -304,6 +307,7 @@ public:
|
|||
|
||||
NativeCodeBasicBlock * SplitMatchingTails(NativeCodeProcedure* proc);
|
||||
|
||||
NativeCodeBasicBlock* AddDominatorBlock(NativeCodeProcedure* proc, NativeCodeBasicBlock* pblock);
|
||||
bool JoinTailCodeSequences(NativeCodeProcedure* proc, bool loops);
|
||||
bool SameTail(const NativeCodeInstruction& ins) const;
|
||||
|
||||
|
@ -325,6 +329,7 @@ public:
|
|||
bool ReduceLocalXPressure(void);
|
||||
|
||||
bool ExpandADCToBranch(NativeCodeProcedure* proc);
|
||||
bool Split16BitLoopCount(NativeCodeProcedure* proc);
|
||||
|
||||
bool AlternateXYUsage(void);
|
||||
bool ForwardAbsoluteLoadStores(void);
|
||||
|
|
|
@ -73,7 +73,7 @@ int main2(int argc, const char** argv)
|
|||
|
||||
#else
|
||||
strcpy(strProductName, "oscar64");
|
||||
strcpy(strProductVersion, "1.6.123");
|
||||
strcpy(strProductVersion, "1.6.124");
|
||||
|
||||
#ifdef __APPLE__
|
||||
uint32_t length = sizeof(basePath);
|
||||
|
|
|
@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
|
|||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 1,6,123,0
|
||||
PRODUCTVERSION 1,6,123,0
|
||||
FILEVERSION 1,6,124,0
|
||||
PRODUCTVERSION 1,6,124,0
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
|
@ -43,12 +43,12 @@ BEGIN
|
|||
BEGIN
|
||||
VALUE "CompanyName", "oscar64"
|
||||
VALUE "FileDescription", "oscar64 compiler"
|
||||
VALUE "FileVersion", "1.6.123.0"
|
||||
VALUE "FileVersion", "1.6.124.0"
|
||||
VALUE "InternalName", "oscar64.exe"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2021"
|
||||
VALUE "OriginalFilename", "oscar64.exe"
|
||||
VALUE "ProductName", "oscar64"
|
||||
VALUE "ProductVersion", "1.6.123.0"
|
||||
VALUE "ProductVersion", "1.6.124.0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
|
|
@ -34,6 +34,12 @@
|
|||
}
|
||||
"Entry"
|
||||
{
|
||||
"MsmKey" = "8:_03D7013B0D39A89CEA9D267005ADCE39"
|
||||
"OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6"
|
||||
"MsmSig" = "8:_UNDEFINED"
|
||||
}
|
||||
"Entry"
|
||||
{
|
||||
"MsmKey" = "8:_04ABABC55200450383686DD782DD1548"
|
||||
"OwnerKey" = "8:_UNDEFINED"
|
||||
"MsmSig" = "8:_UNDEFINED"
|
||||
|
@ -160,6 +166,12 @@
|
|||
}
|
||||
"Entry"
|
||||
{
|
||||
"MsmKey" = "8:_326B44043E3720E0A341FB5627DA8873"
|
||||
"OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6"
|
||||
"MsmSig" = "8:_UNDEFINED"
|
||||
}
|
||||
"Entry"
|
||||
{
|
||||
"MsmKey" = "8:_3277DE1463544F67B7E7390175F8A9CF"
|
||||
"OwnerKey" = "8:_UNDEFINED"
|
||||
"MsmSig" = "8:_UNDEFINED"
|
||||
|
@ -172,6 +184,12 @@
|
|||
}
|
||||
"Entry"
|
||||
{
|
||||
"MsmKey" = "8:_36B4A1247BFCE001E1BAE7560E9CFEEA"
|
||||
"OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6"
|
||||
"MsmSig" = "8:_UNDEFINED"
|
||||
}
|
||||
"Entry"
|
||||
{
|
||||
"MsmKey" = "8:_379EE3C17FEC4C5EA79D07668CD05FC4"
|
||||
"OwnerKey" = "8:_UNDEFINED"
|
||||
"MsmSig" = "8:_UNDEFINED"
|
||||
|
@ -244,6 +262,12 @@
|
|||
}
|
||||
"Entry"
|
||||
{
|
||||
"MsmKey" = "8:_458189403F0009BC49371204B74F3BD3"
|
||||
"OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6"
|
||||
"MsmSig" = "8:_UNDEFINED"
|
||||
}
|
||||
"Entry"
|
||||
{
|
||||
"MsmKey" = "8:_47A877D439EE429BAB64C52FEF69EDA4"
|
||||
"OwnerKey" = "8:_UNDEFINED"
|
||||
"MsmSig" = "8:_UNDEFINED"
|
||||
|
@ -370,6 +394,12 @@
|
|||
}
|
||||
"Entry"
|
||||
{
|
||||
"MsmKey" = "8:_749A2BA18335F50EB53CCE7029861FBC"
|
||||
"OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6"
|
||||
"MsmSig" = "8:_UNDEFINED"
|
||||
}
|
||||
"Entry"
|
||||
{
|
||||
"MsmKey" = "8:_749F54DFBD4D404DA9C2E2D5BA7CDDBF"
|
||||
"OwnerKey" = "8:_UNDEFINED"
|
||||
"MsmSig" = "8:_UNDEFINED"
|
||||
|
@ -430,6 +460,12 @@
|
|||
}
|
||||
"Entry"
|
||||
{
|
||||
"MsmKey" = "8:_8667075410229C38BF63AC1CC776055E"
|
||||
"OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6"
|
||||
"MsmSig" = "8:_UNDEFINED"
|
||||
}
|
||||
"Entry"
|
||||
{
|
||||
"MsmKey" = "8:_8827B6B07A1C4B32B08DF784E090381D"
|
||||
"OwnerKey" = "8:_UNDEFINED"
|
||||
"MsmSig" = "8:_UNDEFINED"
|
||||
|
@ -754,6 +790,12 @@
|
|||
}
|
||||
"Entry"
|
||||
{
|
||||
"MsmKey" = "8:_DD5A4DD822437085CD584319732F2D4D"
|
||||
"OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6"
|
||||
"MsmSig" = "8:_UNDEFINED"
|
||||
}
|
||||
"Entry"
|
||||
{
|
||||
"MsmKey" = "8:_DEADBEA270134B77800770802B21859C"
|
||||
"OwnerKey" = "8:_UNDEFINED"
|
||||
"MsmSig" = "8:_UNDEFINED"
|
||||
|
@ -814,6 +856,12 @@
|
|||
}
|
||||
"Entry"
|
||||
{
|
||||
"MsmKey" = "8:_EA3C0BCB01F2639DFA2E37EC8436E5F6"
|
||||
"OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6"
|
||||
"MsmSig" = "8:_UNDEFINED"
|
||||
}
|
||||
"Entry"
|
||||
{
|
||||
"MsmKey" = "8:_ED872D39D58443D590B7C80604BC0FF4"
|
||||
"OwnerKey" = "8:_UNDEFINED"
|
||||
"MsmSig" = "8:_UNDEFINED"
|
||||
|
@ -844,6 +892,12 @@
|
|||
}
|
||||
"Entry"
|
||||
{
|
||||
"MsmKey" = "8:_F20F5618C7576D758C01D89C87469AF8"
|
||||
"OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6"
|
||||
"MsmSig" = "8:_UNDEFINED"
|
||||
}
|
||||
"Entry"
|
||||
{
|
||||
"MsmKey" = "8:_F35970F9D8FA46B09F36D7E9DE5532CA"
|
||||
"OwnerKey" = "8:_UNDEFINED"
|
||||
"MsmSig" = "8:_UNDEFINED"
|
||||
|
@ -1025,6 +1079,26 @@
|
|||
"IsDependency" = "11:FALSE"
|
||||
"IsolateTo" = "8:"
|
||||
}
|
||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_03D7013B0D39A89CEA9D267005ADCE39"
|
||||
{
|
||||
"SourcePath" = "8:VCRUNTIME140.dll"
|
||||
"TargetName" = "8:VCRUNTIME140.dll"
|
||||
"Tag" = "8:"
|
||||
"Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4"
|
||||
"Condition" = "8:"
|
||||
"Transitive" = "11:FALSE"
|
||||
"Vital" = "11:TRUE"
|
||||
"ReadOnly" = "11:FALSE"
|
||||
"Hidden" = "11:FALSE"
|
||||
"System" = "11:FALSE"
|
||||
"Permanent" = "11:FALSE"
|
||||
"SharedLegacy" = "11:FALSE"
|
||||
"PackageAs" = "3:1"
|
||||
"Register" = "3:1"
|
||||
"Exclude" = "11:FALSE"
|
||||
"IsDependency" = "11:TRUE"
|
||||
"IsolateTo" = "8:"
|
||||
}
|
||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_04ABABC55200450383686DD782DD1548"
|
||||
{
|
||||
"SourcePath" = "8:..\\samples\\games\\lander.c"
|
||||
|
@ -1445,6 +1519,26 @@
|
|||
"IsDependency" = "11:FALSE"
|
||||
"IsolateTo" = "8:"
|
||||
}
|
||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_326B44043E3720E0A341FB5627DA8873"
|
||||
{
|
||||
"SourcePath" = "8:api-ms-win-crt-stdio-l1-1-0.dll"
|
||||
"TargetName" = "8:api-ms-win-crt-stdio-l1-1-0.dll"
|
||||
"Tag" = "8:"
|
||||
"Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4"
|
||||
"Condition" = "8:"
|
||||
"Transitive" = "11:FALSE"
|
||||
"Vital" = "11:TRUE"
|
||||
"ReadOnly" = "11:FALSE"
|
||||
"Hidden" = "11:FALSE"
|
||||
"System" = "11:FALSE"
|
||||
"Permanent" = "11:FALSE"
|
||||
"SharedLegacy" = "11:FALSE"
|
||||
"PackageAs" = "3:1"
|
||||
"Register" = "3:1"
|
||||
"Exclude" = "11:FALSE"
|
||||
"IsDependency" = "11:TRUE"
|
||||
"IsolateTo" = "8:"
|
||||
}
|
||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3277DE1463544F67B7E7390175F8A9CF"
|
||||
{
|
||||
"SourcePath" = "8:..\\samples\\rasterirq\\autocrawler.c"
|
||||
|
@ -1485,6 +1579,26 @@
|
|||
"IsDependency" = "11:FALSE"
|
||||
"IsolateTo" = "8:"
|
||||
}
|
||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_36B4A1247BFCE001E1BAE7560E9CFEEA"
|
||||
{
|
||||
"SourcePath" = "8:api-ms-win-crt-math-l1-1-0.dll"
|
||||
"TargetName" = "8:api-ms-win-crt-math-l1-1-0.dll"
|
||||
"Tag" = "8:"
|
||||
"Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4"
|
||||
"Condition" = "8:"
|
||||
"Transitive" = "11:FALSE"
|
||||
"Vital" = "11:TRUE"
|
||||
"ReadOnly" = "11:FALSE"
|
||||
"Hidden" = "11:FALSE"
|
||||
"System" = "11:FALSE"
|
||||
"Permanent" = "11:FALSE"
|
||||
"SharedLegacy" = "11:FALSE"
|
||||
"PackageAs" = "3:1"
|
||||
"Register" = "3:1"
|
||||
"Exclude" = "11:FALSE"
|
||||
"IsDependency" = "11:TRUE"
|
||||
"IsolateTo" = "8:"
|
||||
}
|
||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_379EE3C17FEC4C5EA79D07668CD05FC4"
|
||||
{
|
||||
"SourcePath" = "8:..\\samples\\memmap\\easyflash.c"
|
||||
|
@ -1725,6 +1839,26 @@
|
|||
"IsDependency" = "11:FALSE"
|
||||
"IsolateTo" = "8:"
|
||||
}
|
||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_458189403F0009BC49371204B74F3BD3"
|
||||
{
|
||||
"SourcePath" = "8:api-ms-win-crt-string-l1-1-0.dll"
|
||||
"TargetName" = "8:api-ms-win-crt-string-l1-1-0.dll"
|
||||
"Tag" = "8:"
|
||||
"Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4"
|
||||
"Condition" = "8:"
|
||||
"Transitive" = "11:FALSE"
|
||||
"Vital" = "11:TRUE"
|
||||
"ReadOnly" = "11:FALSE"
|
||||
"Hidden" = "11:FALSE"
|
||||
"System" = "11:FALSE"
|
||||
"Permanent" = "11:FALSE"
|
||||
"SharedLegacy" = "11:FALSE"
|
||||
"PackageAs" = "3:1"
|
||||
"Register" = "3:1"
|
||||
"Exclude" = "11:FALSE"
|
||||
"IsDependency" = "11:TRUE"
|
||||
"IsolateTo" = "8:"
|
||||
}
|
||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_47A877D439EE429BAB64C52FEF69EDA4"
|
||||
{
|
||||
"SourcePath" = "8:..\\samples\\memmap\\largemem.c"
|
||||
|
@ -2145,6 +2279,26 @@
|
|||
"IsDependency" = "11:FALSE"
|
||||
"IsolateTo" = "8:"
|
||||
}
|
||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_749A2BA18335F50EB53CCE7029861FBC"
|
||||
{
|
||||
"SourcePath" = "8:api-ms-win-crt-runtime-l1-1-0.dll"
|
||||
"TargetName" = "8:api-ms-win-crt-runtime-l1-1-0.dll"
|
||||
"Tag" = "8:"
|
||||
"Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4"
|
||||
"Condition" = "8:"
|
||||
"Transitive" = "11:FALSE"
|
||||
"Vital" = "11:TRUE"
|
||||
"ReadOnly" = "11:FALSE"
|
||||
"Hidden" = "11:FALSE"
|
||||
"System" = "11:FALSE"
|
||||
"Permanent" = "11:FALSE"
|
||||
"SharedLegacy" = "11:FALSE"
|
||||
"PackageAs" = "3:1"
|
||||
"Register" = "3:1"
|
||||
"Exclude" = "11:FALSE"
|
||||
"IsDependency" = "11:TRUE"
|
||||
"IsolateTo" = "8:"
|
||||
}
|
||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_749F54DFBD4D404DA9C2E2D5BA7CDDBF"
|
||||
{
|
||||
"SourcePath" = "8:..\\samples\\resources\\breakoutchars.bin"
|
||||
|
@ -2345,6 +2499,26 @@
|
|||
"IsDependency" = "11:FALSE"
|
||||
"IsolateTo" = "8:"
|
||||
}
|
||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_8667075410229C38BF63AC1CC776055E"
|
||||
{
|
||||
"SourcePath" = "8:api-ms-win-crt-filesystem-l1-1-0.dll"
|
||||
"TargetName" = "8:api-ms-win-crt-filesystem-l1-1-0.dll"
|
||||
"Tag" = "8:"
|
||||
"Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4"
|
||||
"Condition" = "8:"
|
||||
"Transitive" = "11:FALSE"
|
||||
"Vital" = "11:TRUE"
|
||||
"ReadOnly" = "11:FALSE"
|
||||
"Hidden" = "11:FALSE"
|
||||
"System" = "11:FALSE"
|
||||
"Permanent" = "11:FALSE"
|
||||
"SharedLegacy" = "11:FALSE"
|
||||
"PackageAs" = "3:1"
|
||||
"Register" = "3:1"
|
||||
"Exclude" = "11:FALSE"
|
||||
"IsDependency" = "11:TRUE"
|
||||
"IsolateTo" = "8:"
|
||||
}
|
||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_8827B6B07A1C4B32B08DF784E090381D"
|
||||
{
|
||||
"SourcePath" = "8:..\\samples\\memmap\\tsr.c"
|
||||
|
@ -3425,6 +3599,26 @@
|
|||
"IsDependency" = "11:FALSE"
|
||||
"IsolateTo" = "8:"
|
||||
}
|
||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_DD5A4DD822437085CD584319732F2D4D"
|
||||
{
|
||||
"SourcePath" = "8:api-ms-win-crt-heap-l1-1-0.dll"
|
||||
"TargetName" = "8:api-ms-win-crt-heap-l1-1-0.dll"
|
||||
"Tag" = "8:"
|
||||
"Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4"
|
||||
"Condition" = "8:"
|
||||
"Transitive" = "11:FALSE"
|
||||
"Vital" = "11:TRUE"
|
||||
"ReadOnly" = "11:FALSE"
|
||||
"Hidden" = "11:FALSE"
|
||||
"System" = "11:FALSE"
|
||||
"Permanent" = "11:FALSE"
|
||||
"SharedLegacy" = "11:FALSE"
|
||||
"PackageAs" = "3:1"
|
||||
"Register" = "3:1"
|
||||
"Exclude" = "11:FALSE"
|
||||
"IsDependency" = "11:TRUE"
|
||||
"IsolateTo" = "8:"
|
||||
}
|
||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_DEADBEA270134B77800770802B21859C"
|
||||
{
|
||||
"SourcePath" = "8:..\\samples\\games\\connectfour.c"
|
||||
|
@ -3625,6 +3819,26 @@
|
|||
"IsDependency" = "11:FALSE"
|
||||
"IsolateTo" = "8:"
|
||||
}
|
||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_EA3C0BCB01F2639DFA2E37EC8436E5F6"
|
||||
{
|
||||
"SourcePath" = "8:VERSION.dll"
|
||||
"TargetName" = "8:VERSION.dll"
|
||||
"Tag" = "8:"
|
||||
"Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4"
|
||||
"Condition" = "8:"
|
||||
"Transitive" = "11:FALSE"
|
||||
"Vital" = "11:TRUE"
|
||||
"ReadOnly" = "11:FALSE"
|
||||
"Hidden" = "11:FALSE"
|
||||
"System" = "11:FALSE"
|
||||
"Permanent" = "11:FALSE"
|
||||
"SharedLegacy" = "11:FALSE"
|
||||
"PackageAs" = "3:1"
|
||||
"Register" = "3:1"
|
||||
"Exclude" = "11:FALSE"
|
||||
"IsDependency" = "11:TRUE"
|
||||
"IsolateTo" = "8:"
|
||||
}
|
||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_ED872D39D58443D590B7C80604BC0FF4"
|
||||
{
|
||||
"SourcePath" = "8:..\\samples\\kernalio\\fileread.c"
|
||||
|
@ -3725,6 +3939,26 @@
|
|||
"IsDependency" = "11:FALSE"
|
||||
"IsolateTo" = "8:"
|
||||
}
|
||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_F20F5618C7576D758C01D89C87469AF8"
|
||||
{
|
||||
"SourcePath" = "8:api-ms-win-crt-locale-l1-1-0.dll"
|
||||
"TargetName" = "8:api-ms-win-crt-locale-l1-1-0.dll"
|
||||
"Tag" = "8:"
|
||||
"Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4"
|
||||
"Condition" = "8:"
|
||||
"Transitive" = "11:FALSE"
|
||||
"Vital" = "11:TRUE"
|
||||
"ReadOnly" = "11:FALSE"
|
||||
"Hidden" = "11:FALSE"
|
||||
"System" = "11:FALSE"
|
||||
"Permanent" = "11:FALSE"
|
||||
"SharedLegacy" = "11:FALSE"
|
||||
"PackageAs" = "3:1"
|
||||
"Register" = "3:1"
|
||||
"Exclude" = "11:FALSE"
|
||||
"IsDependency" = "11:TRUE"
|
||||
"IsolateTo" = "8:"
|
||||
}
|
||||
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_F35970F9D8FA46B09F36D7E9DE5532CA"
|
||||
{
|
||||
"SourcePath" = "8:..\\include\\c64\\charwin.h"
|
||||
|
@ -4101,15 +4335,15 @@
|
|||
{
|
||||
"Name" = "8:Microsoft Visual Studio"
|
||||
"ProductName" = "8:oscar64"
|
||||
"ProductCode" = "8:{F66E2274-2B16-49B2-950F-83A3DC2EEA9D}"
|
||||
"PackageCode" = "8:{4F43842C-6F90-403A-8CE1-352F775F975F}"
|
||||
"ProductCode" = "8:{F5C14785-E716-4D8A-8390-DBB8B4DEEA8D}"
|
||||
"PackageCode" = "8:{86E78AF0-FBD2-4C41-8643-0068DA813076}"
|
||||
"UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}"
|
||||
"AspNetVersion" = "8:2.0.50727.0"
|
||||
"RestartWWWService" = "11:FALSE"
|
||||
"RemovePreviousVersions" = "11:TRUE"
|
||||
"DetectNewerInstalledVersion" = "11:TRUE"
|
||||
"InstallAllUsers" = "11:FALSE"
|
||||
"ProductVersion" = "8:1.6.123"
|
||||
"ProductVersion" = "8:1.6.124"
|
||||
"Manufacturer" = "8:oscar64"
|
||||
"ARPHELPTELEPHONE" = "8:"
|
||||
"ARPHELPLINK" = "8:"
|
||||
|
|
Loading…
Reference in New Issue