Prepare more than 3 operands per inter instruction

This commit is contained in:
drmortalwombat 2021-10-06 17:46:42 +02:00
parent 15743d3115
commit df152c2f9b
2 changed files with 64 additions and 55 deletions

View File

@ -374,6 +374,16 @@ void ValueSet::Intersect(ValueSet& set)
mNum = k;
}
bool InterInstruction::ReferencesTemp(int temp) const
{
if (temp == mDst.mTemp)
return true;
for (int i = 0; i < mNumOperands; i++)
if (mSrc[i].mTemp == temp)
return temp;
return false;
}
void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrArray& tvalue, const NumberSet& aliasedLocals, const NumberSet& aliasedParams)
{
int i, value, temp;
@ -385,10 +395,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
i = 0;
while (i < mNum)
{
if (temp == mInstructions[i]->mDst.mTemp ||
temp == mInstructions[i]->mSrc[0].mTemp ||
temp == mInstructions[i]->mSrc[1].mTemp ||
temp == mInstructions[i]->mSrc[2].mTemp)
if (mInstructions[i]->ReferencesTemp(temp))
{
mNum--;
if (i < mNum)
@ -399,7 +406,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
}
}
for (i = 0; i < 3; i++)
for (i = 0; i < ins->mNumOperands; i++)
{
temp = ins->mSrc[i].mTemp;
if (temp >= 0 && tvalue[temp])
@ -1019,6 +1026,7 @@ InterInstruction::InterInstruction(void)
mIntValue = 0;
mFloatValue = 0;
mLinkerObject = nullptr;
mNumOperands = 3;
mInUse = false;
mVolatile = false;
@ -1121,9 +1129,8 @@ void InterInstruction::MarkAliasedLocalTemps(const GrowingIntArray& localTable,
void InterInstruction::FilterTempUsage(NumberSet& requiredTemps, NumberSet& providedTemps)
{
FilterTempUseUsage(requiredTemps, providedTemps, mSrc[0].mTemp);
FilterTempUseUsage(requiredTemps, providedTemps, mSrc[1].mTemp);
FilterTempUseUsage(requiredTemps, providedTemps, mSrc[2].mTemp);
for(int i=0; i<mNumOperands; i++)
FilterTempUseUsage(requiredTemps, providedTemps, mSrc[i].mTemp);
FilterTempDefineUsage(requiredTemps, providedTemps, mDst.mTemp);
}
@ -1206,9 +1213,8 @@ bool InterInstruction::PropagateConstTemps(const GrowingInstructionPtrArray& cte
void InterInstruction::PerformTempForwarding(TempForwardingTable& forwardingTable)
{
PerformTempUseForwarding(mSrc[0].mTemp, forwardingTable);
PerformTempUseForwarding(mSrc[1].mTemp, forwardingTable);
PerformTempUseForwarding(mSrc[2].mTemp, forwardingTable);
for(int i=0; i<mNumOperands; i++)
PerformTempUseForwarding(mSrc[i].mTemp, forwardingTable);
PerformTempDefineForwarding(mDst.mTemp, forwardingTable);
if (mCode == IC_LOAD_TEMPORARY && mDst.mTemp != mSrc[0].mTemp)
{
@ -1232,9 +1238,8 @@ bool InterInstruction::RemoveUnusedResultInstructions(InterInstruction* pre, Num
mCode = IC_NONE;
mDst.mTemp = -1;
mSrc[0].mTemp = -1;
mSrc[1].mTemp = -1;
mSrc[2].mTemp = -1;
for (int i = 0; i < mNumOperands; i++)
mSrc[i].mTemp = -1;
changed = true;
}
@ -1246,9 +1251,8 @@ bool InterInstruction::RemoveUnusedResultInstructions(InterInstruction* pre, Num
{
mCode = IC_NONE;
mDst.mTemp = -1;
mSrc[0].mTemp = -1;
mSrc[1].mTemp = -1;
mSrc[2].mTemp = -1;
for (int i = 0; i < mNumOperands; i++)
mSrc[i].mTemp = -1;
changed = true;
}
@ -1263,13 +1267,15 @@ bool InterInstruction::RemoveUnusedResultInstructions(InterInstruction* pre, Num
requiredTemps -= mDst.mTemp;
}
if (mSrc[0].mTemp >= 0) mSrc[0].mFinal = !requiredTemps[mSrc[0].mTemp] && mSrc[0].mTemp >= numStaticTemps;
if (mSrc[1].mTemp >= 0) mSrc[1].mFinal = !requiredTemps[mSrc[1].mTemp] && mSrc[1].mTemp >= numStaticTemps;
if (mSrc[2].mTemp >= 0) mSrc[2].mFinal = !requiredTemps[mSrc[2].mTemp] && mSrc[2].mTemp >= numStaticTemps;
for (int i = 0; i < mNumOperands; i++)
{
if (mSrc[i].mTemp >= 0) mSrc[i].mFinal = !requiredTemps[mSrc[i].mTemp] && mSrc[i].mTemp >= numStaticTemps;
}
if (mSrc[0].mTemp >= 0) requiredTemps += mSrc[0].mTemp;
if (mSrc[1].mTemp >= 0) requiredTemps += mSrc[1].mTemp;
if (mSrc[2].mTemp >= 0) requiredTemps += mSrc[2].mTemp;
for (int i = 0; i < mNumOperands; i++)
{
if (mSrc[i].mTemp >= 0) requiredTemps += mSrc[i].mTemp;
}
return changed;
}
@ -1282,9 +1288,8 @@ void InterInstruction::BuildCallerSaveTempSet(NumberSet& requiredTemps, NumberSe
if (mCode == IC_CALL || mCode == IC_CALL_NATIVE)
callerSaveTemps |= requiredTemps;
if (mSrc[0].mTemp >= 0) requiredTemps += mSrc[0].mTemp;
if (mSrc[1].mTemp >= 0) requiredTemps += mSrc[1].mTemp;
if (mSrc[2].mTemp >= 0) requiredTemps += mSrc[2].mTemp;
for (int i = 0; i < mNumOperands; i++)
if (mSrc[i].mTemp >= 0) requiredTemps += mSrc[i].mTemp;
}
bool InterInstruction::RemoveUnusedStoreInstructions(const GrowingVariableArray& localVars, NumberSet& requiredTemps)
@ -1320,6 +1325,14 @@ bool InterInstruction::RemoveUnusedStoreInstructions(const GrowingVariableArray&
return changed;
}
bool InterInstruction::UsesTemp(int temp) const
{
for (int i = 0; i < mNumOperands; i++)
if (mSrc[i].mTemp == temp)
return true;
return false;
}
static void DestroySourceValues(int temp, GrowingInstructionPtrArray& tvalue, FastNumberSet& tvalid)
{
int i, j;
@ -1334,7 +1347,7 @@ static void DestroySourceValues(int temp, GrowingInstructionPtrArray& tvalue, Fa
ins = tvalue[j];
if (ins->mSrc[0].mTemp == temp || ins->mSrc[1].mTemp == temp || ins->mSrc[2].mTemp == temp)
if (ins->UsesTemp(temp))
{
tvalue[j] = NULL;
tvalid -= j;
@ -1369,9 +1382,8 @@ void InterInstruction::PerformValueForwarding(GrowingInstructionPtrArray& tvalue
void InterInstruction::LocalRenameRegister(GrowingIntArray& renameTable, int& num, int fixed)
{
if (mSrc[0].mTemp >= 0) mSrc[0].mTemp = renameTable[mSrc[0].mTemp];
if (mSrc[1].mTemp >= 0) mSrc[1].mTemp = renameTable[mSrc[1].mTemp];
if (mSrc[2].mTemp >= 0) mSrc[2].mTemp = renameTable[mSrc[2].mTemp];
for (int i = 0; i < mNumOperands; i++)
if (mSrc[i].mTemp >= 0) mSrc[i].mTemp = renameTable[mSrc[i].mTemp];
if (mDst.mTemp >= fixed)
{
@ -1386,9 +1398,8 @@ void InterInstruction::LocalRenameRegister(GrowingIntArray& renameTable, int& nu
void InterInstruction::GlobalRenameRegister(const GrowingIntArray& renameTable, GrowingTypeArray& temporaries)
{
if (mSrc[0].mTemp >= 0) mSrc[0].mTemp = renameTable[mSrc[0].mTemp];
if (mSrc[1].mTemp >= 0) mSrc[1].mTemp = renameTable[mSrc[1].mTemp];
if (mSrc[2].mTemp >= 0) mSrc[2].mTemp = renameTable[mSrc[2].mTemp];
for (int i = 0; i < mNumOperands; i++)
if (mSrc[i].mTemp >= 0) mSrc[i].mTemp = renameTable[mSrc[i].mTemp];
if (mDst.mTemp >= 0)
{
@ -1429,16 +1440,14 @@ void InterInstruction::BuildCollisionTable(NumberSet& liveTemps, NumberSet* coll
liveTemps -= mDst.mTemp;
}
UpdateCollisionSet(liveTemps, collisionSets, mSrc[0].mTemp);
UpdateCollisionSet(liveTemps, collisionSets, mSrc[1].mTemp);
UpdateCollisionSet(liveTemps, collisionSets, mSrc[2].mTemp);
for (int i = 0; i < mNumOperands; i++)
UpdateCollisionSet(liveTemps, collisionSets, mSrc[i].mTemp);
}
void InterInstruction::ReduceTemporaries(const GrowingIntArray& renameTable, GrowingTypeArray& temporaries)
{
if (mSrc[0].mTemp >= 0) mSrc[0].mTemp = renameTable[mSrc[0].mTemp];
if (mSrc[1].mTemp >= 0) mSrc[1].mTemp = renameTable[mSrc[1].mTemp];
if (mSrc[2].mTemp >= 0) mSrc[2].mTemp = renameTable[mSrc[2].mTemp];
for (int i = 0; i < mNumOperands; i++)
if (mSrc[i].mTemp >= 0) mSrc[i].mTemp = renameTable[mSrc[i].mTemp];
if (mDst.mTemp >= 0)
{
@ -1451,9 +1460,8 @@ void InterInstruction::ReduceTemporaries(const GrowingIntArray& renameTable, Gro
void InterInstruction::CollectActiveTemporaries(FastNumberSet& set)
{
if (mDst.mTemp >= 0) set += mDst.mTemp;
if (mSrc[0].mTemp >= 0) set += mSrc[0].mTemp;
if (mSrc[1].mTemp >= 0) set += mSrc[1].mTemp;
if (mSrc[2].mTemp >= 0) set += mSrc[2].mTemp;
for (int i = 0; i < mNumOperands; i++)
if (mSrc[i].mTemp >= 0) set += mSrc[i].mTemp;
}
void InterInstruction::ShrinkActiveTemporaries(FastNumberSet& set, GrowingTypeArray& temporaries)
@ -1463,9 +1471,8 @@ void InterInstruction::ShrinkActiveTemporaries(FastNumberSet& set, GrowingTypeAr
mDst.mTemp = set.Index(mDst.mTemp);
temporaries[mDst.mTemp] = mDst.mType;
}
if (mSrc[0].mTemp >= 0) mSrc[0].mTemp = set.Index(mSrc[0].mTemp);
if (mSrc[1].mTemp >= 0) mSrc[1].mTemp = set.Index(mSrc[1].mTemp);
if (mSrc[2].mTemp >= 0) mSrc[2].mTemp = set.Index(mSrc[2].mTemp);
for (int i = 0; i < mNumOperands; i++)
if (mSrc[i].mTemp >= 0) mSrc[i].mTemp = set.Index(mSrc[i].mTemp);
}
void InterInstruction::CollectSimpleLocals(FastNumberSet& complexLocals, FastNumberSet& simpleLocals, GrowingTypeArray& localTypes, FastNumberSet& complexParams, FastNumberSet& simpleParams, GrowingTypeArray& paramTypes)
@ -1650,6 +1657,7 @@ void InterInstruction::Disassemble(FILE* file)
fprintf(file, "\t");
if (mDst.mTemp >= 0) fprintf(file, "R%d(%c)", mDst.mTemp, typechars[mDst.mType]);
fprintf(file, "\t<-\t");
if (mSrc[2].mTemp >= 0) fprintf(file, "R%d(%c%c), ", mSrc[2].mTemp, typechars[mSrc[2].mType], mSrc[2].mFinal ? 'F' : '-');
if (mSrc[1].mTemp >= 0)
fprintf(file, "R%d(%c%c), ", mSrc[1].mTemp, typechars[mSrc[1].mType], mSrc[1].mFinal ? 'F' : '-');
@ -3257,7 +3265,7 @@ static bool CanBypassLoad(const InterInstruction * lins, const InterInstruction
return false;
// True data dependency
if (lins->mDst.mTemp == bins->mSrc[0].mTemp || lins->mDst.mTemp == bins->mSrc[1].mTemp || lins->mDst.mTemp == bins->mSrc[2].mTemp)
if (bins->UsesTemp(lins->mDst.mTemp))
return false;
// False data dependency
@ -3428,9 +3436,10 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
{
if (dep[t] < DEP_VARIABLE)
{
if (ins->mSrc[0].mTemp >= 0 && dep[ins->mSrc[0].mTemp] >= DEP_ITERATED ||
ins->mSrc[1].mTemp >= 0 && dep[ins->mSrc[1].mTemp] >= DEP_ITERATED ||
ins->mSrc[2].mTemp >= 0 && dep[ins->mSrc[2].mTemp] >= DEP_ITERATED)
int j = 0;
while (j < ins->mNumOperands && !(ins->mSrc[j].mTemp >= 0 && dep[ins->mSrc[j].mTemp] >= DEP_ITERATED))
j++;
if (j < ins->mNumOperands)
{
dep[t] = DEP_VARIABLE;
ins->mInvariant = false;
@ -3626,10 +3635,7 @@ void InterCodeBasicBlock::PeepholeOptimization(void)
int k = i + 1;
while (k + 2 < mInstructions.Size() &&
mInstructions[k + 1]->mCode != IC_RELATIONAL_OPERATOR &&
mInstructions[k + 1]->mSrc[0].mTemp != ttemp &&
mInstructions[k + 1]->mSrc[1].mTemp != ttemp &&
mInstructions[k + 1]->mSrc[2].mTemp != ttemp &&
mInstructions[k + 1]->mDst.mTemp != ttemp)
!mInstructions[k + 1]->ReferencesTemp(ttemp))
{
mInstructions[k] = mInstructions[k + 1];
k++;

View File

@ -303,11 +303,11 @@ class InterInstruction
{
public:
InterCode mCode;
InterOperand mSrc[3];
InterOperand mSrc[8];
InterOperand mDst;
InterMemory mMemory;
InterOperator mOperator;
int mOperandSize;
int mOperandSize, mNumOperands;
int mVarIndex;
int64 mIntValue;
double mFloatValue;
@ -318,6 +318,9 @@ public:
InterInstruction(void);
bool ReferencesTemp(int temp) const;
bool UsesTemp(int temp) const;
void SetCode(const Location & loc, InterCode code);
void CollectLocalAddressTemps(GrowingIntArray& localTable, GrowingIntArray& paramTable);