mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-04-23 15:53:59 +00:00
GENTOOO; also addressFrame can be constructible via copy
This commit is contained in:
parent
f6c2c0e75a
commit
7fb80fdff7
13
.patch/xbyak/0002-address-frame-ctor.patch
Normal file
13
.patch/xbyak/0002-address-frame-ctor.patch
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
diff --git a/xbyak/xbyak.h b/xbyak/xbyak.h
|
||||
index 176ee58..b44d62a 100644
|
||||
--- a/xbyak/xbyak.h
|
||||
+++ b/xbyak/xbyak.h
|
||||
@@ -1467,8 +1467,6 @@ inline XBYAK_CONSTEXPR bool Operand::hasRex2() const
|
||||
}
|
||||
|
||||
class AddressFrame {
|
||||
- void operator=(const AddressFrame&);
|
||||
- AddressFrame(const AddressFrame&);
|
||||
public:
|
||||
const uint32_t bit_;
|
||||
const bool broadcast_;
|
||||
4
externals/cpmfile.json
vendored
4
externals/cpmfile.json
vendored
|
|
@ -61,8 +61,10 @@
|
|||
"hash": "d93971cc8f17f20818e36099aa862d15d30b60f17c7dff0cc8b7ac89ad6dc6453256dd47a454904666a85cea6ca27f9867f782c7b2c6d0c16039af8e3e28e6cc",
|
||||
"git_version": "7.35.4",
|
||||
"bundled": true,
|
||||
"skip_updates": true,
|
||||
"patches": [
|
||||
"0001-rvalue-optimize.patch"
|
||||
"0001-rvalue-optimize.patch",
|
||||
"0002-address-frame-ctor.patch"
|
||||
]
|
||||
},
|
||||
"oaknut": {
|
||||
|
|
|
|||
|
|
@ -367,7 +367,6 @@ if (BOOST_NO_HEADERS)
|
|||
else()
|
||||
target_link_libraries(dynarmic PRIVATE Boost::headers)
|
||||
endif()
|
||||
|
||||
if (DYNARMIC_USE_LLVM)
|
||||
target_include_directories(dynarmic PRIVATE ${LLVM_INCLUDE_DIRS})
|
||||
target_compile_definitions(dynarmic PRIVATE DYNARMIC_USE_LLVM=1 ${LLVM_DEFINITIONS})
|
||||
|
|
@ -385,4 +384,7 @@ endif()
|
|||
if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||
target_compile_definitions(dynarmic PRIVATE FMT_USE_WINDOWS_H=0)
|
||||
endif()
|
||||
if (xbyak_ADDED)
|
||||
target_compile_definitions(dynarmic PRIVATE XBYAK_BUNDLED=1)
|
||||
endif()
|
||||
target_compile_definitions(dynarmic PRIVATE FMT_USE_USER_DEFINED_LITERALS=1)
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@
|
|||
#include "dynarmic/common/cast_util.h"
|
||||
#include "dynarmic/interface/halt_reason.h"
|
||||
#include "dynarmic/ir/cond.h"
|
||||
#include "xbyak/xbyak.h"
|
||||
|
||||
namespace Dynarmic::Backend::X64 {
|
||||
|
||||
|
|
@ -124,14 +125,26 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
[[nodiscard]] Xbyak::Address Const(const Xbyak::AddressFrame&& frame, u64 lower, u64 upper) {
|
||||
return constant_pool.GetConstant(std::move(frame), lower, upper);
|
||||
// Xbyak benefits slightly from not having & references on some of its ctors, however one main
|
||||
// disadvantage is that this breaks ABI slightly because we need to hijack the main privated ctor, hence
|
||||
// we define two paths, one for gentoo (non bundled) and one for our custom bundled set with patch
|
||||
#ifdef XBYAK_BUNDLED
|
||||
[[nodiscard]] Xbyak::Address Const(const Xbyak::AddressFrame frame, u64 lower, u64 upper = 0) {
|
||||
return constant_pool.GetConstant(Xbyak::AddressFrame(frame.bit_, frame.broadcast_), lower, upper);
|
||||
}
|
||||
|
||||
template<size_t esize>
|
||||
[[nodiscard]] Xbyak::Address BConst(const Xbyak::AddressFrame frame, u64 value) {
|
||||
return Const(std::move(frame), mcl::bit::replicate_element<u64>(esize, value), mcl::bit::replicate_element<u64>(esize, value));
|
||||
return Const(Xbyak::AddressFrame(frame.bit_, frame.broadcast_), mcl::bit::replicate_element<u64>(esize, value), mcl::bit::replicate_element<u64>(esize, value));
|
||||
}
|
||||
#else
|
||||
[[nodiscard]] Xbyak::Address Const(const Xbyak::AddressFrame& frame, u64 lower, u64 upper = 0) {
|
||||
return constant_pool.GetConstant(frame, lower, upper);
|
||||
}
|
||||
template<size_t esize>
|
||||
[[nodiscard]] Xbyak::Address BConst(const Xbyak::AddressFrame& frame, u64 value) {
|
||||
return Const(frame, mcl::bit::replicate_element<u64>(esize, value), mcl::bit::replicate_element<u64>(esize, value));
|
||||
}
|
||||
#endif
|
||||
|
||||
CodePtr GetCodeBegin() const;
|
||||
size_t GetTotalCodeSize() const;
|
||||
|
|
|
|||
|
|
@ -25,7 +25,11 @@ ConstantPool::ConstantPool(BlockOfCode& code, size_t size)
|
|||
reinterpret_cast<ConstantT*>(code.AllocateFromCodeSpace(size)), size / align_size);
|
||||
}
|
||||
|
||||
Xbyak::Address ConstantPool::GetConstant(const Xbyak::AddressFrame&& frame, u64 lower, u64 upper) {
|
||||
#ifdef XBYAK_BUNDLED
|
||||
Xbyak::Address ConstantPool::GetConstant(const Xbyak::AddressFrame frame, u64 lower, u64 upper) {
|
||||
#else
|
||||
Xbyak::Address ConstantPool::GetConstant(const Xbyak::AddressFrame& frame, u64 lower, u64 upper) {
|
||||
#endif
|
||||
const auto constant = ConstantT(lower, upper);
|
||||
auto iter = constant_info.find(constant);
|
||||
if (iter == constant_info.end()) {
|
||||
|
|
|
|||
|
|
@ -29,7 +29,11 @@ class ConstantPool final {
|
|||
public:
|
||||
ConstantPool(BlockOfCode& code, size_t size);
|
||||
|
||||
Xbyak::Address GetConstant(const Xbyak::AddressFrame&& frame, u64 lower, u64 upper = 0);
|
||||
#ifdef XBYAK_BUNDLED
|
||||
Xbyak::Address GetConstant(const Xbyak::AddressFrame frame, u64 lower, u64 upper = 0);
|
||||
#else
|
||||
Xbyak::Address GetConstant(const Xbyak::AddressFrame& frame, u64 lower, u64 upper = 0);
|
||||
#endif
|
||||
|
||||
private:
|
||||
static constexpr size_t align_size = 16; // bytes
|
||||
|
|
|
|||
|
|
@ -595,7 +595,8 @@ void EmitX64::EmitPackedHalvingSubAddS16(EmitContext& ctx, IR::Inst* inst) {
|
|||
EmitPackedSubAdd(code, ctx, inst, false, true, true);
|
||||
}
|
||||
|
||||
static void EmitPackedOperation(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, void (Xbyak::CodeGenerator::*fn)(const Xbyak::Mmx mmx, const Xbyak::Operand&)) {
|
||||
template<typename F>
|
||||
static void EmitPackedOperation(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, F&& fn) {
|
||||
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
|
||||
|
||||
const Xbyak::Xmm xmm_a = ctx.reg_alloc.UseScratchXmm(code, args[0]);
|
||||
|
|
|
|||
|
|
@ -23,7 +23,8 @@ using namespace Xbyak::util;
|
|||
|
||||
namespace {
|
||||
|
||||
static void EmitVectorSaturatedNative(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, void (Xbyak::CodeGenerator::*saturated_fn)(const Xbyak::Mmx mmx, const Xbyak::Operand&), void (Xbyak::CodeGenerator::*unsaturated_fn)(const Xbyak::Mmx mmx, const Xbyak::Operand&), void (Xbyak::CodeGenerator::*sub_fn)(const Xbyak::Mmx mmx, const Xbyak::Operand&)) {
|
||||
template<typename F1, typename F2, typename F3>
|
||||
static void EmitVectorSaturatedNative(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, F1&& saturated_fn, F2&& unsaturated_fn, F3&& sub_fn) {
|
||||
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
|
||||
|
||||
const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(code, args[0]);
|
||||
|
|
|
|||
Loading…
Reference in a new issue