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
This commit is contained in:
FICTURE7 2020-09-01 03:55:15 +04:00 committed by GitHub
parent 2cb8bd7006
commit 92f7f163ef
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 50 deletions

View file

@ -124,21 +124,12 @@ namespace ARMeilleure.Instructions
private static void EmitReadInt(ArmEmitterContext context, Operand address, int rt, int size) 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 lblSlowPath = Label();
Operand lblEnd = Label(); Operand lblEnd = Label();
context.BranchIfFalse(lblFastPath, isUnalignedAddr); Operand isUnalignedAddr = EmitAddressCheck(context, address, size);
context.MarkLabel(lblSlowPath); context.BranchIfTrue(lblSlowPath, isUnalignedAddr);
EmitReadIntFallback(context, address, rt, size);
context.Branch(lblEnd);
context.MarkLabel(lblFastPath);
Operand physAddr = EmitPtPointerLoad(context, address, lblSlowPath, write: false); Operand physAddr = EmitPtPointerLoad(context, address, lblSlowPath, write: false);
@ -154,6 +145,12 @@ namespace ARMeilleure.Instructions
SetInt(context, rt, value); SetInt(context, rt, value);
context.Branch(lblEnd);
context.MarkLabel(lblSlowPath);
EmitReadIntFallback(context, address, rt, size);
context.MarkLabel(lblEnd); context.MarkLabel(lblEnd);
} }
@ -195,21 +192,12 @@ namespace ARMeilleure.Instructions
int elem, int elem,
int size) int size)
{ {
Operand isUnalignedAddr = EmitAddressCheck(context, address, size);
Operand lblFastPath = Label();
Operand lblSlowPath = Label(); Operand lblSlowPath = Label();
Operand lblEnd = Label(); Operand lblEnd = Label();
context.BranchIfFalse(lblFastPath, isUnalignedAddr); Operand isUnalignedAddr = EmitAddressCheck(context, address, size);
context.MarkLabel(lblSlowPath); context.BranchIfTrue(lblSlowPath, isUnalignedAddr);
EmitReadVectorFallback(context, address, vector, rt, elem, size);
context.Branch(lblEnd);
context.MarkLabel(lblFastPath);
Operand physAddr = EmitPtPointerLoad(context, address, lblSlowPath, write: false); Operand physAddr = EmitPtPointerLoad(context, address, lblSlowPath, write: false);
@ -226,6 +214,12 @@ namespace ARMeilleure.Instructions
context.Copy(GetVec(rt), value); context.Copy(GetVec(rt), value);
context.Branch(lblEnd);
context.MarkLabel(lblSlowPath);
EmitReadVectorFallback(context, address, vector, rt, elem, size);
context.MarkLabel(lblEnd); context.MarkLabel(lblEnd);
} }
@ -236,21 +230,12 @@ namespace ARMeilleure.Instructions
private static void EmitWriteInt(ArmEmitterContext context, Operand address, int rt, int size) 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 lblSlowPath = Label();
Operand lblEnd = Label(); Operand lblEnd = Label();
context.BranchIfFalse(lblFastPath, isUnalignedAddr); Operand isUnalignedAddr = EmitAddressCheck(context, address, size);
context.MarkLabel(lblSlowPath); context.BranchIfTrue(lblSlowPath, isUnalignedAddr);
EmitWriteIntFallback(context, address, rt, size);
context.Branch(lblEnd);
context.MarkLabel(lblFastPath);
Operand physAddr = EmitPtPointerLoad(context, address, lblSlowPath, write: true); Operand physAddr = EmitPtPointerLoad(context, address, lblSlowPath, write: true);
@ -269,6 +254,12 @@ namespace ARMeilleure.Instructions
case 3: context.Store (physAddr, value); break; case 3: context.Store (physAddr, value); break;
} }
context.Branch(lblEnd);
context.MarkLabel(lblSlowPath);
EmitWriteIntFallback(context, address, rt, size);
context.MarkLabel(lblEnd); context.MarkLabel(lblEnd);
} }
@ -318,21 +309,12 @@ namespace ARMeilleure.Instructions
int elem, int elem,
int size) int size)
{ {
Operand isUnalignedAddr = EmitAddressCheck(context, address, size);
Operand lblFastPath = Label();
Operand lblSlowPath = Label(); Operand lblSlowPath = Label();
Operand lblEnd = Label(); Operand lblEnd = Label();
context.BranchIfFalse(lblFastPath, isUnalignedAddr); Operand isUnalignedAddr = EmitAddressCheck(context, address, size);
context.MarkLabel(lblSlowPath); context.BranchIfTrue(lblSlowPath, isUnalignedAddr);
EmitWriteVectorFallback(context, address, rt, elem, size);
context.Branch(lblEnd);
context.MarkLabel(lblFastPath);
Operand physAddr = EmitPtPointerLoad(context, address, lblSlowPath, write: true); Operand physAddr = EmitPtPointerLoad(context, address, lblSlowPath, write: true);
@ -340,13 +322,19 @@ namespace ARMeilleure.Instructions
switch (size) switch (size)
{ {
case 0: context.Store8 (physAddr, context.VectorExtract8(value, elem)); break; case 0: context.Store8 (physAddr, context.VectorExtract8(value, elem)); break;
case 1: context.Store16(physAddr, context.VectorExtract16(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 2: context.Store (physAddr, context.VectorExtract(OperandType.I32, value, elem)); break;
case 3: context.Store (physAddr, context.VectorExtract(OperandType.FP64, value, elem)); break; case 3: context.Store (physAddr, context.VectorExtract(OperandType.I64, value, elem)); break;
case 4: context.Store (physAddr, value); break; case 4: context.Store (physAddr, value); break;
} }
context.Branch(lblEnd);
context.MarkLabel(lblSlowPath);
EmitWriteVectorFallback(context, address, rt, elem, size);
context.MarkLabel(lblEnd); context.MarkLabel(lblEnd);
} }

View file

@ -21,7 +21,7 @@ namespace ARMeilleure.Translation.PTC
{ {
private const string HeaderMagic = "PTChd"; 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 ActualDir = "0";
private const string BackupDir = "1"; private const string BackupDir = "1";