Fix strided array unsigned struct member assignment
This commit is contained in:
parent
688fd92a6b
commit
ebe9476bcc
|
@ -5296,6 +5296,7 @@ void NativeCodeBasicBlock::LoadStoreIndirectValue(InterCodeProcedure* proc, cons
|
||||||
int rindex = rins->mSrc[0].mIntConst;
|
int rindex = rins->mSrc[0].mIntConst;
|
||||||
int rareg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS;
|
int rareg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS;
|
||||||
LinkerObject* rlobject = nullptr;
|
LinkerObject* rlobject = nullptr;
|
||||||
|
int rstride = rins->mSrc[0].mStride;
|
||||||
|
|
||||||
uint32 rflags = NCIF_LOWER | NCIF_UPPER;
|
uint32 rflags = NCIF_LOWER | NCIF_UPPER;
|
||||||
if (rins->mVolatile)
|
if (rins->mVolatile)
|
||||||
|
@ -5337,6 +5338,7 @@ void NativeCodeBasicBlock::LoadStoreIndirectValue(InterCodeProcedure* proc, cons
|
||||||
int windex = wins->mSrc[1].mIntConst;
|
int windex = wins->mSrc[1].mIntConst;
|
||||||
int wareg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS;
|
int wareg = mNoFrame ? BC_REG_STACK : BC_REG_LOCALS;
|
||||||
LinkerObject* wlobject = nullptr;
|
LinkerObject* wlobject = nullptr;
|
||||||
|
int wstride = wins->mSrc[1].mStride;
|
||||||
|
|
||||||
uint32 wflags = NCIF_LOWER | NCIF_UPPER;
|
uint32 wflags = NCIF_LOWER | NCIF_UPPER;
|
||||||
if (wins->mVolatile)
|
if (wins->mVolatile)
|
||||||
|
@ -5384,23 +5386,23 @@ void NativeCodeBasicBlock::LoadStoreIndirectValue(InterCodeProcedure* proc, cons
|
||||||
{
|
{
|
||||||
if (rmode == ASMIM_INDIRECT_Y)
|
if (rmode == ASMIM_INDIRECT_Y)
|
||||||
{
|
{
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, rindex + i));
|
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, rindex + i * rstride));
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, rareg, nullptr, rflags));
|
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, rareg, nullptr, rflags));
|
||||||
}
|
}
|
||||||
else if (rmode == ASMIM_ZERO_PAGE)
|
else if (rmode == ASMIM_ZERO_PAGE)
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, rareg + i));
|
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, rareg + i));
|
||||||
else
|
else
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, rindex + i, rlobject, rflags));
|
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ABSOLUTE, rindex + i * rstride, rlobject, rflags));
|
||||||
|
|
||||||
if (wmode == ASMIM_INDIRECT_Y)
|
if (wmode == ASMIM_INDIRECT_Y)
|
||||||
{
|
{
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, windex + i));
|
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, windex + i * wstride));
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, wareg, nullptr, wflags));
|
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, wareg, nullptr, wflags));
|
||||||
}
|
}
|
||||||
else if (wmode == ASMIM_ZERO_PAGE)
|
else if (wmode == ASMIM_ZERO_PAGE)
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, wareg + i));
|
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, wareg + i));
|
||||||
else
|
else
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, windex + i, wlobject, wflags));
|
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ABSOLUTE, windex + i * wstride, wlobject, wflags));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue