Fix pointer register loss while forwarding index

This commit is contained in:
drmortalwombat 2022-12-30 15:55:03 +01:00
parent 1a06102668
commit 425aae8f72
3 changed files with 27 additions and 7 deletions

View File

@ -717,6 +717,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration*
return ExValue(TheVoidTypeDeclaration); return ExValue(TheVoidTypeDeclaration);
case EX_SEQUENCE: case EX_SEQUENCE:
case EX_LIST:
vr = TranslateExpression(procType, proc, block, exp->mLeft, breakBlock, continueBlock, inlineMapper); vr = TranslateExpression(procType, proc, block, exp->mLeft, breakBlock, continueBlock, inlineMapper);
exp = exp->mRight; exp = exp->mRight;
if (!exp) if (!exp)
@ -1732,9 +1733,11 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration*
ins->mOperator = IA_NOT; ins->mOperator = IA_NOT;
break; break;
case TK_MUL: case TK_MUL:
if (vl.mType->mType != DT_TYPE_POINTER) if (vl.mType->mType == DT_TYPE_ARRAY)
vl = Dereference(proc, exp, block, vl, 1);
else if (vl.mType->mType != DT_TYPE_POINTER)
mErrors->Error(exp->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Not a pointer type"); mErrors->Error(exp->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Not a pointer type");
if (vl.mType->mStride != 1) else if (vl.mType->mStride != 1)
vl = Dereference(proc, exp, block, vl, 0); vl = Dereference(proc, exp, block, vl, 0);
return ExValue(vl.mType->mBase, vl.mTemp, vl.mReference + 1); return ExValue(vl.mType->mBase, vl.mTemp, vl.mReference + 1);
case TK_BINARY_AND: case TK_BINARY_AND:
@ -2402,6 +2405,8 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration*
{ {
if (vr.mType->mType == DT_TYPE_ARRAY || vr.mType->mType == DT_TYPE_FUNCTION) if (vr.mType->mType == DT_TYPE_ARRAY || vr.mType->mType == DT_TYPE_FUNCTION)
vr = Dereference(proc, texp, block, vr, 1); vr = Dereference(proc, texp, block, vr, 1);
else if (pdec && pdec->mBase->mType == DT_TYPE_POINTER && vr.mType->mType == DT_TYPE_INTEGER && texp->mDecValue->mType == DT_CONST_INTEGER && texp->mDecValue->mInteger == 0)
vr = CoerceType(proc, texp, block, vr, pdec->mBase);
else else
vr = Dereference(proc, texp, block, vr); vr = Dereference(proc, texp, block, vr);

View File

@ -15952,7 +15952,6 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool
{ {
for (int i = 0; i < mEntryBlocks.Size(); i++) for (int i = 0; i < mEntryBlocks.Size(); i++)
mEntryBlocks[i]->ChangeTailZPStoreToX(mIns[0].mAddress); mEntryBlocks[i]->ChangeTailZPStoreToX(mIns[0].mAddress);
mEntryProvidedRegs += CPU_REG_X;
mEntryRequiredRegs += CPU_REG_X; mEntryRequiredRegs += CPU_REG_X;
mIns[0].mType = ASMIT_TXA; mIns[0].mType = ASMIT_TXA;
mIns[0].mMode = ASMIM_IMPLIED; mIns[0].mMode = ASMIM_IMPLIED;
@ -15970,7 +15969,6 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool
{ {
for (int i = 0; i < mEntryBlocks.Size(); i++) for (int i = 0; i < mEntryBlocks.Size(); i++)
mEntryBlocks[i]->ChangeTailZPStoreToY(mIns[0].mAddress); mEntryBlocks[i]->ChangeTailZPStoreToY(mIns[0].mAddress);
mEntryProvidedRegs += CPU_REG_Y;
mEntryRequiredRegs += CPU_REG_Y; mEntryRequiredRegs += CPU_REG_Y;
mIns[0].mType = ASMIT_TYA; mIns[0].mType = ASMIT_TYA;
mIns[0].mMode = ASMIM_IMPLIED; mIns[0].mMode = ASMIM_IMPLIED;
@ -16939,7 +16937,11 @@ bool NativeCodeBasicBlock::PatchSingleUseGlobalLoad(const NativeCodeBasicBlock*
{ {
ins.CopyMode(ains); ins.CopyMode(ains);
if (!(ins.mLive & LIVE_MEM)) if (!(ins.mLive & LIVE_MEM))
{
if (ains.mMode == ASMIM_INDIRECT_Y)
ins.mLive |= LIVE_MEM;
return true; return true;
}
changed = true; changed = true;
} }
else else
@ -16950,6 +16952,8 @@ bool NativeCodeBasicBlock::PatchSingleUseGlobalLoad(const NativeCodeBasicBlock*
ins.mLive |= LIVE_CPU_REG_X; ins.mLive |= LIVE_CPU_REG_X;
if (ains.mMode == ASMIM_ABSOLUTE_Y || ains.mMode == ASMIM_INDIRECT_Y) if (ains.mMode == ASMIM_ABSOLUTE_Y || ains.mMode == ASMIM_INDIRECT_Y)
ins.mLive |= LIVE_CPU_REG_Y; ins.mLive |= LIVE_CPU_REG_Y;
if (ains.mMode == ASMIM_INDIRECT_Y)
ins.mLive |= LIVE_MEM;
at++; at++;
} }
@ -31952,6 +31956,7 @@ void NativeCodeProcedure::Optimize(void)
mEntryBlock->CheckBlocks(); mEntryBlock->CheckBlocks();
#endif #endif
#if 1 #if 1
ResetVisited(); ResetVisited();
if (mEntryBlock->PeepHoleOptimizer(this, step)) if (mEntryBlock->PeepHoleOptimizer(this, step))
@ -32345,8 +32350,6 @@ void NativeCodeProcedure::Optimize(void)
else else
cnt++; cnt++;
} while (changed); } while (changed);
#if 1 #if 1

View File

@ -966,6 +966,18 @@ Expression* Parser::ParseInitExpression(Declaration* dtype)
nexp->mDecValue = ndec; nexp->mDecValue = ndec;
exp = nexp; exp = nexp;
} }
else if (exp->mDecValue->mType == DT_CONST_INTEGER && exp->mDecValue->mInteger == 0)
{
Declaration * ndec = new Declaration(exp->mDecValue->mLocation, DT_CONST_ADDRESS);
ndec->mBase = TheVoidPointerTypeDeclaration;
ndec->mInteger = 0;
dec = ndec;
Expression* nexp = new Expression(mScanner->mLocation, EX_CONSTANT);
nexp->mDecValue = ndec;
nexp->mDecType = ndec->mBase;
exp = nexp;
}
else else
mErrors->Error(mScanner->mLocation, EERR_CONSTANT_INITIALIZER, "Illegal pointer constant initializer"); mErrors->Error(mScanner->mLocation, EERR_CONSTANT_INITIALIZER, "Illegal pointer constant initializer");
@ -2433,7 +2445,7 @@ Expression* Parser::ParseStatement(void)
break; break;
default: default:
exp = ParseExpression(); exp = ParseListExpression();
ConsumeToken(TK_SEMICOLON); ConsumeToken(TK_SEMICOLON);
} }
} }