Fix long offset pointer access in byte code

This commit is contained in:
drmortalwombat 2021-10-14 22:22:31 +02:00
parent 1a30d044c8
commit 35a4658f28
2 changed files with 205 additions and 60 deletions

View File

@ -188,7 +188,7 @@ bool ByteCodeInstruction::ChangesRegister(uint32 reg) const
return true; return true;
if (mCode >= BC_CONV_U16_F32 && mCode <= BC_CONV_F32_I16) if (mCode >= BC_CONV_U16_F32 && mCode <= BC_CONV_F32_I16)
return true; return true;
if (mCode >= BC_BINOP_SHLI_16 && mCode <= BC_BINOP_SHRI_U16) if (mCode >= BC_BINOP_SHLI_16 && mCode <= BC_BINOP_SHRI_I16)
return true; return true;
if (mCode >= BC_SET_EQ && mCode <= BC_SET_LE) if (mCode >= BC_SET_EQ && mCode <= BC_SET_LE)
return true; return true;
@ -901,10 +901,24 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
if (ins->mSrc[1].mMemory == IM_INDIRECT) if (ins->mSrc[1].mMemory == IM_INDIRECT)
{ {
ByteCodeInstruction lins(BC_ADDR_REG); int index = ins->mSrc[1].mIntConst;
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; if (index + 4 <= 256)
lins.mRegisterFinal = ins->mSrc[1].mFinal; {
mIns.Push(lins); ByteCodeInstruction lins(BC_ADDR_REG);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
lins.mRegisterFinal = ins->mSrc[1].mFinal;
mIns.Push(lins);
}
else
{
ByteCodeInstruction lins(BC_LEA_ABS_INDEX);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
lins.mRegisterFinal = ins->mSrc[1].mFinal;
lins.mValue = index;
index = 0;
mIns.Push(lins);
}
ByteCodeInstruction bins(BC_STORE_ADDR_32); ByteCodeInstruction bins(BC_STORE_ADDR_32);
bins.mRegister = BC_REG_ACCU; bins.mRegister = BC_REG_ACCU;
bins.mValue = ins->mSrc[1].mIntConst; bins.mValue = ins->mSrc[1].mIntConst;
@ -915,14 +929,28 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
{ {
if (ins->mSrc[1].mMemory == IM_INDIRECT) if (ins->mSrc[1].mMemory == IM_INDIRECT)
{ {
ByteCodeInstruction lins(BC_ADDR_REG); int index = ins->mSrc[1].mIntConst;
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; if (index + 4 <= 256)
lins.mRegisterFinal = ins->mSrc[1].mFinal; {
mIns.Push(lins); ByteCodeInstruction lins(BC_ADDR_REG);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
lins.mRegisterFinal = ins->mSrc[1].mFinal;
mIns.Push(lins);
}
else
{
ByteCodeInstruction lins(BC_LEA_ABS_INDEX);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
lins.mRegisterFinal = ins->mSrc[1].mFinal;
lins.mValue = index;
index = 0;
mIns.Push(lins);
}
ByteCodeInstruction bins(BC_STORE_ADDR_32); ByteCodeInstruction bins(BC_STORE_ADDR_32);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp];
bins.mRegisterFinal = ins->mSrc[0].mFinal; bins.mRegisterFinal = ins->mSrc[0].mFinal;
bins.mValue = ins->mSrc[1].mIntConst; bins.mValue = index;
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -1070,13 +1098,27 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
if (ins->mSrc[1].mMemory == IM_INDIRECT) if (ins->mSrc[1].mMemory == IM_INDIRECT)
{ {
ByteCodeInstruction lins(BC_ADDR_REG); int index = ins->mSrc[1].mIntConst;
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; if (index + 2 <= 256)
lins.mRegisterFinal = ins->mSrc[1].mFinal; {
mIns.Push(lins); ByteCodeInstruction lins(BC_ADDR_REG);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
lins.mRegisterFinal = ins->mSrc[1].mFinal;
mIns.Push(lins);
}
else
{
ByteCodeInstruction lins(BC_LEA_ABS_INDEX);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
lins.mRegisterFinal = ins->mSrc[1].mFinal;
lins.mValue = index;
index = 0;
mIns.Push(lins);
}
ByteCodeInstruction bins(BC_STORE_ADDR_16); ByteCodeInstruction bins(BC_STORE_ADDR_16);
bins.mRegister = BC_REG_ACCU; bins.mRegister = BC_REG_ACCU;
bins.mValue = ins->mSrc[1].mIntConst; bins.mValue = index;
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -1084,14 +1126,28 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
{ {
if (ins->mSrc[1].mMemory == IM_INDIRECT) if (ins->mSrc[1].mMemory == IM_INDIRECT)
{ {
ByteCodeInstruction lins(BC_ADDR_REG); int index = ins->mSrc[1].mIntConst;
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; if (index + 2 <= 256)
lins.mRegisterFinal = ins->mSrc[1].mFinal; {
mIns.Push(lins); ByteCodeInstruction lins(BC_ADDR_REG);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
lins.mRegisterFinal = ins->mSrc[1].mFinal;
mIns.Push(lins);
}
else
{
ByteCodeInstruction lins(BC_LEA_ABS_INDEX);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
lins.mRegisterFinal = ins->mSrc[1].mFinal;
lins.mValue = index;
index = 0;
mIns.Push(lins);
}
ByteCodeInstruction bins(BC_STORE_ADDR_16); ByteCodeInstruction bins(BC_STORE_ADDR_16);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp];
bins.mRegisterFinal = ins->mSrc[0].mFinal; bins.mRegisterFinal = ins->mSrc[0].mFinal;
bins.mValue = ins->mSrc[1].mIntConst; bins.mValue = index;
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -1508,29 +1564,43 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
if (ins->mSrc[1].mMemory == IM_INDIRECT) if (ins->mSrc[1].mMemory == IM_INDIRECT)
{ {
ByteCodeInstruction lins(BC_ADDR_REG); int index = ins->mSrc[1].mIntConst;
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; if (index + InterTypeSize[ins->mSrc[0].mType] <= 256)
lins.mRegisterFinal = ins->mSrc[1].mFinal; {
mIns.Push(lins); ByteCodeInstruction lins(BC_ADDR_REG);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
lins.mRegisterFinal = ins->mSrc[1].mFinal;
mIns.Push(lins);
}
else
{
ByteCodeInstruction lins(BC_LEA_ABS_INDEX);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
lins.mRegisterFinal = ins->mSrc[1].mFinal;
lins.mValue = index;
index = 0;
mIns.Push(lins);
}
if (InterTypeSize[ins->mSrc[0].mType] == 1) if (InterTypeSize[ins->mSrc[0].mType] == 1)
{ {
ByteCodeInstruction bins(BC_STORE_ADDR_8); ByteCodeInstruction bins(BC_STORE_ADDR_8);
bins.mRegister = BC_REG_ACCU; bins.mRegister = BC_REG_ACCU;
bins.mValue = ins->mSrc[1].mIntConst; bins.mValue = index;
mIns.Push(bins); mIns.Push(bins);
} }
else if (InterTypeSize[ins->mSrc[0].mType] == 2) else if (InterTypeSize[ins->mSrc[0].mType] == 2)
{ {
ByteCodeInstruction bins(BC_STORE_ADDR_16); ByteCodeInstruction bins(BC_STORE_ADDR_16);
bins.mRegister = BC_REG_ACCU; bins.mRegister = BC_REG_ACCU;
bins.mValue = ins->mSrc[1].mIntConst; bins.mValue = index;
mIns.Push(bins); mIns.Push(bins);
} }
else if (InterTypeSize[ins->mSrc[0].mType] == 4) else if (InterTypeSize[ins->mSrc[0].mType] == 4)
{ {
ByteCodeInstruction bins(BC_STORE_ADDR_32); ByteCodeInstruction bins(BC_STORE_ADDR_32);
bins.mRegister = BC_REG_ACCU; bins.mRegister = BC_REG_ACCU;
bins.mValue = ins->mSrc[1].mIntConst; bins.mValue = index;
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -1539,16 +1609,30 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
{ {
if (ins->mSrc[1].mMemory == IM_INDIRECT) if (ins->mSrc[1].mMemory == IM_INDIRECT)
{ {
ByteCodeInstruction lins(BC_ADDR_REG); int index = ins->mSrc[1].mIntConst;
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; if (index + InterTypeSize[ins->mSrc[0].mType] <= 256)
lins.mRegisterFinal = ins->mSrc[1].mFinal; {
mIns.Push(lins); ByteCodeInstruction lins(BC_ADDR_REG);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
lins.mRegisterFinal = ins->mSrc[1].mFinal;
mIns.Push(lins);
}
else
{
ByteCodeInstruction lins(BC_LEA_ABS_INDEX);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
lins.mRegisterFinal = ins->mSrc[1].mFinal;
lins.mValue = index;
index = 0;
mIns.Push(lins);
}
if (InterTypeSize[ins->mSrc[0].mType] == 1) if (InterTypeSize[ins->mSrc[0].mType] == 1)
{ {
ByteCodeInstruction bins(BC_STORE_ADDR_8); ByteCodeInstruction bins(BC_STORE_ADDR_8);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp];
bins.mRegisterFinal = ins->mSrc[0].mFinal; bins.mRegisterFinal = ins->mSrc[0].mFinal;
bins.mValue = ins->mSrc[1].mIntConst; bins.mValue = index;
mIns.Push(bins); mIns.Push(bins);
} }
else if (InterTypeSize[ins->mSrc[0].mType] == 2) else if (InterTypeSize[ins->mSrc[0].mType] == 2)
@ -1556,7 +1640,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
ByteCodeInstruction bins(BC_STORE_ADDR_16); ByteCodeInstruction bins(BC_STORE_ADDR_16);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp];
bins.mRegisterFinal = ins->mSrc[0].mFinal; bins.mRegisterFinal = ins->mSrc[0].mFinal;
bins.mValue = ins->mSrc[1].mIntConst; bins.mValue = index;
mIns.Push(bins); mIns.Push(bins);
} }
else if (InterTypeSize[ins->mSrc[0].mType] == 4) else if (InterTypeSize[ins->mSrc[0].mType] == 4)
@ -1564,7 +1648,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI
ByteCodeInstruction bins(BC_STORE_ADDR_32); ByteCodeInstruction bins(BC_STORE_ADDR_32);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp];
bins.mRegisterFinal = ins->mSrc[0].mFinal; bins.mRegisterFinal = ins->mSrc[0].mFinal;
bins.mValue = ins->mSrc[1].mIntConst; bins.mValue = index;
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -1637,13 +1721,27 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn
{ {
if (ins->mSrc[0].mMemory == IM_INDIRECT) if (ins->mSrc[0].mMemory == IM_INDIRECT)
{ {
ByteCodeInstruction lins(BC_ADDR_REG); int index = ins->mSrc[0].mIntConst;
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; if (index + 4 <= 256)
lins.mRegisterFinal = ins->mSrc[0].mFinal; {
mIns.Push(lins); ByteCodeInstruction lins(BC_ADDR_REG);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp];
lins.mRegisterFinal = ins->mSrc[0].mFinal;
mIns.Push(lins);
}
else
{
ByteCodeInstruction lins(BC_LEA_ABS_INDEX);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp];
lins.mRegisterFinal = ins->mSrc[0].mFinal;
lins.mValue = index;
index = 0;
mIns.Push(lins);
}
ByteCodeInstruction bins(BC_LOAD_ADDR_32); ByteCodeInstruction bins(BC_LOAD_ADDR_32);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp];
bins.mValue = ins->mSrc[0].mIntConst; bins.mValue = index;
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -1710,13 +1808,27 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn
{ {
if (ins->mSrc[0].mMemory == IM_INDIRECT) if (ins->mSrc[0].mMemory == IM_INDIRECT)
{ {
ByteCodeInstruction lins(BC_ADDR_REG); int index = ins->mSrc[0].mIntConst;
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; if (index + 2 <= 256)
lins.mRegisterFinal = ins->mSrc[0].mFinal; {
mIns.Push(lins); ByteCodeInstruction lins(BC_ADDR_REG);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp];
lins.mRegisterFinal = ins->mSrc[0].mFinal;
mIns.Push(lins);
}
else
{
ByteCodeInstruction lins(BC_LEA_ABS_INDEX);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp];
lins.mRegisterFinal = ins->mSrc[0].mFinal;
lins.mValue = index;
index = 0;
mIns.Push(lins);
}
ByteCodeInstruction bins(BC_LOAD_ADDR_16); ByteCodeInstruction bins(BC_LOAD_ADDR_16);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp];
bins.mValue = ins->mSrc[0].mIntConst; bins.mValue = index;
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -1898,30 +2010,43 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn
{ {
if (ins->mSrc[0].mMemory == IM_INDIRECT) if (ins->mSrc[0].mMemory == IM_INDIRECT)
{ {
ByteCodeInstruction lins(BC_ADDR_REG); int index = ins->mSrc[0].mIntConst;
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; if (index + InterTypeSize[ins->mDst.mType] <= 256)
lins.mRegisterFinal = ins->mSrc[0].mFinal; {
mIns.Push(lins); ByteCodeInstruction lins(BC_ADDR_REG);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp];
lins.mRegisterFinal = ins->mSrc[0].mFinal;
mIns.Push(lins);
}
else
{
ByteCodeInstruction lins(BC_LEA_ABS_INDEX);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp];
lins.mRegisterFinal = ins->mSrc[0].mFinal;
lins.mValue = index;
index = 0;
mIns.Push(lins);
}
if (InterTypeSize[ins->mDst.mType] == 1) if (InterTypeSize[ins->mDst.mType] == 1)
{ {
ByteCodeInstruction bins(BC_LOAD_ADDR_8); ByteCodeInstruction bins(BC_LOAD_ADDR_8);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp];
bins.mValue = ins->mSrc[0].mIntConst; bins.mValue = index;
mIns.Push(bins); mIns.Push(bins);
} }
else if (InterTypeSize[ins->mDst.mType] == 2) else if (InterTypeSize[ins->mDst.mType] == 2)
{ {
ByteCodeInstruction bins(BC_LOAD_ADDR_16); ByteCodeInstruction bins(BC_LOAD_ADDR_16);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp];
bins.mValue = ins->mSrc[0].mIntConst; bins.mValue = index;
mIns.Push(bins); mIns.Push(bins);
} }
else if (InterTypeSize[ins->mDst.mType] == 4) else if (InterTypeSize[ins->mDst.mType] == 4)
{ {
ByteCodeInstruction bins(BC_LOAD_ADDR_32); ByteCodeInstruction bins(BC_LOAD_ADDR_32);
bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp];
bins.mValue = ins->mSrc[0].mIntConst; bins.mValue = index;
mIns.Push(bins); mIns.Push(bins);
} }
} }
@ -2700,7 +2825,7 @@ void ByteCodeBasicBlock::BinaryOperator(InterCodeProcedure* proc, const InterIns
} }
else else
{ {
ByteCodeInstruction lins(BC_LOAD_REG_16); ByteCodeInstruction lins(InterTypeSize[ins->mSrc[1].mType] == 1 ? BC_LOAD_REG_8 : BC_LOAD_REG_16);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
lins.mRegisterFinal = ins->mSrc[1].mFinal; lins.mRegisterFinal = ins->mSrc[1].mFinal;
mIns.Push(lins); mIns.Push(lins);
@ -2723,7 +2848,7 @@ void ByteCodeBasicBlock::BinaryOperator(InterCodeProcedure* proc, const InterIns
mIns.Push(bins); mIns.Push(bins);
return; return;
} }
ByteCodeInstruction lins(BC_LOAD_REG_16); ByteCodeInstruction lins(InterTypeSize[ins->mSrc[1].mType] == 1 ? BC_LOAD_REG_8 : BC_LOAD_REG_16);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]; lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp];
lins.mRegisterFinal = ins->mSrc[0].mFinal; lins.mRegisterFinal = ins->mSrc[0].mFinal;
mIns.Push(lins); mIns.Push(lins);
@ -2743,7 +2868,7 @@ void ByteCodeBasicBlock::BinaryOperator(InterCodeProcedure* proc, const InterIns
mIns.Push(bins); mIns.Push(bins);
return; return;
} }
ByteCodeInstruction lins(BC_LOAD_REG_16); ByteCodeInstruction lins(InterTypeSize[ins->mSrc[0].mType] == 1 ? BC_LOAD_REG_8 : BC_LOAD_REG_16);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
lins.mRegisterFinal = ins->mSrc[1].mFinal; lins.mRegisterFinal = ins->mSrc[1].mFinal;
mIns.Push(lins); mIns.Push(lins);
@ -2755,7 +2880,7 @@ void ByteCodeBasicBlock::BinaryOperator(InterCodeProcedure* proc, const InterIns
} }
else else
{ {
ByteCodeInstruction lins(BC_LOAD_REG_16); ByteCodeInstruction lins(InterTypeSize[ins->mSrc[1].mType] == 1 ? BC_LOAD_REG_8 : BC_LOAD_REG_16);
lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]; lins.mRegister = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
lins.mRegisterFinal = ins->mSrc[1].mFinal; lins.mRegisterFinal = ins->mSrc[1].mFinal;
mIns.Push(lins); mIns.Push(lins);
@ -3264,6 +3389,7 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(void)
for (int i = 0; i < mIns.Size(); i++) for (int i = 0; i < mIns.Size(); i++)
{ {
#if 1
if (i + 3 < mIns.Size()) if (i + 3 < mIns.Size())
{ {
if ( if (
@ -3280,7 +3406,8 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(void)
progress = true; progress = true;
} }
} }
#endif
#if 1
if (i + 2 < mIns.Size()) if (i + 2 < mIns.Size())
{ {
if (mIns[i].mCode == BC_LOAD_LOCAL_16 && if (mIns[i].mCode == BC_LOAD_LOCAL_16 &&
@ -3432,8 +3559,19 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(void)
mIns[i + 2].mCode = BC_NOP; mIns[i + 2].mCode = BC_NOP;
progress = true; progress = true;
} }
else if (
mIns[i + 0].mCode == BC_STORE_REG_8 &&
mIns[i + 1].mCode == BC_LOAD_REG_8 && mIns[i + 0].mRegister == mIns[i + 1].mRegister &&
mIns[i + 2].mCode == BC_STORE_REG_8)
{
if (mIns[i + 1].mRegisterFinal)
mIns[i + 0].mCode = BC_NOP;
mIns[i + 1].mCode = BC_NOP;
progress = true;
}
} }
#endif
#if 1
if (i + 1 < mIns.Size()) if (i + 1 < mIns.Size())
{ {
if (mIns[i].mCode == BC_STORE_REG_16 && mIns[i + 1].mCode == BC_LOAD_REG_16 && mIns[i].mRegister == mIns[i + 1].mRegister) if (mIns[i].mCode == BC_STORE_REG_16 && mIns[i + 1].mCode == BC_LOAD_REG_16 && mIns[i].mRegister == mIns[i + 1].mRegister)
@ -3514,6 +3652,12 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(void)
mIns[i].mCode = BC_NOP; mIns[i].mCode = BC_NOP;
progress = true; progress = true;
} }
else if (mIns[i].mCode == BC_STORE_REG_8 && mIns[i + 1].StoresRegister(mIns[i].mRegister) && mIns[i + 1].mRegisterFinal)
{
mIns[i + 1].mRegister = BC_REG_ACCU;
mIns[i].mCode = BC_NOP;
progress = true;
}
#if 0 #if 0
else if ((mIns[i].mCode == BC_LOAD_LOCAL_16 || mIns[i].mCode == BC_LOAD_ABS_16) && mIns[i + 1].mCode == BC_ADDR_REG && mIns[i].mRegister == mIns[i + 1].mRegister && mIns[i + 1].mRegisterFinal) else if ((mIns[i].mCode == BC_LOAD_LOCAL_16 || mIns[i].mCode == BC_LOAD_ABS_16) && mIns[i + 1].mCode == BC_ADDR_REG && mIns[i].mRegister == mIns[i + 1].mRegister && mIns[i + 1].mRegisterFinal)
{ {
@ -3523,13 +3667,14 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(void)
} }
#endif #endif
} }
#endif
#if 1
if ((mIns[i].mCode == BC_LOAD_REG_16 || mIns[i].mCode == BC_STORE_REG_16 || mIns[i].mCode == BC_LOAD_REG_32 || mIns[i].mCode == BC_STORE_REG_32) && accuTemp == mIns[i].mRegister) if ((mIns[i].mCode == BC_LOAD_REG_16 || mIns[i].mCode == BC_STORE_REG_16 || mIns[i].mCode == BC_LOAD_REG_32 || mIns[i].mCode == BC_STORE_REG_32) && accuTemp == mIns[i].mRegister)
{ {
mIns[i].mCode = BC_NOP; mIns[i].mCode = BC_NOP;
progress = true; progress = true;
} }
#endif
if (mIns[i].mCode == BC_ADDR_REG && mIns[i].mRegister == addrTemp) if (mIns[i].mCode == BC_ADDR_REG && mIns[i].mRegister == addrTemp)
{ {
mIns[i].mCode = BC_NOP; mIns[i].mCode = BC_NOP;

View File

@ -140,7 +140,7 @@ void ByteCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int star
break; break;
case BC_LOAD_ABS_8: case BC_LOAD_ABS_8:
fprintf(file, "MOVUB\t%s, %s", TempName(memory[start + i + 2], tbuffer, proc), AddrName(uint16(memory[start + i + 0] + 256 * memory[start + i + 1]), abuffer, linker)); fprintf(file, "MOVB\t%s, %s", TempName(memory[start + i + 2], tbuffer, proc), AddrName(uint16(memory[start + i + 0] + 256 * memory[start + i + 1]), abuffer, linker));
i += 3; i += 3;
break; break;
case BC_LOAD_ABS_16: case BC_LOAD_ABS_16: