GENTOOO; also addressFrame can be constructible via copy

This commit is contained in:
lizzie 2026-04-13 23:13:48 +00:00
parent f6c2c0e75a
commit 7fb80fdff7
8 changed files with 50 additions and 10 deletions

View 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_;

View file

@ -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": {

View file

@ -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)

View file

@ -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;

View file

@ -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()) {

View file

@ -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

View file

@ -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]);

View file

@ -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]);