Fix call/return

This commit is contained in:
drmortalwombat 2021-10-20 23:03:37 +02:00
parent 9833656fcf
commit 7927df6d41
3 changed files with 22 additions and 14 deletions

View File

@ -2142,7 +2142,7 @@ __asm inp_enter
dey dey
beq W1 beq W1
L1: lda regs - 1, y L1: lda sregs - 1, y
dey dey
sta (sp), y sta (sp), y
bne L1 bne L1
@ -2180,7 +2180,7 @@ __asm inp_return
dey dey
L1: lda (sp), y L1: lda (sp), y
sta regs, y sta sregs, y
dey dey
bpl L1 bpl L1
W1: W1:

View File

@ -3670,6 +3670,7 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(void)
mIns[i + 1].mCode = BC_NOP; mIns[i + 1].mCode = BC_NOP;
progress = true; progress = true;
} }
#if 1
else if ( else if (
mIns[i + 0].mCode == BC_STORE_REG_16 && mIns[i + 0].mCode == BC_STORE_REG_16 &&
mIns[i + 1].LoadsRegister(BC_REG_ACCU) && mIns[i + 1].LoadsRegister(BC_REG_ACCU) &&
@ -3679,6 +3680,7 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(void)
mIns[i + 1].mRegister = mIns[i + 0].mRegister; mIns[i + 1].mRegister = mIns[i + 0].mRegister;
progress = true; progress = true;
} }
#endif
} }
#endif #endif
#if 1 #if 1
@ -3762,6 +3764,7 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(void)
mIns[i].mCode = BC_NOP; mIns[i].mCode = BC_NOP;
progress = true; progress = true;
} }
#if 1
else if (mIns[i].mCode == BC_STORE_REG_8 && mIns[i + 1].StoresRegister(mIns[i].mRegister) && mIns[i + 1].mRegisterFinal) 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 + 1].mRegister = BC_REG_ACCU;
@ -3790,7 +3793,7 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(void)
mIns[i].mCode = BC_NOP; mIns[i].mCode = BC_NOP;
progress = true; progress = true;
} }
#endif
#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)
{ {

View File

@ -283,19 +283,24 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex
d[offset++] = cexp->mLeft->mDecValue->mInteger & 255; d[offset++] = cexp->mLeft->mDecValue->mInteger & 255;
else if (aexp->mType == DT_LABEL_REF) else if (aexp->mType == DT_LABEL_REF)
{ {
if (!aexp->mBase->mBase->mLinkerObject) if (aexp->mBase->mBase)
TranslateAssembler(mod, aexp->mBase->mBase->mValue, nullptr); {
if (!aexp->mBase->mBase->mLinkerObject)
TranslateAssembler(mod, aexp->mBase->mBase->mValue, nullptr);
LinkerReference ref; LinkerReference ref;
ref.mObject = dec->mLinkerObject; ref.mObject = dec->mLinkerObject;
ref.mOffset = offset; ref.mOffset = offset;
if (aexp->mFlags & DTF_UPPER_BYTE) if (aexp->mFlags & DTF_UPPER_BYTE)
ref.mFlags = LREF_HIGHBYTE; ref.mFlags = LREF_HIGHBYTE;
else
ref.mFlags = LREF_LOWBYTE;
ref.mRefObject = aexp->mBase->mBase->mLinkerObject;
ref.mRefOffset = aexp->mOffset + aexp->mBase->mInteger;
dec->mLinkerObject->AddReference(ref);
}
else else
ref.mFlags = LREF_LOWBYTE; mErrors->Error(aexp->mLocation, EERR_ASM_INVALD_OPERAND, "Undefined immediate operand", aexp->mBase->mIdent->mString);
ref.mRefObject = aexp->mBase->mBase->mLinkerObject;
ref.mRefOffset = aexp->mOffset + aexp->mBase->mInteger;
dec->mLinkerObject->AddReference(ref);
offset += 1; offset += 1;
} }