aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFICTURE7 <FICTURE7@gmail.com>2020-09-01 03:55:15 +0400
committerGitHub <noreply@github.com>2020-08-31 20:55:15 -0300
commit92f7f163ef0ad3d7a542460a5500074188a9d8b1 (patch)
treeaf8ffef472615946d3041263ed6d85568bc971f3
parent2cb8bd7006e6e22798a6e44881f3e03d2fe637c5 (diff)
Improve static branch prediction along fast path for memory accesses (#1484)
* Improve static branch prediction along fast path for memory accesses * Set PPTC interval version
-rw-r--r--ARMeilleure/Instructions/InstEmitMemoryHelper.cs86
-rw-r--r--ARMeilleure/Translation/PTC/Ptc.cs2
2 files changed, 38 insertions, 50 deletions
diff --git a/ARMeilleure/Instructions/InstEmitMemoryHelper.cs b/ARMeilleure/Instructions/InstEmitMemoryHelper.cs
index 9b6476dd..91227bc5 100644
--- a/ARMeilleure/Instructions/InstEmitMemoryHelper.cs
+++ b/ARMeilleure/Instructions/InstEmitMemoryHelper.cs
@@ -124,21 +124,12 @@ namespace ARMeilleure.Instructions
private static void EmitReadInt(ArmEmitterContext context, Operand address, int rt, int size)
{
- Operand isUnalignedAddr = EmitAddressCheck(context, address, size);
-
- Operand lblFastPath = Label();
Operand lblSlowPath = Label();
Operand lblEnd = Label();
- context.BranchIfFalse(lblFastPath, isUnalignedAddr);
-
- context.MarkLabel(lblSlowPath);
-
- EmitReadIntFallback(context, address, rt, size);
-
- context.Branch(lblEnd);
+ Operand isUnalignedAddr = EmitAddressCheck(context, address, size);
- context.MarkLabel(lblFastPath);
+ context.BranchIfTrue(lblSlowPath, isUnalignedAddr);
Operand physAddr = EmitPtPointerLoad(context, address, lblSlowPath, write: false);
@@ -154,6 +145,12 @@ namespace ARMeilleure.Instructions
SetInt(context, rt, value);
+ context.Branch(lblEnd);
+
+ context.MarkLabel(lblSlowPath);
+
+ EmitReadIntFallback(context, address, rt, size);
+
context.MarkLabel(lblEnd);
}
@@ -195,21 +192,12 @@ namespace ARMeilleure.Instructions
int elem,
int size)
{
- Operand isUnalignedAddr = EmitAddressCheck(context, address, size);
-
- Operand lblFastPath = Label();
Operand lblSlowPath = Label();
Operand lblEnd = Label();
- context.BranchIfFalse(lblFastPath, isUnalignedAddr);
-
- context.MarkLabel(lblSlowPath);
-
- EmitReadVectorFallback(context, address, vector, rt, elem, size);
-
- context.Branch(lblEnd);
+ Operand isUnalignedAddr = EmitAddressCheck(context, address, size);
- context.MarkLabel(lblFastPath);
+ context.BranchIfTrue(lblSlowPath, isUnalignedAddr);
Operand physAddr = EmitPtPointerLoad(context, address, lblSlowPath, write: false);
@@ -226,6 +214,12 @@ namespace ARMeilleure.Instructions
context.Copy(GetVec(rt), value);
+ context.Branch(lblEnd);
+
+ context.MarkLabel(lblSlowPath);
+
+ EmitReadVectorFallback(context, address, vector, rt, elem, size);
+
context.MarkLabel(lblEnd);
}
@@ -236,21 +230,12 @@ namespace ARMeilleure.Instructions
private static void EmitWriteInt(ArmEmitterContext context, Operand address, int rt, int size)
{
- Operand isUnalignedAddr = EmitAddressCheck(context, address, size);
-
- Operand lblFastPath = Label();
Operand lblSlowPath = Label();
Operand lblEnd = Label();
- context.BranchIfFalse(lblFastPath, isUnalignedAddr);
-
- context.MarkLabel(lblSlowPath);
-
- EmitWriteIntFallback(context, address, rt, size);
-
- context.Branch(lblEnd);
+ Operand isUnalignedAddr = EmitAddressCheck(context, address, size);
- context.MarkLabel(lblFastPath);
+ context.BranchIfTrue(lblSlowPath, isUnalignedAddr);
Operand physAddr = EmitPtPointerLoad(context, address, lblSlowPath, write: true);
@@ -269,6 +254,12 @@ namespace ARMeilleure.Instructions
case 3: context.Store (physAddr, value); break;
}
+ context.Branch(lblEnd);
+
+ context.MarkLabel(lblSlowPath);
+
+ EmitWriteIntFallback(context, address, rt, size);
+
context.MarkLabel(lblEnd);
}
@@ -318,21 +309,12 @@ namespace ARMeilleure.Instructions
int elem,
int size)
{
- Operand isUnalignedAddr = EmitAddressCheck(context, address, size);
-
- Operand lblFastPath = Label();
Operand lblSlowPath = Label();
Operand lblEnd = Label();
- context.BranchIfFalse(lblFastPath, isUnalignedAddr);
-
- context.MarkLabel(lblSlowPath);
-
- EmitWriteVectorFallback(context, address, rt, elem, size);
-
- context.Branch(lblEnd);
+ Operand isUnalignedAddr = EmitAddressCheck(context, address, size);
- context.MarkLabel(lblFastPath);
+ context.BranchIfTrue(lblSlowPath, isUnalignedAddr);
Operand physAddr = EmitPtPointerLoad(context, address, lblSlowPath, write: true);
@@ -340,13 +322,19 @@ namespace ARMeilleure.Instructions
switch (size)
{
- case 0: context.Store8 (physAddr, context.VectorExtract8(value, elem)); break;
- case 1: context.Store16(physAddr, context.VectorExtract16(value, elem)); break;
- case 2: context.Store (physAddr, context.VectorExtract(OperandType.FP32, value, elem)); break;
- case 3: context.Store (physAddr, context.VectorExtract(OperandType.FP64, value, elem)); break;
- case 4: context.Store (physAddr, value); break;
+ case 0: context.Store8 (physAddr, context.VectorExtract8(value, elem)); break;
+ case 1: context.Store16(physAddr, context.VectorExtract16(value, elem)); break;
+ case 2: context.Store (physAddr, context.VectorExtract(OperandType.I32, value, elem)); break;
+ case 3: context.Store (physAddr, context.VectorExtract(OperandType.I64, value, elem)); break;
+ case 4: context.Store (physAddr, value); break;
}
+ context.Branch(lblEnd);
+
+ context.MarkLabel(lblSlowPath);
+
+ EmitWriteVectorFallback(context, address, rt, elem, size);
+
context.MarkLabel(lblEnd);
}
diff --git a/ARMeilleure/Translation/PTC/Ptc.cs b/ARMeilleure/Translation/PTC/Ptc.cs
index c6069d88..cfac570e 100644
--- a/ARMeilleure/Translation/PTC/Ptc.cs
+++ b/ARMeilleure/Translation/PTC/Ptc.cs
@@ -21,7 +21,7 @@ namespace ARMeilleure.Translation.PTC
{
private const string HeaderMagic = "PTChd";
- private const int InternalVersion = 1471; //! To be incremented manually for each change to the ARMeilleure project.
+ private const int InternalVersion = 1484; //! To be incremented manually for each change to the ARMeilleure project.
private const string ActualDir = "0";
private const string BackupDir = "1";