From 448cbc8e3d434dc1281c28cd3698b442edd12d50 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Wed, 30 Jun 2021 22:03:05 -0400 Subject: [PATCH] Arm64: Use regular function pointers with CAS handling functions Given these are called in a loop repeatedly, where we know we'll always have a set function to call, std::function adds a little bit of overhead. --- .../Interface/Core/ArchHelpers/Arm64.cpp | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/External/FEXCore/Source/Interface/Core/ArchHelpers/Arm64.cpp b/External/FEXCore/Source/Interface/Core/ArchHelpers/Arm64.cpp index 9e6f35ef2..ac310b66d 100644 --- a/External/FEXCore/Source/Interface/Core/ArchHelpers/Arm64.cpp +++ b/External/FEXCore/Source/Interface/Core/ArchHelpers/Arm64.cpp @@ -221,13 +221,18 @@ bool HandleCASPAL(void *_ucontext, void *_info, uint32_t Instr) { return false; } +template +using CASExpectedFn = T (*)(T Src, T Expected); +template +using CASDesiredFn = T (*)(T Src, T Desired); + static std::tuple DoCAS16( uint16_t DesiredSrc, uint16_t ExpectedSrc, uint64_t Addr, - std::function ExpectedFunction, - std::function DesiredFunction) { + CASExpectedFn ExpectedFunction, + CASDesiredFn DesiredFunction) { // 16 bit uint64_t AlignmentMask = 0b1111; if ((Addr & AlignmentMask) == 15) { @@ -476,8 +481,8 @@ std::tuple DoCAS32( uint32_t DesiredSrc, uint32_t ExpectedSrc, uint64_t Addr, - std::function ExpectedFunction, - std::function DesiredFunction) { + CASExpectedFn ExpectedFunction, + CASDesiredFn DesiredFunction) { // 32 bit uint64_t AlignmentMask = 0b1111; if ((Addr & AlignmentMask) > 12) { @@ -683,8 +688,8 @@ std::tuple DoCAS64( uint64_t DesiredSrc, uint64_t ExpectedSrc, uint64_t Addr, - std::function ExpectedFunction, - std::function DesiredFunction) { + CASExpectedFn ExpectedFunction, + CASDesiredFn DesiredFunction) { // 64bit uint64_t AlignmentMask = 0b1111; if ((Addr & AlignmentMask) > 8) { @@ -964,7 +969,7 @@ bool HandleAtomicMemOp(void *_ucontext, void *_info, uint32_t Instr) { return Desired; }; - std::function DesiredFunction; + CASDesiredFn DesiredFunction{}; switch (Op) { case ATOMIC_ADD_OP: @@ -1031,7 +1036,7 @@ bool HandleAtomicMemOp(void *_ucontext, void *_info, uint32_t Instr) { return Desired; }; - std::function DesiredFunction; + CASDesiredFn DesiredFunction{}; switch (Op) { case ATOMIC_ADD_OP: @@ -1098,7 +1103,7 @@ bool HandleAtomicMemOp(void *_ucontext, void *_info, uint32_t Instr) { return Desired; }; - std::function DesiredFunction; + CASDesiredFn DesiredFunction{}; switch (Op) { case ATOMIC_ADD_OP: