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