forked from Mirror/Ryujinx
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:
parent
2cb8bd7006
commit
92f7f163ef
2 changed files with 38 additions and 50 deletions
|
@ -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);
|
||||||
|
|
||||||
|
@ -342,11 +324,17 @@ namespace ARMeilleure.Instructions
|
||||||
{
|
{
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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";
|
||||||
|
|
Loading…
Reference in a new issue