From 92f7f163ef0ad3d7a542460a5500074188a9d8b1 Mon Sep 17 00:00:00 2001 From: FICTURE7 Date: Tue, 1 Sep 2020 03:55:15 +0400 Subject: [PATCH] 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 --- .../Instructions/InstEmitMemoryHelper.cs | 86 ++++++++----------- ARMeilleure/Translation/PTC/Ptc.cs | 2 +- 2 files changed, 38 insertions(+), 50 deletions(-) diff --git a/ARMeilleure/Instructions/InstEmitMemoryHelper.cs b/ARMeilleure/Instructions/InstEmitMemoryHelper.cs index 9b6476ddf1..91227bc59f 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); + Operand isUnalignedAddr = EmitAddressCheck(context, address, size); - context.MarkLabel(lblSlowPath); - - EmitReadIntFallback(context, address, rt, size); - - context.Branch(lblEnd); - - 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); + Operand isUnalignedAddr = EmitAddressCheck(context, address, size); - context.MarkLabel(lblSlowPath); - - EmitReadVectorFallback(context, address, vector, rt, elem, size); - - context.Branch(lblEnd); - - 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); + Operand isUnalignedAddr = EmitAddressCheck(context, address, size); - context.MarkLabel(lblSlowPath); - - EmitWriteIntFallback(context, address, rt, size); - - context.Branch(lblEnd); - - 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); + Operand isUnalignedAddr = EmitAddressCheck(context, address, size); - context.MarkLabel(lblSlowPath); - - EmitWriteVectorFallback(context, address, rt, elem, size); - - context.Branch(lblEnd); - - 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 c6069d8879..cfac570ee9 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";