Prepare more than 3 operands per inter instruction
This commit is contained in:
parent
15743d3115
commit
df152c2f9b
|
@ -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++;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue