Browse Source
[dynarmic, macroHLE] Use faster ankerl for xbyak maps
[dynarmic, macroHLE] Use faster ankerl for xbyak maps
Signed-off-by: lizzie <lizzie@eden-emu.dev>lizzie/dynarmic-faster-xbyak
10 changed files with 91 additions and 97 deletions
-
69src/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
-
14src/dynarmic/src/dynarmic/backend/x64/constant_pool.cpp
-
2src/dynarmic/src/dynarmic/backend/x64/hostloc.h
-
14src/dynarmic/src/dynarmic/backend/x64/xbyak.h
-
8src/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