From ebdd6f0d7da5f141e7dd1e6d659317acfd7fedd3 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Sun, 12 Sep 2021 14:17:21 +0200 Subject: [PATCH] Add fixed offset to pointer base mem access --- include/crt.c | 97 +++++++++++++++++++++++++++------ oscar64/ByteCodeGenerator.cpp | 57 ++++++++++++++----- oscar64/InterCode.cpp | 59 +++++++++++++++----- oscar64/NativeCodeGenerator.cpp | 32 ++++++----- 4 files changed, 185 insertions(+), 60 deletions(-) diff --git a/include/crt.c b/include/crt.c index ded6e92..3047305 100644 --- a/include/crt.c +++ b/include/crt.c @@ -503,18 +503,26 @@ __asm inp_load_abs_u8 lda (ip), y sta addr + 1 iny -inp_load_addr_u8: lda (ip), y tax - iny sty tmpy ldy #0 +L0: lda (addr), y sta $00, x lda #0 sta $01, x ldy tmpy + iny jmp startup.exec +inp_load_addr_u8: + lda (ip), y + tax + iny + lda (ip), y + sty tmpy + tay + jmp L0 } #pragma bytecode(BC_LOAD_ABS_U8, inp_load_abs_u8) @@ -528,12 +536,11 @@ __asm inp_load_abs_s8 lda (ip), y sta addr + 1 iny -inp_load_addr_s8: lda (ip), y tax - iny sty tmpy ldy #0 +L0: lda (addr), y sta $00, x bmi W1 @@ -542,7 +549,16 @@ inp_load_addr_s8: W1: lda #$ff sta $01, x ldy tmpy + iny jmp startup.exec +inp_load_addr_s8: + lda (ip), y + tax + iny + lda (ip), y + sty tmpy + tay + jmp L0 } #pragma bytecode(BC_LOAD_ABS_I8, inp_load_abs_s8) @@ -556,19 +572,28 @@ __asm inp_load_abs_16 lda (ip), y sta addr + 1 iny -inp_load_addr_16: lda (ip), y tax - iny sty tmpy ldy #0 +L0: lda (addr), y sta $00, x iny lda (addr), y sta $01, x ldy tmpy + iny jmp startup.exec + +inp_load_addr_16: + lda (ip), y + tax + iny + lda (ip), y + sty tmpy + tay + jmp L0 } #pragma bytecode(BC_LOAD_ABS_16, inp_load_abs_16) @@ -582,12 +607,12 @@ __asm inp_load_abs_32 lda (ip), y sta addr + 1 iny -inp_load_addr_32: lda (ip), y tax - iny sty tmpy ldy #0 +L0: + lda (addr), y sta $00, x iny @@ -600,7 +625,17 @@ inp_load_addr_32: lda (addr), y sta $03, x ldy tmpy + iny jmp startup.exec + +inp_load_addr_32: + lda (ip), y + tax + iny + lda (ip), y + sty tmpy + tay + jmp L0 } #pragma bytecode(BC_LOAD_ABS_32, inp_load_abs_32) @@ -614,16 +649,26 @@ __asm inp_store_abs_8 lda (ip), y sta addr + 1 iny + lda (ip), y + tax + sty tmpy + ldy #0 +L0: + + lda $00, x + sta (addr), y + ldy tmpy + iny + jmp startup.exec + inp_store_addr_8: lda (ip), y tax iny + lda (ip), y sty tmpy - ldy #0 - lda $00, x - sta (addr), y - ldy tmpy - jmp startup.exec + tay + jmp L0 } #pragma bytecode(BC_STORE_ABS_8, inp_store_abs_8) @@ -637,19 +682,28 @@ __asm inp_store_abs_16 lda (ip), y sta addr + 1 iny -inp_store_addr_16: lda (ip), y tax - iny sty tmpy ldy #0 +L0: lda $00, x sta (addr), y iny lda $01, x sta (addr), y ldy tmpy + iny jmp startup.exec + +inp_store_addr_16: + lda (ip), y + tax + iny + lda (ip), y + sty tmpy + tay + jmp L0 } #pragma bytecode(BC_STORE_ABS_16, inp_store_abs_16) @@ -663,12 +717,11 @@ __asm inp_store_abs_32 lda (ip), y sta addr + 1 iny -inp_store_addr_32: lda (ip), y tax - iny sty tmpy ldy #0 +L0: lda $00, x sta (addr), y iny @@ -681,7 +734,17 @@ inp_store_addr_32: lda $03, x sta (addr), y ldy tmpy + iny jmp startup.exec + +inp_store_addr_32: + lda (ip), y + tax + iny + lda (ip), y + sty tmpy + tay + jmp L0 } #pragma bytecode(BC_STORE_ABS_32, inp_store_abs_32) diff --git a/oscar64/ByteCodeGenerator.cpp b/oscar64/ByteCodeGenerator.cpp index 4ba87c6..282d44b 100644 --- a/oscar64/ByteCodeGenerator.cpp +++ b/oscar64/ByteCodeGenerator.cpp @@ -214,7 +214,8 @@ void ByteCodeInstruction::Assemble(ByteCodeGenerator* generator, ByteCodeBasicBl case BC_LOAD_REG_32: case BC_STORE_REG_32: case BC_ADDR_REG: - block->PutCode(generator, mCode); block->PutByte(mRegister); + block->PutCode(generator, mCode); + block->PutByte(mRegister); break; case BC_LOAD_ABS_U8: @@ -428,6 +429,7 @@ void ByteCodeInstruction::Assemble(ByteCodeGenerator* generator, ByteCodeBasicBl case BC_STORE_ADDR_32: block->PutCode(generator, mCode); block->PutByte(mRegister); + block->PutByte(mValue); break; case BC_COPY: @@ -678,6 +680,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI ByteCodeInstruction bins(BC_STORE_ADDR_32); bins.mRegister = BC_REG_ACCU; bins.mRegisterFinal = ins.mSFinal[0]; + bins.mValue = 0; mIns.Push(bins); } } @@ -733,6 +736,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI ByteCodeInstruction bins(BC_STORE_ADDR_32); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]; bins.mRegisterFinal = ins.mSFinal[0]; + bins.mValue = 0; mIns.Push(bins); } } @@ -760,6 +764,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI mIns.Push(lins); ByteCodeInstruction bins(BC_STORE_ADDR_32); bins.mRegister = BC_REG_ACCU; + bins.mValue = ins.mSIntConst[1]; mIns.Push(bins); } } @@ -774,6 +779,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI ByteCodeInstruction bins(BC_STORE_ADDR_32); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]; bins.mRegisterFinal = ins.mSFinal[0]; + bins.mValue = ins.mSIntConst[1]; mIns.Push(bins); } } @@ -826,6 +832,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI mIns.Push(lins); ByteCodeInstruction bins(BC_STORE_ADDR_16); bins.mRegister = BC_REG_ACCU; + bins.mValue = 0; mIns.Push(bins); } } @@ -881,6 +888,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI ByteCodeInstruction bins(BC_STORE_ADDR_16); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]; bins.mRegisterFinal = ins.mSFinal[0]; + bins.mValue = 0; mIns.Push(bins); } } @@ -908,6 +916,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI mIns.Push(lins); ByteCodeInstruction bins(BC_STORE_ADDR_16); bins.mRegister = BC_REG_ACCU; + bins.mValue = ins.mSIntConst[1]; mIns.Push(bins); } } @@ -922,6 +931,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI ByteCodeInstruction bins(BC_STORE_ADDR_16); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]; bins.mRegisterFinal = ins.mSFinal[0]; + bins.mValue = ins.mSIntConst[1]; mIns.Push(bins); } } @@ -976,6 +986,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI mIns.Push(lins); ByteCodeInstruction bins(BC_STORE_ADDR_8); bins.mRegister = BC_REG_ACCU; + bins.mValue = 0; mIns.Push(bins); } } @@ -1028,6 +1039,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI mIns.Push(lins); ByteCodeInstruction bins(BC_STORE_ADDR_16); bins.mRegister = BC_REG_ACCU; + bins.mValue = 0; mIns.Push(bins); } } @@ -1087,6 +1099,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI ByteCodeInstruction bins(BC_STORE_ADDR_8); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]; bins.mRegisterFinal = ins.mSFinal[0]; + bins.mValue = 0; mIns.Push(bins); } } @@ -1144,6 +1157,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI ByteCodeInstruction bins(BC_STORE_ADDR_16); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]; bins.mRegisterFinal = ins.mSFinal[0]; + bins.mValue = 0; mIns.Push(bins); } } @@ -1174,12 +1188,14 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI { ByteCodeInstruction bins(BC_STORE_ADDR_8); bins.mRegister = BC_REG_ACCU; + bins.mValue = ins.mSIntConst[1]; mIns.Push(bins); } else if (ins.mOperandSize == 2) { ByteCodeInstruction bins(BC_STORE_ADDR_16); bins.mRegister = BC_REG_ACCU; + bins.mValue = ins.mSIntConst[1]; mIns.Push(bins); } } @@ -1197,6 +1213,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI ByteCodeInstruction bins(BC_STORE_ADDR_8); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]; bins.mRegisterFinal = ins.mSFinal[0]; + bins.mValue = ins.mSIntConst[1]; mIns.Push(bins); } else if (ins.mOperandSize == 2) @@ -1204,6 +1221,7 @@ void ByteCodeBasicBlock::StoreDirectValue(InterCodeProcedure* proc, const InterI ByteCodeInstruction bins(BC_STORE_ADDR_16); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]; bins.mRegisterFinal = ins.mSFinal[0]; + bins.mValue = ins.mSIntConst[1]; mIns.Push(bins); } } @@ -1257,6 +1275,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn mIns.Push(lins); ByteCodeInstruction bins(BC_LOAD_ADDR_32); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp]; + bins.mValue = 0; mIns.Push(bins); } } @@ -1271,6 +1290,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn mIns.Push(lins); ByteCodeInstruction bins(BC_LOAD_ADDR_32); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp]; + bins.mValue = ins.mSIntConst[0]; mIns.Push(bins); } } @@ -1318,6 +1338,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn mIns.Push(lins); ByteCodeInstruction bins(BC_LOAD_ADDR_16); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp]; + bins.mValue = 0; mIns.Push(bins); } } @@ -1332,6 +1353,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn mIns.Push(lins); ByteCodeInstruction bins(BC_LOAD_ADDR_16); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp]; + bins.mValue = ins.mSIntConst[0]; mIns.Push(bins); } } @@ -1381,6 +1403,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn mIns.Push(lins); ByteCodeInstruction bins(ins.mTType == IT_SIGNED ? BC_LOAD_ADDR_I8 : BC_LOAD_ADDR_U8); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp]; + bins.mValue = 0; mIns.Push(bins); } } @@ -1426,6 +1449,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn mIns.Push(lins); ByteCodeInstruction bins(BC_LOAD_ADDR_16); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp]; + bins.mValue = 0; mIns.Push(bins); } } @@ -1446,12 +1470,14 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn { ByteCodeInstruction bins(BC_LOAD_ADDR_I8); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp]; + bins.mValue = ins.mSIntConst[0]; mIns.Push(bins); } else { ByteCodeInstruction bins(BC_LOAD_ADDR_U8); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp]; + bins.mValue = ins.mSIntConst[0]; mIns.Push(bins); } } @@ -1459,6 +1485,7 @@ void ByteCodeBasicBlock::LoadDirectValue(InterCodeProcedure* proc, const InterIn { ByteCodeInstruction bins(BC_LOAD_ADDR_16); bins.mRegister = BC_REG_TMP + proc->mTempOffset[ins.mTTemp]; + bins.mValue = ins.mSIntConst[0]; mIns.Push(bins); } } @@ -3354,33 +3381,33 @@ void ByteCodeProcedure::Disassemble(FILE * file, ByteCodeGenerator * generator, break; case BC_LOAD_ADDR_U8: - fprintf(file, "MOVUB\t%s, (ADDR)", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc)); - i++; + fprintf(file, "MOVUB\t%s, (ADDR + %d)", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc), generator->mMemory[mProgStart + i + 1]); + i += 2; break; case BC_LOAD_ADDR_I8: - fprintf(file, "MOVSB\t%s, (ADDR)", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc)); - i++; + fprintf(file, "MOVSB\t%s, (ADDR + %d)", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc), generator->mMemory[mProgStart + i + 1]); + i += 2; break; case BC_LOAD_ADDR_16: - fprintf(file, "MOV\t%s, (ADDR)", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc)); - i++; + fprintf(file, "MOV\t%s, (ADDR + %d)", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc), generator->mMemory[mProgStart + i + 1]); + i += 2; break; case BC_LOAD_ADDR_32: - fprintf(file, "MOVD\t%s, (ADDR)", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc)); - i++; + fprintf(file, "MOVD\t%s, (ADDR + %d)", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc), generator->mMemory[mProgStart + i + 1]); + i += 2; break; case BC_STORE_ADDR_8: - fprintf(file, "MOVB\t(ADDR), %s", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc)); - i++; + fprintf(file, "MOVB\t(ADDR + %d), %s", generator->mMemory[mProgStart + i + 1], TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc)); + i += 2; break; case BC_STORE_ADDR_16: - fprintf(file, "MOV\t(ADDR), %s", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc)); - i++; + fprintf(file, "MOV\t(ADDR + %d), %s", generator->mMemory[mProgStart + i + 1], TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc)); + i += 2; break; case BC_STORE_ADDR_32: - fprintf(file, "MOV\t(ADDR), %s", TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc)); - i++; + fprintf(file, "MOV\t(ADDR + %d), %s", generator->mMemory[mProgStart + i + 1], TempName(generator->mMemory[mProgStart + i + 0], tbuffer, proc)); + i += 2; break; } diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index e5f81e2..de428d2 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -271,20 +271,23 @@ static bool StoreAliasing(const InterInstruction * lins, const InterInstruction* int lvindex, svindex; int loffset, soffset; - if (MemRange(lins, tvalue, lmem, lvindex, loffset) && MemRange(sins, tvalue, smem, svindex, soffset)) + if (MemRange(lins, tvalue, lmem, lvindex, loffset)) { - if (smem == lmem && svindex == lvindex) + if (MemRange(sins, tvalue, smem, svindex, soffset)) { - if (soffset + sins->mOperandSize >= loffset && loffset + lins->mOperandSize >= soffset) - return true; + if (smem == lmem && svindex == lvindex) + { + if (soffset + sins->mOperandSize >= loffset && loffset + lins->mOperandSize >= soffset) + return true; + } + + return false; } - return false; + if (lmem == IM_LOCAL) + return aliasedLocals[lvindex]; } - if (lmem == IM_LOCAL) - return aliasedLocals[lvindex]; - return true; } @@ -463,6 +466,7 @@ void ValueSet::UpdateValue(InterInstruction& ins, const GrowingInstructionPtrArr while (i < mNum && (mInstructions[i]->mCode != IC_LEA || mInstructions[i]->mSTemp[0] != ins.mSTemp[0] || + mInstructions[i]->mSIntConst[0] != ins.mSIntConst[0] || mInstructions[i]->mSTemp[1] != ins.mSTemp[1])) { i++; @@ -922,10 +926,25 @@ InterInstruction::InterInstruction(void) mSType[1] = IT_NONE; mSType[2] = IT_NONE; + mSIntConst[0] = 0; + mSIntConst[1] = 0; + mSIntConst[2] = 0; + + mSFloatConst[0] = 0; + mSFloatConst[1] = 0; + mSFloatConst[2] = 0; + mMemory = IM_NONE; + mOperandSize = 0; + mVarIndex = -1; + mIntValue = 0; + mFloatValue = 0; + mTTemp = INVALID_TEMPORARY; mSTemp[0] = INVALID_TEMPORARY; mSTemp[1] = INVALID_TEMPORARY; mSTemp[2] = INVALID_TEMPORARY; + + mSFinal[0] = mSFinal[1] = mSFinal[2] = false; } void InterInstruction::SetCode(const Location& loc, InterCode code) @@ -1449,7 +1468,9 @@ void InterInstruction::Disassemble(FILE* file) if (this->mCode == IC_CONSTANT) { if (mTType == IT_POINTER) - fprintf(file, "C%d", mOperandSize); + { + fprintf(file, "C%c%d(%d:%d)", memchars[mMemory], mOperandSize, mVarIndex, mIntValue); + } else if (mTType == IT_FLOAT) fprintf(file, "C%f", mFloatValue); else @@ -1571,13 +1592,20 @@ static void OptimizeAddress(InterInstruction& ins, const GrowingInstructionPtrAr if (ins.mSTemp[offset] >= 0 && tvalue[ins.mSTemp[offset]]) { - if (tvalue[ins.mSTemp[offset]]->mCode == IC_CONSTANT) + InterInstruction* ains = tvalue[ins.mSTemp[offset]]; + + if (ains->mCode == IC_CONSTANT) { - ins.mSIntConst[offset] = tvalue[ins.mSTemp[offset]]->mIntValue; - ins.mVarIndex = tvalue[ins.mSTemp[offset]]->mVarIndex; - ins.mMemory = tvalue[ins.mSTemp[offset]]->mMemory; + ins.mSIntConst[offset] = ains->mIntValue; + ins.mVarIndex = ains->mVarIndex; + ins.mMemory = ains->mMemory; ins.mSTemp[offset] = -1; } + else if (ains->mCode == IC_LEA && ains->mSTemp[0] < 0 && ains->mSTemp[1] >= 0 && tvalue[ains->mSTemp[1]]) + { + ins.mSIntConst[offset] = ains->mSIntConst[0]; + ins.mSTemp[offset] = ains->mSTemp[1]; + } } } @@ -1671,6 +1699,11 @@ void InterCodeBasicBlock::CheckValueUsage(InterInstruction& ins, const GrowingIn ins.mSTemp[1] = -1; assert(ins.mSTemp[0] >= 0); } + else + { + ins.mSIntConst[0] = tvalue[ins.mSTemp[0]]->mIntValue; + ins.mSTemp[0] = -1; + } } break; case IC_TYPECAST: diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 24c9840..eca6d57 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -1409,7 +1409,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr { if (ins.mMemory == IM_INDIRECT) { - mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins.mSIntConst[1])); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins.mSIntConst[0] & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[1]])); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); @@ -1427,7 +1427,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr { if (ins.mMemory == IM_INDIRECT) { - mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins.mSIntConst[1])); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[1]])); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); @@ -1544,7 +1544,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr { if (ins.mMemory == IM_INDIRECT) { - mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins.mSIntConst[1])); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins.mSIntConst[0] & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[1]])); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); @@ -1556,7 +1556,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr { if (ins.mMemory == IM_INDIRECT) { - mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins.mSIntConst[1])); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[1]])); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); @@ -1744,7 +1744,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr { if (ins.mMemory == IM_INDIRECT) { - mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins.mSIntConst[1])); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, ins.mSIntConst[0] & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[1]])); @@ -1761,7 +1761,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr { if (ins.mMemory == IM_INDIRECT) { - mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins.mSIntConst[1])); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[1]])); @@ -1821,7 +1821,7 @@ void NativeCodeBasicBlock::LoadStoreValue(InterCodeProcedure* proc, const InterI { if (rins.mMemory == IM_INDIRECT) { - mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, rins.mSIntConst[0])); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[rins.mSTemp[0]])); } } @@ -1861,7 +1861,7 @@ void NativeCodeBasicBlock::LoadStoreValue(InterCodeProcedure* proc, const InterI { if (wins.mMemory == IM_INDIRECT) { - mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, wins.mSIntConst[1])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[wins.mSTemp[1]])); } } @@ -1925,7 +1925,7 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI { if (ins.mMemory == IM_INDIRECT) { - mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins.mSIntConst[0])); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]])); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg)); mIns.Push(NativeCodeInstruction(ASMIT_INY, ASMIM_IMPLIED)); @@ -2008,7 +2008,7 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI if (ins.mMemory == IM_INDIRECT) { int src = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]; - mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins.mSIntConst[0])); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, src)); if (ainsl) { @@ -2152,7 +2152,9 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI { if (ins.mOperandSize == 1) { - mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); + if (ins.mTType == IT_SIGNED) + mIns.Push(NativeCodeInstruction(ASMIT_LDX, ASMIM_IMMEDIATE, 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins.mSIntConst[0])); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]])); if (ainsl) { @@ -2166,8 +2168,8 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI if (ins.mTType == IT_SIGNED) { mIns.Push(NativeCodeInstruction(ASMIT_BPL, ASMIM_RELATIVE, 1)); - mIns.Push(NativeCodeInstruction(ASMIT_DEY, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_TYA, ASMIM_IMPLIED)); + mIns.Push(NativeCodeInstruction(ASMIT_DEX, ASMIM_IMPLIED)); + mIns.Push(NativeCodeInstruction(ASMIT_TXA, ASMIM_IMPLIED)); } else { @@ -2180,7 +2182,7 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI { int src = BC_REG_TMP + proc->mTempOffset[ins.mSTemp[0]]; - mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, ins.mSIntConst[0])); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, src)); if (ainsl) { @@ -3641,7 +3643,7 @@ bool NativeCodeBasicBlock::MoveLoadStoreUp(int at) while (j > 0 && !((mIns[j - 1].mType == ASMIT_STA || mIns[j - 1].mType == ASMIT_LDA) && mIns[j - 1].mMode == ASMIM_ZERO_PAGE && mIns[j - 1].mAddress == mIns[at].mAddress)) { j--; - if ((mIns[j].mMode == ASMIM_ZERO_PAGE || mIns[j].mMode == ASMIM_INDIRECT ) && mIns[j].mAddress == mIns[at + 1].mAddress) + if ((mIns[j].mMode == ASMIM_ZERO_PAGE || mIns[j].mMode == ASMIM_INDIRECT_Y) && mIns[j].mAddress == mIns[at + 1].mAddress) return false; if (mIns[j].mMode == ASMIM_ZERO_PAGE && mIns[j].mAddress == mIns[at].mAddress && mIns[j].ChangesAddress()) return false;