Fix add cross move in native code optimizer
This commit is contained in:
parent
30b3ed610e
commit
df733d09a8
|
@ -585,3 +585,28 @@ int lmuldiv16sby8(int a, char b, char c)
|
||||||
else
|
else
|
||||||
return lmuldiv16by8(a, b, c);
|
return lmuldiv16by8(a, b, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned usqrt(unsigned n)
|
||||||
|
{
|
||||||
|
unsigned p, q, r, h;
|
||||||
|
|
||||||
|
p = 0;
|
||||||
|
r = n;
|
||||||
|
|
||||||
|
#assign q 0x4000
|
||||||
|
#repeat
|
||||||
|
{
|
||||||
|
h = p | q;
|
||||||
|
p >>= 1;
|
||||||
|
if (r >= h)
|
||||||
|
{
|
||||||
|
p |= q;
|
||||||
|
r -= h;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#assign q q >> 2
|
||||||
|
#until q == 0
|
||||||
|
#undef q
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
|
@ -48,6 +48,8 @@ inline int lmuldiv16sby8(int a, char b, char c);
|
||||||
|
|
||||||
__native unsigned lmuldiv8by8(char a, char b, char c);
|
__native unsigned lmuldiv8by8(char a, char b, char c);
|
||||||
|
|
||||||
|
__native unsigned usqrt(unsigned n);
|
||||||
|
|
||||||
#pragma compile("fixmath.c")
|
#pragma compile("fixmath.c")
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -25991,6 +25991,13 @@ bool NativeCodeBasicBlock::MoveLoadAddZPStoreUp(int at)
|
||||||
{
|
{
|
||||||
if (mIns[j].mType == ASMIT_STA && mIns[j].mMode == ASMIM_ZERO_PAGE && mIns[j].mAddress == mIns[at + 0].mAddress)
|
if (mIns[j].mType == ASMIT_STA && mIns[j].mMode == ASMIM_ZERO_PAGE && mIns[j].mAddress == mIns[at + 0].mAddress)
|
||||||
{
|
{
|
||||||
|
while (j < at && (mIns[j].mLive & LIVE_CPU_REG_A))
|
||||||
|
{
|
||||||
|
if (mIns[j].ChangesAccu())
|
||||||
|
return false;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
|
||||||
mIns[at + 1].mLive |= mIns[j].mLive;
|
mIns[at + 1].mLive |= mIns[j].mLive;
|
||||||
mIns[at + 2].mLive |= mIns[j].mLive;
|
mIns[at + 2].mLive |= mIns[j].mLive;
|
||||||
|
|
||||||
|
@ -31953,6 +31960,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
|
||||||
if (MoveCLCLoadAddZPStoreUp(i))
|
if (MoveCLCLoadAddZPStoreUp(i))
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
#if 1
|
||||||
else if (
|
else if (
|
||||||
mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE &&
|
mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE &&
|
||||||
mIns[i + 1].mType == ASMIT_ADC && mIns[i + 1].mMode == ASMIM_ZERO_PAGE &&
|
mIns[i + 1].mType == ASMIT_ADC && mIns[i + 1].mMode == ASMIM_ZERO_PAGE &&
|
||||||
|
@ -31961,6 +31969,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
|
||||||
if (MoveLoadAddZPStoreUp(i))
|
if (MoveLoadAddZPStoreUp(i))
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#if 1
|
#if 1
|
||||||
else if (
|
else if (
|
||||||
mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE &&
|
mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE &&
|
||||||
|
@ -39596,7 +39605,6 @@ void NativeCodeProcedure::Optimize(void)
|
||||||
else
|
else
|
||||||
cnt++;
|
cnt++;
|
||||||
|
|
||||||
|
|
||||||
} while (changed);
|
} while (changed);
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
|
|
Loading…
Reference in New Issue