Optimize global variable usage
This commit is contained in:
parent
c72ca3547b
commit
de920f2418
|
@ -281,19 +281,20 @@ int krnio_gets(char fnum, char * data, int num)
|
||||||
|
|
||||||
if (krnio_chkin(fnum))
|
if (krnio_chkin(fnum))
|
||||||
{
|
{
|
||||||
|
krnioerr err;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int ch;
|
int ch;
|
||||||
while (i + 1 < num)
|
while (i + 1 < num)
|
||||||
{
|
{
|
||||||
ch = krnio_chrin();
|
ch = krnio_chrin();
|
||||||
krnioerr err = krnio_status();
|
err = krnio_status();
|
||||||
krnio_pstatus[fnum] = err;
|
|
||||||
if (err && err != KRNIO_EOF)
|
if (err && err != KRNIO_EOF)
|
||||||
break;
|
break;
|
||||||
data[i++] = (char)ch;
|
data[i++] = (char)ch;
|
||||||
if (ch == 13 || ch == 10 || err)
|
if (ch == 13 || ch == 10 || err)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
krnio_pstatus[fnum] = err;
|
||||||
data[i] = 0;
|
data[i] = 0;
|
||||||
krnio_clrchn();
|
krnio_clrchn();
|
||||||
return i;
|
return i;
|
||||||
|
|
|
@ -4098,7 +4098,7 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(void)
|
||||||
if (mInstructions[sz - 2]->mSrc[0].mTemp < 0)
|
if (mInstructions[sz - 2]->mSrc[0].mTemp < 0)
|
||||||
{
|
{
|
||||||
int t = mInstructions[sz - 2]->mSrc[1].mTemp;
|
int t = mInstructions[sz - 2]->mSrc[1].mTemp;
|
||||||
if (mTrueValueRange[t].mMinState == IntegerValueRange::S_BOUND && mTrueValueRange[t].mMinValue >= 0)
|
// if (mTrueValueRange[t].mMinState == IntegerValueRange::S_BOUND && mTrueValueRange[t].mMinValue >= 0)
|
||||||
{
|
{
|
||||||
mTrueValueRange[t].LimitMin(mInstructions[sz - 2]->mSrc[0].mIntConst);
|
mTrueValueRange[t].LimitMin(mInstructions[sz - 2]->mSrc[0].mIntConst);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4783,6 +4783,30 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc
|
||||||
{
|
{
|
||||||
mul &= 0xffff;
|
mul &= 0xffff;
|
||||||
|
|
||||||
|
int lshift = 0, lmul = mul;
|
||||||
|
while (!(lmul & 1))
|
||||||
|
{
|
||||||
|
lmul >>= 1;
|
||||||
|
lshift++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lmul == 1 && !sins && ins->mSrc[index].mTemp == ins->mDst.mTemp)
|
||||||
|
{
|
||||||
|
// shift in place
|
||||||
|
|
||||||
|
int dreg = BC_REG_TMP + proc->mTempOffset[ins->mSrc[index].mTemp];
|
||||||
|
|
||||||
|
if (ins->mDst.IsUByte())
|
||||||
|
{
|
||||||
|
ShiftRegisterLeftByte(proc, dreg, lshift);
|
||||||
|
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0));
|
||||||
|
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 1));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ShiftRegisterLeft(proc, dreg, lshift);
|
||||||
|
return dreg;
|
||||||
|
}
|
||||||
|
|
||||||
if (sins)
|
if (sins)
|
||||||
LoadValueToReg(proc, sins, BC_REG_ACCU, nullptr, nullptr);
|
LoadValueToReg(proc, sins, BC_REG_ACCU, nullptr, nullptr);
|
||||||
else
|
else
|
||||||
|
@ -4793,13 +4817,6 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1));
|
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
int lshift = 0, lmul = mul;
|
|
||||||
while (!(lmul & 1))
|
|
||||||
{
|
|
||||||
lmul >>= 1;
|
|
||||||
lshift++;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (lmul)
|
switch (lmul)
|
||||||
{
|
{
|
||||||
#if 1
|
#if 1
|
||||||
|
@ -11465,6 +11482,63 @@ void NativeCodeBasicBlock::BlockSizeReduction(void)
|
||||||
j += 2;
|
j += 2;
|
||||||
i += 3;
|
i += 3;
|
||||||
}
|
}
|
||||||
|
else if (i + 2 < mIns.Size() &&
|
||||||
|
mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_ABSOLUTE &&
|
||||||
|
mIns[i + 1].mType == ASMIT_ADC && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0 &&
|
||||||
|
mIns[i + 2].mType == ASMIT_STA && mIns[i + 2].mMode == ASMIM_ABSOLUTE && mIns[i + 2].SameEffectiveAddress(mIns[i + 0]) &&
|
||||||
|
!(mIns[i + 2].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C | LIVE_CPU_REG_Z)))
|
||||||
|
{
|
||||||
|
mIns[j + 0].mType = ASMIT_BCC; mIns[j + 0].mMode = ASMIM_RELATIVE; mIns[j + 0].mAddress = 3;
|
||||||
|
mIns[j + 1] = mIns[i + 2];
|
||||||
|
mIns[j + 1].mType = ASMIT_INC;
|
||||||
|
j += 2;
|
||||||
|
i += 3;
|
||||||
|
}
|
||||||
|
else if (i + 2 < mIns.Size() &&
|
||||||
|
mIns[i + 0].mType == ASMIT_TXA &&
|
||||||
|
mIns[i + 1].mType == ASMIT_ADC && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0 &&
|
||||||
|
mIns[i + 2].mType == ASMIT_TAX &&
|
||||||
|
!(mIns[i + 2].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C | LIVE_CPU_REG_Z)))
|
||||||
|
{
|
||||||
|
mIns[j + 0].mType = ASMIT_BCC; mIns[j + 0].mMode = ASMIM_RELATIVE; mIns[j + 0].mAddress = 1;
|
||||||
|
mIns[j + 1].mType = ASMIT_INX; mIns[j + 1].mMode = ASMIM_IMPLIED;
|
||||||
|
j += 2;
|
||||||
|
i += 3;
|
||||||
|
}
|
||||||
|
else if (i + 2 < mIns.Size() &&
|
||||||
|
mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE &&
|
||||||
|
mIns[i + 1].mType == ASMIT_SBC && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0 &&
|
||||||
|
mIns[i + 2].mType == ASMIT_STA && mIns[i + 2].mMode == ASMIM_ZERO_PAGE && mIns[i + 2].mAddress == mIns[i + 0].mAddress &&
|
||||||
|
!(mIns[i + 2].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C | LIVE_CPU_REG_Z)))
|
||||||
|
{
|
||||||
|
mIns[j + 0].mType = ASMIT_BCS; mIns[j + 0].mMode = ASMIM_RELATIVE; mIns[j + 0].mAddress = 2;
|
||||||
|
mIns[j + 1].mType = ASMIT_DEC; mIns[j + 1].mMode = ASMIM_ZERO_PAGE; mIns[j + 1].mAddress = mIns[i + 2].mAddress;
|
||||||
|
j += 2;
|
||||||
|
i += 3;
|
||||||
|
}
|
||||||
|
else if (i + 2 < mIns.Size() &&
|
||||||
|
mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_ABSOLUTE &&
|
||||||
|
mIns[i + 1].mType == ASMIT_SBC && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0 &&
|
||||||
|
mIns[i + 2].mType == ASMIT_STA && mIns[i + 2].mMode == ASMIM_ABSOLUTE && mIns[i + 2].SameEffectiveAddress(mIns[i + 0]) &&
|
||||||
|
!(mIns[i + 2].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C | LIVE_CPU_REG_Z)))
|
||||||
|
{
|
||||||
|
mIns[j + 0].mType = ASMIT_BCS; mIns[j + 0].mMode = ASMIM_RELATIVE; mIns[j + 0].mAddress = 3;
|
||||||
|
mIns[j + 1] = mIns[i + 2];
|
||||||
|
mIns[j + 1].mType = ASMIT_DEC;
|
||||||
|
j += 2;
|
||||||
|
i += 3;
|
||||||
|
}
|
||||||
|
else if (i + 2 < mIns.Size() &&
|
||||||
|
mIns[i + 0].mType == ASMIT_TXA &&
|
||||||
|
mIns[i + 1].mType == ASMIT_SBC && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0 &&
|
||||||
|
mIns[i + 2].mType == ASMIT_TAX &&
|
||||||
|
!(mIns[i + 2].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C | LIVE_CPU_REG_Z)))
|
||||||
|
{
|
||||||
|
mIns[j + 0].mType = ASMIT_BCS; mIns[j + 0].mMode = ASMIM_RELATIVE; mIns[j + 0].mAddress = 1;
|
||||||
|
mIns[j + 1].mType = ASMIT_DEX; mIns[j + 1].mMode = ASMIM_IMPLIED;
|
||||||
|
j += 2;
|
||||||
|
i += 3;
|
||||||
|
}
|
||||||
#if 1
|
#if 1
|
||||||
else if (i + 3 < mIns.Size() &&
|
else if (i + 3 < mIns.Size() &&
|
||||||
mIns[i + 0].mType == ASMIT_ASL && mIns[i + 0].mMode == ASMIM_IMPLIED &&
|
mIns[i + 0].mType == ASMIT_ASL && mIns[i + 0].mMode == ASMIM_IMPLIED &&
|
||||||
|
@ -12320,6 +12394,12 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
|
||||||
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||||
progress = true;
|
progress = true;
|
||||||
}
|
}
|
||||||
|
else if (mIns[i].mType == ASMIT_STA && mIns[i + 1].mType == ASMIT_LDA && mIns[i].SameEffectiveAddress(mIns[i + 1]) && !(mIns[i + 1].mFlags & NCIF_VOLATILE) && (mIns[i + 1].mLive & LIVE_CPU_REG_Z) == 0)
|
||||||
|
{
|
||||||
|
mIns[i + 1].mLive |= LIVE_CPU_REG_A;
|
||||||
|
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||||
|
progress = true;
|
||||||
|
}
|
||||||
else if (mIns[i].mType == ASMIT_AND && mIns[i + 1].mType == ASMIT_AND && mIns[i].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mMode == ASMIM_IMMEDIATE)
|
else if (mIns[i].mType == ASMIT_AND && mIns[i + 1].mType == ASMIT_AND && mIns[i].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mMode == ASMIM_IMMEDIATE)
|
||||||
{
|
{
|
||||||
mIns[i].mAddress &= mIns[i + 1].mAddress;
|
mIns[i].mAddress &= mIns[i + 1].mAddress;
|
||||||
|
@ -13222,6 +13302,36 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
|
||||||
mIns[i + 2].mMode = ASMIM_ABSOLUTE_X;
|
mIns[i + 2].mMode = ASMIM_ABSOLUTE_X;
|
||||||
progress = true;
|
progress = true;
|
||||||
}
|
}
|
||||||
|
else if (
|
||||||
|
mIns[i + 0].mType == ASMIT_LDA && (mIns[i + 0].mMode == ASMIM_ZERO_PAGE || mIns[i + 0].mMode == ASMIM_ABSOLUTE) &&
|
||||||
|
mIns[i + 1].mType == ASMIT_STA && (mIns[i + 1].mMode == ASMIM_ZERO_PAGE || mIns[i + 1].mMode == ASMIM_ABSOLUTE) &&
|
||||||
|
mIns[i + 2].mType == ASMIT_LDY && mIns[i + 2].SameEffectiveAddress(mIns[i + 0]) && !(mIns[i + 2].mLive & LIVE_CPU_REG_A))
|
||||||
|
{
|
||||||
|
mIns[i + 0].mType = ASMIT_LDY; mIns[i + 0].mLive |= LIVE_CPU_REG_Y;
|
||||||
|
mIns[i + 1].mType = ASMIT_STY; mIns[i + 1].mLive |= LIVE_CPU_REG_Y;
|
||||||
|
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
|
||||||
|
progress = true;
|
||||||
|
}
|
||||||
|
else if (
|
||||||
|
mIns[i + 0].mType == ASMIT_LDA && (mIns[i + 0].mMode == ASMIM_ZERO_PAGE || mIns[i + 0].mMode == ASMIM_ABSOLUTE) &&
|
||||||
|
mIns[i + 1].mType == ASMIT_STA && (mIns[i + 1].mMode == ASMIM_ZERO_PAGE || mIns[i + 1].mMode == ASMIM_ABSOLUTE) &&
|
||||||
|
mIns[i + 2].mType == ASMIT_LDX && mIns[i + 2].SameEffectiveAddress(mIns[i + 0]) && !(mIns[i + 2].mLive & LIVE_CPU_REG_A))
|
||||||
|
{
|
||||||
|
mIns[i + 0].mType = ASMIT_LDX; mIns[i + 0].mLive |= LIVE_CPU_REG_X;
|
||||||
|
mIns[i + 1].mType = ASMIT_STX; mIns[i + 1].mLive |= LIVE_CPU_REG_X;
|
||||||
|
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
|
||||||
|
progress = true;
|
||||||
|
}
|
||||||
|
else if (
|
||||||
|
mIns[i + 0].mType == ASMIT_INC && mIns[i + 0].mMode == ASMIM_ZERO_PAGE &&
|
||||||
|
mIns[i + 1].mType == ASMIT_LDA && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i + 0].mAddress == mIns[i + 1].mAddress && !(mIns[i + 1].mLive & LIVE_MEM) &&
|
||||||
|
mIns[i + 2].mType == ASMIT_STA && (mIns[i + 2].mMode == ASMIM_ZERO_PAGE || mIns[i + 2].mMode == ASMIM_ABSOLUTE) && !(mIns[i + 2].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Y)))
|
||||||
|
{
|
||||||
|
mIns[i + 0].mType = ASMIT_LDY; mIns[i + 0].mLive |= LIVE_CPU_REG_Y;
|
||||||
|
mIns[i + 1].mType = ASMIT_INY; mIns[i + 1].mMode = ASMIM_IMPLIED; mIns[i + 1].mLive |= LIVE_CPU_REG_Y;
|
||||||
|
mIns[i + 2].mType = ASMIT_STY;
|
||||||
|
progress = true;
|
||||||
|
}
|
||||||
#if 1
|
#if 1
|
||||||
if (
|
if (
|
||||||
mIns[i + 0].mType == ASMIT_LDY && mIns[i + 0].mMode == ASMIM_IMMEDIATE && mIns[i + 0].mAddress <= 1 &&
|
mIns[i + 0].mType == ASMIT_LDY && mIns[i + 0].mMode == ASMIM_IMMEDIATE && mIns[i + 0].mAddress <= 1 &&
|
||||||
|
|
Loading…
Reference in New Issue