Browse Source
[dynarmic, macroHLE] Use faster ankerl for xbyak maps (#3716)
[dynarmic, macroHLE] Use faster ankerl for xbyak maps (#3716)
the nominal std::unordered_map<> isn't enough to warrant it's continued usage in xbyak internal structures, thus using ankerl should greatly remove a lot of indirection/stdc++ specific overhead from the usually poorly performant std::unordered_map Both dynarmic and macroHLE should benefit greatly from a less-stupid unordered_dense This should speedup both CPU and shader compilation latency (NOT BY A GREAT MARGIN) just enough to make loading zones in ToTK less horrific Signed-off-by: lizzie <lizzie@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3716 Reviewed-by: crueter <crueter@eden-emu.dev>lizzie/stable-shader-pools
committed by
crueter
No known key found for this signature in database
GPG Key ID: 425ACD2D4830EBC6
11 changed files with 93 additions and 95 deletions
-
3src/common/CMakeLists.txt
-
72src/common/x64/xbyak.h
-
46src/common/x64/xbyak_util.h
-
4src/dynarmic/src/dynarmic/backend/x64/a64_emit_x64.cpp
-
10src/dynarmic/src/dynarmic/backend/x64/abi.cpp
-
10src/dynarmic/src/dynarmic/backend/x64/constant_pool.cpp
-
2src/dynarmic/src/dynarmic/backend/x64/hostloc.h
-
14src/dynarmic/src/dynarmic/backend/x64/xbyak.h
-
6src/dynarmic/src/dynarmic/common/fp/op/FPToFixed.cpp
-
5src/dynarmic/tests/x64_cpu_info.cpp
-
16src/video_core/macro.cpp
@ -1,46 +0,0 @@ |
|||
// SPDX-FileCopyrightText: 2016 Citra Emulator Project |
|||
// SPDX-License-Identifier: GPL-2.0-or-later |
|||
|
|||
#pragma once |
|||
|
|||
#include <type_traits> |
|||
#include <xbyak/xbyak.h> |
|||
#include "common/x64/xbyak_abi.h" |
|||
|
|||
namespace Common::X64 { |
|||
|
|||
// Constants for use with cmpps/cmpss |
|||
enum { |
|||
CMP_EQ = 0, |
|||
CMP_LT = 1, |
|||
CMP_LE = 2, |
|||
CMP_UNORD = 3, |
|||
CMP_NEQ = 4, |
|||
CMP_NLT = 5, |
|||
CMP_NLE = 6, |
|||
CMP_ORD = 7, |
|||
}; |
|||
|
|||
constexpr bool IsWithin2G(uintptr_t ref, uintptr_t target) { |
|||
const u64 distance = target - (ref + 5); |
|||
return !(distance >= 0x8000'0000ULL && distance <= ~0x8000'0000ULL); |
|||
} |
|||
|
|||
inline bool IsWithin2G(const Xbyak::CodeGenerator& code, uintptr_t target) { |
|||
return IsWithin2G(reinterpret_cast<uintptr_t>(code.getCurr()), target); |
|||
} |
|||
|
|||
template <typename T> |
|||
inline void CallFarFunction(Xbyak::CodeGenerator& code, const T f) { |
|||
static_assert(std::is_pointer_v<T>, "Argument must be a (function) pointer."); |
|||
size_t addr = reinterpret_cast<size_t>(f); |
|||
if (IsWithin2G(code, addr)) { |
|||
code.call(f); |
|||
} else { |
|||
// ABI_RETURN is a safe temp register to use before a call |
|||
code.mov(ABI_RETURN, addr); |
|||
code.call(ABI_RETURN); |
|||
} |
|||
} |
|||
|
|||
} // namespace Common::X64 |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue