Fix call/return
This commit is contained in:
parent
9833656fcf
commit
7927df6d41
|
@ -2142,7 +2142,7 @@ __asm inp_enter
|
|||
dey
|
||||
beq W1
|
||||
|
||||
L1: lda regs - 1, y
|
||||
L1: lda sregs - 1, y
|
||||
dey
|
||||
sta (sp), y
|
||||
bne L1
|
||||
|
@ -2180,7 +2180,7 @@ __asm inp_return
|
|||
dey
|
||||
|
||||
L1: lda (sp), y
|
||||
sta regs, y
|
||||
sta sregs, y
|
||||
dey
|
||||
bpl L1
|
||||
W1:
|
||||
|
|
|
@ -3670,6 +3670,7 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(void)
|
|||
mIns[i + 1].mCode = BC_NOP;
|
||||
progress = true;
|
||||
}
|
||||
#if 1
|
||||
else if (
|
||||
mIns[i + 0].mCode == BC_STORE_REG_16 &&
|
||||
mIns[i + 1].LoadsRegister(BC_REG_ACCU) &&
|
||||
|
@ -3679,6 +3680,7 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(void)
|
|||
mIns[i + 1].mRegister = mIns[i + 0].mRegister;
|
||||
progress = true;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
#if 1
|
||||
|
@ -3762,6 +3764,7 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(void)
|
|||
mIns[i].mCode = BC_NOP;
|
||||
progress = true;
|
||||
}
|
||||
#if 1
|
||||
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;
|
||||
|
@ -3790,7 +3793,7 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(void)
|
|||
mIns[i].mCode = BC_NOP;
|
||||
progress = true;
|
||||
}
|
||||
|
||||
#endif
|
||||
#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)
|
||||
{
|
||||
|
|
|
@ -283,19 +283,24 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex
|
|||
d[offset++] = cexp->mLeft->mDecValue->mInteger & 255;
|
||||
else if (aexp->mType == DT_LABEL_REF)
|
||||
{
|
||||
if (!aexp->mBase->mBase->mLinkerObject)
|
||||
TranslateAssembler(mod, aexp->mBase->mBase->mValue, nullptr);
|
||||
if (aexp->mBase->mBase)
|
||||
{
|
||||
if (!aexp->mBase->mBase->mLinkerObject)
|
||||
TranslateAssembler(mod, aexp->mBase->mBase->mValue, nullptr);
|
||||
|
||||
LinkerReference ref;
|
||||
ref.mObject = dec->mLinkerObject;
|
||||
ref.mOffset = offset;
|
||||
if (aexp->mFlags & DTF_UPPER_BYTE)
|
||||
ref.mFlags = LREF_HIGHBYTE;
|
||||
LinkerReference ref;
|
||||
ref.mObject = dec->mLinkerObject;
|
||||
ref.mOffset = offset;
|
||||
if (aexp->mFlags & DTF_UPPER_BYTE)
|
||||
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
|
||||
ref.mFlags = LREF_LOWBYTE;
|
||||
ref.mRefObject = aexp->mBase->mBase->mLinkerObject;
|
||||
ref.mRefOffset = aexp->mOffset + aexp->mBase->mInteger;
|
||||
dec->mLinkerObject->AddReference(ref);
|
||||
mErrors->Error(aexp->mLocation, EERR_ASM_INVALD_OPERAND, "Undefined immediate operand", aexp->mBase->mIdent->mString);
|
||||
|
||||
offset += 1;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue