aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/Translation/EmitterContext.cs
diff options
context:
space:
mode:
authorFICTURE7 <FICTURE7@gmail.com>2020-09-20 03:00:24 +0400
committerGitHub <noreply@github.com>2020-09-19 20:00:24 -0300
commitf60033e0aaf546d7f56a4925b5aeec76709fb851 (patch)
treeaf6585403754a771dbab824b1739322ef04b3cd8 /ARMeilleure/Translation/EmitterContext.cs
parent1eea35554c7505dbf521cf9f3cfeeaa0fc7e916f (diff)
Implement block placement (#1549)
* Implement block placement Implement a simple pass which re-orders cold blocks at the end of the list of blocks in the CFG. * Set PPTC version * Use Array.Resize Address gdkchan's feedback
Diffstat (limited to 'ARMeilleure/Translation/EmitterContext.cs')
-rw-r--r--ARMeilleure/Translation/EmitterContext.cs27
1 files changed, 17 insertions, 10 deletions
diff --git a/ARMeilleure/Translation/EmitterContext.cs b/ARMeilleure/Translation/EmitterContext.cs
index 2261fb87..d85a502b 100644
--- a/ARMeilleure/Translation/EmitterContext.cs
+++ b/ARMeilleure/Translation/EmitterContext.cs
@@ -20,6 +20,7 @@ namespace ARMeilleure.Translation
private BasicBlock _ifBlock;
private bool _needsNewBlock;
+ private BasicBlockFrequency _nextBlockFreq;
public EmitterContext()
{
@@ -27,6 +28,7 @@ namespace ARMeilleure.Translation
_irBlocks = new IntrusiveList<BasicBlock>();
_needsNewBlock = true;
+ _nextBlockFreq = BasicBlockFrequency.Default;
}
public Operand Add(Operand op1, Operand op2)
@@ -58,24 +60,24 @@ namespace ARMeilleure.Translation
{
NewNextBlockIfNeeded();
- BranchToLabel(label, uncond: true);
+ BranchToLabel(label, uncond: true, BasicBlockFrequency.Default);
}
- public void BranchIf(Operand label, Operand op1, Operand op2, Comparison comp)
+ public void BranchIf(Operand label, Operand op1, Operand op2, Comparison comp, BasicBlockFrequency falseFreq = default)
{
Add(Instruction.BranchIf, null, op1, op2, Const((int)comp));
- BranchToLabel(label, uncond: false);
+ BranchToLabel(label, uncond: false, falseFreq);
}
- public void BranchIfFalse(Operand label, Operand op1)
+ public void BranchIfFalse(Operand label, Operand op1, BasicBlockFrequency falseFreq = default)
{
- BranchIf(label, op1, Const(op1.Type, 0), Comparison.Equal);
+ BranchIf(label, op1, Const(op1.Type, 0), Comparison.Equal, falseFreq);
}
- public void BranchIfTrue(Operand label, Operand op1)
+ public void BranchIfTrue(Operand label, Operand op1, BasicBlockFrequency falseFreq = default)
{
- BranchIf(label, op1, Const(op1.Type, 0), Comparison.NotEqual);
+ BranchIf(label, op1, Const(op1.Type, 0), Comparison.NotEqual, falseFreq);
}
public Operand ByteSwap(Operand op1)
@@ -582,7 +584,7 @@ namespace ARMeilleure.Translation
return dest;
}
- private void BranchToLabel(Operand label, bool uncond)
+ private void BranchToLabel(Operand label, bool uncond, BasicBlockFrequency nextFreq)
{
if (!_irLabels.TryGetValue(label, out BasicBlock branchBlock))
{
@@ -602,10 +604,13 @@ namespace ARMeilleure.Translation
}
_needsNewBlock = true;
+ _nextBlockFreq = nextFreq;
}
- public void MarkLabel(Operand label)
+ public void MarkLabel(Operand label, BasicBlockFrequency nextFreq = default)
{
+ _nextBlockFreq = nextFreq;
+
if (_irLabels.TryGetValue(label, out BasicBlock nextBlock))
{
nextBlock.Index = _irBlocks.Count;
@@ -633,7 +638,7 @@ namespace ARMeilleure.Translation
private void NextBlock(BasicBlock nextBlock)
{
- if (_irBlock != null && _irBlock.SuccessorCount == 0 && !EndsWithUnconditional(_irBlock))
+ if (_irBlock?.SuccessorCount == 0 && !EndsWithUnconditional(_irBlock))
{
_irBlock.AddSuccessor(nextBlock);
@@ -646,8 +651,10 @@ namespace ARMeilleure.Translation
}
_irBlock = nextBlock;
+ _irBlock.Frequency = _nextBlockFreq;
_needsNewBlock = false;
+ _nextBlockFreq = BasicBlockFrequency.Default;
}
private static bool EndsWithUnconditional(BasicBlock block)