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

View File

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